diff --git a/financials.png b/financials.png index b7867cd..287bb1d 100644 Binary files a/financials.png and b/financials.png differ diff --git a/financials10.png b/financials10.png index 9c34145..9eaf8fe 100644 Binary files a/financials10.png and b/financials10.png differ diff --git a/financials2.png b/financials2.png index fa28df0..afd591f 100644 Binary files a/financials2.png and b/financials2.png differ diff --git a/financials3.png b/financials3.png index bb8e38a..5c6abfe 100644 Binary files a/financials3.png and b/financials3.png differ diff --git a/financials6.png b/financials6.png index a2d4b45..734df9f 100644 Binary files a/financials6.png and b/financials6.png differ diff --git a/financials7.png b/financials7.png index 7d4e1d4..3ebd02f 100644 Binary files a/financials7.png and b/financials7.png differ diff --git a/financials9.png b/financials9.png index 84854d5..52a16fe 100644 Binary files a/financials9.png and b/financials9.png differ diff --git a/src/class/class_bullion.c b/src/class/class_bullion.c index ce048b5..3438ac9 100644 --- a/src/class/class_bullion.c +++ b/src/class/class_bullion.c @@ -50,9 +50,10 @@ static metal * MetalClassObject; /* A class handle to the bullion class object pointers. */ /* Class Method (also called Function) Definitions */ -static void convert_bullion_to_strings(bullion *B, guint8 digits_right) { +static void convert_bullion_to_strings(bullion *B, gchar *metal_ch, + guint8 digits_right) { /* Basic metal data */ - DoubleToFormattedStrPango(&B->ounce_mrkd_ch, B->ounce_f, 4, NUM_STR, BLACK); + SymbolStrPango(&B->metal_mrkd_ch, metal_ch, B->ounce_f, 4, BLUE); DoubleToFormattedStrPango(&B->premium_mrkd_ch, B->premium_f, digits_right, MON_STR, BLACK); @@ -61,67 +62,47 @@ static void convert_bullion_to_strings(bullion *B, guint8 digits_right) { B->prev_closing_metal_f, digits_right, MON_STR, BLACK); - DoubleToFormattedStrPango(&B->high_metal_mrkd_ch, B->high_metal_f, - digits_right, MON_STR, BLACK); - - DoubleToFormattedStrPango(&B->low_metal_mrkd_ch, B->low_metal_f, digits_right, + DoubleToFormattedStrPango(&B->cost_mrkd_ch, B->cost_basis_f, digits_right, MON_STR, BLACK); + RangeStrPango(&B->range_mrkd_ch, B->low_metal_f, B->high_metal_f, + digits_right); + DoubleToFormattedStrPango(&B->spot_price_mrkd_ch, B->spot_price_f, digits_right, MON_STR, BLACK); DoubleToFormattedStrPango(&B->premium_mrkd_ch, B->premium_f, digits_right, MON_STR, BLACK); - /* The total invested in this metal */ - DoubleToFormattedStrPango(&B->port_value_mrkd_ch, B->port_value_f, - digits_right, MON_STR, BLACK); - - if (B->change_ounce_f > 0) { - /* The change in spot price per ounce. */ - DoubleToFormattedStrPango(&B->change_ounce_mrkd_ch, B->change_ounce_f, - digits_right, MON_STR, GREEN); - - /* The change in total investment in this metal. */ - DoubleToFormattedStrPango(&B->change_value_mrkd_ch, B->change_value_f, - digits_right, MON_STR, GREEN); - - /* The change in total investment in this metal as a percentage. */ - DoubleToFormattedStrPango(&B->change_percent_mrkd_ch, B->change_percent_f, - digits_right, PER_STR, GREEN); - } else if (B->change_ounce_f < 0) { - DoubleToFormattedStrPango(&B->change_ounce_mrkd_ch, B->change_ounce_f, - digits_right, MON_STR, RED); - - DoubleToFormattedStrPango(&B->change_value_mrkd_ch, B->change_value_f, - digits_right, MON_STR, RED); - - DoubleToFormattedStrPango(&B->change_percent_mrkd_ch, B->change_percent_f, - digits_right, PER_STR, RED); - } else { - DoubleToFormattedStrPango(&B->change_ounce_mrkd_ch, B->change_ounce_f, - digits_right, MON_STR, BLACK); - - DoubleToFormattedStrPango(&B->change_value_mrkd_ch, B->change_value_f, - digits_right, MON_STR, BLACK); + /* The change in spot price per ounce. */ + ChangeStrPango(&B->change_ounce_mrkd_ch, B->change_ounce_f, + B->change_percent_f, digits_right); - DoubleToFormattedStrPango(&B->change_percent_mrkd_ch, B->change_percent_f, - digits_right, PER_STR, BLACK); - } + /* The total invested in this metal */ + TotalStrPango(&B->port_value_mrkd_ch, B->port_value_f, B->change_value_f, + digits_right); /* The raw change in bullion as a percentage. */ DoubleToFormattedStr(&B->change_percent_raw_ch, B->change_percent_raw_f, 2, PER_STR); + + /* The total cost of this metal. */ + DoubleToFormattedStrPango(&B->total_cost_mrkd_ch, B->total_cost_f, + digits_right, MON_STR, BLACK); + + /* The total gain since purchase [value and percentage]. */ + ChangeStrPango(&B->total_gain_mrkd_ch, B->total_gain_value_f, + B->total_gain_percent_f, digits_right); } static void ToStrings(guint8 digits_right) { metal *M = MetalClassObject; - convert_bullion_to_strings(M->Gold, digits_right); - convert_bullion_to_strings(M->Silver, digits_right); + convert_bullion_to_strings(M->Gold, "Gold", digits_right); + convert_bullion_to_strings(M->Silver, "Silver", digits_right); if (M->Platinum->ounce_f > 0) - convert_bullion_to_strings(M->Platinum, digits_right); + convert_bullion_to_strings(M->Platinum, "Platinum", digits_right); if (M->Palladium->ounce_f > 0) - convert_bullion_to_strings(M->Palladium, digits_right); + convert_bullion_to_strings(M->Palladium, "Palladium", digits_right); /* The total investment in bullion. */ DoubleToFormattedStrPango(&M->bullion_port_value_mrkd_ch, @@ -129,36 +110,23 @@ static void ToStrings(guint8 digits_right) { BLACK); /* The change in total investment in bullion. */ - if (M->bullion_port_value_chg_f > 0) - DoubleToFormattedStrPango(&M->bullion_port_value_chg_mrkd_ch, - M->bullion_port_value_chg_f, digits_right, - MON_STR, GREEN); - else if (M->bullion_port_value_chg_f < 0) - DoubleToFormattedStrPango(&M->bullion_port_value_chg_mrkd_ch, - M->bullion_port_value_chg_f, digits_right, - MON_STR, RED); - else - DoubleToFormattedStrPango(&M->bullion_port_value_chg_mrkd_ch, - M->bullion_port_value_chg_f, digits_right, - MON_STR, BLACK); - - /* The change in total investment in bullion as a percentage. */ - if (M->bullion_port_value_p_chg_f > 0) - DoubleToFormattedStrPango(&M->bullion_port_value_p_chg_mrkd_ch, - M->bullion_port_value_p_chg_f, digits_right, - PER_STR, GREEN); - else if (M->bullion_port_value_p_chg_f < 0) - DoubleToFormattedStrPango(&M->bullion_port_value_p_chg_mrkd_ch, - M->bullion_port_value_p_chg_f, digits_right, - PER_STR, RED); - else - DoubleToFormattedStrPango(&M->bullion_port_value_p_chg_mrkd_ch, - M->bullion_port_value_p_chg_f, digits_right, - PER_STR, BLACK); + ChangeStrPango(&M->bullion_port_day_gain_mrkd_ch, + M->bullion_port_day_gain_val_f, M->bullion_port_day_gain_per_f, + digits_right); /* The Gold to Silver Ratio */ DoubleToFormattedStr(&M->gold_silver_ratio_ch, M->gold_silver_ratio_f, 2, NUM_STR); + + /* The total cost of the metal portfolio. */ + DoubleToFormattedStrPango(&M->bullion_port_cost_mrkd_ch, + M->bullion_port_cost_f, digits_right, MON_STR, + BLACK); + + /* The total portfolio gain since purchase [value and percentage]. */ + ChangeStrPango(&M->bullion_port_total_gain_mrkd_ch, + M->bullion_port_total_gain_value_f, + M->bullion_port_total_gain_percent_f, digits_right); } static void bullion_calculations(bullion *B) { @@ -189,6 +157,15 @@ static void bullion_calculations(bullion *B) { else B->change_percent_raw_f = CalcGain(B->spot_price_f, B->prev_closing_metal_f); + + /* The total cost */ + B->total_cost_f = B->cost_basis_f * B->ounce_f; + + /* The total gain since purchase */ + B->total_gain_value_f = B->port_value_f - B->total_cost_f; + + /* The total gain since purchase, percentage*/ + B->total_gain_percent_f = CalcGain(B->port_value_f, B->total_cost_f); } static void Calculate() { @@ -209,22 +186,35 @@ static void Calculate() { M->Palladium->port_value_f; /* The change in total investment in bullion. */ - M->bullion_port_value_chg_f = M->Gold->change_value_f; - M->bullion_port_value_chg_f += M->Silver->change_value_f; - M->bullion_port_value_chg_f += M->Platinum->change_value_f; - M->bullion_port_value_chg_f += M->Palladium->change_value_f; + M->bullion_port_day_gain_val_f = M->Gold->change_value_f; + M->bullion_port_day_gain_val_f += M->Silver->change_value_f; + M->bullion_port_day_gain_val_f += M->Platinum->change_value_f; + M->bullion_port_day_gain_val_f += M->Palladium->change_value_f; /* The change in total investment in bullion as a percentage. */ - gdouble prev_total = M->bullion_port_value_f - M->bullion_port_value_chg_f; + gdouble prev_total = M->bullion_port_value_f - M->bullion_port_day_gain_val_f; if (prev_total == 0.0f) - M->bullion_port_value_p_chg_f = 0.0f; + M->bullion_port_day_gain_per_f = 0.0f; else - M->bullion_port_value_p_chg_f = + M->bullion_port_day_gain_per_f = CalcGain(M->bullion_port_value_f, prev_total); /* The Gold to Silver Ratio */ if (M->Silver->spot_price_f > 0) M->gold_silver_ratio_f = M->Gold->spot_price_f / M->Silver->spot_price_f; + + /* The total cost of all bullion */ + M->bullion_port_cost_f = M->Gold->total_cost_f + M->Silver->total_cost_f + + M->Platinum->total_cost_f + + M->Palladium->total_cost_f; + + /* The total gain of all bullion, since purchase, value. */ + M->bullion_port_total_gain_value_f = + M->bullion_port_value_f - M->bullion_port_cost_f; + + /* The total gain of all bullion, since purchase, percentage. */ + M->bullion_port_total_gain_percent_f = + CalcGain(M->bullion_port_value_f, M->bullion_port_cost_f); } static gint SetUpCurl(portfolio_packet *pkg) { @@ -324,20 +314,25 @@ static bullion *class_init_bullion() { new_class->change_percent_f = 0.0f; new_class->change_percent_raw_f = 0.0f; + new_class->cost_basis_f = 0.0f; + new_class->total_cost_f = 0.0f; + new_class->total_gain_value_f = 0.0f; + new_class->total_gain_percent_f = 0.0f; + new_class->url_ch = NULL; + new_class->metal_mrkd_ch = NULL; new_class->spot_price_mrkd_ch = NULL; new_class->premium_mrkd_ch = NULL; new_class->port_value_mrkd_ch = NULL; - new_class->ounce_mrkd_ch = NULL; - new_class->high_metal_mrkd_ch = NULL; - new_class->low_metal_mrkd_ch = NULL; + new_class->cost_mrkd_ch = NULL; + new_class->range_mrkd_ch = NULL; new_class->prev_closing_metal_mrkd_ch = NULL; new_class->change_ounce_mrkd_ch = NULL; - new_class->change_value_mrkd_ch = NULL; - new_class->change_percent_mrkd_ch = NULL; new_class->change_percent_raw_ch = NULL; + new_class->total_cost_mrkd_ch = NULL; + new_class->total_gain_mrkd_ch = NULL; new_class->YAHOO_hnd = curl_easy_init(); new_class->CURLDATA.memory = NULL; @@ -359,15 +354,21 @@ metal *ClassInitMetal() { /* Initialize Variables */ new_class->bullion_port_value_f = 0.0f; - new_class->bullion_port_value_chg_f = 0.0f; - new_class->bullion_port_value_p_chg_f = 0.0f; + new_class->bullion_port_day_gain_val_f = 0.0f; + new_class->bullion_port_day_gain_per_f = 0.0f; new_class->gold_silver_ratio_f = 0.0f; + new_class->bullion_port_cost_f = 0.0f; + new_class->bullion_port_total_gain_value_f = 0.0f; + new_class->bullion_port_total_gain_percent_f = 0.0f; + new_class->bullion_port_value_mrkd_ch = NULL; - new_class->bullion_port_value_chg_mrkd_ch = NULL; - new_class->bullion_port_value_p_chg_mrkd_ch = NULL; + new_class->bullion_port_day_gain_mrkd_ch = NULL; new_class->gold_silver_ratio_ch = NULL; + new_class->bullion_port_cost_mrkd_ch = NULL; + new_class->bullion_port_total_gain_mrkd_ch = NULL; + /* Connect Function Pointers To Function Definitions */ new_class->ToStrings = ToStrings; new_class->Calculate = Calculate; @@ -384,6 +385,8 @@ metal *ClassInitMetal() { /* Class Destruct Functions */ static void class_destruct_bullion(bullion *bullion_class) { /* Free Memory */ + if (bullion_class->metal_mrkd_ch) + g_free(bullion_class->metal_mrkd_ch); if (bullion_class->url_ch) g_free(bullion_class->url_ch); if (bullion_class->spot_price_mrkd_ch) @@ -392,23 +395,21 @@ static void class_destruct_bullion(bullion *bullion_class) { g_free(bullion_class->premium_mrkd_ch); if (bullion_class->port_value_mrkd_ch) g_free(bullion_class->port_value_mrkd_ch); - if (bullion_class->ounce_mrkd_ch) - g_free(bullion_class->ounce_mrkd_ch); - if (bullion_class->high_metal_mrkd_ch) - g_free(bullion_class->high_metal_mrkd_ch); - if (bullion_class->low_metal_mrkd_ch) - g_free(bullion_class->low_metal_mrkd_ch); + if (bullion_class->cost_mrkd_ch) + g_free(bullion_class->cost_mrkd_ch); + if (bullion_class->range_mrkd_ch) + g_free(bullion_class->range_mrkd_ch); if (bullion_class->prev_closing_metal_mrkd_ch) g_free(bullion_class->prev_closing_metal_mrkd_ch); if (bullion_class->change_ounce_mrkd_ch) g_free(bullion_class->change_ounce_mrkd_ch); - if (bullion_class->change_value_mrkd_ch) - g_free(bullion_class->change_value_mrkd_ch); - if (bullion_class->change_percent_mrkd_ch) - g_free(bullion_class->change_percent_mrkd_ch); if (bullion_class->change_percent_raw_ch) g_free(bullion_class->change_percent_raw_ch); + if (bullion_class->total_cost_mrkd_ch) + g_free(bullion_class->total_cost_mrkd_ch); + if (bullion_class->total_gain_mrkd_ch) + g_free(bullion_class->total_gain_mrkd_ch); if (bullion_class->YAHOO_hnd) curl_easy_cleanup(bullion_class->YAHOO_hnd); @@ -436,12 +437,14 @@ void ClassDestructMetal(metal *metal_handle) { /* Free Pointer Memory */ if (metal_handle->bullion_port_value_mrkd_ch) g_free(metal_handle->bullion_port_value_mrkd_ch); - if (metal_handle->bullion_port_value_chg_mrkd_ch) - g_free(metal_handle->bullion_port_value_chg_mrkd_ch); - if (metal_handle->bullion_port_value_p_chg_mrkd_ch) - g_free(metal_handle->bullion_port_value_p_chg_mrkd_ch); + if (metal_handle->bullion_port_day_gain_mrkd_ch) + g_free(metal_handle->bullion_port_day_gain_mrkd_ch); if (metal_handle->gold_silver_ratio_ch) g_free(metal_handle->gold_silver_ratio_ch); + if (metal_handle->bullion_port_cost_mrkd_ch) + g_free(metal_handle->bullion_port_cost_mrkd_ch); + if (metal_handle->bullion_port_total_gain_mrkd_ch) + g_free(metal_handle->bullion_port_total_gain_mrkd_ch); if (metal_handle) g_free(metal_handle); diff --git a/src/class/class_equity.c b/src/class/class_equity.c index fc5066e..54ef04d 100644 --- a/src/class/class_equity.c +++ b/src/class/class_equity.c @@ -60,97 +60,46 @@ static void convert_equity_to_strings(stock *S, guint8 digits_right) { S->current_price_stock_f, digits_right, MON_STR, BLACK); - DoubleToFormattedStrPango(&S->high_stock_mrkd_ch, S->high_stock_f, + DoubleToFormattedStrPango(&S->opening_stock_mrkd_ch, S->opening_stock_f, digits_right, MON_STR, BLACK); - DoubleToFormattedStrPango(&S->low_stock_mrkd_ch, S->low_stock_f, digits_right, + DoubleToFormattedStrPango(&S->cost_mrkd_ch, S->cost_basis_f, digits_right, MON_STR, BLACK); - DoubleToFormattedStrPango(&S->opening_stock_mrkd_ch, S->opening_stock_f, - digits_right, MON_STR, BLACK); + RangeStrPango(&S->range_mrkd_ch, S->low_stock_f, S->high_stock_f, + digits_right); DoubleToFormattedStrPango(&S->prev_closing_stock_mrkd_ch, S->prev_closing_stock_f, digits_right, MON_STR, BLACK); - if (S->change_value_f > 0) - DoubleToFormattedStrPango(&S->change_value_mrkd_ch, S->change_value_f, - digits_right, MON_STR, GREEN); - else if (S->change_value_f < 0) - DoubleToFormattedStrPango(&S->change_value_mrkd_ch, S->change_value_f, - digits_right, MON_STR, RED); - else - DoubleToFormattedStrPango(&S->change_value_mrkd_ch, S->change_value_f, - digits_right, MON_STR, BLACK); + ChangeStrPango(&S->change_share_stock_mrkd_ch, S->change_share_f, + S->change_percent_f, digits_right); - DoubleToFormattedStrPango(&S->num_shares_stock_mrkd_ch, - (gdouble)S->num_shares_stock_int, 0, NUM_STR, - BLACK); - switch (S->num_shares_stock_int) { + switch (S->quantity_int) { case 0: - if (S->change_share_f > 0) { - DoubleToFormattedStrPango(&S->change_share_stock_mrkd_ch, - S->change_share_f, digits_right, MON_STR, - GREEN_ITALIC); - - DoubleToFormattedStrPango(&S->change_percent_mrkd_ch, S->change_percent_f, - digits_right, PER_STR, GREEN_ITALIC); - - } else if (S->change_share_f < 0) { - DoubleToFormattedStrPango(&S->change_share_stock_mrkd_ch, - S->change_share_f, digits_right, MON_STR, - RED_ITALIC); - - DoubleToFormattedStrPango(&S->change_percent_mrkd_ch, S->change_percent_f, - digits_right, PER_STR, RED_ITALIC); - - } else { - DoubleToFormattedStrPango(&S->change_share_stock_mrkd_ch, - S->change_share_f, digits_right, MON_STR, - BLACK_ITALIC); - - DoubleToFormattedStrPango(&S->change_percent_mrkd_ch, S->change_percent_f, - digits_right, PER_STR, BLACK_ITALIC); - } - - StringToStrPango(&S->symbol_stock_mrkd_ch, S->symbol_stock_ch, - BLACK_ITALIC); + SymbolStrPango(&S->symbol_stock_mrkd_ch, S->symbol_stock_ch, + (gdouble)S->quantity_int, 0, BLACK_ITALIC); break; default: - if (S->change_share_f > 0) { - DoubleToFormattedStrPango(&S->change_share_stock_mrkd_ch, - S->change_share_f, digits_right, MON_STR, - GREEN); - - DoubleToFormattedStrPango(&S->change_percent_mrkd_ch, S->change_percent_f, - digits_right, PER_STR, GREEN); - - } else if (S->change_share_f < 0) { - DoubleToFormattedStrPango(&S->change_share_stock_mrkd_ch, - S->change_share_f, digits_right, MON_STR, RED); - - DoubleToFormattedStrPango(&S->change_percent_mrkd_ch, S->change_percent_f, - digits_right, PER_STR, RED); - - } else { - DoubleToFormattedStrPango(&S->change_share_stock_mrkd_ch, - S->change_share_f, digits_right, MON_STR, - BLACK); - - DoubleToFormattedStrPango(&S->change_percent_mrkd_ch, S->change_percent_f, - digits_right, PER_STR, BLACK); - } - - StringToStrPango(&S->symbol_stock_mrkd_ch, S->symbol_stock_ch, BLUE); + SymbolStrPango(&S->symbol_stock_mrkd_ch, S->symbol_stock_ch, + (gdouble)S->quantity_int, 0, BLUE); break; } /* The total current investment in this equity. */ - DoubleToFormattedStrPango(&S->current_investment_stock_mrkd_ch, - S->current_investment_stock_f, digits_right, - MON_STR, BLACK); + TotalStrPango(&S->current_investment_stock_mrkd_ch, + S->current_investment_stock_f, S->change_value_f, digits_right); + + /* The total cost of this investment. */ + DoubleToFormattedStrPango(&S->total_cost_mrkd_ch, S->total_cost_f, + digits_right, MON_STR, BLACK); + + /* The total investment gain since purchase [value and percentage]. */ + ChangeStrPango(&S->total_gain_mrkd_ch, S->total_gain_value_f, + S->total_gain_percent_f, digits_right); } static void ToStrings(guint8 digits_right) { @@ -163,45 +112,43 @@ static void ToStrings(guint8 digits_right) { DoubleToFormattedStrPango(&F->stock_port_value_mrkd_ch, F->stock_port_value_f, digits_right, MON_STR, BLACK); - if (F->stock_port_value_chg_f > 0) { - /* The equity portfolio's change in value. */ - DoubleToFormattedStrPango(&F->stock_port_value_chg_mrkd_ch, - F->stock_port_value_chg_f, digits_right, MON_STR, - GREEN); - - /* The change in total investment in equity as a percentage. */ - DoubleToFormattedStrPango(&F->stock_port_value_p_chg_mrkd_ch, - F->stock_port_value_p_chg_f, digits_right, - PER_STR, GREEN); - } else if (F->stock_port_value_chg_f < 0) { - DoubleToFormattedStrPango(&F->stock_port_value_chg_mrkd_ch, - F->stock_port_value_chg_f, digits_right, MON_STR, - RED); - - DoubleToFormattedStrPango(&F->stock_port_value_p_chg_mrkd_ch, - F->stock_port_value_p_chg_f, digits_right, - PER_STR, RED); - } else { - DoubleToFormattedStrPango(&F->stock_port_value_chg_mrkd_ch, - F->stock_port_value_chg_f, digits_right, MON_STR, - BLACK); + /* The equity portfolio's change in value. */ + ChangeStrPango(&F->stock_port_day_gain_mrkd_ch, F->stock_port_day_gain_val_f, + F->stock_port_day_gain_per_f, digits_right); - DoubleToFormattedStrPango(&F->stock_port_value_p_chg_mrkd_ch, - F->stock_port_value_p_chg_f, digits_right, - PER_STR, BLACK); - } + /* The total cost of the equity portfolio. */ + DoubleToFormattedStrPango(&F->stock_port_cost_mrkd_ch, F->stock_port_cost_f, + digits_right, MON_STR, BLACK); + + /* The total portfolio gain since purchase [value and percentage]. */ + ChangeStrPango(&F->stock_port_total_gain_mrkd_ch, + F->stock_port_total_gain_value_f, + F->stock_port_total_gain_percent_f, digits_right); } static void equity_calculations(stock *S) { /* Calculate the stock holdings change. */ - if (S->num_shares_stock_int > 0) - S->change_value_f = S->change_share_f * (gdouble)S->num_shares_stock_int; + if (S->quantity_int > 0) + S->change_value_f = S->change_share_f * (gdouble)S->quantity_int; else S->change_value_f = 0.0f; /* The total current investment in this equity. */ S->current_investment_stock_f = - (gdouble)S->num_shares_stock_int * S->current_price_stock_f; + (gdouble)S->quantity_int * S->current_price_stock_f; + + /* The total cost of this investment. */ + S->total_cost_f = S->cost_basis_f * (gdouble)S->quantity_int; + + /* The total investment gain since purchase. */ + S->total_gain_value_f = S->current_investment_stock_f - S->total_cost_f; + + /* The total investment gain, as a percentage, since purchase. */ + if (S->total_cost_f > 0) + S->total_gain_percent_f = + CalcGain(S->current_investment_stock_f, S->total_cost_f); + else + S->total_gain_percent_f = 0.0f; } static void Calculate() { @@ -209,7 +156,8 @@ static void Calculate() { /* Equity Calculations. */ F->stock_port_value_f = 0.0f; - F->stock_port_value_chg_f = 0.0f; + F->stock_port_day_gain_val_f = 0.0f; + F->stock_port_cost_f = 0.0f; for (guint8 g = 0; g < F->size; g++) { equity_calculations(F->Equity[g]); @@ -219,12 +167,26 @@ static void Calculate() { /* Add the equity's change in value to the equity portfolio's change in * value. */ - F->stock_port_value_chg_f += F->Equity[g]->change_value_f; + F->stock_port_day_gain_val_f += F->Equity[g]->change_value_f; + + /* Add the equity cost to the portfolio cost. */ + F->stock_port_cost_f += F->Equity[g]->total_cost_f; } /* The change in total investment in equity as a percentage. */ - gdouble prev_total = F->stock_port_value_f - F->stock_port_value_chg_f; - F->stock_port_value_p_chg_f = CalcGain(F->stock_port_value_f, prev_total); + gdouble prev_total = F->stock_port_value_f - F->stock_port_day_gain_val_f; + F->stock_port_day_gain_per_f = CalcGain(F->stock_port_value_f, prev_total); + + /* The gain as a value, since purchase. */ + F->stock_port_total_gain_value_f = + F->stock_port_value_f - F->stock_port_cost_f; + + /* The gain as a percentage, since purchase. */ + if (F->stock_port_cost_f > 0) + F->stock_port_total_gain_percent_f = + CalcGain(F->stock_port_value_f, F->stock_port_cost_f); + else + F->stock_port_total_gain_percent_f = 0.0f; } static void GenerateURL(portfolio_packet *pkg) { @@ -295,7 +257,8 @@ static void Reset() { g_mutex_unlock(&mutexes[CLASS_MEMBER_MUTEX]); } -static void AddStock(const gchar *symbol, const gchar *shares) +static void AddStock(const gchar *symbol, const gchar *shares, + const gchar *cost) /* Adds a new stock object to our folder, increments size. */ { @@ -312,29 +275,29 @@ static void AddStock(const gchar *symbol, const gchar *shares) /* class_init_equity returns an object pointer. */ F->Equity[F->size] = class_init_equity(); - /* Add The Shares To the stock object */ - F->Equity[F->size]->num_shares_stock_int = + /* Add the Shares to the stock object */ + F->Equity[F->size]->quantity_int = (guint)g_ascii_strtoll(shares ? shares : "0", NULL, 10); - DoubleToFormattedStrPango(&F->Equity[F->size]->num_shares_stock_mrkd_ch, - (gdouble)F->Equity[F->size]->num_shares_stock_int, - 0, NUM_STR, BLACK); + + /* Add the Cost to the stock object */ + F->Equity[F->size]->cost_basis_f = g_ascii_strtod(cost ? cost : "0.0", NULL); /* Add The Stock Symbol To the stock object */ /* This string is used to process the stock. */ CopyString(&F->Equity[F->size]->symbol_stock_ch, symbol); - switch (F->Equity[F->size]->num_shares_stock_int) { + switch (F->Equity[F->size]->quantity_int) { /* This string is used on TreeViews. */ case 0: - StringToStrPango(&F->Equity[F->size]->symbol_stock_mrkd_ch, symbol, - BLACK_ITALIC); + SymbolStrPango(&F->Equity[F->size]->symbol_stock_mrkd_ch, symbol, + (gdouble)F->Equity[F->size]->quantity_int, 0, BLACK_ITALIC); break; default: - StringToStrPango(&F->Equity[F->size]->symbol_stock_mrkd_ch, symbol, BLUE); + SymbolStrPango(&F->Equity[F->size]->symbol_stock_mrkd_ch, symbol, + (gdouble)F->Equity[F->size]->quantity_int, 0, BLUE); break; } F->size++; - g_mutex_unlock(&mutexes[CLASS_MEMBER_MUTEX]); } @@ -359,7 +322,7 @@ static void RemoveStock(const gchar *s) j++; } /* g_realloc will free memory if assigned a smaller new value. */ - tmp = g_realloc(F->Equity, (F->size - 1) * sizeof(stock *)); + tmp = g_realloc(F->Equity, (F->size * sizeof(stock *))); if (tmp) F->Equity = tmp; F->size--; @@ -462,7 +425,7 @@ static void SetSecurityNames(portfolio_packet *pkg) { pkg->GetMetaClass()); remove_dash(security_name); - if (F->Equity[g]->num_shares_stock_int) + if (F->Equity[g]->quantity_int) StringToStrPango(&F->Equity[g]->security_name_mrkd_ch, security_name ? security_name : "", BLUE); else @@ -484,7 +447,8 @@ static stock *class_init_equity() { stock *new_class = (stock *)g_malloc(sizeof(*new_class)); /* Initialize Variables */ - new_class->num_shares_stock_int = 0; + new_class->quantity_int = 0; + new_class->cost_basis_f = 0.0f; new_class->current_price_stock_f = 0.0f; new_class->high_stock_f = 0.0f; @@ -495,17 +459,20 @@ static stock *class_init_equity() { new_class->change_value_f = 0.0f; new_class->change_percent_f = 0.0f; new_class->current_investment_stock_f = 0.0f; + new_class->total_cost_f = 0.0f; + new_class->total_gain_value_f = 0.0f; + new_class->total_gain_percent_f = 0.0f; new_class->current_price_stock_mrkd_ch = NULL; - new_class->high_stock_mrkd_ch = NULL; - new_class->low_stock_mrkd_ch = NULL; + new_class->cost_mrkd_ch = NULL; + new_class->range_mrkd_ch = NULL; new_class->opening_stock_mrkd_ch = NULL; new_class->prev_closing_stock_mrkd_ch = NULL; new_class->change_share_stock_mrkd_ch = NULL; - new_class->change_value_mrkd_ch = NULL; - new_class->change_percent_mrkd_ch = NULL; new_class->current_investment_stock_mrkd_ch = NULL; - new_class->num_shares_stock_mrkd_ch = NULL; + new_class->total_cost_mrkd_ch = NULL; + new_class->total_gain_mrkd_ch = NULL; + new_class->symbol_stock_mrkd_ch = NULL; new_class->security_name_mrkd_ch = NULL; @@ -530,12 +497,16 @@ equity_folder *ClassInitEquityFolder() { /* Initialize Variables */ new_class->stock_port_value_mrkd_ch = NULL; - new_class->stock_port_value_chg_mrkd_ch = NULL; - new_class->stock_port_value_p_chg_mrkd_ch = NULL; + new_class->stock_port_day_gain_mrkd_ch = NULL; + new_class->stock_port_cost_mrkd_ch = NULL; + new_class->stock_port_total_gain_mrkd_ch = NULL; new_class->stock_port_value_f = 0.0f; - new_class->stock_port_value_chg_f = 0.0f; - new_class->stock_port_value_p_chg_f = 0.0f; + new_class->stock_port_day_gain_val_f = 0.0f; + new_class->stock_port_day_gain_per_f = 0.0f; + new_class->stock_port_cost_f = 0.0f; + new_class->stock_port_total_gain_value_f = 0.0f; + new_class->stock_port_total_gain_percent_f = 0.0f; /* Connect Function Pointers To Function Definitions */ new_class->ToStrings = ToStrings; @@ -563,13 +534,13 @@ static void class_destruct_equity(stock *stock_class) { g_free(stock_class->current_price_stock_mrkd_ch); stock_class->current_price_stock_mrkd_ch = NULL; } - if (stock_class->high_stock_mrkd_ch) { - g_free(stock_class->high_stock_mrkd_ch); - stock_class->high_stock_mrkd_ch = NULL; + if (stock_class->cost_mrkd_ch) { + g_free(stock_class->cost_mrkd_ch); + stock_class->cost_mrkd_ch = NULL; } - if (stock_class->low_stock_mrkd_ch) { - g_free(stock_class->low_stock_mrkd_ch); - stock_class->low_stock_mrkd_ch = NULL; + if (stock_class->range_mrkd_ch) { + g_free(stock_class->range_mrkd_ch); + stock_class->range_mrkd_ch = NULL; } if (stock_class->opening_stock_mrkd_ch) { g_free(stock_class->opening_stock_mrkd_ch); @@ -583,23 +554,17 @@ static void class_destruct_equity(stock *stock_class) { g_free(stock_class->change_share_stock_mrkd_ch); stock_class->change_share_stock_mrkd_ch = NULL; } - if (stock_class->change_value_mrkd_ch) { - g_free(stock_class->change_value_mrkd_ch); - stock_class->change_value_mrkd_ch = NULL; - } - if (stock_class->change_percent_mrkd_ch) { - g_free(stock_class->change_percent_mrkd_ch); - stock_class->change_percent_mrkd_ch = NULL; - } - if (stock_class->current_investment_stock_mrkd_ch) { g_free(stock_class->current_investment_stock_mrkd_ch); stock_class->current_investment_stock_mrkd_ch = NULL; } - - if (stock_class->num_shares_stock_mrkd_ch) { - g_free(stock_class->num_shares_stock_mrkd_ch); - stock_class->num_shares_stock_mrkd_ch = NULL; + if (stock_class->total_cost_mrkd_ch) { + g_free(stock_class->total_cost_mrkd_ch); + stock_class->total_cost_mrkd_ch = NULL; + } + if (stock_class->total_gain_mrkd_ch) { + g_free(stock_class->total_gain_mrkd_ch); + stock_class->total_gain_mrkd_ch = NULL; } if (stock_class->symbol_stock_mrkd_ch) { @@ -648,10 +613,13 @@ void ClassDestructEquityFolder(equity_folder *F) { /* Free Pointer Memory */ if (F->stock_port_value_mrkd_ch) g_free(F->stock_port_value_mrkd_ch); - if (F->stock_port_value_chg_mrkd_ch) - g_free(F->stock_port_value_chg_mrkd_ch); - if (F->stock_port_value_p_chg_mrkd_ch) - g_free(F->stock_port_value_p_chg_mrkd_ch); + if (F->stock_port_day_gain_mrkd_ch) + g_free(F->stock_port_day_gain_mrkd_ch); + + if (F->stock_port_cost_mrkd_ch) + g_free(F->stock_port_cost_mrkd_ch); + if (F->stock_port_total_gain_mrkd_ch) + g_free(F->stock_port_total_gain_mrkd_ch); if (F) g_free(F); diff --git a/src/class/class_meta.c b/src/class/class_meta.c index 241cb4a..74ad69d 100644 --- a/src/class/class_meta.c +++ b/src/class/class_meta.c @@ -59,42 +59,23 @@ static void ToStringsPortfolio() { Met->decimal_places_guint8, MON_STR, BLACK); /* The total portfolio value. */ - DoubleToFormattedStrPango(&Met->portfolio_port_value_mrkd_ch, - Met->portfolio_port_value_f, - Met->decimal_places_guint8, MON_STR, BLACK); - - if (Met->portfolio_port_value_chg_f > 0) { - - /* The change in total portfolio value. */ - DoubleToFormattedStrPango(&Met->portfolio_port_value_chg_mrkd_ch, - Met->portfolio_port_value_chg_f, - Met->decimal_places_guint8, MON_STR, GREEN); - - /* The change in total portfolio value as a percentage. */ - DoubleToFormattedStrPango(&Met->portfolio_port_value_p_chg_mrkd_ch, - Met->portfolio_port_value_p_chg_f, - Met->decimal_places_guint8, PER_STR, GREEN); - - } else if (Met->portfolio_port_value_chg_f < 0) { - - DoubleToFormattedStrPango(&Met->portfolio_port_value_chg_mrkd_ch, - Met->portfolio_port_value_chg_f, - Met->decimal_places_guint8, MON_STR, RED); + DoubleToFormattedStrPango(&Met->portfolio_value_mrkd_ch, + Met->portfolio_value_f, Met->decimal_places_guint8, + MON_STR, BLACK); - DoubleToFormattedStrPango(&Met->portfolio_port_value_p_chg_mrkd_ch, - Met->portfolio_port_value_p_chg_f, - Met->decimal_places_guint8, PER_STR, RED); - - } else { + /* The change in total portfolio value. */ + ChangeStrPango(&Met->portfolio_day_gain_mrkd_ch, + Met->portfolio_day_gain_value_f, + Met->portfolio_day_gain_percent_f, Met->decimal_places_guint8); - DoubleToFormattedStrPango(&Met->portfolio_port_value_chg_mrkd_ch, - Met->portfolio_port_value_chg_f, - Met->decimal_places_guint8, MON_STR, BLACK); + /* The total portfolio cost. */ + DoubleToFormattedStrPango(&Met->portfolio_cost_mrkd_ch, Met->portfolio_cost_f, + Met->decimal_places_guint8, MON_STR, BLACK); - DoubleToFormattedStrPango(&Met->portfolio_port_value_p_chg_mrkd_ch, - Met->portfolio_port_value_p_chg_f, - Met->decimal_places_guint8, PER_STR, BLACK); - } + /* The total portfolio gain since purchase. */ + ChangeStrPango( + &Met->portfolio_total_gain_mrkd_ch, Met->portfolio_total_gain_value_f, + Met->portfolio_total_gain_percent_f, Met->decimal_places_guint8); } static void CalculatePortfolio(portfolio_packet *pkg) { @@ -103,20 +84,31 @@ static void CalculatePortfolio(portfolio_packet *pkg) { equity_folder *F = pkg->GetEquityFolderClass(); /* The total portfolio value. */ - Met->portfolio_port_value_f = + Met->portfolio_value_f = M->bullion_port_value_f + F->stock_port_value_f + Met->cash_f; /* The change in total portfolio value. */ /* Edit the next line as needed, if you want to add a change value besides equity and bullion to the portfolio. */ - Met->portfolio_port_value_chg_f = - F->stock_port_value_chg_f + M->bullion_port_value_chg_f; + Met->portfolio_day_gain_value_f = + F->stock_port_day_gain_val_f + M->bullion_port_day_gain_val_f; /* The change in total portfolio value as a percentage. */ - gdouble prev_total = - Met->portfolio_port_value_f - Met->portfolio_port_value_chg_f; - Met->portfolio_port_value_p_chg_f = - CalcGain(Met->portfolio_port_value_f, prev_total); + gdouble prev_total = Met->portfolio_value_f - Met->portfolio_day_gain_value_f; + Met->portfolio_day_gain_percent_f = + CalcGain(Met->portfolio_value_f, prev_total); + + /* The cost of the portfolio */ + Met->portfolio_cost_f = + M->bullion_port_cost_f + F->stock_port_cost_f + Met->cash_f; + + /* The gain of the portfolio, as a value */ + Met->portfolio_total_gain_value_f = + Met->portfolio_value_f - Met->portfolio_cost_f; + + /* The gain of the portfolio, as a percentage */ + Met->portfolio_total_gain_percent_f = + CalcGain(Met->portfolio_value_f, Met->portfolio_cost_f); } static void StopHistoryCurl() { @@ -283,165 +275,94 @@ static void ToStringsIndices() { Met->crypto_bitcoin_value_p_chg_f, 2, PER_STR); } -/* The order of the strings, in these struct inits, is important, - they match similar names within the struct definitions +/* The order of the strings, in this struct init, is important, + they match similar names within the struct definition (in class_types.h). */ -static const primary_heading primary_headings = { - "Bullion", "Metal", "Ounces", "Premium", "High", - "Low", "Pr. Close", "Chg", "Gain ($)", "Total", - "Gain (%)", "Gold", "Silver", "Platinum", "Palladium", - "Equity", "Symbol", "Shares", "Price", "Open", - "Asset", "Value", "Cash", "Portfolio", "Portfolio has no assets."}; - -static const default_heading default_headings = {"Bullion", - "Metal", - "Ounces", - "Premium", - "Gold", - "Silver", - "Platinum", - "Palladium", - "Equity", - "Symbol", - "Shares", - "Cash", - "Portfolio has no assets."}; - -static void format_primary_headings_pango(primary_heading *pri_h_mkd) { - - StringToStrPango(&pri_h_mkd->metal, primary_headings.metal, - HEADING_UNLN_FORMAT); - StringToStrPango(&pri_h_mkd->ounces, primary_headings.ounces, - HEADING_UNLN_FORMAT); - StringToStrPango(&pri_h_mkd->price, primary_headings.price, - HEADING_UNLN_FORMAT); - StringToStrPango(&pri_h_mkd->premium, primary_headings.premium, - HEADING_UNLN_FORMAT); - StringToStrPango(&pri_h_mkd->high, primary_headings.high, - HEADING_UNLN_FORMAT); - StringToStrPango(&pri_h_mkd->low, primary_headings.low, HEADING_UNLN_FORMAT); - StringToStrPango(&pri_h_mkd->prev_closing, primary_headings.prev_closing, - HEADING_UNLN_FORMAT); - StringToStrPango(&pri_h_mkd->chg, primary_headings.chg, HEADING_UNLN_FORMAT); - StringToStrPango(&pri_h_mkd->gain_sym, primary_headings.gain_sym, +static const heading_str_t heading_str = { + "Bullion", "Metal", "Premium", "Cost", "Range", + "Pr. Close", "Chg", "Gain", "Total", "Total Cost", + "Total Gain", "Equity", "Symbol", "Price", "Open", + "Asset", "Value", "Cash", "Portfolio", "Portfolio has no assets."}; + +static void format_heading_str_pango(heading_str_t *headings_mkd) { + + StringToStrPango(&headings_mkd->metal, heading_str.metal, HEADING_UNLN_FORMAT); - StringToStrPango(&pri_h_mkd->total, primary_headings.total, + StringToStrPango(&headings_mkd->price, heading_str.price, HEADING_UNLN_FORMAT); - StringToStrPango(&pri_h_mkd->gain_per, primary_headings.gain_per, + StringToStrPango(&headings_mkd->premium, heading_str.premium, HEADING_UNLN_FORMAT); - StringToStrPango(&pri_h_mkd->symbol, primary_headings.symbol, + StringToStrPango(&headings_mkd->cost, heading_str.cost, HEADING_UNLN_FORMAT); + StringToStrPango(&headings_mkd->range, heading_str.range, HEADING_UNLN_FORMAT); - StringToStrPango(&pri_h_mkd->shares, primary_headings.shares, - HEADING_UNLN_FORMAT); - StringToStrPango(&pri_h_mkd->opening, primary_headings.opening, + StringToStrPango(&headings_mkd->prev_closing, heading_str.prev_closing, HEADING_UNLN_FORMAT); - StringToStrPango(&pri_h_mkd->asset, primary_headings.asset, + StringToStrPango(&headings_mkd->chg, heading_str.chg, HEADING_UNLN_FORMAT); + StringToStrPango(&headings_mkd->day_gain, heading_str.day_gain, HEADING_UNLN_FORMAT); - StringToStrPango(&pri_h_mkd->value, primary_headings.value, + StringToStrPango(&headings_mkd->total, heading_str.total, HEADING_UNLN_FORMAT); - StringToStrPango(&pri_h_mkd->cash, primary_headings.cash, - HEADING_ASST_TYPE_FORMAT); - StringToStrPango(&pri_h_mkd->bullion, primary_headings.bullion, - HEADING_ASST_TYPE_FORMAT); - StringToStrPango(&pri_h_mkd->equity, primary_headings.equity, - HEADING_ASST_TYPE_FORMAT); - StringToStrPango(&pri_h_mkd->portfolio, primary_headings.portfolio, - HEADING_ASST_TYPE_FORMAT); - - StringToStrPango(&pri_h_mkd->gold, primary_headings.gold, BLUE); - StringToStrPango(&pri_h_mkd->silver, primary_headings.silver, BLUE); - StringToStrPango(&pri_h_mkd->platinum, primary_headings.platinum, BLUE); - StringToStrPango(&pri_h_mkd->palladium, primary_headings.palladium, BLUE); - StringToStrPango(&pri_h_mkd->no_assets, primary_headings.no_assets, BLUE); -} - -static void format_default_headings_pango(default_heading *def_h_mkd) { - - StringToStrPango(&def_h_mkd->metal, default_headings.metal, + StringToStrPango(&headings_mkd->total_cost, heading_str.total_cost, HEADING_UNLN_FORMAT); - StringToStrPango(&def_h_mkd->ounces, default_headings.ounces, + StringToStrPango(&headings_mkd->total_gain, heading_str.total_gain, HEADING_UNLN_FORMAT); - StringToStrPango(&def_h_mkd->premium, default_headings.premium, + StringToStrPango(&headings_mkd->symbol, heading_str.symbol, + HEADING_UNLN_FORMAT); + + StringToStrPango(&headings_mkd->opening, heading_str.opening, HEADING_UNLN_FORMAT); - StringToStrPango(&def_h_mkd->symbol, default_headings.symbol, + StringToStrPango(&headings_mkd->asset, heading_str.asset, HEADING_UNLN_FORMAT); - StringToStrPango(&def_h_mkd->shares, default_headings.shares, + StringToStrPango(&headings_mkd->value, heading_str.value, HEADING_UNLN_FORMAT); - StringToStrPango(&def_h_mkd->bullion, default_headings.bullion, + StringToStrPango(&headings_mkd->cash, heading_str.cash, HEADING_ASST_TYPE_FORMAT); - StringToStrPango(&def_h_mkd->equity, default_headings.equity, + StringToStrPango(&headings_mkd->bullion, heading_str.bullion, HEADING_ASST_TYPE_FORMAT); - StringToStrPango(&def_h_mkd->cash, default_headings.cash, + StringToStrPango(&headings_mkd->equity, heading_str.equity, HEADING_ASST_TYPE_FORMAT); - StringToStrPango(&def_h_mkd->gold, default_headings.gold, BLUE); - StringToStrPango(&def_h_mkd->silver, default_headings.silver, BLUE); - StringToStrPango(&def_h_mkd->platinum, default_headings.platinum, BLUE); - StringToStrPango(&def_h_mkd->palladium, default_headings.palladium, BLUE); - StringToStrPango(&def_h_mkd->no_assets, default_headings.no_assets, BLUE); + StringToStrPango(&headings_mkd->portfolio, heading_str.portfolio, + HEADING_ASST_TYPE_FORMAT); + StringToStrPango(&headings_mkd->no_assets, heading_str.no_assets, BLUE); } -static void free_primary_headings(primary_heading *pri_h_mkd) { - g_free(pri_h_mkd->bullion); - g_free(pri_h_mkd->metal); - g_free(pri_h_mkd->ounces); - - g_free(pri_h_mkd->premium); - g_free(pri_h_mkd->high); - g_free(pri_h_mkd->low); - - g_free(pri_h_mkd->prev_closing); - g_free(pri_h_mkd->chg); - g_free(pri_h_mkd->gain_sym); - - g_free(pri_h_mkd->total); - g_free(pri_h_mkd->gain_per); - g_free(pri_h_mkd->gold); - - g_free(pri_h_mkd->silver); - g_free(pri_h_mkd->platinum); - g_free(pri_h_mkd->palladium); +static void free_heading_str(heading_str_t *headings_mkd) { + g_free(headings_mkd->bullion); + g_free(headings_mkd->metal); + g_free(headings_mkd->premium); - g_free(pri_h_mkd->equity); - g_free(pri_h_mkd->symbol); - g_free(pri_h_mkd->shares); + g_free(headings_mkd->cost); + g_free(headings_mkd->range); + g_free(headings_mkd->prev_closing); - g_free(pri_h_mkd->price); - g_free(pri_h_mkd->opening); - g_free(pri_h_mkd->asset); + g_free(headings_mkd->chg); + g_free(headings_mkd->day_gain); + g_free(headings_mkd->total); - g_free(pri_h_mkd->value); - g_free(pri_h_mkd->cash); - g_free(pri_h_mkd->portfolio); + g_free(headings_mkd->total_cost); + g_free(headings_mkd->total_gain); + g_free(headings_mkd->equity); - g_free(pri_h_mkd->no_assets); -} - -static void free_default_headings(default_heading *def_h_mkd) { - g_free(def_h_mkd->bullion); - g_free(def_h_mkd->metal); - g_free(def_h_mkd->ounces); - - g_free(def_h_mkd->premium); - g_free(def_h_mkd->gold); - g_free(def_h_mkd->silver); + g_free(headings_mkd->symbol); + g_free(headings_mkd->price); + g_free(headings_mkd->opening); - g_free(def_h_mkd->platinum); - g_free(def_h_mkd->palladium); - g_free(def_h_mkd->equity); + g_free(headings_mkd->asset); + g_free(headings_mkd->value); + g_free(headings_mkd->cash); - g_free(def_h_mkd->symbol); - g_free(def_h_mkd->shares); + g_free(headings_mkd->portfolio); + g_free(headings_mkd->no_assets); } static void ToStringsHeadings() { meta *D = MetaClassObject; - format_default_headings_pango(&D->def_h_mkd); - format_primary_headings_pango(&D->pri_h_mkd); + format_heading_str_pango(&D->headings_mkd); } /* Class Init Functions */ @@ -462,9 +383,11 @@ meta *ClassInitMeta() { new_class->NYSE_Symbol_url_ch = g_strdup(NYSE_SYMBOL_URL); new_class->cash_mrkd_ch = NULL; - new_class->portfolio_port_value_mrkd_ch = NULL; - new_class->portfolio_port_value_chg_mrkd_ch = NULL; - new_class->portfolio_port_value_p_chg_mrkd_ch = NULL; + new_class->portfolio_value_mrkd_ch = NULL; + new_class->portfolio_day_gain_mrkd_ch = NULL; + + new_class->portfolio_cost_mrkd_ch = NULL; + new_class->portfolio_total_gain_mrkd_ch = NULL; new_class->index_dow_value_ch = NULL; new_class->index_dow_value_chg_ch = NULL; @@ -498,13 +421,16 @@ meta *ClassInitMeta() { /* The pango funcs require each dest string to point to allocated space or NULL, they use realloc. */ - new_class->pri_h_mkd = (primary_heading){NULL}; - new_class->def_h_mkd = (default_heading){NULL}; + new_class->headings_mkd = (heading_str_t){NULL}; new_class->cash_f = 0.0f; - new_class->portfolio_port_value_f = 0.0f; - new_class->portfolio_port_value_chg_f = 0.0f; - new_class->portfolio_port_value_p_chg_f = 0.0f; + new_class->portfolio_value_f = 0.0f; + new_class->portfolio_day_gain_value_f = 0.0f; + new_class->portfolio_day_gain_percent_f = 0.0f; + new_class->portfolio_cost_f = 0.0f; + new_class->portfolio_total_gain_value_f = 0.0f; + new_class->portfolio_total_gain_percent_f = 0.0f; + new_class->updates_per_min_f = 6.0f; new_class->updates_hours_f = 1.0f; @@ -563,8 +489,7 @@ meta *ClassInitMeta() { /* Class Destruct Functions */ void ClassDestructMeta(meta *meta_class) { /* Free Memory */ - free_primary_headings(&meta_class->pri_h_mkd); - free_default_headings(&meta_class->def_h_mkd); + free_heading_str(&meta_class->headings_mkd); if (meta_class->rght_clk_data.type) g_free(meta_class->rght_clk_data.type); @@ -592,12 +517,15 @@ void ClassDestructMeta(meta *meta_class) { if (meta_class->cash_mrkd_ch) g_free(meta_class->cash_mrkd_ch); - if (meta_class->portfolio_port_value_mrkd_ch) - g_free(meta_class->portfolio_port_value_mrkd_ch); - if (meta_class->portfolio_port_value_chg_mrkd_ch) - g_free(meta_class->portfolio_port_value_chg_mrkd_ch); - if (meta_class->portfolio_port_value_p_chg_mrkd_ch) - g_free(meta_class->portfolio_port_value_p_chg_mrkd_ch); + if (meta_class->portfolio_value_mrkd_ch) + g_free(meta_class->portfolio_value_mrkd_ch); + if (meta_class->portfolio_day_gain_mrkd_ch) + g_free(meta_class->portfolio_day_gain_mrkd_ch); + + if (meta_class->portfolio_cost_mrkd_ch) + g_free(meta_class->portfolio_cost_mrkd_ch); + if (meta_class->portfolio_total_gain_mrkd_ch) + g_free(meta_class->portfolio_total_gain_mrkd_ch); if (meta_class->index_dow_value_ch) g_free(meta_class->index_dow_value_ch); diff --git a/src/class/class_packet.c b/src/class/class_packet.c index 353c90b..11fe25e 100644 --- a/src/class/class_packet.c +++ b/src/class/class_packet.c @@ -216,9 +216,7 @@ static void StopMultiCurlAll() { remove_main_curl_handles(packet); } -static gpointer GetPrimaryHeadings() { return &packet->meta_class->pri_h_mkd; } - -static gpointer GetDefaultHeadings() { return &packet->meta_class->def_h_mkd; } +static gpointer GetHeadings() { return &packet->meta_class->headings_mkd; } static gpointer GetWindowData() { return &packet->meta_class->window_struct; } @@ -329,24 +327,33 @@ static void save_sql_data_bul(const bullion *gold, const bullion *silver, gchar *gold_ounces_ch = SnPrint("%lf", gold->ounce_f); gchar *gold_premium_ch = SnPrint("%lf", gold->premium_f); + gchar *gold_cost_ch = SnPrint("%lf", gold->cost_basis_f); gchar *silver_ounces_ch = SnPrint("%lf", silver->ounce_f); gchar *silver_premium_ch = SnPrint("%lf", silver->premium_f); + gchar *silver_cost_ch = SnPrint("%lf", silver->cost_basis_f); gchar *platinum_ounces_ch = SnPrint("%lf", platinum->ounce_f); gchar *platinum_premium_ch = SnPrint("%lf", platinum->premium_f); + gchar *platinum_cost_ch = SnPrint("%lf", platinum->cost_basis_f); gchar *palladium_ounces_ch = SnPrint("%lf", palladium->ounce_f); gchar *palladium_premium_ch = SnPrint("%lf", palladium->premium_f); - SqliteBullionAdd(D, "gold", gold_ounces_ch, gold_premium_ch, "silver", - silver_ounces_ch, silver_premium_ch, "platinum", - platinum_ounces_ch, platinum_premium_ch, "palladium", - palladium_ounces_ch, palladium_premium_ch, NULL); + gchar *palladium_cost_ch = SnPrint("%lf", palladium->cost_basis_f); + SqliteBullionAdd( + D, "gold", gold_ounces_ch, gold_premium_ch, gold_cost_ch, "silver", + silver_ounces_ch, silver_premium_ch, silver_cost_ch, "platinum", + platinum_ounces_ch, platinum_premium_ch, platinum_cost_ch, "palladium", + palladium_ounces_ch, palladium_premium_ch, palladium_cost_ch, NULL); g_free(gold_ounces_ch); g_free(gold_premium_ch); + g_free(gold_cost_ch); g_free(silver_ounces_ch); g_free(silver_premium_ch); + g_free(silver_cost_ch); g_free(platinum_ounces_ch); g_free(platinum_premium_ch); + g_free(platinum_cost_ch); g_free(palladium_ounces_ch); g_free(palladium_premium_ch); + g_free(palladium_cost_ch); } static void save_sql_data_app(portfolio_packet *pkg) { @@ -470,8 +477,7 @@ void ClassInitPortfolioPacket() { new_class->SetMainCurlCanceled = SetMainCurlCanceled; new_class->GetHoursOfUpdates = GetHoursOfUpdates; new_class->GetUpdatesPerMinute = GetUpdatesPerMinute; - new_class->GetPrimaryHeadings = GetPrimaryHeadings; - new_class->GetDefaultHeadings = GetDefaultHeadings; + new_class->GetHeadings = GetHeadings; new_class->SaveSqlData = SaveSqlData; new_class->GetWindowData = GetWindowData; new_class->GetMetaClass = GetMetaClass; diff --git a/src/financials.c b/src/financials.c index 4c2f506..9a5ef9a 100644 --- a/src/financials.c +++ b/src/financials.c @@ -74,12 +74,13 @@ static void simple_arg_parse(gchar **argv, portfolio_packet *pkg) { g_print("Help Message\n" "---------------\n" "-h --help\tPrint this help message.\n" + "-v --version\tDisplay the version.\n" "-r --reset\tRemove %s database files.\n\n", argv[0]); - /* Free Class Instances. */ - class_package_destruct(); - exit(EXIT_SUCCESS); + } else if (!g_strcmp0("-v", argv[1]) || !g_strcmp0("--version", argv[1])) { + + g_print(VERSION_STRING "\n"); } else if (!g_strcmp0("-r", argv[1]) || !g_strcmp0("--reset", argv[1])) { @@ -95,12 +96,11 @@ static void simple_arg_parse(gchar **argv, portfolio_packet *pkg) { } else { g_print("Config file directory '%s' removed successfully.\n", pkg->meta_class->config_dir_ch); - - /* Free Class Instances. */ - class_package_destruct(); - exit(EXIT_SUCCESS); } } + /* Free Class Instances. */ + class_package_destruct(); + exit(EXIT_SUCCESS); } gint main(gint argc, gchar *argv[]) { diff --git a/src/financials.h b/src/financials.h index 45cbb50..371c2b2 100644 --- a/src/financials.h +++ b/src/financials.h @@ -38,6 +38,7 @@ POSSIBILITY OF SUCH DAMAGE. #include "include/config.h" /* ReadConfig (), RemoveConfigFiles () */ #include "include/globals.h" /* portfolio_packet *packet */ #include "include/gui.h" /* GuiStart () */ +#include "include/macros.h" /* VERSION_STRING */ #include "include/mutex.h" /* GMutex mutexes[ MUTEX_NUMBER ] */ #endif /* FINANCIALS_HEADER_H */ \ No newline at end of file diff --git a/src/gui/gui.c b/src/gui/gui.c index 91c680f..ed54391 100644 --- a/src/gui/gui.c +++ b/src/gui/gui.c @@ -147,6 +147,10 @@ static void security_window_sig_connect() { object = GetGObject("SecuritySharesEntryBox"); g_signal_connect(object, "changed", G_CALLBACK(GUICallbackHandler), (gpointer)SECURITY_CURSOR_MOVE); + + object = GetGObject("SecurityCostEntryBox"); + g_signal_connect(object, "changed", G_CALLBACK(GUICallbackHandler), + (gpointer)SECURITY_CURSOR_MOVE); } static void bullion_window_sig_connect() { @@ -174,6 +178,10 @@ static void bullion_window_sig_connect() { g_signal_connect(object, "changed", G_CALLBACK(GUICallbackHandler), (gpointer)BUL_CURSOR_MOVE); + object = GetGObject("BullionGoldCostEntryBox"); + g_signal_connect(object, "changed", G_CALLBACK(GUICallbackHandler), + (gpointer)BUL_CURSOR_MOVE); + object = GetGObject("BullionSilverOuncesEntryBox"); g_signal_connect(object, "changed", G_CALLBACK(GUICallbackHandler), (gpointer)BUL_CURSOR_MOVE); @@ -182,6 +190,10 @@ static void bullion_window_sig_connect() { g_signal_connect(object, "changed", G_CALLBACK(GUICallbackHandler), (gpointer)BUL_CURSOR_MOVE); + object = GetGObject("BullionSilverCostEntryBox"); + g_signal_connect(object, "changed", G_CALLBACK(GUICallbackHandler), + (gpointer)BUL_CURSOR_MOVE); + object = GetGObject("BullionPlatinumOuncesEntryBox"); g_signal_connect(object, "changed", G_CALLBACK(GUICallbackHandler), (gpointer)BUL_CURSOR_MOVE); @@ -190,6 +202,10 @@ static void bullion_window_sig_connect() { g_signal_connect(object, "changed", G_CALLBACK(GUICallbackHandler), (gpointer)BUL_CURSOR_MOVE); + object = GetGObject("BullionPlatinumCostEntryBox"); + g_signal_connect(object, "changed", G_CALLBACK(GUICallbackHandler), + (gpointer)BUL_CURSOR_MOVE); + object = GetGObject("BullionPalladiumOuncesEntryBox"); g_signal_connect(object, "changed", G_CALLBACK(GUICallbackHandler), (gpointer)BUL_CURSOR_MOVE); @@ -198,6 +214,10 @@ static void bullion_window_sig_connect() { g_signal_connect(object, "changed", G_CALLBACK(GUICallbackHandler), (gpointer)BUL_CURSOR_MOVE); + object = GetGObject("BullionPalladiumCostEntryBox"); + g_signal_connect(object, "changed", G_CALLBACK(GUICallbackHandler), + (gpointer)BUL_CURSOR_MOVE); + object = GetGObject("BullionComboBox"); g_signal_connect(object, "changed", G_CALLBACK(GUICallbackHandler), (gpointer)BUL_COMBO_BOX); diff --git a/src/gui/gui_callbacks.c b/src/gui/gui_callbacks.c index ed1fc41..0b88b77 100644 --- a/src/gui/gui_callbacks.c +++ b/src/gui/gui_callbacks.c @@ -150,6 +150,7 @@ void GUICallback_security_stack(GObject *gobject) { GtkWidget *ComboBox = GetWidget("SecurityComboBox"); GtkWidget *EntryBoxSymbol = GetWidget("SecuritySymbolEntryBox"); GtkWidget *EntryBoxShares = GetWidget("SecuritySharesEntryBox"); + GtkWidget *EntryBoxCost = GetWidget("SecurityCostEntryBox"); GtkWidget *Button = GetWidget("SecurityOkBTN"); if (g_strcmp0(name, "add") == 0) { @@ -158,21 +159,25 @@ void GUICallback_security_stack(GObject *gobject) { gtk_combo_box_set_active(GTK_COMBO_BOX(ComboBox), 0); gtk_widget_set_sensitive(EntryBoxSymbol, TRUE); gtk_widget_set_sensitive(EntryBoxShares, TRUE); + gtk_widget_set_sensitive(EntryBoxCost, TRUE); gtk_widget_set_sensitive(Button, FALSE); /* Reset EntryBoxes */ gtk_entry_set_text(GTK_ENTRY(EntryBoxSymbol), ""); gtk_entry_set_text(GTK_ENTRY(EntryBoxShares), ""); + gtk_entry_set_text(GTK_ENTRY(EntryBoxCost), ""); } else { gtk_combo_box_set_button_sensitivity(GTK_COMBO_BOX(ComboBox), GTK_SENSITIVITY_AUTO); gtk_widget_set_sensitive(EntryBoxSymbol, FALSE); gtk_widget_set_sensitive(EntryBoxShares, FALSE); + gtk_widget_set_sensitive(EntryBoxCost, FALSE); gtk_widget_set_sensitive(Button, FALSE); /* Reset EntryBoxes */ gtk_entry_set_text(GTK_ENTRY(EntryBoxSymbol), ""); gtk_entry_set_text(GTK_ENTRY(EntryBoxShares), ""); + gtk_entry_set_text(GTK_ENTRY(EntryBoxCost), ""); } } @@ -410,6 +415,7 @@ static void popup_menu_view_summary() { static void zeroize_bullion(bullion *B) { B->ounce_f = 0.0f; B->premium_f = 0.0f; + B->cost_basis_f = 0.0f; } static void popup_menu_delete_bullion(GtkWidget *menuitem, gpointer userdata) { diff --git a/src/gui/gui_history.c b/src/gui/gui_history.c index c3c89e4..cdf9a75 100644 --- a/src/gui/gui_history.c +++ b/src/gui/gui_history.c @@ -96,8 +96,8 @@ gint HistoryTreeViewClear() { } static const gchar *col_names[HISTORY_N_COLUMNS] = { - "Date", "Price", "High", "Low", "Open", "Pr. Close", - "Chg", "Gain (%)", "Vol.", "RSI", "Indicator"}; + "Date", "Price", "Open", "Range", "Pr. Close", + "Chg", "Gain (%)", "Vol.", "RSI", "Indicator"}; static void history_set_columns() { GtkWidget *list = GetWidget("HistoryTreeView"); @@ -182,8 +182,7 @@ static gboolean history_rsi_ready(gdouble gain_f, gdouble *rsi_f, gint state) { typedef struct { gchar *date_ch; gchar *price_ch; - gchar *high_ch; - gchar *low_ch; + gchar *range_ch; gchar *opening_ch; gchar *prev_closing_ch; gchar *change_ch; @@ -235,12 +234,11 @@ static gboolean history_rsi_calculate(gchar *line, history_strings *strings, DoubleToFormattedStrPango(&strings->prev_closing_ch, prev_price_f, 2, MON_STR, BLACK); DoubleToFormattedStrPango(&strings->price_ch, cur_price_f, 2, MON_STR, BLACK); - StringToStrPango(&strings->high_ch, token_arr[2] ? token_arr[2] : "0", - STR_TO_MON_STR); - StringToStrPango(&strings->low_ch, token_arr[3] ? token_arr[3] : "0", - STR_TO_MON_STR); StringToStrPango(&strings->opening_ch, token_arr[1] ? token_arr[1] : "0", STR_TO_MON_STR); + double high_f = g_strtod(token_arr[2] ? token_arr[2] : "0", NULL); + double low_f = g_strtod(token_arr[3] ? token_arr[3] : "0", NULL); + RangeStrPango(&strings->range_ch, low_f, high_f, 2); change_f = cur_price_f - prev_price_f; if (change_f > 0) { DoubleToFormattedStrPango(&strings->change_ch, change_f, 2, MON_STR, GREEN); @@ -282,8 +280,7 @@ static void history_set_store_cleanup(history_strings *history_strs) { g_free(history_strs->rsi_ch); g_free(history_strs->volume_ch); g_free(history_strs->price_ch); - g_free(history_strs->high_ch); - g_free(history_strs->low_ch); + g_free(history_strs->range_ch); g_free(history_strs->opening_ch); g_free(history_strs->change_ch); g_free(history_strs->prev_closing_ch); @@ -336,13 +333,11 @@ static void history_set_store(GtkListStore *store, const gchar *curl_data, gtk_list_store_set( store, &iter, HISTORY_COLUMN_ONE, history_strs.date_ch, HISTORY_COLUMN_TWO, history_strs.price_ch, HISTORY_COLUMN_THREE, - history_strs.high_ch, HISTORY_COLUMN_FOUR, history_strs.low_ch, - HISTORY_COLUMN_FIVE, history_strs.opening_ch, HISTORY_COLUMN_SIX, - history_strs.prev_closing_ch, HISTORY_COLUMN_SEVEN, - history_strs.change_ch, HISTORY_COLUMN_EIGHT, history_strs.gain_ch, - HISTORY_COLUMN_NINE, history_strs.volume_ch, HISTORY_COLUMN_TEN, - history_strs.rsi_ch, HISTORY_COLUMN_ELEVEN, history_strs.indicator_ch, - -1); + history_strs.opening_ch, HISTORY_COLUMN_FOUR, history_strs.range_ch, + HISTORY_COLUMN_FIVE, history_strs.prev_closing_ch, HISTORY_COLUMN_SIX, + history_strs.change_ch, HISTORY_COLUMN_SEVEN, history_strs.gain_ch, + HISTORY_COLUMN_EIGHT, history_strs.volume_ch, HISTORY_COLUMN_NINE, + history_strs.rsi_ch, HISTORY_COLUMN_TEN, history_strs.indicator_ch, -1); } g_free(line); fclose(fp); @@ -356,7 +351,7 @@ GtkListStore *HistoryMakeStore(const gchar *data_str, const gsize string_len) { store = gtk_list_store_new(HISTORY_N_COLUMNS, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, - G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); + G_TYPE_STRING, G_TYPE_STRING); /* Add data to the storage container, pass in the data_str pointer and the * string length [not including null]. */ diff --git a/src/gui/gui_main.c b/src/gui/gui_main.c index 4329edc..175be84 100644 --- a/src/gui/gui_main.c +++ b/src/gui/gui_main.c @@ -100,31 +100,29 @@ static gint main_set_columns(gint column_type) { * symbol, etc] */ add_hidden_column("symbol_text", MAIN_COLUMN_SYMBOL, list); - for (guint8 g = MAIN_COLUMN_ONE; g <= MAIN_COLUMN_THREE; g++) + for (guint8 g = MAIN_COLUMN_ONE; g <= MAIN_COLUMN_FOUR; g++) AddColumnToTreeview("column_name", g, list); if (column_type == GUI_COLUMN_PRIMARY) /* if PRIMARY treeview */ - for (guint8 g = MAIN_COLUMN_FOUR; g < MAIN_N_COLUMNS; g++) + for (guint8 g = MAIN_COLUMN_FIVE; g < MAIN_N_COLUMNS; g++) AddColumnToTreeview("column_name", g, list); return 0; } static gint main_prmry_add_bul_store(bullion *B, const gchar *unmarked_name_ch, - const gchar *marked_name_ch, GtkListStore *store, GtkTreeIter *iter) { gtk_list_store_append(store, iter); gtk_list_store_set( store, iter, MAIN_COLUMN_TYPE, "bullion", MAIN_COLUMN_SYMBOL, - unmarked_name_ch, MAIN_COLUMN_ONE, marked_name_ch, MAIN_COLUMN_TWO, - B->ounce_mrkd_ch, MAIN_COLUMN_THREE, B->spot_price_mrkd_ch, - MAIN_COLUMN_FOUR, B->premium_mrkd_ch, MAIN_COLUMN_FIVE, - B->high_metal_mrkd_ch, MAIN_COLUMN_SIX, B->low_metal_mrkd_ch, - MAIN_COLUMN_SEVEN, B->prev_closing_metal_mrkd_ch, MAIN_COLUMN_EIGHT, - B->change_ounce_mrkd_ch, MAIN_COLUMN_NINE, B->change_value_mrkd_ch, - MAIN_COLUMN_TEN, B->port_value_mrkd_ch, MAIN_COLUMN_ELEVEN, - B->change_percent_mrkd_ch, -1); + unmarked_name_ch, MAIN_COLUMN_ONE, B->metal_mrkd_ch, MAIN_COLUMN_TWO, + B->spot_price_mrkd_ch, MAIN_COLUMN_THREE, B->premium_mrkd_ch, + MAIN_COLUMN_FOUR, B->cost_mrkd_ch, MAIN_COLUMN_FIVE, B->range_mrkd_ch, + MAIN_COLUMN_SIX, B->prev_closing_metal_mrkd_ch, MAIN_COLUMN_SEVEN, + B->change_ounce_mrkd_ch, MAIN_COLUMN_EIGHT, B->port_value_mrkd_ch, + MAIN_COLUMN_NINE, B->total_cost_mrkd_ch, MAIN_COLUMN_TEN, + B->total_gain_mrkd_ch, -1); return 0; } @@ -132,51 +130,47 @@ static GtkListStore *main_primary_store(portfolio_packet *pkg) { metal *M = pkg->GetMetalClass(); equity_folder *F = pkg->GetEquityFolderClass(); meta *D = pkg->GetMetaClass(); - primary_heading *pri_h_mkd = pkg->GetPrimaryHeadings(); + heading_str_t *headings_mkd = pkg->GetHeadings(); GtkListStore *store = NULL; GtkTreeIter iter; gboolean no_assets = TRUE; /* Set up the storage container with the number of columns and column type */ - store = gtk_list_store_new(MAIN_N_COLUMNS, G_TYPE_STRING, G_TYPE_STRING, - G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, - G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, - G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, - G_TYPE_STRING, G_TYPE_STRING); + store = gtk_list_store_new( + MAIN_N_COLUMNS, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, + G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, + G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); /* Add data to the storage container. */ if (M->bullion_port_value_f) { gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, MAIN_COLUMN_TYPE, "bullion_total", MAIN_COLUMN_SYMBOL, "", MAIN_COLUMN_ONE, - pri_h_mkd->bullion, -1); + headings_mkd->bullion, -1); gtk_list_store_append(store, &iter); gtk_list_store_set( store, &iter, MAIN_COLUMN_TYPE, "bullion_total", MAIN_COLUMN_SYMBOL, "", - MAIN_COLUMN_ONE, pri_h_mkd->metal, MAIN_COLUMN_TWO, pri_h_mkd->ounces, - MAIN_COLUMN_THREE, pri_h_mkd->price, MAIN_COLUMN_FOUR, - pri_h_mkd->premium, MAIN_COLUMN_FIVE, pri_h_mkd->high, MAIN_COLUMN_SIX, - pri_h_mkd->low, MAIN_COLUMN_SEVEN, pri_h_mkd->prev_closing, - MAIN_COLUMN_EIGHT, pri_h_mkd->chg, MAIN_COLUMN_NINE, - pri_h_mkd->gain_sym, MAIN_COLUMN_TEN, pri_h_mkd->total, - MAIN_COLUMN_ELEVEN, pri_h_mkd->gain_per, -1); + MAIN_COLUMN_ONE, headings_mkd->metal, MAIN_COLUMN_TWO, + headings_mkd->price, MAIN_COLUMN_THREE, headings_mkd->premium, + MAIN_COLUMN_FOUR, headings_mkd->cost, MAIN_COLUMN_FIVE, + headings_mkd->range, MAIN_COLUMN_SIX, headings_mkd->prev_closing, + MAIN_COLUMN_SEVEN, headings_mkd->chg, MAIN_COLUMN_EIGHT, + headings_mkd->total, MAIN_COLUMN_NINE, headings_mkd->total_cost, + MAIN_COLUMN_TEN, headings_mkd->total_gain, -1); if (M->Gold->ounce_f) - main_prmry_add_bul_store(M->Gold, "gold", pri_h_mkd->gold, store, &iter); + main_prmry_add_bul_store(M->Gold, "gold", store, &iter); if (M->Palladium->ounce_f) - main_prmry_add_bul_store(M->Palladium, "palladium", pri_h_mkd->palladium, - store, &iter); + main_prmry_add_bul_store(M->Palladium, "palladium", store, &iter); if (M->Platinum->ounce_f) - main_prmry_add_bul_store(M->Platinum, "platinum", pri_h_mkd->platinum, - store, &iter); + main_prmry_add_bul_store(M->Platinum, "platinum", store, &iter); if (M->Silver->ounce_f) - main_prmry_add_bul_store(M->Silver, "silver", pri_h_mkd->silver, store, - &iter); + main_prmry_add_bul_store(M->Silver, "silver", store, &iter); gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, MAIN_COLUMN_TYPE, "blank_space_primary", @@ -189,17 +183,18 @@ static GtkListStore *main_primary_store(portfolio_packet *pkg) { gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, MAIN_COLUMN_TYPE, "equity_total", MAIN_COLUMN_SYMBOL, "", MAIN_COLUMN_ONE, - pri_h_mkd->equity, -1); + headings_mkd->equity, -1); gtk_list_store_append(store, &iter); gtk_list_store_set( store, &iter, MAIN_COLUMN_TYPE, "equity_total", MAIN_COLUMN_SYMBOL, "", - MAIN_COLUMN_ONE, pri_h_mkd->symbol, MAIN_COLUMN_TWO, pri_h_mkd->shares, - MAIN_COLUMN_THREE, pri_h_mkd->price, MAIN_COLUMN_FOUR, pri_h_mkd->high, - MAIN_COLUMN_FIVE, pri_h_mkd->low, MAIN_COLUMN_SIX, pri_h_mkd->opening, - MAIN_COLUMN_SEVEN, pri_h_mkd->prev_closing, MAIN_COLUMN_EIGHT, - pri_h_mkd->chg, MAIN_COLUMN_NINE, pri_h_mkd->gain_sym, MAIN_COLUMN_TEN, - pri_h_mkd->total, MAIN_COLUMN_ELEVEN, pri_h_mkd->gain_per, -1); + MAIN_COLUMN_ONE, headings_mkd->symbol, MAIN_COLUMN_TWO, + headings_mkd->price, MAIN_COLUMN_THREE, headings_mkd->opening, + MAIN_COLUMN_FOUR, headings_mkd->cost, MAIN_COLUMN_FIVE, + headings_mkd->range, MAIN_COLUMN_SIX, headings_mkd->prev_closing, + MAIN_COLUMN_SEVEN, headings_mkd->chg, MAIN_COLUMN_EIGHT, + headings_mkd->total, MAIN_COLUMN_NINE, headings_mkd->total_cost, + MAIN_COLUMN_TEN, headings_mkd->total_gain, -1); guint8 c; guint8 g = 0; @@ -211,33 +206,31 @@ static GtkListStore *main_primary_store(portfolio_packet *pkg) { c = 0; while (c < F->size) { if (g == 0) { - if (!F->Equity[c]->num_shares_stock_int) { + if (!F->Equity[c]->quantity_int) { c++; continue; } } else { - if (F->Equity[c]->num_shares_stock_int) { + if (F->Equity[c]->quantity_int) { c++; continue; } } gtk_list_store_append(store, &iter); - gtk_list_store_set( store, &iter, MAIN_COLUMN_TYPE, "equity", MAIN_COLUMN_SYMBOL, F->Equity[c]->symbol_stock_ch, MAIN_COLUMN_ONE, F->Equity[c]->symbol_stock_mrkd_ch, MAIN_COLUMN_TWO, - F->Equity[c]->num_shares_stock_mrkd_ch, MAIN_COLUMN_THREE, - F->Equity[c]->current_price_stock_mrkd_ch, MAIN_COLUMN_FOUR, - F->Equity[c]->high_stock_mrkd_ch, MAIN_COLUMN_FIVE, - F->Equity[c]->low_stock_mrkd_ch, MAIN_COLUMN_SIX, - F->Equity[c]->opening_stock_mrkd_ch, MAIN_COLUMN_SEVEN, - F->Equity[c]->prev_closing_stock_mrkd_ch, MAIN_COLUMN_EIGHT, - F->Equity[c]->change_share_stock_mrkd_ch, MAIN_COLUMN_NINE, - F->Equity[c]->change_value_mrkd_ch, MAIN_COLUMN_TEN, - F->Equity[c]->current_investment_stock_mrkd_ch, MAIN_COLUMN_ELEVEN, - F->Equity[c]->change_percent_mrkd_ch, -1); + F->Equity[c]->current_price_stock_mrkd_ch, MAIN_COLUMN_THREE, + F->Equity[c]->opening_stock_mrkd_ch, MAIN_COLUMN_FOUR, + F->Equity[c]->cost_mrkd_ch, MAIN_COLUMN_FIVE, + F->Equity[c]->range_mrkd_ch, MAIN_COLUMN_SIX, + F->Equity[c]->prev_closing_stock_mrkd_ch, MAIN_COLUMN_SEVEN, + F->Equity[c]->change_share_stock_mrkd_ch, MAIN_COLUMN_EIGHT, + F->Equity[c]->current_investment_stock_mrkd_ch, MAIN_COLUMN_NINE, + F->Equity[c]->total_cost_mrkd_ch, MAIN_COLUMN_TEN, + F->Equity[c]->total_gain_mrkd_ch, -1); c++; } @@ -253,18 +246,20 @@ static GtkListStore *main_primary_store(portfolio_packet *pkg) { if (D->cash_f || M->bullion_port_value_f || F->stock_port_value_f) { gtk_list_store_append(store, &iter); - gtk_list_store_set(store, &iter, MAIN_COLUMN_TYPE, "blank_space_primary", - MAIN_COLUMN_SYMBOL, "", MAIN_COLUMN_ONE, - pri_h_mkd->asset, MAIN_COLUMN_TWO, pri_h_mkd->value, - MAIN_COLUMN_THREE, pri_h_mkd->gain_sym, MAIN_COLUMN_FOUR, - pri_h_mkd->gain_per, -1); + gtk_list_store_set( + store, &iter, MAIN_COLUMN_TYPE, "blank_space_primary", + MAIN_COLUMN_SYMBOL, "", MAIN_COLUMN_ONE, headings_mkd->asset, + MAIN_COLUMN_TWO, headings_mkd->value, MAIN_COLUMN_THREE, + headings_mkd->day_gain, MAIN_COLUMN_FOUR, headings_mkd->total_cost, + MAIN_COLUMN_FIVE, headings_mkd->total_gain, -1); } if (D->cash_f) { gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, MAIN_COLUMN_TYPE, "cash", - MAIN_COLUMN_SYMBOL, "", MAIN_COLUMN_ONE, pri_h_mkd->cash, - MAIN_COLUMN_TWO, D->cash_mrkd_ch, -1); + MAIN_COLUMN_SYMBOL, "", MAIN_COLUMN_ONE, + headings_mkd->cash, MAIN_COLUMN_TWO, D->cash_mrkd_ch, + MAIN_COLUMN_FOUR, D->cash_mrkd_ch, -1); no_assets = FALSE; } @@ -274,23 +269,25 @@ static GtkListStore *main_primary_store(portfolio_packet *pkg) { gtk_list_store_set(store, &iter, MAIN_COLUMN_TYPE, "bullion_total", MAIN_COLUMN_SYMBOL, "", MAIN_COLUMN_ONE, - pri_h_mkd->bullion, MAIN_COLUMN_TWO, + headings_mkd->bullion, MAIN_COLUMN_TWO, M->bullion_port_value_mrkd_ch, MAIN_COLUMN_THREE, - M->bullion_port_value_chg_mrkd_ch, MAIN_COLUMN_FOUR, - M->bullion_port_value_p_chg_mrkd_ch, -1); + M->bullion_port_day_gain_mrkd_ch, MAIN_COLUMN_FOUR, + M->bullion_port_cost_mrkd_ch, MAIN_COLUMN_FIVE, + M->bullion_port_total_gain_mrkd_ch, -1); } if (F->stock_port_value_f) { gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, MAIN_COLUMN_TYPE, "equity_total", MAIN_COLUMN_SYMBOL, "", MAIN_COLUMN_ONE, - pri_h_mkd->equity, MAIN_COLUMN_TWO, + headings_mkd->equity, MAIN_COLUMN_TWO, F->stock_port_value_mrkd_ch, MAIN_COLUMN_THREE, - F->stock_port_value_chg_mrkd_ch, MAIN_COLUMN_FOUR, - F->stock_port_value_p_chg_mrkd_ch, -1); + F->stock_port_day_gain_mrkd_ch, MAIN_COLUMN_FOUR, + F->stock_port_cost_mrkd_ch, MAIN_COLUMN_FIVE, + F->stock_port_total_gain_mrkd_ch, -1); } - if (D->portfolio_port_value_f) { + if (D->portfolio_value_f) { gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, MAIN_COLUMN_TYPE, "blank_space_primary", MAIN_COLUMN_SYMBOL, "", -1); @@ -298,10 +295,11 @@ static GtkListStore *main_primary_store(portfolio_packet *pkg) { gtk_list_store_set(store, &iter, MAIN_COLUMN_TYPE, "blank_space_primary", MAIN_COLUMN_SYMBOL, "", MAIN_COLUMN_ONE, - pri_h_mkd->portfolio, MAIN_COLUMN_TWO, - D->portfolio_port_value_mrkd_ch, MAIN_COLUMN_THREE, - D->portfolio_port_value_chg_mrkd_ch, MAIN_COLUMN_FOUR, - D->portfolio_port_value_p_chg_mrkd_ch, -1); + headings_mkd->portfolio, MAIN_COLUMN_TWO, + D->portfolio_value_mrkd_ch, MAIN_COLUMN_THREE, + D->portfolio_day_gain_mrkd_ch, MAIN_COLUMN_FOUR, + D->portfolio_cost_mrkd_ch, MAIN_COLUMN_FIVE, + D->portfolio_total_gain_mrkd_ch, -1); gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, MAIN_COLUMN_TYPE, "blank_space_primary", @@ -312,7 +310,7 @@ static GtkListStore *main_primary_store(portfolio_packet *pkg) { gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, MAIN_COLUMN_TYPE, "blank_space_primary", MAIN_COLUMN_SYMBOL, "", MAIN_COLUMN_ONE, - pri_h_mkd->no_assets, -1); + headings_mkd->no_assets, -1); } /* Indicate that the default view is not displayed. */ @@ -322,13 +320,12 @@ static GtkListStore *main_primary_store(portfolio_packet *pkg) { } static gint main_def_add_bul_store(bullion *B, const gchar *unmarked_name_ch, - const gchar *marked_name_ch, GtkListStore *store, GtkTreeIter *iter) { gtk_list_store_append(store, iter); gtk_list_store_set(store, iter, MAIN_COLUMN_TYPE, "bullion", MAIN_COLUMN_SYMBOL, unmarked_name_ch, MAIN_COLUMN_ONE, - marked_name_ch, MAIN_COLUMN_TWO, B->ounce_mrkd_ch, - MAIN_COLUMN_THREE, B->premium_mrkd_ch, -1); + B->metal_mrkd_ch, MAIN_COLUMN_TWO, B->premium_mrkd_ch, + MAIN_COLUMN_THREE, B->cost_mrkd_ch, -1); return 0; } @@ -336,7 +333,7 @@ static GtkListStore *main_default_store(portfolio_packet *pkg) { metal *M = pkg->GetMetalClass(); equity_folder *F = pkg->GetEquityFolderClass(); meta *D = pkg->GetMetaClass(); - default_heading *def_h_mkd = pkg->GetDefaultHeadings(); + heading_str_t *headings_mkd = pkg->GetHeadings(); gboolean no_assets = TRUE; @@ -345,8 +342,8 @@ static GtkListStore *main_default_store(portfolio_packet *pkg) { /* Set up the storage container with the number of columns and column type */ - store = gtk_list_store_new(5, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, - G_TYPE_STRING, G_TYPE_STRING); + store = gtk_list_store_new(6, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, + G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); /* Add data to the storage container. */ if (M->Gold->ounce_f || M->Silver->ounce_f || M->Platinum->ounce_f || @@ -355,28 +352,25 @@ static GtkListStore *main_default_store(portfolio_packet *pkg) { gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, MAIN_COLUMN_TYPE, "bullion_total", MAIN_COLUMN_SYMBOL, "", MAIN_COLUMN_ONE, - def_h_mkd->bullion, -1); + headings_mkd->bullion, -1); gtk_list_store_append(store, &iter); - gtk_list_store_set(store, &iter, MAIN_COLUMN_TYPE, "bullion_total", - MAIN_COLUMN_SYMBOL, "", MAIN_COLUMN_ONE, - def_h_mkd->metal, MAIN_COLUMN_TWO, def_h_mkd->ounces, - MAIN_COLUMN_THREE, def_h_mkd->premium, -1); + gtk_list_store_set( + store, &iter, MAIN_COLUMN_TYPE, "bullion_total", MAIN_COLUMN_SYMBOL, "", + MAIN_COLUMN_ONE, headings_mkd->metal, MAIN_COLUMN_TWO, + headings_mkd->premium, MAIN_COLUMN_THREE, headings_mkd->cost, -1); if (M->Gold->ounce_f) - main_def_add_bul_store(M->Gold, "gold", def_h_mkd->gold, store, &iter); + main_def_add_bul_store(M->Gold, "gold", store, &iter); if (M->Palladium->ounce_f) - main_def_add_bul_store(M->Palladium, "palladium", def_h_mkd->palladium, - store, &iter); + main_def_add_bul_store(M->Palladium, "palladium", store, &iter); if (M->Platinum->ounce_f) - main_def_add_bul_store(M->Platinum, "platinum", def_h_mkd->platinum, - store, &iter); + main_def_add_bul_store(M->Platinum, "platinum", store, &iter); if (M->Silver->ounce_f) - main_def_add_bul_store(M->Silver, "silver", def_h_mkd->silver, store, - &iter); + main_def_add_bul_store(M->Silver, "silver", store, &iter); gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, MAIN_COLUMN_TYPE, "blank_space_default", @@ -388,13 +382,13 @@ static GtkListStore *main_default_store(portfolio_packet *pkg) { gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, MAIN_COLUMN_TYPE, "equity_total", MAIN_COLUMN_SYMBOL, "", MAIN_COLUMN_ONE, - def_h_mkd->equity, -1); + headings_mkd->equity, -1); gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, MAIN_COLUMN_TYPE, "equity_total", MAIN_COLUMN_SYMBOL, "", MAIN_COLUMN_ONE, - def_h_mkd->symbol, MAIN_COLUMN_TWO, def_h_mkd->shares, - -1); + headings_mkd->symbol, MAIN_COLUMN_THREE, + headings_mkd->cost, -1); guint8 c; guint8 g = 0; @@ -405,24 +399,24 @@ static GtkListStore *main_default_store(portfolio_packet *pkg) { c = 0; while (c < F->size) { if (g == 0) { - if (!F->Equity[c]->num_shares_stock_int) { + if (!F->Equity[c]->quantity_int) { c++; continue; } } else { - if (F->Equity[c]->num_shares_stock_int) { + if (F->Equity[c]->quantity_int) { c++; continue; } } gtk_list_store_append(store, &iter); - gtk_list_store_set( - store, &iter, MAIN_COLUMN_TYPE, "equity", MAIN_COLUMN_SYMBOL, - F->Equity[c]->symbol_stock_ch, MAIN_COLUMN_ONE, - F->Equity[c]->symbol_stock_mrkd_ch, MAIN_COLUMN_TWO, - F->Equity[c]->num_shares_stock_mrkd_ch, MAIN_COLUMN_THREE, - F->Equity[c]->security_name_mrkd_ch, -1); + gtk_list_store_set(store, &iter, MAIN_COLUMN_TYPE, "equity", + MAIN_COLUMN_SYMBOL, F->Equity[c]->symbol_stock_ch, + MAIN_COLUMN_ONE, F->Equity[c]->symbol_stock_mrkd_ch, + MAIN_COLUMN_THREE, F->Equity[c]->cost_mrkd_ch, + MAIN_COLUMN_FOUR, + F->Equity[c]->security_name_mrkd_ch, -1); c++; } g++; @@ -436,8 +430,9 @@ static GtkListStore *main_default_store(portfolio_packet *pkg) { if (D->cash_f) { gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, MAIN_COLUMN_TYPE, "cash", - MAIN_COLUMN_SYMBOL, "", MAIN_COLUMN_ONE, def_h_mkd->cash, - MAIN_COLUMN_THREE, D->cash_mrkd_ch, -1); + MAIN_COLUMN_SYMBOL, "", MAIN_COLUMN_ONE, + headings_mkd->cash, MAIN_COLUMN_THREE, D->cash_mrkd_ch, + -1); gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, MAIN_COLUMN_TYPE, "blank_space_default", MAIN_COLUMN_SYMBOL, "", MAIN_COLUMN_ONE, "", -1); @@ -452,7 +447,7 @@ static GtkListStore *main_default_store(portfolio_packet *pkg) { gtk_list_store_set(store, &iter, MAIN_COLUMN_TYPE, "blank_space_default", MAIN_COLUMN_SYMBOL, "", MAIN_COLUMN_ONE, - def_h_mkd->no_assets, -1); + headings_mkd->no_assets, -1); } /* Indicate that the default view is displayed. */ diff --git a/src/gui/gui_other_wins.c b/src/gui/gui_other_wins.c index 6d64a06..0b5b204 100644 --- a/src/gui/gui_other_wins.c +++ b/src/gui/gui_other_wins.c @@ -32,6 +32,7 @@ POSSIBILITY OF SUCH DAMAGE. #include "../include/gui.h" /* MainPrimaryTreeview */ #include "../include/class_types.h" /* portfolio_packet, equity_folder, metal, meta */ +#include "../include/macros.h" #include "../include/multicurl.h" #include "../include/mutex.h" #include "../include/workfuncs.h" @@ -227,20 +228,27 @@ gint BullionShowHide(portfolio_packet *pkg) { /* Set EntryBoxes */ set_bullion_entry_box("BullionGoldOuncesEntryBox", M->Gold->ounce_f, 4); set_bullion_entry_box("BullionGoldPremiumEntryBox", M->Gold->premium_f, 2); + set_bullion_entry_box("BullionGoldCostEntryBox", M->Gold->cost_basis_f, 2); set_bullion_entry_box("BullionSilverOuncesEntryBox", M->Silver->ounce_f, 4); set_bullion_entry_box("BullionSilverPremiumEntryBox", M->Silver->premium_f, 2); + set_bullion_entry_box("BullionSilverCostEntryBox", M->Silver->cost_basis_f, + 2); set_bullion_entry_box("BullionPlatinumOuncesEntryBox", M->Platinum->ounce_f, 4); set_bullion_entry_box("BullionPlatinumPremiumEntryBox", M->Platinum->premium_f, 2); + set_bullion_entry_box("BullionPlatinumCostEntryBox", + M->Platinum->cost_basis_f, 2); set_bullion_entry_box("BullionPalladiumOuncesEntryBox", M->Palladium->ounce_f, 4); set_bullion_entry_box("BullionPalladiumPremiumEntryBox", M->Palladium->premium_f, 2); + set_bullion_entry_box("BullionPalladiumCostEntryBox", + M->Palladium->cost_basis_f, 2); GtkWidget *frame = GetWidget("BullionGoldFrame"); gtk_widget_set_visible(frame, TRUE); @@ -260,12 +268,15 @@ gint BullionShowHide(portfolio_packet *pkg) { } static gboolean process_bullion_data(const gchar *new_ounces_ch, - const gchar *new_premium_ch, bullion *B) { + const gchar *new_premium_ch, + const gchar *new_cost_ch, bullion *B) { gboolean new_bullion = FALSE; gdouble new_ounces_f = g_strtod(new_ounces_ch, NULL); gdouble new_premium_f = g_strtod(new_premium_ch, NULL); + gdouble new_cost_f = g_strtod(new_cost_ch, NULL); - if (new_ounces_f != B->ounce_f || new_premium_f != B->premium_f) { + if (new_ounces_f != B->ounce_f || new_premium_f != B->premium_f || + new_cost_f != B->cost_basis_f) { if (B->ounce_f > 0 || new_ounces_f == 0) /* We already have data for this bullion. Or we are deleting data for this bullion. */ @@ -276,6 +287,7 @@ static gboolean process_bullion_data(const gchar *new_ounces_ch, B->ounce_f = new_ounces_f; B->premium_f = new_premium_f; + B->cost_basis_f = new_cost_f; } return new_bullion; } @@ -283,12 +295,13 @@ static gboolean process_bullion_data(const gchar *new_ounces_ch, static gboolean process_bullion_entry_boxes(const gchar *ounces_entry_box_name_ch, const gchar *premium_entry_box_name_ch, - bullion *B) { + const gchar *cost_entry_box_name_ch, bullion *B) { const gchar *new_ounces_ch = GetEntryText(ounces_entry_box_name_ch); const gchar *new_premium_ch = GetEntryText(premium_entry_box_name_ch); + const gchar *new_cost_ch = GetEntryText(cost_entry_box_name_ch); - return process_bullion_data(new_ounces_ch, new_premium_ch, B); + return process_bullion_data(new_ounces_ch, new_premium_ch, new_cost_ch, B); } enum { GOLD, SILVER, PLATINUM, PALLADIUM }; @@ -297,33 +310,38 @@ static gboolean process_bullion(const gint metal_int, portfolio_packet *pkg) { const gchar *ounce_entry_name_ch; const gchar *premium_entry_name_ch; + const gchar *cost_entry_name_ch; bullion *B; switch (metal_int) { case GOLD: ounce_entry_name_ch = "BullionGoldOuncesEntryBox"; premium_entry_name_ch = "BullionGoldPremiumEntryBox"; + cost_entry_name_ch = "BullionGoldCostEntryBox"; B = M->Gold; break; case SILVER: ounce_entry_name_ch = "BullionSilverOuncesEntryBox"; premium_entry_name_ch = "BullionSilverPremiumEntryBox"; + cost_entry_name_ch = "BullionSilverCostEntryBox"; B = M->Silver; break; case PLATINUM: ounce_entry_name_ch = "BullionPlatinumOuncesEntryBox"; premium_entry_name_ch = "BullionPlatinumPremiumEntryBox"; + cost_entry_name_ch = "BullionPlatinumCostEntryBox"; B = M->Platinum; break; case PALLADIUM: ounce_entry_name_ch = "BullionPalladiumOuncesEntryBox"; premium_entry_name_ch = "BullionPalladiumPremiumEntryBox"; + cost_entry_name_ch = "BullionPalladiumCostEntryBox"; B = M->Palladium; break; } return process_bullion_entry_boxes(ounce_entry_name_ch, premium_entry_name_ch, - B); + cost_entry_name_ch, B); } gboolean BullionOk(portfolio_packet *pkg) { @@ -344,36 +362,54 @@ gint BullionCursorMove() { const gchar *Gold_Ounces = GetEntryText("BullionGoldOuncesEntryBox"); const gchar *Gold_Premium = GetEntryText("BullionGoldPremiumEntryBox"); + const gchar *Gold_Cost = GetEntryText("BullionGoldCostEntryBox"); const gchar *Silver_Ounces = GetEntryText("BullionSilverOuncesEntryBox"); const gchar *Silver_Premium = GetEntryText("BullionSilverPremiumEntryBox"); + const gchar *Silver_Cost = GetEntryText("BullionSilverCostEntryBox"); const gchar *Platinum_Ounces = GetEntryText("BullionPlatinumOuncesEntryBox"); const gchar *Platinum_Premium = GetEntryText("BullionPlatinumPremiumEntryBox"); + const gchar *Platinum_Cost = GetEntryText("BullionPlatinumCostEntryBox"); const gchar *Palladium_Ounces = GetEntryText("BullionPalladiumOuncesEntryBox"); const gchar *Palladium_Premium = GetEntryText("BullionPalladiumPremiumEntryBox"); + const gchar *Palladium_Cost = GetEntryText("BullionPalladiumCostEntryBox"); gboolean valid_num = CheckIfStringDoublePositiveNumber(Gold_Ounces) & - CheckIfStringDoublePositiveNumber(Gold_Premium); + CheckIfStringDoublePositiveNumber(Gold_Premium) & + CheckIfStringDoublePositiveNumber(Gold_Cost); + valid_num = valid_num & CheckIfStringDoublePositiveNumber(Silver_Ounces) & - CheckIfStringDoublePositiveNumber(Silver_Premium); + CheckIfStringDoublePositiveNumber(Silver_Premium) & + CheckIfStringDoublePositiveNumber(Silver_Cost); + valid_num = valid_num & CheckIfStringDoublePositiveNumber(Platinum_Ounces) & - CheckIfStringDoublePositiveNumber(Platinum_Premium); + CheckIfStringDoublePositiveNumber(Platinum_Premium) & + CheckIfStringDoublePositiveNumber(Platinum_Cost); + valid_num = valid_num & CheckIfStringDoublePositiveNumber(Palladium_Ounces) & - CheckIfStringDoublePositiveNumber(Palladium_Premium); + CheckIfStringDoublePositiveNumber(Palladium_Premium) & + CheckIfStringDoublePositiveNumber(Palladium_Cost); + + gboolean valid_string = CheckValidString(Gold_Ounces) & + CheckValidString(Gold_Premium) & + CheckValidString(Gold_Cost); - gboolean valid_string = - CheckValidString(Gold_Ounces) & CheckValidString(Gold_Premium); valid_string = valid_string & CheckValidString(Silver_Ounces) & - CheckValidString(Silver_Premium); + CheckValidString(Silver_Premium) & + CheckValidString(Silver_Cost); + valid_string = valid_string & CheckValidString(Platinum_Ounces) & - CheckValidString(Platinum_Premium); + CheckValidString(Platinum_Premium) & + CheckValidString(Platinum_Cost); + valid_string = valid_string & CheckValidString(Palladium_Ounces) & - CheckValidString(Palladium_Premium); + CheckValidString(Palladium_Premium) & + CheckValidString(Palladium_Cost); if (valid_num && valid_string) gtk_widget_set_sensitive(Button, TRUE); @@ -459,6 +495,9 @@ void AboutSetLabel() { "href=\"https://media.flaticon.com/license/license.pdf\">Flaticon"; label = GetWidget("AboutTrendsIconLabel"); gtk_label_set_markup(GTK_LABEL(label), text); + + label = GetWidget("AboutVersionLabel"); + gtk_label_set_label(GTK_LABEL(label), VERSION_STRING); } gint HotkeysShowHide() { diff --git a/src/gui/gui_security.c b/src/gui/gui_security.c index 7c72ebe..7fda565 100644 --- a/src/gui/gui_security.c +++ b/src/gui/gui_security.c @@ -47,9 +47,11 @@ gint SecurityCursorMove() { GtkWidget *Button = GetWidget("SecurityOkBTN"); const gchar *symbol = GetEntryText("SecuritySymbolEntryBox"); const gchar *shares = GetEntryText("SecuritySharesEntryBox"); + const gchar *cost = GetEntryText("SecurityCostEntryBox"); if (CheckValidString(symbol) && CheckValidString(shares) && - CheckIfStringLongPositiveNumber(shares)) + CheckValidString(cost) && CheckIfStringLongPositiveNumber(shares) && + CheckIfStringDoublePositiveNumber(cost)) gtk_widget_set_sensitive(Button, TRUE); else gtk_widget_set_sensitive(Button, FALSE); @@ -138,14 +140,14 @@ static gpointer fetch_data_for_new_stock(gpointer data) { } static void add_equity_to_folder(gchar *symbol, const gchar *shares, - portfolio_packet *pkg) { + const gchar *cost, portfolio_packet *pkg) { equity_folder *F = pkg->GetEquityFolderClass(); /* Remove the stock if it already exists. */ F->RemoveStock(symbol); /* Add a new stock object to the end of the folder's Equity array. */ - F->AddStock(symbol, shares); + F->AddStock(symbol, shares, cost); /* Generate the Equity Request URLs. */ F->GenerateURL(pkg); @@ -156,6 +158,7 @@ static void add_equity_to_folder(gchar *symbol, const gchar *shares, if (pkg->IsDefaultView()) { /* Sort the equity folder. */ F->Sort(); + pkg->ToStrings(); gdk_threads_add_idle(MainDefaultTreeview, pkg); } else { /* Fetch the data for the new stock */ @@ -178,10 +181,10 @@ static gpointer add_security_ok_thd(gpointer data) { /* Convert to uppercase letters, must free return value. */ gchar *symbol = g_ascii_strup(tmp, -1); const gchar *shares = GetEntryText("SecuritySharesEntryBox"); + const gchar *cost = GetEntryText("SecurityCostEntryBox"); - SqliteEquityAdd(symbol, shares, D); - add_equity_to_folder(symbol, shares, package); - + SqliteEquityAdd(symbol, shares, cost, D); + add_equity_to_folder(symbol, shares, cost, package); g_free(symbol); g_mutex_unlock(&mutexes[FETCH_DATA_MUTEX]); @@ -274,6 +277,9 @@ gint SecurityShowHide(portfolio_packet *pkg) { EntryBox = GetWidget("SecuritySharesEntryBox"); gtk_entry_set_text(GTK_ENTRY(EntryBox), ""); + + EntryBox = GetWidget("SecurityCostEntryBox"); + gtk_entry_set_text(GTK_ENTRY(EntryBox), ""); g_object_set(G_OBJECT(EntryBox), "activates-default", TRUE, NULL); /* Reset ComboBox */ diff --git a/src/include/class_types.h b/src/include/class_types.h index 47c436e..c51393b 100644 --- a/src/include/class_types.h +++ b/src/include/class_types.h @@ -68,22 +68,17 @@ typedef struct { typedef struct { gchar *bullion; gchar *metal; - gchar *ounces; gchar *premium; - gchar *high; - gchar *low; + gchar *cost; + gchar *range; gchar *prev_closing; gchar *chg; - gchar *gain_sym; + gchar *day_gain; gchar *total; - gchar *gain_per; - gchar *gold; - gchar *silver; - gchar *platinum; - gchar *palladium; + gchar *total_cost; + gchar *total_gain; gchar *equity; gchar *symbol; - gchar *shares; gchar *price; gchar *opening; gchar *asset; @@ -91,23 +86,7 @@ typedef struct { gchar *cash; gchar *portfolio; gchar *no_assets; -} primary_heading; - -typedef struct { - gchar *bullion; - gchar *metal; - gchar *ounces; - gchar *premium; - gchar *gold; - gchar *silver; - gchar *platinum; - gchar *palladium; - gchar *equity; - gchar *symbol; - gchar *shares; - gchar *cash; - gchar *no_assets; -} default_heading; +} heading_str_t; /* class type definitions */ struct bullion { @@ -124,19 +103,25 @@ struct bullion { gdouble change_value_f; gdouble change_percent_f; gdouble change_percent_raw_f; /* The gain not including premium values. */ + gdouble cost_basis_f; /* Cost per ounce. */ + gdouble total_cost_f; /* Total cost of this investment. */ + gdouble total_gain_value_f; /* Total gain of this investment as a value [since + purchase]. */ + gdouble + total_gain_percent_f; /* Total gain of this investment as a percent. */ /* Pango Markup language strings */ + gchar *metal_mrkd_ch; gchar *spot_price_mrkd_ch; gchar *premium_mrkd_ch; gchar *port_value_mrkd_ch; - gchar *ounce_mrkd_ch; - gchar *high_metal_mrkd_ch; - gchar *low_metal_mrkd_ch; + gchar *cost_mrkd_ch; + gchar *range_mrkd_ch; gchar *prev_closing_metal_mrkd_ch; gchar *change_ounce_mrkd_ch; - gchar *change_value_mrkd_ch; - gchar *change_percent_mrkd_ch; + gchar *total_cost_mrkd_ch; + gchar *total_gain_mrkd_ch; /* Unmarked strings */ gchar *change_percent_raw_ch; @@ -155,16 +140,21 @@ struct metal { /* Data Variables */ gdouble bullion_port_value_f; - gdouble bullion_port_value_chg_f; - gdouble bullion_port_value_p_chg_f; + gdouble bullion_port_day_gain_val_f; + gdouble bullion_port_day_gain_per_f; gdouble gold_silver_ratio_f; + gdouble bullion_port_cost_f; + gdouble bullion_port_total_gain_value_f; + gdouble bullion_port_total_gain_percent_f; + /* Pango Markup language strings */ - gchar *bullion_port_value_mrkd_ch; /* Total value of bullion holdings */ - gchar *bullion_port_value_chg_mrkd_ch; /* Total value of bullion holdings - change */ - gchar *bullion_port_value_p_chg_mrkd_ch; /* Total value of bullion holdings - percent change */ + gchar *bullion_port_value_mrkd_ch; /* Total value of bullion holdings */ + gchar *bullion_port_day_gain_mrkd_ch; /* Total value of bullion holdings + change */ + + gchar *bullion_port_cost_mrkd_ch; /* Total cost of bullion holdings */ + gchar *bullion_port_total_gain_mrkd_ch; /* Total gain of bullion holdings */ /* Unmarked strings */ gchar *gold_silver_ratio_ch; @@ -178,7 +168,7 @@ struct metal { struct stock { /* Data Variables */ - guint num_shares_stock_int; /* Cannot hold more than 4294967295 shares + guint quantity_int; /* Cannot hold more than 4294967295 shares of stock on most 64-bit machines */ gdouble current_price_stock_f; @@ -189,6 +179,11 @@ struct stock { gdouble change_share_f; gdouble change_value_f; gdouble change_percent_f; + gdouble cost_basis_f; /* Cost per share. */ + gdouble total_cost_f; /* Total cost of this investment. */ + gdouble total_gain_value_f; /* Total gain of this investment as a value. */ + gdouble + total_gain_percent_f; /* Total gain of this investment as a percent. */ gdouble current_investment_stock_f; /* The total current investment in the stock. */ @@ -196,16 +191,15 @@ struct stock { /* Pango Markup language strings */ gchar *security_name_mrkd_ch; gchar *current_price_stock_mrkd_ch; - gchar *high_stock_mrkd_ch; - gchar *low_stock_mrkd_ch; + gchar *cost_mrkd_ch; + gchar *range_mrkd_ch; gchar *opening_stock_mrkd_ch; gchar *prev_closing_stock_mrkd_ch; gchar *change_share_stock_mrkd_ch; - gchar *change_value_mrkd_ch; - gchar *change_percent_mrkd_ch; gchar *current_investment_stock_mrkd_ch; gchar *symbol_stock_mrkd_ch; - gchar *num_shares_stock_mrkd_ch; + gchar *total_cost_mrkd_ch; + gchar *total_gain_mrkd_ch; /* Unmarked strings */ gchar *symbol_stock_ch; /* The stock symbol in all caps, it's used to create @@ -223,18 +217,21 @@ struct equity_folder { /* Data Variables */ gdouble stock_port_value_f; - gdouble stock_port_value_chg_f; - gdouble stock_port_value_p_chg_f; + gdouble stock_port_day_gain_val_f; + gdouble stock_port_day_gain_per_f; + gdouble stock_port_cost_f; + gdouble stock_port_total_gain_value_f; + gdouble stock_port_total_gain_percent_f; /* Can have up to 255 stocks [0-254]: 8 bits. */ guint8 size; /* Pango Markup language strings */ - gchar *stock_port_value_mrkd_ch; /* Total value of equity holdings */ - gchar - *stock_port_value_chg_mrkd_ch; /* Total value of equity holdings change */ - gchar *stock_port_value_p_chg_mrkd_ch; /* Total value of equity holdings - percent change */ + gchar *stock_port_value_mrkd_ch; /* Total value of equity holdings */ + gchar *stock_port_day_gain_mrkd_ch; /* Total value of equity holdings day + change */ + gchar *stock_port_cost_mrkd_ch; /* Total cost of equity holdings */ + gchar *stock_port_total_gain_mrkd_ch; /* Total gain of equity holdings */ /* Method/Function pointers */ void (*ToStrings)(guint8 digits_right); @@ -242,7 +239,7 @@ struct equity_folder { void (*GenerateURL)(portfolio_packet *pkg); gint (*SetUpCurl)(portfolio_packet *pkg); void (*ExtractData)(); - void (*AddStock)(const gchar *symbol, const gchar *shares); + void (*AddStock)(const gchar *symbol, const gchar *shares, const gchar *cost); void (*Sort)(); void (*Reset)(); void (*RemoveStock)(const gchar *s); @@ -259,11 +256,16 @@ struct meta { gdouble cash_f; /* Total value of cash */ - gdouble portfolio_port_value_f; /* Total value of the entire portfolio */ - gdouble portfolio_port_value_chg_f; /* Total value of the entire - portfolio change */ - gdouble portfolio_port_value_p_chg_f; /* Total value of the entire - portfolio percent change */ + gdouble portfolio_value_f; /* Total value of the entire portfolio */ + gdouble portfolio_day_gain_value_f; /* Total daily gain of the entire + portfolio as a value */ + gdouble portfolio_day_gain_percent_f; /* Total daily gain of the entire + portfolio as a percent change*/ + gdouble portfolio_cost_f; /* Total cost of portfolio. */ + gdouble portfolio_total_gain_value_f; /* Total gain of portfolio as a + value. */ + gdouble portfolio_total_gain_percent_f; /* Total gain of portfolio as a + percent. */ gdouble index_dow_value_f; gdouble index_dow_value_chg_f; @@ -287,13 +289,14 @@ struct meta { guint8 decimal_places_guint8; /* Pango Markup language strings */ - primary_heading pri_h_mkd; - default_heading def_h_mkd; + heading_str_t headings_mkd; gchar *cash_mrkd_ch; - gchar *portfolio_port_value_mrkd_ch; - gchar *portfolio_port_value_chg_mrkd_ch; - gchar *portfolio_port_value_p_chg_mrkd_ch; + gchar *portfolio_value_mrkd_ch; + gchar *portfolio_day_gain_mrkd_ch; + + gchar *portfolio_cost_mrkd_ch; /* Total cost of portfolio holdings */ + gchar *portfolio_total_gain_mrkd_ch; /* Total gain of portfolio holdings */ /* Unmarked strings */ gchar *stock_url_ch; /* First component of the stock request URL */ @@ -406,8 +409,7 @@ struct portfolio_packet { void (*SetMainCurlCanceled)(gboolean canceled_bool); gdouble (*GetHoursOfUpdates)(); gdouble (*GetUpdatesPerMinute)(); - gpointer (*GetPrimaryHeadings)(); - gpointer (*GetDefaultHeadings)(); + gpointer (*GetHeadings)(); void (*SaveSqlData)(); gpointer (*GetWindowData)(); gpointer (*GetMetaClass)(); diff --git a/src/include/gui_types.h b/src/include/gui_types.h index 48cf581..44253d3 100644 --- a/src/include/gui_types.h +++ b/src/include/gui_types.h @@ -75,7 +75,6 @@ enum { MAIN_COLUMN_EIGHT, MAIN_COLUMN_NINE, MAIN_COLUMN_TEN, - MAIN_COLUMN_ELEVEN, MAIN_N_COLUMNS }; @@ -91,7 +90,6 @@ enum { HISTORY_COLUMN_EIGHT, HISTORY_COLUMN_NINE, HISTORY_COLUMN_TEN, - HISTORY_COLUMN_ELEVEN, HISTORY_N_COLUMNS }; diff --git a/src/include/macros.h b/src/include/macros.h index 031983b..4aa8a69 100644 --- a/src/include/macros.h +++ b/src/include/macros.h @@ -33,6 +33,11 @@ POSSIBILITY OF SUCH DAMAGE. #ifndef MACROS_HEADER_H #define MACROS_HEADER_H +/* The application version */ +#ifndef VERSION_STRING +#define VERSION_STRING "0.3.0" +#endif + /* To suppress unused argument warnings. */ #ifndef UNUSED #define UNUSED(x) (void)x; @@ -68,24 +73,24 @@ POSSIBILITY OF SUCH DAMAGE. /* The Yahoo! URL Macros are used by the GetYahooUrl () * function */ -#ifndef YAHOO_URL_START -#define YAHOO_URL_START "https://query1.finance.yahoo.com/v7/finance/download/" +#ifndef YAHOO_URL_ONE +#define YAHOO_URL_ONE "https://query1.finance.yahoo.com/v7/finance/download/" #endif -#ifndef YAHOO_URL_MIDDLE_ONE -#define YAHOO_URL_MIDDLE_ONE "?period1=" +#ifndef YAHOO_URL_TWO +#define YAHOO_URL_TWO "?period1=" #endif -#ifndef YAHOO_URL_MIDDLE_TWO -#define YAHOO_URL_MIDDLE_TWO "&period2=" +#ifndef YAHOO_URL_THREE +#define YAHOO_URL_THREE "&period2=" #endif -#ifndef YAHOO_URL_END -#define YAHOO_URL_END "&interval=1d&events=history&includeAdjustedClose=TRUE" +#ifndef YAHOO_URL_FOUR +#define YAHOO_URL_FOUR "&interval=1d&events=history&includeAdjustedClose=TRUE" #endif /* The symbol URL macros are used by the ClassInitMeta () [class_meta.c] and - * api_callback () [sqlite.c] functions */ + * app_callback () [sqlite.c] functions */ #ifndef NASDAQ_SYMBOL_URL #define NASDAQ_SYMBOL_URL \ "http://www.nasdaqtrader.com/dynamic/SymDir/nasdaqlisted.txt" diff --git a/src/include/sqlite.h b/src/include/sqlite.h index 5f22a94..8d2e52b 100644 --- a/src/include/sqlite.h +++ b/src/include/sqlite.h @@ -41,7 +41,8 @@ void SqliteProcessing(portfolio_packet *pkg); void SqliteAppAdd(meta *D, ...); void SqliteBullionAdd(meta *D, ...); -void SqliteEquityAdd(const gchar *symbol, const gchar *shares, meta *D); +void SqliteEquityAdd(const gchar *symbol, const gchar *shares, + const gchar *cost, meta *D); void SqliteEquityRemove(const gchar *symbol, meta *D); void SqliteEquityRemoveAll(meta *D); diff --git a/src/include/workfuncs.h b/src/include/workfuncs.h index 30d3e69..8ff2bbd 100644 --- a/src/include/workfuncs.h +++ b/src/include/workfuncs.h @@ -63,6 +63,15 @@ void DoubleToFormattedStrPango(gchar **dst, const gdouble num, const guint8 digits_right, const guint format_type, const guint color); void StringToStrPango(gchar **dst, const gchar *src, const guint color); +void RangeStrPango(gchar **dest, const double low_f, const double high_f, + const guint8 digits_right); +void ChangeStrPango(gchar **dest, const double value_f, const double percent_f, + const guint8 digits_right); +void TotalStrPango(gchar **dest, const double total_f, const double gain_f, + const guint8 digits_right); +void SymbolStrPango(gchar **dest, const gchar *symbol_ch, + const double quantity_f, const guint8 digits_right, + const guint color); /* sn_map */ void AddSymbolToMap(const gchar *symbol, const gchar *name, diff --git a/src/resources/financials.glade b/src/resources/financials.glade index 29bc665..1363ab6 100644 --- a/src/resources/financials.glade +++ b/src/resources/financials.glade @@ -404,10 +404,9 @@ vertical 7 - + True False - 0.2.2 center @@ -671,7 +670,7 @@ POSSIBILITY OF SUCH DAMAGE. 0 none - + True False @@ -696,6 +695,7 @@ POSSIBILITY OF SUCH DAMAGE. True True + Number of ounces center center 10 @@ -727,11 +727,12 @@ POSSIBILITY OF SUCH DAMAGE. True True + Premium per ounce center center 10 0.5 - $$$ + Premium per ounce alpha @@ -739,6 +740,38 @@ POSSIBILITY OF SUCH DAMAGE. 1 + + + True + False + Cost + center + + + + + + 2 + 0 + + + + + True + True + Cost per ounce + center + center + 10 + 0.5 + Cost per ounce + alpha + + + 2 + 1 + + @@ -763,7 +796,7 @@ POSSIBILITY OF SUCH DAMAGE. 0 none - + True False @@ -803,6 +836,7 @@ POSSIBILITY OF SUCH DAMAGE. True True + Number of ounces center center 10 @@ -819,11 +853,12 @@ POSSIBILITY OF SUCH DAMAGE. True True + Premium per ounce center center 10 0.5 - $$$ + Premium per ounce alpha @@ -831,6 +866,38 @@ POSSIBILITY OF SUCH DAMAGE. 1 + + + True + False + Cost + center + + + + + + 2 + 0 + + + + + True + True + Cost per ounce + center + center + 10 + 0.5 + Cost per ounce + alpha + + + 2 + 1 + + @@ -855,7 +922,7 @@ POSSIBILITY OF SUCH DAMAGE. 0 none - + True False @@ -895,6 +962,7 @@ POSSIBILITY OF SUCH DAMAGE. True True + Number of ounces center center 10 @@ -911,11 +979,12 @@ POSSIBILITY OF SUCH DAMAGE. True True + Premium per ounce center center 10 0.5 - $$$ + Premium per ounce alpha @@ -923,6 +992,38 @@ POSSIBILITY OF SUCH DAMAGE. 1 + + + True + False + Cost + center + + + + + + 2 + 0 + + + + + True + True + Cost per ounce + center + center + 10 + 0.5 + Cost per ounce + alpha + + + 2 + 1 + + @@ -948,7 +1049,7 @@ POSSIBILITY OF SUCH DAMAGE. 0 none - + True False @@ -988,6 +1089,7 @@ POSSIBILITY OF SUCH DAMAGE. True True + Number of ounces center center 10 @@ -1004,11 +1106,12 @@ POSSIBILITY OF SUCH DAMAGE. True True + Premium per ounce center center 10 0.5 - $$$ + Premium per ounce alpha @@ -1016,6 +1119,38 @@ POSSIBILITY OF SUCH DAMAGE. 1 + + + True + False + Cost + center + + + + + + 2 + 0 + + + + + True + True + Cost per ounce + center + center + 10 + 0.5 + Cost per ounce + alpha + + + 2 + 1 + + @@ -3931,7 +4066,7 @@ POSSIBILITY OF SUCH DAMAGE. True False - gtk-add + list-add 1 @@ -3954,7 +4089,7 @@ POSSIBILITY OF SUCH DAMAGE. True False - gtk-help + help-contents 1 @@ -4220,6 +4355,8 @@ POSSIBILITY OF SUCH DAMAGE. Sans 12 en-us + False + 1 @@ -4302,6 +4439,7 @@ POSSIBILITY OF SUCH DAMAGE. False 5 vertical + 5 True @@ -4311,7 +4449,7 @@ POSSIBILITY OF SUCH DAMAGE. slide-left-right True - + True False @@ -4380,6 +4518,37 @@ POSSIBILITY OF SUCH DAMAGE. 3 + + + True + False + Cost + + + + + + 0 + 4 + + + + + True + True + Cost per share + center + center + 10 + 0.5 + Cost per share + digits + + + 0 + 5 + + add diff --git a/src/resources/resources.c b/src/resources/resources.c index c83f087..74337be 100644 --- a/src/resources/resources.c +++ b/src/resources/resources.c @@ -6,7 +6,7 @@ # define SECTION #endif -static const SECTION union { const guint8 data[15982]; const double alignment; void * const ptr;} resources_resource_data = { { +static const SECTION union { const guint8 data[16488]; const double alignment; void * const ptr;} resources_resource_data = { { 0107, 0126, 0141, 0162, 0151, 0141, 0156, 0164, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0030, 0000, 0000, 0000, 0220, 0000, 0000, 0000, 0000, 0000, 0000, 0050, 0004, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0003, 0000, 0000, 0000, 0003, 0000, 0000, 0000, 0003, 0000, 0000, 0000, @@ -15,7 +15,7 @@ static const SECTION union { const guint8 data[15982]; const double alignment; v 0057, 0020, 0000, 0000, 0017, 0000, 0166, 0000, 0100, 0020, 0000, 0000, 0052, 0030, 0000, 0000, 0324, 0265, 0002, 0000, 0377, 0377, 0377, 0377, 0052, 0030, 0000, 0000, 0001, 0000, 0114, 0000, 0054, 0030, 0000, 0000, 0070, 0030, 0000, 0000, 0267, 0013, 0072, 0345, 0002, 0000, 0000, 0000, - 0070, 0030, 0000, 0000, 0020, 0000, 0166, 0000, 0110, 0030, 0000, 0000, 0155, 0076, 0000, 0000, + 0070, 0030, 0000, 0000, 0020, 0000, 0166, 0000, 0110, 0030, 0000, 0000, 0147, 0100, 0000, 0000, 0123, 0164, 0157, 0143, 0153, 0163, 0055, 0151, 0143, 0157, 0156, 0055, 0061, 0062, 0070, 0056, 0160, 0156, 0147, 0000, 0000, 0000, 0000, 0000, 0167, 0017, 0000, 0000, 0000, 0000, 0000, 0000, 0211, 0120, 0116, 0107, 0015, 0012, 0032, 0012, 0000, 0000, 0000, 0015, 0111, 0110, 0104, 0122, @@ -395,617 +395,649 @@ static const SECTION union { const guint8 data[15982]; const double alignment; v 0202, 0122, 0203, 0266, 0020, 0074, 0000, 0000, 0000, 0000, 0111, 0105, 0116, 0104, 0256, 0102, 0140, 0202, 0000, 0000, 0050, 0165, 0165, 0141, 0171, 0051, 0057, 0000, 0000, 0000, 0000, 0000, 0001, 0000, 0000, 0000, 0003, 0000, 0000, 0000, 0146, 0151, 0156, 0141, 0156, 0143, 0151, 0141, - 0154, 0163, 0056, 0147, 0154, 0141, 0144, 0145, 0122, 0107, 0003, 0000, 0001, 0000, 0000, 0000, - 0170, 0332, 0355, 0135, 0353, 0162, 0343, 0066, 0226, 0376, 0357, 0247, 0300, 0250, 0246, 0262, - 0223, 0232, 0246, 0055, 0311, 0355, 0164, 0146, 0222, 0366, 0224, 0154, 0313, 0155, 0155, 0273, - 0055, 0217, 0045, 0047, 0351, 0371, 0323, 0103, 0221, 0260, 0205, 0061, 0111, 0060, 0044, 0150, - 0133, 0251, 0175, 0241, 0175, 0215, 0175, 0262, 0005, 0110, 0311, 0226, 0054, 0136, 0000, 0136, - 0044, 0112, 0072, 0133, 0265, 0231, 0266, 0110, 0200, 0270, 0234, 0357, 0334, 0161, 0360, 0363, - 0077, 0236, 0155, 0013, 0075, 0142, 0317, 0047, 0324, 0371, 0330, 0150, 0355, 0067, 0033, 0010, - 0073, 0006, 0065, 0211, 0163, 0377, 0261, 0161, 0073, 0074, 0327, 0176, 0154, 0374, 0343, 0170, - 0357, 0347, 0077, 0151, 0032, 0372, 0204, 0035, 0354, 0351, 0014, 0233, 0350, 0211, 0260, 0061, - 0272, 0267, 0164, 0023, 0243, 0303, 0375, 0367, 0315, 0375, 0046, 0322, 0064, 0376, 0022, 0161, - 0030, 0366, 0356, 0164, 0003, 0037, 0357, 0041, 0364, 0263, 0207, 0177, 0017, 0210, 0207, 0175, - 0144, 0221, 0321, 0307, 0306, 0075, 0173, 0370, 0153, 0343, 0365, 0103, 0207, 0373, 0355, 0367, - 0215, 0203, 0360, 0075, 0072, 0372, 0017, 0066, 0030, 0062, 0054, 0335, 0367, 0077, 0066, 0076, - 0261, 0207, 0057, 0330, 0011, 0032, 0210, 0230, 0037, 0033, 0235, 0353, 0136, 0370, 0207, 0170, - 0217, 0277, 0351, 0172, 0324, 0305, 0036, 0233, 0040, 0107, 0267, 0361, 0307, 0306, 0043, 0361, - 0311, 0310, 0302, 0215, 0343, 0241, 0027, 0340, 0237, 0017, 0146, 0117, 0343, 0137, 0066, 0164, - 0107, 0273, 0243, 0106, 0340, 0067, 0216, 0317, 0165, 0313, 0137, 0176, 0337, 0030, 0023, 0313, - 0214, 0376, 0235, 0064, 0250, 0036, 0303, 0366, 0302, 0300, 0116, 0055, 0352, 0343, 0306, 0254, - 0221, 0342, 0010, 0363, 0214, 0062, 0256, 0215, 0245, 0217, 0260, 0325, 0100, 0314, 0323, 0035, - 0337, 0322, 0231, 0316, 0077, 0370, 0261, 0061, 0301, 0274, 0213, 0157, 0341, 0370, 0144, 0372, - 0010, 0174, 0254, 0005, 0216, 0211, 0075, 0213, 0070, 0151, 0303, 0325, 0015, 0003, 0133, 0202, - 0010, 0250, 0207, 0036, 0360, 0204, 0017, 0270, 0201, 0174, 0162, 0357, 0350, 0326, 0307, 0206, - 0156, 0060, 0362, 0310, 0311, 0243, 0201, 0154, 0116, 0076, 0167, 0204, 0157, 0065, 0137, 0271, - 0263, 0317, 0337, 0116, 0373, 0127, 0303, 0233, 0376, 0345, 0267, 0057, 0235, 0301, 0347, 0150, - 0317, 0303, 0276, 0016, 0242, 0065, 0236, 0056, 0377, 0301, 0313, 0372, 0317, 0077, 0130, 0336, - 0207, 0137, 0211, 0143, 0322, 0247, 0351, 0056, 0270, 0144, 0372, 0147, 0316, 0075, 0217, 0171, - 0337, 0304, 0167, 0172, 0140, 0061, 0071, 0242, 0342, 0324, 0115, 0376, 0320, 0303, 0035, 0226, - 0372, 0300, 0264, 0163, 0355, 0211, 0230, 0154, 0334, 0070, 0076, 0072, 0152, 0312, 0266, 0030, - 0143, 0162, 0077, 0346, 0243, 0152, 0313, 0064, 0361, 0231, 0107, 0047, 0232, 0000, 0251, 0346, - 0352, 0036, 0166, 0044, 0147, 0103, 0014, 0352, 0064, 0216, 0007, 0214, 0032, 0017, 0276, 0046, - 0376, 0330, 0167, 0235, 0373, 0254, 0106, 0376, 0003, 0161, 0371, 0127, 0356, 0261, 0247, 0215, - 0111, 0342, 0227, 0062, 0300, 0165, 0102, 0237, 0327, 0215, 0042, 0133, 0367, 0356, 0211, 0243, - 0061, 0352, 0362, 0105, 0156, 0052, 0264, 0030, 0121, 0306, 0250, 0335, 0070, 0156, 0111, 0065, - 0242, 0036, 0341, 0373, 0241, 0063, 0042, 0226, 0232, 0163, 0103, 0106, 0014, 0335, 0222, 0151, - 0350, 0273, 0272, 0301, 0171, 0262, 0354, 0340, 0106, 0272, 0217, 0005, 0226, 0065, 0227, 0372, - 0044, 0372, 0032, 0237, 0132, 0154, 0313, 0205, 0275, 0211, 0337, 0237, 0053, 0312, 0360, 0210, - 0322, 0207, 0027, 0346, 0367, 0362, 0303, 0174, 0273, 0034, 0073, 0227, 0261, 0173, 0052, 0315, - 0374, 0061, 0175, 0342, 0233, 0341, 0161, 0046, 0226, 0262, 0355, 0361, 0063, 0226, 0241, 0312, - 0102, 0163, 0314, 0113, 0245, 0031, 0264, 0347, 0063, 0335, 0143, 0111, 0244, 0227, 0321, 0026, - 0073, 0146, 0316, 0226, 0041, 0106, 0216, 0162, 0064, 0234, 0101, 0105, 0251, 0255, 0064, 0142, - 0062, 0221, 0223, 0061, 0331, 0220, 0052, 0020, 0233, 0270, 0142, 0157, 0260, 0120, 0145, 0142, - 0166, 0077, 0216, 0116, 0272, 0016, 0363, 0046, 0057, 0022, 0351, 0326, 0263, 0076, 0343, 0111, - 0370, 0133, 0074, 0001, 0025, 0042, 0242, 0002, 0200, 0111, 0152, 0316, 0050, 0265, 0030, 0147, - 0342, 0014, 0077, 0263, 0130, 0065, 0242, 0343, 0272, 0234, 0130, 0120, 0343, 0073, 0335, 0166, - 0177, 0142, 0364, 0001, 0163, 0375, 0015, 0215, 0360, 0035, 0365, 0060, 0232, 0320, 0300, 0103, - 0167, 0304, 0161, 0306, 0301, 0150, 0237, 0120, 0241, 0024, 0354, 0357, 0355, 0315, 0277, 0372, - 0235, 0305, 0176, 0372, 0332, 0277, 0275, 0101, 0235, 0323, 0323, 0376, 0355, 0325, 0020, 0175, - 0356, 0176, 0375, 0356, 0236, 0375, 0324, 0120, 0035, 0347, 0243, 0156, 0161, 0115, 0243, 0161, - 0034, 0355, 0215, 0152, 0353, 0105, 0304, 0034, 0345, 0154, 0036, 0202, 0046, 0157, 0143, 0051, - 0362, 0217, 0153, 0377, 0074, 0235, 0171, 0163, 0137, 0271, 0251, 0153, 0161, 0165, 0174, 0114, - 0055, 0316, 0025, 0223, 0067, 0130, 0142, 0267, 0124, 0277, 0113, 0034, 0067, 0140, 0232, 0033, - 0170, 0156, 0250, 0041, 0353, 0226, 0073, 0326, 0323, 0373, 0130, 0324, 0007, 0337, 0366, 0256, - 0033, 0017, 0034, 0303, 0162, 0337, 0306, 0317, 0256, 0056, 0366, 0051, 0223, 0253, 0306, 0065, - 0276, 0043, 0226, 0225, 0017, 0107, 0257, 0222, 0366, 0175, 0326, 0114, 0023, 0247, 0063, 0247, - 0006, 0307, 0161, 0047, 0071, 0176, 0164, 0031, 0032, 0004, 0253, 0145, 0074, 0271, 0326, 0072, - 0331, 0162, 0071, 0177, 0345, 0050, 0302, 0214, 0344, 0032, 0055, 0012, 0074, 0113, 0265, 0377, - 0377, 0004, 0076, 0043, 0167, 0023, 0151, 0226, 0241, 0063, 0346, 0221, 0121, 0300, 0260, 0037, - 0377, 0302, 0374, 0053, 0063, 0162, 0241, 0016, 0343, 0066, 0203, 0317, 0355, 0040, 0316, 0237, - 0002, 0376, 0113, 0377, 0171, 0162, 0217, 0035, 0155, 0300, 0347, 0204, 0132, 0315, 0127, 0173, - 0347, 0355, 0106, 0247, 0177, 0154, 0213, 0320, 0320, 0134, 0057, 0032, 0026, 0245, 0163, 0367, - 0367, 0200, 0260, 0011, 0227, 0321, 0333, 0044, 0240, 0207, 0143, 0074, 0057, 0203, 0161, 0070, - 0307, 0171, 0340, 0274, 0103, 0016, 0145, 0210, 0070, 0206, 0025, 0010, 0307, 0016, 0322, 0221, - 0077, 0261, 0107, 0324, 0102, 0221, 0031, 0037, 0221, 0256, 0220, 0333, 0143, 0306, 0134, 0377, - 0357, 0007, 0007, 0257, 0275, 0035, 0350, 0056, 0071, 0170, 0154, 0035, 0374, 0036, 0160, 0225, - 0377, 0037, 0121, 0263, 0217, 0040, 0273, 0153, 0043, 0273, 0045, 0167, 0014, 0344, 0267, 0002, - 0307, 0152, 0255, 0227, 0143, 0015, 0260, 0253, 0207, 0056, 0266, 0372, 0311, 0360, 0055, 0332, - 0344, 0066, 0050, 0151, 0345, 0051, 0151, 0134, 0210, 0200, 0162, 0266, 0211, 0050, 0070, 0054, - 0033, 0005, 0361, 0153, 0023, 0373, 0362, 0202, 0307, 0205, 0023, 0126, 0043, 0333, 0045, 0227, - 0204, 0232, 0052, 0234, 0162, 0252, 0115, 0223, 0201, 0022, 0051, 0235, 0250, 0163, 0335, 0113, - 0355, 0057, 0203, 0350, 0312, 0240, 0356, 0064, 0312, 0116, 0242, 0352, 0144, 0212, 0136, 0122, - 0124, 0365, 0221, 0026, 0021, 0145, 0006, 0075, 0047, 0220, 0125, 0012, 0225, 0200, 0267, 0026, - 0274, 0265, 0125, 0170, 0153, 0257, 0276, 0016, 0272, 0203, 0120, 0105, 0366, 0267, 0320, 0050, - 0024, 0263, 0103, 0134, 0300, 0040, 0312, 0306, 0330, 0103, 0026, 0361, 0105, 0364, 0076, 0062, - 0011, 0174, 0141, 0030, 0116, 0115, 0076, 0156, 0077, 0074, 0075, 0075, 0355, 0073, 0272, 0157, - 0352, 0277, 0363, 0276, 0270, 0305, 0261, 0157, 0120, 0373, 0300, 0234, 0360, 0217, 0021, 0343, - 0200, 0257, 0320, 0031, 0361, 0016, 0302, 0136, 0242, 0116, 0366, 0031, 0377, 0054, 0130, 0201, - 0165, 0262, 0002, 0363, 0155, 0042, 0030, 0206, 0340, 0330, 0135, 0241, 0315, 0160, 0025, 0122, - 0347, 0074, 0013, 0002, 0273, 0001, 0234, 0272, 0005, 0235, 0272, 0021, 0121, 0155, 0261, 0030, - 0237, 0007, 0215, 0272, 0330, 0216, 0236, 0203, 0334, 0336, 0154, 0271, 0375, 0166, 0027, 0101, - 0160, 0203, 0107, 0027, 0074, 0272, 0340, 0321, 0055, 0125, 0073, 0313, 0262, 0027, 0101, 0131, - 0003, 0047, 0157, 0051, 0256, 0102, 0051, 0326, 0254, 0356, 0046, 0334, 0001, 0147, 0162, 0244, - 0346, 0042, 0256, 0346, 0372, 0333, 0355, 0115, 0226, 0224, 0336, 0053, 0160, 0102, 0307, 0315, - 0045, 0176, 0036, 0271, 0240, 0257, 0016, 0171, 0145, 0273, 0054, 0146, 0256, 0113, 0363, 0224, - 0111, 0004, 0077, 0011, 0270, 0042, 0355, 0274, 0030, 0136, 0375, 0317, 0047, 0303, 0253, 0032, - 0345, 0200, 0147, 0036, 0340, 0110, 0152, 0070, 0326, 0375, 0174, 0015, 0075, 0154, 0140, 0362, - 0210, 0163, 0266, 0316, 0264, 0376, 0116, 0251, 0155, 0023, 0206, 0116, 0307, 0272, 0163, 0217, - 0175, 0371, 0331, 0310, 0330, 0153, 0371, 0254, 0074, 0331, 0160, 0314, 0052, 0231, 0253, 0162, - 0100, 0046, 0231, 0273, 0366, 0077, 0257, 0220, 0251, 0266, 0312, 0141, 0252, 0361, 0362, 0160, - 0351, 0250, 0026, 0175, 0075, 0252, 0145, 0130, 0304, 0170, 0300, 0246, 0344, 0111, 0255, 0015, - 0143, 0201, 0255, 0274, 0054, 0060, 0361, 0104, 0332, 0133, 0355, 0202, 0060, 0013, 0217, 0364, - 0127, 0143, 0156, 0231, 0372, 0057, 0260, 0060, 0343, 0117, 0164, 0157, 0335, 0307, 0232, 0302, - 0123, 0061, 0206, 0070, 0006, 0250, 0215, 0042, 0336, 0235, 0374, 0271, 0245, 0071, 0066, 0322, - 0205, 0101, 0034, 0304, 0313, 0346, 0376, 0112, 0124, 0223, 0014, 0353, 0224, 0320, 0173, 0012, - 0246, 0013, 0053, 0111, 0111, 0130, 0136, 0106, 0123, 0056, 0151, 0054, 0216, 0240, 0116, 0045, - 0162, 0175, 0144, 0160, 0330, 0104, 0243, 0216, 0026, 0062, 0031, 0305, 0035, 0054, 0046, 0116, - 0075, 0154, 0021, 0174, 0327, 0070, 0166, 0250, 0243, 0300, 0067, 0334, 0300, 0015, 0011, 0104, - 0254, 0246, 0154, 0053, 0161, 0136, 0226, 0267, 0244, 0217, 0171, 0017, 0233, 0315, 0171, 0007, - 0017, 0162, 0161, 0363, 0273, 0162, 0271, 0271, 0054, 0053, 0114, 0077, 0234, 0073, 0167, 0162, - 0173, 0104, 0003, 0126, 0323, 0263, 0333, 0263, 0241, 0301, 0351, 0355, 0365, 0236, 0336, 0026, - 0373, 0120, 0352, 0371, 0155, 0325, 0343, 0330, 0073, 0175, 0340, 0071, 0333, 0110, 0120, 0067, - 0020, 0312, 0077, 0355, 0174, 0224, 0367, 0310, 0162, 0317, 0346, 0133, 0124, 0047, 0345, 0244, - 0122, 0243, 0354, 0255, 0120, 0043, 0317, 0243, 0340, 0156, 0201, 0264, 0265, 0126, 0373, 0307, - 0070, 0362, 0006, 0017, 0307, 0306, 0052, 0265, 0347, 0304, 0321, 0035, 0203, 0350, 0226, 0264, - 0143, 0100, 0322, 0035, 0277, 0204, 0106, 0056, 0065, 0014, 0246, 0147, 0117, 0271, 0064, 0125, - 0372, 0204, 0153, 0106, 0250, 0325, 0136, 0266, 0217, 0227, 0372, 0171, 0212, 0012, 0143, 0314, - 0072, 0031, 0143, 0375, 0161, 0222, 0137, 0015, 0337, 0076, 0243, 0126, 0216, 0352, 0007, 0214, - 0167, 0063, 0047, 0226, 0243, 0277, 0153, 0204, 0202, 0220, 0374, 0303, 0265, 0320, 0314, 0300, - 0233, 0112, 0224, 0243, 0146, 0063, 0107, 0173, 0141, 0340, 0066, 0216, 0175, 0213, 0230, 0134, - 0153, 0162, 0065, 0256, 0176, 0070, 0262, 0275, 0204, 0005, 0216, 0134, 0312, 0141, 0210, 0065, - 0256, 0152, 0144, 0315, 0175, 0363, 0063, 0227, 0313, 0113, 0347, 0375, 0220, 0235, 0315, 0273, - 0063, 0141, 0326, 0346, 0176, 0173, 0277, 0275, 0171, 0241, 0324, 0026, 0204, 0122, 0327, 0235, - 0367, 0266, 0005, 0304, 0337, 0341, 0046, 0247, 0355, 0132, 0341, 0211, 0345, 0110, 0175, 0101, - 0304, 0361, 0231, 0027, 0330, 0234, 0256, 0367, 0001, 0025, 0220, 0136, 0225, 0023, 0025, 0163, - 0116, 0005, 0074, 0342, 0043, 0303, 0133, 0000, 0226, 0351, 0114, 0000, 0025, 0220, 0217, 0266, - 0213, 0262, 0342, 0224, 0272, 0023, 0117, 0330, 0167, 0350, 0377, 0376, 0027, 0265, 0233, 0355, - 0266, 0246, 0361, 0377, 0036, 0162, 0363, 0320, 0147, 0324, 0071, 0031, 0234, 0125, 0015, 0214, - 0234, 0206, 0160, 0271, 0300, 0012, 0021, 0365, 0143, 0022, 0240, 0142, 0272, 0360, 0331, 0204, - 0217, 0160, 0326, 0334, 0241, 0236, 0255, 0133, 0012, 0315, 0337, 0230, 0324, 0076, 0266, 0211, - 0025, 0376, 0042, 0337, 0305, 0243, 0356, 0021, 0335, 0141, 0222, 0143, 0200, 0124, 0274, 0165, - 0111, 0312, 0241, 0207, 0035, 0323, 0357, 0031, 0324, 0331, 0002, 0156, 0021, 0115, 0006, 0011, - 0157, 0047, 0342, 0000, 0042, 0367, 0016, 0066, 0321, 0150, 0202, 0316, 0075, 0214, 0135, 0362, - 0200, 0356, 0074, 0152, 0243, 0163, 0336, 0106, 0274, 0001, 0234, 0003, 0070, 0007, 0234, 0075, - 0334, 0051, 0155, 0142, 0070, 0046, 0076, 0342, 0157, 0337, 0173, 0272, 0215, 0014, 0152, 0143, - 0077, 0052, 0144, 0256, 0217, 0174, 0152, 0161, 0012, 0262, 0170, 0027, 0024, 0075, 0351, 0036, - 0157, 0312, 0046, 0373, 0300, 0041, 0200, 0103, 0154, 0024, 0207, 0070, 0252, 0137, 0232, 0277, - 0370, 0157, 0343, 0130, 0104, 0313, 0225, 0112, 0127, 0104, 0331, 0147, 0261, 0336, 0043, 0241, - 0265, 0254, 0266, 0260, 0310, 0300, 0360, 0250, 0145, 0141, 0163, 0051, 0167, 0341, 0315, 0203, - 0172, 0036, 0044, 0170, 0234, 0221, 0245, 0152, 0303, 0261, 0037, 0116, 0157, 0244, 0173, 0232, - 0113, 0055, 0142, 0160, 0306, 0346, 0340, 0307, 0164, 0276, 0266, 0234, 0175, 0250, 0363, 0225, - 0231, 0106, 0134, 0210, 0243, 0124, 0204, 0204, 0070, 0032, 0127, 0323, 0030, 0347, 0245, 0263, - 0162, 0371, 0355, 0146, 0063, 0157, 0017, 0263, 0362, 0371, 0255, 0037, 0233, 0145, 0305, 0041, - 0176, 0041, 0370, 0311, 0245, 0342, 0110, 0153, 0375, 0145, 0242, 0064, 0021, 0144, 0156, 0042, - 0146, 0306, 0030, 0233, 0032, 0311, 0326, 0237, 0023, 0227, 0122, 0316, 0062, 0271, 0044, 0134, - 0214, 0372, 0251, 0076, 0274, 0302, 0313, 0134, 0306, 0122, 0347, 0165, 0150, 0374, 0305, 0370, - 0076, 0362, 0150, 0054, 0072, 0064, 0366, 0121, 0307, 0262, 0120, 0370, 0212, 0217, 0074, 0354, - 0143, 0357, 0021, 0233, 0373, 0173, 0173, 0067, 0330, 0044, 0176, 0044, 0307, 0070, 0257, 0017, - 0317, 0350, 0005, 0076, 0106, 0304, 0101, 0076, 0015, 0074, 0003, 0207, 0277, 0214, 0210, 0243, - 0173, 0023, 0164, 0307, 0005, 0242, 0377, 0056, 0322, 0155, 0250, 0027, 0376, 0057, 0137, 0320, - 0275, 0050, 0257, 0313, 0010, 0203, 0171, 0357, 0220, 0356, 0141, 0304, 0307, 0154, 0023, 0046, - 0216, 0370, 0361, 0011, 0074, 0022, 0223, 0377, 0203, 0215, 0165, 0306, 0377, 0203, 0171, 0047, - 0226, 0105, 0237, 0104, 0261, 0120, 0216, 0041, 0063, 0224, 0060, 0276, 0150, 0264, 0147, 0143, - 0366, 0367, 0275, 0160, 0051, 0376, 0322, 0372, 0036, 0055, 0216, 0313, 0107, 0364, 0156, 0066, - 0040, 0203, 0232, 0030, 0331, 0134, 0047, 0342, 0323, 0140, 0072, 0037, 0250, 0350, 0125, 0037, - 0321, 0107, 0361, 0150, 0272, 0012, 0141, 0067, 0016, 0345, 0006, 0031, 0176, 0307, 0237, 0023, - 0077, 0074, 0162, 0050, 0072, 0231, 0377, 0250, 0143, 0276, 0031, 0021, 0377, 0044, 0047, 0034, - 0142, 0143, 0157, 0177, 0072, 0222, 0366, 0362, 0110, 0370, 0027, 0347, 0326, 0143, 0066, 0022, - 0076, 0121, 0063, 0340, 0243, 0253, 0142, 0060, 0374, 0223, 0141, 0037, 0342, 0271, 0311, 0111, - 0310, 0236, 0205, 0116, 0105, 0253, 0003, 0276, 0023, 0321, 0251, 0112, 0133, 0347, 0332, 0241, - 0310, 0332, 0170, 0135, 0365, 0160, 0253, 0370, 0303, 0260, 0371, 0374, 0064, 0146, 0363, 0073, - 0374, 0136, 0324, 0001, 0020, 0324, 0045, 0306, 0023, 0016, 0076, 0340, 0273, 0052, 0072, 0233, - 0204, 0265, 0135, 0107, 0130, 0320, 0003, 0037, 0033, 0015, 0033, 0160, 0103, 0230, 0172, 0234, - 0076, 0370, 0033, 0374, 0043, 0066, 0345, 0312, 0123, 0064, 0163, 0116, 0125, 0046, 0377, 0072, - 0047, 0252, 0310, 0034, 0016, 0347, 0351, 0323, 0073, 0366, 0044, 0010, 0142, 0106, 0052, 0242, - 0013, 0337, 0305, 0206, 0240, 0027, 0336, 0220, 0010, 0052, 0362, 0004, 0245, 0070, 0021, 0315, - 0370, 0176, 0064, 0266, 0341, 0105, 0157, 0200, 0006, 0375, 0363, 0341, 0257, 0235, 0233, 0056, - 0342, 0377, 0276, 0276, 0351, 0377, 0322, 0073, 0353, 0236, 0241, 0223, 0257, 0150, 0170, 0321, - 0105, 0235, 0333, 0341, 0105, 0377, 0006, 0375, 0373, 0337, 0235, 0001, 0177, 0374, 0137, 0377, - 0205, 0072, 0127, 0147, 0374, 0377, 0277, 0242, 0356, 0157, 0327, 0067, 0335, 0301, 0000, 0365, - 0157, 0366, 0172, 0137, 0256, 0057, 0173, 0274, 0011, 0357, 0343, 0246, 0163, 0065, 0354, 0165, - 0007, 0357, 0120, 0357, 0352, 0364, 0362, 0366, 0254, 0167, 0365, 0351, 0035, 0072, 0271, 0035, - 0242, 0253, 0376, 0020, 0135, 0366, 0276, 0364, 0206, 0374, 0265, 0141, 0377, 0135, 0330, 0365, - 0264, 0331, 0336, 0153, 0063, 0324, 0077, 0107, 0137, 0272, 0067, 0247, 0027, 0374, 0317, 0316, - 0111, 0357, 0262, 0067, 0374, 0032, 0176, 0357, 0274, 0067, 0274, 0022, 0337, 0072, 0347, 0043, - 0351, 0240, 0353, 0316, 0315, 0260, 0167, 0172, 0173, 0331, 0271, 0101, 0327, 0267, 0067, 0327, - 0375, 0001, 0037, 0345, 0115, 0167, 0357, 0254, 0067, 0070, 0275, 0354, 0364, 0276, 0164, 0071, - 0004, 0173, 0127, 0374, 0213, 0250, 0373, 0113, 0367, 0152, 0210, 0006, 0027, 0235, 0313, 0313, - 0371, 0271, 0234, 0164, 0371, 0120, 0072, 0047, 0227, 0335, 0250, 0077, 0076, 0227, 0263, 0336, - 0115, 0367, 0164, 0370, 0156, 0257, 0167, 0065, 0375, 0227, 0030, 0076, 0137, 0005, 0076, 0212, - 0313, 0167, 0150, 0160, 0335, 0075, 0355, 0211, 0177, 0164, 0177, 0353, 0362, 0041, 0167, 0156, - 0276, 0276, 0343, 0263, 0106, 0247, 0375, 0253, 0101, 0367, 0237, 0267, 0374, 0045, 0376, 0020, - 0235, 0165, 0276, 0164, 0076, 0165, 0007, 0173, 0177, 0311, 0230, 0070, 0137, 0337, 0323, 0333, - 0233, 0356, 0027, 0061, 0062, 0076, 0333, 0301, 0355, 0311, 0140, 0330, 0033, 0336, 0016, 0273, - 0350, 0123, 0277, 0177, 0026, 0056, 0347, 0240, 0173, 0363, 0113, 0357, 0264, 0073, 0370, 0011, - 0135, 0366, 0007, 0341, 0232, 0334, 0016, 0272, 0357, 0370, 0027, 0206, 0235, 0360, 0303, 0274, - 0013, 0276, 0040, 0374, 0261, 0230, 0313, 0355, 0240, 0027, 0056, 0115, 0357, 0152, 0330, 0275, - 0271, 0271, 0275, 0036, 0366, 0372, 0127, 0337, 0357, 0135, 0364, 0177, 0345, 0223, 0347, 0143, - 0354, 0360, 0246, 0147, 0341, 0032, 0366, 0257, 0302, 0251, 0362, 0165, 0350, 0337, 0174, 0025, - 0235, 0212, 0065, 0010, 0227, 0370, 0035, 0372, 0365, 0242, 0313, 0177, 0277, 0021, 0313, 0026, - 0046, 0213, 0166, 0304, 0142, 0014, 0206, 0067, 0275, 0323, 0341, 0374, 0153, 0374, 0173, 0303, - 0376, 0315, 0020, 0275, 0316, 0021, 0135, 0165, 0077, 0135, 0366, 0076, 0165, 0257, 0116, 0273, - 0342, 0151, 0137, 0364, 0362, 0153, 0157, 0320, 0375, 0236, 0357, 0110, 0217, 0217, 0354, 0023, - 0137, 0322, 0360, 0263, 0277, 0166, 0370, 0067, 0157, 0303, 0051, 0213, 0235, 0340, 0243, 0212, - 0376, 0071, 0107, 0175, 0357, 0302, 0375, 0102, 0275, 0163, 0324, 0071, 0373, 0245, 0047, 0206, - 0035, 0275, 0274, 0307, 0167, 0170, 0320, 0233, 0122, 0103, 0270, 0144, 0247, 0027, 0323, 0345, - 0336, 0317, 0303, 0333, 0125, 0315, 0064, 0111, 0123, 0055, 0107, 0214, 0345, 0103, 0262, 0315, - 0124, 0202, 0345, 0126, 0222, 0365, 0126, 0202, 0005, 0047, 0143, 0305, 0145, 0131, 0162, 0051, - 0116, 0220, 0264, 0206, 0053, 0260, 0213, 0132, 0345, 0330, 0105, 0123, 0165, 0111, 0245, 0263, - 0222, 0217, 0140, 0157, 0120, 0062, 0135, 0033, 0116, 0210, 0255, 0346, 0204, 0130, 0230, 0106, - 0070, 0340, 0132, 0005, 0067, 0032, 0274, 0132, 0045, 0143, 0163, 0235, 0210, 0063, 0122, 0114, - 0225, 0157, 0231, 0212, 0022, 0043, 0137, 0223, 0044, 0145, 0363, 0251, 0341, 0200, 0327, 0232, - 0017, 0170, 0315, 0116, 0375, 0300, 0021, 0257, 0222, 0216, 0170, 0235, 0004, 0226, 0305, 0331, - 0151, 0075, 0017, 0171, 0315, 0015, 0016, 0216, 0171, 0255, 0365, 0230, 0327, 0164, 0047, 0066, - 0355, 0242, 0116, 0270, 0103, 0063, 0367, 0035, 0232, 0151, 0225, 0376, 0224, 0253, 0373, 0051, - 0127, 0265, 0316, 0123, 0002, 0260, 0264, 0163, 0153, 0122, 0172, 0105, 0251, 0167, 0165, 0212, - 0213, 0231, 0205, 0237, 0333, 0012, 0154, 0307, 0377, 0330, 0342, 0377, 0366, 0350, 0223, 0377, - 0361, 0050, 0274, 0221, 0071, 0115, 0267, 0370, 0344, 0021, 0263, 0116, 0052, 0231, 0154, 0221, - 0364, 0174, 0005, 0322, 0227, 0066, 0112, 0306, 0043, 0236, 0313, 0215, 0276, 0264, 0036, 0341, - 0326, 0150, 0362, 0032, 0247, 0144, 0130, 0352, 0334, 0023, 0066, 0344, 0074, 0213, 0375, 0304, - 0165, 0215, 0350, 0327, 0072, 0227, 0135, 0321, 0136, 0152, 0152, 0346, 0216, 0044, 0245, 0251, - 0177, 0031, 0141, 0234, 0105, 0270, 0264, 0147, 0160, 0151, 0277, 0201, 0213, 0022, 0154, 0152, - 0031, 0362, 0231, 0222, 0135, 0372, 0101, 0332, 0062, 0351, 0266, 0130, 0340, 0147, 0153, 0042, - 0074, 0375, 0300, 0061, 0260, 0237, 0247, 0117, 0305, 0374, 0221, 0352, 0034, 0213, 0311, 0065, - 0023, 0313, 0161, 0305, 0145, 0045, 0126, 0304, 0056, 0070, 0276, 0143, 0032, 0377, 0260, 0156, - 0214, 0063, 0017, 0341, 0044, 0370, 0316, 0250, 0253, 0322, 0101, 0112, 0266, 0104, 0206, 0073, - 0121, 0035, 0002, 0163, 0325, 0254, 0347, 0130, 0171, 0104, 0111, 0031, 0265, 0254, 0253, 0106, - 0110, 0336, 0056, 0306, 0112, 0045, 0243, 0143, 0147, 0121, 0270, 0007, 0133, 0177, 0326, 0054, - 0354, 0334, 0213, 0334, 0201, 0126, 0056, 0232, 0121, 0050, 0377, 0034, 0353, 0172, 0220, 0051, - 0001, 0115, 0377, 0310, 0025, 0207, 0120, 0057, 0347, 0274, 0011, 0300, 0154, 0325, 0013, 0230, - 0133, 0046, 0233, 0256, 0075, 0154, 0223, 0300, 0006, 0341, 0124, 0045, 0006, 0132, 0073, 0041, - 0234, 0246, 0244, 0004, 0322, 0151, 0313, 0245, 0323, 0237, 0377, 0374, 0347, 0255, 0221, 0116, - 0255, 0132, 0113, 0047, 0345, 0050, 0364, 0233, 0170, 0234, 0225, 0050, 0253, 0266, 0062, 0231, - 0137, 0060, 0241, 0355, 0050, 0047, 0137, 0131, 0222, 0201, 0274, 0152, 0226, 0123, 0034, 0125, - 0221, 0155, 0275, 0354, 0326, 0032, 0020, 0353, 0021, 0173, 0262, 0216, 0055, 0360, 0117, 0201, - 0177, 0012, 0374, 0123, 0340, 0237, 0002, 0377, 0024, 0230, 0301, 0140, 0006, 0203, 0031, 0134, - 0235, 0031, 0034, 0351, 0045, 0340, 0245, 0005, 0057, 0055, 0170, 0151, 0153, 0011, 0115, 0360, - 0121, 0201, 0217, 0012, 0174, 0124, 0340, 0243, 0132, 0233, 0217, 0052, 0142, 0103, 0340, 0245, - 0132, 0201, 0227, 0252, 0265, 0156, 0057, 0325, 0265, 0250, 0053, 0344, 0004, 0066, 0370, 0251, - 0300, 0117, 0005, 0176, 0052, 0360, 0123, 0201, 0237, 0012, 0374, 0124, 0340, 0247, 0002, 0077, - 0325, 0372, 0215, 0341, 0231, 0146, 0002, 0236, 0052, 0360, 0124, 0201, 0247, 0252, 0246, 0340, - 0004, 0137, 0025, 0370, 0252, 0300, 0127, 0005, 0276, 0252, 0212, 0255, 0131, 0331, 0103, 0166, - 0071, 0224, 0325, 0051, 0043, 0003, 0157, 0327, 0012, 0274, 0135, 0355, 0265, 0173, 0273, 0164, - 0313, 0322, 0115, 0002, 0356, 0056, 0160, 0167, 0201, 0273, 0013, 0334, 0135, 0340, 0356, 0002, - 0167, 0027, 0270, 0273, 0300, 0335, 0125, 0013, 0213, 0172, 0246, 0232, 0200, 0277, 0013, 0374, - 0135, 0340, 0357, 0252, 0053, 0072, 0301, 0341, 0005, 0016, 0057, 0160, 0170, 0201, 0303, 0153, - 0155, 0311, 0131, 0057, 0234, 0010, 0074, 0126, 0053, 0360, 0130, 0035, 0126, 0352, 0261, 0132, - 0164, 0317, 0034, 0316, 0334, 0063, 0255, 0030, 0367, 0214, 0264, 0153, 0246, 0026, 0025, 0263, - 0062, 0253, 0335, 0045, 0065, 0344, 0363, 0127, 0363, 0301, 0224, 0341, 0307, 0121, 0271, 0076, - 0345, 0224, 0332, 0043, 0312, 0005, 0377, 0060, 0024, 0034, 0163, 0032, 0302, 0354, 0301, 0046, - 0160, 0027, 0065, 0065, 0340, 0155, 0353, 0260, 0026, 0047, 0226, 0320, 0372, 0342, 0033, 0152, - 0202, 0154, 0263, 0333, 0022, 0206, 0355, 0144, 0306, 0045, 0236, 0046, 0037, 0257, 0026, 0117, - 0225, 0233, 0316, 0262, 0136, 0163, 0065, 0176, 0015, 0043, 0344, 0153, 0376, 0312, 0324, 0223, - 0333, 0107, 0317, 0052, 0276, 0015, 0114, 0115, 0257, 0057, 0140, 0161, 0127, 0175, 0361, 0337, - 0264, 0376, 0364, 0074, 0104, 0373, 0237, 0117, 0206, 0127, 0053, 0306, 0147, 0336, 0346, 0122, - 0165, 0246, 0223, 0361, 0355, 0027, 0353, 0100, 0255, 0334, 0165, 0062, 0065, 0120, 0213, 0021, - 0067, 0131, 0311, 0346, 0074, 0323, 0046, 0014, 0235, 0216, 0165, 0347, 0076, 0333, 0213, 0134, - 0056, 0027, 0123, 0063, 0144, 0166, 0335, 0315, 0377, 0171, 0173, 0175, 0223, 0351, 0236, 0203, - 0245, 0242, 0324, 0264, 0110, 0165, 0363, 0212, 0371, 0165, 0173, 0163, 0370, 0165, 0162, 0225, - 0371, 0015, 0260, 0012, 0336, 0357, 0330, 0305, 0043, 0115, 0270, 0170, 0144, 0065, 0027, 0217, - 0304, 0211, 0215, 0265, 0126, 0267, 0116, 0026, 0011, 0123, 0235, 0052, 0261, 0243, 0144, 0266, - 0134, 0230, 0377, 0047, 0361, 0174, 0270, 0275, 0244, 0024, 0165, 0256, 0304, 0333, 0113, 0346, - 0256, 0263, 0200, 0373, 0113, 0062, 0130, 0142, 0372, 0325, 0024, 0035, 0123, 0004, 0213, 0305, - 0325, 0214, 0221, 0111, 0163, 0252, 0373, 0343, 0271, 0337, 0342, 0057, 0150, 0010, 0134, 0127, - 0254, 0142, 0253, 0071, 0367, 0177, 0231, 0227, 0072, 0060, 0354, 0152, 0304, 0061, 0074, 0034, - 0165, 0334, 0312, 0156, 0042, 0256, 0200, 0130, 0154, 0262, 0330, 0102, 0366, 0146, 0026, 0061, - 0247, 0172, 0136, 0313, 0062, 0033, 0031, 0334, 0311, 0262, 0326, 0073, 0131, 0304, 0066, 0300, - 0205, 0054, 0273, 0166, 0041, 0113, 0174, 0220, 0120, 0375, 0076, 0215, 0265, 0336, 0260, 0122, - 0305, 0145, 0051, 0255, 0115, 0275, 0054, 0045, 0075, 0056, 0220, 0147, 0237, 0142, 0375, 0103, - 0171, 0256, 0075, 0121, 0012, 0100, 0254, 0352, 0316, 0224, 0201, 0113, 0234, 0171, 0177, 0246, - 0340, 0203, 0341, 0157, 0261, 0356, 0314, 0052, 0042, 0100, 0252, 0115, 0063, 0135, 0177, 0342, - 0136, 0150, 0161, 0015, 0375, 0035, 0345, 0012, 0042, 0062, 0370, 0204, 0042, 0335, 0177, 0137, - 0345, 0053, 0362, 0036, 0300, 0374, 0336, 0277, 0064, 0022, 0156, 0035, 0345, 0150, 0071, 0243, - 0143, 0325, 0306, 0163, 0131, 0023, 0077, 0250, 0264, 0174, 0042, 0046, 0227, 0075, 0306, 0130, - 0367, 0174, 0325, 0246, 0211, 0273, 0327, 0334, 0157, 0052, 0071, 0117, 0044, 0063, 0066, 0362, - 0146, 0152, 0374, 0131, 0245, 0323, 0067, 0051, 0032, 0046, 0271, 0047, 0314, 0127, 0357, 0100, - 0010, 0130, 0021, 0160, 0032, 0176, 0376, 0326, 0273, 0272, 0276, 0035, 0176, 0273, 0350, 0135, - 0015, 0277, 0135, 0365, 0277, 0165, 0277, 0364, 0377, 0273, 0207, 0376, 0007, 0055, 0075, 0271, - 0352, 0252, 0174, 0105, 0237, 0123, 0356, 0027, 0225, 0175, 0045, 0010, 0133, 0304, 0036, 0151, - 0236, 0320, 0322, 0102, 0063, 0100, 0245, 0155, 0264, 0062, 0031, 0136, 0305, 0245, 0033, 0202, - 0003, 0033, 0173, 0304, 0310, 0342, 0030, 0133, 0125, 0045, 0170, 0055, 0236, 0074, 0245, 0046, - 0045, 0270, 0362, 0044, 0024, 0223, 0303, 0315, 0125, 0114, 0252, 0222, 0334, 0157, 0245, 0166, - 0122, 0010, 0262, 0016, 0062, 0133, 0051, 0354, 0130, 0050, 0344, 0130, 0074, 0334, 0130, 0141, - 0250, 0161, 0055, 0112, 0206, 0102, 0140, 0173, 0013, 0162, 0330, 0262, 0303, 0211, 0033, 0235, - 0274, 0126, 0111, 0330, 0260, 0144, 0211, 0331, 0252, 0147, 0135, 0175, 0125, 0347, 0155, 0011, - 0275, 0154, 0222, 0364, 0156, 0101, 0040, 0016, 0002, 0161, 0157, 0045, 0033, 0127, 0053, 0040, - 0012, 0007, 0121, 0270, 0344, 0050, 0334, 0054, 0172, 0001, 0041, 0270, 0102, 0221, 0210, 0327, - 0100, 0325, 0005, 0361, 0371, 0120, 0047, 0365, 0214, 0125, 0315, 0015, 0056, 0014, 0007, 0055, - 0032, 0034, 0020, 0261, 0132, 0151, 0304, 0152, 0272, 0031, 0245, 0006, 0255, 0246, 0354, 0103, - 0013, 0035, 0173, 0215, 0343, 0277, 0265, 0217, 0144, 0133, 0214, 0061, 0271, 0037, 0163, 0276, - 0363, 0041, 0073, 0246, 0053, 0027, 0177, 0312, 0040, 0314, 0201, 0341, 0121, 0313, 0302, 0146, - 0314, 0212, 0274, 0171, 0124, 0015, 0201, 0312, 0066, 0131, 0050, 0267, 0101, 0034, 0251, 0100, - 0020, 0147, 0216, 0226, 0076, 0321, 0374, 0160, 0036, 0141, 0315, 0211, 0144, 0070, 0110, 0210, - 0273, 0137, 0010, 0176, 0022, 0376, 0360, 0265, 0352, 0034, 0062, 0247, 0124, 0136, 0242, 0117, - 0207, 0273, 0175, 0112, 0105, 0256, 0324, 0210, 0164, 0155, 0226, 0303, 0264, 0145, 0125, 0132, - 0332, 0332, 0371, 0001, 0126, 0133, 0132, 0145, 0201, 0311, 0010, 0366, 0065, 0230, 0330, 0043, - 0152, 0155, 0100, 0102, 0366, 0116, 0237, 0002, 0315, 0334, 0356, 0364, 0204, 0141, 0350, 0035, - 0172, 0337, 0250, 0336, 0341, 0304, 0126, 0226, 0266, 0130, 0377, 0163, 0132, 0122, 0011, 0046, - 0211, 0003, 0057, 0322, 0330, 0046, 0102, 0163, 0160, 0030, 0166, 0136, 0225, 0172, 0365, 0252, - 0210, 0342, 0117, 0375, 0236, 0333, 0103, 0232, 0243, 0263, 0300, 0323, 0255, 0227, 0276, 0252, - 0020, 0317, 0103, 0017, 0143, 0241, 0345, 0056, 0110, 0350, 0227, 0037, 0067, 0253, 0216, 0206, - 0207, 0251, 0307, 0141, 0257, 0027, 0032, 0307, 0130, 0330, 0020, 0232, 0317, 0255, 0125, 0043, - 0362, 0356, 0346, 0355, 0010, 0073, 0142, 0040, 0332, 0075, 0327, 0007, 0065, 0141, 0035, 0363, - 0211, 0215, 0050, 0033, 0027, 0350, 0212, 0361, 0155, 0231, 0165, 0225, 0167, 0124, 0063, 0143, - 0133, 0270, 0313, 0174, 0316, 0065, 0170, 0267, 0123, 0257, 0231, 0164, 0217, 0221, 0327, 0226, - 0210, 0350, 0031, 0267, 0337, 0265, 0360, 0117, 0156, 0255, 0275, 0256, 0130, 0332, 0051, 0263, - 0130, 0002, 0034, 0274, 0264, 0115, 0075, 0123, 0226, 0116, 0332, 0171, 0217, 0223, 0325, 0221, - 0347, 0267, 0126, 0312, 0363, 0023, 0154, 0236, 0355, 0253, 0107, 0251, 0134, 0307, 0140, 0235, - 0206, 0323, 0134, 0271, 0243, 0231, 0341, 0024, 0332, 0114, 0033, 0132, 0344, 0050, 0063, 0027, - 0240, 0203, 0174, 0141, 0030, 0042, 0077, 0234, 0345, 0376, 0066, 0024, 0122, 0072, 0254, 0155, - 0041, 0245, 0210, 0224, 0240, 0226, 0122, 0115, 0013, 0021, 0316, 0047, 0050, 0115, 0301, 0177, - 0216, 0231, 0061, 0076, 0343, 0233, 0230, 0134, 0055, 0241, 0256, 0320, 0127, 0256, 0234, 0120, - 0070, 0225, 0251, 0274, 0224, 0246, 0334, 0354, 0354, 0214, 0076, 0071, 0026, 0325, 0115, 0144, - 0362, 0237, 0321, 0235, 0107, 0155, 0364, 0125, 0037, 0123, 0372, 0047, 0164, 0116, 0034, 0335, - 0061, 0326, 0134, 0051, 0016, 0073, 0146, 0076, 0356, 0046, 0351, 0234, 0055, 0172, 0154, 0100, - 0036, 0075, 0262, 0156, 0307, 0127, 0000, 0061, 0047, 0313, 0357, 0130, 0012, 0222, 0312, 0361, - 0077, 0252, 0306, 0356, 0076, 0141, 0206, 0304, 0054, 0363, 0366, 0234, 0243, 0372, 0255, 0144, - 0152, 0130, 0351, 0051, 0142, 0051, 0135, 0372, 0154, 0302, 0267, 0152, 0326, 0235, 0103, 0075, - 0133, 0267, 0162, 0164, 0363, 0024, 0131, 0336, 0205, 0373, 0171, 0324, 0075, 0242, 0073, 0252, - 0035, 0311, 0124, 0321, 0220, 0021, 0256, 0231, 0266, 0123, 0134, 0200, 0326, 0054, 0243, 0242, - 0006, 0070, 0320, 0301, 0325, 0012, 0216, 0134, 0271, 0072, 0060, 0352, 0106, 0175, 0374, 0044, - 0245, 0222, 0051, 0167, 0040, 0021, 0061, 0112, 0050, 0214, 0023, 0221, 0221, 0102, 0040, 0316, - 0210, 0046, 0112, 0312, 0245, 0134, 0204, 0140, 0224, 0334, 0237, 0350, 0004, 0135, 0173, 0364, - 0221, 0230, 0330, 0104, 0243, 0211, 0204, 0242, 0127, 0070, 0153, 0022, 0322, 0364, 0126, 0224, - 0246, 0067, 0227, 0270, 0005, 0371, 0166, 0213, 0371, 0166, 0224, 0361, 0141, 0372, 0065, 0315, - 0267, 0173, 0035, 0034, 0224, 0207, 0130, 0157, 0262, 0135, 0264, 0023, 0353, 0255, 0020, 0061, - 0063, 0173, 0303, 0342, 0005, 0131, 0057, 0247, 0106, 0020, 0213, 0327, 0236, 0130, 0310, 0023, - 0324, 0132, 0252, 0151, 0202, 0062, 0055, 0352, 0136, 0336, 0042, 0041, 0342, 0360, 0176, 0056, - 0342, 0220, 0031, 0145, 0330, 0376, 0032, 0030, 0321, 0151, 0366, 0074, 0125, 0063, 0344, 0032, - 0055, 0044, 0314, 0265, 0244, 0052, 0155, 0274, 0275, 0321, 0113, 0251, 0225, 0124, 0310, 0044, - 0363, 0074, 0353, 0373, 0070, 0152, 0221, 0216, 0113, 0255, 0365, 0270, 0310, 0342, 0202, 0067, - 0025, 0217, 0301, 0146, 0347, 0066, 0312, 0236, 0177, 0355, 0370, 0056, 0377, 0101, 0366, 0266, - 0275, 0265, 0144, 0201, 0226, 0165, 0115, 0037, 0015, 0330, 0316, 0035, 0361, 0344, 0322, 0313, - 0314, 0223, 0171, 0062, 0011, 0333, 0035, 0225, 0167, 0242, 0364, 0224, 0171, 0226, 0152, 0157, - 0112, 0376, 0307, 0215, 0275, 0301, 0240, 0271, 0332, 0073, 0067, 0001, 0360, 0000, 0170, 0000, - 0374, 0072, 0001, 0337, 0002, 0300, 0003, 0340, 0001, 0360, 0273, 0003, 0370, 0025, 0337, 0252, - 0235, 0104, 0272, 0265, 0200, 0372, 0163, 0066, 0331, 0311, 0223, 0334, 0137, 0125, 0272, 0221, - 0246, 0265, 0335, 0050, 0344, 0001, 0162, 0002, 0344, 0304, 0132, 0344, 0304, 0371, 0126, 0013, - 0211, 0066, 0240, 0035, 0320, 0016, 0150, 0177, 0101, 0373, 0015, 0240, 0275, 0006, 0066, 0140, - 0255, 0125, 0302, 0161, 0132, 0100, 0056, 0247, 0214, 0041, 0326, 0352, 0152, 0233, 0036, 0156, - 0010, 0313, 0337, 0065, 0042, 0230, 0246, 0153, 0324, 0237, 0016, 0200, 0031, 0124, 0112, 0007, - 0377, 0014, 0010, 0253, 0077, 0021, 0200, 0223, 0240, 0122, 0042, 0310, 0316, 0205, 0257, 0013, - 0041, 0034, 0202, 0041, 0000, 0206, 0300, 0366, 0031, 0002, 0147, 0140, 0010, 0000, 0332, 0001, - 0355, 0020, 0014, 0332, 0361, 0140, 0020, 0000, 0036, 0000, 0277, 0205, 0200, 0377, 0047, 0210, - 0167, 0260, 0352, 0040, 0364, 0133, 0122, 0350, 0027, 0074, 0102, 0100, 0066, 0300, 0155, 0200, - 0154, 0126, 0103, 0066, 0207, 0353, 0275, 0143, 0115, 0116, 0257, 0316, 0301, 0056, 0163, 0336, - 0231, 0126, 0377, 0273, 0106, 0244, 0374, 0243, 0052, 0276, 0121, 0007, 0173, 0272, 0125, 0306, - 0035, 0045, 0157, 0252, 0144, 0214, 0250, 0145, 0346, 0277, 0226, 0144, 0165, 0004, 0124, 0345, - 0245, 0173, 0057, 0207, 0224, 0176, 0200, 0103, 0112, 0160, 0110, 0011, 0214, 0130, 0360, 0132, - 0301, 0041, 0045, 0000, 0074, 0000, 0036, 0000, 0017, 0207, 0224, 0000, 0360, 0000, 0170, 0000, - 0374, 0056, 0036, 0122, 0002, 0300, 0003, 0340, 0001, 0360, 0020, 0210, 0006, 0300, 0003, 0340, - 0001, 0360, 0053, 0001, 0374, 0173, 0000, 0074, 0000, 0036, 0000, 0277, 0073, 0200, 0077, 0002, - 0300, 0003, 0340, 0267, 0017, 0360, 0135, 0110, 0065, 0003, 0027, 0075, 0240, 0175, 0107, 0320, - 0076, 0000, 0264, 0203, 0177, 0036, 0320, 0276, 0043, 0150, 0077, 0001, 0264, 0203, 0163, 0036, - 0320, 0276, 0053, 0246, 0073, 0240, 0035, 0074, 0363, 0200, 0366, 0035, 0101, 0173, 0017, 0320, - 0016, 0156, 0171, 0100, 0373, 0216, 0240, 0375, 0032, 0320, 0136, 0003, 0237, 0374, 0256, 0225, - 0371, 0351, 0232, 0204, 0155, 0302, 0131, 0055, 0250, 0031, 0127, 0117, 0372, 0031, 0140, 0043, - 0360, 0010, 0043, 0330, 0337, 0152, 0052, 0202, 0363, 0305, 0225, 0122, 0321, 0111, 0140, 0131, - 0204, 0072, 0133, 0115, 0102, 0160, 0326, 0270, 0122, 0022, 0072, 0325, 0375, 0361, 0126, 0323, - 0317, 0041, 0320, 0117, 0225, 0364, 0323, 0271, 0356, 0155, 0065, 0371, 0274, 0007, 0362, 0251, - 0222, 0174, 0256, 0075, 0174, 0207, 0075, 0354, 0030, 0133, 0256, 0010, 0201, 0071, 0006, 0025, - 0063, 0300, 0012, 0003, 0262, 0131, 0015, 0331, 0200, 0331, 0005, 0144, 0003, 0246, 0026, 0220, - 0315, 0152, 0310, 0006, 0054, 0054, 0040, 0033, 0260, 0254, 0200, 0154, 0126, 0103, 0066, 0107, - 0065, 0052, 0042, 0327, 0132, 0177, 0021, 0271, 0204, 0032, 0140, 0207, 0120, 0003, 0154, 0002, - 0036, 0030, 0251, 0333, 0213, 0260, 0345, 0102, 0044, 0023, 0362, 0136, 0040, 0357, 0145, 0263, - 0362, 0136, 0056, 0040, 0357, 0005, 0320, 0016, 0150, 0337, 0021, 0264, 0177, 0006, 0264, 0303, - 0351, 0064, 0100, 0373, 0216, 0240, 0275, 0003, 0150, 0207, 0323, 0151, 0200, 0366, 0035, 0101, - 0073, 0024, 0226, 0001, 0145, 0036, 0000, 0017, 0200, 0007, 0300, 0203, 0076, 0017, 0200, 0007, - 0300, 0103, 0065, 0150, 0110, 0257, 0055, 0053, 0270, 0103, 0331, 0003, 0236, 0300, 0031, 0043, - 0040, 0241, 0374, 0276, 0210, 0121, 0226, 0350, 0200, 0023, 0106, 0220, 0210, 0002, 0271, 0331, - 0100, 0066, 0100, 0066, 0040, 0256, 0200, 0154, 0352, 0234, 0233, 0135, 0122, 0332, 0133, 0033, - 0356, 0116, 0135, 0371, 0335, 0251, 0027, 0304, 0147, 0324, 0233, 0240, 0137, 0211, 0303, 0215, - 0372, 0035, 0276, 0102, 0265, 0275, 0212, 0364, 0311, 0066, 0244, 0117, 0102, 0372, 0244, 0344, - 0235, 0306, 0014, 0235, 0361, 0137, 0040, 0205, 0022, 0114, 0354, 0334, 0356, 0101, 0213, 0252, - 0215, 0001, 0174, 0064, 0340, 0327, 0007, 0277, 0376, 0372, 0375, 0372, 0147, 0220, 0247, 0003, - 0141, 0173, 0100, 0373, 0256, 0104, 0361, 0000, 0355, 0040, 0333, 0001, 0355, 0020, 0263, 0207, - 0254, 0074, 0000, 0074, 0000, 0036, 0000, 0017, 0131, 0171, 0020, 0262, 0202, 0220, 0025, 0170, - 0015, 0201, 0154, 0152, 0027, 0040, 0137, 0147, 0204, 0352, 0020, 0042, 0235, 0105, 0042, 0235, - 0163, 0045, 0101, 0267, 0052, 0332, 0331, 0252, 0155, 0264, 0363, 0075, 0104, 0073, 0041, 0332, - 0051, 0167, 0155, 0301, 0230, 0076, 0241, 0123, 0213, 0032, 0017, 0076, 0004, 0074, 0041, 0340, - 0131, 0210, 0214, 0172, 0216, 0111, 0014, 0270, 0377, 0002, 0350, 0250, 0130, 0362, 0305, 0140, - 0142, 0163, 0141, 0356, 0103, 0206, 0072, 0220, 0021, 0344, 0137, 0300, 0115, 0237, 0340, 0262, - 0335, 0041, 0227, 0355, 0277, 0040, 0042, 0013, 0001, 0032, 0100, 0373, 0216, 0240, 0375, 0067, - 0100, 0073, 0344, 0137, 0000, 0332, 0167, 0004, 0355, 0003, 0100, 0073, 0324, 0100, 0003, 0264, - 0103, 0156, 0345, 0056, 0243, 0035, 0354, 0166, 0100, 0073, 0244, 0132, 0101, 0156, 0045, 0000, - 0036, 0000, 0017, 0200, 0207, 0334, 0112, 0000, 0074, 0000, 0036, 0000, 0277, 0321, 0200, 0007, - 0003, 0036, 0000, 0017, 0200, 0337, 0041, 0300, 0303, 0365, 0250, 0220, 0006, 0017, 0051, 0210, - 0100, 0066, 0033, 0164, 0172, 0002, 0310, 0006, 0312, 0013, 0002, 0331, 0000, 0331, 0254, 0106, - 0267, 0131, 0347, 0371, 0032, 0070, 0253, 0125, 0350, 0254, 0126, 0237, 0215, 0261, 0067, 0075, - 0245, 0345, 0157, 0307, 0061, 0255, 0166, 0155, 0217, 0151, 0301, 0235, 0336, 0160, 0114, 0113, - 0016, 0226, 0347, 0304, 0302, 0160, 0076, 0013, 0016, 0104, 0344, 0245, 0237, 0376, 0147, 0070, - 0225, 0005, 0324, 0003, 0307, 0151, 0300, 0207, 0017, 0076, 0174, 0110, 0302, 0203, 0224, 0133, - 0100, 0073, 0240, 0175, 0353, 0320, 0336, 0007, 0264, 0103, 0102, 0016, 0240, 0175, 0107, 0320, - 0176, 0016, 0150, 0207, 0174, 0133, 0100, 0073, 0144, 0343, 0100, 0202, 0075, 0000, 0036, 0000, - 0017, 0200, 0207, 0004, 0173, 0000, 0074, 0000, 0036, 0000, 0017, 0011, 0366, 0220, 0312, 0004, - 0251, 0114, 0020, 0122, 0006, 0262, 0201, 0130, 0062, 0220, 0015, 0134, 0347, 0275, 0226, 0304, - 0111, 0327, 0322, 0015, 0074, 0246, 0226, 0211, 0275, 0203, 0012, 0132, 0056, 0056, 0324, 0302, - 0303, 0250, 0113, 0044, 0064, 0132, 0076, 0101, 0302, 0054, 0074, 0322, 0275, 0027, 0200, 0055, - 0003, 0360, 0002, 0353, 0374, 0123, 0047, 0163, 0357, 0344, 0000, 0137, 0036, 0320, 0055, 0253, - 0342, 0134, 0021, 0067, 0104, 0252, 0205, 0066, 0012, 0030, 0243, 0116, 0312, 0347, 0226, 0346, - 0330, 0330, 0260, 0264, 0325, 0224, 0173, 0321, 0051, 0173, 0300, 0223, 0122, 0162, 0117, 0357, - 0250, 0303, 0064, 0023, 0373, 0306, 0113, 0372, 0151, 0377, 0171, 0162, 0217, 0035, 0155, 0300, - 0277, 0212, 0132, 0315, 0374, 0211, 0250, 0271, 0162, 0207, 0277, 0140, 0047, 0070, 0231, 0356, - 0154, 0245, 0073, 0241, 0322, 0054, 0154, 0242, 0121, 0207, 0123, 0036, 0061, 0036, 0124, 0323, - 0101, 0261, 0201, 0311, 0043, 0366, 0371, 0042, 0337, 0351, 0201, 0305, 0324, 0076, 0355, 0141, - 0213, 0340, 0273, 0306, 0261, 0103, 0035, 0351, 0066, 0056, 0165, 0003, 0367, 0205, 0110, 0304, - 0212, 0312, 0266, 0014, 0070, 0256, 0170, 0153, 0372, 0210, 0275, 0254, 0131, 0306, 0213, 0356, - 0170, 0306, 0224, 0254, 0000, 0350, 0206, 0201, 0055, 0354, 0351, 0214, 0172, 0210, 0017, 0226, - 0057, 0165, 0003, 0371, 0334, 0102, 0327, 0055, 0276, 0131, 0142, 0261, 0261, 0331, 0100, 0066, - 0065, 0311, 0035, 0301, 0236, 0240, 0220, 0263, 0317, 0337, 0116, 0373, 0127, 0303, 0233, 0376, - 0345, 0267, 0057, 0235, 0301, 0347, 0105, 0352, 0314, 0244, 0301, 0104, 0226, 0070, 0377, 0040, - 0236, 0050, 0033, 0210, 0230, 0037, 0033, 0137, 0164, 0342, 0164, 0115, 0302, 0302, 0137, 0246, - 0275, 0250, 0020, 0246, 0052, 0153, 0130, 0134, 0346, 0370, 0221, 0365, 0030, 0266, 0227, 0107, - 0067, 0300, 0106, 0340, 0021, 0066, 0131, 0067, 0307, 0116, 0146, 0142, 0337, 0246, 0103, 0044, - 0361, 0345, 0360, 0343, 0150, 0063, 0160, 0070, 0141, 0131, 0304, 0111, 0033, 0363, 0022, 0111, - 0371, 0257, 0044, 0245, 0033, 0214, 0074, 0352, 0014, 0113, 0322, 0124, 0246, 0004, 0315, 0263, - 0061, 0047, 0201, 0145, 0221, 0005, 0366, 0126, 0267, 0175, 0231, 0216, 0260, 0322, 0115, 0031, - 0325, 0153, 0123, 0116, 0165, 0177, 0134, 0343, 0035, 0021, 0303, 0253, 0164, 0073, 0214, 0165, - 0154, 0307, 0000, 0273, 0172, 0070, 0206, 0227, 0175, 0131, 0351, 0016, 0124, 0102, 0110, 0235, - 0353, 0136, 0175, 0351, 0250, 0163, 0375, 0255, 0127, 0051, 0031, 0221, 0172, 0241, 0132, 0134, - 0252, 0125, 0143, 0124, 0317, 0335, 0371, 0125, 0351, 0256, 0270, 0345, 0357, 0212, 0212, 0276, - 0044, 0316, 0345, 0324, 0127, 0137, 0232, 0215, 0356, 0202, 0370, 0174, 0301, 0152, 0254, 0056, - 0205, 0003, 0374, 0346, 0115, 0052, 0045, 0025, 0017, 0344, 0100, 0061, 0326, 0063, 0043, 0247, - 0177, 0006, 0204, 0325, 0230, 0365, 0210, 0341, 0125, 0112, 0110, 0277, 0257, 0227, 0347, 0134, - 0140, 0313, 0255, 0057, 0317, 0231, 0215, 0156, 0152, 0241, 0327, 0230, 0347, 0120, 0366, 0055, - 0311, 0321, 0124, 0032, 0251, 0074, 0324, 0103, 0151, 0230, 0155, 0112, 0147, 0104, 0203, 0072, - 0103, 0067, 0034, 0137, 0245, 0033, 0242, 0257, 0032, 0273, 0035, 0327, 0265, 0210, 0241, 0063, - 0156, 0164, 0106, 0247, 0352, 0137, 0167, 0145, 0372, 0167, 0271, 0060, 0226, 0171, 0175, 0352, - 0255, 0323, 0236, 0210, 0311, 0270, 0151, 0370, 0343, 0207, 0043, 0331, 0026, 0343, 0350, 0064, - 0377, 0361, 0217, 0355, 0314, 0046, 0304, 0020, 0216, 0200, 0001, 0023, 0127, 0113, 0152, 0342, - 0217, 0175, 0327, 0271, 0317, 0152, 0024, 0372, 0300, 0155, 0116, 0251, 0241, 0317, 0076, 0027, - 0113, 0032, 0030, 0036, 0265, 0054, 0154, 0056, 0254, 0156, 0331, 0304, 0056, 0333, 0144, 0041, - 0275, 0206, 0070, 0311, 0276, 0374, 0164, 0317, 0361, 0057, 0004, 0077, 0271, 0324, 0143, 0153, - 0365, 0340, 0307, 0173, 0105, 0027, 0113, 0033, 0264, 0222, 0112, 0033, 0110, 0227, 0067, 0130, - 0137, 0354, 0123, 0041, 0273, 0351, 0204, 0076, 0157, 0102, 0156, 0023, 0365, 0010, 0166, 0130, - 0310, 0173, 0032, 0307, 0217, 0374, 0001, 0147, 0104, 0331, 0071, 0106, 0211, 0353, 0020, 0277, - 0026, 0067, 0370, 0021, 0353, 0234, 0307, 0276, 0362, 0265, 0360, 0072, 0331, 0227, 0237, 0223, - 0172, 0052, 0270, 0126, 0145, 0254, 0127, 0154, 0110, 0124, 0210, 0045, 0042, 0226, 0154, 0212, - 0132, 0337, 0042, 0046, 0027, 0066, 0156, 0301, 0316, 0314, 0300, 0233, 0156, 0304, 0141, 0263, - 0231, 0247, 0057, 0057, 0134, 0120, 0055, 0334, 0035, 0205, 0045, 0112, 0335, 0315, 0030, 0004, - 0037, 0316, 0020, 0334, 0212, 0101, 0260, 0004, 0232, 0027, 0251, 0040, 0001, 0340, 0245, 0122, - 0101, 0131, 0224, 0020, 0073, 0230, 0151, 0116, 0245, 0114, 0176, 0135, 0312, 0221, 0174, 0374, - 0354, 0352, 0216, 0251, 0070, 0245, 0314, 0235, 0313, 0223, 0257, 0132, 0311, 0352, 0227, 0271, - 0003, 0205, 0112, 0032, 0124, 0262, 0021, 0005, 0063, 0156, 0225, 0062, 0160, 0323, 0102, 0241, - 0371, 0211, 0104, 0125, 0210, 0125, 0106, 0044, 0145, 0023, 0112, 0151, 0102, 0057, 0377, 0272, - 0246, 0345, 0133, 0204, 0274, 0360, 0012, 0077, 0175, 0245, 0336, 0303, 0220, 0330, 0070, 0055, - 0051, 0272, 0362, 0165, 0257, 0142, 0355, 0323, 0300, 0252, 0306, 0062, 0323, 0172, 0264, 0165, - 0357, 0236, 0070, 0132, 0210, 0376, 0214, 0032, 0037, 0212, 0135, 0142, 0301, 0013, 0112, 0351, - 0060, 0331, 0250, 0345, 0373, 0217, 0004, 0001, 0040, 0101, 0001, 0352, 0237, 0112, 0316, 0332, - 0116, 0032, 0130, 0122, 0336, 0233, 0354, 0124, 0146, 0074, 0262, 0064, 0212, 0270, 0043, 0226, - 0125, 0036, 0315, 0272, 0064, 0322, 0250, 0024, 0331, 0156, 0152, 0052, 0136, 0362, 0353, 0012, - 0174, 0240, 0114, 0236, 0361, 0025, 0330, 0105, 0005, 0120, 0154, 0066, 0377, 0336, 0154, 0226, - 0361, 0011, 0245, 0163, 0027, 0200, 0152, 0045, 0124, 0267, 0352, 0204, 0152, 0371, 0175, 0222, - 0354, 0124, 0266, 0103, 0371, 0015, 0317, 0177, 0346, 0246, 0244, 0303, 0024, 0071, 0167, 0103, - 0152, 0301, 0300, 0010, 0132, 0142, 0224, 0134, 0147, 0001, 0023, 0010, 0114, 0240, 0115, 0062, - 0201, 0276, 0350, 0336, 0003, 0146, 0141, 0025, 0101, 0320, 0151, 0166, 0320, 0004, 0212, 0366, - 0037, 0205, 0004, 0340, 0243, 0236, 0003, 0372, 0022, 0130, 0101, 0022, 0154, 0043, 0264, 0201, - 0270, 0066, 0003, 0074, 0243, 0012, 0073, 0010, 0114, 0041, 0060, 0205, 0166, 0311, 0024, 0152, - 0357, 0206, 0051, 0224, 0174, 0112, 0051, 0307, 0127, 0263, 0267, 0050, 0243, 0223, 0254, 0016, - 0262, 0367, 0266, 0060, 0170, 0213, 0201, 0265, 0220, 0334, 0315, 0330, 0376, 0324, 0265, 0053, - 0036, 0206, 0357, 0071, 0046, 0061, 0260, 0017, 0201, 0370, 0242, 0201, 0370, 0154, 0230, 0310, - 0047, 0041, 0255, 0043, 0002, 0136, 0244, 0233, 0162, 0002, 0340, 0217, 0176, 0270, 0036, 0043, - 0335, 0323, 0134, 0152, 0021, 0203, 0253, 0013, 0016, 0047, 0113, 0257, 0352, 0130, 0170, 0102, - 0336, 0324, 0306, 0372, 0200, 0036, 0163, 0053, 0211, 0340, 0162, 0251, 0326, 0345, 0362, 0130, - 0110, 0175, 0257, 0245, 0003, 0347, 0345, 0350, 0302, 0166, 0231, 0136, 0140, 0157, 0154, 0251, - 0053, 0141, 0061, 0217, 0355, 0203, 0154, 0036, 0133, 0072, 0010, 0026, 0163, 0332, 0246, 0052, - 0125, 0124, 0062, 0104, 0042, 0267, 0155, 0343, 0275, 0022, 0323, 0213, 0273, 0306, 0324, 0246, - 0367, 0330, 0301, 0124, 0125, 0235, 0310, 0277, 0235, 0231, 0336, 0241, 0063, 0372, 0244, 0352, - 0030, 0252, 0144, 0033, 0252, 0332, 0212, 0152, 0234, 0104, 0152, 0216, 0042, 0276, 0306, 0145, - 0175, 0244, 0260, 0237, 0050, 0017, 0357, 0316, 0307, 0277, 0313, 0215, 0252, 0126, 0340, 0126, - 0050, 0300, 0200, 0225, 0231, 0160, 0005, 0310, 0275, 0322, 0175, 0123, 0377, 0035, 0300, 0133, - 0061, 0170, 0243, 0145, 0006, 0374, 0052, 0026, 0171, 0003, 0374, 0146, 0341, 0167, 0160, 0015, - 0330, 0255, 0030, 0273, 0203, 0357, 0164, 0333, 0375, 0351, 0032, 0035, 0065, 0233, 0033, 0215, - 0264, 0066, 0040, 0255, 0010, 0322, 0116, 0010, 0063, 0050, 0161, 0000, 0156, 0025, 0303, 0155, - 0272, 0316, 0033, 0015, 0265, 0103, 0200, 0132, 0021, 0250, 0175, 0032, 0000, 0312, 0052, 0106, - 0331, 0047, 0152, 0231, 0007, 0003, 0142, 0075, 0156, 0270, 0372, 0370, 0003, 0040, 0255, 0020, - 0322, 0070, 0031, 0000, 0326, 0126, 0200, 0265, 0215, 0006, 0331, 0173, 0000, 0131, 0041, 0033, - 0055, 0144, 0263, 0000, 0263, 0252, 0355, 0264, 0315, 0227, 0146, 0107, 0073, 0005, 0064, 0210, - 0376, 0155, 0106, 0266, 0041, 0204, 0257, 0201, 0200, 0125, 0011, 0270, 0015, 0341, 0153, 0251, - 0360, 0365, 0057, 0342, 0056, 0004, 0210, 0136, 0257, 0073, 0172, 0315, 0167, 0003, 0077, 0207, - 0173, 0001, 0032, 0132, 0165, 0032, 0332, 0341, 0341, 0273, 0243, 0303, 0037, 0366, 0077, 0064, - 0367, 0016, 0333, 0357, 0217, 0016, 0337, 0037, 0101, 0100, 0014, 0002, 0332, 0225, 0004, 0264, - 0001, 0317, 0253, 0300, 0163, 0253, 0365, 0256, 0365, 0267, 0037, 0366, 0333, 0155, 0300, 0061, - 0004, 0266, 0113, 0017, 0154, 0003, 0206, 0127, 0042, 0223, 0337, 0375, 0355, 0350, 0303, 0176, - 0033, 0104, 0061, 0104, 0314, 0053, 0212, 0230, 0003, 0204, 0053, 0206, 0360, 0217, 0115, 0000, - 0057, 0304, 0340, 0113, 0217, 0301, 0003, 0156, 0001, 0267, 0153, 0300, 0055, 0104, 0364, 0213, - 0341, 0226, 0132, 0046, 0040, 0027, 0220, 0273, 0006, 0344, 0102, 0232, 0100, 0061, 0213, 0067, - 0214, 0137, 0003, 0166, 0001, 0273, 0153, 0300, 0056, 0144, 0036, 0224, 0273, 0340, 0033, 0033, - 0270, 0075, 0204, 0072, 0107, 0120, 0215, 0247, 0130, 0065, 0236, 0126, 0225, 0325, 0170, 0322, - 0326, 0055, 0175, 0315, 0212, 0105, 0335, 0012, 0360, 0271, 0224, 0311, 0046, 0116, 0124, 0345, - 0006, 0044, 0251, 0002, 0067, 0125, 0135, 0206, 0224, 0247, 0271, 0122, 0335, 0333, 0245, 0201, - 0027, 0151, 0154, 0023, 0221, 0326, 0301, 0245, 0265, 0363, 0172, 0177, 0132, 0113, 0171, 0357, - 0305, 0237, 0372, 0275, 0316, 0260, 0346, 0350, 0054, 0360, 0164, 0353, 0245, 0057, 0251, 0061, - 0051, 0126, 0223, 0032, 0172, 0030, 0213, 0342, 0071, 0257, 0271, 0043, 0057, 0277, 0254, 0247, - 0214, 0124, 0336, 0056, 0074, 0114, 0075, 0023, 0173, 0172, 0241, 0161, 0214, 0051, 0127, 0222, - 0065, 0037, 0133, 0174, 0221, 0102, 0156, 0223, 0267, 0043, 0354, 0210, 0201, 0150, 0367, 0036, - 0061, 0065, 0161, 0163, 0041, 0237, 0330, 0210, 0262, 0161, 0201, 0256, 0030, 0337, 0226, 0131, - 0127, 0171, 0107, 0065, 0273, 0010, 0121, 0243, 0216, 0346, 0163, 0226, 0301, 0273, 0065, 0054, - 0142, 0074, 0250, 0336, 0062, 0205, 0210, 0120, 0111, 0235, 0331, 0045, 0125, 0037, 0033, 0163, - 0053, 0246, 0124, 0075, 0113, 0320, 0332, 0340, 0245, 0355, 0101, 0105, 0362, 0156, 0303, 0030, - 0176, 0153, 0245, 0014, 0077, 0341, 0122, 0260, 0166, 0102, 0066, 0232, 0364, 0325, 0176, 0125, - 0212, 0205, 0134, 0167, 0344, 0115, 0313, 0040, 0163, 0030, 0062, 0152, 0113, 0330, 0044, 0113, - 0014, 0206, 0076, 0251, 0047, 0230, 0225, 0225, 0250, 0246, 0312, 0326, 0257, 0075, 0172, 0357, - 0141, 0337, 0077, 0321, 0247, 0165, 0002, 0347, 0177, 0330, 0260, 0372, 0200, 0352, 0066, 0374, - 0222, 0110, 0015, 0370, 0247, 0065, 0237, 0141, 0227, 0103, 0163, 0277, 0235, 0353, 0126, 0076, - 0206, 0237, 0131, 0254, 0311, 0177, 0116, 0034, 0335, 0061, 0210, 0156, 0241, 0123, 0113, 0024, - 0363, 0312, 0323, 0171, 0170, 0033, 0152, 0370, 0005, 0311, 0225, 0056, 0137, 0301, 0127, 0117, - 0057, 0051, 0150, 0234, 0257, 0262, 0146, 0346, 0111, 0300, 0101, 0357, 0104, 0110, 0070, 0307, - 0314, 0030, 0237, 0361, 0055, 0074, 0031, 0136, 0155, 0234, 0216, 0143, 0140, 0362, 0210, 0175, - 0155, 0172, 0113, 0157, 0376, 0236, 0030, 0245, 0026, 0043, 0256, 0226, 0110, 0325, 0147, 0364, - 0311, 0261, 0250, 0156, 0042, 0223, 0377, 0214, 0356, 0074, 0152, 0043, 0116, 0350, 0316, 0070, - 0030, 0355, 0023, 0212, 0270, 0212, 0214, 0276, 0352, 0143, 0112, 0377, 0204, 0042, 0362, 0137, - 0023, 0260, 0037, 0325, 0256, 0312, 0310, 0123, 0340, 0163, 0316, 0207, 0372, 0112, 0071, 0114, - 0352, 0244, 0176, 0255, 0057, 0274, 0114, 0071, 0121, 0210, 0031, 0022, 0263, 0314, 0333, 0163, - 0116, 0317, 0345, 0317, 0234, 0167, 0170, 0144, 0024, 0060, 0354, 0147, 0072, 0132, 0136, 0136, - 0235, 0071, 0027, 0270, 0325, 0305, 0101, 0341, 0033, 0015, 0364, 0050, 0134, 0334, 0037, 0033, - 0375, 0347, 0011, 0027, 0260, 0332, 0200, 0317, 0016, 0265, 0232, 0215, 0314, 0012, 0311, 0162, - 0037, 0057, 0354, 0230, 0211, 0273, 0251, 0334, 0174, 0275, 0251, 0074, 0324, 0306, 0261, 0051, - 0171, 0121, 0371, 0246, 0011, 0205, 0326, 0132, 0205, 0102, 0166, 0275, 0154, 0350, 0075, 0107, - 0357, 0165, 0264, 0240, 0332, 0145, 0133, 0120, 0361, 0223, 0214, 0171, 0171, 0371, 0305, 0067, - 0057, 0055, 0276, 0260, 0360, 0160, 0152, 0133, 0213, 0112, 0275, 0174, 0072, 0204, 0131, 0170, - 0064, 0247, 0254, 0057, 0113, 0246, 0250, 0070, 0345, 0213, 0206, 0057, 0174, 0067, 0257, 0077, - 0045, 0337, 0124, 0237, 0051, 0205, 0362, 0110, 0234, 0130, 0205, 0326, 0020, 0327, 0300, 0150, - 0243, 0110, 0367, 0112, 0376, 0334, 0322, 0264, 0027, 0304, 0152, 0222, 0104, 0116, 0277, 0353, - 0136, 0112, 0324, 0346, 0025, 0255, 0362, 0242, 0364, 0305, 0066, 0360, 0023, 0373, 0112, 0026, - 0074, 0205, 0245, 0134, 0222, 0124, 0313, 0044, 0322, 0070, 0216, 0261, 0274, 0017, 0137, 0260, - 0023, 0314, 0053, 0326, 0202, 0000, 0317, 0211, 0205, 0303, 0337, 0227, 0164, 0353, 0262, 0167, - 0110, 0245, 0131, 0330, 0104, 0070, 0275, 0246, 0336, 0056, 0245, 0335, 0125, 0123, 0272, 0227, - 0133, 0163, 0243, 0360, 0056, 0275, 0362, 0366, 0162, 0260, 0303, 0015, 0134, 0161, 0231, 0322, - 0353, 0172, 0312, 0066, 0015, 0070, 0340, 0170, 0163, 0341, 0306, 0314, 0232, 0146, 0074, 0243, - 0113, 0226, 0005, 0261, 0254, 0161, 0131, 0233, 0271, 0053, 0242, 0315, 0124, 0110, 0231, 0135, - 0223, 0060, 0240, 0314, 0362, 0050, 0163, 0266, 0236, 0053, 0243, 0314, 0245, 0135, 0356, 0331, - 0372, 0175, 0134, 0062, 0113, 0156, 0263, 0253, 0210, 0251, 0265, 0044, 0000, 0031, 0025, 0373, - 0171, 0317, 0036, 0064, 0335, 0064, 0125, 0132, 0022, 0203, 0072, 0337, 0174, 0362, 0007, 0116, - 0125, 0230, 0245, 0065, 0222, 0070, 0214, 0342, 0162, 0061, 0232, 0244, 0350, 0051, 0007, 0161, - 0143, 0024, 0263, 0322, 0360, 0177, 0201, 0055, 0027, 0360, 0137, 0036, 0376, 0147, 0353, 0011, - 0370, 0317, 0302, 0377, 0230, 0257, 0124, 0315, 0030, 0300, 0170, 0335, 0014, 0240, 0235, 0227, - 0001, 0044, 0332, 0117, 0363, 0017, 0142, 0256, 0011, 0066, 0205, 0127, 0312, 0306, 0016, 0233, - 0205, 0103, 0360, 0335, 0005, 0015, 0074, 0177, 0356, 0301, 0264, 0313, 0267, 0164, 0353, 0272, - 0202, 0142, 0077, 0274, 0035, 0360, 0362, 0206, 0143, 0127, 0043, 0216, 0341, 0341, 0250, 0263, - 0126, 0126, 0003, 0227, 0123, 0357, 0174, 0203, 0037, 0336, 0230, 0274, 0351, 0023, 0022, 0320, - 0173, 0235, 0112, 0370, 0127, 0374, 0147, 0122, 0251, 0137, 0225, 0342, 0027, 0241, 0031, 0077, - 0252, 0036, 0303, 0366, 0342, 0310, 0302, 0353, 0100, 0327, 0155, 0221, 0046, 0033, 0151, 0337, - 0302, 0361, 0311, 0364, 0041, 0170, 0130, 0340, 0160, 0325, 0130, 0304, 0341, 0123, 0206, 0273, - 0204, 0067, 0343, 0025, 0157, 0263, 0030, 0274, 0044, 0340, 0162, 0322, 0373, 0064, 0133, 0347, - 0145, 0033, 0026, 0262, 0167, 0224, 0167, 0075, 0346, 0375, 0124, 0221, 0263, 0054, 0152, 0070, - 0073, 0213, 0062, 0063, 0244, 0076, 0300, 0155, 0134, 0346, 0321, 0211, 0366, 0104, 0330, 0130, - 0163, 0165, 0057, 0304, 0207, 0314, 0207, 0004, 0353, 0154, 0034, 0017, 0004, 0357, 0365, 0065, - 0361, 0307, 0276, 0353, 0334, 0147, 0042, 0367, 0201, 0270, 0232, 0100, 0243, 0247, 0215, 0111, - 0342, 0227, 0026, 0051, 0177, 0061, 0152, 0336, 0236, 0105, 0315, 0077, 0314, 0105, 0315, 0063, - 0043, 0345, 0153, 0201, 0301, 0342, 0375, 0302, 0107, 0012, 0115, 0302, 0373, 0203, 0125, 0032, - 0060, 0352, 0252, 0065, 0110, 0015, 0315, 0307, 0205, 0343, 0175, 0056, 0055, 0270, 0260, 0340, - 0342, 0244, 0051, 0265, 0136, 0012, 0301, 0167, 0031, 0065, 0163, 0136, 0305, 0024, 0040, 0013, - 0351, 0156, 0060, 0261, 0107, 0324, 0272, 0165, 0115, 0216, 0361, 0172, 0351, 0232, 0313, 0352, - 0242, 0222, 0266, 0051, 0037, 0062, 0364, 0303, 0045, 0100, 0026, 0361, 0131, 0024, 0071, 0214, - 0312, 0146, 0014, 0075, 0341, 0234, 0334, 0067, 0250, 0055, 0373, 0111, 0271, 0000, 0141, 0256, - 0004, 0300, 0134, 0211, 0177, 0262, 0232, 0151, 0122, 0160, 0260, 0026, 0232, 0151, 0172, 0340, - 0057, 0042, 0137, 0077, 0265, 0303, 0364, 0130, 0131, 0051, 0301, 0271, 0264, 0200, 0134, 0041, - 0315, 0327, 0137, 0217, 0346, 0053, 0027, 0110, 0113, 0213, 0151, 0034, 0125, 0153, 0062, 0157, - 0220, 0123, 0075, 0144, 0263, 0123, 0102, 0105, 0227, 0234, 0311, 0324, 0333, 0267, 0236, 0213, - 0104, 0232, 0100, 0042, 0205, 0110, 0144, 0114, 0237, 0320, 0264, 0010, 0036, 0120, 0107, 0352, - 0001, 0312, 0262, 0250, 0143, 0300, 0225, 0165, 0376, 0231, 0127, 0145, 0150, 0034, 0026, 0276, - 0023, 0073, 0060, 0175, 0124, 0037, 0115, 0050, 0123, 0225, 0221, 0242, 0237, 0122, 0224, 0225, - 0320, 0034, 0314, 0232, 0365, 0222, 0024, 0173, 0316, 0155, 0117, 0256, 0133, 0214, 0255, 0201, - 0012, 0271, 0171, 0317, 0315, 0301, 0015, 0045, 0302, 0150, 0360, 0165, 0244, 0301, 0077, 0066, - 0226, 0006, 0017, 0101, 0116, 0052, 0220, 0330, 0216, 0211, 0111, 0040, 0216, 0031, 0161, 0204, - 0376, 0161, 0104, 0357, 0120, 0344, 0314, 0000, 0012, 0111, 0317, 0056, 0053, 0115, 0204, 0271, - 0304, 0171, 0353, 0131, 0012, 0267, 0042, 0174, 0260, 0164, 0251, 0172, 0255, 0105, 0230, 0064, - 0011, 0225, 0042, 0307, 0036, 0163, 0265, 0262, 0365, 0147, 0315, 0302, 0316, 0075, 0123, 0022, - 0047, 0111, 0063, 0226, 0356, 0341, 0171, 0072, 0330, 0346, 0376, 0221, 0374, 0056, 0271, 0276, - 0046, 0230, 0265, 0366, 0244, 0173, 0116, 0350, 0370, 0124, 0202, 0072, 0161, 0334, 0200, 0151, - 0156, 0340, 0271, 0141, 0074, 0306, 0011, 0354, 0221, 0202, 0222, 0060, 0027, 0050, 0213, 0211, - 0236, 0111, 0317, 0301, 0042, 0366, 0110, 0363, 0204, 0262, 0040, 0277, 0126, 0276, 0243, 0163, - 0042, 0243, 0032, 0043, 0134, 0120, 0251, 0221, 0050, 0237, 0044, 0366, 0210, 0241, 0326, 0350, - 0311, 0323, 0135, 0265, 0026, 0101, 0110, 0337, 0232, 0113, 0055, 0142, 0114, 0032, 0307, 0344, - 0116, 0023, 0304, 0150, 0052, 0120, 0156, 0200, 0123, 0322, 0042, 0326, 0247, 0053, 0125, 0314, - 0354, 0116, 0251, 0075, 0242, 0234, 0251, 0015, 0103, 0074, 0315, 0330, 0335, 0255, 0173, 0215, - 0275, 0057, 0304, 0231, 0075, 0255, 0223, 0274, 0314, 0344, 0171, 0123, 0126, 0207, 0370, 0024, - 0020, 0237, 0003, 0227, 0134, 0165, 0344, 0172, 0141, 0110, 0016, 0153, 0134, 0137, 0347, 0353, - 0106, 0154, 0033, 0233, 0104, 0227, 0037, 0351, 0314, 0142, 0150, 0052, 0045, 0216, 0150, 0167, - 0344, 0031, 0233, 0332, 0023, 0061, 0005, 0257, 0115, 0137, 0165, 0302, 0260, 0275, 0254, 0116, - 0210, 0137, 0343, 0326, 0234, 0217, 0103, 0074, 0222, 0176, 0277, 0245, 0370, 0176, 0133, 0361, - 0375, 0103, 0305, 0367, 0337, 0053, 0276, 0177, 0244, 0370, 0376, 0017, 0161, 0357, 0107, 0277, - 0371, 0165, 0341, 0064, 0055, 0120, 0274, 0325, 0071, 0310, 0216, 0251, 0336, 0100, 0043, 0057, - 0301, 0126, 0154, 0020, 0133, 0267, 0320, 0265, 0310, 0327, 0006, 0323, 0054, 0275, 0121, 0265, - 0332, 0012, 0337, 0212, 0150, 0027, 0066, 0122, 0135, 0221, 0044, 0044, 0120, 0125, 0112, 0122, - 0125, 0112, 0121, 0045, 0152, 0046, 0272, 0053, 0206, 0335, 0071, 0347, 0114, 0157, 0075, 0042, - 0342, 0267, 0323, 0061, 0345, 0206, 0254, 0127, 0367, 0054, 0233, 0122, 0075, 0052, 0247, 0143, - 0335, 0271, 0307, 0210, 0215, 0061, 0022, 0014, 0033, 0371, 0230, 0061, 0262, 0234, 0343, 0226, - 0234, 0157, 0056, 0354, 0367, 0210, 0243, 0267, 0345, 0245, 0220, 0163, 0037, 0204, 0271, 0326, - 0134, 0032, 0004, 0322, 0074, 0302, 0365, 0360, 0043, 0301, 0323, 0272, 0026, 0265, 0161, 0376, - 0377, 0000, 0052, 0304, 0354, 0160, 0042, 0165, 0040, 0165, 0242, 0050, 0125, 0124, 0162, 0236, - 0027, 0016, 0357, 0326, 0001, 0037, 0102, 0314, 0140, 0017, 0073, 0265, 0327, 0257, 0213, 0236, - 0221, 0202, 0343, 0120, 0305, 0216, 0103, 0315, 0316, 0071, 0300, 0041, 0335, 0102, 0147, 0026, - 0136, 0217, 0264, 0014, 0260, 0021, 0170, 0204, 0021, 0354, 0327, 0363, 0140, 0313, 0164, 0174, - 0023, 0070, 0334, 0262, 0366, 0303, 0055, 0263, 0255, 0050, 0365, 0200, 0213, 0372, 0171, 0225, - 0220, 0341, 0314, 0314, 0305, 0303, 0243, 0246, 0154, 0213, 0131, 0151, 0327, 0166, 0263, 0271, - 0371, 0207, 0142, 0226, 0017, 0110, 0054, 0370, 0102, 0326, 0171, 0336, 0105, 0351, 0150, 0011, - 0365, 0104, 0035, 0077, 0075, 0072, 0251, 0310, 0231, 0064, 0043, 0206, 0156, 0345, 0075, 0044, - 0062, 0340, 0012, 0346, 0303, 0042, 0255, 0106, 0077, 0325, 0110, 0007, 0222, 0055, 0215, 0271, - 0244, 0101, 0013, 0176, 0023, 0236, 0350, 0324, 0314, 0300, 0233, 0056, 0330, 0121, 0263, 0231, - 0243, 0275, 0320, 0040, 0033, 0307, 0276, 0105, 0114, 0254, 0205, 0352, 0274, 0047, 0200, 0041, - 0037, 0331, 0146, 0330, 0163, 0251, 0045, 0142, 0260, 0321, 0311, 0331, 0034, 0307, 0070, 0026, - 0317, 0164, 0265, 0146, 0147, 0272, 0336, 0307, 0124, 0102, 0225, 0256, 0202, 0132, 0213, 0023, - 0037, 0013, 0107, 0245, 0216, 0124, 0133, 0052, 0325, 0052, 0055, 0243, 0336, 0251, 0112, 0165, - 0362, 0264, 0062, 0174, 0265, 0252, 0076, 0233, 0222, 0203, 0027, 0036, 0144, 0310, 0354, 0057, - 0273, 0100, 0135, 0151, 0125, 0361, 0262, 0252, 0341, 0101, 0225, 0374, 0045, 0072, 0354, 0072, - 0314, 0233, 0274, 0341, 0362, 0341, 0276, 0206, 0017, 0226, 0143, 0002, 0125, 0323, 0150, 0236, - 0346, 0331, 0011, 0311, 0341, 0301, 0033, 0137, 0216, 0136, 0013, 0325, 0372, 0314, 0027, 0070, - 0220, 0312, 0360, 0122, 0246, 0062, 0211, 0104, 0255, 0104, 0373, 0360, 0325, 0116, 0113, 0136, - 0325, 0137, 0177, 0373, 0372, 0057, 0325, 0216, 0337, 0144, 0162, 0351, 0226, 0073, 0326, 0263, - 0000, 0260, 0353, 0205, 0316, 0267, 0122, 0166, 0214, 0271, 0035, 0340, 0203, 0354, 0250, 0131, - 0271, 0310, 0342, 0262, 0043, 0334, 0327, 0155, 0222, 0035, 0127, 0141, 0262, 0251, 0110, 0005, - 0366, 0345, 0150, 0026, 0344, 0207, 0244, 0374, 0050, 0272, 0262, 0157, 0144, 0211, 0111, 0356, - 0011, 0363, 0067, 0117, 0230, 0034, 0256, 0246, 0346, 0153, 0332, 0004, 0227, 0162, 0217, 0371, - 0177, 0271, 0160, 0126, 0053, 0377, 0026, 0005, 0121, 0342, 0066, 0272, 0223, 0326, 0121, 0302, - 0374, 0342, 0375, 0301, 0222, 0145, 0014, 0342, 0131, 0117, 0055, 0114, 0132, 0151, 0027, 0115, - 0042, 0077, 0251, 0326, 0042, 0215, 0361, 0115, 0326, 0124, 0335, 0050, 0017, 0313, 0112, 0127, - 0304, 0345, 0277, 0036, 0056, 0271, 0250, 0330, 0232, 0155, 0300, 0345, 0354, 0260, 0031, 0001, - 0044, 0044, 0206, 0325, 0122, 0331, 0314, 0266, 0002, 0303, 0373, 0232, 0220, 0216, 0374, 0351, - 0354, 0066, 0111, 0224, 0147, 0146, 0203, 0045, 0065, 0214, 0002, 0341, 0232, 0217, 0103, 0207, - 0345, 0043, 0237, 0166, 0343, 0230, 0072, 0352, 0264, 0252, 0226, 0133, 0226, 0236, 0143, 0226, - 0231, 0073, 0026, 0263, 0125, 0161, 0271, 0147, 0211, 0071, 0145, 0133, 0310, 0043, 0132, 0165, - 0125, 0023, 0074, 0154, 0323, 0107, 0134, 0216, 0246, 0160, 0243, 0334, 0227, 0324, 0002, 0311, - 0353, 0030, 0371, 0123, 0171, 0244, 0010, 0104, 0235, 0060, 0224, 0205, 0106, 0131, 0371, 0140, - 0363, 0171, 0213, 0063, 0161, 0320, 0177, 0250, 0127, 0312, 0142, 0146, 0075, 0277, 0144, 0116, - 0236, 0073, 0331, 0242, 0332, 0044, 0111, 0152, 0333, 0204, 0241, 0050, 0127, 0262, 0226, 0071, - 0315, 0120, 0156, 0254, 0161, 0334, 0377, 0274, 0265, 0125, 0306, 0150, 0241, 0332, 0030, 0031, - 0075, 0256, 0262, 0156, 0331, 0312, 0331, 0161, 0013, 0022, 0061, 0127, 0223, 0210, 0031, 0046, - 0041, 0104, 0105, 0161, 0260, 0127, 0247, 0144, 0004, 0151, 0313, 0174, 0271, 0002, 0163, 0230, - 0126, 0261, 0220, 0145, 0041, 0173, 0240, 0032, 0122, 0050, 0327, 0233, 0102, 0271, 0230, 0361, - 0007, 0211, 0224, 0322, 0371, 0161, 0334, 0152, 0023, 0172, 0307, 0035, 0237, 0307, 0361, 0336, - 0377, 0003, 0126, 0027, 0122, 0340, 0000, 0050, 0165, 0165, 0141, 0171, 0051 + 0154, 0163, 0056, 0147, 0154, 0141, 0144, 0145, 0233, 0155, 0003, 0000, 0001, 0000, 0000, 0000, + 0170, 0332, 0355, 0175, 0353, 0166, 0333, 0070, 0226, 0356, 0177, 0077, 0005, 0132, 0353, 0254, + 0236, 0256, 0065, 0241, 0043, 0311, 0161, 0122, 0335, 0125, 0161, 0057, 0331, 0226, 0143, 0235, + 0044, 0226, 0333, 0222, 0223, 0316, 0374, 0311, 0120, 0044, 0154, 0141, 0114, 0022, 0054, 0022, + 0264, 0255, 0132, 0347, 0205, 0316, 0153, 0234, 0047, 0073, 0000, 0051, 0131, 0222, 0305, 0013, + 0300, 0213, 0104, 0111, 0273, 0327, 0232, 0232, 0130, 0044, 0100, 0134, 0366, 0267, 0357, 0330, + 0370, 0375, 0237, 0317, 0266, 0205, 0036, 0261, 0347, 0023, 0352, 0174, 0154, 0264, 0016, 0233, + 0015, 0204, 0035, 0203, 0232, 0304, 0271, 0377, 0330, 0270, 0035, 0136, 0150, 0277, 0066, 0376, + 0171, 0162, 0360, 0373, 0137, 0064, 0015, 0175, 0302, 0016, 0366, 0164, 0206, 0115, 0364, 0104, + 0330, 0030, 0335, 0133, 0272, 0211, 0321, 0321, 0341, 0273, 0346, 0141, 0023, 0151, 0032, 0177, + 0211, 0070, 0014, 0173, 0167, 0272, 0201, 0117, 0016, 0020, 0372, 0335, 0303, 0177, 0004, 0304, + 0303, 0076, 0262, 0310, 0350, 0143, 0343, 0236, 0075, 0374, 0147, 0143, 0376, 0241, 0243, 0303, + 0366, 0273, 0306, 0333, 0360, 0075, 0072, 0372, 0037, 0154, 0060, 0144, 0130, 0272, 0357, 0177, + 0154, 0174, 0142, 0017, 0137, 0261, 0023, 0064, 0020, 0061, 0077, 0066, 0072, 0327, 0275, 0360, + 0017, 0361, 0036, 0177, 0323, 0365, 0250, 0213, 0075, 0066, 0101, 0216, 0156, 0343, 0217, 0215, + 0107, 0342, 0223, 0221, 0205, 0033, 0047, 0103, 0057, 0300, 0277, 0277, 0235, 0075, 0215, 0177, + 0331, 0320, 0035, 0355, 0216, 0032, 0201, 0337, 0070, 0271, 0320, 0055, 0177, 0365, 0175, 0143, + 0114, 0054, 0063, 0372, 0167, 0322, 0240, 0172, 0014, 0333, 0113, 0003, 0073, 0263, 0250, 0217, + 0033, 0263, 0106, 0212, 0043, 0314, 0063, 0312, 0270, 0066, 0226, 0076, 0302, 0126, 0003, 0061, + 0117, 0167, 0174, 0113, 0147, 0072, 0377, 0340, 0307, 0306, 0004, 0363, 0056, 0176, 0206, 0343, + 0223, 0351, 0043, 0360, 0261, 0026, 0070, 0046, 0366, 0054, 0342, 0244, 0015, 0127, 0067, 0014, + 0154, 0011, 0042, 0240, 0036, 0172, 0300, 0023, 0076, 0340, 0006, 0362, 0311, 0275, 0243, 0133, + 0037, 0033, 0272, 0301, 0310, 0043, 0047, 0217, 0006, 0262, 0071, 0371, 0334, 0021, 0276, 0325, + 0174, 0345, 0316, 0077, 0377, 0074, 0353, 0137, 0015, 0157, 0372, 0137, 0176, 0176, 0355, 0014, + 0076, 0107, 0173, 0036, 0366, 0365, 0066, 0132, 0343, 0351, 0362, 0277, 0175, 0131, 0377, 0305, + 0007, 0253, 0373, 0360, 0235, 0070, 0046, 0175, 0232, 0356, 0202, 0113, 0246, 0177, 0346, 0334, + 0363, 0230, 0367, 0115, 0174, 0247, 0007, 0026, 0223, 0043, 0052, 0116, 0335, 0344, 0117, 0075, + 0334, 0141, 0251, 0017, 0114, 0073, 0327, 0236, 0210, 0311, 0306, 0215, 0223, 0343, 0343, 0246, + 0154, 0213, 0061, 0046, 0367, 0143, 0076, 0252, 0266, 0114, 0023, 0237, 0171, 0164, 0242, 0011, + 0220, 0152, 0256, 0356, 0141, 0107, 0162, 0066, 0304, 0240, 0116, 0343, 0144, 0300, 0250, 0361, + 0340, 0153, 0342, 0217, 0103, 0327, 0271, 0317, 0152, 0344, 0077, 0020, 0227, 0177, 0345, 0036, + 0173, 0332, 0230, 0044, 0176, 0051, 0003, 0134, 0247, 0364, 0171, 0323, 0050, 0262, 0165, 0357, + 0236, 0070, 0032, 0243, 0056, 0137, 0344, 0246, 0102, 0213, 0021, 0145, 0214, 0332, 0215, 0223, + 0226, 0124, 0043, 0352, 0021, 0276, 0037, 0072, 0043, 0142, 0251, 0071, 0067, 0144, 0304, 0320, + 0055, 0231, 0206, 0276, 0253, 0033, 0234, 0047, 0313, 0016, 0156, 0244, 0373, 0130, 0140, 0131, + 0163, 0251, 0117, 0242, 0257, 0361, 0251, 0305, 0266, 0134, 0332, 0233, 0370, 0375, 0271, 0242, + 0014, 0217, 0050, 0175, 0170, 0141, 0176, 0057, 0077, 0054, 0266, 0313, 0261, 0163, 0031, 0273, + 0247, 0322, 0314, 0037, 0323, 0047, 0276, 0031, 0036, 0147, 0142, 0051, 0333, 0036, 0077, 0143, + 0031, 0252, 0054, 0064, 0307, 0274, 0124, 0232, 0101, 0173, 0076, 0323, 0075, 0226, 0104, 0172, + 0031, 0155, 0261, 0143, 0346, 0154, 0031, 0142, 0344, 0070, 0107, 0303, 0031, 0124, 0224, 0332, + 0112, 0043, 0046, 0023, 0071, 0031, 0223, 0015, 0251, 0002, 0261, 0211, 0053, 0366, 0006, 0013, + 0125, 0046, 0146, 0367, 0343, 0350, 0244, 0353, 0060, 0157, 0362, 0042, 0221, 0156, 0075, 0353, + 0063, 0236, 0204, 0277, 0305, 0023, 0120, 0041, 0042, 0052, 0000, 0230, 0244, 0346, 0214, 0122, + 0213, 0161, 0046, 0316, 0360, 0063, 0213, 0125, 0043, 0072, 0256, 0313, 0211, 0005, 0065, 0376, + 0252, 0333, 0356, 0157, 0214, 0076, 0140, 0256, 0277, 0241, 0021, 0276, 0243, 0036, 0106, 0023, + 0032, 0170, 0350, 0216, 0070, 0316, 0070, 0030, 0035, 0022, 0052, 0224, 0202, 0303, 0203, 0203, + 0305, 0127, 0377, 0152, 0261, 0337, 0176, 0364, 0157, 0157, 0120, 0347, 0354, 0254, 0177, 0173, + 0065, 0104, 0237, 0273, 0077, 0376, 0172, 0317, 0176, 0153, 0250, 0216, 0363, 0121, 0267, 0270, + 0246, 0321, 0070, 0211, 0366, 0106, 0265, 0365, 0062, 0142, 0216, 0163, 0066, 0017, 0101, 0223, + 0267, 0261, 0024, 0371, 0307, 0265, 0177, 0236, 0316, 0274, 0171, 0250, 0334, 0324, 0265, 0270, + 0072, 0076, 0246, 0026, 0347, 0212, 0311, 0033, 0054, 0261, 0133, 0252, 0337, 0045, 0216, 0033, + 0060, 0315, 0015, 0074, 0067, 0324, 0220, 0165, 0313, 0035, 0353, 0351, 0175, 0054, 0353, 0203, + 0257, 0173, 0327, 0215, 0007, 0216, 0141, 0271, 0157, 0343, 0147, 0127, 0027, 0373, 0224, 0311, + 0125, 0343, 0032, 0337, 0021, 0313, 0312, 0207, 0243, 0271, 0244, 0175, 0227, 0065, 0323, 0304, + 0351, 0054, 0250, 0301, 0161, 0334, 0111, 0216, 0037, 0175, 0011, 0015, 0202, 0365, 0062, 0236, + 0134, 0153, 0235, 0154, 0271, 0134, 0314, 0071, 0212, 0060, 0043, 0271, 0106, 0213, 0002, 0317, + 0122, 0355, 0377, 0177, 0002, 0237, 0221, 0273, 0211, 0064, 0313, 0320, 0031, 0363, 0310, 0050, + 0140, 0330, 0217, 0177, 0141, 0361, 0225, 0031, 0271, 0120, 0207, 0161, 0233, 0301, 0347, 0166, + 0020, 0347, 0117, 0001, 0377, 0245, 0377, 0074, 0271, 0307, 0216, 0066, 0340, 0163, 0102, 0255, + 0346, 0334, 0336, 0171, 0275, 0321, 0351, 0037, 0333, 0041, 0064, 0064, 0067, 0213, 0206, 0145, + 0351, 0334, 0375, 0043, 0040, 0154, 0302, 0145, 0364, 0056, 0011, 0350, 0341, 0030, 0057, 0312, + 0140, 0034, 0316, 0161, 0021, 0070, 0157, 0220, 0103, 0031, 0042, 0216, 0141, 0005, 0302, 0261, + 0203, 0164, 0344, 0117, 0354, 0021, 0265, 0120, 0144, 0306, 0107, 0244, 0053, 0344, 0366, 0230, + 0061, 0327, 0377, 0307, 0333, 0267, 0363, 0336, 0336, 0352, 0056, 0171, 0373, 0330, 0172, 0373, + 0107, 0300, 0125, 0376, 0177, 0106, 0315, 0076, 0202, 0354, 0256, 0215, 0354, 0226, 0334, 0061, + 0220, 0337, 0012, 0034, 0253, 0265, 0131, 0216, 0065, 0300, 0256, 0036, 0272, 0330, 0352, 0047, + 0303, 0167, 0150, 0223, 0333, 0240, 0244, 0225, 0247, 0244, 0161, 0041, 0002, 0312, 0331, 0066, + 0242, 0340, 0250, 0154, 0024, 0304, 0257, 0115, 0354, 0313, 0113, 0036, 0027, 0116, 0130, 0215, + 0154, 0227, 0134, 0022, 0152, 0252, 0160, 0312, 0251, 0066, 0115, 0006, 0112, 0244, 0164, 0242, + 0316, 0165, 0057, 0265, 0277, 0014, 0242, 0053, 0203, 0272, 0323, 0050, 0073, 0211, 0252, 0223, + 0051, 0172, 0105, 0121, 0325, 0107, 0132, 0104, 0224, 0031, 0364, 0234, 0100, 0126, 0051, 0124, + 0002, 0336, 0132, 0360, 0326, 0126, 0341, 0255, 0275, 0372, 0061, 0350, 0016, 0102, 0025, 0331, + 0337, 0101, 0243, 0120, 0314, 0016, 0161, 0001, 0203, 0050, 0033, 0143, 0017, 0131, 0304, 0027, + 0321, 0373, 0310, 0044, 0360, 0205, 0141, 0070, 0065, 0371, 0270, 0375, 0360, 0364, 0364, 0164, + 0350, 0350, 0276, 0251, 0377, 0301, 0373, 0342, 0026, 0307, 0241, 0101, 0355, 0267, 0346, 0204, + 0177, 0214, 0030, 0157, 0371, 0012, 0235, 0023, 0357, 0155, 0330, 0113, 0324, 0311, 0041, 0343, + 0237, 0005, 0053, 0260, 0116, 0126, 0140, 0276, 0115, 0004, 0303, 0020, 0034, 0273, 0153, 0264, + 0031, 0256, 0102, 0352, 0134, 0144, 0101, 0140, 0067, 0200, 0123, 0267, 0240, 0123, 0067, 0042, + 0252, 0035, 0026, 0343, 0213, 0240, 0121, 0027, 0333, 0321, 0163, 0220, 0333, 0333, 0055, 0267, + 0137, 0357, 0042, 0010, 0156, 0360, 0350, 0202, 0107, 0027, 0074, 0272, 0245, 0152, 0147, 0131, + 0366, 0042, 0050, 0153, 0340, 0344, 0055, 0305, 0125, 0050, 0305, 0232, 0325, 0335, 0204, 0173, + 0340, 0114, 0216, 0324, 0134, 0304, 0325, 0134, 0177, 0267, 0275, 0311, 0222, 0322, 0173, 0015, + 0116, 0350, 0270, 0271, 0304, 0317, 0043, 0027, 0364, 0325, 0041, 0257, 0154, 0227, 0305, 0314, + 0165, 0145, 0236, 0062, 0211, 0340, 0247, 0001, 0127, 0244, 0235, 0027, 0303, 0253, 0377, 0371, + 0164, 0170, 0125, 0243, 0034, 0360, 0314, 0003, 0034, 0111, 0015, 0307, 0272, 0237, 0257, 0241, + 0207, 0015, 0114, 0036, 0161, 0316, 0326, 0231, 0326, 0337, 0031, 0265, 0155, 0302, 0320, 0331, + 0130, 0167, 0356, 0261, 0057, 0077, 0033, 0031, 0173, 0055, 0237, 0225, 0047, 0033, 0216, 0131, + 0047, 0163, 0125, 0016, 0310, 0044, 0163, 0327, 0376, 0347, 0065, 0062, 0325, 0126, 0071, 0114, + 0065, 0136, 0036, 0256, 0034, 0325, 0242, 0363, 0243, 0132, 0206, 0105, 0214, 0007, 0154, 0112, + 0236, 0324, 0332, 0062, 0026, 0330, 0312, 0313, 0002, 0023, 0117, 0244, 0275, 0326, 0056, 0010, + 0263, 0360, 0110, 0237, 0033, 0163, 0253, 0324, 0177, 0211, 0205, 0031, 0177, 0252, 0173, 0233, + 0076, 0326, 0024, 0236, 0212, 0061, 0304, 0061, 0100, 0155, 0024, 0361, 0356, 0344, 0317, 0255, + 0314, 0261, 0221, 0056, 0014, 0342, 0040, 0136, 0066, 0367, 0127, 0242, 0232, 0144, 0130, 0247, + 0204, 0336, 0123, 0060, 0135, 0130, 0111, 0112, 0302, 0362, 0052, 0232, 0162, 0111, 0143, 0161, + 0004, 0165, 0052, 0221, 0353, 0043, 0203, 0303, 0046, 0032, 0165, 0264, 0220, 0311, 0050, 0356, + 0140, 0061, 0161, 0352, 0141, 0213, 0340, 0273, 0306, 0211, 0103, 0035, 0005, 0276, 0341, 0006, + 0156, 0110, 0040, 0142, 0065, 0145, 0133, 0211, 0363, 0262, 0274, 0045, 0175, 0314, 0173, 0330, + 0154, 0301, 0073, 0370, 0066, 0027, 0067, 0277, 0053, 0227, 0233, 0313, 0262, 0302, 0364, 0303, + 0271, 0013, 0047, 0267, 0107, 0064, 0140, 0065, 0075, 0273, 0075, 0033, 0032, 0234, 0336, 0336, + 0354, 0351, 0155, 0261, 0017, 0245, 0236, 0337, 0126, 0075, 0216, 0275, 0327, 0007, 0236, 0263, + 0215, 0004, 0165, 0003, 0241, 0374, 0323, 0316, 0307, 0171, 0217, 0054, 0367, 0154, 0276, 0105, + 0165, 0122, 0116, 0052, 0065, 0312, 0136, 0013, 0065, 0362, 0074, 0012, 0356, 0226, 0110, 0133, + 0153, 0265, 0177, 0215, 0043, 0157, 0360, 0160, 0154, 0255, 0122, 0173, 0101, 0034, 0335, 0061, + 0210, 0156, 0111, 0073, 0006, 0044, 0335, 0361, 0053, 0150, 0344, 0122, 0303, 0140, 0172, 0366, + 0224, 0113, 0123, 0245, 0117, 0271, 0146, 0204, 0132, 0355, 0125, 0373, 0170, 0245, 0237, 0247, + 0250, 0060, 0306, 0254, 0223, 0061, 0326, 0037, 0047, 0371, 0325, 0360, 0335, 0063, 0152, 0345, + 0250, 0176, 0300, 0170, 0067, 0013, 0142, 0071, 0372, 0273, 0106, 0050, 0010, 0311, 0077, 0134, + 0013, 0315, 0014, 0274, 0251, 0104, 0071, 0156, 0066, 0163, 0264, 0027, 0006, 0156, 0343, 0304, + 0267, 0210, 0311, 0265, 0046, 0127, 0343, 0352, 0207, 0043, 0333, 0113, 0130, 0340, 0310, 0245, + 0034, 0206, 0130, 0343, 0252, 0106, 0326, 0334, 0267, 0077, 0163, 0271, 0274, 0164, 0336, 0017, + 0331, 0331, 0274, 0052, 0141, 0326, 0071, 0251, 0176, 0213, 0112, 0112, 0155, 0115, 0364, 0165, + 0363, 0041, 0321, 0026, 0204, 0104, 0067, 0235, 0277, 0266, 0003, 0271, 0002, 0035, 0156, 0072, + 0332, 0256, 0025, 0236, 0074, 0216, 0324, 0020, 0104, 0034, 0237, 0171, 0201, 0315, 0351, 0372, + 0020, 0120, 0001, 0151, 0122, 0205, 0131, 0373, 0167, 0074, 0342, 0043, 0303, 0073, 0000, 0226, + 0351, 0114, 0000, 0025, 0220, 0127, 0266, 0217, 0262, 0342, 0214, 0272, 0023, 0117, 0330, 0151, + 0350, 0377, 0375, 0137, 0324, 0156, 0266, 0333, 0232, 0306, 0377, 0173, 0304, 0315, 0074, 0237, + 0121, 0347, 0164, 0160, 0136, 0065, 0060, 0162, 0032, 0264, 0345, 0002, 0053, 0104, 0324, 0257, + 0111, 0200, 0212, 0351, 0302, 0147, 0023, 0076, 0302, 0131, 0163, 0207, 0172, 0266, 0156, 0051, + 0064, 0177, 0145, 0032, 0373, 0330, 0046, 0126, 0370, 0213, 0174, 0027, 0217, 0272, 0107, 0164, + 0207, 0111, 0216, 0001, 0122, 0352, 0066, 0045, 0051, 0207, 0036, 0166, 0114, 0277, 0147, 0154, + 0221, 0035, 0224, 0314, 0055, 0242, 0311, 0040, 0341, 0265, 0104, 0034, 0100, 0344, 0336, 0301, + 0046, 0032, 0115, 0320, 0205, 0207, 0261, 0113, 0036, 0320, 0235, 0107, 0155, 0164, 0301, 0333, + 0210, 0067, 0200, 0163, 0000, 0347, 0200, 0063, 0204, 0173, 0245, 0115, 0014, 0307, 0304, 0107, + 0374, 0355, 0173, 0117, 0267, 0221, 0101, 0155, 0354, 0107, 0005, 0311, 0365, 0221, 0117, 0055, + 0116, 0101, 0026, 0357, 0202, 0242, 0047, 0335, 0343, 0115, 0331, 0344, 0020, 0070, 0004, 0160, + 0210, 0255, 0342, 0020, 0307, 0365, 0113, 0327, 0027, 0377, 0155, 0234, 0210, 0250, 0267, 0122, + 0011, 0212, 0050, 0213, 0054, 0326, 0173, 0044, 0264, 0226, 0365, 0026, 0010, 0031, 0030, 0036, + 0265, 0054, 0154, 0256, 0344, 0040, 0274, 0172, 0120, 0317, 0003, 0001, 0217, 0063, 0262, 0124, + 0155, 0070, 0366, 0303, 0351, 0215, 0164, 0117, 0163, 0251, 0105, 0014, 0316, 0330, 0034, 0374, + 0230, 0316, 0327, 0126, 0263, 0010, 0165, 0276, 0062, 0323, 0310, 0011, 0161, 0224, 0212, 0211, + 0020, 0107, 0343, 0152, 0032, 0343, 0274, 0164, 0126, 0366, 0276, 0335, 0154, 0346, 0355, 0141, + 0126, 0006, 0277, 0365, 0153, 0263, 0254, 0170, 0302, 0067, 0202, 0237, 0134, 0052, 0216, 0246, + 0326, 0137, 0046, 0112, 0023, 0101, 0346, 0046, 0142, 0146, 0214, 0261, 0251, 0221, 0154, 0375, + 0071, 0161, 0051, 0345, 0054, 0223, 0057, 0204, 0213, 0121, 0077, 0325, 0207, 0127, 0170, 0231, + 0313, 0130, 0352, 0274, 0016, 0215, 0277, 0031, 0277, 0104, 0036, 0215, 0145, 0207, 0306, 0041, + 0352, 0130, 0026, 0012, 0137, 0361, 0221, 0207, 0175, 0354, 0075, 0142, 0363, 0360, 0340, 0340, + 0006, 0233, 0304, 0217, 0344, 0030, 0347, 0365, 0341, 0131, 0273, 0300, 0307, 0210, 0070, 0310, + 0247, 0201, 0147, 0340, 0360, 0227, 0021, 0161, 0164, 0157, 0202, 0356, 0270, 0100, 0364, 0337, + 0104, 0272, 0015, 0365, 0302, 0377, 0317, 0027, 0364, 0040, 0312, 0317, 0062, 0302, 0240, 0334, + 0033, 0244, 0173, 0030, 0361, 0061, 0333, 0204, 0211, 0243, 0172, 0174, 0002, 0217, 0304, 0344, + 0377, 0140, 0143, 0235, 0361, 0377, 0140, 0336, 0211, 0145, 0321, 0047, 0121, 0364, 0223, 0143, + 0310, 0014, 0045, 0214, 0057, 0032, 0035, 0330, 0230, 0375, 0343, 0040, 0134, 0212, 0277, 0265, + 0176, 0101, 0313, 0343, 0362, 0021, 0275, 0233, 0015, 0310, 0240, 0046, 0106, 0066, 0327, 0211, + 0370, 0064, 0230, 0316, 0007, 0052, 0172, 0325, 0107, 0364, 0121, 0074, 0232, 0256, 0102, 0330, + 0215, 0103, 0271, 0101, 0206, 0337, 0360, 0347, 0304, 0017, 0217, 0016, 0212, 0116, 0026, 0077, + 0352, 0230, 0257, 0106, 0304, 0077, 0311, 0011, 0207, 0330, 0330, 0073, 0234, 0216, 0244, 0275, + 0072, 0022, 0376, 0305, 0205, 0365, 0230, 0215, 0204, 0117, 0324, 0014, 0370, 0350, 0252, 0030, + 0014, 0377, 0144, 0330, 0207, 0170, 0156, 0162, 0022, 0262, 0147, 0041, 0120, 0321, 0352, 0055, + 0337, 0211, 0350, 0164, 0244, 0255, 0163, 0355, 0120, 0144, 0137, 0314, 0127, 0075, 0334, 0052, + 0376, 0060, 0154, 0276, 0070, 0215, 0331, 0374, 0216, 0176, 0021, 0347, 0371, 0005, 0165, 0211, + 0361, 0204, 0203, 0017, 0370, 0256, 0212, 0316, 0046, 0141, 0215, 0326, 0021, 0026, 0364, 0300, + 0307, 0106, 0303, 0006, 0334, 0020, 0246, 0036, 0247, 0017, 0376, 0006, 0377, 0210, 0115, 0271, + 0362, 0024, 0315, 0234, 0123, 0225, 0311, 0277, 0316, 0211, 0052, 0062, 0207, 0303, 0171, 0372, + 0364, 0216, 0075, 0011, 0202, 0230, 0221, 0212, 0350, 0302, 0167, 0261, 0041, 0350, 0205, 0067, + 0044, 0202, 0212, 0074, 0101, 0051, 0116, 0104, 0063, 0276, 0037, 0215, 0155, 0170, 0331, 0033, + 0240, 0101, 0377, 0142, 0370, 0275, 0163, 0323, 0105, 0374, 0337, 0327, 0067, 0375, 0157, 0275, + 0363, 0356, 0071, 0072, 0375, 0201, 0206, 0227, 0135, 0324, 0271, 0035, 0136, 0366, 0157, 0320, + 0177, 0377, 0167, 0147, 0300, 0037, 0377, 0307, 0177, 0240, 0316, 0325, 0071, 0377, 0277, 0037, + 0250, 0373, 0357, 0353, 0233, 0356, 0140, 0200, 0372, 0067, 0007, 0275, 0257, 0327, 0137, 0172, + 0274, 0011, 0357, 0343, 0246, 0163, 0065, 0354, 0165, 0007, 0157, 0120, 0357, 0352, 0354, 0313, + 0355, 0171, 0357, 0352, 0323, 0033, 0164, 0172, 0073, 0104, 0127, 0375, 0041, 0372, 0322, 0373, + 0332, 0033, 0362, 0327, 0206, 0375, 0067, 0141, 0327, 0323, 0146, 0007, 0363, 0146, 0250, 0177, + 0201, 0276, 0166, 0157, 0316, 0056, 0371, 0237, 0235, 0323, 0336, 0227, 0336, 0360, 0107, 0370, + 0275, 0213, 0336, 0360, 0112, 0174, 0353, 0202, 0217, 0244, 0203, 0256, 0073, 0067, 0303, 0336, + 0331, 0355, 0227, 0316, 0015, 0272, 0276, 0275, 0271, 0356, 0017, 0370, 0050, 0157, 0272, 0007, + 0347, 0275, 0301, 0331, 0227, 0116, 0357, 0153, 0227, 0103, 0260, 0167, 0305, 0277, 0210, 0272, + 0337, 0272, 0127, 0103, 0064, 0270, 0354, 0174, 0371, 0262, 0070, 0227, 0323, 0056, 0037, 0112, + 0347, 0364, 0113, 0067, 0352, 0217, 0317, 0345, 0274, 0167, 0323, 0075, 0033, 0276, 0071, 0350, + 0135, 0115, 0377, 0045, 0206, 0317, 0127, 0201, 0217, 0342, 0313, 0033, 0064, 0270, 0356, 0236, + 0365, 0304, 0077, 0272, 0377, 0356, 0362, 0041, 0167, 0156, 0176, 0274, 0341, 0263, 0106, 0147, + 0375, 0253, 0101, 0367, 0137, 0267, 0374, 0045, 0376, 0020, 0235, 0167, 0276, 0166, 0076, 0165, + 0007, 0007, 0177, 0313, 0230, 0070, 0137, 0337, 0263, 0333, 0233, 0356, 0127, 0061, 0062, 0076, + 0333, 0301, 0355, 0351, 0140, 0330, 0033, 0336, 0016, 0273, 0350, 0123, 0277, 0177, 0036, 0056, + 0347, 0240, 0173, 0363, 0255, 0167, 0326, 0035, 0374, 0206, 0276, 0364, 0007, 0341, 0232, 0334, + 0016, 0272, 0157, 0370, 0027, 0206, 0235, 0360, 0303, 0274, 0013, 0276, 0040, 0374, 0261, 0230, + 0313, 0355, 0240, 0027, 0056, 0115, 0357, 0152, 0330, 0275, 0271, 0271, 0275, 0036, 0366, 0372, + 0127, 0277, 0034, 0134, 0366, 0277, 0363, 0311, 0363, 0061, 0166, 0170, 0323, 0363, 0160, 0015, + 0373, 0127, 0341, 0124, 0371, 0072, 0364, 0157, 0176, 0210, 0116, 0305, 0032, 0204, 0113, 0374, + 0006, 0175, 0277, 0354, 0362, 0337, 0157, 0304, 0262, 0205, 0111, 0237, 0035, 0261, 0030, 0203, + 0341, 0115, 0357, 0154, 0270, 0370, 0032, 0377, 0336, 0260, 0177, 0063, 0104, 0363, 0071, 0242, + 0253, 0356, 0247, 0057, 0275, 0117, 0335, 0253, 0263, 0256, 0170, 0332, 0027, 0275, 0174, 0357, + 0015, 0272, 0277, 0360, 0035, 0351, 0361, 0221, 0175, 0342, 0113, 0032, 0176, 0366, 0173, 0207, + 0177, 0363, 0066, 0234, 0262, 0330, 0011, 0076, 0252, 0350, 0237, 0013, 0324, 0367, 0046, 0334, + 0057, 0324, 0273, 0100, 0235, 0363, 0157, 0075, 0061, 0354, 0350, 0345, 0003, 0276, 0303, 0203, + 0336, 0224, 0032, 0302, 0045, 0073, 0273, 0234, 0056, 0367, 0141, 0036, 0336, 0256, 0152, 0246, + 0111, 0232, 0152, 0071, 0142, 0054, 0037, 0222, 0155, 0246, 0022, 0054, 0267, 0222, 0254, 0267, + 0022, 0054, 0070, 0031, 0053, 0056, 0313, 0222, 0113, 0161, 0202, 0244, 0065, 0134, 0203, 0135, + 0324, 0052, 0307, 0056, 0232, 0252, 0113, 0052, 0235, 0225, 0174, 0224, 0172, 0213, 0222, 0342, + 0332, 0160, 0322, 0153, 0075, 0047, 0275, 0302, 0164, 0300, 0001, 0327, 0052, 0270, 0321, 0340, + 0325, 0052, 0251, 0232, 0353, 0104, 0234, 0221, 0142, 0252, 0174, 0133, 0124, 0224, 0340, 0070, + 0117, 0166, 0224, 0315, 0213, 0206, 0203, 0132, 0033, 0076, 0250, 0065, 0073, 0275, 0003, 0107, + 0265, 0112, 0072, 0252, 0165, 0032, 0130, 0026, 0147, 0247, 0365, 0074, 0254, 0265, 0060, 0070, + 0070, 0256, 0265, 0321, 0343, 0132, 0323, 0235, 0330, 0266, 0013, 0067, 0341, 0056, 0314, 0334, + 0167, 0141, 0246, 0125, 0354, 0123, 0256, 0322, 0247, 0134, 0235, 0072, 0117, 0051, 0277, 0322, + 0316, 0237, 0111, 0351, 0025, 0245, 0336, 0271, 0051, 0056, 0130, 0026, 0176, 0156, 0053, 0260, + 0035, 0377, 0143, 0213, 0377, 0333, 0243, 0117, 0376, 0307, 0343, 0360, 0146, 0345, 0064, 0335, + 0342, 0223, 0107, 0314, 0072, 0251, 0144, 0262, 0305, 0316, 0363, 0025, 0072, 0137, 0331, 0050, + 0031, 0217, 0170, 0056, 0067, 0372, 0312, 0172, 0204, 0133, 0243, 0311, 0153, 0234, 0222, 0141, + 0251, 0013, 0117, 0330, 0220, 0213, 0054, 0366, 0023, 0327, 0065, 0242, 0137, 0353, 0134, 0076, + 0105, 0173, 0251, 0215, 0231, 0073, 0222, 0224, 0246, 0376, 0145, 0204, 0161, 0226, 0341, 0162, + 0064, 0203, 0113, 0373, 0025, 0134, 0224, 0140, 0123, 0313, 0220, 0317, 0224, 0354, 0322, 0017, + 0304, 0226, 0111, 0267, 0305, 0002, 0077, 0073, 0023, 0341, 0351, 0007, 0216, 0201, 0375, 0074, + 0175, 0052, 0346, 0217, 0124, 0347, 0130, 0114, 0256, 0175, 0130, 0216, 0053, 0056, 0053, 0261, + 0042, 0166, 0301, 0361, 0035, 0323, 0370, 0207, 0165, 0143, 0234, 0171, 0010, 0047, 0301, 0167, + 0106, 0135, 0225, 0016, 0122, 0262, 0045, 0062, 0334, 0211, 0352, 0020, 0130, 0250, 0112, 0275, + 0300, 0312, 0043, 0112, 0312, 0250, 0111, 0135, 0065, 0102, 0362, 0166, 0221, 0131, 0241, 0354, + 0052, 0260, 0107, 0330, 0023, 0321, 0054, 0232, 0033, 0061, 0143, 0245, 0372, 0322, 0261, 0113, + 0125, 0270, 0007, 0133, 0177, 0326, 0054, 0354, 0334, 0213, 0004, 0205, 0126, 0056, 0302, 0124, + 0250, 0025, 0035, 0353, 0337, 0220, 0251, 0027, 0115, 0377, 0314, 0025, 0354, 0120, 0257, 0375, + 0274, 0015, 0350, 0157, 0325, 0013, 0375, 0073, 0046, 0000, 0257, 0075, 0154, 0223, 0300, 0006, + 0011, 0130, 0045, 0006, 0132, 0173, 0041, 0001, 0247, 0244, 0264, 0253, 0042, 0160, 0072, 0075, + 0221, 0122, 0021, 0011, 0101, 0220, 0201, 0125, 0312, 0300, 0122, 0226, 0273, 0226, 0022, 0261, + 0005, 0022, 0261, 0336, 0111, 0177, 0076, 0003, 0161, 0130, 0045, 0000, 0332, 0173, 0041, 0016, + 0005, 0035, 0355, 0252, 0054, 0024, 0163, 0003, 0101, 0270, 0036, 0101, 0130, 0174, 0255, 0153, + 0051, 0005, 0333, 0265, 0226, 0202, 0312, 0111, 0146, 0257, 0322, 0155, 0254, 0104, 0231, 0270, + 0223, 0147, 0365, 0004, 0277, 0333, 0215, 0133, 0137, 0052, 0313, 0041, 0224, 0167, 0212, 0344, + 0224, 0174, 0125, 0034, 0246, 0132, 0215, 0132, 0015, 0210, 0365, 0210, 0075, 0331, 0270, 0025, + 0204, 0237, 0040, 0374, 0004, 0341, 0047, 0010, 0077, 0101, 0370, 0011, 0314, 0155, 0160, 0100, + 0203, 0003, 0272, 0072, 0213, 0073, 0322, 0113, 0040, 0010, 0013, 0166, 0067, 0004, 0141, 0167, + 0077, 0010, 0233, 0204, 0177, 0010, 0101, 0001, 0007, 0200, 0020, 0024, 0204, 0240, 0040, 0004, + 0005, 0012, 0361, 0236, 0207, 0240, 0042, 0201, 0010, 0101, 0050, 0020, 0205, 0020, 0204, 0202, + 0040, 0324, 0076, 0004, 0241, 0042, 0216, 0007, 0141, 0250, 0065, 0204, 0241, 0132, 0233, 0016, + 0103, 0135, 0213, 0272, 0300, 0116, 0140, 0103, 0040, 0012, 0002, 0121, 0020, 0210, 0202, 0100, + 0024, 0004, 0242, 0300, 0350, 0206, 0100, 0024, 0004, 0242, 0066, 0157, 0167, 0317, 0064, 0023, + 0010, 0105, 0201, 0365, 0015, 0241, 0250, 0175, 0014, 0105, 0315, 0070, 0000, 0004, 0243, 0200, + 0007, 0100, 0060, 0012, 0202, 0121, 0020, 0214, 0002, 0245, 0170, 0317, 0203, 0121, 0063, 0221, + 0010, 0341, 0050, 0020, 0206, 0020, 0216, 0202, 0160, 0324, 0356, 0204, 0243, 0144, 0353, 0340, + 0345, 0360, 0107, 0115, 0171, 0046, 0004, 0264, 0326, 0020, 0320, 0152, 0157, 0074, 0240, 0245, + 0133, 0226, 0156, 0022, 0210, 0150, 0101, 0104, 0013, 0042, 0132, 0020, 0321, 0202, 0210, 0026, + 0130, 0356, 0020, 0321, 0202, 0210, 0126, 0055, 0214, 0367, 0231, 0152, 0002, 0041, 0055, 0260, + 0340, 0041, 0244, 0265, 0227, 0041, 0255, 0031, 0013, 0200, 0230, 0026, 0060, 0001, 0210, 0151, + 0101, 0114, 0013, 0142, 0132, 0240, 0026, 0357, 0173, 0114, 0153, 0046, 0023, 0041, 0250, 0005, + 0322, 0020, 0202, 0132, 0020, 0324, 0332, 0235, 0240, 0126, 0212, 0113, 0151, 0306, 0364, 0040, + 0052, 0265, 0206, 0250, 0324, 0121, 0245, 0121, 0251, 0204, 0020, 0114, 0053, 0046, 0004, 0043, + 0035, 0176, 0251, 0305, 0305, 0125, 0231, 0227, 0316, 0045, 0065, 0344, 0363, 0127, 0213, 0263, + 0224, 0021, 0253, 0111, 0011, 0222, 0255, 0254, 0372, 0031, 0265, 0107, 0224, 0253, 0031, 0303, + 0120, 0206, 0054, 0050, 0043, 0263, 0007, 0333, 0300, 0135, 0324, 0064, 0202, 0327, 0255, 0303, + 0053, 0061, 0261, 0204, 0176, 0030, 0337, 0120, 0023, 0144, 0233, 0335, 0226, 0060, 0154, 0047, + 0063, 0056, 0361, 0064, 0271, 0014, 0252, 0170, 0252, 0334, 0164, 0166, 0170, 0065, 0127, 0343, + 0171, 0252, 0100, 0276, 0346, 0163, 0246, 0236, 0334, 0076, 0172, 0246, 0310, 0137, 0263, 0224, + 0207, 0142, 0156, 0265, 0002, 0346, 0103, 0212, 0302, 0220, 0041, 0367, 0345, 0200, 0072, 0275, + 0006, 0172, 0021, 0242, 0375, 0317, 0247, 0303, 0253, 0065, 0343, 0063, 0157, 0163, 0251, 0353, + 0236, 0223, 0361, 0355, 0027, 0353, 0100, 0355, 0326, 0351, 0002, 0266, 0215, 0155, 0023, 0206, + 0316, 0306, 0272, 0163, 0237, 0355, 0356, 0057, 0227, 0213, 0251, 0331, 0064, 0373, 0036, 0312, + 0377, 0274, 0273, 0216, 0226, 0164, 0047, 0305, 0312, 0335, 0320, 0264, 0310, 0045, 0343, 0025, + 0363, 0353, 0366, 0366, 0360, 0353, 0344, 0313, 0336, 0267, 0300, 0052, 0170, 0127, 0206, 0125, + 0020, 0067, 0231, 0370, 0211, 0274, 0036, 0312, 0354, 0126, 0135, 0245, 0353, 0202, 0357, 0210, + 0145, 0251, 0135, 0304, 0073, 0277, 0135, 0071, 0141, 0241, 0142, 0346, 0372, 0152, 0236, 0211, + 0327, 0241, 0277, 0262, 0341, 0031, 0141, 0026, 0036, 0351, 0136, 0043, 0371, 0272, 0356, 0113, + 0254, 0163, 0132, 0071, 0135, 0170, 0147, 0103, 0227, 0166, 0373, 0143, 0156, 0243, 0030, 0342, + 0016, 0172, 0155, 0024, 0351, 0030, 0311, 0237, 0133, 0231, 0143, 0043, 0375, 0216, 0351, 0070, + 0261, 0261, 0321, 0113, 0246, 0223, 0105, 0302, 0124, 0247, 0112, 0354, 0050, 0231, 0055, 0027, + 0346, 0377, 0111, 0074, 0177, 0025, 0121, 0053, 0260, 0213, 0271, 0020, 0174, 0145, 0023, 0276, + 0142, 0047, 0230, 0152, 0217, 0325, 0356, 0204, 0112, 0263, 0260, 0211, 0106, 0035, 0055, 0024, + 0072, 0212, 0273, 0250, 0246, 0316, 0255, 0266, 0266, 0010, 0276, 0113, 0317, 0065, 0135, 0345, + 0035, 0156, 0340, 0276, 0020, 0211, 0130, 0121, 0331, 0226, 0201, 0057, 0356, 0165, 0167, 0051, + 0267, 0305, 0262, 0146, 0031, 0057, 0043, 0222, 0045, 0113, 0274, 0153, 0146, 0105, 0302, 0337, + 0025, 0221, 0360, 0231, 0064, 0230, 0310, 0022, 0027, 0037, 0254, 0022, 0145, 0307, 0024, 0221, + 0057, 0233, 0053, 0253, 0221, 0111, 0163, 0246, 0373, 0343, 0205, 0337, 0246, 0275, 0275, 0136, + 0113, 0327, 0025, 0253, 0330, 0152, 0056, 0374, 0357, 0365, 0152, 0256, 0260, 0067, 0206, 0135, + 0215, 0070, 0206, 0207, 0243, 0216, 0133, 0331, 0115, 0134, 0375, 0036, 0057, 0067, 0131, 0156, + 0221, 0076, 0063, 0101, 0034, 0363, 0071, 0205, 0177, 0305, 0177, 0046, 0025, 0156, 0252, 0014, + 0157, 0231, 0170, 0342, 0107, 0325, 0343, 0346, 0366, 0362, 0310, 0316, 0254, 0320, 0255, 0277, + 0131, 0001, 0224, 0314, 0223, 0177, 0206, 0343, 0223, 0351, 0103, 0240, 0054, 0160, 0070, 0104, + 0054, 0342, 0244, 0015, 0167, 0005, 0034, 0306, 0034, 0034, 0241, 0073, 0107, 0147, 0130, 0022, + 0035, 0071, 0011, 0377, 0073, 0161, 0114, 0372, 0064, 0337, 0206, 0351, 0337, 0071, 0167, 0135, + 0325, 0322, 0136, 0345, 0205, 0076, 0371, 0123, 0017, 0267, 0130, 0352, 0003, 0134, 0252, 0061, + 0217, 0116, 0264, 0047, 0302, 0306, 0232, 0253, 0173, 0041, 0076, 0144, 0076, 0104, 0014, 0041, + 0176, 0006, 0214, 0032, 0017, 0276, 0046, 0376, 0070, 0164, 0235, 0373, 0114, 0354, 0076, 0160, + 0153, 0133, 0240, 0321, 0323, 0306, 0044, 0361, 0113, 0031, 0224, 0277, 0354, 0303, 0334, 0010, + 0205, 0313, 0034, 0351, 0111, 0150, 0203, 0205, 0142, 0254, 0324, 0142, 0104, 0271, 0250, 0267, + 0023, 0374, 0324, 0257, 0333, 0120, 0217, 0360, 0055, 0324, 0043, 0265, 0230, 0213, 0050, 0106, + 0014, 0335, 0222, 0151, 0070, 0322, 0175, 0054, 0260, 0246, 0315, 0265, 0152, 0156, 0121, 0044, + 0053, 0215, 0113, 0062, 0145, 0071, 0116, 0320, 0112, 0212, 0023, 0110, 0305, 0010, 0066, 0252, + 0116, 0112, 0305, 0005, 0362, 0354, 0123, 0254, 0177, 0150, 0146, 0047, 0051, 0051, 0073, 0052, + 0001, 0210, 0242, 0301, 0007, 0331, 0303, 0112, 0003, 0227, 0070, 0213, 0376, 0114, 0301, 0007, + 0303, 0337, 0142, 0335, 0231, 0125, 0104, 0200, 0124, 0233, 0146, 0272, 0376, 0206, 0143, 0214, + 0134, 0352, 0261, 0073, 0312, 0025, 0104, 0144, 0360, 0011, 0105, 0272, 0377, 0241, 0312, 0127, + 0344, 0075, 0200, 0371, 0275, 0177, 0151, 0044, 0334, 0072, 0316, 0321, 0162, 0106, 0307, 0252, + 0215, 0027, 0022, 0050, 0336, 0253, 0264, 0174, 0042, 0046, 0227, 0075, 0306, 0130, 0367, 0174, + 0325, 0246, 0211, 0273, 0327, 0074, 0154, 0052, 0071, 0117, 0044, 0223, 0067, 0162, 0045, 0155, + 0374, 0057, 0376, 0077, 0225, 0116, 0137, 0245, 0150, 0230, 0344, 0236, 0060, 0137, 0275, 0003, + 0041, 0140, 0105, 0300, 0151, 0370, 0371, 0147, 0357, 0352, 0372, 0166, 0370, 0363, 0262, 0167, + 0065, 0374, 0171, 0325, 0377, 0331, 0375, 0332, 0377, 0337, 0075, 0364, 0177, 0320, 0312, 0223, + 0253, 0256, 0312, 0127, 0364, 0005, 0345, 0176, 0131, 0331, 0127, 0202, 0260, 0105, 0354, 0221, + 0346, 0011, 0055, 0055, 0064, 0003, 0124, 0332, 0106, 0053, 0223, 0341, 0125, 0174, 0335, 0310, + 0011, 0154, 0354, 0021, 0043, 0213, 0143, 0354, 0324, 0155, 0176, 0033, 0361, 0344, 0051, 0065, + 0051, 0301, 0225, 0047, 0241, 0230, 0034, 0155, 0257, 0142, 0122, 0225, 0344, 0176, 0055, 0265, + 0223, 0102, 0220, 0165, 0220, 0331, 0112, 0141, 0307, 0102, 0041, 0307, 0342, 0341, 0306, 0012, + 0103, 0215, 0033, 0121, 0062, 0024, 0002, 0333, 0073, 0220, 0303, 0226, 0035, 0116, 0334, 0352, + 0344, 0265, 0112, 0302, 0206, 0045, 0113, 0314, 0126, 0075, 0357, 0277, 0125, 0165, 0336, 0226, + 0320, 0313, 0066, 0111, 0357, 0026, 0004, 0342, 0040, 0020, 0367, 0132, 0262, 0161, 0265, 0002, + 0242, 0160, 0020, 0205, 0113, 0216, 0302, 0315, 0242, 0027, 0020, 0202, 0053, 0024, 0211, 0230, + 0007, 0252, 0056, 0211, 0317, 0207, 0072, 0251, 0147, 0254, 0152, 0141, 0160, 0141, 0070, 0150, + 0331, 0340, 0200, 0210, 0325, 0132, 0043, 0126, 0323, 0315, 0050, 0065, 0150, 0065, 0145, 0037, + 0132, 0350, 0330, 0153, 0234, 0374, 0275, 0175, 0054, 0333, 0142, 0214, 0311, 0375, 0230, 0363, + 0235, 0017, 0331, 0061, 0135, 0271, 0370, 0123, 0006, 0141, 0016, 0014, 0217, 0132, 0026, 0066, + 0143, 0126, 0344, 0325, 0243, 0152, 0010, 0124, 0266, 0311, 0122, 0111, 0055, 0342, 0110, 0005, + 0202, 0070, 0163, 0264, 0364, 0211, 0346, 0207, 0363, 0010, 0353, 0112, 0045, 0303, 0101, 0102, + 0334, 0175, 0043, 0370, 0111, 0370, 0303, 0067, 0252, 0163, 0310, 0234, 0122, 0171, 0211, 0076, + 0035, 0355, 0367, 0051, 0025, 0271, 0162, 0142, 0352, 0365, 0327, 0216, 0166, 0265, 0376, 0332, + 0232, 0312, 0247, 0055, 0061, 0031, 0301, 0276, 0006, 0023, 0173, 0104, 0255, 0055, 0110, 0310, + 0206, 0202, 0010, 0151, 0333, 0235, 0236, 0060, 0014, 0275, 0103, 0357, 0133, 0325, 0073, 0234, + 0330, 0312, 0322, 0026, 0353, 0177, 0116, 0113, 0052, 0301, 0044, 0161, 0340, 0105, 0032, 0333, + 0104, 0150, 0016, 0016, 0303, 0316, 0134, 0251, 0127, 0257, 0174, 0054, 0376, 0324, 0357, 0271, + 0075, 0244, 0071, 0072, 0013, 0074, 0335, 0172, 0351, 0253, 0012, 0361, 0074, 0364, 0060, 0026, + 0132, 0356, 0222, 0204, 0176, 0371, 0161, 0273, 0252, 0166, 0170, 0230, 0172, 0034, 0366, 0172, + 0241, 0161, 0214, 0205, 0015, 0241, 0371, 0334, 0132, 0065, 0042, 0357, 0156, 0336, 0216, 0260, + 0043, 0006, 0242, 0335, 0163, 0175, 0120, 0023, 0326, 0061, 0237, 0330, 0210, 0262, 0161, 0201, + 0256, 0030, 0337, 0226, 0131, 0127, 0171, 0107, 0065, 0063, 0266, 0205, 0273, 0314, 0347, 0134, + 0203, 0167, 0073, 0365, 0232, 0111, 0367, 0030, 0171, 0155, 0211, 0210, 0236, 0161, 0373, 0135, + 0013, 0377, 0344, 0326, 0332, 0174, 0305, 0322, 0116, 0231, 0305, 0022, 0340, 0340, 0245, 0155, + 0352, 0231, 0262, 0164, 0322, 0316, 0173, 0234, 0254, 0216, 0074, 0277, 0265, 0126, 0236, 0277, + 0067, 0065, 0247, 0225, 0353, 0030, 0154, 0322, 0160, 0132, 0250, 0254, 0064, 0063, 0234, 0102, + 0233, 0151, 0127, 0113, 0052, 0165, 0220, 0057, 0014, 0103, 0344, 0207, 0263, 0074, 0334, 0205, + 0232, 0112, 0107, 0265, 0255, 0251, 0024, 0221, 0022, 0224, 0025, 0254, 0151, 0125, 0265, 0305, + 0004, 0245, 0051, 0370, 0057, 0060, 0063, 0306, 0347, 0174, 0023, 0223, 0253, 0045, 0324, 0025, + 0372, 0312, 0225, 0023, 0012, 0247, 0062, 0225, 0227, 0322, 0224, 0233, 0235, 0235, 0323, 0047, + 0307, 0242, 0272, 0211, 0114, 0376, 0063, 0272, 0363, 0250, 0215, 0176, 0350, 0143, 0112, 0377, + 0202, 0056, 0210, 0243, 0157, 0274, 0150, 0034, 0166, 0314, 0174, 0334, 0115, 0322, 0071, 0133, + 0364, 0330, 0200, 0074, 0172, 0144, 0335, 0216, 0163, 0000, 0061, 0047, 0313, 0357, 0130, 0012, + 0222, 0312, 0361, 0077, 0252, 0306, 0356, 0076, 0141, 0206, 0304, 0054, 0363, 0366, 0234, 0243, + 0224, 0247, 0144, 0152, 0130, 0351, 0051, 0142, 0051, 0135, 0372, 0154, 0302, 0267, 0152, 0326, + 0235, 0103, 0075, 0133, 0267, 0162, 0164, 0363, 0024, 0131, 0336, 0205, 0373, 0171, 0324, 0075, + 0242, 0073, 0252, 0035, 0311, 0124, 0321, 0220, 0021, 0256, 0231, 0266, 0123, 0134, 0200, 0326, + 0054, 0243, 0242, 0006, 0070, 0320, 0301, 0325, 0012, 0216, 0134, 0271, 0072, 0060, 0352, 0106, + 0175, 0374, 0044, 0245, 0222, 0051, 0367, 0040, 0021, 0061, 0112, 0050, 0214, 0023, 0221, 0221, + 0102, 0040, 0316, 0210, 0046, 0112, 0312, 0225, 0134, 0204, 0140, 0224, 0334, 0237, 0350, 0004, + 0135, 0173, 0364, 0221, 0230, 0330, 0104, 0243, 0211, 0204, 0242, 0127, 0070, 0153, 0022, 0322, + 0364, 0326, 0224, 0246, 0267, 0220, 0270, 0005, 0371, 0166, 0313, 0371, 0166, 0224, 0361, 0141, + 0372, 0065, 0315, 0267, 0233, 0017, 0016, 0312, 0103, 0154, 0066, 0331, 0056, 0332, 0211, 0315, + 0126, 0210, 0230, 0231, 0275, 0141, 0361, 0202, 0254, 0227, 0123, 0043, 0210, 0305, 0153, 0117, + 0054, 0345, 0011, 0152, 0055, 0325, 0064, 0101, 0231, 0026, 0165, 0057, 0157, 0221, 0020, 0161, + 0170, 0267, 0020, 0161, 0310, 0214, 0062, 0354, 0176, 0015, 0214, 0350, 0064, 0173, 0236, 0252, + 0031, 0162, 0215, 0226, 0022, 0346, 0132, 0122, 0225, 0066, 0136, 0337, 0332, 0251, 0324, 0112, + 0052, 0144, 0222, 0171, 0236, 0365, 0135, 0034, 0265, 0110, 0307, 0245, 0066, 0172, 0134, 0144, + 0171, 0301, 0233, 0212, 0307, 0140, 0263, 0163, 0033, 0145, 0317, 0277, 0166, 0174, 0227, 0377, + 0040, 0173, 0243, 0356, 0106, 0262, 0100, 0313, 0272, 0212, 0227, 0006, 0154, 0357, 0216, 0170, + 0162, 0351, 0145, 0346, 0311, 0074, 0231, 0204, 0355, 0216, 0313, 0073, 0121, 0172, 0306, 0074, + 0113, 0265, 0067, 0045, 0377, 0343, 0326, 0336, 0140, 0320, 0134, 0357, 0275, 0332, 0000, 0170, + 0000, 0074, 0000, 0176, 0223, 0200, 0157, 0001, 0340, 0001, 0360, 0000, 0370, 0375, 0001, 0174, + 0173, 0275, 0200, 0117, 0042, 0335, 0132, 0100, 0375, 0071, 0233, 0354, 0344, 0111, 0356, 0077, + 0125, 0272, 0221, 0246, 0265, 0375, 0050, 0344, 0001, 0162, 0002, 0344, 0304, 0106, 0344, 0304, + 0305, 0116, 0013, 0211, 0066, 0240, 0035, 0320, 0016, 0150, 0177, 0101, 0373, 0015, 0240, 0275, + 0006, 0066, 0140, 0255, 0125, 0302, 0161, 0132, 0100, 0056, 0247, 0214, 0041, 0326, 0372, 0152, + 0233, 0036, 0155, 0011, 0313, 0337, 0067, 0042, 0230, 0246, 0153, 0324, 0237, 0016, 0200, 0031, + 0124, 0112, 0007, 0377, 0012, 0010, 0253, 0077, 0021, 0200, 0223, 0240, 0122, 0042, 0310, 0316, + 0205, 0257, 0013, 0041, 0034, 0201, 0041, 0000, 0206, 0300, 0356, 0031, 0002, 0347, 0140, 0010, + 0000, 0332, 0001, 0355, 0020, 0014, 0332, 0363, 0140, 0020, 0000, 0036, 0000, 0277, 0203, 0200, + 0377, 0027, 0210, 0167, 0260, 0352, 0040, 0364, 0133, 0122, 0350, 0027, 0074, 0102, 0100, 0066, + 0300, 0155, 0200, 0154, 0326, 0103, 0066, 0107, 0233, 0275, 0143, 0115, 0116, 0257, 0316, 0301, + 0056, 0163, 0336, 0231, 0126, 0377, 0273, 0106, 0244, 0374, 0243, 0052, 0276, 0121, 0007, 0173, + 0272, 0125, 0306, 0035, 0045, 0257, 0252, 0144, 0214, 0250, 0145, 0346, 0277, 0226, 0144, 0175, + 0004, 0124, 0345, 0245, 0173, 0057, 0207, 0224, 0336, 0303, 0041, 0045, 0070, 0244, 0004, 0106, + 0054, 0170, 0255, 0340, 0220, 0022, 0000, 0036, 0000, 0017, 0200, 0207, 0103, 0112, 0000, 0170, + 0000, 0074, 0000, 0176, 0037, 0017, 0051, 0001, 0340, 0001, 0360, 0000, 0170, 0010, 0104, 0003, + 0340, 0001, 0360, 0000, 0370, 0265, 0000, 0376, 0035, 0000, 0036, 0000, 0017, 0200, 0337, 0037, + 0300, 0037, 0003, 0340, 0001, 0360, 0273, 0007, 0370, 0056, 0244, 0232, 0201, 0213, 0036, 0320, + 0276, 0047, 0150, 0037, 0000, 0332, 0301, 0077, 0017, 0150, 0337, 0023, 0264, 0237, 0002, 0332, + 0301, 0071, 0017, 0150, 0337, 0027, 0323, 0035, 0320, 0016, 0236, 0171, 0100, 0373, 0236, 0240, + 0275, 0007, 0150, 0007, 0267, 0074, 0240, 0175, 0117, 0320, 0176, 0015, 0150, 0257, 0201, 0117, + 0176, 0337, 0312, 0374, 0164, 0115, 0302, 0266, 0341, 0254, 0026, 0324, 0214, 0253, 0047, 0375, + 0014, 0260, 0021, 0170, 0204, 0021, 0354, 0357, 0064, 0025, 0301, 0371, 0342, 0112, 0251, 0350, + 0064, 0260, 0054, 0102, 0235, 0235, 0046, 0041, 0070, 0153, 0134, 0051, 0011, 0235, 0351, 0376, + 0170, 0247, 0351, 0347, 0010, 0350, 0247, 0112, 0372, 0351, 0134, 0367, 0166, 0232, 0174, 0336, + 0001, 0371, 0124, 0111, 0076, 0327, 0036, 0276, 0303, 0036, 0166, 0214, 0035, 0127, 0204, 0300, + 0034, 0203, 0212, 0031, 0140, 0205, 0001, 0331, 0254, 0207, 0154, 0300, 0354, 0002, 0262, 0001, + 0123, 0013, 0310, 0146, 0075, 0144, 0003, 0026, 0026, 0220, 0015, 0130, 0126, 0100, 0066, 0353, + 0041, 0233, 0343, 0032, 0025, 0221, 0153, 0155, 0276, 0210, 0134, 0102, 0015, 0260, 0043, 0250, + 0001, 0066, 0001, 0017, 0214, 0324, 0355, 0105, 0330, 0162, 0041, 0222, 0011, 0171, 0057, 0220, + 0367, 0262, 0135, 0171, 0057, 0227, 0220, 0367, 0002, 0150, 0007, 0264, 0357, 0011, 0332, 0077, + 0003, 0332, 0341, 0164, 0032, 0240, 0175, 0117, 0320, 0336, 0001, 0264, 0303, 0351, 0064, 0100, + 0373, 0236, 0240, 0035, 0012, 0313, 0200, 0062, 0017, 0200, 0007, 0300, 0003, 0340, 0101, 0237, + 0007, 0300, 0003, 0340, 0241, 0032, 0064, 0244, 0327, 0226, 0025, 0334, 0241, 0354, 0001, 0117, + 0340, 0214, 0021, 0220, 0120, 0176, 0137, 0304, 0050, 0113, 0164, 0300, 0011, 0043, 0110, 0104, + 0201, 0334, 0154, 0040, 0033, 0040, 0033, 0020, 0127, 0100, 0066, 0165, 0316, 0315, 0056, 0051, + 0355, 0255, 0015, 0167, 0247, 0256, 0375, 0356, 0324, 0113, 0342, 0063, 0352, 0115, 0320, 0167, + 0342, 0160, 0243, 0176, 0217, 0257, 0120, 0155, 0257, 0043, 0175, 0262, 0015, 0351, 0223, 0220, + 0076, 0051, 0171, 0247, 0061, 0103, 0347, 0374, 0027, 0110, 0241, 0004, 0023, 0073, 0267, 0173, + 0320, 0242, 0152, 0143, 0000, 0037, 0015, 0370, 0365, 0301, 0257, 0277, 0171, 0277, 0376, 0071, + 0344, 0351, 0100, 0330, 0036, 0320, 0276, 0057, 0121, 0074, 0100, 0073, 0310, 0166, 0100, 0073, + 0304, 0354, 0041, 0053, 0017, 0000, 0017, 0200, 0007, 0300, 0103, 0126, 0036, 0204, 0254, 0040, + 0144, 0005, 0136, 0103, 0040, 0233, 0332, 0005, 0310, 0067, 0031, 0241, 0072, 0202, 0110, 0147, + 0221, 0110, 0347, 0102, 0111, 0320, 0235, 0212, 0166, 0266, 0152, 0033, 0355, 0174, 0007, 0321, + 0116, 0210, 0166, 0312, 0135, 0133, 0060, 0246, 0117, 0350, 0314, 0242, 0306, 0203, 0017, 0001, + 0117, 0010, 0170, 0026, 0042, 0243, 0236, 0143, 0022, 0003, 0356, 0277, 0000, 0072, 0052, 0226, + 0174, 0061, 0230, 0330, 0134, 0230, 0373, 0220, 0241, 0016, 0144, 0004, 0371, 0027, 0160, 0323, + 0047, 0270, 0154, 0367, 0310, 0145, 0373, 0137, 0020, 0221, 0205, 0000, 0015, 0240, 0175, 0117, + 0320, 0376, 0157, 0100, 0073, 0344, 0137, 0000, 0332, 0367, 0004, 0355, 0003, 0100, 0073, 0324, + 0100, 0003, 0264, 0103, 0156, 0345, 0076, 0243, 0035, 0354, 0166, 0100, 0073, 0244, 0132, 0101, + 0156, 0045, 0000, 0036, 0000, 0017, 0200, 0207, 0334, 0112, 0000, 0074, 0000, 0036, 0000, 0277, + 0325, 0200, 0007, 0003, 0036, 0000, 0017, 0200, 0337, 0043, 0300, 0303, 0365, 0250, 0220, 0006, + 0017, 0051, 0210, 0100, 0066, 0133, 0164, 0172, 0002, 0310, 0006, 0312, 0013, 0002, 0331, 0000, + 0331, 0254, 0107, 0267, 0331, 0344, 0371, 0032, 0070, 0253, 0125, 0350, 0254, 0126, 0237, 0215, + 0261, 0067, 0075, 0245, 0345, 0357, 0306, 0061, 0255, 0166, 0155, 0217, 0151, 0301, 0235, 0336, + 0160, 0114, 0113, 0016, 0226, 0027, 0304, 0302, 0160, 0076, 0013, 0016, 0104, 0344, 0245, 0237, + 0376, 0147, 0070, 0225, 0005, 0324, 0003, 0307, 0151, 0300, 0207, 0017, 0076, 0174, 0110, 0302, + 0203, 0224, 0133, 0100, 0073, 0240, 0175, 0347, 0320, 0336, 0007, 0264, 0103, 0102, 0016, 0240, + 0175, 0117, 0320, 0176, 0001, 0150, 0207, 0174, 0133, 0100, 0073, 0144, 0343, 0100, 0202, 0075, + 0000, 0036, 0000, 0017, 0200, 0207, 0004, 0173, 0000, 0074, 0000, 0036, 0000, 0017, 0011, 0366, + 0220, 0312, 0004, 0251, 0114, 0020, 0122, 0006, 0262, 0201, 0130, 0062, 0220, 0015, 0134, 0347, + 0275, 0221, 0304, 0111, 0327, 0322, 0015, 0074, 0246, 0226, 0211, 0275, 0267, 0025, 0264, 0134, + 0136, 0250, 0245, 0207, 0121, 0227, 0110, 0150, 0264, 0174, 0202, 0204, 0131, 0170, 0244, 0173, + 0057, 0000, 0133, 0005, 0340, 0045, 0326, 0371, 0247, 0116, 0027, 0336, 0311, 0001, 0276, 0074, + 0240, 0133, 0125, 0305, 0271, 0042, 0156, 0210, 0124, 0013, 0155, 0024, 0060, 0106, 0235, 0224, + 0317, 0255, 0314, 0261, 0261, 0145, 0151, 0253, 0051, 0367, 0242, 0123, 0366, 0200, 0047, 0245, + 0344, 0236, 0336, 0121, 0207, 0151, 0046, 0366, 0215, 0227, 0364, 0323, 0376, 0363, 0344, 0036, + 0073, 0332, 0200, 0177, 0025, 0265, 0232, 0371, 0023, 0121, 0163, 0345, 0016, 0177, 0305, 0116, + 0160, 0072, 0335, 0331, 0112, 0167, 0102, 0245, 0131, 0330, 0104, 0243, 0016, 0247, 0074, 0142, + 0074, 0250, 0246, 0203, 0142, 0003, 0223, 0107, 0354, 0363, 0105, 0276, 0323, 0003, 0213, 0251, + 0175, 0332, 0303, 0026, 0301, 0167, 0215, 0023, 0207, 0072, 0322, 0155, 0134, 0352, 0006, 0356, + 0013, 0221, 0210, 0025, 0225, 0155, 0031, 0160, 0134, 0361, 0326, 0364, 0021, 0173, 0131, 0263, + 0214, 0027, 0335, 0361, 0214, 0051, 0131, 0001, 0320, 0015, 0003, 0133, 0330, 0323, 0031, 0365, + 0020, 0037, 0054, 0137, 0352, 0006, 0362, 0271, 0205, 0256, 0133, 0174, 0263, 0304, 0142, 0143, + 0263, 0201, 0154, 0152, 0222, 0073, 0202, 0075, 0101, 0041, 0347, 0237, 0177, 0236, 0365, 0257, + 0206, 0067, 0375, 0057, 0077, 0277, 0166, 0006, 0237, 0227, 0251, 0063, 0223, 0006, 0023, 0131, + 0342, 0342, 0203, 0170, 0242, 0154, 0040, 0142, 0176, 0154, 0174, 0325, 0211, 0323, 0065, 0011, + 0013, 0177, 0231, 0366, 0242, 0102, 0230, 0252, 0254, 0141, 0171, 0231, 0343, 0107, 0326, 0143, + 0330, 0136, 0035, 0335, 0000, 0033, 0201, 0107, 0330, 0144, 0323, 0034, 0073, 0231, 0211, 0375, + 0234, 0016, 0221, 0304, 0227, 0303, 0217, 0243, 0315, 0300, 0341, 0204, 0145, 0021, 0047, 0155, + 0314, 0053, 0044, 0345, 0317, 0111, 0112, 0067, 0030, 0171, 0324, 0031, 0226, 0244, 0251, 0114, + 0011, 0232, 0147, 0143, 0116, 0003, 0313, 0042, 0113, 0354, 0255, 0156, 0373, 0062, 0035, 0141, + 0245, 0233, 0062, 0252, 0327, 0246, 0234, 0351, 0376, 0270, 0306, 0073, 0042, 0206, 0127, 0351, + 0166, 0030, 0233, 0330, 0216, 0001, 0166, 0365, 0160, 0014, 0057, 0373, 0262, 0326, 0035, 0250, + 0204, 0220, 0072, 0327, 0275, 0372, 0322, 0121, 0347, 0372, 0147, 0257, 0122, 0062, 0042, 0365, + 0102, 0265, 0270, 0124, 0253, 0306, 0250, 0136, 0270, 0363, 0253, 0322, 0135, 0161, 0313, 0337, + 0025, 0025, 0175, 0111, 0234, 0313, 0251, 0257, 0276, 0064, 0033, 0335, 0045, 0361, 0371, 0202, + 0325, 0130, 0135, 0012, 0007, 0370, 0323, 0233, 0124, 0112, 0052, 0036, 0310, 0201, 0142, 0254, + 0147, 0106, 0116, 0377, 0012, 0010, 0253, 0061, 0353, 0021, 0303, 0253, 0224, 0220, 0376, 0330, + 0054, 0317, 0271, 0304, 0226, 0133, 0137, 0236, 0063, 0033, 0335, 0324, 0102, 0257, 0061, 0317, + 0241, 0354, 0147, 0222, 0243, 0251, 0064, 0122, 0171, 0250, 0207, 0322, 0060, 0333, 0224, 0316, + 0210, 0006, 0165, 0206, 0156, 0070, 0276, 0112, 0067, 0104, 0137, 0067, 0166, 0073, 0256, 0153, + 0021, 0103, 0147, 0334, 0350, 0214, 0116, 0325, 0317, 0167, 0145, 0372, 0167, 0271, 0060, 0226, + 0171, 0175, 0352, 0255, 0323, 0236, 0210, 0311, 0270, 0151, 0370, 0353, 0207, 0143, 0331, 0026, + 0343, 0350, 0064, 0377, 0311, 0257, 0355, 0314, 0046, 0304, 0020, 0216, 0200, 0001, 0023, 0127, + 0113, 0152, 0342, 0217, 0103, 0327, 0271, 0317, 0152, 0024, 0372, 0300, 0155, 0116, 0251, 0241, + 0317, 0076, 0027, 0113, 0032, 0030, 0036, 0265, 0054, 0154, 0056, 0255, 0156, 0331, 0304, 0056, + 0333, 0144, 0051, 0275, 0206, 0070, 0311, 0276, 0374, 0164, 0317, 0361, 0067, 0202, 0237, 0134, + 0352, 0261, 0215, 0172, 0360, 0343, 0275, 0242, 0313, 0245, 0015, 0132, 0111, 0245, 0015, 0244, + 0313, 0033, 0154, 0056, 0366, 0251, 0220, 0335, 0164, 0112, 0237, 0267, 0041, 0267, 0211, 0172, + 0004, 0073, 0054, 0344, 0075, 0215, 0223, 0107, 0376, 0200, 0063, 0242, 0354, 0034, 0243, 0304, + 0165, 0210, 0137, 0213, 0033, 0374, 0210, 0165, 0316, 0143, 0347, 0174, 0055, 0274, 0116, 0366, + 0345, 0347, 0244, 0236, 0012, 0256, 0125, 0031, 0353, 0025, 0033, 0022, 0025, 0142, 0211, 0210, + 0045, 0233, 0242, 0326, 0267, 0210, 0311, 0205, 0215, 0133, 0260, 0063, 0063, 0360, 0246, 0033, + 0161, 0324, 0154, 0346, 0351, 0313, 0013, 0027, 0124, 0013, 0167, 0107, 0141, 0211, 0122, 0167, + 0063, 0006, 0301, 0107, 0063, 0004, 0267, 0142, 0020, 0054, 0201, 0346, 0145, 0052, 0110, 0000, + 0170, 0251, 0124, 0120, 0026, 0045, 0304, 0016, 0146, 0232, 0123, 0051, 0223, 0137, 0227, 0162, + 0044, 0037, 0077, 0273, 0272, 0143, 0052, 0116, 0051, 0163, 0347, 0362, 0344, 0253, 0126, 0262, + 0372, 0145, 0356, 0100, 0241, 0222, 0006, 0225, 0154, 0104, 0301, 0214, 0133, 0245, 0014, 0334, + 0264, 0120, 0150, 0176, 0042, 0121, 0025, 0142, 0225, 0021, 0111, 0331, 0204, 0122, 0232, 0320, + 0313, 0277, 0256, 0151, 0371, 0026, 0041, 0057, 0274, 0302, 0117, 0077, 0250, 0367, 0060, 0044, + 0066, 0116, 0113, 0212, 0256, 0174, 0335, 0253, 0130, 0373, 0064, 0260, 0252, 0261, 0314, 0264, + 0036, 0155, 0335, 0273, 0047, 0216, 0026, 0242, 0077, 0243, 0306, 0207, 0142, 0227, 0130, 0360, + 0202, 0122, 0072, 0114, 0066, 0152, 0371, 0376, 0043, 0101, 0000, 0110, 0120, 0200, 0372, 0247, + 0222, 0263, 0266, 0223, 0006, 0226, 0224, 0367, 0046, 0073, 0225, 0031, 0217, 0054, 0215, 0042, + 0356, 0210, 0145, 0225, 0107, 0263, 0056, 0215, 0064, 0052, 0105, 0266, 0233, 0232, 0212, 0227, + 0374, 0272, 0002, 0037, 0050, 0223, 0147, 0374, 0000, 0166, 0121, 0001, 0024, 0233, 0315, 0177, + 0064, 0233, 0145, 0174, 0102, 0351, 0334, 0005, 0240, 0132, 0011, 0325, 0255, 0072, 0241, 0132, + 0176, 0237, 0044, 0073, 0225, 0355, 0120, 0176, 0303, 0363, 0237, 0271, 0051, 0351, 0060, 0105, + 0316, 0335, 0220, 0132, 0060, 0060, 0202, 0126, 0030, 0045, 0327, 0131, 0300, 0004, 0002, 0023, + 0150, 0233, 0114, 0240, 0257, 0272, 0367, 0200, 0131, 0130, 0105, 0020, 0164, 0232, 0075, 0064, + 0201, 0242, 0375, 0107, 0041, 0001, 0370, 0250, 0347, 0200, 0276, 0004, 0126, 0220, 0004, 0333, + 0010, 0155, 0040, 0256, 0315, 0000, 0317, 0250, 0302, 0016, 0002, 0123, 0010, 0114, 0241, 0175, + 0062, 0205, 0332, 0373, 0141, 0012, 0045, 0237, 0122, 0312, 0361, 0325, 0354, 0055, 0312, 0350, + 0044, 0253, 0203, 0354, 0275, 0055, 0014, 0336, 0142, 0140, 0055, 0044, 0167, 0063, 0266, 0077, + 0165, 0355, 0212, 0207, 0341, 0173, 0216, 0111, 0014, 0354, 0103, 0040, 0276, 0150, 0040, 0076, + 0033, 0046, 0362, 0111, 0110, 0233, 0210, 0200, 0027, 0351, 0246, 0234, 0000, 0370, 0243, 0037, + 0256, 0307, 0110, 0367, 0064, 0227, 0132, 0304, 0340, 0352, 0202, 0303, 0311, 0322, 0253, 0072, + 0026, 0236, 0220, 0067, 0265, 0265, 0076, 0240, 0307, 0334, 0112, 0042, 0270, 0134, 0252, 0165, + 0271, 0074, 0026, 0122, 0337, 0153, 0351, 0300, 0171, 0071, 0272, 0260, 0133, 0246, 0027, 0330, + 0033, 0073, 0352, 0112, 0130, 0316, 0143, 0373, 0040, 0233, 0307, 0226, 0016, 0202, 0345, 0234, + 0266, 0251, 0112, 0025, 0225, 0014, 0221, 0310, 0155, 0333, 0172, 0257, 0304, 0364, 0342, 0256, + 0061, 0265, 0351, 0075, 0166, 0060, 0125, 0125, 0047, 0362, 0157, 0147, 0246, 0167, 0350, 0234, + 0076, 0251, 0072, 0206, 0052, 0331, 0206, 0252, 0266, 0242, 0032, 0047, 0221, 0232, 0243, 0210, + 0257, 0161, 0131, 0037, 0051, 0354, 0047, 0312, 0303, 0273, 0363, 0361, 0357, 0162, 0243, 0252, + 0025, 0270, 0025, 0012, 0060, 0140, 0145, 0046, 0134, 0001, 0162, 0257, 0164, 0337, 0324, 0377, + 0000, 0360, 0126, 0014, 0336, 0150, 0231, 0001, 0277, 0212, 0105, 0336, 0000, 0277, 0131, 0370, + 0035, 0134, 0003, 0166, 0053, 0306, 0356, 0340, 0257, 0272, 0355, 0376, 0166, 0215, 0216, 0233, + 0315, 0255, 0106, 0132, 0033, 0220, 0126, 0004, 0151, 0247, 0204, 0031, 0224, 0070, 0000, 0267, + 0212, 0341, 0066, 0135, 0347, 0255, 0206, 0332, 0021, 0100, 0255, 0010, 0324, 0076, 0015, 0000, + 0145, 0025, 0243, 0354, 0023, 0265, 0314, 0267, 0003, 0142, 0075, 0156, 0271, 0372, 0370, 0036, + 0220, 0126, 0010, 0151, 0234, 0014, 0000, 0153, 0153, 0300, 0332, 0126, 0203, 0354, 0035, 0200, + 0254, 0220, 0215, 0026, 0262, 0131, 0200, 0131, 0325, 0166, 0332, 0366, 0113, 0263, 0343, 0275, + 0002, 0032, 0104, 0377, 0266, 0043, 0333, 0020, 0302, 0327, 0100, 0300, 0252, 0004, 0334, 0206, + 0360, 0265, 0124, 0370, 0372, 0233, 0270, 0013, 0001, 0242, 0327, 0233, 0216, 0136, 0363, 0335, + 0300, 0317, 0341, 0136, 0200, 0206, 0126, 0235, 0206, 0166, 0164, 0364, 0346, 0370, 0350, 0375, + 0341, 0207, 0346, 0301, 0121, 0373, 0335, 0361, 0321, 0273, 0143, 0010, 0210, 0101, 0100, 0273, + 0222, 0200, 0066, 0340, 0171, 0035, 0170, 0156, 0265, 0336, 0264, 0376, 0376, 0376, 0260, 0335, + 0006, 0034, 0103, 0140, 0273, 0364, 0300, 0066, 0140, 0170, 0055, 0062, 0371, 0315, 0337, 0217, + 0077, 0034, 0266, 0101, 0024, 0103, 0304, 0274, 0242, 0210, 0071, 0100, 0270, 0142, 0010, 0377, + 0332, 0004, 0360, 0102, 0014, 0276, 0364, 0030, 0074, 0340, 0026, 0160, 0273, 0001, 0334, 0102, + 0104, 0277, 0030, 0156, 0251, 0145, 0002, 0162, 0001, 0271, 0033, 0100, 0056, 0244, 0011, 0024, + 0263, 0170, 0303, 0370, 0065, 0140, 0027, 0260, 0273, 0001, 0354, 0102, 0346, 0101, 0271, 0013, + 0276, 0265, 0201, 0333, 0043, 0250, 0163, 0004, 0325, 0170, 0212, 0125, 0343, 0151, 0125, 0131, + 0215, 0047, 0155, 0335, 0322, 0327, 0254, 0130, 0324, 0255, 0000, 0237, 0113, 0231, 0154, 0342, + 0104, 0125, 0156, 0100, 0222, 0052, 0160, 0123, 0325, 0145, 0110, 0171, 0232, 0053, 0325, 0275, + 0135, 0031, 0170, 0221, 0306, 0066, 0021, 0151, 0035, 0134, 0132, 0073, 0363, 0373, 0323, 0132, + 0312, 0173, 0057, 0376, 0324, 0357, 0165, 0206, 0065, 0107, 0147, 0201, 0247, 0133, 0057, 0175, + 0111, 0215, 0111, 0261, 0232, 0324, 0320, 0303, 0130, 0024, 0317, 0231, 0347, 0216, 0274, 0374, + 0262, 0231, 0062, 0122, 0171, 0273, 0360, 0060, 0365, 0114, 0354, 0351, 0205, 0306, 0061, 0246, + 0134, 0111, 0326, 0174, 0154, 0361, 0105, 0012, 0271, 0115, 0336, 0216, 0260, 0043, 0006, 0242, + 0335, 0173, 0304, 0324, 0304, 0315, 0205, 0174, 0142, 0043, 0312, 0306, 0005, 0272, 0142, 0174, + 0133, 0146, 0135, 0345, 0035, 0325, 0354, 0042, 0104, 0215, 0072, 0232, 0317, 0131, 0006, 0357, + 0326, 0260, 0210, 0361, 0240, 0172, 0313, 0024, 0042, 0102, 0045, 0165, 0146, 0227, 0124, 0175, + 0154, 0054, 0254, 0230, 0122, 0365, 0054, 0101, 0153, 0203, 0227, 0266, 0157, 0053, 0222, 0167, + 0133, 0306, 0360, 0133, 0153, 0145, 0370, 0011, 0227, 0202, 0265, 0023, 0262, 0321, 0244, 0257, + 0366, 0253, 0122, 0054, 0344, 0272, 0043, 0157, 0132, 0006, 0231, 0303, 0220, 0121, 0133, 0302, + 0046, 0131, 0141, 0060, 0364, 0111, 0075, 0301, 0254, 0254, 0104, 0065, 0125, 0266, 0176, 0355, + 0321, 0173, 0017, 0373, 0376, 0251, 0076, 0255, 0023, 0270, 0370, 0303, 0226, 0325, 0007, 0124, + 0267, 0341, 0127, 0104, 0152, 0300, 0077, 0255, 0371, 0014, 0273, 0034, 0232, 0207, 0355, 0134, + 0267, 0362, 0061, 0374, 0314, 0142, 0115, 0376, 0013, 0342, 0350, 0216, 0101, 0164, 0013, 0235, + 0131, 0242, 0230, 0127, 0236, 0316, 0303, 0333, 0120, 0303, 0057, 0110, 0256, 0164, 0371, 0012, + 0276, 0172, 0172, 0111, 0101, 0343, 0174, 0235, 0065, 0063, 0117, 0003, 0016, 0172, 0047, 0102, + 0302, 0005, 0146, 0306, 0370, 0234, 0157, 0341, 0351, 0360, 0152, 0353, 0164, 0034, 0003, 0223, + 0107, 0354, 0153, 0323, 0133, 0172, 0363, 0367, 0304, 0050, 0265, 0030, 0161, 0265, 0104, 0252, + 0076, 0247, 0117, 0216, 0105, 0165, 0023, 0231, 0374, 0147, 0164, 0347, 0121, 0033, 0161, 0102, + 0167, 0306, 0301, 0350, 0220, 0120, 0304, 0125, 0144, 0364, 0103, 0037, 0123, 0372, 0027, 0024, + 0221, 0377, 0206, 0200, 0375, 0250, 0166, 0125, 0106, 0236, 0002, 0237, 0013, 0076, 0324, 0071, + 0345, 0060, 0251, 0223, 0372, 0265, 0276, 0360, 0062, 0345, 0104, 0041, 0146, 0110, 0314, 0062, + 0157, 0317, 0071, 0075, 0227, 0277, 0163, 0336, 0341, 0221, 0121, 0300, 0260, 0237, 0351, 0150, + 0171, 0171, 0165, 0346, 0134, 0340, 0126, 0027, 0007, 0205, 0157, 0064, 0320, 0243, 0160, 0161, + 0177, 0154, 0364, 0237, 0047, 0134, 0300, 0152, 0003, 0076, 0073, 0324, 0152, 0066, 0062, 0053, + 0044, 0313, 0175, 0274, 0260, 0143, 0046, 0356, 0246, 0162, 0163, 0176, 0123, 0171, 0250, 0215, + 0143, 0123, 0362, 0242, 0362, 0155, 0023, 0012, 0255, 0215, 0012, 0205, 0354, 0172, 0331, 0320, + 0173, 0216, 0336, 0353, 0150, 0101, 0265, 0313, 0266, 0240, 0342, 0047, 0031, 0363, 0362, 0352, + 0213, 0257, 0136, 0132, 0176, 0141, 0351, 0341, 0324, 0266, 0026, 0225, 0172, 0371, 0164, 0010, + 0263, 0360, 0150, 0101, 0131, 0137, 0225, 0114, 0121, 0161, 0312, 0027, 0015, 0137, 0370, 0156, + 0346, 0077, 0045, 0337, 0124, 0237, 0051, 0205, 0362, 0110, 0234, 0130, 0205, 0326, 0020, 0327, + 0300, 0150, 0243, 0110, 0367, 0112, 0376, 0334, 0312, 0264, 0227, 0304, 0152, 0222, 0104, 0116, + 0277, 0353, 0136, 0112, 0324, 0346, 0025, 0255, 0362, 0242, 0364, 0305, 0066, 0360, 0023, 0373, + 0112, 0026, 0074, 0205, 0245, 0134, 0222, 0124, 0313, 0044, 0322, 0070, 0216, 0261, 0272, 0017, + 0137, 0261, 0023, 0054, 0052, 0326, 0202, 0000, 0057, 0210, 0205, 0303, 0337, 0127, 0164, 0353, + 0262, 0167, 0110, 0245, 0131, 0330, 0104, 0070, 0275, 0246, 0336, 0056, 0245, 0335, 0125, 0123, + 0272, 0127, 0133, 0163, 0243, 0360, 0056, 0275, 0362, 0366, 0152, 0260, 0303, 0015, 0134, 0161, + 0231, 0322, 0174, 0075, 0145, 0233, 0006, 0034, 0160, 0274, 0271, 0160, 0143, 0146, 0115, 0063, + 0236, 0321, 0045, 0313, 0202, 0130, 0326, 0270, 0252, 0315, 0334, 0025, 0321, 0146, 0052, 0244, + 0314, 0256, 0111, 0030, 0120, 0146, 0171, 0224, 0071, 0133, 0317, 0265, 0121, 0346, 0312, 0056, + 0367, 0154, 0375, 0076, 0056, 0231, 0045, 0267, 0331, 0125, 0304, 0324, 0172, 0335, 0226, 0030, + 0174, 0123, 0235, 0360, 0126, 0112, 0213, 0370, 0134, 0257, 0061, 0115, 0325, 0346, 0077, 0175, + 0362, 0047, 0116, 0325, 0232, 0245, 0325, 0222, 0070, 0240, 0342, 0162, 0201, 0232, 0244, 0355, + 0051, 0107, 0162, 0143, 0264, 0263, 0322, 0230, 0300, 0045, 0266, 0134, 0140, 0002, 0345, 0061, + 0201, 0331, 0172, 0002, 0023, 0310, 0142, 0002, 0143, 0276, 0122, 0263, 0340, 0260, 0137, 0063, + 0116, 0060, 0336, 0064, 0047, 0150, 0347, 0345, 0004, 0211, 0326, 0324, 0342, 0203, 0230, 0113, + 0203, 0115, 0341, 0243, 0262, 0371, 0126, 0314, 0202, 0043, 0370, 0356, 0222, 0006, 0236, 0277, + 0360, 0140, 0332, 0345, 0153, 0002, 0166, 0135, 0101, 0272, 0037, 0136, 0017, 0170, 0305, 0376, + 0141, 0330, 0325, 0210, 0143, 0170, 0070, 0352, 0254, 0225, 0325, 0300, 0345, 0144, 0274, 0330, + 0340, 0375, 0053, 0003, 0070, 0175, 0102, 0002, 0203, 0363, 0251, 0204, 0177, 0305, 0177, 0046, + 0025, 0006, 0252, 0244, 0277, 0214, 0321, 0370, 0121, 0365, 0030, 0266, 0227, 0107, 0026, 0136, + 0016, 0272, 0151, 0373, 0064, 0331, 0144, 0373, 0031, 0216, 0117, 0246, 0017, 0301, 0314, 0002, + 0207, 0053, 0312, 0042, 0052, 0237, 0062, 0334, 0025, 0274, 0031, 0163, 0274, 0315, 0042, 0362, + 0222, 0200, 0313, 0111, 0357, 0323, 0334, 0235, 0227, 0155, 0130, 0312, 0345, 0121, 0336, 0365, + 0230, 0367, 0123, 0145, 0317, 0252, 0314, 0341, 0354, 0054, 0312, 0323, 0220, 0372, 0000, 0267, + 0170, 0231, 0107, 0047, 0332, 0023, 0141, 0143, 0315, 0325, 0275, 0020, 0037, 0062, 0037, 0022, + 0254, 0263, 0161, 0062, 0140, 0324, 0170, 0360, 0065, 0361, 0307, 0241, 0353, 0334, 0147, 0042, + 0367, 0201, 0270, 0232, 0100, 0243, 0247, 0215, 0111, 0342, 0227, 0226, 0051, 0177, 0071, 0206, + 0336, 0236, 0305, 0320, 0077, 0054, 0304, 0320, 0063, 0343, 0346, 0033, 0201, 0301, 0362, 0155, + 0303, 0307, 0012, 0115, 0302, 0333, 0204, 0125, 0032, 0060, 0352, 0252, 0065, 0110, 0015, 0324, + 0307, 0005, 0347, 0175, 0056, 0055, 0270, 0260, 0340, 0342, 0244, 0051, 0265, 0136, 0012, 0241, + 0170, 0031, 0175, 0163, 0121, 0327, 0024, 0040, 0013, 0351, 0156, 0060, 0261, 0107, 0324, 0272, + 0165, 0115, 0216, 0361, 0172, 0051, 0235, 0253, 0172, 0243, 0222, 0332, 0051, 0037, 0100, 0364, + 0303, 0045, 0100, 0302, 0012, 0212, 0342, 0210, 0121, 0021, 0215, 0241, 0047, 0134, 0225, 0207, + 0006, 0265, 0145, 0077, 0051, 0027, 0056, 0314, 0225, 0016, 0230, 0053, 0015, 0120, 0126, 0105, + 0115, 0012, 0025, 0326, 0102, 0105, 0115, 0017, 0003, 0106, 0344, 0233, 0256, 0257, 0246, 0107, + 0316, 0112, 0011, 0325, 0245, 0205, 0347, 0012, 0151, 0276, 0376, 0146, 0064, 0137, 0271, 0260, + 0132, 0132, 0204, 0343, 0270, 0132, 0333, 0171, 0213, 0134, 0354, 0041, 0233, 0235, 0022, 0052, + 0372, 0302, 0231, 0114, 0275, 0075, 0355, 0271, 0110, 0244, 0011, 0044, 0122, 0210, 0104, 0306, + 0364, 0011, 0115, 0113, 0342, 0001, 0165, 0244, 0036, 0247, 0054, 0213, 0072, 0006, 0134, 0131, + 0347, 0237, 0231, 0053, 0103, 0343, 0260, 0014, 0236, 0330, 0201, 0351, 0243, 0372, 0150, 0102, + 0231, 0252, 0214, 0024, 0375, 0224, 0242, 0254, 0204, 0346, 0140, 0326, 0254, 0127, 0244, 0330, + 0163, 0156, 0173, 0162, 0323, 0142, 0154, 0003, 0124, 0310, 0315, 0173, 0156, 0016, 0156, 0051, + 0021, 0106, 0203, 0257, 0043, 0015, 0376, 0271, 0265, 0064, 0170, 0004, 0162, 0122, 0201, 0304, + 0366, 0114, 0114, 0002, 0161, 0314, 0210, 0043, 0364, 0217, 0043, 0172, 0207, 0042, 0147, 0006, + 0120, 0110, 0172, 0256, 0131, 0151, 0042, 0314, 0045, 0316, 0153, 0317, 0122, 0270, 0025, 0341, + 0203, 0225, 0053, 0326, 0153, 0055, 0302, 0244, 0111, 0250, 0024, 0071, 0366, 0230, 0253, 0225, + 0255, 0077, 0153, 0026, 0166, 0356, 0231, 0222, 0070, 0111, 0232, 0261, 0164, 0017, 0317, 0323, + 0301, 0066, 0017, 0217, 0345, 0167, 0311, 0365, 0065, 0301, 0254, 0265, 0047, 0335, 0163, 0102, + 0307, 0247, 0022, 0324, 0211, 0343, 0006, 0114, 0163, 0003, 0317, 0015, 0343, 0061, 0116, 0140, + 0217, 0024, 0224, 0204, 0205, 0100, 0131, 0114, 0364, 0114, 0172, 0016, 0026, 0261, 0107, 0232, + 0047, 0224, 0005, 0371, 0265, 0362, 0035, 0235, 0023, 0031, 0325, 0030, 0341, 0202, 0112, 0215, + 0104, 0371, 0044, 0261, 0107, 0014, 0265, 0106, 0117, 0236, 0356, 0252, 0265, 0010, 0102, 0372, + 0326, 0134, 0152, 0021, 0143, 0322, 0070, 0041, 0167, 0232, 0040, 0106, 0123, 0201, 0162, 0003, + 0234, 0222, 0037, 0261, 0071, 0135, 0251, 0142, 0146, 0167, 0106, 0355, 0021, 0345, 0114, 0155, + 0030, 0342, 0151, 0306, 0356, 0156, 0335, 0153, 0354, 0175, 0045, 0316, 0354, 0151, 0235, 0344, + 0145, 0046, 0317, 0233, 0262, 0072, 0304, 0247, 0200, 0370, 0034, 0270, 0344, 0252, 0043, 0327, + 0013, 0103, 0162, 0130, 0343, 0372, 0072, 0137, 0067, 0142, 0333, 0330, 0044, 0272, 0374, 0110, + 0147, 0026, 0103, 0123, 0051, 0203, 0104, 0273, 0043, 0317, 0330, 0324, 0236, 0210, 0051, 0170, + 0155, 0372, 0252, 0023, 0206, 0355, 0125, 0165, 0102, 0374, 0032, 0267, 0346, 0174, 0034, 0342, + 0221, 0364, 0373, 0055, 0305, 0367, 0333, 0212, 0357, 0037, 0051, 0276, 0377, 0116, 0361, 0375, + 0143, 0305, 0367, 0337, 0307, 0275, 0037, 0375, 0346, 0327, 0205, 0323, 0264, 0100, 0361, 0126, + 0347, 0040, 0173, 0246, 0172, 0003, 0215, 0274, 0004, 0133, 0261, 0101, 0154, 0335, 0102, 0327, + 0042, 0173, 0033, 0114, 0263, 0364, 0106, 0325, 0152, 0053, 0174, 0053, 0242, 0135, 0330, 0112, + 0165, 0105, 0222, 0220, 0100, 0125, 0051, 0111, 0125, 0051, 0105, 0225, 0250, 0231, 0350, 0256, + 0030, 0166, 0027, 0234, 0063, 0275, 0366, 0210, 0210, 0337, 0316, 0306, 0224, 0033, 0262, 0136, + 0335, 0263, 0154, 0112, 0365, 0250, 0234, 0215, 0165, 0347, 0036, 0043, 0066, 0306, 0110, 0060, + 0154, 0344, 0143, 0306, 0310, 0152, 0216, 0133, 0162, 0342, 0271, 0260, 0337, 0043, 0216, 0336, + 0226, 0227, 0102, 0316, 0175, 0020, 0046, 0135, 0163, 0151, 0020, 0110, 0363, 0010, 0327, 0303, + 0217, 0004, 0117, 0253, 0134, 0274, 0315, 0260, 0360, 0305, 0351, 0301, 0131, 0003, 0316, 0035, + 0274, 0211, 0052, 0237, 0013, 0217, 0021, 0306, 0254, 0130, 0155, 0242, 0016, 0357, 0101, 0167, + 0231, 0235, 0221, 0244, 0016, 0344, 0154, 0024, 0245, 0212, 0112, 0216, 0025, 0303, 0031, 0342, + 0072, 0340, 0103, 0310, 0067, 0354, 0141, 0247, 0366, 0212, 0175, 0321, 0123, 0132, 0160, 0040, + 0253, 0330, 0201, 0254, 0331, 0001, 0013, 0070, 0053, 0134, 0350, 0260, 0304, 0374, 0054, 0315, + 0000, 0033, 0201, 0107, 0030, 0301, 0176, 0075, 0117, 0324, 0114, 0307, 0067, 0201, 0123, 0065, + 0033, 0077, 0125, 0063, 0333, 0212, 0122, 0117, 0326, 0250, 0037, 0224, 0011, 0031, 0316, 0314, + 0116, 0075, 0072, 0156, 0312, 0266, 0230, 0125, 0230, 0155, 0067, 0233, 0333, 0177, 0032, 0147, + 0365, 0144, 0306, 0222, 0023, 0146, 0223, 0007, 0155, 0224, 0316, 0264, 0120, 0117, 0224, 0023, + 0324, 0243, 0043, 0222, 0234, 0111, 0063, 0142, 0350, 0226, 0224, 0342, 0064, 0073, 0010, 0163, + 0234, 0367, 0054, 0313, 0200, 0253, 0243, 0017, 0313, 0224, 0035, 0375, 0124, 0043, 0215, 0111, + 0266, 0236, 0347, 0212, 0276, 0055, 0270, 0123, 0170, 0360, 0124, 0063, 0003, 0157, 0272, 0274, + 0307, 0315, 0146, 0216, 0366, 0102, 0337, 0154, 0234, 0370, 0026, 0061, 0261, 0026, 0052, 0377, + 0236, 0200, 0221, 0174, 0000, 0236, 0141, 0317, 0245, 0226, 0010, 0025, 0107, 0007, 0174, 0163, + 0234, 0066, 0131, 0076, 0172, 0326, 0232, 0035, 0075, 0173, 0037, 0123, 0276, 0125, 0272, 0164, + 0153, 0055, 0016, 0246, 0054, 0235, 0350, 0072, 0126, 0155, 0251, 0124, 0140, 0265, 0214, 0042, + 0255, 0052, 0045, 0325, 0323, 0152, 0007, 0326, 0252, 0144, 0156, 0112, 0252, 0140, 0170, 0336, + 0042, 0263, 0277, 0354, 0252, 0172, 0245, 0225, 0362, 0313, 0052, 0341, 0007, 0245, 0375, 0127, + 0350, 0260, 0033, 0172, 0326, 0226, 0271, 0174, 0270, 0257, 0341, 0203, 0325, 0320, 0105, 0325, + 0064, 0232, 0247, 0171, 0166, 0336, 0164, 0170, 0076, 0310, 0227, 0243, 0327, 0102, 0005, 0112, + 0363, 0305, 0067, 0244, 0022, 0321, 0224, 0251, 0114, 0042, 0237, 0054, 0321, 0232, 0234, 0133, + 0165, 0311, 0253, 0372, 0375, 0337, 0077, 0376, 0113, 0265, 0343, 0127, 0011, 0147, 0272, 0345, + 0216, 0365, 0054, 0000, 0354, 0173, 0165, 0366, 0235, 0224, 0035, 0143, 0156, 0065, 0370, 0040, + 0073, 0152, 0126, 0343, 0262, 0270, 0354, 0010, 0367, 0165, 0227, 0144, 0307, 0125, 0230, 0023, + 0053, 0062, 0226, 0175, 0071, 0232, 0005, 0371, 0041, 0051, 0077, 0212, 0256, 0354, 0053, 0131, + 0142, 0222, 0173, 0302, 0374, 0355, 0023, 0046, 0107, 0040, 0114, 0012, 0012, 0223, 0063, 0352, + 0063, 0020, 0045, 0305, 0250, 0360, 0135, 0355, 0104, 0211, 0330, 0325, 0135, 0022, 0044, 0142, + 0076, 0210, 0267, 0210, 0270, 0035, 0210, 0221, 0262, 0304, 0110, 0261, 0165, 0335, 0021, 0041, + 0162, 0274, 0236, 0152, 0347, 0151, 0023, 0134, 0071, 0147, 0023, 0326, 0074, 0124, 0254, 0171, + 0232, 0230, 0264, 0163, 0322, 0111, 0353, 0050, 0141, 0176, 0361, 0041, 0110, 0311, 0222, 0075, + 0361, 0154, 0247, 0026, 0176, 0121, 0351, 0250, 0100, 0042, 0067, 0251, 0326, 0255, 0031, 0023, + 0016, 0253, 0251, 0232, 0121, 0036, 0226, 0225, 0056, 0107, 0315, 0177, 0061, 0152, 0162, 0001, + 0315, 0015, 0073, 0022, 0127, 0063, 0241, 0347, 0202, 0074, 0066, 0011, 0272, 0226, 0112, 0146, + 0266, 0053, 0061, 0274, 0251, 0020, 0351, 0310, 0237, 0316, 0156, 0233, 0004, 0171, 0146, 0346, + 0163, 0122, 0303, 0050, 0367, 0112, 0363, 0161, 0030, 0365, 0172, 0344, 0323, 0156, 0234, 0120, + 0107, 0235, 0126, 0325, 0362, 0250, 0323, 0363, 0251, 0063, 0363, 0244, 0143, 0266, 0052, 0056, + 0317, 0072, 0061, 0177, 0172, 0007, 0171, 0104, 0253, 0256, 0152, 0202, 0207, 0155, 0372, 0210, + 0313, 0321, 0024, 0156, 0224, 0373, 0222, 0132, 0040, 0171, 0035, 0043, 0177, 0366, 0250, 0024, + 0201, 0250, 0023, 0206, 0262, 0320, 0050, 0053, 0005, 0171, 0061, 0107, 0177, 0046, 0016, 0372, + 0017, 0365, 0112, 0317, 0317, 0254, 0135, 0233, 0314, 0311, 0163, 0347, 0367, 0125, 0173, 0040, + 0200, 0332, 0066, 0141, 0050, 0072, 0027, 0120, 0313, 0363, 0073, 0120, 0132, 0263, 0161, 0322, + 0377, 0274, 0263, 0025, 0065, 0151, 0241, 0072, 0120, 0031, 0075, 0256, 0263, 0106, 0347, 0332, + 0331, 0161, 0013, 0162, 0377, 0327, 0223, 0373, 0037, 0146, 0262, 0105, 0005, 0340, 0260, 0127, + 0247, 0214, 0066, 0151, 0313, 0174, 0365, 0266, 0201, 0060, 0067, 0157, 0051, 0125, 0117, 0266, + 0170, 0010, 0144, 0355, 0157, 0066, 0153, 0177, 0071, 0311, 0034, 0162, 0367, 0245, 0123, 0262, + 0271, 0325, 0046, 0364, 0216, 0073, 0076, 0217, 0223, 0203, 0377, 0017, 0011, 0324, 0246, 0057, + 0000, 0050, 0165, 0165, 0141, 0171, 0051 } }; static GStaticResource static_resource = { resources_resource_data.data, sizeof (resources_resource_data.data) - 1 /* nul terminator */, NULL, NULL, NULL }; diff --git a/src/sqlite/sqlite.c b/src/sqlite/sqlite.c index 79a7b97..299ad7f 100644 --- a/src/sqlite/sqlite.c +++ b/src/sqlite/sqlite.c @@ -56,14 +56,14 @@ static gchar *new_app_tbl = /* Create the equity table if it doesn't already exist. */ static gchar *new_eqty_tbl = "CREATE TABLE IF NOT EXISTS equity(Id INTEGER PRIMARY KEY, Symbol TEXT NOT " - "NULL, Shares TEXT NOT NULL); CREATE UNIQUE INDEX IF NOT EXISTS " - "idx_equity_symbol ON equity (Symbol);"; + "NULL, Shares TEXT NOT NULL, Cost TEXT NOT NULL); CREATE UNIQUE INDEX IF " + "NOT EXISTS idx_equity_symbol ON equity (Symbol);"; /* Create the bullion table if it doesn't already exist. */ static gchar *new_bul_tbl = "CREATE TABLE IF NOT EXISTS bullion(Id INTEGER PRIMARY KEY, Metal TEXT NOT " - "NULL, Ounces TEXT NOT NULL, Premium TEXT NOT NULL); CREATE UNIQUE INDEX " - "IF NOT EXISTS idx_bullion_metal ON bullion (Metal);"; + "NULL, Ounces TEXT NOT NULL, Premium TEXT NOT NULL, Cost TEXT NOT NULL); " + "CREATE UNIQUE INDEX IF NOT EXISTS idx_bullion_metal ON bullion (Metal);"; static gint app_callback(gpointer data, gint argc, gchar **argv, gchar **ColName) { @@ -176,8 +176,8 @@ static gint app_callback(gpointer data, gint argc, gchar **argv, static gint equity_callback(gpointer data, gint argc, gchar **argv, gchar **ColName) { - /* argv[0] is Id, argv[1] is Symbol, argv[2] is Shares */ - if (argc != 3) + /* argv[0] is Id, argv[1] is Symbol, argv[2] is Shares, argv[3] is Cost */ + if (argc != 4) return 1; if (g_strcmp0(ColName[0], "Id") != 0) return 1; @@ -185,27 +185,34 @@ static gint equity_callback(gpointer data, gint argc, gchar **argv, return 1; if (g_strcmp0(ColName[2], "Shares") != 0) return 1; + if (g_strcmp0(ColName[3], "Cost") != 0) + return 1; equity_folder *F = (equity_folder *)data; - F->AddStock(argv[1], argv[2]); + F->AddStock(argv[1], argv[2], argv[3]); return 0; } static void set_bul_values(bullion *B, const gchar *ounce_ch, - const gchar *premium_ch, gushort digits_right) { + const gchar *premium_ch, const gchar *cost_ch, + gushort digits_right) { B->ounce_f = StringToDouble(ounce_ch); - DoubleToFormattedStrPango(&B->ounce_mrkd_ch, B->ounce_f, 4, NUM_STR, BLACK); B->premium_f = StringToDouble(premium_ch); DoubleToFormattedStrPango(&B->premium_mrkd_ch, B->premium_f, digits_right, MON_STR, BLACK); + + B->cost_basis_f = StringToDouble(cost_ch); + DoubleToFormattedStrPango(&B->cost_mrkd_ch, B->cost_basis_f, digits_right, + MON_STR, BLACK); } static gint bullion_callback(gpointer data, gint argc, gchar **argv, gchar **ColName) { - /* argv[0] is Id, argv[1] is Metal, argv[2] is Ounces, argv[3] is Premium */ - if (argc != 4) + /* argv[0] is Id, argv[1] is Metal, argv[2] is Ounces, argv[3] is Premium, + * argv[4] is Cost */ + if (argc != 5) return 1; if (g_strcmp0(ColName[0], "Id") != 0) return 1; @@ -215,6 +222,8 @@ static gint bullion_callback(gpointer data, gint argc, gchar **argv, return 1; if (g_strcmp0(ColName[3], "Premium") != 0) return 1; + if (g_strcmp0(ColName[4], "Cost") != 0) + return 1; portfolio_packet *pkg = (portfolio_packet *)data; meta *D = pkg->GetMetaClass(); @@ -222,19 +231,21 @@ static gint bullion_callback(gpointer data, gint argc, gchar **argv, if (!g_strcmp0(argv[1], "gold")) set_bul_values(m->Gold, argv[2] ? argv[2] : "0", argv[3] ? argv[3] : "0", - D->decimal_places_guint8); + argv[4] ? argv[4] : "0", D->decimal_places_guint8); else if (!g_strcmp0(argv[1], "silver")) set_bul_values(m->Silver, argv[2] ? argv[2] : "0", argv[3] ? argv[3] : "0", - D->decimal_places_guint8); + argv[4] ? argv[4] : "0", D->decimal_places_guint8); else if (!g_strcmp0(argv[1], "platinum")) set_bul_values(m->Platinum, argv[2] ? argv[2] : "0", - argv[3] ? argv[3] : "0", D->decimal_places_guint8); + argv[3] ? argv[3] : "0", argv[4] ? argv[4] : "0", + D->decimal_places_guint8); else if (!g_strcmp0(argv[1], "palladium")) set_bul_values(m->Palladium, argv[2] ? argv[2] : "0", - argv[3] ? argv[3] : "0", D->decimal_places_guint8); + argv[3] ? argv[3] : "0", argv[4] ? argv[4] : "0", + D->decimal_places_guint8); return 0; } @@ -330,8 +341,9 @@ void SqliteProcessing(portfolio_packet *pkg) { sqlite_run_cmd(&mutexes[SQLITE_MUTEX], D->sqlite_db_path_ch, app_callback, pkg, sql_cmd); - sql_cmd = "SELECT * FROM equity;"; /* We always want this table selected after - app_tbl [equity urls and dec places] */ + sql_cmd = + "SELECT * FROM equity;"; /* We always want the next two tables selected + after app_tbl [equity urls and dec places] */ sqlite_run_cmd(&mutexes[SQLITE_MUTEX], D->sqlite_db_path_ch, equity_callback, F, sql_cmd); @@ -467,14 +479,14 @@ void SqliteBullionAdd(meta *D, ...) */ { - const gchar *fmt = "REPLACE INTO bullion (Metal, Ounces, Premium) " - "VALUES('%s', '%s', '%s');"; + const gchar *fmt = "REPLACE INTO bullion (Metal, Ounces, Premium, Cost) " + "VALUES('%s', '%s', '%s', '%s');"; va_list arg_ptr; /* Get the sqlite command. */ va_start(arg_ptr, D); - gchar *sql_cmd = vradic_sqlte_cmd(3, fmt, arg_ptr); + gchar *sql_cmd = vradic_sqlte_cmd(4, fmt, arg_ptr); va_end(arg_ptr); /* Run the command. */ @@ -482,11 +494,13 @@ void SqliteBullionAdd(meta *D, ...) g_free(sql_cmd); } -void SqliteEquityAdd(const gchar *symbol, const gchar *shares, meta *D) { - const gchar *fmt = "REPLACE INTO equity (Symbol, Shares) VALUES('%s', '%s');"; +void SqliteEquityAdd(const gchar *symbol, const gchar *shares, + const gchar *cost, meta *D) { + const gchar *fmt = + "REPLACE INTO equity (Symbol, Shares, Cost) VALUES('%s', '%s', '%s');"; /* Create sqlite command. */ - gchar *sql_cmd = SnPrint(fmt, symbol, shares); + gchar *sql_cmd = SnPrint(fmt, symbol, shares, cost); /* Run the command. */ sqlite_run_cmd(&mutexes[SQLITE_MUTEX], D->sqlite_db_path_ch, 0, 0, sql_cmd); diff --git a/src/workfuncs/pango_formatting.c b/src/workfuncs/pango_formatting.c index 27eff86..a283c40 100644 --- a/src/workfuncs/pango_formatting.c +++ b/src/workfuncs/pango_formatting.c @@ -266,4 +266,117 @@ void DoubleToFormattedStrPango(gchar **dst, const gdouble num, DoubleToFormattedStr(&tmp, num, digits_right, format_type); StringToStrPango(dst, tmp, color); g_free(tmp); +} + +void RangeStrPango(gchar **dest, const double low_f, const double high_f, + const guint8 digits_right) { + gchar *low_ch = NULL, *high_ch = NULL, *range_ch = NULL; + + /* Create the monetary format strings. */ + DoubleToFormattedStr(&low_ch, low_f, digits_right, MON_STR); + + DoubleToFormattedStr(&high_ch, high_f, digits_right, MON_STR); + + /* Create the unmarked string. */ + range_ch = SnPrint("%s - %s", low_ch, high_ch); + + /* Create the marked up string. */ + StringToStrPango(dest, range_ch, BLACK); + + g_free(low_ch); + g_free(high_ch); + g_free(range_ch); +} + +void ChangeStrPango(gchar **dest, const double value_f, const double percent_f, + const guint8 digits_right) { + gchar *value_ch = NULL, *percent_ch = NULL, *val_per_ch = NULL; + + /* Create the monetary and percent format strings. */ + DoubleToFormattedStr(&value_ch, value_f, digits_right, MON_STR); + + DoubleToFormattedStr(&percent_ch, percent_f, digits_right, PER_STR); + + /* Create the unmarked string. */ + val_per_ch = SnPrint("%s\n%s", value_ch, percent_ch); + + /* Create the marked up string. */ + if (value_f < 0) { + StringToStrPango(dest, val_per_ch, RED); + } else if (value_f > 0) { + StringToStrPango(dest, val_per_ch, GREEN); + } else { + StringToStrPango(dest, val_per_ch, BLACK); + } + + g_free(value_ch); + g_free(percent_ch); + g_free(val_per_ch); +} + +void TotalStrPango(gchar **dest, const double total_f, const double gain_f, + const guint8 digits_right) { + gchar *total_ch = NULL, *gain_ch = NULL, *tmp_ch = NULL; + gchar *total_mrkd_ch = NULL, *gain_mrkd_ch = NULL; + + /* Create the monetary format strings. */ + DoubleToFormattedStr(&tmp_ch, total_f, digits_right, MON_STR); + total_ch = SnPrint("%s\n", tmp_ch); + g_free(tmp_ch); + + DoubleToFormattedStr(&gain_ch, gain_f, digits_right, MON_STR); + + /* Create the first marked string. */ + StringToStrPango(&total_mrkd_ch, total_ch, BLACK); + + /* Create the second marked string. */ + if (gain_f < 0) { + StringToStrPango(&gain_mrkd_ch, gain_ch, RED); + } else if (gain_f > 0) { + StringToStrPango(&gain_mrkd_ch, gain_ch, GREEN); + } else { + StringToStrPango(&gain_mrkd_ch, gain_ch, BLACK); + } + + /* Find allocation size */ + gsize len = g_snprintf(NULL, 0, "%s%s", total_mrkd_ch, gain_mrkd_ch) + 1; + tmp_ch = g_realloc(dest[0], len); + dest[0] = tmp_ch; + + g_snprintf(dest[0], len, "%s%s", total_mrkd_ch, gain_mrkd_ch); + + g_free(total_ch); + g_free(gain_ch); + g_free(total_mrkd_ch); + g_free(gain_mrkd_ch); +} + +void SymbolStrPango(gchar **dest, const gchar *symbol_ch, + const double quantity_f, const guint8 digits_right, + const guint color) { + gchar *quantity_ch = NULL, *tmp_ch = NULL; + gchar *symbol_mrkd_ch = NULL, *quantity_mrkd_ch = NULL; + + /* Create the unmarked strings. */ + tmp_ch = SnPrint("%s\n", symbol_ch); + + DoubleToFormattedStr(&quantity_ch, quantity_f, digits_right, NUM_STR); + + /* Create the first marked string. */ + StringToStrPango(&symbol_mrkd_ch, tmp_ch, color); + g_free(tmp_ch); + + /* Create the second marked string. */ + StringToStrPango(&quantity_mrkd_ch, quantity_ch, BLACK); + + /* Find allocation size */ + gsize len = g_snprintf(NULL, 0, "%s%s", symbol_mrkd_ch, quantity_mrkd_ch) + 1; + tmp_ch = g_realloc(dest[0], len); + dest[0] = tmp_ch; + + g_snprintf(dest[0], len, "%s%s", symbol_mrkd_ch, quantity_mrkd_ch); + + g_free(quantity_ch); + g_free(symbol_mrkd_ch); + g_free(quantity_mrkd_ch); } \ No newline at end of file diff --git a/src/workfuncs/working_functions.c b/src/workfuncs/working_functions.c index e60bd56..55d44ea 100644 --- a/src/workfuncs/working_functions.c +++ b/src/workfuncs/working_functions.c @@ -143,8 +143,8 @@ void GetYahooUrl(gchar **url_ch, const gchar *symbol_ch, guint period) { end_time = unix_time_sec(); start_time = end_time - (gint64)period; - const gchar *fmt = YAHOO_URL_START - "%s" YAHOO_URL_MIDDLE_ONE "%ld" YAHOO_URL_MIDDLE_TWO "%ld" YAHOO_URL_END; + const gchar *fmt = YAHOO_URL_ONE "%s" YAHOO_URL_TWO "%ld" YAHOO_URL_THREE + "%ld" YAHOO_URL_FOUR; len = g_snprintf(NULL, 0, fmt, symbol_ch, start_time, end_time) + 1; gchar *tmp = g_realloc(url_ch[0], len);