Files
NewStock/code/train/Rank.ipynb
2025-04-01 00:26:15 +08:00

1696 lines
199 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"cells": [
{
"cell_type": "code",
"id": "79a7758178bafdd3",
"metadata": {
"jupyter": {
"source_hidden": true
},
"ExecuteTime": {
"end_time": "2025-03-31T14:48:00.476292Z",
"start_time": "2025-03-31T14:47:59.982503Z"
}
},
"source": [
"# %load_ext autoreload\n",
"# %autoreload 2\n",
"\n",
"import pandas as pd\n",
"import warnings\n",
"\n",
"warnings.filterwarnings(\"ignore\")\n",
"\n",
"pd.set_option('display.max_columns', None)\n"
],
"outputs": [],
"execution_count": 1
},
{
"cell_type": "code",
"id": "a79cafb06a7e0e43",
"metadata": {
"scrolled": true,
"ExecuteTime": {
"end_time": "2025-03-31T14:48:58.450443Z",
"start_time": "2025-03-31T14:48:00.733543Z"
}
},
"source": [
"from utils.utils import read_and_merge_h5_data\n",
"\n",
"print('daily data')\n",
"df = read_and_merge_h5_data('../../data/daily_data.h5', key='daily_data',\n",
" columns=['ts_code', 'trade_date', 'open', 'close', 'high', 'low', 'vol', 'pct_chg'],\n",
" df=None)\n",
"\n",
"print('daily basic')\n",
"df = read_and_merge_h5_data('../../data/daily_basic.h5', key='daily_basic',\n",
" columns=['ts_code', 'trade_date', 'turnover_rate', 'pe_ttm', 'circ_mv', 'volume_ratio',\n",
" 'is_st'], df=df, join='inner')\n",
"\n",
"print('stk limit')\n",
"df = read_and_merge_h5_data('../../data/stk_limit.h5', key='stk_limit',\n",
" columns=['ts_code', 'trade_date', 'pre_close', 'up_limit', 'down_limit'],\n",
" df=df)\n",
"print('money flow')\n",
"df = read_and_merge_h5_data('../../data/money_flow.h5', key='money_flow',\n",
" columns=['ts_code', 'trade_date', 'buy_sm_vol', 'sell_sm_vol', 'buy_lg_vol', 'sell_lg_vol',\n",
" 'buy_elg_vol', 'sell_elg_vol', 'net_mf_vol'],\n",
" df=df)\n",
"print('cyq perf')\n",
"df = read_and_merge_h5_data('../../data/cyq_perf.h5', key='cyq_perf',\n",
" columns=['ts_code', 'trade_date', 'his_low', 'his_high', 'cost_5pct', 'cost_15pct',\n",
" 'cost_50pct',\n",
" 'cost_85pct', 'cost_95pct', 'weight_avg', 'winner_rate'],\n",
" df=df)\n",
"print(df.info())"
],
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"daily data\n",
"daily basic\n",
"inner merge on ['ts_code', 'trade_date']\n",
"stk limit\n",
"left merge on ['ts_code', 'trade_date']\n",
"money flow\n",
"left merge on ['ts_code', 'trade_date']\n",
"cyq perf\n",
"left merge on ['ts_code', 'trade_date']\n",
"<class 'pandas.core.frame.DataFrame'>\n",
"RangeIndex: 8477357 entries, 0 to 8477356\n",
"Data columns (total 31 columns):\n",
" # Column Dtype \n",
"--- ------ ----- \n",
" 0 ts_code object \n",
" 1 trade_date datetime64[ns]\n",
" 2 open float64 \n",
" 3 close float64 \n",
" 4 high float64 \n",
" 5 low float64 \n",
" 6 vol float64 \n",
" 7 pct_chg float64 \n",
" 8 turnover_rate float64 \n",
" 9 pe_ttm float64 \n",
" 10 circ_mv float64 \n",
" 11 volume_ratio float64 \n",
" 12 is_st bool \n",
" 13 up_limit float64 \n",
" 14 down_limit float64 \n",
" 15 buy_sm_vol float64 \n",
" 16 sell_sm_vol float64 \n",
" 17 buy_lg_vol float64 \n",
" 18 sell_lg_vol float64 \n",
" 19 buy_elg_vol float64 \n",
" 20 sell_elg_vol float64 \n",
" 21 net_mf_vol float64 \n",
" 22 his_low float64 \n",
" 23 his_high float64 \n",
" 24 cost_5pct float64 \n",
" 25 cost_15pct float64 \n",
" 26 cost_50pct float64 \n",
" 27 cost_85pct float64 \n",
" 28 cost_95pct float64 \n",
" 29 weight_avg float64 \n",
" 30 winner_rate float64 \n",
"dtypes: bool(1), datetime64[ns](1), float64(28), object(1)\n",
"memory usage: 1.9+ GB\n",
"None\n"
]
}
],
"execution_count": 2
},
{
"cell_type": "code",
"id": "cac01788dac10678",
"metadata": {
"ExecuteTime": {
"end_time": "2025-03-31T14:49:13.957935Z",
"start_time": "2025-03-31T14:48:58.472449Z"
}
},
"source": [
"print('industry')\n",
"industry_df = read_and_merge_h5_data('../../data/industry_data.h5', key='industry_data',\n",
" columns=['ts_code', 'l2_code', 'in_date'],\n",
" df=None, on=['ts_code'], join='left')\n",
"\n",
"\n",
"def merge_with_industry_data(df, industry_df):\n",
" # 确保日期字段是 datetime 类型\n",
" df['trade_date'] = pd.to_datetime(df['trade_date'])\n",
" industry_df['in_date'] = pd.to_datetime(industry_df['in_date'])\n",
"\n",
" # 对 industry_df 按 ts_code 和 in_date 排序\n",
" industry_df_sorted = industry_df.sort_values(['in_date', 'ts_code'])\n",
"\n",
" # 对原始 df 按 ts_code 和 trade_date 排序\n",
" df_sorted = df.sort_values(['trade_date', 'ts_code'])\n",
"\n",
" # 使用 merge_asof 进行向后合并\n",
" merged = pd.merge_asof(\n",
" df_sorted,\n",
" industry_df_sorted,\n",
" by='ts_code', # 按 ts_code 分组\n",
" left_on='trade_date',\n",
" right_on='in_date',\n",
" direction='backward'\n",
" )\n",
"\n",
" # 获取每个 ts_code 的最早 in_date 记录\n",
" min_in_date_per_ts = (industry_df_sorted\n",
" .groupby('ts_code')\n",
" .first()\n",
" .reset_index()[['ts_code', 'l2_code']])\n",
"\n",
" # 填充未匹配到的记录trade_date 早于所有 in_date 的情况)\n",
" merged['l2_code'] = merged['l2_code'].fillna(\n",
" merged['ts_code'].map(min_in_date_per_ts.set_index('ts_code')['l2_code'])\n",
" )\n",
"\n",
" # 保留需要的列并重置索引\n",
" result = merged.reset_index(drop=True)\n",
" return result\n",
"\n",
"\n",
"# 使用示例\n",
"df = merge_with_industry_data(df, industry_df)\n",
"# print(mdf[mdf['ts_code'] == '600751.SH'][['ts_code', 'trade_date', 'l2_code']])"
],
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"industry\n"
]
}
],
"execution_count": 3
},
{
"cell_type": "code",
"id": "c4e9e1d31da6dba6",
"metadata": {
"jupyter": {
"source_hidden": true
},
"ExecuteTime": {
"end_time": "2025-03-31T14:49:14.289341Z",
"start_time": "2025-03-31T14:49:14.053158Z"
}
},
"source": [
"def calculate_indicators(df):\n",
" \"\"\"\n",
" 计算四个指标当日涨跌幅、5日移动平均、RSI、MACD。\n",
" \"\"\"\n",
" df = df.sort_values('trade_date')\n",
" df['daily_return'] = (df['close'] - df['pre_close']) / df['pre_close'] * 100\n",
" # df['5_day_ma'] = df['close'].rolling(window=5).mean()\n",
" delta = df['close'].diff()\n",
" gain = delta.where(delta > 0, 0)\n",
" loss = -delta.where(delta < 0, 0)\n",
" avg_gain = gain.rolling(window=14).mean()\n",
" avg_loss = loss.rolling(window=14).mean()\n",
" rs = avg_gain / avg_loss\n",
" df['RSI'] = 100 - (100 / (1 + rs))\n",
"\n",
" # 计算MACD\n",
" ema12 = df['close'].ewm(span=12, adjust=False).mean()\n",
" ema26 = df['close'].ewm(span=26, adjust=False).mean()\n",
" df['MACD'] = ema12 - ema26\n",
" df['Signal_line'] = df['MACD'].ewm(span=9, adjust=False).mean()\n",
" df['MACD_hist'] = df['MACD'] - df['Signal_line']\n",
"\n",
" # 4. 情绪因子1市场上涨比例Up Ratio\n",
" df['up_ratio'] = df['daily_return'].apply(lambda x: 1 if x > 0 else 0)\n",
" df['up_ratio_20d'] = df['up_ratio'].rolling(window=20).mean() # 过去20天上涨比例\n",
"\n",
" # 5. 情绪因子2成交量变化率Volume Change Rate\n",
" df['volume_mean'] = df['vol'].rolling(window=20).mean() # 过去20天的平均成交量\n",
" df['volume_change_rate'] = (df['vol'] - df['volume_mean']) / df['volume_mean'] * 100 # 成交量变化率\n",
"\n",
" # 6. 情绪因子3波动率Volatility\n",
" df['volatility'] = df['daily_return'].rolling(window=20).std() # 过去20天的日收益率标准差\n",
"\n",
" # 7. 情绪因子4成交额变化率Amount Change Rate\n",
" df['amount_mean'] = df['amount'].rolling(window=20).mean() # 过去20天的平均成交额\n",
" df['amount_change_rate'] = (df['amount'] - df['amount_mean']) / df['amount_mean'] * 100 # 成交额变化率\n",
"\n",
" return df\n",
"\n",
"\n",
"def generate_index_indicators(h5_filename):\n",
" df = pd.read_hdf(h5_filename, key='index_data')\n",
" df['trade_date'] = pd.to_datetime(df['trade_date'], format='%Y%m%d')\n",
" df = df.sort_values('trade_date')\n",
"\n",
" # 计算每个ts_code的相关指标\n",
" df_indicators = []\n",
" for ts_code in df['ts_code'].unique():\n",
" df_index = df[df['ts_code'] == ts_code].copy()\n",
" df_index = calculate_indicators(df_index)\n",
" df_indicators.append(df_index)\n",
"\n",
" # 合并所有指数的结果\n",
" df_all_indicators = pd.concat(df_indicators, ignore_index=True)\n",
"\n",
" # 保留trade_date列并将同一天的数据按ts_code合并成一行\n",
" df_final = df_all_indicators.pivot_table(\n",
" index='trade_date',\n",
" columns='ts_code',\n",
" values=['daily_return', 'RSI', 'MACD', 'Signal_line',\n",
" 'MACD_hist', 'up_ratio_20d', 'volume_change_rate', 'volatility',\n",
" 'amount_change_rate', 'amount_mean'],\n",
" aggfunc='last'\n",
" )\n",
"\n",
" df_final.columns = [f\"{col[1]}_{col[0]}\" for col in df_final.columns]\n",
" df_final = df_final.reset_index()\n",
"\n",
" return df_final\n",
"\n",
"\n",
"# 使用函数\n",
"h5_filename = '../../data/index_data.h5'\n",
"index_data = generate_index_indicators(h5_filename)\n",
"index_data = index_data.dropna()\n"
],
"outputs": [],
"execution_count": 4
},
{
"cell_type": "code",
"id": "a735bc02ceb4d872",
"metadata": {
"ExecuteTime": {
"end_time": "2025-03-31T14:49:14.359139Z",
"start_time": "2025-03-31T14:49:14.310625Z"
}
},
"source": [
"import numpy as np\n",
"import talib\n",
"\n",
"\n",
"def get_rolling_factor(df):\n",
" old_columns = df.columns.tolist()[:]\n",
" # 按股票和日期排序\n",
" df = df.sort_values(by=['ts_code', 'trade_date'])\n",
" grouped = df.groupby('ts_code', group_keys=False)\n",
"\n",
" # df[\"gap_next_open\"] = (df[\"open\"].shift(-1) - df[\"close\"]) / df[\"close\"]\n",
"\n",
" df['return_skew'] = grouped['pct_chg'].rolling(window=5).skew().reset_index(0, drop=True)\n",
" df['return_kurtosis'] = grouped['pct_chg'].rolling(window=5).kurt().reset_index(0, drop=True)\n",
"\n",
" # 因子 1短期成交量变化率\n",
" df['volume_change_rate'] = (\n",
" grouped['vol'].rolling(window=2).mean() /\n",
" grouped['vol'].rolling(window=10).mean() - 1\n",
" ).reset_index(level=0, drop=True) # 确保索引对齐\n",
"\n",
" # 因子 2成交量突破信号\n",
" max_volume = grouped['vol'].rolling(window=5).max().reset_index(level=0, drop=True) # 确保索引对齐\n",
" df['cat_volume_breakout'] = (df['vol'] > max_volume)\n",
"\n",
" # 因子 3换手率均线偏离度\n",
" mean_turnover = grouped['turnover_rate'].rolling(window=3).mean().reset_index(level=0, drop=True)\n",
" std_turnover = grouped['turnover_rate'].rolling(window=3).std().reset_index(level=0, drop=True)\n",
" df['turnover_deviation'] = (df['turnover_rate'] - mean_turnover) / std_turnover\n",
"\n",
" # 因子 4换手率激增信号\n",
" df['cat_turnover_spike'] = (df['turnover_rate'] > mean_turnover + 2 * std_turnover)\n",
"\n",
" # 因子 5量比均值\n",
" df['avg_volume_ratio'] = grouped['volume_ratio'].rolling(window=3).mean().reset_index(level=0, drop=True)\n",
"\n",
" # 因子 6量比突破信号\n",
" max_volume_ratio = grouped['volume_ratio'].rolling(window=5).max().reset_index(level=0, drop=True)\n",
" df['cat_volume_ratio_breakout'] = (df['volume_ratio'] > max_volume_ratio)\n",
"\n",
" df['vol_spike'] = grouped.apply(\n",
" lambda x: pd.Series(x['vol'].rolling(20).mean(), index=x.index)\n",
" )\n",
" df['vol_std_5'] = df['vol'].pct_change().rolling(5).std()\n",
"\n",
" # 计算 ATR\n",
" df['atr_14'] = grouped.apply(\n",
" lambda x: pd.Series(talib.ATR(x['high'].values, x['low'].values, x['close'].values, timeperiod=14),\n",
" index=x.index)\n",
" )\n",
" df['atr_6'] = grouped.apply(\n",
" lambda x: pd.Series(talib.ATR(x['high'].values, x['low'].values, x['close'].values, timeperiod=6),\n",
" index=x.index)\n",
" )\n",
"\n",
" # 计算 OBV 及其均线\n",
" df['obv'] = grouped.apply(\n",
" lambda x: pd.Series(talib.OBV(x['close'].values, x['vol'].values), index=x.index)\n",
" )\n",
" df['maobv_6'] = grouped.apply(\n",
" lambda x: pd.Series(talib.SMA(x['obv'].values, timeperiod=6), index=x.index)\n",
" )\n",
"\n",
" df['rsi_3'] = grouped.apply(\n",
" lambda x: pd.Series(talib.RSI(x['close'].values, timeperiod=3), index=x.index)\n",
" )\n",
" # df['rsi_6'] = grouped.apply(\n",
" # lambda x: pd.Series(talib.RSI(x['close'].values, timeperiod=6), index=x.index)\n",
" # )\n",
" # df['rsi_9'] = grouped.apply(\n",
" # lambda x: pd.Series(talib.RSI(x['close'].values, timeperiod=9), index=x.index)\n",
" # )\n",
"\n",
" # 计算 return_10 和 return_20\n",
" df['return_5'] = grouped['close'].apply(lambda x: x / x.shift(5) - 1)\n",
" # df['return_10'] = grouped['close'].apply(lambda x: x / x.shift(10) - 1)\n",
" df['return_20'] = grouped['close'].apply(lambda x: x / x.shift(20) - 1)\n",
"\n",
" # df['avg_close_5'] = grouped['close'].apply(lambda x: x.rolling(window=5).mean() / x)\n",
"\n",
" # 计算标准差指标\n",
" df['std_return_5'] = grouped['close'].apply(lambda x: x.pct_change().rolling(window=5).std())\n",
" # df['std_return_15'] = grouped['close'].apply(lambda x: x.pct_change().rolling(window=15).std())\n",
" # df['std_return_25'] = grouped['close'].apply(lambda x: x.pct_change().rolling(window=25).std())\n",
" df['std_return_90'] = grouped['close'].apply(lambda x: x.pct_change().rolling(window=90).std())\n",
" df['std_return_90_2'] = grouped['close'].apply(lambda x: x.shift(10).pct_change().rolling(window=90).std())\n",
"\n",
" # 计算 EMA 指标\n",
" df['_ema_5'] = grouped['close'].apply(\n",
" lambda x: pd.Series(talib.EMA(x.values, timeperiod=5), index=x.index)\n",
" )\n",
" df['_ema_13'] = grouped['close'].apply(\n",
" lambda x: pd.Series(talib.EMA(x.values, timeperiod=13), index=x.index)\n",
" )\n",
" df['_ema_20'] = grouped['close'].apply(\n",
" lambda x: pd.Series(talib.EMA(x.values, timeperiod=20), index=x.index)\n",
" )\n",
" df['_ema_60'] = grouped['close'].apply(\n",
" lambda x: pd.Series(talib.EMA(x.values, timeperiod=60), index=x.index)\n",
" )\n",
"\n",
" # 计算 act_factor1, act_factor2, act_factor3, act_factor4\n",
" df['act_factor1'] = grouped['_ema_5'].apply(\n",
" lambda x: np.arctan((x / x.shift(1) - 1) * 100) * 57.3 / 50\n",
" )\n",
" df['act_factor2'] = grouped['_ema_13'].apply(\n",
" lambda x: np.arctan((x / x.shift(1) - 1) * 100) * 57.3 / 40\n",
" )\n",
" df['act_factor3'] = grouped['_ema_20'].apply(\n",
" lambda x: np.arctan((x / x.shift(1) - 1) * 100) * 57.3 / 21\n",
" )\n",
" df['act_factor4'] = grouped['_ema_60'].apply(\n",
" lambda x: np.arctan((x / x.shift(1) - 1) * 100) * 57.3 / 10\n",
" )\n",
"\n",
" # 根据 trade_date 截面计算排名\n",
" df['rank_act_factor1'] = df.groupby('trade_date', group_keys=False)['act_factor1'].rank(ascending=False, pct=True)\n",
" df['rank_act_factor2'] = df.groupby('trade_date', group_keys=False)['act_factor2'].rank(ascending=False, pct=True)\n",
" df['rank_act_factor3'] = df.groupby('trade_date', group_keys=False)['act_factor3'].rank(ascending=False, pct=True)\n",
"\n",
" df['log(circ_mv)'] = np.log(df['circ_mv'])\n",
"\n",
" def rolling_covariance(x, y, window):\n",
" return x.rolling(window).cov(y)\n",
"\n",
" def delta(series, period):\n",
" return series.diff(period)\n",
"\n",
" def rank(series):\n",
" return series.rank(pct=True)\n",
"\n",
" def stddev(series, window):\n",
" return series.rolling(window).std()\n",
"\n",
" window_high_volume = 5\n",
" window_close_stddev = 20\n",
" period_delta = 5\n",
" df['cov'] = rolling_covariance(df['high'], df['vol'], window_high_volume)\n",
" df['delta_cov'] = delta(df['cov'], period_delta)\n",
" df['_rank_stddev'] = rank(stddev(df['close'], window_close_stddev))\n",
" df['alpha_22_improved'] = -1 * df['delta_cov'] * df['_rank_stddev']\n",
"\n",
" df['alpha_003'] = np.where(df['high'] != df['low'],\n",
" (df['close'] - df['open']) / (df['high'] - df['low']),\n",
" 0)\n",
"\n",
" df['alpha_007'] = grouped.apply(lambda x: x['close'].rolling(5).corr(x['vol'])).reset_index(level=0, drop=True)\n",
" df['alpha_007'] = df.groupby('trade_date', group_keys=False)['alpha_007'].rank(ascending=True, pct=True)\n",
"\n",
" df['alpha_013'] = grouped['close'].transform(lambda x: x.rolling(5).sum() - x.rolling(20).sum())\n",
" df['alpha_013'] = df.groupby('trade_date', group_keys=False)['alpha_013'].rank(ascending=True, pct=True)\n",
"\n",
" df['cat_up_limit'] = (df['close'] == df['up_limit']) # 是否涨停1表示涨停0表示未涨停\n",
" df['cat_down_limit'] = (df['close'] == df['down_limit']) # 是否跌停1表示跌停0表示未跌停\n",
" df['up_limit_count_10d'] = grouped['cat_up_limit'].rolling(window=10, min_periods=1).sum().reset_index(level=0,\n",
" drop=True)\n",
" df['down_limit_count_10d'] = grouped['cat_down_limit'].rolling(window=10, min_periods=1).sum().reset_index(level=0,\n",
" drop=True)\n",
"\n",
" # 3. 最近连续涨跌停天数\n",
" def calculate_consecutive_limits(series):\n",
" \"\"\"\n",
" 计算连续涨停/跌停天数。\n",
" \"\"\"\n",
" consecutive_up = series * (series.groupby((series != series.shift()).cumsum()).cumcount() + 1)\n",
" consecutive_down = series * (series.groupby((series != series.shift()).cumsum()).cumcount() + 1)\n",
" return consecutive_up, consecutive_down\n",
"\n",
" # 连续涨停天数\n",
" df['consecutive_up_limit'] = grouped['cat_up_limit'].apply(\n",
" lambda x: calculate_consecutive_limits(x)[0]\n",
" ).reset_index(level=0, drop=True)\n",
"\n",
" df['vol_break'] = np.where((df['close'] > df['cost_85pct']) & (df['volume_ratio'] > 2), 1, 0)\n",
"\n",
" df['weight_roc5'] = grouped['weight_avg'].apply(lambda x: x.pct_change(5))\n",
"\n",
" def rolling_corr(group):\n",
" roc_close = group['close'].pct_change()\n",
" roc_weight = group['weight_avg'].pct_change()\n",
" return roc_close.rolling(10).corr(roc_weight)\n",
"\n",
" df['price_cost_divergence'] = grouped.apply(rolling_corr)\n",
"\n",
" df['smallcap_concentration'] = (1 / df['log(circ_mv)']) * (df['cost_85pct'] - df['cost_15pct'])\n",
"\n",
" # 16. 筹码稳定性指数 (20日波动率)\n",
" df['weight_std20'] = grouped['weight_avg'].apply(lambda x: x.rolling(20).std())\n",
" df['cost_stability'] = df['weight_std20'] / grouped['weight_avg'].transform(lambda x: x.rolling(20).mean())\n",
"\n",
" # 17. 成本区间突破标记\n",
" df['high_cost_break_days'] = grouped.apply(lambda g: g['close'].gt(g['cost_95pct']).rolling(5).sum())\n",
"\n",
" # 20. 筹码-流动性风险\n",
" df['liquidity_risk'] = (df['cost_95pct'] - df['cost_5pct']) * (\n",
" 1 / grouped['vol'].transform(lambda x: x.rolling(10).mean()))\n",
"\n",
" # 7. 市值波动率因子\n",
" df['turnover_std'] = grouped['turnover_rate'].rolling(window=20).std().reset_index(level=0, drop=True)\n",
" df['mv_volatility'] = grouped.apply(lambda x: x['turnover_std'] / x['log(circ_mv)']).reset_index(level=0, drop=True)\n",
"\n",
" # 8. 市值成长性因子\n",
" df['volume_growth'] = grouped['vol'].pct_change(periods=20).reset_index(level=0, drop=True)\n",
" df['mv_growth'] = grouped.apply(lambda x: x['volume_growth'] / x['log(circ_mv)']).reset_index(level=0, drop=True)\n",
"\n",
" df[\"ar\"] = df[\"high\"].div(df[\"open\"]).rolling(3).sum() / df[\"open\"].div(df[\"low\"]).rolling(3).sum() * 100\n",
" # 计算 BR 指标\n",
" df[\"pre_close\"] = df[\"close\"].shift(1)\n",
" df[\"br_up\"] = (df[\"high\"] - df[\"pre_close\"]).clip(lower=0)\n",
" df[\"br_down\"] = (df[\"pre_close\"] - df[\"low\"]).clip(lower=0)\n",
" df[\"br\"] = df[\"br_up\"].rolling(3).sum() / df[\"br_down\"].rolling(3).sum() * 100\n",
" df['arbr'] = df['ar'] - df['br']\n",
" df.drop(columns=[\"pre_close\", \"br_up\", \"br_down\", 'ar', 'br'], inplace=True)\n",
" \n",
" df.drop(columns=['weight_std20'], inplace=True, errors='ignore')\n",
" new_columns = [col for col in df.columns.tolist()[:] if col not in old_columns]\n",
"\n",
" return df, new_columns\n",
"\n",
"\n",
"def get_simple_factor(df):\n",
" old_columns = df.columns.tolist()[:]\n",
" df = df.sort_values(by=['ts_code', 'trade_date'])\n",
"\n",
" alpha = 0.5\n",
" df['momentum_factor'] = df['volume_change_rate'] + alpha * df['turnover_deviation']\n",
" df['resonance_factor'] = df['volume_ratio'] * df['pct_chg']\n",
" df['log_close'] = np.log(df['close'])\n",
"\n",
" df['cat_vol_spike'] = df['vol'] > 2 * df['vol_spike']\n",
"\n",
" df['up'] = (df['high'] - df[['close', 'open']].max(axis=1)) / df['close']\n",
" df['down'] = (df[['close', 'open']].min(axis=1) - df['low']) / df['close']\n",
"\n",
" df['obv-maobv_6'] = df['obv'] - df['maobv_6']\n",
"\n",
" # 计算比值指标\n",
" df['std_return_5 / std_return_90'] = df['std_return_5'] / df['std_return_90']\n",
" # df['std_return_5 / std_return_25'] = df['std_return_5'] / df['std_return_25']\n",
"\n",
" # 计算标准差差值\n",
" df['std_return_90 - std_return_90_2'] = df['std_return_90'] - df['std_return_90_2']\n",
"\n",
" # df['cat_af1'] = df['act_factor1'] > 0\n",
" df['cat_af2'] = df['act_factor2'] > df['act_factor1']\n",
" df['cat_af3'] = df['act_factor3'] > df['act_factor2']\n",
" df['cat_af4'] = df['act_factor4'] > df['act_factor3']\n",
"\n",
" # 计算 act_factor5 和 act_factor6\n",
" df['act_factor5'] = df['act_factor1'] + df['act_factor2'] + df['act_factor3'] + df['act_factor4']\n",
" df['act_factor6'] = (df['act_factor1'] - df['act_factor2']) / np.sqrt(\n",
" df['act_factor1'] ** 2 + df['act_factor2'] ** 2)\n",
"\n",
" df['active_buy_volume_large'] = df['buy_lg_vol'] / df['net_mf_vol']\n",
" df['active_buy_volume_big'] = df['buy_elg_vol'] / df['net_mf_vol']\n",
" df['active_buy_volume_small'] = df['buy_sm_vol'] / df['net_mf_vol']\n",
"\n",
" df['buy_lg_vol_minus_sell_lg_vol'] = (df['buy_lg_vol'] - df['sell_lg_vol']) / df['net_mf_vol']\n",
" df['buy_elg_vol_minus_sell_elg_vol'] = (df['buy_elg_vol'] - df['sell_elg_vol']) / df['net_mf_vol']\n",
"\n",
" df['log(circ_mv)'] = np.log(df['circ_mv'])\n",
"\n",
" df['ctrl_strength'] = (df['cost_85pct'] - df['cost_15pct']) / (df['his_high'] - df['his_low'])\n",
"\n",
" df['low_cost_dev'] = (df['close'] - df['cost_5pct']) / (df['cost_50pct'] - df['cost_5pct'])\n",
"\n",
" df['asymmetry'] = (df['cost_95pct'] - df['cost_50pct']) / (df['cost_50pct'] - df['cost_5pct'])\n",
"\n",
" df['lock_factor'] = df['turnover_rate'] * (\n",
" 1 - (df['cost_95pct'] - df['cost_5pct']) / (df['his_high'] - df['his_low']))\n",
"\n",
" df['cat_vol_break'] = (df['close'] > df['cost_85pct']) & (df['volume_ratio'] > 2)\n",
"\n",
" df['cost_atr_adj'] = (df['cost_95pct'] - df['cost_5pct']) / df['atr_14']\n",
"\n",
" # 12. 小盘股筹码集中度\n",
" df['smallcap_concentration'] = (1 / df['log(circ_mv)']) * (df['cost_85pct'] - df['cost_15pct'])\n",
"\n",
" df['cat_golden_resonance'] = ((df['close'] > df['weight_avg']) &\n",
" (df['volume_ratio'] > 1.5) &\n",
" (df['winner_rate'] > 0.7))\n",
"\n",
" df['mv_turnover_ratio'] = df['turnover_rate'] / df['log(circ_mv)']\n",
"\n",
" df['mv_adjusted_volume'] = df['vol'] / df['log(circ_mv)']\n",
"\n",
" df['mv_weighted_turnover'] = df['turnover_rate'] * (1 / df['log(circ_mv)'])\n",
"\n",
" df['nonlinear_mv_volume'] = df['vol'] / df['log(circ_mv)']\n",
"\n",
" df['mv_volume_ratio'] = df['volume_ratio'] / df['log(circ_mv)']\n",
"\n",
" df['mv_momentum'] = df['turnover_rate'] * df['volume_ratio'] / df['log(circ_mv)']\n",
"\n",
" drop_columns = [col for col in df.columns if col.startswith('_')]\n",
" df.drop(columns=drop_columns, inplace=True, errors='ignore')\n",
"\n",
" new_columns = [col for col in df.columns.tolist()[:] if col not in old_columns]\n",
" return df, new_columns\n"
],
"outputs": [],
"execution_count": 5
},
{
"cell_type": "code",
"id": "53f86ddc0677a6d7",
"metadata": {
"jupyter": {
"source_hidden": true
},
"scrolled": true,
"ExecuteTime": {
"end_time": "2025-03-31T14:49:20.203711Z",
"start_time": "2025-03-31T14:49:14.390412Z"
}
},
"source": [
"from utils.factor import get_act_factor\n",
"\n",
"\n",
"def read_industry_data(h5_filename):\n",
" # 读取 H5 文件中所有的行业数据\n",
" industry_data = pd.read_hdf(h5_filename, key='sw_daily', columns=[\n",
" 'ts_code', 'trade_date', 'open', 'close', 'high', 'low', 'pe', 'pb', 'vol'\n",
" ]) # 假设 H5 文件的键是 'industry_data'\n",
" industry_data = industry_data.sort_values(by=['ts_code', 'trade_date'])\n",
" industry_data = industry_data.reindex()\n",
" industry_data['trade_date'] = pd.to_datetime(industry_data['trade_date'], format='%Y%m%d')\n",
"\n",
" grouped = industry_data.groupby('ts_code', group_keys=False)\n",
" industry_data['obv'] = grouped.apply(\n",
" lambda x: pd.Series(talib.OBV(x['close'].values, x['vol'].values), index=x.index)\n",
" )\n",
" industry_data['return_5'] = grouped['close'].apply(lambda x: x / x.shift(5) - 1)\n",
" industry_data['return_20'] = grouped['close'].apply(lambda x: x / x.shift(20) - 1)\n",
"\n",
" industry_data = get_act_factor(industry_data, cat=False)\n",
" industry_data = industry_data.sort_values(by=['trade_date', 'ts_code'])\n",
"\n",
" # # 计算每天每个 ts_code 的因子和当天所有 ts_code 的中位数的偏差\n",
" # factor_columns = ['obv', 'return_5', 'return_20', 'act_factor1', 'act_factor2', 'act_factor3', 'act_factor4'] # 因子列\n",
" # \n",
" # for factor in factor_columns:\n",
" # if factor in industry_data.columns:\n",
" # # 计算每天每个 ts_code 的因子值与当天所有 ts_code 的中位数的偏差\n",
" # industry_data[f'{factor}_deviation'] = industry_data.groupby('trade_date')[factor].transform(\n",
" # lambda x: x - x.mean())\n",
"\n",
" industry_data['return_5_percentile'] = industry_data.groupby('trade_date')['return_5'].transform(\n",
" lambda x: x.rank(pct=True))\n",
" industry_data['return_20_percentile'] = industry_data.groupby('trade_date')['return_20'].transform(\n",
" lambda x: x.rank(pct=True))\n",
" industry_data = industry_data.drop(columns=['open', 'close', 'high', 'low', 'pe', 'pb', 'vol'])\n",
"\n",
" industry_data = industry_data.rename(\n",
" columns={col: f'industry_{col}' for col in industry_data.columns if col not in ['ts_code', 'trade_date']})\n",
"\n",
" industry_data = industry_data.rename(columns={'ts_code': 'cat_l2_code'})\n",
" return industry_data\n",
"\n",
"\n",
"industry_df = read_industry_data('../../data/sw_daily.h5')\n"
],
"outputs": [],
"execution_count": 6
},
{
"cell_type": "code",
"id": "dbe2fd8021b9417f",
"metadata": {
"ExecuteTime": {
"end_time": "2025-03-31T14:49:20.248588Z",
"start_time": "2025-03-31T14:49:20.244295Z"
}
},
"source": [
"origin_columns = df.columns.tolist()\n",
"origin_columns = [col for col in origin_columns if\n",
" col not in ['turnover_rate', 'pe_ttm', 'volume_ratio', 'vol', 'pct_chg', 'l2_code', 'winner_rate']]\n",
"origin_columns = [col for col in origin_columns if col not in index_data.columns]\n",
"origin_columns = [col for col in origin_columns if 'cyq' not in col]\n",
"print(origin_columns)"
],
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"['ts_code', 'open', 'close', 'high', 'low', 'circ_mv', 'is_st', 'up_limit', 'down_limit', 'buy_sm_vol', 'sell_sm_vol', 'buy_lg_vol', 'sell_lg_vol', 'buy_elg_vol', 'sell_elg_vol', 'net_mf_vol', 'his_low', 'his_high', 'cost_5pct', 'cost_15pct', 'cost_50pct', 'cost_85pct', 'cost_95pct', 'weight_avg', 'in_date']\n"
]
}
],
"execution_count": 7
},
{
"cell_type": "code",
"id": "85c3e3d0235ffffa",
"metadata": {
"ExecuteTime": {
"end_time": "2025-03-31T14:49:20.471125Z",
"start_time": "2025-03-31T14:49:20.288287Z"
}
},
"source": [
"print(df[df['is_st']][['ts_code', 'trade_date', 'is_st']])"
],
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" ts_code trade_date is_st\n",
"29 000037.SZ 2017-01-03 True\n",
"72 000408.SZ 2017-01-03 True\n",
"95 000504.SZ 2017-01-03 True\n",
"96 000505.SZ 2017-01-03 True\n",
"101 000511.SZ 2017-01-03 True\n",
"... ... ... ...\n",
"8476334 603869.SH 2025-03-28 True\n",
"8476339 603879.SH 2025-03-28 True\n",
"8476386 603959.SH 2025-03-28 True\n",
"8476769 688282.SH 2025-03-28 True\n",
"8476773 688287.SH 2025-03-28 True\n",
"\n",
"[192712 rows x 3 columns]\n"
]
}
],
"execution_count": 8
},
{
"cell_type": "code",
"id": "92d84ce15a562ec6",
"metadata": {
"ExecuteTime": {
"end_time": "2025-03-31T14:53:44.202296Z",
"start_time": "2025-03-31T14:51:08.550768Z"
}
},
"source": [
"def filter_data(df):\n",
" # df = df.groupby('trade_date').apply(lambda x: x.nlargest(1000, 'act_factor1'))\n",
" df = df[~df['is_st']]\n",
" df = df[~df['ts_code'].str.endswith('BJ')]\n",
" df = df[~df['ts_code'].str.startswith('30')]\n",
" df = df[~df['ts_code'].str.startswith('68')]\n",
" df = df[~df['ts_code'].str.startswith('8')]\n",
" df = df[df['trade_date'] >= '20180101']\n",
" df = df.drop(columns=['in_date'])\n",
" df = df.reset_index(drop=True)\n",
" return df\n",
"\n",
"\n",
"df = filter_data(df)\n",
"# df = get_technical_factor(df)\n",
"# df = get_act_factor(df)\n",
"# df = get_money_flow_factor(df)\n",
"# df = get_alpha_factor(df)\n",
"# df = get_limit_factor(df)\n",
"# df = get_cyp_perf_factor(df)\n",
"# df = get_mv_factors(df)\n",
"df, _ = get_rolling_factor(df)\n",
"df, _ = get_simple_factor(df)\n",
"# df = df.merge(industry_df, on=['l2_code', 'trade_date'], how='left')\n",
"df = df.rename(columns={'l2_code': 'cat_l2_code'})\n",
"# df = df.merge(index_data, on='trade_date', how='left')\n",
"\n",
"print(df.info())"
],
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"<class 'pandas.core.frame.DataFrame'>\n",
"Index: 5118212 entries, 0 to 5118211\n",
"Columns: 115 entries, ts_code to mv_momentum\n",
"dtypes: bool(12), datetime64[ns](1), float64(98), int32(1), int64(1), object(2)\n",
"memory usage: 4.0+ GB\n",
"None\n"
]
}
],
"execution_count": 10
},
{
"cell_type": "code",
"id": "b87b938028afa206",
"metadata": {
"ExecuteTime": {
"end_time": "2025-03-31T14:53:47.033579Z",
"start_time": "2025-03-31T14:53:45.267610Z"
}
},
"source": [
"from scipy.stats import ks_2samp, wasserstein_distance\n",
"from sklearn.metrics import roc_auc_score\n",
"from sklearn.model_selection import train_test_split\n",
"from sklearn.preprocessing import StandardScaler\n",
"\n",
"\n",
"def remove_shifted_features(train_data, test_data, feature_columns, ks_threshold=0.05, wasserstein_threshold=0.1,\n",
" importance_threshold=0.05):\n",
" dropped_features = []\n",
"\n",
" # **统计数据漂移**\n",
" numeric_columns = train_data.select_dtypes(include=['float64', 'int64']).columns\n",
" numeric_columns = [col for col in numeric_columns if col in feature_columns]\n",
" for feature in numeric_columns:\n",
" ks_stat, p_value = ks_2samp(train_data[feature], test_data[feature])\n",
" wasserstein_dist = wasserstein_distance(train_data[feature], test_data[feature])\n",
"\n",
" if p_value < ks_threshold or wasserstein_dist > wasserstein_threshold:\n",
" dropped_features.append(feature)\n",
"\n",
" print(f\"检测到 {len(dropped_features)} 个可能漂移的特征: {dropped_features}\")\n",
"\n",
" # **应用阈值进行最终筛选**\n",
" filtered_features = [f for f in feature_columns if f not in dropped_features]\n",
"\n",
" return filtered_features, dropped_features\n",
"\n"
],
"outputs": [],
"execution_count": 11
},
{
"cell_type": "code",
"id": "f4f16d63ad18d1bc",
"metadata": {
"ExecuteTime": {
"end_time": "2025-03-31T14:53:47.069023Z",
"start_time": "2025-03-31T14:53:47.064157Z"
}
},
"source": [
"def create_deviation_within_dates(df, feature_columns):\n",
" groupby_col = 'cat_l2_code' # 使用 trade_date 进行分组\n",
" new_columns = {}\n",
" ret_feature_columns = feature_columns[:]\n",
"\n",
" # 自动选择所有数值型特征\n",
" num_features = [col for col in feature_columns if 'cat' not in col and 'index' not in col]\n",
"\n",
" # num_features = ['vol', 'pct_chg', 'turnover_rate', 'volume_ratio', 'cat_vol_spike', 'obv', 'maobv_6', 'return_5', 'return_10', 'return_20', 'std_return_5', 'std_return_15', 'std_return_90', 'std_return_90_2', 'act_factor1', 'act_factor2', 'act_factor3', 'act_factor4', 'act_factor5', 'act_factor6', 'rank_act_factor1', 'rank_act_factor2', 'rank_act_factor3', 'active_buy_volume_large', 'active_buy_volume_big', 'active_buy_volume_small', 'alpha_022', 'alpha_003', 'alpha_007', 'alpha_013']\n",
" num_features = [col for col in num_features if 'cat' not in col and 'industry' not in col]\n",
" num_features = [col for col in num_features if 'limit' not in col]\n",
" num_features = [col for col in num_features if 'cyq' not in col]\n",
"\n",
" # 遍历所有数值型特征\n",
" for feature in num_features:\n",
" if feature == 'trade_date': # 不需要对 'trade_date' 计算偏差\n",
" continue\n",
"\n",
" # grouped_mean = df.groupby(['trade_date'])[feature].transform('mean')\n",
" # deviation_col_name = f'deviation_mean_{feature}'\n",
" # new_columns[deviation_col_name] = df[feature] - grouped_mean\n",
" # ret_feature_columns.append(deviation_col_name)\n",
"\n",
" grouped_mean = df.groupby(['trade_date', groupby_col])[feature].transform('mean')\n",
" deviation_col_name = f'deviation_mean_{feature}'\n",
" new_columns[deviation_col_name] = df[feature] - grouped_mean\n",
" ret_feature_columns.append(deviation_col_name)\n",
"\n",
" # 将新计算的偏差特征与原始 DataFrame 合并\n",
" df = pd.concat([df, pd.DataFrame(new_columns)], axis=1)\n",
"\n",
" # for feature in ['obv', 'return_20', 'act_factor1', 'act_factor2', 'act_factor3', 'act_factor4']:\n",
" # df[f'deviation_industry_{feature}'] = df[feature] - df[f'industry_{feature}']\n",
"\n",
" return df, ret_feature_columns\n"
],
"outputs": [],
"execution_count": 12
},
{
"cell_type": "code",
"id": "40e6b68a91b30c79",
"metadata": {
"ExecuteTime": {
"end_time": "2025-03-31T14:53:48.018649Z",
"start_time": "2025-03-31T14:53:47.170060Z"
}
},
"source": [
"import pandas as pd\n",
"\n",
"\n",
"def remove_outliers_label_percentile(label: pd.Series, lower_percentile: float = 0.01, upper_percentile: float = 0.99,\n",
" log=True):\n",
" if not (0 <= lower_percentile < upper_percentile <= 1):\n",
" raise ValueError(\"Percentile values must satisfy 0 <= lower_percentile < upper_percentile <= 1.\")\n",
"\n",
" # Calculate lower and upper bounds based on percentiles\n",
" lower_bound = label.quantile(lower_percentile)\n",
" upper_bound = label.quantile(upper_percentile)\n",
"\n",
" # Filter out values outside the bounds\n",
" filtered_label = label[(label >= lower_bound) & (label <= upper_bound)]\n",
"\n",
" # Print the number of removed outliers\n",
" if log:\n",
" print(f\"Removed {len(label) - len(filtered_label)} outliers.\")\n",
" return filtered_label\n",
"\n",
"\n",
"def calculate_risk_adjusted_target(df, days=5):\n",
" df = df.sort_values(by=['ts_code', 'trade_date'])\n",
"\n",
" df['future_close'] = df.groupby('ts_code')['close'].shift(-days)\n",
" df['future_open'] = df.groupby('ts_code')['open'].shift(-1)\n",
" df['future_return'] = (df['future_close'] - df['future_open']) / df['future_open']\n",
"\n",
" df['future_volatility'] = df.groupby('ts_code')['future_return'].rolling(days, min_periods=1).std().reset_index(\n",
" level=0, drop=True)\n",
" sharpe_ratio = df['future_return'] * df['future_volatility']\n",
" sharpe_ratio.replace([np.inf, -np.inf], np.nan, inplace=True)\n",
"\n",
" return sharpe_ratio\n",
"\n",
"\n",
"def calculate_score(df, days=5, lambda_param=1.0):\n",
" def calculate_max_drawdown(prices):\n",
" peak = prices.iloc[0] # 初始化峰值\n",
" max_drawdown = 0 # 初始化最大回撤\n",
"\n",
" for price in prices:\n",
" if price > peak:\n",
" peak = price # 更新峰值\n",
" else:\n",
" drawdown = (peak - price) / peak # 计算当前回撤\n",
" max_drawdown = max(max_drawdown, drawdown) # 更新最大回撤\n",
"\n",
" return max_drawdown\n",
"\n",
" def compute_stock_score(stock_df):\n",
" stock_df = stock_df.sort_values(by=['trade_date'])\n",
" future_return = stock_df['future_return']\n",
" volatility = stock_df['close'].pct_change().rolling(days).std().shift(-days)\n",
" max_drawdown = stock_df['close'].rolling(days).apply(calculate_max_drawdown, raw=False).shift(-days)\n",
" score = future_return - lambda_param * max_drawdown\n",
"\n",
" return score\n",
"\n",
" scores = df.groupby('ts_code').apply(lambda x: compute_stock_score(x))\n",
" scores = scores.reset_index(level=0, drop=True)\n",
"\n",
" return scores\n",
"\n",
"\n",
"def remove_highly_correlated_features(df, feature_columns, threshold=0.9):\n",
" numeric_features = df[feature_columns].select_dtypes(include=[np.number]).columns.tolist()\n",
" if not numeric_features:\n",
" raise ValueError(\"No numeric features found in the provided data.\")\n",
"\n",
" corr_matrix = df[numeric_features].corr().abs()\n",
" upper = corr_matrix.where(np.triu(np.ones(corr_matrix.shape), k=1).astype(bool))\n",
" to_drop = [column for column in upper.columns if any(upper[column] > threshold)]\n",
" remaining_features = [col for col in feature_columns if col not in to_drop\n",
" or 'act' in col or 'af' in col]\n",
" return remaining_features\n",
"\n",
"import pandas as pd\n",
"from sklearn.preprocessing import StandardScaler\n",
"\n",
"def cross_sectional_standardization(df, features):\n",
" df_sorted = df.sort_values(by='trade_date') # 按时间排序\n",
" df_standardized = df_sorted.copy()\n",
"\n",
" for date in df_sorted['trade_date'].unique():\n",
" # 获取当前时间点的数据\n",
" current_data = df_standardized[df_standardized['trade_date'] == date]\n",
"\n",
" # 只对指定特征进行标准化\n",
" scaler = StandardScaler()\n",
" standardized_values = scaler.fit_transform(current_data[features])\n",
"\n",
" # 将标准化结果重新赋值回去\n",
" df_standardized.loc[df_standardized['trade_date'] == date, features] = standardized_values\n",
"\n",
" return df_standardized\n",
"\n",
"import numpy as np\n",
"import pandas as pd\n",
"import statsmodels.api as sm\n",
"\n",
"def mad_filter(df, features, n=3):\n",
" \"\"\" 使用中位数绝对偏差MAD去极值 \"\"\"\n",
" df = df.copy()\n",
" for col in features:\n",
" median = df[col].median()\n",
" mad = np.median(np.abs(df[col] - median))\n",
" upper = median + n * mad\n",
" lower = median - n * mad\n",
" df[col] = np.clip(df[col], lower, upper) # 截断极值\n",
" return df\n",
"\n",
"from concurrent.futures import ProcessPoolExecutor\n",
"\n",
"def neutralize_manual(df, features, industry_col, mkt_cap_col):\n",
" \"\"\" 手动实现简单回归以提升速度 \"\"\"\n",
"\n",
" for col in features:\n",
" residuals = []\n",
" for _, group in df.groupby(industry_col):\n",
" if len(group) > 1:\n",
" x = np.log(group[mkt_cap_col]) # 市值对数\n",
" y = group[col] # 因子值\n",
" beta = np.cov(y, x)[0, 1] / np.var(x) # 计算斜率\n",
" alpha = np.mean(y) - beta * np.mean(x) # 计算截距\n",
" resid = y - (alpha + beta * x) # 计算残差\n",
" residuals.extend(resid)\n",
" else:\n",
" residuals.extend(group[col]) # 样本不足时保留原值\n",
"\n",
" df[col] = residuals\n",
"\n",
" return df\n",
"\n",
"\n",
"import gc\n",
"\n",
"gc.collect()"
],
"outputs": [
{
"data": {
"text/plain": [
"0"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"execution_count": 13
},
{
"cell_type": "code",
"id": "47c12bb34062ae7a",
"metadata": {
"ExecuteTime": {
"end_time": "2025-03-31T15:05:41.683690Z",
"start_time": "2025-03-31T15:03:24.853004Z"
}
},
"source": [
"days = 2\n",
"validation_days = 120\n",
"\n",
"import gc\n",
"\n",
"gc.collect()\n",
"\n",
"# df['future_return'] = df.groupby('ts_code', group_keys=False)['close'].apply(lambda x: x.shift(-days) / x - 1)\n",
"df['future_return'] = (df.groupby('ts_code')['close'].shift(-days) - df.groupby('ts_code')['open'].shift(-1)) / \\\n",
" df.groupby('ts_code')['open'].shift(-1)\n",
"df['future_volatility'] = (\n",
" df.groupby('ts_code')['future_return']\n",
" .transform(lambda x: x.rolling(days).std())\n",
")\n",
"\n",
"df['future_score'] = (\n",
" 0.7 * df['future_return'] +\n",
" 0.3 * df['future_volatility']\n",
")\n",
"\n",
"filter_index = df['future_return'].between(df['future_return'].quantile(0.01), df['future_return'].quantile(0.99))\n",
"filter_index = df['future_volatility'].between(df['future_volatility'].quantile(0.01),\n",
" df['future_volatility'].quantile(0.99)) | filter_index\n",
"\n",
"# df['label'] = df.groupby('trade_date', group_keys=False)['future_volatility'].transform(\n",
"# lambda x: pd.qcut(x, q=30, labels=False, duplicates='drop')\n",
"# )\n",
"\n",
"df['label'] = df.groupby('trade_date', group_keys=False)['future_score'].transform(\n",
" lambda x: pd.qcut(x, q=50, labels=False, duplicates='drop')\n",
")\n",
"\n",
"\n",
"# df['1_score'] = df.groupby('ts_code', group_keys=False)['future_score'].shift(days)\n",
"# df['2_score'] = df.groupby('ts_code', group_keys=False)['future_score'].shift(1 + days)\n",
"# df['3_score'] = df.groupby('ts_code', group_keys=False)['future_score'].shift(3 + days - 1)\n",
"\n",
"def symmetric_log_transform(values):\n",
" return np.sign(values) * np.log1p(np.abs(values))\n",
"\n",
"\n",
"train_data = df[filter_index & (df['trade_date'] <= '2023-01-01') & (df['trade_date'] >= '2000-01-01')]\n",
"test_data = df[(df['trade_date'] >= '2023-01-01')]\n",
"\n",
"\n",
"def select_pre_zt_stocks_dynamic(stock_df):\n",
" # 排序数据\n",
" stock_df = stock_df.sort_values(by=['trade_date', 'ts_code'])\n",
"\n",
" # avg_vol_3 = stock_df.groupby('ts_code')['vol'].rolling(window=3).mean().reset_index(level=0, drop=True)\n",
" # avg_vol_5 = stock_df.groupby('ts_code')['vol'].rolling(window=5).mean().shift(3).reset_index(level=0, drop=True)\n",
"\n",
" # stock_df = stock_df[\n",
" # (stock_df['cat_up_limit'] == 1) |\n",
" # (stock_df['vol'] > vol_spike_multiplier * stock_df['vol_spike'])\n",
" # ]\n",
" # cd1 = stock_df[\"close\"] > stock_df[\"close\"].shift(1)\n",
"\n",
" # cd2 = stock_df[\"close\"] > stock_df[\"close\"].rolling(window=10).mean()\n",
" #\n",
" # cd3 = (avg_vol_3 > avg_vol_5 * 2)\n",
" #\n",
" # cd4 = stock_df['gap_next_open'] < 0\n",
"\n",
" # stock_df = stock_df[(cd2 & cd4) | cd3]\n",
" stock_df = stock_df.groupby('trade_date', group_keys=False).apply(\n",
" lambda x: x.nlargest(1000, 'return_20')\n",
" )\n",
"\n",
" return stock_df\n",
"\n",
"\n",
"# train_data = select_pre_zt_stocks_dynamic(train_data)\n",
"# test_data = select_pre_zt_stocks_dynamic(test_data)\n",
"\n",
"train_data, _ = get_simple_factor(train_data)\n",
"test_data, _ = get_simple_factor(test_data)\n",
"\n",
"# train_data['label'] = train_data.groupby('trade_date', group_keys=False)['future_score'].transform(\n",
"# lambda x: pd.qcut(x, q=50, labels=False, duplicates='drop')\n",
"# )\n",
"# test_data['label'] = test_data.groupby('trade_date', group_keys=False)['future_score'].transform(\n",
"# lambda x: pd.qcut(x, q=50, labels=False, duplicates='drop')\n",
"# )\n",
"\n",
"industry_df = industry_df.sort_values(by=['trade_date'])\n",
"index_data = index_data.sort_values(by=['trade_date'])\n",
"\n",
"train_data = train_data.merge(industry_df, on=['cat_l2_code', 'trade_date'], how='left')\n",
"# train_data = train_data.merge(index_data, on='trade_date', how='left')\n",
"test_data = test_data.merge(industry_df, on=['cat_l2_code', 'trade_date'], how='left')\n",
"# test_data = test_data.merge(index_data, on='trade_date', how='left')\n",
"\n",
"train_data, test_data = train_data.replace([np.inf, -np.inf], np.nan), test_data.replace([np.inf, -np.inf], np.nan)\n",
"\n",
"# feature_columns_new = feature_columns[:]\n",
"# train_data, _ = create_deviation_within_dates(train_data, feature_columns)\n",
"# test_data, _ = create_deviation_within_dates(test_data, feature_columns)\n",
"\n",
"feature_columns = [col for col in train_data.columns if col in train_data.columns]\n",
"feature_columns = [col for col in feature_columns if col not in ['trade_date',\n",
" 'ts_code',\n",
" 'label']]\n",
"feature_columns = [col for col in feature_columns if 'future' not in col]\n",
"feature_columns = [col for col in feature_columns if 'label' not in col]\n",
"feature_columns = [col for col in feature_columns if 'score' not in col]\n",
"feature_columns = [col for col in feature_columns if 'gen' not in col]\n",
"feature_columns = [col for col in feature_columns if 'cat_l2_code' not in col]\n",
"feature_columns = [col for col in feature_columns if col not in origin_columns]\n",
"feature_columns = [col for col in feature_columns if not col.startswith('_')]\n",
"print(f'feature_columns size: {len(feature_columns)}')\n",
"\n",
"# train_data = train_data.dropna(subset=feature_columns)\n",
"# train_data = train_data.dropna(subset=['label'])\n",
"# train_data = train_data.reset_index(drop=True)\n",
"#\n",
"# # print(test_data.tail())\n",
"# test_data = test_data.dropna(subset=feature_columns)\n",
"# # test_data = test_data.dropna(subset=['label'])\n",
"# test_data = test_data.reset_index(drop=True)\n",
"\n",
"numeric_columns = train_data.select_dtypes(include=['float64', 'int64']).columns\n",
"numeric_columns = [col for col in numeric_columns if col in feature_columns]\n",
"print('去极值')\n",
"train_data = mad_filter(train_data, numeric_columns) # 去极值\n",
"# print('中性化')\n",
"# train_data = neutralize_manual(train_data, numeric_columns, industry_col='cat_l2_code', mkt_cap_col='log(circ_mv)') # 中性化\n",
"print('去极值')\n",
"test_data = mad_filter(test_data, numeric_columns) # 去极值\n",
"# print('中性化')\n",
"# test_data = neutralize_manual(test_data, numeric_columns, industry_col='cat_l2_code', mkt_cap_col='log(circ_mv)')\n",
"\n",
"feature_columns, _ = remove_shifted_features(train_data[train_data['label'] == train_data['label'].max()],\n",
" test_data[test_data['label'] == test_data['label'].max()],\n",
" feature_columns)\n",
"\n",
"feature_columns = remove_highly_correlated_features(train_data[train_data['label'] == train_data['label'].max()],\n",
" feature_columns)\n",
"keep_columns = [col for col in train_data.columns if\n",
" col in feature_columns or col in ['ts_code', 'trade_date', 'label', 'future_return',\n",
" 'future_score', 'future_volatility']]\n",
"# train_data = train_data[keep_columns]\n",
"print(f'feature_columns: {feature_columns}')\n",
"\n",
"train_data = train_data.dropna(subset=feature_columns)\n",
"train_data = train_data.dropna(subset=['label'])\n",
"train_data = train_data.reset_index(drop=True)\n",
"\n",
"# print(test_data.tail())\n",
"test_data = test_data.dropna(subset=feature_columns)\n",
"# test_data = test_data.dropna(subset=['label'])\n",
"test_data = test_data.reset_index(drop=True)\n",
"\n",
"print(len(train_data))\n",
"print(f\"最小日期: {train_data['trade_date'].min().strftime('%Y-%m-%d')}\")\n",
"print(f\"最大日期: {train_data['trade_date'].max().strftime('%Y-%m-%d')}\")\n",
"print(len(test_data))\n",
"print(f\"最小日期: {test_data['trade_date'].min().strftime('%Y-%m-%d')}\")\n",
"print(f\"最大日期: {test_data['trade_date'].max().strftime('%Y-%m-%d')}\")\n",
"\n",
"cat_columns = [col for col in feature_columns if col.startswith('cat')]\n",
"for col in cat_columns:\n",
" train_data[col] = train_data[col].astype('category')\n",
" test_data[col] = test_data[col].astype('category')\n",
"\n",
"\n",
"\n",
"# feature_columns_new.remove('cat_l2_code')"
],
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"feature_columns size: 106\n",
"去极值\n",
"去极值\n",
"检测到 17 个可能漂移的特征: ['vol', 'pct_chg', 'turnover_rate', 'vol_std_5', 'obv', 'log(circ_mv)', 'cov', 'delta_cov', 'alpha_22_improved', 'alpha_003', 'log_close', 'up', 'down', 'mv_turnover_ratio', 'mv_adjusted_volume', 'mv_weighted_turnover', 'nonlinear_mv_volume']\n",
"feature_columns: ['pe_ttm', 'volume_ratio', 'winner_rate', 'return_skew', 'return_kurtosis', 'volume_change_rate', 'cat_volume_breakout', 'turnover_deviation', 'cat_turnover_spike', 'avg_volume_ratio', 'cat_volume_ratio_breakout', 'vol_spike', 'atr_14', 'maobv_6', 'rsi_3', 'return_5', 'return_20', 'std_return_5', 'std_return_90', 'std_return_90_2', 'act_factor1', 'act_factor2', 'act_factor3', 'act_factor4', 'rank_act_factor1', 'rank_act_factor2', 'rank_act_factor3', 'alpha_007', 'alpha_013', 'cat_up_limit', 'cat_down_limit', 'up_limit_count_10d', 'down_limit_count_10d', 'consecutive_up_limit', 'vol_break', 'weight_roc5', 'smallcap_concentration', 'cost_stability', 'high_cost_break_days', 'liquidity_risk', 'turnover_std', 'mv_volatility', 'volume_growth', 'mv_growth', 'arbr', 'momentum_factor', 'resonance_factor', 'cat_vol_spike', 'obv-maobv_6', 'std_return_5 / std_return_90', 'std_return_90 - std_return_90_2', 'cat_af2', 'cat_af3', 'cat_af4', 'act_factor5', 'act_factor6', 'active_buy_volume_large', 'active_buy_volume_big', 'active_buy_volume_small', 'buy_lg_vol_minus_sell_lg_vol', 'buy_elg_vol_minus_sell_elg_vol', 'ctrl_strength', 'low_cost_dev', 'asymmetry', 'lock_factor', 'cat_vol_break', 'cost_atr_adj', 'cat_golden_resonance', 'mv_momentum', 'industry_obv', 'industry_return_5', 'industry_return_20', 'industry__ema_5', 'industry_act_factor1', 'industry_act_factor2', 'industry_act_factor3', 'industry_act_factor4', 'industry_act_factor5', 'industry_act_factor6', 'industry_rank_act_factor1', 'industry_rank_act_factor2', 'industry_rank_act_factor3', 'industry_return_5_percentile', 'industry_return_20_percentile']\n",
"2540320\n",
"最小日期: 2018-06-04\n",
"最大日期: 2022-12-30\n",
"1252195\n",
"最小日期: 2023-01-03\n",
"最大日期: 2025-03-28\n"
]
}
],
"execution_count": 22
},
{
"cell_type": "code",
"id": "8f134d435f71e9e2",
"metadata": {
"jupyter": {
"source_hidden": true
},
"ExecuteTime": {
"end_time": "2025-03-31T14:55:52.421019Z",
"start_time": "2025-03-31T14:55:50.668422Z"
}
},
"source": [
"from sklearn.preprocessing import StandardScaler\n",
"import lightgbm as lgb\n",
"import matplotlib.pyplot as plt\n",
"from sklearn.decomposition import PCA\n",
"\n",
"\n",
"def train_light_model(train_data_df, params, feature_columns, callbacks, evals,\n",
" print_feature_importance=True, num_boost_round=100,\n",
" validation_days=180, use_pca=False, split_date=None): # 新增参数validation_days\n",
" # 确保数据按时间排序\n",
" train_data_df = train_data_df.sort_values(by='trade_date')\n",
"\n",
" numeric_columns = train_data_df.select_dtypes(include=['float64', 'int64']).columns\n",
" numeric_columns = [col for col in numeric_columns if col in feature_columns]\n",
" # X_train.loc[:, numeric_columns] = scaler.fit_transform(X_train[numeric_columns])\n",
" # X_val.loc[:, numeric_columns] = scaler.transform(X_val[numeric_columns])\n",
" train_data_df = cross_sectional_standardization(train_data_df, numeric_columns)\n",
"\n",
" # 去除标签为空的样本\n",
" train_data_df = train_data_df.dropna(subset=['label'])\n",
" print('原始训练集大小: ', len(train_data_df))\n",
"\n",
" # 按时间顺序划分训练集和验证集\n",
" if split_date is None:\n",
" all_dates = train_data_df['trade_date'].unique() # 获取所有唯一的 trade_date\n",
" split_date = all_dates[-validation_days] # 划分点为倒数第 validation_days 天\n",
" train_data_split = train_data_df[train_data_df['trade_date'] < split_date] # 训练集\n",
" val_data_split = train_data_df[train_data_df['trade_date'] >= split_date] # 验证集\n",
"\n",
" # 打印划分结果\n",
" print(f\"划分后的训练集大小: {len(train_data_split)}, 验证集大小: {len(val_data_split)}\")\n",
"\n",
" # 提取特征和标签\n",
" X_train = train_data_split[feature_columns]\n",
" y_train = train_data_split['label']\n",
"\n",
" X_val = val_data_split[feature_columns]\n",
" y_val = val_data_split['label']\n",
"\n",
" # 标准化数值特征\n",
" scaler = StandardScaler()\n",
"\n",
"\n",
" # 计算每个 trade_date 内的样本数LTR 需要 group 信息)\n",
" train_groups = train_data_split.groupby('trade_date').size().tolist()\n",
" val_groups = val_data_split.groupby('trade_date').size().tolist()\n",
"\n",
" # 处理类别特征\n",
" categorical_feature = [col for col in feature_columns if 'cat' in col]\n",
"\n",
" pca = None\n",
" if use_pca:\n",
" pca = PCA(n_components=0.95) # 或指定 n_components=固定值(如 10\n",
" numeric_features = [col for col in feature_columns if col not in categorical_feature]\n",
" numeric_pca = pca.fit_transform(X_train[numeric_features])\n",
" X_train = pd.concat([pd.DataFrame(numeric_pca, index=X_train.index), X_train[categorical_feature]], axis=1)\n",
"\n",
" numeric_pca = pca.transform(X_val[numeric_features])\n",
" X_val = pd.concat([pd.DataFrame(numeric_pca, index=X_val.index), X_val[categorical_feature]], axis=1)\n",
"\n",
" # 计算权重(基于时间)\n",
" # trade_date = train_data_split['trade_date'] # 交易日期\n",
" # weights = (trade_date - trade_date.min()).dt.days / (trade_date.max() - trade_date.min()).days + 1\n",
" # weights = train_data_split.groupby('trade_date')['std_return_5'].transform(\n",
" # lambda x: x / x.mean()\n",
" # )\n",
" ud = sorted(train_data_split[\"trade_date\"].unique().tolist())\n",
" date_weights = {date: weight * weight for date, weight in zip(ud, np.linspace(1, 10, len(ud)))}\n",
" params['weight'] = train_data_split[\"trade_date\"].map(date_weights).tolist()\n",
"\n",
" print('feature_columns size: ', len(X_train.columns.tolist()))\n",
"\n",
" train_dataset = lgb.Dataset(\n",
" X_train, label=y_train, group=train_groups,\n",
" categorical_feature=categorical_feature\n",
" )\n",
"\n",
" # weights = val_data_split.groupby('trade_date')['std_return_5'].transform(\n",
" # lambda x: x / x.mean()\n",
" # )\n",
" val_dataset = lgb.Dataset(\n",
" X_val, label=y_val, group=val_groups,\n",
" categorical_feature=categorical_feature\n",
" )\n",
"\n",
" # 训练模型\n",
" model = lgb.train(\n",
" params, train_dataset, num_boost_round=num_boost_round,\n",
" valid_sets=[train_dataset, val_dataset], valid_names=['train', 'valid'],\n",
" callbacks=callbacks\n",
" )\n",
"\n",
" # 打印特征重要性(如果需要)\n",
" if print_feature_importance:\n",
" lgb.plot_metric(evals)\n",
" lgb.plot_importance(model, importance_type='split', max_num_features=20)\n",
" plt.show()\n",
"\n",
" return model, scaler, pca\n",
"\n",
"\n",
"from catboost import CatBoostRanker, Pool\n",
"import numpy as np\n",
"\n",
"\n",
"def train_catboost(train_data_df, test_data_df, feature_columns, params=None, plot=False):\n",
" X_train = train_data_df[feature_columns]\n",
" y_train = train_data_df['label']\n",
"\n",
" X_val = test_data_df[feature_columns]\n",
" y_val = test_data_df['label']\n",
"\n",
" scaler = StandardScaler()\n",
" numeric_columns = X_train.select_dtypes(include=['float64', 'int64']).columns\n",
" X_train.loc[:, numeric_columns] = scaler.fit_transform(X_train[numeric_columns])\n",
" X_val.loc[:, numeric_columns] = scaler.transform(X_val[numeric_columns])\n",
"\n",
" group_train = train_data_df['trade_date'].factorize()[0]\n",
" group_val = test_data_df['trade_date'].factorize()[0]\n",
"\n",
" cat_features = [i for i, col in enumerate(feature_columns) if col.startswith('cat')]\n",
" print(f'cat_features: {cat_features}')\n",
"\n",
" train_pool = Pool(\n",
" data=X_train,\n",
" label=y_train,\n",
" group_id=group_train,\n",
" cat_features=cat_features\n",
" )\n",
"\n",
" val_pool = Pool(\n",
" data=X_val,\n",
" label=y_val,\n",
" group_id=group_val,\n",
" cat_features=cat_features\n",
" )\n",
"\n",
" # CatBoost 排序学习模型\n",
" model = CatBoostRanker(**params)\n",
" model.fit(train_pool, eval_set=val_pool, plot=plot, use_best_model=True)\n",
"\n",
" return model, scaler\n"
],
"outputs": [],
"execution_count": 15
},
{
"cell_type": "code",
"id": "c6eb5cd4-e714-420a-ac48-39af3e11ee81",
"metadata": {
"ExecuteTime": {
"end_time": "2025-03-31T14:59:05.368441Z",
"start_time": "2025-03-31T14:55:52.438125Z"
}
},
"source": [
"print('train data size: ', len(train_data))\n",
"\n",
"label_gain = list(range(len(train_data['label'].unique())))\n",
"label_gain = [gain * gain for gain in label_gain]\n",
"light_params = {\n",
" 'label_gain': label_gain,\n",
" 'objective': 'lambdarank',\n",
" 'metric': 'lambdarank',\n",
" 'learning_rate': 0.1,\n",
" 'num_leaves': 1024,\n",
" 'min_data_in_leaf': 128,\n",
" 'max_depth': 16,\n",
" 'max_bin': 1024,\n",
" 'feature_fraction': 0.7,\n",
" 'bagging_fraction': 1,\n",
" 'bagging_freq': 5,\n",
" 'lambda_l1': 1,\n",
" 'lambda_l2': 1,\n",
" # 'boosting': 'dart',\n",
" 'verbosity': -1,\n",
" 'extra_trees': True,\n",
" 'max_position': 5,\n",
" 'ndcg_at': 1,\n",
" 'seed': 7\n",
"}\n",
"evals = {}\n",
"\n",
"gc.collect()\n",
"\n",
"use_pca = False\n",
"feature_contri = [2 if feat.startswith('act_factor') else 1 for feat in feature_columns]\n",
"light_params['feature_contri'] = feature_contri\n",
"print(f'feature_contri: {feature_contri}')\n",
"model, scaler, pca = train_light_model(train_data.dropna(subset=['label']),\n",
" light_params, feature_columns,\n",
" [lgb.log_evaluation(period=100),\n",
" lgb.callback.record_evaluation(evals),\n",
" lgb.early_stopping(50, first_metric_only=True)\n",
" ], evals,\n",
" num_boost_round=1000, validation_days=120,\n",
" print_feature_importance=True, use_pca=use_pca)\n",
"\n",
"print('train data size: ', len(train_data))"
],
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"train data size: 2540320\n",
"feature_contri: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]\n",
"原始训练集大小: 2540320\n",
"划分后的训练集大小: 2259332, 验证集大小: 280988\n",
"feature_columns size: 84\n",
"Training until validation scores don't improve for 50 rounds\n",
"[100]\ttrain's ndcg@1: 0.795687\tvalid's ndcg@1: 0.550715\n",
"Early stopping, best iteration is:\n",
"[58]\ttrain's ndcg@1: 0.73593\tvalid's ndcg@1: 0.595665\n",
"Evaluated only: ndcg@1\n"
]
},
{
"data": {
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
],
"image/png": "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"
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
],
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAukAAAHHCAYAAAACisbQAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvc2/+5QAAAAlwSFlzAAAPYQAAD2EBqD+naQAA8TxJREFUeJzs3XlcFdX/+PHXZZUdQRRxARdU3BC1TEXFlSVxLVNJxdTSMlMTl1QEN8Tcl3IrcM36ppIpoWiSa6YWpYQLCuGauwgkAvf+/vDHfLyyCAiC8H4+HvchM3PmnPf7gnDumTNnVBqNRoMQQgghhBCi1NAp6QCEEEIIIYQQ2qSTLoQQQgghRCkjnXQhhBBCCCFKGemkCyGEEEIIUcpIJ10IIYQQQohSRjrpQgghhBBClDLSSRdCCCGEEKKUkU66EEIIIYQQpYx00oUQQgghhChlpJMuhBBCFLPQ0FBUKhUJCQklHYoQ4hUhnXQhhBBFLqtTmtNr8uTJxdLm0aNHCQgI4P79+8VSf3mWmppKQEAAUVFRJR2KEOWGXkkHIIQQouyaOXMmtWrV0trXuHHjYmnr6NGjBAYG4uvri6WlZbG0UViDBg2if//+GBoalnQohZKamkpgYCAAbm5uJRuMEOWEdNKFEEIUG09PT1q2bFnSYbyQlJQUTExMXqgOXV1ddHV1iyiil0etVvP48eOSDkOIckmmuwghhCgxP/30E+3atcPExAQzMzPefPNNYmJitMr89ddf+Pr6Urt2bSpUqICtrS3vvfced+7cUcoEBATg5+cHQK1atZSpNQkJCSQkJKBSqQgNDc3WvkqlIiAgQKselUrF33//zcCBA6lYsSKurq7K8U2bNtGiRQuMjIywsrKif//+XL58+bl55jQn3cHBge7duxMVFUXLli0xMjKiSZMmypSS7du306RJEypUqECLFi34448/tOr09fXF1NSUS5cu4e7ujomJCXZ2dsycORONRqNVNiUlhU8//ZQaNWpgaGhI/fr1WbBgQbZyKpWK0aNHs3nzZho1aoShoSGrVq3CxsYGgMDAQOW9zXrf8vP9efq9jYuLU652WFhYMHToUFJTU7O9Z5s2beL111/H2NiYihUr0r59e/bu3atVJj8/P0K8qmQkXQghRLF58OABt2/f1tpXqVIlADZu3MiQIUNwd3cnODiY1NRUvvzyS1xdXfnjjz9wcHAAIDIykkuXLjF06FBsbW2JiYlhzZo1xMTE8Ouvv6JSqejTpw/nz5/nm2++YfHixUobNjY23Lp1q8Bxv/322zg6OjJ37lylIztnzhymT59Ov379GD58OLdu3WL58uW0b9+eP/74o1BTbOLi4hg4cCAffPAB7777LgsWLMDb25tVq1bx2Wef8eGHHwIQFBREv379OHfuHDo6/xtfy8zMxMPDgzfeeIP58+cTERHBjBkzyMjIYObMmQBoNBp69OjBgQMHGDZsGM2aNWPPnj34+flx9epVFi9erBXTzz//zHfffcfo0aOpVKkSzs7OfPnll4waNYrevXvTp08fAJo2bQrk7/vztH79+lGrVi2CgoL4/fffWbduHZUrVyY4OFgpExgYSEBAAG3atGHmzJkYGBhw/Phxfv75Z7p16wbk/+dHiFeWRgghhChiISEhGiDHl0aj0Tx8+FBjaWmpGTFihNZ5N27c0FhYWGjtT01NzVb/N998owE0Bw8eVPZ9/vnnGkATHx+vVTY+Pl4DaEJCQrLVA2hmzJihbM+YMUMDaAYMGKBVLiEhQaOrq6uZM2eO1v7Tp09r9PT0su3P7f14OjZ7e3sNoDl69Kiyb8+ePRpAY2RkpPnnn3+U/atXr9YAmgMHDij7hgwZogE0H3/8sbJPrVZr3nzzTY2BgYHm1q1bGo1GowkLC9MAmtmzZ2vF9NZbb2lUKpUmLi5O6/3Q0dHRxMTEaJW9detWtvcqS36/P1nv7XvvvadVtnfv3hpra2tl+8KFCxodHR1N7969NZmZmVpl1Wq1RqMp2M+PEK8qme4ihBCi2KxcuZLIyEitFzwZfb1//z4DBgzg9u3byktXV5dWrVpx4MABpQ4jIyPl60ePHnH79m3eeOMNAH7//fdiiXvkyJFa29u3b0etVtOvXz+teG1tbXF0dNSKtyAaNmxI69atle1WrVoB0KlTJ2rWrJlt/6VLl7LVMXr0aOXrrOkqjx8/Zt++fQCEh4ejq6vLmDFjtM779NNP0Wg0/PTTT1r7O3ToQMOGDfOdQ0G/P8++t+3atePOnTskJSUBEBYWhlqtxt/fX+uqQVZ+ULCfHyFeVTLdRQghRLF5/fXXc7xx9MKFC8CTzmhOzM3Nla/v3r1LYGAgW7du5ebNm1rlHjx4UITR/s+zK9JcuHABjUaDo6NjjuX19fUL1c7THXEACwsLAGrUqJHj/nv37mnt19HRoXbt2lr76tWrB6DMf//nn3+ws7PDzMxMq5yTk5Ny/GnP5v48Bf3+PJtzxYoVgSe5mZubc/HiRXR0dPL8oFCQnx8hXlXSSRdCCPHSqdVq4Mm8Yltb22zH9fT+9+epX79+HD16FD8/P5o1a4apqSlqtRoPDw+lnrw8Oyc6S2ZmZq7nPD06nBWvSqXip59+ynGVFlNT0+fGkZPcVnzJbb/mmRs9i8OzuT9PQb8/RZFbQX5+hHhVyU+xEEKIl65OnToAVK5cmS5duuRa7t69e+zfv5/AwED8/f2V/VkjqU/LrTOeNVL77EOOnh1Bfl68Go2GWrVqKSPVpYFarebSpUtaMZ0/fx5AuXHS3t6effv28fDhQ63R9LNnzyrHnye397Yg35/8qlOnDmq1mr///ptmzZrlWgae//MjxKtM5qQLIYR46dzd3TE3N2fu3Lmkp6dnO561IkvWqOuzo6xLlizJdk7WWubPdsbNzc2pVKkSBw8e1Nr/xRdf5DvePn36oKurS2BgYLZYNBpNtuUGX6YVK1ZoxbJixQr09fXp3LkzAF5eXmRmZmqVA1i8eDEqlQpPT8/ntmFsbAxkf28L8v3Jr169eqGjo8PMmTOzjcRntZPfnx8hXmUyki6EEOKlMzc358svv2TQoEE0b96c/v37Y2NjQ2JiIrt376Zt27asWLECc3Nz2rdvz/z580lPT6datWrs3buX+Pj4bHW2aNECgKlTp9K/f3/09fXx9vbGxMSE4cOHM2/ePIYPH07Lli05ePCgMuKcH3Xq1GH27NlMmTKFhIQEevXqhZmZGfHx8ezYsYP333+fCRMmFNn7k18VKlQgIiKCIUOG0KpVK3766Sd2797NZ599pqxt7u3tTceOHZk6dSoJCQk4Ozuzd+9efvjhB8aOHauMSufFyMiIhg0b8u2331KvXj2srKxo3LgxjRs3zvf3J7/q1q3L1KlTmTVrFu3ataNPnz4YGhpy4sQJ7OzsCAoKyvfPjxCvtBJaVUYIIUQZlrXk4IkTJ/Isd+DAAY27u7vGwsJCU6FCBU2dOnU0vr6+mpMnTyplrly5oundu7fG0tJSY2FhoXn77bc1165dy3FJwFmzZmmqVaum0dHR0VryMDU1VTNs2DCNhYWFxszMTNOvXz/NzZs3c12CMWv5wmdt27ZN4+rqqjExMdGYmJhoGjRooPnoo480586dy9f78ewSjG+++Wa2soDmo48+0tqXtYzk559/ruwbMmSIxsTERHPx4kVNt27dNMbGxpoqVapoZsyYkW3pwocPH2rGjRunsbOz0+jr62scHR01n3/+ubKkYV5tZzl69KimRYsWGgMDA633Lb/fn9ze25zeG41Go/n66681Li4uGkNDQ03FihU1HTp00ERGRmqVyc/PjxCvKpVG8xLuQhFCCCFEkfL19eX7778nOTm5pEMRQhQDmZMuhBBCCCFEKSOddCGEEEIIIUoZ6aQLIYQQQghRysicdCGEEEIIIUoZGUkXQgghhBCilJFOuhBCCCGEEKWMPMxIiFeQWq3m2rVrmJmZ5fq4biGEEEKULhqNhocPH2JnZ4eOTt5j5dJJF+IVdO3aNWrUqFHSYQghhBCiEC5fvkz16tXzLCOddCFeQWZmZgDEx8djZWVVwtEUj/T0dPbu3Uu3bt3Q19cv6XCKRXnIEcpHnpJj2SA5lg2lOcekpCRq1Kih/B3Pi3TShXgFZU1xMTMzw9zcvISjKR7p6ekYGxtjbm5e6n7JFpXykCOUjzwlx7JBciwbXoUc8zNVVW4cFUIIIYQQopSRTroQQgghhBCljHTShRBCCCGEKGWkky6EEEIIIUQpI510IYQQQgghShnppAshhBBCCFHKSCddCCGEEEKIUkY66UIIIYQQQpQy0kkXQgghhBCilJFOuhBCCCGEKDMOHTrE7Nmzsbe3R6VSERYWpnXc19cXlUql9fLw8NAqc/78eXr27EmlSpUwNzfH1dWVAwcOvMQspJMuyqHU1FT69u2Lubk5KpWK+/fvl3RIQgghhCgiKSkp1KpVi6VLl+ZaxsPDg+vXryuvb775Rut49+7dycjI4Oeff+bUqVM4OzvTvXt3bty4UdzhK/ReWktClBLr16/n0KFDHD16lEqVKmFhYfHCdfr6+nL//v1sn9aFEEII8XJ5eHigVqvx8vLKtYyhoSG2trY5Hrt9+zYXLlzgq6++omnTpgDMmzePL774gjNnzuR6XlGTkfQy5PHjxyUdwivh4sWLODk50bhxY2xtbVGpVCUdkkK+h0IIIUTxi4qKonLlytSvX59Ro0Zx584d5Zi1tTX169dnw4YNpKSkkJGRwerVq6lcuTItWrR4aTHKSPorzM3NjcaNG6Onp8emTZto0qQJy5cvx8/Pj0OHDmFiYkK3bt1YvHgxlSpVAuD7778nMDCQuLg4jI2NcXFx4YcffsDExAS1Ws3s2bNZs2YNt27dwsnJiXnz5inztBISEqhVqxbbtm1j+fLlHD9+HEdHR1atWkXr1q0BuHPnDqNHj+bgwYPcu3ePOnXq8NlnnzFgwACtuJs2bUqFChVYt24dBgYGjBw5koCAAKXM/fv3mTRpEmFhYTx48IC6desyb948unfvDsDhw4eZMmUKJ0+epFKlSvTu3ZugoCBMTEye+5798ssvAKhUKjp06EBUVBQbN25k6dKlnDt3DhMTEzp16sSSJUuoXLmycm5MTAyTJk3i4MGDaDQamjVrRmhoKBs3bmT9+vVKnQAHDhzAzc2N06dP88knn3Ds2DGMjY3p27cvixYtwtTUFPjfCPxrr73GypUrMTQ0JD4+Pt8/A62C9pOhl3fOrypDXQ3zX4fGAXtIyyw9H6SKUnnIEcpHnpJj2SA5vnoS5r1Z4HM8PDzo06cPtWrV4uLFi3z22Wd4enpy7NgxdHV1UalU7Nu3j169emFmZoaOjg6VK1cmIiKCihUrFkMWOZNO+itu/fr1jBo1iiNHjnD//n06derE8OHDWbx4Mf/99x+TJk2iX79+/Pzzz1y/fp0BAwYwf/58evfuzcOHDzl06BAajQaApUuXsnDhQlavXo2Liwtff/01PXr0ICYmBkdHR6XNqVOnsmDBAhwdHZk6dSoDBgwgLi4OPT09Hj16RIsWLZg0aRLm5ubs3r2bQYMGUadOHV5//XWtuMePH8/x48c5duwYvr6+tG3blq5du6JWq/H09OThw4ds2rSJOnXq8Pfff6Orqws8GQn38PBg9uzZfP3119y6dYvRo0czevRoQkJC8ny/tm/fzuTJkzlz5gzbt2/HwMAAgPT0dGbNmkX9+vW5efMm48ePx9fXl/DwcACuXr1K+/btcXNz4+eff8bc3JwjR46QkZHBhAkTiI2NJSkpSWnfysqKlJQU3N3dad26NSdOnODmzZsMHz6c0aNHExoaqsS0f/9+zM3NiYyMzDXutLQ00tLSlO2kpCQADHU06Opqnvtz8ioy1NFo/VsWlYccoXzkKTmWDZLjqyc9PT3XfVn/ZmRkaJXr27ev8nWDBg1wcnKiQYMG7Nu3j06dOqHRaBg1ahQ2NjYcOHAAIyMjvv76a7y9vTl69ChVq1Yt0nhzo9Jk9dDEK8fNzY2kpCR+//13AGbPns2hQ4fYs2ePUubKlSvUqFGDc+fOkZycTIsWLUhISMDe3j5bfdWqVeOjjz7is88+U/a9/vrryihv1kj6unXrGDZsGAB///03jRo1IjY2lgYNGuQYZ/fu3WnQoAELFixQ4s7MzOTQoUNa7XTq1Il58+axd+9ePD09iY2NpV69etnqGz58OLq6uqxevVrZd/jwYTp06EBKSgoVKlTI830bO3Ys0dHRREVF5Vrm5MmTvPbaazx8+BBTU1M+++wztm7dyrlz59DX189WPqc56WvXrmXSpElcvnxZGeEPDw/H29uba9euUaVKFXx9fYmIiCAxMVH5wJCTgIAAAgMDs+3fsmULxsbGeeYrhBBClFe9evVi8uTJvPHGG3mWGzx4MD4+Pri7u/Pnn38SGBjIpk2btP7Gjho1ii5dumh18gsqNTWVgQMH8uDBA8zNzfMsKyPpr7in50b9+eefHDhwQJlK8bSLFy/SrVs3OnfuTJMmTXB3d6dbt2689dZbVKxYkaSkJK5du0bbtm21zmvbti1//vmn1r6smygA5dPkzZs3adCgAZmZmcydO5fvvvuOq1ev8vjxY9LS0rJ1JJ+uI6uemzdvAhAdHU316tVz7KBn5fnXX3+xefNmZZ9Go0GtVhMfH4+Tk1Ou71duTp06RUBAAH/++Sf37t1DrVYDkJiYSMOGDYmOjqZdu3Y5dtBzExsbi7Ozs9YUnLZt26JWqzl37hxVqlQBoEmTJnl20AGmTJnC+PHjle2kpCRq1KhBx44dsba2Lkiqr4z09HQiIyPp2rVrgd73V0l5yBHKR56SY9kgOZYNT+cIT/pKed1EeuXKFR4+fEiXLl3w8vJS+gAeHh5afSpTU1McHR3zrOt5sq6E54d00l9xT3cAk5OT8fb2Jjg4OFu5qlWroqurS2RkJEePHmXv3r0sX76cqVOncvz48QJ19J7+T501BzvrB/rzzz9n6dKlLFmyhCZNmmBiYsLYsWOz3RD57C8GlUql1GFkZJRn+8nJyXzwwQeMGTMm27GaNWvmO48sWdNS3N3d2bx5MzY2NiQmJuLu7q7E/byYXsTz5tHDk7vQDQ0Ns+3X19cvs79ks0iOZUd5yFNyLBskx1dbcnIyly5dIiYmBoDLly8TExODlZUVVlZWBAYG0rdvX2xtbbl48SITJ06kbt26vPnmm+jr69OuXTsqVqzI8OHD8ff3x8jIiLVr15KQkECPHj1e6H0ryLmyuksZ0rx5c2JiYnBwcKBu3bpar6yOoEqlom3btgQGBvLHH39gYGDAjh07MDc3x87OjiNHjmjVeeTIERo2bJjvGI4cOULPnj159913cXZ2pnbt2pw/f75AeTRt2pQrV67kel7z5s35+++/s+VYt27d545I5+Ts2bPcuXOHefPm0a5dOxo0aKCM6j8d06FDh3KdS2ZgYEBmZqbWPicnJ/78809SUlKUfUeOHEFHR4f69esXOE4hhBBCPN+pU6cYP368ci/c+PHjcXFxwd/fH11dXf766y969OhBvXr1GDZsGC1atODQoUPKYFilSpWIiIggOTmZTp060bJlSw4fPswPP/yAs7PzS8tDOullyEcffcTdu3cZMGAAJ06c4OLFi+zZs4ehQ4eSmZnJ8ePHmTt3LidPniQxMZHt27crq7gA+Pn5ERwczLfffsu5c+eYPHky0dHRfPLJJ/mOwdHRURmtj42N5YMPPuDff/8tUB4dOnSgffv29O3bl8jISOLj4/npp5+IiIgAYNKkSRw9epTRo0cTHR3NhQsX+OGHHxg9enSB2slSs2ZNDAwMWL58OZcuXWLnzp3MmjVLq8zo0aNJSkqif//+nDx5kgsXLrBx40bOnTsHgIODA3/99Rfnzp3j9u3bpKen4+PjQ4UKFRgyZAhnzpzhwIEDfPzxxwwaNEiZ6iKEEEKIotWhQwfCwsJ4/PgxGo1GeYWGhmJkZMSePXu4efMmjx8/JiEhgTVr1mT7u9yyZUv27NnDnTt3SEpK4tixY3h6er7UPKSTXoZkjYRnZmbSrVs3mjRpwtixY7G0tERHRwdzc3MOHjyIl5cX9erVY9q0aSxcuFD5oRszZgzjx4/n008/pUmTJkRERLBz506tlV2eZ9q0aTRv3hx3d3fc3NywtbWlV69eBc5l27ZtvPbaawwYMICGDRsyceJEZaS6adOm/PLLL5w/f5527dopn47t7OwK3A6AjY0NoaGh/N///R8NGzZk3rx5yk2uWaytrfn5559JTk6mQ4cOtGjRgrVr1yqXrUaMGEH9+vVp2bIlNjY2HDlyBGNjY/bs2cPdu3d57bXXeOutt+jcuTMrVqwoVJxCCCGEKD9kdRchXkFJSUlYWFhw+/btMn3jaHh4OF5eXmV23mR5yBHKR56SY9kgOZYNpTnHrL/f+VndRUbShRBCCCGEKGWkky7KlEOHDmFqaprrSwghhBDiVSBLMIoypWXLlkRHR5d0GEIIIYQQL0Q66aJMMTIyom7duiUdhhBCCCHEC5HpLkIIIYQQQpQy0kkXIh8SEhJQqVQylUYIIYQoAgcPHsTb2xs7OztUKhVhYWFax319fVGpVFovDw8PrTJ3797Fx8cHc3NzLC0tGTZsGMnJyS8xi+IlnXRRotzc3Bg7dmxJhyGEEEKIlyglJQVnZ2dWrlyZaxkPDw+uX7+uvL755hut4z4+PsTExBAZGcmuXbs4ePAg77//fnGH/tLInHRRbB4/foyBgUGZa0sIIYQQL8bT0/O5T/A0NDTE1tY2x2OxsbFERERw4sQJWrZsCcDy5cvx8vIiKCioyOMtCTKSLoqMm5sbo0ePZuzYsVSqVAl3d3fOnDmDp6cnpqamVKlShUGDBnH79m3gyaWsX375haVLlyqXshISEggNDcXS0lKr7rCwMFQqlbIdEBBAs2bNWLduHbVq1aJChQoAqFQq1q1bR+/evTE2NsbR0ZGdO3fmK/579+7h4+ODjY0NRkZGODo6EhISkmPZzMxM3nvvPRo0aEBiYiIAP/zwA82bN6dChQrUrl2bwMBAMjIyAJgwYQLdu3dXzl+yZAkqlYqIiAhlX926dVm3bl2+YhVCCCHKuqioKCpXrkz9+vUZNWoUd+7cUY4dO3YMS0tLpYMO0KVLF3R0dPjtt99KItwiJyPpokitX7+eUaNGceTIEe7fv0+nTp0YPnw4ixcv5r///mPSpEn069ePn3/+maVLl3L+/HkaN27MzJkzAbCxscl3W3FxcWzbto3t27ejq6ur7A8MDGT+/Pl8/vnnLF++HB8fH/755x+srKzyrG/69On8/fff/PTTT1SqVIm4uDj++++/bOXS0tIYMGAACQkJHDp0CBsbGw4dOsTgwYNZtmwZ7dq14+LFi8oltxkzZtChQwfWrVtHZmYmurq6/PLLL1SqVImoqCg8PDy4evUqFy9exM3NLcfY0tLSSEtLU7aTkpIAaB+8jwx9k3y/Z68SQx0Ns1pCi5kRpKlVzz/hFVQecoTykafkWDZIjsXjTID7c8tkZGSQnp6ubHfp0oUePXrg4ODApUuXmD59Oh4eHhw6dAhdXV2uXr2KjY2N1jkAVlZWXLt2DQcHh2zHSoOCxCSddFGkHB0dmT9/PgCzZ8/GxcWFuXPnKse//vpratSowfnz56lXrx4GBgYYGxvnejkrL48fP2bDhg3ZOva+vr4MGDAAgLlz57Js2TJ+++23bDecPCsxMREXFxflU7mDg0O2MsnJybz55pukpaVx4MABLCwsgCcfDCZPnsyQIUMAqF27NrNmzWLixInMmDGDdu3a8fDhQ/744w9atGjBwYMH8fPzU26UiYqKolq1arkuHxkUFERgYGC2/dNc1BgbZ+aZ16tuVkt1SYdQ7MpDjlA+8pQcywbJsWiFh4c/t8ypU6fQ19dXts3MzAC4fPky+vr6jB07lpEjRzJ//nycnZ05d+4cKSkp2ep+/PgxsbGxODg4EBkZWbSJFIHU1NR8l5VOuihSLVq0UL7+888/OXDgQI5P+rx48SL16tV7obbs7e1zHHlv2rSp8rWJiQnm5ubcvHnzufWNGjWKvn378vvvv9OtWzd69epFmzZttMoMGDCA6tWr8/PPP2NkZKTs//PPPzly5Ahz5sxR9mVmZvLo0SNSU1OxtLTE2dmZqKgoDAwMMDAw4P3332fGjBkkJyfzyy+/0KFDh1xjmzJlCuPHj1e2k5KSqFGjBrP/0CFDXzfX815lT0Z71Ew/qVPGR7TKdo5QPvKUHMsGybF45GckvUWLFnh5eeVZZtq0aVSqVAkvLy9u3rzJ7t27tc7JyMggOTlZuSrdtWtXrY5/aZB1JTw/pJMuipSJyf+mXiQnJ+Pt7U1wcHC2clWrVs21Dh0dHTQajda+nC4PPd3W0579D6lSqVCrnz9i4OnpyT///EN4eDiRkZF07tyZjz76iAULFihlvLy82LRpE8eOHaNTp07K/uTkZAIDA+nTp0+2erPmy7u5uREVFYWhoSEdOnTAysoKJycnDh8+zC+//MKnn36aa2yGhoYYGhpm239wUhesra2fm9urKD09nfDwcE75e5S6X7JFpTzkCOUjT8mxbJAcS46enl6e8Vy5coU7d+5QvXp19PX1cXV15f79+/z111/KAOGBAwdQq9W0bt2a6Oho9PX1S1WOkL2PkhfppIti07x5c7Zt24aDgwN6ejn/qBkYGJCZqT1dw8bGhocPH5KSkqJ0xF/W+uQ2NjYMGTKEIUOG0K5dO/z8/LQ66aNGjaJx48b06NGD3bt3K6PfzZs359y5c3k+7bRDhw58/fXX6OnpKVNv3Nzc+Oabbzh//nyu89GFEEKIsiY5OZm4uDhlOz4+nujoaKysrLCysiIwMJC+fftia2vLxYsXmThxInXr1sXd/cmovJOTEx4eHowYMYJVq1aRnp7O6NGj6d+/P3Z2dmXiuSayuosoNh999BF3795lwIABnDhxgosXL7Jnzx6GDh2qdMwdHBw4fvw4CQkJ3L59G7VaTatWrTA2Nuazzz7j4sWLbNmyhdDQ0GKP19/fnx9++IG4uDhiYmLYtWsXTk5O2cp9/PHHzJ49m+7du3P48GHl3A0bNhAYGEhMTAyxsbFs3bqVadOmKee1b9+ehw8fsmvXLqVD7ubmxubNm6lateoLT/8RQgghXhUnT57ExcUFFxcXAMaPH4+Liwv+/v7o6ury119/0aNHD+rVq8ewYcNo0aIFhw4d0rqqvHnzZho0aEDnzp3x8vLC1dWVNWvWlFRKRU5G0kWxsbOz48iRI0yaNIlu3bqRlpaGvb09Hh4e6Og8+Xw4YcIEhgwZQsOGDfnvv/+Ij4/HwcGBTZs24efnx9q1a+ncuTMBAQHF/oACAwMDpkyZQkJCAkZGRrRr146tW7fmWHbs2LGo1Wq8vLyIiIjA3d2dXbt2MXPmTIKDg9HX16dBgwYMHz5cOadixYo0adKEf//9lwYNGgBPOu5qtTrP+ehCCCFEWePm5pZtauvT9uzZ89w6rKys2LJlS7b9pXFVl8JQafJ6h4QQpVJSUhIWFhbcvn27zM9J9/LyKnVzCotKecgRykeekmPZIDmWDaU5x6y/3w8ePMDc3DzPsjLdRQghhBBCiFJGOumi3Bg5ciSmpqY5vkaOHFnS4QkhhBBCKGROuig3Zs6cyYQJE3I89rxLTkIIIYQQL5N00kW5UblyZSpXrlzSYQghhBBCPJdMdxFCCCGEEKKUkU66EEIIIYQoMgcPHsTb2xs7OztUKhVhYWG5lh05ciQqlYolS5Yo+6KiolCpVDm+Tpw4UfwJlBLSSReimIWFhVG3bl10dXUZO3ZsSYcjhBBCFKuUlBScnZ1ZuXJlnuV27NjBr7/+ip2dndb+Nm3acP36da3X8OHDqVWrFi1btizO0EsV6aQL8f8FBATQrFmzIq/3gw8+4K233uLy5cvMmjWLqKgoevbsSdWqVTExMaFZs2Zs3ry5yNsVQgghSoKnpyezZ8+md+/euZa5evUqH3/8MZs3b862lrmBgQG2trbKy9ramh9++IGhQ4eiUqmKO/xSQ24cFaIYJScnc/PmTdzd3ZWRgqNHj9K0aVMmTZpElSpV2LVrF4MHD8bCwoLu3buXcMRCCCFE8VKr1QwaNAg/Pz8aNWr03PI7d+7kzp07DB069CVEV3pIJ12UKWq1mgULFrBmzRouX75MlSpV+OCDD5g6dSqTJk1ix44dXLlyBVtbW3x8fPD390dfX5/Q0FACAwMBlE/pISEh+Pr65tneokWLCAkJ4dKlS1hZWeHt7c38+fMxNTUlKiqKjh07AtCpUycADhw4wGeffaZVxyeffMLevXvZvn17gTvprYL2k6FnUqBzXhWGuhrmvw6NA/aQllk2R07KQ45QPvKUHMsGybFwEua9WaDywcHB6OnpMWbMmHyV/+qrr3B3d6d69eqFCe+VJZ10UaZMmTKFtWvXsnjxYlxdXbl+/Tpnz54FwMzMjNDQUOzs7Dh9+jQjRozAzMyMiRMn8s4773DmzBkiIiLYt28fABYWFs9tT0dHh2XLllGrVi0uXbrEhx9+yMSJE/niiy9o06YN586do379+mzbto02bdpgZWWVYz0PHjzAyckp13bS0tJIS0tTtpOSkgAw1NGgq6vJ9/vzKjHU0Wj9WxaVhxyhfOQpOZYNkmPhpKen53k8IyNDKfP777+zdOlSjh8/TkZGhlImMzMzx3quXLnCnj172LJly3PbeTae/JZ/mQoSk0qj0ZTdn0RRrjx8+BAbGxtWrFjB8OHDn1t+wYIFbN26lZMnTwJP5qSHhYURHR1d6Bi+//57Ro4cye3btwG4f/8+FStW5MCBA7i5ueV4znfffcegQYP4/fffc73sFxAQoIz0P23Lli0YGxsXOl4hhBCiOPXq1YvJkyfzxhtvAE+mroSEhGjNLVer1ejo6GBtbc3atWu1zv/2228JDw/nq6++Qk/v1R9bTk1NZeDAgTx48OC5D1J89bMV4v+LjY0lLS2Nzp0753j822+/ZdmyZVy8eJHk5GQyMjJe+Emj+/btIygoiLNnz5KUlERGRgaPHj0iNTU1X53nAwcOMHToUNauXZvnvLwpU6Ywfvx4ZTspKYkaNWow+w8dMvR1XyiH0spQR8Oslmqmn9QhTV1GLzuXgxyhfOQpOZYNkmPhnAlwz/N4ixYt8PLyAqBVq1aMHj1a63j37t0ZOHAgQ4YMoX79+sp+jUbDuHHjeO+99+jRo0e+40lPTycyMpKuXbtmuym1pGVdCc8P6aSLMsPIyCjXY8eOHcPHx4fAwEDc3d2xsLBg69atLFy4sNDtJSQk0L17d0aNGsWcOXOwsrLi8OHDDBs2jMePHz+3k/7LL7/g7e3N4sWLGTx4cJ5lDQ0NMTQ0zLb/4KQuWFtbFzqH0iw9PZ3w8HBO+XuUul+yRaU85AjlI0/JsWyQHItGcnIycXFxyvbly5eJiYnBysqKmjVrYmtrq1VeX1+fatWq0bhxY639+/fvJz4+nvfff79Qserr65e672NB4pFOuigzHB0dMTIyYv/+/dmmuxw9ehR7e3umTp2q7Pvnn3+0yhgYGJCZmZnv9k6dOoVarWbhwoXo6DxZzfS7777L17lRUVF0796d4OBg3n///Xy3KYQQQpR2J0+eVBZOAJQrwUOGDCE0NDTf9Xz11Ve0adOGBg0aFHWIrwTppIsyo0KFCkyaNImJEydiYGBA27ZtuXXrFjExMTg6OpKYmMjWrVt57bXX2L17Nzt27NA638HBgfj4eKKjo6levTpmZmY5jl5nqVu3Lunp6Sxfvhxvb2+OHDnCqlWrnhvngQMH6N69O5988gl9+/blxo0bwJMPCbndWCqEEEK8Ktzc3CjILY8JCQk57t+yZUsRRfRqkocZiTJl+vTpfPrpp/j7++Pk5MQ777zDzZs36dGjB+PGjWP06NE0a9aMo0ePMn36dK1z+/bti4eHBx07dsTGxoZvvvkmz7acnZ1ZtGgRwcHBNG7cmM2bNxMUFPTcGNevX09qaipBQUFUrVpVefXp0+eFchdCCCFE2SEj6aJM0dHRYerUqVrTWrLMnz+f+fPna+0bO3as8rWhoSHff/99gdobN24c48aN09o3aNAg5WtLS8tsowmhoaEFutwnhBBCiPJHRtKFEEIIIYQoZaSTLkQuNm/ejKmpaY6v/DzGWAghhBCisGS6ixC56NGjB61atcrxWGlb0kkIIYQQZYt00oXIhZmZGWZmZiUdhhBCCCHKIZnuIoQQQgghRCkjnXRR4hISElCpVERHR5d0KEIIIUS5dvDgQby9vbGzs0OlUhEWFpZr2ZEjR6JSqViyZInW/jlz5tCmTRuMjY2xtLQs1njLMumki2Lj6+tLr169SjoM4MkTPlUqFffv3y/pUAAICAhApVJpvcrrE9WEEEKUHikpKTg7O7Ny5co8y+3YsYNff/0VOzu7bMceP37M22+/zahRo4orzHJB5qSLV5pGoyEzMxM9vZf3o5yenl4kN442atSIffv2KdsvMwchhBAiJ56ennh6euZZ5urVq3z88cfs2bOHN998M9vxwMBAAHkmyAuSkXTxwr7//nuaNGmCkZER1tbWdOnSBT8/P9avX88PP/ygjBRHRUUB8Ntvv+Hi4kKFChVo2bIlf/zxR77byhoR/+mnn2jRogWGhoYcPnwYtVpNUFAQtWrVwsjICGdnZ+XBRAkJCXTs2BGAihUrolKp8PX1BcDBwSHbZbpmzZoREBCgbKtUKr788kt69OiBiYkJc+bMISAggGbNmrFx40YcHBywsLCgf//+PHz4MN+56OnpYWtrq7wqVaqU73OFEEKIkqBWqxk0aBB+fn6yHHExk6E78UKuX7/OgAEDmD9/Pr179+bhw4ccOnSIwYMHk5iYSFJSEiEhIQBYWVmRnJxM9+7d6dq1K5s2bSI+Pp5PPvmkwO1OnjyZBQsWULt2bSpWrEhQUBCbNm1i1apVODo6cvDgQd59911sbGxwdXVl27Zt9O3bl3PnzmFubo6RkVGB2gsICGDevHksWbIEPT09vv76ay5evEhYWBi7du3i3r179OvXj3nz5jFnzpx81XnhwgXs7OyoUKECrVu3JigoiJo1axYorlZB+8nQMynQOa8KQ10N81+HxgF7SMtUlXQ4xaI85AjlI0/JsWwojzkmzMs+Ep6X4OBg9PT0GDNmTDFFKLJIJ128kOvXr5ORkUGfPn2wt7cHoEmTJgAYGRmRlpaGra2tUj40NBS1Ws1XX31FhQoVaNSoEVeuXCnwvLWZM2fStWtXANLS0pg7dy779u2jdevWANSuXZvDhw+zevVqOnTogJWVFQCVK1cu1E0sAwcOZOjQoVr71Go1oaGhyjKNgwYNYv/+/fnqpLdq1YrQ0FDq16/P9evXCQwMpF27dpw5cybHZR/T0tJIS0tTtpOSkgAw1NGgq6spcD6vAkMdjda/ZVF5yBHKR56SY9lQHnNMT0/Ps3xGRoZS5vfff2fp0qUcP36cjIwMpUxmZmaO9WRmZuarjaKW1d7Lbjc/ChKTdNLFC3F2dqZz5840adIEd3d3unXrxltvvUXFihVzLB8bG0vTpk2pUKGCsi+rY10QLVu2VL6Oi4sjNTVV6bRnefz4MS4uLgWu+3ntZXFwcNDqUFetWpWbN2/mq76n5/s1bdqUVq1aYW9vz3fffcewYcOylQ8KClLm+D1tmosaY+PMfLX5qprVUl3SIRS78pAjlI88JceyoTzlGB4enme5U6dOKfdh7dy5k5s3b1K7dm3luFqtZuLEiQQHB7N27Vqtc//880/S09Of20ZxiYyMLJF285KamprvstJJFy9EV1eXyMhIjh49yt69e1m+fDlTp07l+PHjxdquicn/pngkJycDsHv3bqpVq6ZVztDQMM96dHR00Gi0R0xy+pT7dHtZnr15VKVSoVYX7he7paUl9erVIy4uLsfjU6ZMYfz48cp2UlISNWrUoGPHjlhbWxeqzdIuPT2dyMhIunbtWmaf8FoecoTykafkWDZIjtm1aNECLy8v4MlV4NGjR2sd7969OwMHDmTIkCHUr19f69jt27fR19dXzn9ZSvP3MetKeH5IJ128MJVKRdu2bWnbti3+/v7Y29uzY8cODAwMlEtdWZycnNi4cSOPHj1SRtN//fXXF2q/YcOGGBoakpiYSIcOHXIsY2BgAJAtHhsbG65fv65sJyUlER8f/0LxFEZycjIXL15k0KBBOR43NDTM8QOHvr5+qfsFVNQkx7KjPOQpOZYN5TnH5ORkrQGjy5cvExMTg5WVFTVr1tSawppVT7Vq1WjcuLGyLzExkbt373L16lUyMzOJiYkBoG7dupiamhZTRtmVxu9jQeKRTrp4IcePH2f//v1069aNypUrc/z4cW7duoWTkxOPHj1iz549nDt3DmtraywsLBg4cCBTp05lxIgRTJkyhYSEBBYsWPBCMZiZmTFhwgTGjRuHWq3G1dWVBw8ecOTIEczNzRkyZAj29vaoVCp27dqFl5cXRkZGmJqa0qlTJ0JDQ/H29sbS0hJ/f390dXWL6N3J3YQJE/D29sbe3p5r164xY8YMdHV1GTBgQLG3LYQQQuTm5MmTyopogHIVd8iQIfleUtHf35/169cr21lTTw8cOICbm1uRxVrWSSddvBBzc3MOHjzIkiVLSEpKwt7enoULF+Lp6UnLli2JioqiZcuWJCcnK/85f/zxR0aOHImLiwsNGzYkODiYvn37vlAcs2bNwsbGhqCgIC5duoSlpSXNmzfns88+A6BatWoEBgYyefJkhg4dyuDBgwkNDWXKlCnEx8fTvXt3LCwsmDVr1ksZSb9y5QoDBgzgzp07ygo0v/76KzY2NsXethBCCJEbNze3bNNA85KQkJBtX2hoqKyRXgRUmoJ8J4QQpUJSUhIWFhbcvn27TM9JDw8Px8vLq9Rdriwq5SFHKB95So5lg+RYNpTmHLP+fj948ABzc/M8y8rDjIQQQgghhChlpJMuSpWRI0diamqa42vkyJElHV6+JCYm5pqDqakpiYmJJR2iEEIIIUo5mZMuSpWZM2cyYcKEHI8977JQaWFnZ0d0dHSex4UQQggh8iKddFGqVK5cmcqVK5d0GC9ET0+PunXrlnQYQgghhHiFyXQXIYQQQgghShnppAshhBBClGMHDx7E29sbOzs7VCoVYWFhuZYdOXIkKpWKJUuWaO2/e/cuPj4+mJubY2lpybBhw5QngovCkU66yFNCQgIqlSrPOdZCCCGEeHWlpKTg7OzMypUr8yy3Y8cOfv311xzvrfLx8SEmJobIyEh27drFwYMHef/994sr5HJBOunllK+vL7169SrpMACIiopCpVJx//79kg4FgIcPHzJ27Fjs7e0xMjKiTZs2nDhxQquMRqPB39+fqlWrYmRkRJcuXbhw4UK+6k9ISGDYsGHUqlULIyMj6tSpw4wZM3j8+HFxpCOEEELkydPTk9mzZ9O7d+9cy1y9epWPP/6YzZs3Z1t7PDY2loiICNatW0erVq1wdXVl+fLlbN26lWvXrhV3+GWWdNJFsdFoNGRkZLzUNtPT01+4juHDhxMZGcnGjRs5ffo03bp1o0uXLly9elUpM3/+fJYtW8aqVas4fvw4JiYmuLu78+jRo+fWf/bsWdRqNatXryYmJobFixezatUq5emoQgghRGmiVqsZNGgQfn5+NGrUKNvxY8eOYWlpScuWLZV9Xbp0QUdHh+PHj7/MUMsUWd2ljPv+++8JDAwkLi4OY2NjXFxccHFxYf369QCoVCoADhw4gJubG7/99hsffPABsbGxNG7cmKlTp+a7raioKDp27Eh4eDjTpk3j9OnT7N27l/bt2xMcHMyaNWu4ceMG9erVY/r06bz11lskJCTQsWNHACpWrAjAkCFDCA0NxcHBgbFjxzJ27FiljWbNmtGrVy8CAgKU+L/44gt++ukn9u/fj5+fHwBhYWF8+umnTJ8+nXv37uHp6cnatWsxMzPLM4f//vuPbdu28cMPP9C+fXsAAgIC+PHHH/nyyy+ZPXs2Go2GJUuWMG3aNHr27AnAhg0bqFKlCmFhYfTv3z/PNjw8PPDw8FC2a9euzblz5/jyyy9ZsGBBvt9vgFZB+8nQMynQOa8KQ10N81+HxgF7SMtUlXQ4xaI85AjlI0/JsWwoTzkWRHBwMHp6eowZMybH4zdu3Mi2Mpuenh5WVlbcuHGjsKGWe9JJL8OuX7/OgAEDmD9/Pr179+bhw4ccOnSIwYMHk5iYSFJSEiEhIQBYWVmRnJxM9+7d6dq1K5s2bSI+Pp5PPvmkwO1OnjyZBQsWULt2bSpWrEhQUBCbNm1i1apVODo6cvDgQd59911sbGxwdXVl27Zt9O3bl3PnzmFubo6RkVGB2gsICGDevHksWbIEPT09vv76ay5evEhYWBi7du3i3r179OvXj3nz5jFnzpw868rIyCAzM5MKFSpo7TcyMuLw4cMAxMfHc+PGDbp06aIct7CwoFWrVhw7duy5nfScPHjwACsrq1yPp6WlkZaWpmwnJSUBYKijQVdXU+D2XgWGOhqtf8ui8pAjlI88JceyoTzlmNeV54yMDOX477//ztKlSzl+/LjW1fHMzEylTGZmJhqNJsc6ny73smS197LbzY+CxCSd9DLs+vXrZGRk0KdPH+zt7QFo0qQJ8KTTmZaWhq2trVI+NDQUtVrNV199RYUKFWjUqBFXrlxh1KhRBWp35syZdO3aFXjSuZw7dy779u2jdevWwJOR48OHD7N69Wo6dOigdE4rV66MpaVlgfMcOHAgQ4cO1dqnVqsJDQ1VRs4HDRrE/v37n9tJNzMzo3Xr1syaNQsnJyeqVKnCN998w7Fjx5S1z7NGBapUqaJ1bpUqVQo1YhAXF8fy5cvzHEUPCgoiMDAw2/5pLmqMjTML3OarZFZLdUmHUOzKQ45QPvKUHMuG8pBjZGRkrsdOnTqlzDvfuXMnN2/epHbt2spxtVrNxIkTCQ4OZu3atdy8eZNr164RHh6ulMnMzOTOnTtcvXpVa//LlFeOJSU1NTXfZaWTXoY5OzvTuXNnmjRpgru7O926deOtt95SppU8KzY2lqZNm2qNImd1rAvi6TlpcXFxpKamKp32LI8fP8bFxaXAdT+vvSwODg5aU1uqVq3KzZs381Xfxo0bee+996hWrRq6uro0b96cAQMGcOrUqSKJ92lXr17Fw8ODt99+mxEjRuRabsqUKYwfP17ZTkpKokaNGsz+Q4cMfd0ij6s0MNTRMKulmukndUhTl9HLzuUgRygfeUqOZUN5yrFr167ZbgDN0qJFC7y8vABo1aoVo0eP1jrevXt3Bg4cyJAhQ6hfvz61atVixYoV2Nra0rx5c+BJB1mj0TBy5MiX/qTt9PR0IiMj88yxpGRdCc8P6aSXYbq6ukRGRnL06FH27t3L8uXLmTp1arHfxGFi8r850llrpO7evZtq1applTM0NMyzHh0dHTQa7UuOOV0merq9LM/+p1SpVKjV+RsZqVOnDr/88gspKSkkJSVRtWpV3nnnHWUUIevqw7///kvVqlWV8/7991+aNWuWrzYArl27RseOHWnTpg1r1qzJs6yhoWGO79fBSV2wtrbOd5uvkvT0dMLDwznl71HqfskWlfKQI5SPPCXHsqE85aivr6/kmJycTFxcnFLm8uXLxMTEYGVlRc2aNbWuusOTv7HVqlWjcePGADRt2hQPDw9GjRrFqlWrSE9PZ+zYsfTv31+5kl8Sns6xtChIPLK6SxmnUqlo27YtgYGB/PHHHxgYGLBjxw4MDAzIzNSeJuHk5MRff/2ltULJr7/++kLtN2zYEENDQxITE6lbt67Wq0aNGgAYGBgAZIvHxsaG69evK9tJSUnEx8e/UDwFYWJiQtWqVbl37x579uxRbhKtVasWtra27N+/Xyu248eP5/vKw9WrV3Fzc6NFixaEhISgoyP/FYUQQpSMkydPKgtLAIwfPx4XFxf8/f3zXcfmzZtp0KABnTt3xsvLC1dX1+cOQIm8yUh6GXb8+HH2799Pt27dqFy5MsePH+fWrVs4OTnx6NEj9uzZw7lz57C2tsbCwoKBAwcydepURowYwZQpU0hISCjwaiPPMjMzY8KECYwbNw61Wo2rqysPHjzgyJEjmJubM2TIEOzt7VGpVOzatQsvLy+MjIwwNTWlU6dOhIaG4u3tjaWlJf7+/ujqFv/Ujj179qDRaKhfvz5xcXH4+fnRoEEDZd67SqVi7NixzJ49G0dHR2rVqsX06dOxs7PL19rzWR10e3t7FixYwK1bt5Rjz45WCCGEEMXNzc0t25XrvCQkJGTbZ2VlxZYtW4owKiGd9DLM3NycgwcPsmTJEpKSkrC3t2fhwoV4enrSsmVLoqKiaNmyJcnJycoSjD/++CMjR47ExcWFhg0bEhwcTN++fV8ojlmzZmFjY0NQUBCXLl3C0tKS5s2bK+uCV6tWjcDAQCZPnszQoUMZPHgwoaGhTJkyhfj4eLp3746FhQWzZs16KSPpDx48YMqUKVy5cgUrKyv69u3LnDlztC5RTZw4kZSUFN5//33u37+Pq6srERER2VaFyUlkZCRxcXHExcVRvXp1rWMF+SUphBBCiLJLpZFegRCvnKSkJCwsLLh9+3aZn5Pu5eVV6uYUFpXykCOUjzwlx7JBciwbSnOOWX+/Hzx4gLm5eZ5lZSKsEEIIIYQQpYx00kW+jRw5ElNT0xxfI0eOLOnw8iUxMTHXHExNTUlMTHzhNubOnZtr/Z6enkWQhRBCCCHKOpmTLvJt5syZTJgwIcdjz7tkU1rY2dkRHR2d5/EXNXLkSPr165fjsYI+TVUIIYQQ5ZN00kW+Va5cmcqVK5d0GC9ET09PeXJocbGyslKeoiqEEEIIURgy3UUIIYQQQohSRjrpQgghhBCl1MGDB/H29sbOzg6VSkVYWJjW8YCAABo0aICJiQkVK1akS5cu2Z4sPmfOHNq0aYOxsTE2NjYvMXrxIqSTLopVQkICKpUqz3ngQgghhMhZSkoKzs7OrFy5Msfj9erVY8WKFZw+fZrDhw/j4OBAt27dtB6U9/jxY95++21GjRr1ssIWRUA66aJQfH198/V0zZchKioKlUrF/fv3SzoUAB4+fMjYsWOxt7fHyMiINm3acOLECa0yGo0Gf39/qlatipGREV26dOHChQslFLEQQojSytPTk9mzZ9O7d+8cjw8cOJAuXbpQu3ZtGjVqxKJFi0hKSuKvv/5SygQGBjJu3DiaNGnyssIWRUA66aLU0mg0ZGRkvNQ209PTX7iO4cOHExkZycaNGzl9+jTdunWjS5cuXL16VSkzf/58li1bxqpVqzh+/DgmJia4u7vz6NGjF25fCCFE+fT48WPWrFmDhYUFzs7OJR2OeEGyuovI0/fff09gYCBxcXEYGxvj4uKCi4sL69evB0ClUgFw4MAB3Nzc+O233/jggw+IjY2lcePGTJ06Nd9tRUVF0bFjR8LDw5k2bRqnT59m7969tG/fnuDgYNasWcONGzeoV68e06dP56233iIhIYGOHTsCULFiRQCGDBlCaGgoDg4OjB07lrFjxyptNGvWjF69ehEQEKDE/8UXX/DTTz+xf/9+/Pz8AAgLC+PTTz9l+vTp3Lt3D09PT9auXYuZmVmeOfz3339s27aNH374gfbt2wNP5gv++OOPfPnll8yePRuNRsOSJUuYNm0aPXv2BGDDhg1UqVKFsLAw+vfvn+/3rFXQfjL0TPJd/lViqKth/uvQOGAPaZmqkg6nWJSHHKF85Ck5lg0lnWPCvDcLdd6uXbvo378/qampVK1alcjISCpVqlTE0YmXTTrpIlfXr19nwIABzJ8/n969e/Pw4UMOHTrE4MGDSUxMJCkpiZCQEODJsoPJycl0796drl27smnTJuLj4/nkk08K3O7kyZNZsGABtWvXpmLFigQFBbFp0yZWrVqFo6MjBw8e5N1338XGxgZXV1e2bdtG3759OXfuHObm5gVeizwgIIB58+axZMkS9PT0+Prrr7l48SJhYWHs2rWLe/fu0a9fP+bNm8ecOXPyrCsjI4PMzEwqVKigtd/IyIjDhw8DEB8fz40bN+jSpYty3MLCglatWnHs2LEcO+lpaWmkpaUp20lJSQAY6mjQ1dUUKN9XhaGORuvfsqg85AjlI0/JsWwo6RzzczU3IyMjWzlXV1dOnDjBnTt3+Oqrr+jXrx+HDx/OtmxyZmZmgdp6VWXlVhpzLEhM0kkXubp+/ToZGRn06dMHe3t7AGU+m5GREWlpadja2irlQ0NDUavVfPXVV1SoUIFGjRpx5cqVAt+oMnPmTLp27Qo86ZzOnTuXffv20bp1awBq167N4cOHWb16NR06dFDWJK9cuTKWlpYFznPgwIEMHTpUa59arSY0NFQZOR80aBD79+9/bifdzMyM1q1bM2vWLJycnKhSpQrffPMNx44dU9Znv3HjBgBVqlTROrdKlSrKsWcFBQURGBiYbf80FzXGxpk5nFF2zGqpLukQil15yBHKR56SY9lQUjmGh4c/t8ypU6fQ19fP9XivXr3Ys2cPkydP5q233tI69ueffyqdxMjIyBcL9hVQGnNMTU3Nd1nppItcOTs707lzZ5o0aYK7uzvdunXjrbfeUqaVPCs2NpamTZtqjSJndawLomXLlsrXcXFxpKamKp32LI8fP8bFxaXAdT+vvSwODg5aU1uqVq3KzZs381Xfxo0bee+996hWrRq6uro0b96cAQMGcOrUqULHOGXKFMaPH69sJyUlUaNGDTp27Ii1tXWh6y3N0tPTiYyMpGvXrnn+QXqVlYccoXzkKTmWDa9Cji1atMDLyyvPMkZGRjg4OGQrd/v2bSWv0pzjiyrN38esK+H5IZ10kStdXV0iIyM5evQoe/fuZfny5UydOjXb+qtFzcTkf3Osk5OTAdi9ezfVqlXTKmdoaJhnPTo6Omg02pcsc7rM9HR7WZ79T61SqVCr8zeyUqdOHX755RdSUlJISkqiatWqvPPOO9SuXRtAufrw77//UrVqVeW8f//9l2bNmuVYp6GhYY756uvrl7pfQEVNciw7ykOekmPZUJpyTE5OJi4uTtm+fPkyMTExWFlZYW1tzZw5c+jRowdVq1bl9u3brFy5kqtXr9K/f38lh8TERO7evcvVq1fJzMzk0qVLxMTE4OTkhKmpaUmlVuxK0/cxS0HikU66yJNKpaJt27a0bdsWf39/7O3t2bFjBwYGBlpz2wCcnJzYuHEjjx49UkbTf/311xdqv2HDhhgaGpKYmEiHDh1yLGNgYACQLR4bGxuuX7+ubCclJREfH/9C8RSEiYkJJiYm3Lt3jz179jB//nwAatWqha2tLfv371c65UlJSRw/flzWsBVCCKHl5MmTygIJgHJVdciQIaxatYqzZ8+yfv16bt++jbW1Na+99hqHDh2iUaNGyjn+/v7Kgg9P15G16IMonaSTLnJ1/Phx9u/fT7du3ahcuTLHjx/n1q1bODk58ejRI/bs2cO5c+ewtrbGwsKCgQMHMnXqVEaMGMGUKVNISEhgwYIFLxSDmZkZEyZMYNy4cajValxdXXnw4AFHjhzB3NycIUOGYG9vj0qlYteuXXh5eWFkZISpqSmdOnUiNDQUb29vLC0t8ff3R1dXt4jendzt2bMHjUZD/fr1iYuLw8/PjwYNGijz3lUqFWPHjmX27Nk4OjpSq1Ytpk+fjp2dXalZe14IIUTp4Obmlu2q8NO2b9/+3DpCQ0MJDQ0FnlxRDg8Px8vLq9SNMgtt0kkXuTI3N+fgwYMsWbKEpKQk7O3tWbhwIZ6enrRs2ZKoqChatmxJcnKy8mn8xx9/ZOTIkbi4uNCwYUOCg4Pp27fvC8Uxa9YsbGxsCAoK4tKlS1haWtK8eXM+++wzAKpVq0ZgYCCTJ09m6NChDB48mNDQUKZMmUJ8fDzdu3fHwsKCWbNmvZSR9AcPHjBlyhSuXLmClZUVffv2Zc6cOVq/DCdOnEhKSgrvv/8+9+/fx9XVlYiIiGyrwgghhBCifFJp8vp4JoQolZKSkrCwsFAub5ZF5WG0pzzkCOUjT8mxbJAcy4bSnGPW3+8HDx5gbm6eZ1l54qgQQgghhBCljHTSxUszcuRITE1Nc3yNHDmypMPLl8TExFxzMDU1JTExsaRDFEIIIUQZIHPSxUszc+ZMJkyYkOOx513yKS3s7OyIjo7O87gQQgghxIuSTrp4aSpXrpztEcWvGj09PeXJoUIIIYQQxUWmuwghhBBCCFHKSCddvFQqlYqwsLCSDuOlCggIyPVJokIIIV6+gwcP4u3tjZ2dXY5/l3bs2EG3bt2wtrZGpVLlOs3x2LFjdOrUCRMTE8zNzWnfvj3//fdf8ScgygXppAtRhHL6ZT9hwgT2799fMgEJIYTIJiUlBWdnZ1auXJnrcVdXV4KDg3Ot49ixY3h4eNCtWzd+++03Tpw4wejRo9HRka6VKBoyJ12I58jMzESlUhX6F2/Wyi9CCCFKB09PTzw9PXM9/u6776Kvr09CQkKuZcaNG8eYMWOYPHmysq9+/fpFGaYo5+Tjnsi3NWvWYGdnh1qt1trfs2dP3nvvPQC+/PJL6tSpg4GBAfXr12fjxo251hcVFYVKpeL+/fvKvujoaFQqlfKLMTQ0FEtLS3bt2kX9+vUxNjbmrbfeIjU1lfXr1+Pg4EDFihUZM2YMmZmZSj1paWlMmDCBatWqYWJiQqtWrYiKispXnllt7ty5k4YNG2JoaEhiYiInTpyga9euVKpUCQsLCzp06MDvv/+unOfg4ABA7969UalUyvaz013UajUzZ86kevXqGBoa0qxZMyIiIvIVmxBCiJJ38+ZNjh8/TuXKlWnTpg1VqlShQ4cOHD58uKRDE2WIjKSLfHv77bf5+OOPOXDgAJ07dwbg7t27REREEB4ezo4dO/jkk09YsmQJXbp0YdeuXQwdOpTq1avTsWPHQrebmprKsmXL2Lp1Kw8fPqRPnz707t0bS0tLwsPDuXTpEn379qVt27a88847AIwePZq///6brVu3Ymdnx44dO/Dw8OD06dM4Ojrmq83g4GDWrVuHtbU1lStX5tKlSwwZMoTly5ej0WhYuHAhXl5eXLhwATMzM06cOEHlypUJCQnBw8MDXV3dHOteunQpCxcuZPXq1bi4uPD111/To0cPYmJico0tLS2NtLQ0ZTspKQmA9sH7yNA3Kehb+kow1NEwqyW0mBlBmlpV0uEUi/KQI5SPPCXH0utMgPtzy2RkZJCenk56ejpAjv9mfQ1w/vx54MkgTHBwME2bNmXz5s107tyZP/74I19/Z0rKs7mVRaU5x4LEJJ10kW8VK1bE09OTLVu2KJ3077//nkqVKtGxY0fatWuHr68vH374IQDjx4/n119/ZcGCBS/USU9PT1dG6AHeeustNm7cyL///oupqSkNGzakY8eOHDhwgHfeeYfExERCQkJITExU1i2fMGECERERhISEMHfu3Hy1+cUXX+Ds7Kzs69Spk1aZNWvWYGlpyS+//EL37t2xsbEBwNLSEltb21zrXrBgAZMmTaJ///4ABAcHc+DAAZYsWZLr/MigoCACAwOz7Z/mosbYODOHM8qOWS3Vzy/0iisPOUL5yFNyLH3Cw8OfW+bUqVNaj4+PjIwE4N9//wXg8OHDXLt2TTl+9uxZADp27IiNjQ3Xr1+nU6dO/PDDD/j7+zNo0KCiTKFYZOVYlpXGHFNTU/NdVjrpokB8fHwYMWIEX3zxBYaGhmzevJn+/fujo6NDbGws77//vlb5tm3bsnTp0hdq09jYWOmgA1SpUgUHBweted5VqlTh5s2bAJw+fZrMzEzq1aunVU9aWhrW1tb5atPAwICmTZtq7fv333+ZNm0aUVFR3Lx5k8zMTFJTUwv0lNGkpCSuXbtG27Zttfa3bduWP//8M9fzpkyZwvjx47XqqVGjBrP/0CFDP+cR+1fdk1E7NdNP6rxSo3YFUR5yhPKRp+RYeuVnJL1FixZ4eXmRnp5OZGQkXbt21ZqT7urqqjVt0cnJicmTJ9O9e3e8vLyU/Zs2bUJPT09rX2nzbI5lUWnOMetKeH5IJ10UiLe3NxqNht27d/Paa69x6NAhFi9eXKi6sm7E1Gg0yr6cLgM9+x9MpVLluC9rrnxycjK6urqcOnUq25ST/N7AaWRkhEql/UdoyJAh3Llzh6VLl2Jvb4+hoSGtW7fm8ePH+arzRRgaGmJoaJht/8FJXfL9weNVk56eTnh4OKf8PUrdL9miUh5yhPKRp+T4atPT09PKSV9fX3k9vZ3F0dEROzs7Ll68qLU/Li4OT0/PV+L9eTansqg05liQeKSTLgqkQoUK9OnTh82bNxMXF0f9+vVp3rw58GRk4ciRIwwZMkQpf+TIERo2bJhjXVnTQ65fv07FihUBcl2LtiBcXFzIzMzk5s2btGvX7oXry3LkyBG++OILZYTk8uXL3L59W6uMvr6+1g2szzI3N8fOzo4jR47QoUMHrbpff/31IotVCCFE7pKTk4mLi1O24+PjiY6OxszMDHhyv9X169eVKS7nzp0DwNbWFltbW1QqFX5+fsyYMQNnZ2eaNWvG+vXrOXv2LN9///3LT0iUSdJJFwXm4+ND9+7diYmJ4d1331X2+/n50a9fP1xcXOjSpQs//vgj27dvZ9++fTnWU7duXWrUqEFAQABz5szh/PnzLFy48IXjq1evHj4+PgwePJiFCxfi4uLCrVu32L9/P02bNuXNN98sVL2Ojo5s3LiRli1bkpSUhJ+fH0ZGRlplHBwc2L9/P23btsXQ0FD58PG0rF/sderUoVmzZoSEhBAdHc3mzZsLFZcQQoiCOXnypNa9UlnTCQcNGkTfvn3ZtWsXw4cPV45n3UM0Y8YMAgICABg7diyPHj1i3Lhx3L17F2dnZyIjI7WmZwrxImQJRlFgnTp1wsrKinPnzjFw4EBlf69evVi6dCkLFiygUaNGrF69mpCQENzc3HKsR19fn2+++YazZ8/StGlTgoODmT17dpHEGBISwuDBg/n000+pX78+vXr14sSJE9SsWbPQdX711Vfcu3eP5s2bM2jQIMaMGUPlypW1yixcuJDIyEhq1KiBi4tLjvWMGTOG8ePH8+mnn9KkSRMiIiLYuXNnqV4NQAghyhI3Nzc0Gk2211dffQXA4MGDczye1UHPMnnyZC5fvkxKSgpHjx7F1dW1BLIRZZVK8/SEYCHEKyEpKQkLCwtu375d5ueke3l5lbo5hUWlPOQI5SNPybFskBzLhtKcY9bf7wcPHmBubp5nWRlJF0IIIYQQopSRTroodzw9PTE1Nc3xlZ811IUQQgghipvcOCrKnXXr1vHff//leMzKyuolRyOEEEIIkZ100kW5U61atZIOQQghhBAiTzLdRQghhBBCiFJGOulCCCGEKDMOHjyIt7c3dnZ2qFQqwsLCtI5v376dbt26YW1tjUqlyvEheh9++CF16tTByMgIGxsbevbsydmzZ19OAkL8f9JJF6KYhYWFUbduXXR1dRk7dmxJhyOEEGVaSkoKzs7OrFy5Mtfjrq6uBAcH51pH8+bNCQkJITY2lj179qDRaOjWrVueT5QWoqjJnHQh/r+AgADCwsJyHFV5ER988AFDhw5lzJgxyiOns8TFxeHi4oKuri73798v0naFEKI88vT0xNPTM9fjgwYNAiAhISHXMsOHD1fW13ZwcGD27Nk4OzuTkJAgTxQVL42MpAtRjJKTk7l58ybu7u7Y2dlpddLT09MZMGAA7dq1K8EIhRBC5CUlJYWQkBBq1apFjRo1SjocUY7ISLooU9RqNQsWLGDNmjVcvnyZKlWq8MEHHzB16lQmTZrEjh07uHLlCra2tvj4+ODv74++vj6hoaEEBgYCoFKpAAgJCcHX1zfP9hYtWkRISAiXLl3CysoKb29v5s+fj6mpKVFRUXTs2BGATp06AXDgwAHc3NwAmDZtGg0aNKBz584cPXq0UPm2CtpPhp5Joc4t7Qx1Ncx/HRoH7CEtU1XS4RSL8pAjlI88JceSkzDvzWKp94svvmDixImkpKRQv359IiMjMTAwKJa2hMiJdNJFmTJlyhTWrl3L4sWLcXV15fr168rNPmZmZoSGhmJnZ8fp06cZMWIEZmZmTJw4kXfeeYczZ84QERHBvn37ALCwsHhuezo6OixbtoxatWpx6dIlPvzwQyZOnMgXX3xBmzZtOHfuHPXr12fbtm20adNGWYf9559/5v/+7/+Ijo5m+/btz20nLS2NtLQ0ZTspKQkAQx0NurqaAr9PrwJDHY3Wv2VRecgRykeekmPJSU9Pz/N4RkZGjmWy9qWnp2t9nfVvv379cHNz48aNGyxatIi3336bX375hQoVKhRxBi/Xs7mWRaU5x4LEpNJoNKXrf5sQhfTw4UNsbGxYsWIFw4cPf275BQsWsHXrVk6ePAkUzZz077//npEjR3L79m0A7t+/T8WKFbVG0O/cuYOLiwubNm2iffv2hIaGMnbs2DznpAcEBCgj/U/bsmULxsbGhY5XCCHKsl69ejF58mTeeOONbMf+/fdfPvjgAxYtWkTt2rXzrCc9PZ13332Xjz76iPbt2xdXuKIcSE1NZeDAgTx48ABzc/M8y8pIuigzYmNjSUtLo3Pnzjke//bbb1m2bBkXL14kOTmZjIyM5/4HeZ59+/YRFBTE2bNnSUpKIiMjg0ePHpGamppr53nEiBEMHDiwQL/op0yZwvjx45XtpKQkatSowew/dMjQ132hHEorQx0Ns1qqmX5ShzR16bm0XpTKQ45QPvKUHEvOmQD3PI+3aNECLy+vbPuzbhx1dXWlWbNmwJPOeGRkJF27dlVuHIUnVzN1dHRo2LBhjnW9SnLLsSwpzTlmXQnPD+mkizLDyMgo12PHjh3Dx8eHwMBA3N3dsbCwYOvWrSxcuLDQ7SUkJNC9e3dGjRrFnDlzsLKy4vDhwwwbNozHjx/n2kn/+eef2blzJwsWLABAo9GgVqvR09NjzZo1vPfee9nOMTQ0xNDQMNv+g5O6YG1tXegcSrP09HTCw8M55e9R6n7JFpXykCOUjzwlx9IjOTmZuLg4Zfvy5cvExMRgZWVFzZo1uXv3LomJiVy7dg2AS5cuoa+vj62tLdbW1sr0Fk9PT2xsbLhy5Qrz5s3DyMgIb2/vUp17Qejr65eZXHJTGnMsSDzSSRdlhqOjI0ZGRuzfvz/bdJejR49ib2/P1KlTlX3//POPVhkDA4MCrYF76tQp1Go1CxcuREfnyUJJ33333XPPO3bsmFY7P/zwA8HBwRw9epRq1arlu30hhBDZnTx5UrlpH1CuQg4ZMoTQ0FB27tzJ0KFDleP9+/cHYMaMGUydOhUDAwOOHDnC8uXLuXfvHlWqVKF9+/YcPXqUypUrv9xkRLkmnXRRZlSoUIFJkyYxceJEDAwMaNu2Lbdu3SImJgZHR0cSExPZunUrr732Grt372bHjh1a5zs4OBAfH090dDTVq1fHzMwsx9HrLHXr1iU9PZ3ly5fj7e3NkSNHWLVq1XPjdHJy0to+efIkOjo6NG7cuHCJCyGEULi5uZHX7Xa+vr65rtyVnp6OlZUVO3fuLHUjsKL8kXXSRZkyffp0Pv30U/z9/XFycuKdd97h5s2b9OjRg3HjxjF69GiaNWvG0aNHmT59uta5ffv2xcPDg44dO2JjY8M333yTZ1vOzs4sWrSI4OBgGjduzObNmwkKCirO9IQQQghRTshIuihTdHR0mDp1qta0lizz589n/vz5WvvGjh2rfG1oaMj3339foPbGjRvHuHHjtPZlPc0OwNLSMs8RHch7VEcIIYQQ5ZOMpAshhBBCCFHKSCddiFxs3rwZU1PTHF+NGjUq6fCEEEIIUYbJdBchctGjRw9atWqV4zG5oUgIIYQQxUk66ULkwszMDDMzs5IOQwghhBDlkEx3EUIIIYQQopSRTroos6KiolCpVNy/f7/Y2woNDcXS0lLZDggIUB4zLYQQ4uU5ePAg3t7e2NnZoVKpCAsL0zq+fft2unXrhrW1NSqViujo6Gx1fPjhh9SpUwcjIyNsbGzo2bMnZ8+efTkJCPH/SSddvBRlvdP6zjvvcP78+ZIOQwghyr2UlBScnZ1ZuXJlrsddXV0JDg7OtY7mzZsTEhJCbGwse/bsQaPR0K1btwI9lVqIFyVz0oUoAkZGRhgZGZV0GEIIUe55enri6emZ6/GsZ1kkJCTkWmb48OHKAgEODg7Mnj0bZ2dnEhISqFOnTpHGK0RuZCRd5JtarWb+/PnUrVsXQ0NDatasyZw5cwCYNGkS9erVw9jYmNq1azN9+nTS09OBJ1NBAgMD+fPPP1GpVKhUKkJDQ/Nsa+DAgbzzzjta+9LT06lUqRIbNmwAIC0tjTFjxlC5cmUqVKiAq6srJ06cKFRu//zzD97e3lSsWBETExMaNWpEeHg48L9pM7t376Zp06ZUqFCBN954gzNnzijnPzvd5VkXL16kdu3ajB49Go1GQ1paGhMmTKBatWqYmJjQqlUroqKiChW7EEKI4pOSkkJISAi1atWiRo0aJR2OKEdkJF3k25QpU1i7di2LFy/G1dWV69evK3P0zMzMCA0Nxc7OjtOnTzNixAjMzMyYOHEi77zzDmfOnCEiIoJ9+/YBYGFhkWdbPj4+vP322yQnJ2NqagrAnj17SE1NpXfv3gBMnDiRbdu2sX79euzt7Zk/fz7u7u7ExcVhZWVVoNw++ugjHj9+zMGDBzExMeHvv/9W2s3i5+fH0qVLsbW15bPPPsPb25vz588/dznGv/76C3d3d4YNG8bs2bMBGD16NH///Tdbt27Fzs6OHTt24OHhwenTp3F0dMx33K2C9pOhZ1KgXF8Vhroa5r8OjQP2kJapKulwikV5yBHKR56SY8lJmPdmsdT7xRdfMHHiRFJSUqhfvz6RkZEYGBgUS1tC5KTIOun379/PcyRRvNoePnzI0qVLWbFiBUOGDAGgTp06uLq6AjBt2jSlrIODAxMmTGDr1q1MnDgRIyMjTE1N0dPTw9bWNl/tubu7Y2Jiwo4dO5RLk1u2bKFHjx6YmZmRkpLCl19+SWhoqHJZc+3atURGRvLVV1/h5+dXoPwSExPp27cvTZo0AaB27drZysyYMYOuXbsCsH79eqpXr86OHTvo169frvUePXqU7t27M3XqVD799FOlrZCQEBITE7GzswNgwoQJREREEBISwty5c7PVk5aWRlpamrKdlJQEgKGOBl1dTYFyfVUY6mi0/i2LykOOUD7ylBxLTtZV29xkZGTkWCZrX3p6utbXWf/269cPNzc3bty4waJFi3j77bf55ZdfqFChQhFn8HI9m2tZVJpzLEhMheqkBwcH4+DgoExH6NevH9u2bcPW1pbw8HCcnZ0LU60oxWJjY0lLS6Nz5845Hv/2229ZtmwZFy9eJDk5mYyMDMzNzQvdnp6eHv369WPz5s0MGjSIlJQUfvjhB7Zu3Qo8mT6Snp5O27ZtlXP09fV5/fXXiY2NLXB7Y8aMYdSoUezdu5cuXbrQt29fmjZtqlWmdevWytdWVlbUr18/z7YSExPp2rUrc+bMYezYscr+06dPk5mZSb169bTKp6WlYW1tnWNdQUFBBAYGZts/zUWNsXHZvpFpVkt1SYdQ7MpDjlA+8pQcX76sqYm5OXXqVI5XPP/9918ADh8+zLVr17SORUZGam37+vry7rvvEhAQQPv27V8w4tLh2RzLotKYY2pqar7LFqqTvmrVKjZv3gw8eQMiIyP56aef+O677/Dz82Pv3r2FqVaUYnndFHns2DF8fHwIDAzE3d0dCwsLtm7dysKFC1+oTR8fHzp06MDNmzeJjIzEyMgIDw+PF6ozN8OHD8fd3Z3du3ezd+9egoKCWLhwIR9//HGh67SxscHOzo5vvvmG9957T/nQkpycjK6uLqdOnUJXV1frnGen2GSZMmUK48ePV7aTkpKoUaMGHTt2zLVj/6pLT08nMjKSrl27ltknvJaHHKF85Ck5ll4tWrTAy8sr2/6sG0ddXV2V1cdyyzEtLQ0dHR0aNmyYY12vklf1+1gQpTnHrCvh+VGoTvqNGzeUmyd27dpFv3796NatGw4ODrk+Rl282hwdHTEyMmL//v0MHz5c69jRo0ext7dn6tSpyr5//vlHq4yBgUGBl65q06YNNWrU4Ntvv+Wnn37i7bffVv6z1alTBwMDA44cOYK9vT3w5D/liRMntEatC6JGjRqMHDmSkSNHKvPvn+6k//rrr9SsWROAe/fucf78eZycnHKtz8jIiF27duHl5YW7uzt79+7FzMwMFxcXMjMzuXnzJu3atctXbIaGhhgaGmbbr6+vX+p+ARU1ybHsKA95So4lLzk5mbi4OGX78uXLxMTEYGVlRc2aNbl79y6JiYnK6PmlS5fQ19fH1tYWa2trZXqLp6cnNjY2XLlyhXnz5mFkZIS3t3epzr0gSvv3sSiUxhwLEk+hOukVK1bk8uXL1KhRg4iICOVmOI1GI2uIllEVKlRg0qRJTJw4EQMDA9q2bcutW7eIiYnB0dGRxMREtm7dymuvvcbu3bvZsWOH1vkODg7Ex8cTHR1N9erVMTMzy7HT+ayBAweyatUqzp8/z4EDB5T9JiYmjBo1Cj8/P+UX7/z580lNTWXYsGEFzm/s2LF4enpSr1497t27x4EDB7J1wGfOnIm1tTVVqlRh6tSpVKpUiV69euVZr4mJCbt371aWBIuIiKBevXr4+PgwePBgFi5ciIuLC7du3WL//v00bdqUN98snpughBCiPDh58iQdO3ZUtrOuQg4ZMoTQ0FB27tzJ0KFDleP9+/cHntx3NHXqVGUAaPny5dy7d48qVarQvn17jh49SuXKlV9uMqJcK1QnvU+fPgwcOBBHR0fu3Lmj3Lj3xx9/ULdu3SINUJQe06dPR09PD39/f65du0bVqlUZOXIkw4YNY9y4cYwePZq0tDTefPNNpk+fTkBAgHJu37592b59Ox07duT+/fuEhITg6+v73DZ9fHyYM2cO9vb2WvPPAebNm4darWbQoEE8fPiQli1bsmfPHipWrFjg3DIzM/noo4+4cuUK5ubmeHh4sHjx4mztffLJJ1y4cIFmzZrx448/5utOf1NTU3766Sfc3d158803CQ8PJyQkhNmzZ/Ppp59y9epVKlWqxBtvvEH37t0LHLsQQoj/cXNzQ6PJ/eZWX1/fXP/+pKenY2Vlxc6dO0vdCKwof1SavH6Sc5Gens7SpUu5fPkyvr6+uLi4ALB48WLMzMyyTYcQ4lUWFRVFx44duXfvXqlZwSgpKQkLCwtu375dpuekh4eH4+XlVWb/WJaHHKF85Ck5lg2SY9lQmnPM+vv94MGD5y6wUaiRdH19fSZMmJBt/7hx4wpTnRBCCCGEEOIphX7i6MaNG3F1dcXOzk65SXDJkiX88MMPRRacKLs2b96Mqalpjq9GjRoVeXuenp65tpfTuuRCCCGEECWpUCPpX375Jf7+/owdO5Y5c+YoN4taWlqyZMkSevbsWaRBirKnR48eua4EVByXptatW8d///2X47HnPZ30efMbhRBCCCGKWqE66cuXL2ft2rX06tWLefPmKftbtmyZ4zQYIZ5lZmaGmZnZS2uvWrVqL60tIYQQQogXVajpLvHx8crNok8zNDQkJSXlhYMSQgghhBCiPCtUJ71WrVpER0dn2x8REZHnw12EEEIIIYrawYMH8fb2xs7ODpVKRVhYmNbx7du3061bN6ytrVGpVNn6MHfv3uXjjz+mUaNG9OvXjzp16jBmzBgePHjw8pIQ4hmF6qSPHz+ejz76iG+//RaNRsNvv/3GnDlzmDJlChMnTizqGEuNnP7jF5fQ0NBSs9zfi3Bzcyv0E0DLOgcHB5YsWaJsv8yfLyGEKEtSUlJwdnZm5cqVuR53dXUlODg4x+PXrl3j2rVrBAcHs3TpUtatW0dEREShHo4nRFEp1Jz04cOHY2RkxLRp00hNTWXgwIHY2dmxdOlS5cldr7KAgADCwsKyfdK+fv16oR6UI4QQQojik/VU59wMGjQIgISEhByPN27cmG3btinra3fs2JE5c+bw7rvvkpGRgZ5eobpLQryQAv/UZWRksGXLFtzd3fHx8SE1NZXk5ORy8ahcW1vbkg5BCCGEEC9B1sNmpIMuSkqBf/L09PQYOXIksbGxABgbG2NsbFzkgb2oiIgIZs+ezZkzZ9DV1aV169YsXbqUOnXqAHDlyhX8/PzYs2cPaWlpODk5sXLlSmJjYwkMDASeTD8AlEfYq1QqduzYQa9evWjTpg3t2rXTunR269Yt7Ozs2L9/P+3btyctLY2pU6fyzTffcP/+fRo3bkxwcDBubm75ziMsLAw/Pz8uX75Mhw4dWLduHTVq1ACePNr4/v37WlMkxo4dS3R0NFFRUWzYsIFx48Zx7do1DA0NlTK9evXCzMyMjRs35tru+fPnqV+/PrGxsTRo0EDZv3jxYlasWMHFixcB+OWXX/Dz8+PPP//EysqKIUOGMHv27Fx/qT39HmbJWrrT19eXhIQEatWqxbfffsvy5cs5efIkjRs3ZvPmzTx48IBRo0Zx9uxZ2rVrx4YNG7CxsVHqWbduHQsXLiQ+Ph4HBwfGjBnDhx9++Nz3+PHjx4wfP55t27Zx7949qlSpwsiRI5kyZYoS86pVq/jxxx/5+eefsbe35+uvv8bGxobhw4dz4sQJnJ2d2bhxo/LzdfHiRcaPH8+vv/5KSkoKTk5OBAUF0aVLl+fGUxCtgvaToWdSpHWWFoa6Gua/Do0D9pCWqSrpcIpFecgRykeekuPLlTDvzWKt//bt28yaNYv333+/WNsRIi+F+nj4+uuv88cff2Bvb1/U8RSZlJQUxo8fT9OmTUlOTsbf35/evXsTHR1NamoqHTp0oFq1auzcuRNbW1t+//131Go177zzDmfOnCEiIoJ9+/YBYGFhka1+Hx8f5s+fz7x585TO/LfffoudnR3t2rUDYPTo0fz9999s3boVOzs7duzYgYeHB6dPn8bR0fG5OaSmpjJnzhw2bNiAgYEBH374If379+fIkSP5eg/efvttxowZw86dO3n77bcBuHnzJrt372bv3r15nluvXj1atmzJ5s2bmTVrlrJ/8+bNDBw4EICrV6/i5eWFr68vGzZs4OzZs4wYMYIKFSoQEBCQrxhzM2PGDJYsWULNmjV57733GDhwIGZmZixduhRjY2P69euHv78/X375pRKXv78/K1aswMXFhT/++IMRI0ZgYmLCkCFD8mxr2bJl7Ny5k++++46aNWty+fJlLl++rFVm1qxZLFq0iEWLFjFp0iQGDhxI7dq1mTJlihLj6NGj+emnnwBITk7Gy8uLOXPmYGhoyIYNG/D29ubcuXPUrFmzwO9HWloaaWlpynZSUhIAhjoadHXL5hruhjoarX/LovKQI5SPPCXHlys9PT3P4xkZGTmWydqXnp6e6/HU1FR69OiBk5MTU6dOfW5br5qn34OyqjTnWJCYCtVJ//DDD/n000+5cuUKLVq0wMREeySvadOmham2SPXt21drO2vk8++//+bo0aPcunWLEydOKA+yqVu3rlLW1NQUPT29PKe39OvXj7Fjx3L48GGlU75lyxYGDBiASqUiMTGRkJAQEhMTsbOzA2DChAlEREQQEhKSr6dcpqens2LFCuWhP+vXr8fJyYnffvuN119//bnnGxkZMXDgQEJCQpRO+qZNm6hZs2a+RvN9fHxYsWKF0kk/f/48p06dYtOmTQB88cUX1KhRgxUrVqBSqWjQoAHXrl1j0qRJ+Pv7o6NT6AfaMmHCBNzd3QH45JNPGDBgAPv376dt27YADBs2jNDQUKX8jBkzWLhwIX369AGerED0999/s3r16ud20hMTE3F0dMTV1RWVSpXjh8+hQ4fSr18/ACZNmkTr1q2ZPn26VoxDhw5Vyjs7O+Ps7Kxsz5o1ix07drBz505Gjx5d4PcjKChIucLztGkuaoyNMwtc36tkVkt1SYdQ7MpDjlA+8pQcX47w8PA8j586dSrHB+P9+++/ABw+fJhr165lO/7ff/8RGBiIoaEhw4YNIzIysmgCLoXKcm5ZSmOOqamp+S5bqE561s2hY8aMUfapVCo0Gg0qlUp5AmlJunDhAv7+/hw/fpzbt2+jVj/5pZKYmEh0dDQuLi7PfdJkXmxsbOjWrRubN2+mXbt2xMfHc+zYMVavXg3A6dOnyczMpF69elrnpaWlYW1tna829PT0eO2115TtBg0aYGlpSWxsbL466QAjRozgtdde4+rVq1SrVo3Q0FBl6s7z9O/fnwkTJvDrr7/yxhtvsHnzZpo3b65Mf4mNjaV169ZadbVt25bk5GSuXLlSqBHjLE9/0KtSpQoATZo00dp38+ZN4MlVk4sXLzJs2DBGjBihlMnIyMjxKsizfH196dq1K/Xr18fDw4Pu3bvTrVu3Asfz6NEjkpKSMDc3Jzk5mYCAAHbv3s3169fJyMjgv//+IzExsSBvg2LKlCmMHz9e2U5KSqJGjRrM/kOHDH3dQtVZ2hnqaJjVUs30kzqkqcvo9IFykCOUjzwlx5frTIB7nsdbtGiBl5dXtv1ZN466urrSrFkzrWNJSUl4eXmhp6fH/v378/X341WUnp5OZGQkXbt2LZYnfJcGpTnHrCvh+VGoTnp8fHxhTnupvL29sbe3Z+3atdjZ2aFWq2ncuDGPHz/GyMioSNrw8fFhzJgxLF++nC1bttCkSROl45acnIyuri6nTp1CV1e7E2Vqalok7evo6GR7XP2zl1FcXFxwdnZmw4YNdOvWjZiYGHbv3p2v+m1tbenUqRNbtmzhjTfeYMuWLYwaNeqFYs76MJdXzIDWf6qsDwHP7sv64JWcnAzA2rVrlasOWZ5973PSvHlz4uPj+emnn9i3bx/9+vWjS5cufP/99wWKB1BimjBhApGRkSxYsIC6detiZGTEW2+9xePHj58bT04MDQ217ivIcnBSl3x/6HvVZK2ycMrfo9T9ki0q5SFHKB95So4lKzk5mbi4OGX78uXLxMTEYGVlRc2aNbl79y6JiYnK6PmlS5fQ19fH1tYWW1tbkpKSePPNN0lNTWX06NH8999/ZGRkAE8G5fLzt+RVo6+vX+q+j0WtNOZYkHgK1UkvzXPRAe7cucO5c+dYu3atMhXl8OHDyvGmTZuybt067t69m+NouoGBQb6uBvTs2ZP333+fiIgItmzZwuDBg5VjLi4uZGZmcvPmTSWGgsrIyODkyZPKqPm5c+e4f/++8sAoGxsbzpw5o3VOdHR0th+A4cOHs2TJEq5evUqXLl2UG0/zw8fHh4kTJzJgwAAuXbqktcSmk5MT27ZtU66gABw5cgQzMzOqV6+eY302NjZcv35d2b5w4UKBLv3kpEqVKtjZ2XHp0iV8fHwKVYe5uTnvvPMO77zzDm+99RYeHh65/nzkx5EjR/D19aV3797Akz8guS39JYQQ4sWcPHmSjh07KttZVx6HDBlCaGgoO3fu1JqSmPW3bMaMGQQEBPD7779z/PhxgGyDUVmLEQjxshWqk75hw4Y8jz/dWS0JFStWxNramjVr1lC1alUSExOZPHmycnzAgAHMnTuXXr16ERQURNWqVfnjjz+ws7OjdevWODg4EB8fT3R0NNWrV8fMzCzHUUwTExN69erF9OnTiY2NZcCAAcqxevXq4ePjw+DBg1m4cCEuLi7cunWL/fv307RpU9588/l3puvr6/Pxxx+zbNky9PT0GD16NG+88YbSae/UqROff/45GzZsoHXr1mzatIkzZ87g4uKiVc/AgQOZMGECa9eufe737ll9+vRh1KhRjBo1io4dOyrz6+HJvQlLlizh448/ZvTo0Zw7d44ZM2Ywfvz4XOejd+rUiRUrVtC6dWsyMzOZNGlSkXzKDQwMZMyYMVhYWODh4UFaWhonT57k3r17WtNEcrJo0SKqVq2Ki4sLOjo6/N///R+2trYv9DApR0dHtm/fjre3NyqViunTpyuj7EIIIYqWm5tbtqu0T/P19cXX1/e552ddLfDy8ip1I7Ci/ClUJ/2TTz7R2s66G9rAwABjY+MS76Tr6OiwdetWxowZQ+PGjalfvz7Lli1TbpY0MDBg7969fPrpp3h5eZGRkUHDhg2VJ5X17duX7du307FjR+7fv68swZgTHx8fvLy8aN++fbY52CEhIcyePZtPP/2Uq1evUqlSJd544w26d++erzyMjY2VlUSuXr1Ku3bt+Oqrr5Tj7u7uTJ8+nYkTJ/Lo0SPee+89Bg8ezOnTp7XqsbCwoG/fvuzevVtr6cP8MDMzw9vbm++++46vv/5a61i1atUIDw/Hz88PZ2dnrKysGDZsGNOmTcu1voULFzJ06FDatWunPADr1KlTBYopJ8OHD8fY2JjPP/8cPz8/TExMaNKkSb6edmpmZsb8+fO5cOECurq6vPbaa4SHh7/Qja+LFi3ivffeo02bNlSqVIlJkyYVaB6aEEIIIco3lSavj54FcOHCBUaNGoWfn5+y4oUoPTp37kyjRo1YtmxZSYciikBSUhIWFhbcvn27zM9JL8sjWuUhRygfeUqOZYPkWDaU5hyz/n5nPSwrL4UfKnyGo6Mj8+bNyzbKLkrWvXv32LFjB1FRUXz00UclHY4QQgghhMiHIuukw5MlA3Nad1Rk5+npiampaY6v/Kyhnl8uLi74+voSHBxM/fr1tY41atQo1xg2b95cZDGUtLlz5+aap6enZ0mHJ4QQQgiRTaHmpO/cuVNrW6PRcP36dVasWKE8bEbkbd26dfz33385HnuR9dufldeKIuHh4bk++SprLfCyYOTIkcqDiJ5VVMtxCiGEEEIUpUJ10p+9+VClUmFjY0OnTp1YuHBhUcRV5lWrVq2kQyj1S2kWFSsrqyL94COEEEIIUdwK1UmXpeSEEEIIIYQoPoWakz5z5swcH0Dz33//MXPmzBcOSgghhBAiy8GDB/H29sbOzg6VSkVYWJjWcY1Gg7+/P1WrVsXIyIguXbpw4cIFrTK///47Xbt2xdLSEmtra95//33lidVClEaF6qQHBgbm+IOdmppKYGDgCwdVFuX0S6W4hIaGvtCDeEoLNze3fK1zXpISEhJQqVRER0fnWiYqKgqVSsX9+/dfWlxCCFGWpKSk4OzsrDzP5Fnz589n2bJlrFq1iuPHj2NiYoK7uzuPHj0C4Nq1a3Tp0oW6dety/PhxIiIiiImJyfMBR0KUtEJNd3n6MfBP+/PPP8v93N+AgADCwsKyddquX79OxYoVSyYoUaLatGnD9evXsbCwKOlQhBDileTp6ZnralwajYYlS5Ywbdo0evbsCTx5MnqVKlUICwujf//+7Nq1C319fVauXKk8qG7VqlU0bdqUuLg46tat+9JyESK/CtRJr1ixIiqVCpVKRb169bQ66pmZmSQnJzNy5MgiD7IssLW1LekQRAkxMDCQ778QQhST+Ph4bty4QZcuXZR9FhYWtGrVimPHjtG/f3/S0tIwMDDQepJ01upehw8flk66KJUK1ElfsmQJGo2G9957j8DAQK2RQQMDAxwcHGjdunWRB/myRUREMHv2bM6cOYOuri6tW7dm6dKl1KlTB4ArV67g5+fHnj17SEtLw8nJiZUrVxIbG6tM98n6ABMSEoKvry8qlYodO3bQq1cv2rRpQ7t27QgODlbavHXrFnZ2duzfv5/27duTlpbG1KlT+eabb7h//z6NGzcmODgYNze3fOcRFhaGn58fly9fpkOHDqxbt44aNWoA4Ovry/3797Wm4IwdO5bo6GiioqLYsGED48aN49q1axgaGiplevXqhZmZGRs3bsy13fPnz1O/fn1iY2Np0KCBsn/x4sWsWLGCixcvAvDLL7/g5+enXIEZMmQIs2fPRk8v5x/Lp9/DLJaWlixZsgRfX18SEhKoVasW3377LcuXL+fkyZM0btyYzZs38+DBA0aNGsXZs2dp164dGzZswMbGRqln3bp1LFy4kPj4eBwcHBgzZgwffvhhvt/rs2fP8uGHH/L7779Tt25dVq5cSYcOHYAn0106duzIvXv3lGlIa9euZebMmdy5cwd3d3fatWvHzJkzCzwlplXQfjL0TAp0zqvCUFfD/NehccAe0jKzX7krC8pDjlA+8pQci07CvDcLVP7GjRtA9qWDq1Spohzr1KkT48eP5/PPP+eTTz4hJSWFyZMnA0+udAtRGhWokz5kyBAAatWqRZs2bUrdo1aLSkpKCuPHj6dp06YkJyfj7+9P7969iY6OJjU1lQ4dOlCtWjV27tyJra0tv//+O2q1mnfeeYczZ84QERHBvn37AHKc4uDj48P8+fOZN2+e0pn/9ttvsbOzo127dgCMHj2av//+m61bt2JnZ8eOHTvw8PDg9OnTODo6PjeH1NRU5syZw4YNGzAwMODDDz+kf//+HDlyJF/vwdtvv82YMWPYuXMnb7/9NgA3b95k9+7d7N27N89z69WrR8uWLdm8eTOzZs1S9m/evJmBAwcCcPXqVby8vPD19WXDhg2cPXuWESNGUKFCBQICAvIVY25mzJjBkiVLqFmzJu+99x4DBw7EzMyMpUuXYmxsTL9+/fD39+fLL79U4vL392fFihW4uLjwxx9/MGLECExMTJSf+efx8/NjyZIlNGzYkEWLFuHt7U18fDzW1tbZyh45coSRI0cSHBxMjx492LdvH9OnT8+z/rS0NNLS0pTtpKQkAAx1NOjqavL71rxSDHU0Wv+WReUhRygfeUqORSe353c8LSMjQymXkZGhnPf0uWq1GpVKRXp6OvXq1eOrr75i4sSJTJkyBV1dXUaPHk2VKlXQaDTKec/+WxZJjiWrIDEVak561gghwKNHj3j8+LHWcXNz88JUW2r07dtXa/vrr7/GxsaGv//+m6NHj3Lr1i1OnDihzL9/+jKZqakpenp6eU5v6NevH2PHjuXw4cNKp3zLli0MGDAAlUpFYmIiISEhJCYmYmdnB8CECROIiIggJCQkX08kTU9PZ8WKFbRq1QqA9evX4+TkxG+//cbrr7/+3PONjIwYOHAgISEhSid906ZN1KxZM1+j+T4+PqxYsULppJ8/f55Tp06xadMmAL744gtq1KjBihUrUKlUNGjQgGvXrjFp0iT8/f21LkkW1IQJE3B3dwfgk08+YcCAAezfv1950NawYcMIDQ1Vys+YMYOFCxfSp08f4MmH0L///pvVq1fnu5M+evRo5efmyy+/JCIiQvmD8Kzly5fj6enJhAkTgCcfao4ePcquXbtyrT8oKCjHm7KnuagxNs7MV4yvqlkty/6Sr+UhRygfeUqOLy48PPy5ZU6dOqUMFGaNlm/bto3atWsrZc6ePUutWrWU+iwsLFi9ejX379/H0NAQlUrFkiVLuH//frY2IyMjiyqdUktyLBk5rY6Ym0J10lNTU5k4cSLfffcdd+7cyXY8M/PV7jRcuHABf39/jh8/zu3bt5V14RMTE4mOjsbFxeWFbpC1sbGhW7dubN68mXbt2hEfH8+xY8dYvXo1AKdPnyYzM5N69eppnZeWlpbjyGxO9PT0eO2115TtBg0aYGlpSWxsbL466QAjRozgtdde4+rVq1SrVo3Q0FBl6s7z9O/fnwkTJvDrr7/yxhtvsHnzZpo3b65Mf4mNjaV169ZadbVt25bk5GSuXLlCzZo18xVjTpo2bap8nXX5s0mTJlr7bt68CTy5anLx4kWGDRvGiBEjlDIZGRkFutHz6Wleenp6tGzZktjY2BzLnjt3jt69e2vte/311/PspE+ZMoXx48cr20lJSdSoUYOOHTvm+2fiVZOenk5kZCRdu3Yts1ftykOOUD7ylBxfrhYtWuDl5QU8uXE0ICCA9PR0ZV9SUhJxcXFMnjxZ2fes0NBQKlSogJ+fnzIVsTTlWFwkx5KVdSU8PwrVSffz8+PAgQN8+eWXDBo0iJUrV3L16lVWr17NvHnzClNlqeLt7Y29vT1r167Fzs4OtVpN48aNefz4cZE9Rt7Hx4cxY8awfPlytmzZQpMmTZSOZHJyMrq6upw6dQpdXV2t80xNTYukfR0dHTQa7UuWz16CcXFxwdnZmQ0bNtCtWzdiYmLYvXt3vuq3tbWlU6dObNmyhTfeeIMtW7YwatSoF4pZpVI9N2ZA6z9k1oeAZ/dlffDKWkp07dq1ylWHLM++9yXJ0NBQ696ALPr6+qXuF1BRkxzLjvKQp+RYPJKTk4mLi1O2L1++TExMDFZWVtSsWZOxY8cSFBREgwYNqFWrFtOnT8fOzo633npLiXXFihW0adMGU1NTIiMj8fPzY968eVr3J2WR72PZUBpzLEg8hZpT8OOPP/LFF1/Qt29f9PT0aNeuHdOmTWPu3Lls3ry5MFWWGnfu3OHcuXNMmzaNzp074+TkxL1795TjTZs2JTo6mrt37+Z4voGBQb6uJPTs2ZNHjx4RERHBli1b8PHxUY65uLiQmZnJzZs3qVu3rtYrv6uEZGRkcPLkSWX73Llz3L9/HycnJ+DJaP6zN8vktNb38OHDCQ0NJSQkhC5duig3nuaHj48P3377LceOHePSpUv0799fOebk5MSxY8e0Ot1HjhzBzMyM6tWr51jfszFfuHChQJeNclKlShXs7Oy4dOlStve6Vq1a+a7n119/Vb7OyMjg1KlTynv9rPr163PixAmtfc9uCyGE+J+TJ0/i4uKCi4sLAOPHj8fFxQV/f38AJk6cyMcff8z777/Pa6+9RnJyMhEREVSoUEGp47fffqNr1640adKENWvWsHr1asaMGVMi+QiRH4XqpN+9e1eZ92Vubq50WF1dXTl48GDRRVcCKlasiLW1NWvWrCEuLo6ff/5Za5rBgAEDsLW1pVevXhw5coRLly6xbds2jh07BoCDgwPx8fFER0dz+/ZtrZv9nmZiYkKvXr2YPn06sbGxDBgwQDlWr149fHx8GDx4MNu3byc+Pp7ffvuNoKCgfI9k6+vr8/HHH3P8+HFOnTqFr68vb7zxhjLVpVOnTpw8eZINGzZw4cIFZsyYwZkzZ7LVM3DgQK5cucLatWt577338v0+AvTp04eHDx8yatQoOnbsqMyvB/jwww+5fPkyH3/8MWfPnuWHH35gxowZjB8/Ptf56J06dWLFihX88ccfnDx5kpEjRxbJJ+TAwECCgoJYtmwZ58+f5/Tp04SEhLBo0aJ817Fy5Up27NjB2bNn+eijj7h3716u79fHH39MeHg4ixYt4sKFC6xevZqffvopX9OIhBCiPHJzc0Oj0WR7Zd1fpFKpmDlzJjdu3ODRo0fs27cv25TRDRs2cOfOHdLS0vjzzz8ZNGhQCWQiRP4VqpNeu3Zt4uPjgSdznb/77jvgyQj7q/6kSx0dHbZu3cqpU6do3Lgx48aN4/PPP1eOGxgYsHfvXipXroyXlxdNmjRh3rx5ytSIvn374uHhQceOHbGxseGbb77JtS0fHx/+/PNP2rVrl20OdkhICIMHD+bTTz+lfv369OrVixMnTuR7rraxsTGTJk1i4MCBtG3bFlNTU7799lvluLu7O9OnT2fixIm89tprPHz4kMGDB2erx8LCgr59+2Jqaqq19GF+mJmZ4e3tzZ9//ql1pQCgWrVqhIeH89tvv+Hs7MzIkSMZNmwY06ZNy7W+hQsXUqNGDdq1a8fAgQOZMGECxsbGBYopJ8OHD2fdunWEhITQpEkTOnToQGhoaIFG0ufNm8e8efNwdnbm8OHD7Ny5k0qVKuVYtm3btqxatYpFixbh7OxMREQE48aN0xrxEUIIIUT5ptI8O8k3HxYvXoyuri5jxoxh3759eHt7K0sYLVq0iE8++aQ4YhUlpHPnzjRq1Ihly5aVdChl1ogRIzh79iyHDh3KV/mkpCQsLCy4fft2mb5xNDw8HC8vr1I3p7ColIccoXzkKTmWDZJj2VCac8z6+/3gwYPnroZYqBtHx40bp3zdpUsXzp49y6lTp6hbt67Wyhri1Xbv3j2ioqKIioriiy++KOlwypQFCxbQtWtXTExM+Omnn1i/fr28x0IIIYRQFH4x6v/v0aNH2Nvb06dPH+mgvySenp6Ymprm+MrPGur55eLigq+vL8HBwdSvX1/rWKNGjXKN4VW/efhpc+fOzTVPT0/PQtf79A1Mq1atYtmyZQwfPrwIIxdCCCHEq6xQI+mZmZnMnTuXVatW8e+//3L+/Hlq167N9OnTcXBwYNiwYUUdp3jKunXr+O+//3I89iLrtz8rISEh12Ph4eG5PjXr2Uczv8pGjhxJv379cjz2IstxZt3HIYQQQgiRk0J10ufMmcP69euZP3++1gNgGjduzJIlS6STXsyqVatW0iFgb29f0iG8FFZWVkX6wUcIIYQQIj8KNd1lw4YNrFmzBh8fH60Hvjg7O3P27NkiC04IIYQQQojyqFCd9KtXr1K3bt1s+9Vqda5TIIS2gIAAmjVrpmz7+voWeIlDUTo8+70UQghRtA4ePIi3tzd2dnaoVCrCwsK0jms0Gvz9/alatSpGRkZ06dKFCxcuaJX5/fff6dq1K5aWllhbW/P+++8rT50WojQqVCe9YcOGOS4V9/333ytPAxOiNHBwcGDJkiVFVl9OfxwmTJjA/v37i6wNIYQQ2lJSUnB2dmblypU5Hp8/fz7Lli1j1apVHD9+HBMTE9zd3Xn06BEA165do0uXLtStW5fjx48TERFBTEwMvr6+LzELIQqmUHPS/f39GTJkCFevXkWtVrN9+3bOnTvHhg0b2LVrV1HHKESxyszMRKVS5fqk0+fJWu1FCCFE8fD09Mx1RS2NRsOSJUuYNm0aPXv2BJ5My61SpQphYWH079+fXbt2oa+vz8qVK5Xf9atWraJp06bExcXlODtAiJJWoF7JpUuX0Gg09OzZkx9//JF9+/ZhYmKCv78/sbGx/Pjjj3Tt2rW4Yi1W33//PU2aNMHIyAhra2u6dOlCSkqKMg1l7ty5VKlSBUtLS2bOnElGRgZ+fn5YWVlRvXp1QkJCtOqbNGkS9erVw9jYWFn5piBTgdRqNfPnz6du3boYGhpSs2ZN5syZk+/6s6ZgrF69mho1amBsbEy/fv148OBBvmP4+uuvadSoEYaGhlStWpXRo0crxxITE+nZsyempqaYm5vTr18//v3332ztb9y4EQcHBywsLOjfvz8PHz7Md46XL1+mX79+WFpaYmVlRc+ePbVWnMn63ixYsICqVatibW3NRx99pLwPbm5u/PPPP4wbNw6VSoVKpQIgNDQUS0tLdu7cScOGDTE0NCQxMZETJ07QtWtXKlWqhIWFBR06dOD3339X2nNwcACgd+/eqFQqZfvZ6S5qtZqZM2dSvXp1DA0NadasGREREcrxhIQEVCoV27dvp2PHjhgbG+Ps7MyxY8fy/b0RQgjxRHx8PDdu3KBLly7KPgsLC1q1aqX8Xk1LS8PAwEBrMCZrha7Dhw+/3ICFyKcCjaQ7Ojpy/fp1KleuTLt27bCysuL06dOv/JJ7169fZ8CAAcyfP5/evXvz8OFDDh06RNbDWH/++WeqV6/OwYMHOXLkCMOGDePo0aO0b9+e48eP8+233/LBBx/QtWtXqlevDoCZmRmhof+vvTsPr+F8Hz/+PtkXSUhEFiRSIrFGrLVVVFRstZZqWksRW0rs1NLYGpSP2IpSSau2togW1cYSKva11khSREsERUSILPP7wy/zdSQiIZws9+u6zsXMPPPMfZ/DyZ1nnpkJxdHRkdOnT9O/f38sLCwYM2ZMrmIaP348y5cvZ968eTRp0oTr169rXZSbm/5jYmL48ccf+fXXX0lMTKRv374MHjw4V/cxX7JkCSNGjGDmzJm0bt2ae/fuERkZCTwpQjML9D179pCWlsaQIUPo3r07ERERah+xsbGEhYWxZcsW7ty5Q7du3Zg5c6ZaiOeUY2pqKq1ataJhw4b8+eefGBgYMH36dHx8fPjrr78wMjICYPfu3Tg4OLB7925iYmLo3r07tWrVon///mzcuBEPDw/8/Py07kIEkJyczKxZs1ixYgU2NjaUKVOGv//+m169erFw4UIURWHu3Lm0adOG6OhoLCwsOHLkCGXKlCEkJAQfHx+ti6afNn/+fObOncuyZcvw9PRk5cqVvP/++5w9exZXV1e13YQJE5gzZw6urq5MmDCBHj16EBMTg4FB1v+WKSkppKSkqMuJiYkAvDNrB2mG5i/8PAsjYz2FaXWhztTtpGRodB3Oa1EccoTikafkmH/OBLZ6YZu0tDR1QOaff/4BntyN6+nBKltbW65du0ZqaipNmzZVf6Z99tlnPHjwQP15+c8//6j7PftnUSQ56lZeYtIomZVoLujp6REfH0+ZMmUAsLS05OTJk7z11lt5j7IAOX78OHXq1OHy5ctZbi3Yu3dvIiIi+Pvvv9XfwN3d3SlTpgx79+4FnkyXsLKyYsWKFXz44YfZHmPOnDmsW7eOo0ePAk9GX8PCwjh58qR6nLt37xIWFsb9+/extbVl0aJFuX7ATXb9T58+nStXrqi3bNy+fTtt27bl33//xd7ePsf+ypYtS58+fZg+fXqWbeHh4bRu3ZpLly5Rvnx5AM6dO0e1atU4fPgw9erVIzAwkK+++or4+HgsLCwAGDNmDHv37uXgwYMvzPGHH35g+vTpnD9/Xh0Bf/z4MSVLliQsLIz33ntP/WxiY2PVgrlbt27o6emxbt064Mnod0BAAAEBAWrfoaGh9OnTh5MnT+Lh4fHc9yAjI4OSJUuyZs0a2rVrBzyZk75p0yati3yf/SzLli3LkCFD+Pzzz9U29evXp169eixevJjLly/j4uLCihUr1NuVZr5/58+fx93dPUssgYGBTJkyJcv6NWvWYGZm9twchBCiqOnYsSPjxo3j7bffBuDChQuMGzeOlStXat0yd/bs2Wg0GkaPHg3Anj17CAkJITExET09Pdq1a0dERATvv/8+nTt31kkuovhJTk7mo48+4t69e1haWubY9qXmpGfKQ31foHl4eNCiRQtq1KhBq1ateO+99+jatSulSpUCnjxd8+lTZHZ2dlSvXl1d1tfXx8bGhoSEBHXd+vXrWbBgAbGxsSQlJZGWlvbCDyPT+fPnSUlJoUWLFs9tk5v+nZyctO6p3rBhQzIyMoiKisqxSE9ISODatWvPPf758+cpX768WqDDk4uJS5Ysyfnz56lXrx7wpEDOLNABHBwc1PfoRTmeOnWKmJgYrf3hyRNuY2Nj1eVq1appjWg7ODhw+vTp5+aWycjIKMsTcm/cuMHEiROJiIggISGB9PR0kpOTiYuLe2F/mRITE7l27RqNGzfWWt+4cWNOnTqlte7p4zs4OABP3vvsivTx48czYsQIreOUL1+e6Sf0SDPMfkS/sHsyapfBpKN6RXxksmjnCMUjT8kx/+RmJL1OnTq0adMGeDJwNm7cOKpXr6419XDu3Ll4eHio7dq0acOsWbO4ceMG5ubmaDQabGxs8PHxUdukpqYSHh5Oy5YtMTQ0zP/kCgDJUbcyz4TnRp6K9Kfn9T69rrDT19cnPDyc/fv388cff7Bw4UImTJjAoUOHALJ8wBqNJtt1GRkZABw4cABfX1+mTJlCq1atsLKyYt26dcydOzdX8bzoSZav2v+rHj+3cnqPXnSMpKQk6tSpk+3UHFtb21wdIyempqZZ/u326tWL27dvM3/+fJydnTE2NqZhw4Y8fvz4hf29jKdjz4zlebEbGxtjbGycZf3esd7Y2Ni8lvh0LTU1lW3btnFssk+B+5LNL8UhRygeeUqOb5aBgYEaQ+XKlbG3t2fv3r3qIFFiYiKHDx9m8ODBWWLNnJa6cuVKTExMaN26dZY2hoaGOs/xdZMcdSMv8eSpSFcUhd69e6vFwqNHjxg4cCDm5tpzYjdu3JiXbgsEjUZD48aNady4MZMnT8bZ2ZlNmza9VF/79+/H2dmZCRMmqOuuXLmS6/1dXV0xNTVl586d2U4FyW3/cXFxXLt2DUdHRwAOHjyInp4ebm5uOR7fwsKCChUqsHPnTpo3b55le5UqVbh69SpXr17Vmu5y9+5dqlatmi851q5dm/Xr11OmTJlcn4HIjpGREenp6blqGxkZyddff62OqFy9epVbt25ptTE0NMyxP0tLSxwdHYmMjKRZs2ZafdevX/8lMhBCCJGUlERMTIy6fOnSJU6ePIm1tTVOTk4EBAQwffp0XF1dcXFxYdKkSTg6OmpNTVy0aBGNGjWiRIkShIeHM3r0aGbOnEnJkiXffEJC5EKeivRevXppLX/88cf5GoyuHDp0iJ07d/Lee+9RpkwZDh06xM2bN6lSpQp//fVXnvtzdXUlLi6OdevWUa9ePbZu3Zqngt/ExISxY8cyZswYjIyMaNy4MTdv3uTs2bP07ds31/2bmJjQq1cv5syZQ2JiIkOHDqVbt24vnI8OT+ZADxw4kDJlytC6dWvu379PZGQkn332Gd7e3tSoUQNfX1+Cg4NJS0tj8ODBNGvWjLp16+ZLjr6+vnz11Vd06NBBvVPKlStX2LhxI2PGjFFHQl6kQoUK7N27lw8//BBjY2NKly793Laurq6sWrWKunXrkpiYyOjRo7OM+Gf+8tK4cWOMjY3VKVFPGz16NF988QUVK1akVq1ahISEcPLkyVxdsCuEECKro0ePag0aZU7/69WrF6GhoYwZM4YHDx7g5+fH3bt3adKkCdu3b8fExETd5/Dhw3zxxRckJSXh7u7OsmXL+OSTT954LkLkVp6K9GdvM1hUWFpasnfvXoKDg0lMTMTZ2Zm5c+fSunVr1q9fn+f+3n//fYYPH46/vz8pKSm0bduWSZMmERgYmOs+Jk2ahIGBAZMnT+batWs4ODgwcODAPPVfqVIlOnfuTJs2bfjvv/9o164dX3/9da6O36tXLx49esS8efMYNWoUpUuXpmvXrsCTsw6bN2/ms88+45133kFPTw8fHx8WLlyY6/xelKOZmRl79+5l7NixdO7cmfv371O2bFlatGiRp5H1qVOnMmDAACpWrEhKSkqO11F8++23+Pn5Ubt2bcqXL8+XX37JqFGjtNrMnTuXESNGsHz5csqWLat1S8hMQ4cO5d69e4wcOZKEhASqVq3KL7/8onVnFyGEELnn5eWV4/e3RqNh6tSpTJ069bltvv/++9cRmhCvTZ7u7iIKj2fvOCKKlsTERKysrLh161aRn5Pepk2bAjenML8UhxyheOQpORYNkmPRUJBzzPz5nZu7u7zcIxaFEEIIIYQQr40U6cVU5qPss3v9+eefug5PCCGEEKJYe6X7pIuCKzAwMMc58DlNg3n63upCCCGEEOLNkyK9mKpUqZKuQxBCCCGEEM8h012EEEIIIYQoYKRIF0IIIUSBsHfvXtq3b4+joyMajYawsDCt7YqiMHnyZBwcHDA1NcXb25vo6Gh1e0REhPp09GdfR44cecPZCPFqpEgXOlehQgWCg4N1HcYbk/lD5O7du7oORQghCpQHDx7g4eHB4sWLs90+e/ZsFixYwNKlSzl06BDm5ua0atWKR48eAdCoUSOuX7+u9erXrx8uLi65ftieEAWFFOki312+fBmNRvPG79FeEIt9Ly8vAgICdB2GEEIUCq1bt2b69Ol06tQpyzZFUQgODmbixIl06NCBmjVr8v3333Pt2jV1xN3IyAh7e3v1ZWNjw+bNm+nTpw8ajeYNZyPEq5EiXejM48eP3/gx09PTycjIeOPHFUII8WouXbpEfHw83t7e6jorKysaNGjAgQMHst3nl19+4fbt2/Tp0+dNhSlEvpG7u4iXlpGRwZw5c/jmm2+4evUqdnZ2DBgwgIkTJwLg6ekJQLNmzYiIiKB3797cvXuXevXqsXjxYoyNjbl06VKuj6coClOmTGHlypXcuHEDGxsbunbtyoIFC/Dy8uLKlSsMHz6c4cOHq+1DQ0MJCAjg+++/Z9y4cVy8eJGYmBgcHByYMGECa9eu5e7du1SvXp1Zs2bh5eUFoO63fv16AgICuHr1Kk2aNCEkJAQHBwcA0tLSGDFiBN9//z36+vr069eP+Ph47t27R1hYGL1792bPnj3s2bOH+fPnA2jle+zYMcaOHcu5c+eoVasWISEhuLm55ekzaBC0kzQD8zztU1gY6yvMrg/VA38nJb1ojoAVhxyheOQpOb6cyzPb5rptfHw8AHZ2dlrr7ezs1G3P+vbbb2nVqhXlypV7+SCF0BEp0sVLGz9+PMuXL2fevHk0adKE69evc+HCBQ4fPkz9+vXZsWMH1apVw8jISN1n586dWFpaEh4enufjbdiwgXnz5rFu3TqqVatGfHw8p06dAmDjxo14eHjg5+dH//79tfZLTk5m1qxZrFixAhsbG8qUKYO/vz/nzp1j3bp1ODo6smnTJnx8fDh9+jSurq7qfnPmzGHVqlXo6enx8ccfM2rUKFavXg3ArFmzWL16NSEhIVSpUoX58+cTFhZG8+bNAZg/fz4XL16kevXqTJ06FQBbW1suX74MwIQJE5g7dy62trYMHDiQTz/9lMjIyGxzT0lJISUlRV1OTEwEwFhPQV9fyfN7WRgY6ylafxZFxSFHKB55So4vJzU1NcftaWlpapu0tDR1n6f3y8jIQKPRZOnrn3/+4ffff2fNmjUvPM6z8eS2fWEkOepWXmKSIl28lPv37zN//nwWLVpEr169AKhYsSJNmjRRi1AbGxvs7e219jM3N2fFihVahXtuxcXFYW9vj7e3N4aGhjg5OVG/fn0ArK2t0dfXx8LCIssxU1NT+frrr/Hw8FD7CQkJIS4uDkdHRwBGjRrF9u3bCQkJ4csvv1T3W7p0KRUrVgTA399fLbYBFi5cyPjx49W5k4sWLWLbtm3qdisrK4yMjDAzM8sSE8CMGTNo1qwZAOPGjaNt27Y8evQIExOTLG2DgoKYMmVKlvUTPTMwM0vP5TtYOE2rW/SnJxWHHKF45Ck55s3T35nZOXbsGIaGhsD/jaRv2LCBt956S21z4cIFXFxcsvS1fv16LCwsMDAweOFxnvUyA0mFjeSoG8nJybluK0W6eCnnz58nJSWFFi1a5Gm/GjVqvFSBDvDBBx8QHBzMW2+9hY+PD23atKF9+/YYGOT8z9jIyIiaNWuqy6dPnyY9PZ3KlStrtUtJScHGxkZdNjMzUwt0AAcHBxISEgC4d+8eN27cUH9JANDX16dOnTq5nvP+dEyZU2gSEhJwcnLK0nb8+PGMGDFCXU5MTKR8+fJMP6FHmqF+ro5X2BjrKUyrm8Gko3qkZBTR6QPFIEcoHnlKji/nTGCrHLfXqVOHNm3aAE+mMAYGBpKamqquS0xMJCYmhnHjxqnrMtsOHz6cTz/9lPfffz/X8aSmphIeHk7Lli3VXw6KGslRtzLPhOeGFOnipZiamr7UfubmLz9/unz58kRFRbFjxw7Cw8MZPHgwX331FXv27MnxP6GpqanWVf1JSUno6+tz7Ngx9PW1C9wSJUqof3+2T41Gg6Lk32nep/vPjO95Bb6xsTHGxsZZ1u8d6631i0VRkpqayrZt2zg22afAfcnml+KQIxSPPCXH/JGUlERMTIy6fPXqVc6ePYu1tTVOTk4EBAQQFBSEu7s7Li4uTJo0CUdHR7p27aoV086dO7l06RJ+fn4vFauhoWGR/RwzSY66kZd45O4u4qW4urpiamrKzp07s2zLHClPT8//aRimpqa0b9+eBQsWEBERwYEDBzh9+rR63Nwc09PTk/T0dBISEqhUqZLWK7tpKdmxsrLCzs5O6+EY6enpHD9+XKtdbmMSQggBR48exdPTU73xwIgRI/D09GTy5MkAjBkzhs8++ww/Pz/q1atHUlIS27dvzzJN8Ntvv6VRo0a4u7u/8RyEyC8yki5eiomJCWPHjmXMmDEYGRnRuHFjbt68ydmzZ+nVqxempqZs376dcuXKYWJigpWV1SsfMzQ0lPT0dBo0aICZmRk//PADpqamODs7A0/uk753714+/PBDjI2NKV26dLb9VK5cGV9fX3r27MncuXPx9PTk5s2b7Ny5k5o1a9K2be7uNvDZZ58RFBREpUqVcHd3Z+HChdy5c0dr1L5ChQocOnSIy5cvU6JECaytrV/5fRBCiKLKy8srxzOWGo2GqVOnal0flJ01a9bkd2hCvHEyki5e2qRJkxg5ciSTJ0+mSpUqdO/enYSEBAwMDFiwYAHLli3D0dGRDh065MvxSpYsyfLly2ncuDE1a9Zkx44d/Prrr+p0j6lTp3L58mUqVqyIra1tjn2FhITQs2dPRo4ciZubGx07duTIkSPZzgd/nrFjx9KjRw969uxJw4YNKVGiBK1atdIa0Rk1ahT6+vpUrVoVW1tb4uLiXi55IYQQQhQrGiU/J9kKUYxlZGRQpUoVunXrxrRp017rsRITE7GysuLWrVtFfk56mzZtCtycwvxSHHKE4pGn5Fg0SI5FQ0HOMfPn971797C0tMyxrUx3EeIlXblyhT/++INmzZqRkpLCokWLuHTpEh999JGuQxNCCCFEISfTXUSBsXr1akqUKJHtq1q1aroOLws9PT1CQ0OpV68ejRs35vTp0+zYsYMqVaroOjQhhBBCFHIyki4KjPfff58GDRpku62gna6CJ7eEfN4TQoUQQgghXoUU6aLAsLCwwMLCQtdhCCGEEELonEx3EUIIIYQQooCRIl0IIYQQ+Wrv3r20b98eR0dHNBoNYWFhWtsVRWHy5Mk4ODhgamqKt7c30dHR6vbLly/Tt29fXFxcMDU1pWLFinzxxRc8fvz4DWcihO5IkS4ET34gaDQaTp48+cp9bdy4kffeew8bG5sX9qkoCq1bt872h5gQQhRWDx48wMPDg8WLF2e7ffbs2SxYsIClS5dy6NAhzM3NadWqFY8ePQLgwoULZGRksGzZMs6ePcu8efNYunQpn3/++ZtMQwidkjnpQuTB48ePMTIyyrHNgwcPaNKkCd26daN///45tg0ODtZ6QqkQQhQFrVu3pnXr1tluUxSF4OBgJk6cqD7s7vvvv8fOzo6wsDA+/PBDfHx88PHxUfd56623iIqKYsmSJcyZM+eN5CCErslIuig2tm/fTpMmTShZsiQ2Nja0a9eO2NhYAFxcXADw9PREo9Hg5eUFQO/evenYsSMzZszA0dERNze3Fx7nk08+YfLkyXh7e+fY7uTJk8ydO5eVK1e+WmJCCFGIXLp0ifj4eK3vSCsrKxo0aMCBAweeu9+9e/ewtrZ+EyEKUSDISLooNh48eMCIESOoWbMmSUlJTJ48mU6dOnHy5EkOHz5M/fr12bFjB9WqVdMaLd+5cyeWlpaEh4fnWyzJycl89NFHLF68GHt7+5fup0HQTtIMzPMtroLEWF9hdn2oHvg7KelF82xDccgRikeexTnHyzPb5qmf+Ph4AOzs7LTW29nZqdueFRMTw8KFC2UUXRQrUqSLYqNLly5ayytXrsTW1pZz585ha2sLgI2NTZai2dzcnBUrVrxwmkteDB8+nEaNGqmnel8kJSWFlJQUdTkxMREAYz0FfX0l3+IqSIz1FK0/i6LikCMUjzyLc46pqakv3DctLU1tl5aWpu739L4ZGRloNJos/f3777/4+PjQpUsXevfunavjvazMvl/nMXRNctStvMQkRbooNqKjo5k8eTKHDh3i1q1bZGRkABAXF0fVqlWfu1+NGjXytUD/5Zdf2LVrFydOnMj1PkFBQUyZMiXL+omeGZiZpedbbAXRtLoZug7htSsOOULxyLM45rht27YX7nPs2DH1oXSZo+UbNmzgrbfeUttcuHABFxcXrf7+++8/Jk6cSOXKlWnfvn2ujpUf8vPMaUElOepGcnJyrttKkS6Kjfbt2+Ps7Mzy5ctxdHQkIyOD6tWrv/CWXubm+TudZNeuXcTGxlKyZEmt9V26dKFp06ZERERk2Wf8+PGMGDFCXU5MTKR8+fI0b94cGxubfI2voEhNTSU8PJyWLVsWyCfO5ofikCMUjzwlx5zVqVOHNm3aAE8uHA0MDCQ1NVVdl5iYSExMDOPGjVPX/fvvv7Rs2ZImTZrw3Xffoa+vn78JZUM+x6KhIOeYeSY8N6RIF8XC7du3iYqKYvny5TRt2hSAffv2qdszR8rT01//qPS4cePo16+f1roaNWowb9482rdvn+0+xsbGGBsbZ1lvaGhY4L6A8pvkWHQUhzwlxyeSkpKIiYlRl69evcrZs2extrbGycmJgIAAgoKCcHd3x8XFhUmTJuHo6EjXrl0xNDRUC3RnZ2f+97//cffuXbWvV7mOJ7fkcywaCmKOeYlHinRRLJQqVQobGxu++eYbHBwciIuLY9y4cer2MmXKYGpqyvbt2ylXrhwmJiZYWVm91LH+++8/4uLiuHbtGgBRUVHAkx8sT7+e5eTkpN5lRgghCrOjR4/SvHlzdTnzTGCvXr0IDQ1lzJgxPHjwAD8/P+7evUuTJk3Yvn07JiYmwJNpCjExMcTExFCuXDmtvhWl6M77F+JpcgtGUSzo6emxbt06jh07RvXq1Rk+fDhfffWVut3AwIAFCxawbNkyHB0dc31BZ3Z++eUXPD09adv2yR0PPvzwQzw9PVm6dOkr5yGEEIWBl5cXiqJkeYWGhgKg0WiYOnUq8fHxPHr0iB07dlC5cmV1/969e2e7vxToojiRkXRRbHh7e3Pu3DmtdU9/4ffr1y/LNJTMHyh50bt3b3r37p2nfeQHjxBCCCGeJiPpQgghhBBCFDBSpAuRB3/++SclSpR47ksIIYQQIj/IdBch8qBu3bqcPHlS12EIIYQQooiTIl2IPDA1NaVSpUq6DkMIIYQQRZxMdxFCCCGEEKKAkSJdCCGEEK9s7969tG/fHkdHRzQaDWFhYVrbFUVh8uTJODg4YGpqire3N9HR0VptZsyYQaNGjTAzM8vyVGYhihsp0kWBdPnyZTQaTZ7mf4eGhsqXuhBC6MiDBw/w8PBg8eLF2W6fPXs2CxYsYOnSpRw6dAhzc3NatWrFo0eP1DaPHz/mgw8+YNCgQW8qbCEKLCnShciDR48eMWTIEGxsbChRogRdunThxo0bWm2GDh1KnTp1MDY2platWln6iIqKonnz5tjZ2WFiYsJbb73FxIkTSU1NfUNZCCFE/mvdujXTp0+nU6dOWbYpikJwcDATJ06kQ4cO1KxZk++//55r165pjbhPmTKF4cOHU6NGjTcYuRAFkxTpQuTB8OHD+fXXX/npp5/Ys2cP165do3Pnzlnaffrpp3Tv3j3bPgwNDenZsyd//PEHUVFRBAcHs3z5cr744ovXHb4QQujEpUuXiI+Px9vbW11nZWVFgwYNOHDggA4jE6Lgkru7CJ3Zvn0706dP58yZM+jr69OwYUPmz59PxYoVs7SNiIigefPmbNmyhfHjx3Px4kVq1arFihUrqF69ulbb33//nYCAAK5evUqTJk0ICQnBwcEBgCNHjvD5559z4sQJUlNTqVWrFvPmzaN27dovjPfevXt8++23rFmzhnfffReAkJAQqlSpwsGDB3n77bcBWLBgAQA3b97kr7/+ytLPW2+9xVtvvaUuOzs7ExERwZ9//pnLd+7/NAjaSZqBeZ73KwyM9RVm14fqgb+Tkq7RdTivRXHIEYpHnsUxx8sz2+Z63/j4eADs7Oy01tvZ2anbhBDapEgXOvPgwQNGjBhBzZo1SUpKYvLkyXTq1CnHeeijR49m/vz52Nvb8/nnn9O+fXsuXryIoaEhAMnJycyZM4dVq1ahp6fHxx9/zKhRo1i9ejUA9+/fp1evXixcuBBFUZg7dy5t2rQhOjoaCwuLHOM9duwYqampWiNB7u7uODk5ceDAAbVIz6uYmBi2b9+e7Yh8ppSUFFJSUtTlxMREAIz1FPT1lZc6bkFnrKdo/VkUFYccoXjkWRxzfNEUvbS0NLVNWlqaus/T+2VkZKDRaLL0lZ6enqtj5LfM4xXl6YeSo27lJSYp0oXOdOnSRWt55cqV2Nracu7cuec+vfOLL76gZcuWAHz33XeUK1eOTZs20a1bN+DJP/6lS5eqo/H+/v5MnTpV3T9zBDzTN998Q8mSJdmzZw/t2rXLMd74+HiMjIyyXJz6siNBjRo14vjx46SkpODn56cV57OCgoKYMmVKlvUTPTMwM0vP87ELk2l1M3QdwmtXHHKE4pFnccpx27ZtObY7duyYOoCS+R25YcMGrTOJFy5cwMXFJUtfp06dIjU19YXHeF3Cw8N1ctw3SXLUjeTk5Fy3lSJd6Ex0dDSTJ0/m0KFD3Lp1i4yMJ1/8cXFxVK1aNdt9GjZsqP7d2toaNzc3zp8/r64zMzPTmi7j4OBAQkKCunzjxg0mTpxIREQECQkJpKenk5ycTFxcXH6n90Lr16/n/v37nDp1itGjRzNnzhzGjBmTbdvx48czYsQIdTkxMZHy5csz/YQeaYb6byrkN8pYT2Fa3QwmHdUjJaOITh8oBjlC8cizOOZ4JrBVju3r1KlDmzZtgCcXjgYGBpKamqquS0xMJCYmhnHjxqnrMt26dQtDQ8Ms61+31NRUwsPDadmypfoLRlEjOepW5pnw3JAiXehM+/btcXZ2Zvny5Tg6OpKRkUH16tV5/PjxS/f57H9GjUaDovzf6edevXpx+/Zt5s+fj7OzM8bGxjRs2DBXx7S3t+fx48fcvXtXazT9xo0b2Nvb5znW8uXLA1C1alXS09Px8/Nj5MiR6OtnLbqNjY0xNjbOsn7vWG9sbGzyfOzCIHMU7dhknwL3JZtfikOOUDzylBwhKSmJmJgYdfnq1aucPXsWa2trnJycCAgIICgoCHd3d1xcXJg0aRKOjo507dpV7S8uLo7//vuPf//9l/T0dM6ePQtApUqVnnuG9XUwNDQssp9jJslRN/ISjxTpQidu375NVFQUy5cvp2nTpgDs27fvhfsdPHgQJycnAO7cucPFixepUqVKro8bGRnJ119/rY7OXL16lVu3buVq3zp16mBoaMjOnTvVqTpRUVHExcVpjfC/jIyMDFJTU8nIyMi2SBdCiILu6NGjNG/eXF3OPPvXq1cvQkNDGTNmDA8ePMDPz4+7d+/SpEkTtm/fjomJibrP5MmT+e6779RlT09PAHbv3o2Xl9ebSUSIAkKKdKETpUqVwsbGhm+++QYHBwfi4uIYN27cC/ebOnUqNjY22NnZMWHCBEqXLk3Hjh1zfVxXV1dWrVpF3bp1SUxMZPTo0ZiamuZqXysrK/r27cuIESOwtrbG0tKSzz77jIYNG2pdNBoTE0NSUhLx8fE8fPhQvRC2atWqGBkZsXr1agwNDalRowbGxsYcPXqU8ePH07179wL3G78QQuSWl5eX1pnLZ2k0GqZOnZrj9TehoaGEhoa+huiEKHykSBc6oaenx7p16xg6dCjVq1fHzc2NBQsWvHCkZObMmQwbNozo6Ghq1arFr7/+ipGRUa6P++233+Ln50ft2rUpX748X375JaNGjcr1/vPmzUNPT48uXbqQkpJCq1at+Prrr7Xa9OvXjz179qjLmSNBly5dokKFChgYGDBr1iwuXryIoig4Ozvj7+/P8OHDcx2HEEIIIYo2KdKFznh7e3Pu3DmtdU+PwmQ3ItOkSRPOnDmTbX+9e/emd+/eWus6duyo1Y+npydHjhzRatO1a9dcx2xiYsLixYuf+9hreHJP95x07979uQ86EkIIIYQAeeKoEEIIIYQQBY4U6UL8f6tXr6ZEiRLZvqpVq6br8IQQQghRjMh0F1EovOiCpPzw/vvv06BBg2y3yQWdQgghhHiTpEgX4v+zsLDAwsJC12EIIYQQQsh0FyGEEEIIIQoaKdKFEEIIkSf3798nICAAZ2dnTE1NadSokdads27cuEHv3r1xdHTEzMwMHx8foqOjdRixEIWPFOlCPEdoaCglS5ZUlwMDA6lVq9Yr9Xn58mU0Go36gCMhhCiM+vXrR3h4OKtWreL06dO89957eHt78++//6IoCh07duTvv/9m8+bNnDhxAmdnZ7y9vXnw4IGuQxei0JAiXRQI+VEAv26jRo1i586dr9RH+fLluX79OtWrVwee3FNdo9Fw9+7dfIhQCCFev4cPH7JhwwZmz57NO++8Q6VKlQgMDKRSpUosWbKE6OhoDh48yJIlS6hXrx5ubm4sWbKEhw8fsnbtWl2HL0ShIUW6ELlUokQJbGxsXqkPfX197O3tMTCQa7aFEIVTWloa6enpmJiYaK03NTVl3759pKSkAGht19PTw9jYmH379r3RWIUozKRSEPkmIyODOXPm8M0333D16lXs7OwYMGAAEyZMYOzYsWzatIl//vkHe3t7fH19mTx5MoaGhoSGhjJlyhQANBoNACEhIVmeHvq0y5cv4+LiwokTJ9QR+Lt371KqVCl2796Nl5cXERERNG/enC1btjB+/HguXrxIrVq1WLFihTqSnReBgYGEhYWpU1V69+7N3bt3qV+/PvPnzyclJYURI0bw+eefM378eL799lvMzMyYNm0affr0yRJ3yZIlad68OQClSpUCoFevXoSGhuY6pgZBO0kzMM9zLoWBsb7C7PpQPfB3UtI1ug7ntSgOOULxyLMo53h5ZlutZQsLCxo2bMi0adOoUqUKdnZ2rF27lgMHDlCpUiXc3d1xcnJi/PjxLFu2DHNzc+bNm8c///zD9evXdZSFEIWPFOki34wfP57ly5czb948mjRpwvXr17lw4QLw5Es9NDQUR0dHTp8+Tf/+/bGwsGDMmDF0796dM2fOsH37dnbs2AGAlZVVvsU1evRo5s+fj729PZ9//jnt27fn4sWL+XLv8127dlGuXDn27t1LZGQkffv2Zf/+/bzzzjscOnSI9evXM2DAAFq2bEm5cuW09i1fvjwbNmygS5cuREVFYWlpiampabbHSUlJUUenABITEwEw1lPQ13+994/XFWM9RevPoqg45AjFI8+inGNqamqWP1euXImfnx9ly5ZFX18fT09PunfvzvHjxwH48ccf8fPzw9raGn19fVq0aIGPjw+Koqj9FETP5loUSY66lZeYNMrrfkKMKBbu37+Pra0tixYtol+/fi9sP2fOHNatW8fRo0eBrKPUL5KXkfR169bRvXt3AP777z/KlStHaGgo3bp1y/EYoaGhBAQEqPPFsxtJj4iI4O+//0ZP78nMMXd3d8qUKcPevXsBSE9Px8rKihUrVvDhhx9miTszxjt37mhdpPqswMBA9WzD09asWYOZmVmu3jMhhMhvjx49Ijk5GWtra7766isePXrEpEmT1O0PHjwgLS0NKysrRo8eTaVKlRgwYIAOIxZCt5KTk/noo4+4d+8elpaWObaVkXSRL86fP09KSgotWrTIdvv69etZsGABsbGxJCUlkZaW9sJ/nPmlYcOG6t+tra1xc3Pj/Pnz+dJ3tWrV1AIdwM7OTmsqjb6+PjY2NiQkJLzSccaPH8+IESPU5cTERMqXL0/z5s1feZ58QZWamkp4eDgtW7Yssk98LQ45QvHIs7jneOfOHc6cOUNQUBBt2rTJsm90dDSxsbEEBwfTsmXLNxVynhX3z7GoKMg5Zp4Jzw0p0kW+eN40DYADBw7g6+vLlClTaNWqFVZWVqxbt465c+e+9PEyC+OnTwTp4rTWs//5NRpNtusyMjJe6TjGxsYYGxtne/yC9gWU3yTHoqM45Flccty1axeKouDm5kZMTAyjR4/G3d2dfv36YWhoyE8//YStrS1OTk6cPn2aYcOG0bFjx2wL+IKouHyOkuObl5d45O4uIl+4urpiamqa7S0K9+/fj7OzMxMmTKBu3bq4urpy5coVrTZGRkakp6fn+ni2trYAWhchPW+qzMGDB9W/37lzh4sXL1KlSpVcH+t1MjIyAshT7kIIoWv37t1jyJAhuLu707NnT5o0acLvv/+uFiDXr1/nk08+wd3dnaFDh/LJJ5/I7ReFyCMZSRf5wsTEhLFjxzJmzBiMjIxo3LgxN2/e5OzZs7i6uhIXF8e6deuoV68eW7duZdOmTVr7V6hQgUuXLnHy5EnKlSuHhYVFtiPHmUxNTXn77beZOXMmLi4uJCQkMHHixGzbTp06FRsbG+zs7JgwYQKlS5emY8eO+Zn+S3N2dkaj0bBlyxbatGmDqakpJUqU0HVYQgiRo27duuV4Xc/QoUMZOnToG4xIiKJHRtJFvpk0aRIjR45k8uTJVKlShe7du5OQkMD777/P8OHD8ff3p1atWuzfv1/rwiKALl264OPjQ/PmzbG1tc3ViMvKlStJS0ujTp06BAQEMH369GzbzZw5k2HDhlGnTh3i4+P59ddf1RFsXStbtixTpkxh3Lhx2NnZ4e/vr+uQhBBCCFEAyN1dRJGV2zunFEaJiYlYWVlx69atIn3h6LZt22jTpk2Bm1OYX4pDjlA88pQciwbJsWgoyDlm/vzOzd1dZCRdCCGEEEKIAkaKdFEgrV69mhIlSmT7qlatWr4co3Xr1s89xpdffpkvxxBCCCGEeBly4agokN5//30aNGiQ7bbcnrry8vIip9lcK1as4OHDh9lus7a2ztUxhBBCCCFeBynSRYFkYWGBhYXFaz1G2bJlX2v/QgghhBAvS6a7CCGEEEIIUcBIkS6KFI1GQ1hY2AvbXb58GY1G89wHIL1uvXv3LjD3ahdCiOe5f/8+AQEBODs7Y2lpydixYzl69Ki6XaPRZPv66quvdBi1EEWDFOlCCCGEyFa/fv0IDw9n1apVHD9+nFq1auHj48O///4LPHmy6NOvlStXotFo6NKli44jF6LwkznpQuSSoiikp6djYCD/bYQQRd/Dhw/ZsGEDmzdv5p133iE1NZUePXpw8eJFlixZwvTp07G3t9faZ/PmzTRv3py33npLR1ELUXTISLooML755hscHR3JyMjQWt+hQwc+/fRTAJYsWULFihUxMjLCzc2NVatWvdIxL1y4QKNGjTAxMaF69ers2bNH3RYREYFGo+G3336jTp06GBsbs2/fPjIyMggKCsLFxQVTU1M8PDz4+eef1f3S09Pp27evut3NzY358+fnGMeRI0ewtbVl1qxZr5SPEELkl7S0NNLT0zExMdFab2pqyr59+7K0v3HjBlu3bqVv375vKkQhijQZEhQFxgcffMBnn33G7t27adGiBQD//fcf27dvZ9u2bWzatIlhw4YRHByMt7c3W7ZsoU+fPpQrV47mzZu/1DFHjx5NcHAwVatW5X//+x/t27fn0qVLWk/xHDduHHPmzOGtt96iVKlSBAUF8cMPP7B06VJcXV3Zu3cvH3/8Mba2tjRr1oyMjAzKlSvHTz/9hI2NDfv378fPzw8HBwe6deuWJYZdu3bRuXNnZs+ejZ+fX7ZxpqSkkJKSoi4nJiYC8M6sHaQZmr9U7gWdsZ7CtLpQZ+p2UjI0ug7ntSgOOULxyLMo5HgmsJXWsomJCW+//TZTp06lUqVKWFtbExERwcGDB6lYsSKpqala7VeuXImFhQXt27fPsq2wyIy7sMafG5KjbuUlJo2S042khXjDOnbsiI2NDd9++y3wZHR9ypQpXL16laZNm1KtWjW++eYbtX23bt148OABW7duBZ5cxLRp06YXXpR5+fJlXFxcmDlzJmPHjgWejBq5uLjw2WefMWbMGCIiImjevDlhYWF06NABeFIsW1tbs2PHDho2bKj2169fP5KTk1mzZk22x/P39yc+Pl4dce/duzd3796lV69e9OzZkxUrVtC9e/fnxhsYGMiUKVOyrF+zZg1mZmY55iqEEC/r+vXrLFq0iLNnz6Knp0fFihVxdHQkNjaWRYsWabUdMmQIHh4ezx1sEEJAcnIyH330Effu3cPS0jLHtjKSLgoUX19f+vfvz9dff42xsTGrV6/mww8/RE9Pj/Pnz2f58m/cuPELp5Lk5OlC28DAgLp163L+/HmtNnXr1lX/HhMTQ3JyMi1bttRq8/jxYzw9PdXlxYsXs3LlSuLi4nj48CGPHz+mVq1aWvscOnSILVu28PPPP7/wl4rx48czYsQIdTkxMZHy5csz/YQeaYb6uU23UHkyMpnBpKN6hXZk8kWKQ45QPPIsCjk+O5KeqW/fvjx48IDbt29z5swZVq1ahZmZGW3atFHb7Nu3j3///ZewsDA8PDzeVMj5LjU1lfDwcFq2bJnrB+cVNpKjbmWeCc8NKdJFgdK+fXsURWHr1q3Uq1ePP//8k3nz5uk0JnPz/5tOkpSUBMDWrVuzPAzJ2NgYgHXr1jFq1Cjmzp1Lw4YNsbCw4KuvvuLQoUNa7StWrIiNjQ0rV66kbdu2OX6RGBsbq/0/be9Yb62pOUVJamoq27Zt49hknwL3JZtfikOOUDzyLOo5lixZEnNzcw4ePMiOHTuYPXu2Vp7fffcdderU0RrUKMwMDQ2L5Of4NMlRN/ISj1w4KgoUExMTOnfuzOrVq1m7di1ubm7Url0bgCpVqhAZGanVPjIykqpVq7708Q4ePKj+PS0tjWPHjlGlSpXntq9atSrGxsbExcVRqVIlrVf58uXVmBo1asTgwYPx9PSkUqVKxMbGZumrdOnS7Nq1i5iYGLp161Yg584JIYq333//ne3bt3Pp0iV27NjBxIkTcXNzo0+fPmqbxMREfvrpJ/r166fDSIUoemQkXRQ4vr6+tGvXjrNnz/Lxxx+r60ePHk23bt3w9PTE29ubX3/9lY0bN7Jjx46XPtbixYtxdXWlSpUqzJs3jzt37qh3ksmOhYUFo0aNYvjw4WRkZNCkSRPu3btHZGQklpaW9OrVC1dXV77//nt+//13XFxcWLVqFUeOHMHFxSVLf2XKlGHXrl00b96cHj16sG7dOrnFoxCiwLh37x7jx4/nn3/+wdramtq1a/Pdd99pjQauW7cORVHo0aOHDiMVouiRkXRR4Lz77rtYW1sTFRXFRx99pK7v2LEj8+fPZ86cOVSrVo1ly5YREhKCl5fXSx9r5syZzJw5Ew8PD/bt28cvv/xC6dKlc9xn2rRpTJo0iaCgIKpUqYKPjw9bt25Vi/ABAwbQuXNnunfvToMGDbh9+zaDBw9+bn/29vbs2rWL06dP4+vrS3p6+kvnI4QQ+albt27ExsaSkpJCXFwcfn5+WFlZabXx8/MjOTk5y3ohxKuRITtR4Ojp6XHt2rVstw0aNIhBgwY9d9/c3qyoQoUKatvnjf54eXll259Go2HYsGEMGzYs2/2MjY0JCQkhJCREa31QUJD699DQUK1tDg4OREVF5Sp2IYQQQhR9MpIuhBBCCCFEASNFuiiSvvzyS0qUKJHtq3Xr1roOTwghhBAiRzLdRRRJAwcOzPbpnvDkkdZCCCGEEAWZFOmiSLK2tsba2lrXYQghhBBCvBSZ7iKEEEIIIUQBI0W6EEIIUczdv3+fgIAAnJ2dMTU1pVGjRhw5ckTd3rt3b4yMjOjYsSNGRkZoNBp8fHx0GLEQRZ8U6QWMl5cXAQEBL73/5cuX0Wg0nDx5Mt9iEkIIUbT169eP8PBwVq1axenTp3nvvffw9vbm33//Vdu0atWKkJAQ4uLiuH79OmvXrtVhxEIUfVKkFzAbN25k2rRpug5DFRoaSsmSJXUdRo4qVKhAcHCwrsMAICIigg4dOuDg4IC5uTm1atVi9erVWdr99NNPuLu7Y2JiQo0aNdi2bZsOohVCCHj48CEbNmxg9uzZvPPOO1SqVInAwEAqVarEkiVL1HZGRkaUKlUKe3t77O3tKVWqlA6jFqLokyK9gLG2tsbCwkLXYeTZ48ePC0Wfr/t4+/fvp2bNmmzYsIG//vqLPn360LNnT7Zs2aLVpkePHvTt25cTJ07QsWNHOnbsyJkzZ175+EIIkVdpaWmkp6djYmKitd7U1JR9+/apy3v37qVXr15Uq1aNQYMGcfv27TcdqhDFikbJ7SMaxRvh5eVFrVq1CA4OpkKFCvj5+RETE8NPP/1EqVKlmDhxIn5+fmr7w4cPM2DAAM6fP0/16tWZMGECnTt35sSJE9SqVYvQ0FACAgK4e/euuk9YWBidOnVSn6Z56tQpAgICOHr0KBqNBldXV5YtW0ZSUhLNmzfXiu+LL74gMDCQChUq0LdvX6KjowkLC6Nz587ExcVRtWpVFi1apLa/efMmZcuW5bfffqNFixY55p5dn6Ghoezbt4/x48dz9OhRSpcuTadOnQgKCsLc3BwvLy/27Nmj1Y+iKAQGBhIWFqY17Sc4OJjg4GAuX74MPJljeffuXerVq8fixYsxNjZm9+7duLi4sGHDBhYuXMihQ4dwdXVl6dKlNGzYMC8fpapt27bY2dmxcuVKALp3786DBw+0Cve3336bWrVqsXTp0lz1mZiYiJWVFRVHrifNwPyl4irojPUVZtdPZ8xhfVLSNboO57UoDjlC8cizMOV4eWbbLOsaNWqEkZERa9aswc7OjrVr19KrVy8qVapEVFQU69atw8jIiKtXr1K2bFkmT55MiRIlOHDgAPr6+jrI4vVITU1l27ZttGnTBkNDQ12H81pIjrqV+fP73r17WFpa5thWbsFYwM2dO5dp06bx+eef8/PPPzNo0CCaNWuGm5sbSUlJtGvXjpYtW/LDDz9w6dKl5z6qPie+vr54enqyZMkS9PX1OXnyJIaGhjRq1Ijg4GAmT56sPrK+RIkS6n5z5sxh8uTJfPHFFwAcOnQIf39/5s6di7GxMQA//PADZcuW5d13381VLM/2GRsbi4+PD9OnT2flypXcvHkTf39//P39CQkJYePGjXh4eODn50f//v3znPvOnTuxtLQkPDxca/2ECROYM2cOrq6uTJgwgR49ehATE4OBQd7/y9y7d48qVaqoywcOHGDEiBFabVq1akVYWNhz+0hJSSElJUVdTkxMBMBYT0Ffv2j+nm2sp2j9WRQVhxyheORZmHJMTU3Nsm7lypX4+flRtmxZ9PX18fT0pHv37hw/fpzU1FS6dOlCamoq4eHhtGzZkho1auDu7s6OHTty/f1eGGS+N9m9R0WF5KhbeYlJivQCrk2bNgwePBiAsWPHMm/ePHbv3o2bmxtr1qwhIyODb7/9FhMTE6pVq8Y///zDoEGD8nSMuLg4Ro8ejbu7OwCurq7qNisrKzQaDfb29ln2e/fddxk5cqS6XLZsWfz9/dm8ebP6IKHQ0FB69+6NRpO7kaVn++zXrx++vr7qxbSurq4sWLCAZs2asWTJEqytrdHX18fCwiLbGF/E3NycFStWYGRkBKCOso8aNYq2bZ+MNk2ZMoVq1aoRExOjvke59eOPP3LkyBGWLVumrouPj8fOzk6rnZ2dHfHx8c/tJygoiClTpmRZP9EzAzOz9DzFVNhMq5uh6xBeu+KQIxSPPAtDjs+7BmbkyJEMGTKE5ORkrK2t+eqrryhRokSW9pmDGpaWlmzevJlHjx699pjftGcHbooiyVE3kpOTc91WivQCrmbNmurfM4vlhIQEAM6fP0/NmjW15hG+zJSMESNG0K9fP1atWoW3tzcffPABFStWfOF+devW1Vo2MTHhk08+YeXKlXTr1o3jx49z5swZfvnll1zH8myfp06d4q+//tK6+FJRFDIyMrh06ZLWCPXLqFGjhlqgP+3p993BwQGAhISEPBXpu3fvpk+fPixfvpxq1aq9Upzjx4/XGn1PTEykfPnyTD+hR5ph0TnV/DRjPYVpdTOYdFSPlIyCPX3gZRWHHKF45FmYcjwT2OqFbe7cucOZM2cICgqiTZs2AFoj6Tdu3OD+/ft4e3ur24uCp3MsaNMk8ovkqFuZZ8JzQ4r0Au7Zf1wajYaMjNyP1Ojp6fHsZQfPnmoJDAzko48+YuvWrfz222988cUXrFu3jk6dOuXYt7l51rnQ/fr1o1atWvzzzz+EhITw7rvv4uzsnOt4n+0zKSmJAQMGMHTo0CxtnZycnttPbvLO7niZnn7fM88C5OV937NnD+3bt2fevHn07NlTa5u9vT03btzQWnfjxo0czwQYGxurU4ietnesNzY2NrmOqzDJnFN4bLJPgfuSzS/FIUcoHnkW9hx///13FEXBzc2NmJgY9exqv379SElJYcqUKXTo0IEbN27w559/8vnnn1OpUiXatm1bKPN9EUNDwyKZ19MkR93ISzxyd5dCrEqVKvz1119apxoPHjyo1cbW1pb79+/z4MEDdV1291CvXLkyw4cP548//qBz586EhIQAT265lZ6e++kUNWrUoG7duixfvpw1a9bw6aef5jErbbVr1+bcuXNUqlQpyytzBDy7GG1tbYmPj9cq1N/UveMjIiJo27Yts2bN0rrIN1PDhg3ZuXOn1rrw8PCXvjBVCCFe1b179xgyZAju7u707NmTJk2a8Pvvv2NoaIi+vj5//fUXnTt3ZsiQIQwYMIA6derw559/Zjt4IITIH1KkF2IfffQRGo2G/v37c+7cObZt28acOXO02jRo0AAzMzM+//xzYmNjWbNmDaGhoer2hw8f4u/vT0REBFeuXCEyMpIjR46o00gqVKhAUlISO3fu5NatW7maS9WvXz9mzpyJoigvHI1/kbFjx7J//378/f05efIk0dHRbN68GX9/f7VNhQoV2Lt3L//++y+3bt0Cntwl5+bNm8yePZvY2FgWL17Mb7/99kqx5Mbu3btp27YtQ4cOpUuXLsTHxxMfH89///2nthk2bBjbt29n7ty5XLhwgcDAQI4ePaqVkxBCvEndunUjNjaWlJQUrl+/zqJFi7CysgKe3Irx999/599//+Xnn38mOjqab775Jsu1NUKI/CVFeiFWokQJfv31V06fPo2npycTJkxg1qxZWm2sra354Ycf2LZtGzVq1GDt2rUEBgaq2/X19bl9+zY9e/akcuXKdOvWjdatW6sXKTZq1IiBAwfSvXt3bG1tmT179gvj6tGjBwYGBvTo0SPLfXfzqmbNmuzZs4eLFy/StGlTPD09mTx5Mo6OjmqbqVOncvnyZSpWrIitrS3w5CzD119/zeLFi/Hw8ODw4cOMGjXqlWLJje+++47k5GSCgoJwcHBQX507d1bbNGrUiDVr1vDNN9/g4eHBzz//TFhYGNWrV3/t8QkhhBCicJD7pIt8l1kwHzlyhNq1a+s6nCIp8z6rt27dKvJz0gvifW7zS3HIEYpHnpJj0SA5Fg0FOUe5T7rQidTUVG7fvs3EiRN5++23pUAXQgghhHhJMt1F5JvIyEgcHBw4cuRIlidn/vnnn5QoUeK5r8KidevWz83hyy+/1HV4QgghhCgiZCRd5BsvL68stz3MVLdu3Td2d5XXacWKFTx8+DDbbdbW1m84GiGEEEIUVVKkizfC1NSUSpUq6TqMV1a2bFldhyCEEEKIYkCmuwghhBBCCFHA6LRI9/LyIiAgQGfHr1ChAsHBwTo7/rNCQ0MpWbLkaz2GRqMhLCzstR7jTXn288ttbpcvX0aj0RSo6Te9e/emY8eOug5DCFHIpKenM2nSJFxcXDA1NaVixYpMmzZNa+rhjRs36N27N46OjpiZmeHj40N0dLQOoxZC5IZMdylmrl+/TqlSpXQdhhBCiHwwa9YslixZwnfffUe1atU4evQoffr0wcrKiqFDh6IoCh07dsTQ0JDNmzdjaWnJ//73P7y9vTl37hzm5ua6TkEI8RxSpBcz9vb2ug5BCCFEPtm/fz8dOnSgbdu2wJMzjGvXruXw4cMAREdHc/DgQc6cOUO1atUAWLJkCfb29qxdu5Z+/frpLHYhRM50Pic9LS0Nf39/rKysKF26NJMmTVJP02U3faFkyZLqY+3ffffdLI9Sv3nzJkZGRuzcuTPPsVy4cIEmTZpgYmJC1apV2bFjR66nUDRq1IixY8dmicXQ0JC9e/cCcOfOHXr27EmpUqUwMzOjdevWL33KMTAwkFq1arFy5UqcnJwoUaIEgwcPJj09ndmzZ2Nvb0+ZMmWYMWOG1n5P55M57WPjxo00b94cMzMzPDw8OHDgQJbjPC04OJgKFSqoyxEREdSvXx9zc3NKlixJ48aNuXLlygtzOHXqFM2bN8fCwgJLS0vq1KnD0aNH1e379u2jadOmmJqaUr58eYYOHcqDBw/y/mblwi+//IKrqysmJiY0b96c7777Do1Gw927d3PcLzExEVNTU3777Tet9Zs2bcLCwoLk5GQATp8+zbvvvoupqSk2Njb4+fmRlJT0WnIRQhQfjRo1YufOnVy8eBF48r26b98+WrduDUBKSgqA1tOf9fT0MDY2Zt++fW8+YCFErul8JP27776jb9++HD58mKNHj+Ln54eTkxP9+/d/4b79+vXD39+fuXPnYmxsDMAPP/xA2bJleffdd/MUR3p6Oh07dsTJyYlDhw5x//59Ro4cmev9fX19mT17NjNnzkSj0QCwfv16HB0dadq0KfBk3nF0dDS//PILlpaWjB07ljZt2nDu3LmXeiJWbGwsv/32G9u3byc2NpauXbvy999/U7lyZfbs2cP+/fv59NNP8fb2pkGDBs/tZ8KECcyZMwdXV1cmTJhAjx49iImJwcDgxf880tLS6NixI/3792ft2rU8fvyYw4cPq+9BTnx9ffH09GTJkiXo6+tz8uRJ9X2IjY3Fx8eH6dOns3LlSm7evIm/vz/+/v6EhITk/k3KhUuXLtG1a1eGDRtGv379OHHiBKNGjcrVvpaWlrRr1441a9aoPxQBVq9eTceOHTEzM+PBgwe0atWKhg0bcuTIERISEtR/u5m/cL6sBkE7STMomqerjfUVZteH6oG/k5L+4n9PhVFxyBGKR55vKsfLM9tqLY8bN47ExETc3d3R19cnPT2dGTNm4OvrC4C7uztOTk6MHz+eZcuWYW5uzrx58/jnn3+4fv36a4tTCPHqdF6kly9fnnnz5qHRaHBzc+P06dPMmzcvV0V6586d8ff3Z/PmzXTr1g14cvFl7969c1UkPi08PJzY2FgiIiLUKSEzZsygZcuWudq/W7duBAQEqKO/AGvWrKFHjx5oNBq1OI+MjKRRo0bAk0KufPnyhIWF8cEHH+QpXoCMjAxWrlyJhYUFVatWpXnz5kRFRbFt2zb09PRwc3Nj1qxZ7N69O8cifdSoUeqp0ilTplCtWjViYmJwd3d/YQyJiYncu3ePdu3aUbFiRQCqVKmSq/jj4uIYPXq0ehxXV1d1W1BQEL6+vuqFxa6urixYsIBmzZqxZMkSrVGhV7Vs2TLc3Nz46quvAHBzc+PMmTNZzkI8j6+vL5988gnJycmYmZmRmJjI1q1b2bRpE/Dk38GjR4/4/vvv1fmfixYton379syaNQs7O7sXHiMlJUUdEYMn7zuAsZ6Cvn7296Yv7Iz1FK0/i6LikCMUjzzfVI6pqalay+vXr2f16tV8//33VK1alVOnTjFq1CjKlClDz549Afjxxx/x8/PD2toafX19WrRogY+PD4qiZOkvN8fOyz6FjeRYNBTkHPMSk86L9LfffluroG7YsCFz584lPT39hfuamJjwySefsHLlSrp168bx48c5c+YMv/zyS57jiIqKonz58lpztuvXr5/r/W1tbXnvvfdYvXo1TZs25dKlSxw4cIBly5YBcP78eQwMDLSKZRsbG9zc3Dh//nye44Uncw8tLCzUZTs7O/T19dHT09Nal5CQkGM/NWvWVP/u4OAAQEJCQq6KdGtra3r37k2rVq1o2bIl3t7edOvWTe0nJyNGjKBfv36sWrUKb29vPvjgA7XQP3XqFH/99RerV69W2yuKQkZGBpcuXcr1LwK5ERUVRb169bTW5eWzb9OmDYaGhvzyyy98+OGHbNiwAUtLS7y9vYEnn72Hh4fWBVqNGzcmIyODqKioXBXpQUFBTJkyJcv6iZ4ZmJm9+P9KYTatboauQ3jtikOOUDzyfN05btu2TWs5ICCALl26YGFhwdWrV7G2tsbHx4cvvviC0qVLq+2mTp3KgwcPSEtLw8rKitGjR1OpUqUs/eVGeHj4K+dR0EmORUNBzDFzGmxu6LxIz4lGo8nyBMtnfwPp168ftWrV4p9//iEkJIR3330XZ2fnNxmmytfXl6FDh7Jw4ULWrFlDjRo1qFGjxms73rNTZDQaTbbrMjJy/qHx9D6ZvzBl7qOnp/fCzyAkJIShQ4eyfft21q9fz8SJEwkPD+ftt9/O8biBgYF89NFHbN26ld9++40vvviCdevW0alTJ5KSkhgwYABDhw7Nsp+Tk1OO/b5pRkZGdO3alTVr1vDhhx+yZs0aunfvnqvpQrk1fvx4RowYoS4nJiZSvnx5mjdvjo2NTb4dpyBJTU0lPDycli1bvtR0sMKgOOQIxSNPXeWoKAo1atSgTZs26rrTp09z+PBhrXVPi46OJjY2luDg4FyfLQb5HIsKyVG3Ms+E54bOi/RDhw5pLR88eBBXV1f09fWxtbXVmjMXHR2d5TeQGjVqULduXZYvX86aNWtYtGjRS8Xh5ubG1atXuXHjhjqyeeTIkTz10aFDB/z8/Ni+fTtr1qxRTzXCkykgaWlpHDp0SJ3ucvv2baKioqhatepLxfwm2NraEh8fj6IoagGf3f3FPT098fT0ZPz48TRs2JA1a9a8sEgHqFy5MpUrV2b48OH06NGDkJAQOnXqRO3atTl37twbeUqpm5tbltGkvH72vr6+tGzZkrNnz7Jr1y6mT5+ubqtSpQqhoaE8ePBAHU2PjIxUpyTlhrGxsXrdxdMMDQ0L3BdQfpMci47ikOebzrF9+/bMnDkTFxcXqlWrxokTJ5g/fz6ffvqpGsdPP/2Era0tTk5OnD59mmHDhtGxY8fnFvEvIp9j0SA56kZe4tH53V3i4uIYMWIEUVFRrF27loULFzJs2DDgyd1bFi1axIkTJzh69CgDBw7MNrl+/foxc+ZMFEWhU6dOLxVHy5YtqVixIr169eKvv/4iMjKSiRMnAuR6fru5uTkdO3Zk0qRJnD9/nh49eqjbXF1d6dChA/3792ffvn2cOnWKjz/+mLJly9KhQ4eXivlN8PLy4ubNm8yePZvY2FgWL16sdSeTS5cuMX78eA4cOMCVK1f4448/iI6OfuF0lIcPH+Lv709ERARXrlwhMjKSI0eOqPuNHTuW/fv34+/vz8mTJ4mOjmbz5s1Z7uaTHwYMGMCFCxcYO3YsFy9e5Mcff1Qv6MztZ//OO+9gb2+Pr68vLi4uWtOafH19MTExoVevXpw5c4bdu3fz2Wef8cknn+RqqosQQjzPwoUL6dq1K4MHD6ZKlSqMGjWKAQMGMG3aNLXN9evX+eSTT3B3d2fo0KF88sknrF27VodRCyFyQ+dFes+ePXn48CH169dnyJAhDBs2DD8/PwDmzp1L+fLladq0KR999BGjRo3CzMwsSx89evTAwMCAHj16vPQFhfr6+oSFhZGUlES9evXo168fEyZMAMhTn76+vpw6dYqmTZtmmZYREhJCnTp1aNeuHQ0bNkRRFLZt21bgfst7WpUqVfj6669ZvHgxHh4eHD58WOvOJ2ZmZly4cIEuXbpQuXJl/Pz8GDJkCAMGDMixX319fW7fvk3Pnj2pXLky3bp1o3Xr1uq865o1a7Jnzx4uXrxI06ZN8fT0ZPLkyTg6OuZ7ji4uLvz8889s3LiRmjVrsmTJEvWzz270OjsajYYePXpw6tQp9a4KmczMzPj999/577//qFevHl27dqVFixYvfdZHCCEyWVhYEBwczJUrV3j48CGxsbFMnz4dIyMjtc3QoUO5evUqjx8/5sqVK0ybNk1ruxCiYNIoz044LoQuX75MxYoVOXLkCLVr1863fiMjI2nSpAkxMTHqBY2ieJgxYwZLly7l6tWrug4lW4mJiVhZWXHr1q0iPSd927Zt6oW5RVFxyBGKR56SY9EgORYNBTnHzJ/f9+7dw9LSMse2Op+T/ipSU1O5ffs2EydO5O23337lAn3Tpk2UKFECV1dXYmJiGDZsGI0bN5YCvRj4+uuvqVevHjY2NkRGRvLVV1+9lqk1QgghhBC5ofPpLq8iMjISBwcHjhw5wtKlS7W2/fnnn5QoUeK5r+zcv3+fIUOG4O7uTu/evalXrx6bN28G4Msvv3xuX08/xCa/VKtW7bnHe/q2hAWZrnJ4mc8qOjqaDh06ULVqVaZNm8bIkSMJDAwEoHXr1s/t78svv3xteQghhBCi+CrUI+leXl5Zbg+YqW7dutnehSQnPXv21Lojy9MGDhyoPjDpWaampnk6Tm5s27btuTe8LywXG+oqh5f5rObNm8e8efOy3bZixQoePnyY7TZra+uXC1IIIYQQIgeFukjPiampab7evs/a2vqNFmS6utd7ftJVDvn9WZUtWzbf+hJCCCGEyI1CPd1FCCGEEEKIokiKdCGEEKKQSk9PZ9KkSbi4uGBqakrFihWZNm2a1lTQGzdu0Lt3bxwdHTEzM8PHx4fo6GgdRi2EyA0p0oXOhIaGUrJkSV2HIYQQhdasWbNYsmQJixYt4vz588yaNYvZs2ezcOFCABRFoWPHjvz9999s3ryZEydO4OzsjLe3Nw8ePNBx9EKInEiRLnSme/fuXLx4UddhvFbyi4gQ4nXav38/HTp0oG3btlSoUIGuXbvy3nvvcfjwYeDJnasOHjzIkiVLqFevHm5ubixZsoSHDx/KU0eFKOCkSBc6Y2pqSpkyZXQdBo8fP34j+wghRH5r1KgRO3fuVAc8Tp06xb59+9TbzaakpADaT87W09PD2NiYffv2vfmAhRC5VmTv7iJ0Y8uWLXz88cfcvn0bfX19Tp48iaenJ2PHjmXmzJkA9OvXj0ePHuHt7U1AQAB3794FIDAwkLCwMEaOHMmkSZO4c+cOrVu3Zvny5VhYWABPbrtZs2ZNTExMWLFiBUZGRgwcOFC9pznA3bt3GTVqFJs3byYlJYW6desyb948PDw8tI7j7+/PjBkzuHLlChkZGTnm5eXlRfXq1TEwMOCHH36gRo0a7N69m//973+EhITw999/Y21tTfv27Zk9ezYlSpQgIiKCPn36AKDRaAD44osvCAwMJCUlhQkTJrB27Vru3r1L9erVmTVrFl5eXnl6vxsE7STNwDxP+xQWxvoKs+tD9cDfSUnX6Dqc16I45AjFI883lePlmW21lseNG0diYiLu7u7o6+uTnp7OjBkz8PX1BcDd3R0nJyfGjx/PsmXLMDc3Z968efzzzz9cv379tcUphHh1UqSLfNW0aVPu37/PiRMnqFu3Lnv27KF06dJERESobfbs2cPYsWOz3T82NpawsDC2bNnCnTt36NatGzNnzmTGjBlqm++++44RI0Zw6NAhDhw4QO/evWncuDEtW7YE4IMPPsDU1JTffvsNKysrli1bRosWLbh48aJ6a8aYmBg2bNjAxo0b0dfXz1Vu3333HYMGDSIyMlJdp6enx4IFC3BxceHvv/9m8ODBjBkzhq+//ppGjRoRHBzM5MmTiYqKAlAfpOXv78+5c+dYt24djo6ObNq0CR8fH06fPo2rq2uWY6ekpKgjYvDkscIAxnoK+vrZPyugsDPWU7T+LIqKQ45QPPJ8Uzk+++yJ9evXs3r1ar7//nuqVq3KqVOnGDVqFGXKlFGf+/Hjjz/i5+eHtbU1+vr6tGjRAh8fHxRFee6zLHI6dl72KWwkx6KhIOeYl5g0yvOeBiTES6pTpw49evRg1KhRdOrUiXr16jFlyhRu377NvXv3KFeuHBcvXiQyMjLLSPpXX31FfHy8OnI+ZswY9u7dy8GDB4EnI9rp6en8+eef6vHq16/Pu+++y8yZM9m3bx9t27YlISEBY2NjtU2lSpUYM2YMfn5+BAYG8uWXX/Lvv/9ia2ubq5y8vLxITEzk+PHjObb7+eefGThwILdu3QKezEl/OkeAuLg43nrrLeLi4nB0dFTXe3t7U79+/WyfYhoYGMiUKVOyrF+zZg1mZma5ykEIUfT07duXLl260KZNG3Xdjz/+yJ49e1i8eLFW2wcPHpCWloaVlRWjR4+mUqVKDBgw4E2HLESxlpyczEcffcS9e/ewtLTMsa2MpIt816xZMyIiIhg5ciR//vknQUFB/Pjjj+zbt4///vsPR0dHXF1dtUakM1WoUEEt0AEcHBxISEjQalOzZk2t5afbnDp1iqSkJGxsbLTaPHz4kNjYWHXZ2dk51wV6pjp16mRZt2PHDoKCgrhw4QKJiYmkpaXx6NEjkpOTn1s8nz59mvT0dCpXrqy1PiUlJUvcmcaPH8+IESPU5cTERMqXL8/0E3qkGebuTEBhY6ynMK1uBpOO6pGSUUSnSBSDHKF45PmmcjwT2EprWVEUatSooVWknz59msOHD2ute1p0dDSxsbEEBwerZyBzIzU1lfDwcFq2bImhoeHLJVDASY5FQ0HOMfNMeG5IkS7ynZeXFytXruTUqVMYGhri7u6Ol5cXERER3Llzh2bNmj1332f/M2k0mizzxXNqk5SUhIODg9b0mkxP32XF3Dzv87if3efy5cu0a9eOQYMGMWPGDKytrdm3bx99+/bl8ePHzy3Sk5KS0NfX59ixY1mm2mROh3mWsbGx1pmBTHvHej+3sC/sUlNT2bZtG8cm+xS4L9n8UhxyhOKRp65ybN++PTNnzsTFxYVq1apx4sQJ5s+fz6effqrG8dNPP2Fra4uTkxOnT59m2LBhdOzY8blF/IsYGhoW2c8xk+RYNBTEHPMSjxTpIt9lzkufN2+eWpB7eXkxc+ZM7ty5w8iRI1/bsWvXrk18fDwGBgZUqFDhtR0H4NixY2RkZDB37lz09J7cKOnHH3/UamNkZER6errWOk9PT9LT00lISKBp06avNUYhRNG2cOFCJk2axODBg0lISMDR0ZEBAwYwefJktc3169cZMWIEN27cwMHBgZ49ezJp0iQdRi2EyA0p0kW+K1WqFDVr1mT16tUsWrQIgHfeeYdu3bqRmpqa40j6q/L29qZhw4Z07NiR2bNnU7lyZa5du8bWrVvp1KkTdevWzbdjVapUidTUVBYuXEj79u2JjIxk6dKlWm0qVKhAUlISO3fuxMPDAzMzMypXroyvry89e/Zk7ty5eHp6cvPmTXbu3EnNmjVp27btc44ohBDaLCwsCA4OJjg4+Llthg4dytChQ99cUEKIfCH3SRevRbNmzUhPT1dvKWhtbU3VqlWxt7fHzc3ttR1Xo9Gwbds23nnnHfr06UPlypX58MMPuXLlCnZ2dvl6LA8PD/73v/8xa9YsqlevzurVqwkKCtJq06hRIwYOHEj37t2xtbVl9uzZAISEhNCzZ09GjhyJm5sbHTt25MiRIzg5OeVrjEIIIYQonOTuLkIUQomJiVhZWXHr1q0iPye9TZs2BW5OYX4pDjlC8chTciwaJMeioSDnmPnzOzd3d5GRdCGEEEIIIQoYKdJFsRcXF0eJEiWe+4qLi9N1iEIIIYQoZuTCUVHsOTo6cvLkyRy3CyGEEEK8SVKki2LPwMCASpUq6ToMIYQQQgiVTHcRQgghhBCigJEiXQghhBBCiAJGinQhhBBCCCEKGCnShRBCCCGEKGCkSBdCCCGEEKKAkSJdCCGEEEKIAkZuwShEIaQoCgD3798vcI88zi+pqakkJyeTmJgoORZyxSFPybFokByLhoKcY2JiIvB/P8dzIkW6EIXQ7du3AXBxcdFxJEIIIYTIq/v372NlZZVjGynShSiErK2tAYiLi3vhf/LCKjExkfLly3P16lUsLS11Hc5rURxyhOKRp+RYNEiORUNBzlFRFO7fv5+rp5lLkS5EIaSn9+RyEisrqwL3BZTfLC0tJcciojjkKTkWDZJj0VBQc8zt4JpcOCqEEEIIIUQBI0W6EEIIIYQQBYwU6UIUQsbGxnzxxRcYGxvrOpTXRnIsOopDnpJj0SA5Fg1FJUeNkpt7wAghhBBCCCHeGBlJF0IIIYQQooCRIl0IIYQQQogCRop0IYQQQgghChgp0oUQQgghhChgpEgXohBavHgxFSpUwMTEhAYNGnD48GFdh/TSgoKCqFevHhYWFpQpU4aOHTsSFRWl1ebRo0cMGTIEGxsbSpQoQZcuXbhx44aOIn41M2fORKPREBAQoK4rKvn9+++/fPzxx9jY2GBqakqNGjU4evSoul1RFCZPnoyDgwOmpqZ4e3sTHR2tw4jzJj09nUmTJuHi4oKpqSkVK1Zk2rRpPH3/hcKW4969e2nfvj2Ojo5oNBrCwsK0tucmn//++w9fX18sLS0pWbIkffv2JSkp6Q1mkbOcckxNTWXs2LHUqFEDc3NzHB0d6dmzJ9euXdPqozDn+KyBAwei0WgIDg7WWl8Ucjx//jzvv/8+VlZWmJubU69ePeLi4tTthe27Vop0IQqZ9evXM2LECL744guOHz+Oh4cHrVq1IiEhQdehvZQ9e/YwZMgQDh48SHh4OKmpqbz33ns8ePBAbTN8+HB+/fVXfvrpJ/bs2cO1a9fo3LmzDqN+OUeOHGHZsmXUrFlTa31RyO/OnTs0btwYQ0NDfvvtN86dO8fcuXMpVaqU2mb27NksWLCApUuXcujQIczNzWnVqhWPHj3SYeS5N2vWLJYsWcKiRYs4f/48s2bNYvbs2SxcuFBtU9hyfPDgAR4eHixevDjb7bnJx9fXl7NnzxIeHs6WLVvYu3cvfn5+byqFF8opx+TkZI4fP86kSZM4fvw4GzduJCoqivfff1+rXWHO8WmbNm3i4MGD2T6SvrDnGBsbS5MmTXB3dyciIoK//vqLSZMmYWJiorYpdN+1ihCiUKlfv74yZMgQdTk9PV1xdHRUgoKCdBhV/klISFAAZc+ePYqiKMrdu3cVQ0ND5aefflLbnD9/XgGUAwcO6CrMPLt//77i6uqqhIeHK82aNVOGDRumKErRyW/s2LFKkyZNnrs9IyNDsbe3V7766it13d27dxVjY2Nl7dq1byLEV9a2bVvl008/1VrXuXNnxdfXV1GUwp8joGzatEldzk0+586dUwDlyJEjapvffvtN0Wg0yr///vvGYs+tZ3PMzuHDhxVAuXLliqIoRSfHf/75Rylbtqxy5swZxdnZWZk3b566rSjk2L17d+Xjjz9+7j6F8btWRtKFKEQeP37MsWPH8Pb2Vtfp6enh7e3NgQMHdBhZ/rl37x4A1tbWABw7dozU1FStnN3d3XFycipUOQ8ZMoS2bdtq5QFFJ79ffvmFunXr8sEHH1CmTBk8PT1Zvny5uv3SpUvEx8dr5WllZUWDBg0KTZ6NGjVi586dXLx4EYBTp06xb98+WrduDRSNHJ+Wm3wOHDhAyZIlqVu3rtrG29sbPT09Dh069MZjzg/37t1Do9FQsmRJoGjkmJGRwSeffMLo0aOpVq1alu2FPceMjAy2bt1K5cqVadWqFWXKlKFBgwZaU2IK43etFOlCFCK3bt0iPT0dOzs7rfV2dnbEx8frKKr8k5GRQUBAAI0bN6Z69eoAxMfHY2RkpP7AzFSYcl63bh3Hjx8nKCgoy7aikB/A33//zZIlS3B1deX3339n0KBBDB06lO+++w5AzaUw/9sdN24cH374Ie7u7hgaGuLp6UlAQAC+vr5A0cjxabnJJz4+njJlymhtNzAwwNraulDm/OjRI8aOHUuPHj2wtLQEikaOs2bNwsDAgKFDh2a7vbDnmJCQQFJSEjNnzsTHx4c//viDTp060blzZ/bs2QMUzu9aA10HIIQQmYYMGcKZM2fYt2+frkPJN1evXmXYsGGEh4drzY0sajIyMqhbty5ffvklAJ6enpw5c4alS5fSq1cvHUeXP3788UdWr17NmjVrqFatGidPniQgIABHR8cik2NxlpqaSrdu3VAUhSVLlug6nHxz7Ngx5s+fz/Hjx9FoNLoO57XIyMgAoEOHDgwfPhyAWrVqsX//fpYuXUqzZs10Gd5Lk5F0IQqR0qVLo6+vn+Vq9Bs3bmBvb6+jqPKHv78/W7ZsYffu3ZQrV05db29vz+PHj7l7965W+8KS87Fjx0hISKB27doYGBhgYGDAnj17WLBgAQYGBtjZ2RXq/DI5ODhQtWpVrXVVqlRR76yQmUth/rc7evRodTS9Ro0afPLJJwwfPlw9Q1IUcnxabvKxt7fPctF6Wloa//33X6HKObNAv3LlCuHh4eooOhT+HP/8808SEhJwcnJSv4OuXLnCyJEjqVChAlD4cyxdujQGBgYv/A4qbN+1UqQLUYgYGRlRp04ddu7cqa7LyMhg586dNGzYUIeRvTxFUfD392fTpk3s2rULFxcXre116tTB0NBQK+eoqCji4uIKRc4tWrTg9OnTnDx5Un3VrVsXX19f9e+FOb9MjRs3znLrzIsXL+Ls7AyAi4sL9vb2WnkmJiZy6NChQpNncnIyenraPzb19fXVUbyikOPTcpNPw4YNuXv3LseOHVPb7Nq1i4yMDBo0aPDGY34ZmQV6dHQ0O3bswMbGRmt7Yc/xk08+4a+//tL6DnJ0dGT06NH8/vvvQOHP0cjIiHr16uX4HVQof5bo+spVIUTerFu3TjE2NlZCQ0OVc+fOKX5+fkrJkiWV+Ph4XYf2UgYNGqRYWVkpERERyvXr19VXcnKy2mbgwIGKk5OTsmvXLuXo0aNKw4YNlYYNG+ow6lfz9N1dFKVo5Hf48GHFwMBAmTFjhhIdHa2sXr1aMTMzU3744Qe1zcyZM5WSJUsqmzdvVv766y+lQ4cOiouLi/Lw4UMdRp57vXr1UsqWLats2bJFuXTpkrJx40aldOnSypgxY9Q2hS3H+/fvKydOnFBOnDihAMr//vc/5cSJE+qdTXKTj4+Pj+Lp6akcOnRI2bdvn+Lq6qr06NFDVyllkVOOjx8/Vt5//32lXLlyysmTJ7W+g1JSUtQ+CnOO2Xn27i6KUvhz3Lhxo2JoaKh88803SnR0tLJw4UJFX19f+fPPP9U+Ctt3rRTpQhRCCxcuVJycnBQjIyOlfv36ysGDB3Ud0ksDsn2FhISobR4+fKgMHjxYKVWqlGJmZqZ06tRJuX79uu6CfkXPFulFJb9ff/1VqV69umJsbKy4u7sr33zzjdb2jIwMZdKkSYqdnZ1ibGystGjRQomKitJRtHmXmJioDBs2THFyclJMTEyUt956S5kwYYJWMVfYcty9e3e2//969eqlKEru8rl9+7bSo0cPpUSJEoqlpaXSp08f5f79+zrIJns55Xjp0qXnfgft3r1b7aMw55id7Ir0opDjt99+q1SqVEkxMTFRPDw8lLCwMK0+Ctt3rUZRnnpUmhBCCCGEEELnZE66EEIIIYQQBYwU6UIIIYQQQhQwUqQLIYQQQghRwEiRLoQQQgghRAEjRboQQgghhBAFjBTpQgghhBBCFDBSpAshhBBCCFHASJEuhBBCvCFeXl4EBAToOgwhRCEgRboQQogCoXfv3mg0miyvmJiYfOk/NDSUkiVL5ktfL2vjxo1MmzZNpzHkJCIiAo1Gw927d3UdihDFnoGuAxBCCCEy+fj4EBISorXO1tZWR9E8X2pqKoaGhnnez9ra+jVEkz9SU1N1HYIQ4ikyki6EEKLAMDY2xt7eXuulr68PwObNm6lduzYmJia89dZbTJkyhbS0NHXf//3vf9SoUQNzc3PKly/P4MGDSUpKAp6MEPfp04d79+6pI/SBgYEAaDQawsLCtOIoWbIkoaGhAFy+fBmNRsP69etp1qwZJiYmrF69GoAVK1ZQpUoVTExMcHd35+uvv84xv2enu1SoUIHp06fTs2dPSpQogbOzM7/88gs3b96kQ4cOlChRgpo1a3L06FF1n8wzAmFhYbi6umJiYkKrVq24evWq1rGWLFlCxYoVMTIyws3NjVWrVmlt12g0LFmyhPfffx9zc3P69+9P8+bNAShVqhQajYbevXsDsH37dpo0aULJkiWxsbGhXbt2xMbGqn1lvkcbN26kefPmmJmZ4eHhwYEDB7SOGRkZiZeXF2ZmZpQqVYpWrVpx584dADIyMggKCsLFxQVTU1M8PDz4+eefc3w/hSjSFCGEEKIA6NWrl9KhQ4dst+3du1extLRUQkNDldjYWOWPP/5QKlSooAQGBqpt5s2bp+zatUu5dOmSsnPnTsXNzU0ZNGiQoiiKkpKSogQHByuWlpbK9evXlevXryv3799XFEVRAGXTpk1ax7OyslJCQkIURVGUS5cuKYBSoUIFZcOGDcrff/+tXLt2Tfnhhx8UBwcHdd2GDRsUa2trJTQ09Lk5NmvWTBk2bJi67OzsrFhbWytLly5VLl68qAwaNEixtLRUfHx8lB9//FGJiopSOnbsqFSpUkXJyMhQFEVRQkJCFENDQ6Vu3brK/v37laNHjyr169dXGjVqpPa7ceNGxdDQUFm8eLESFRWlzJ07V9HX11d27dqltgGUMmXKKCtXrlRiY2OVy5cvKxs2bFAAJSoqSrl+/bpy9+5dRVEU5eeff1Y2bNigREdHKydOnFDat2+v1KhRQ0lPT9d6j9zd3ZUtW7YoUVFRSteuXRVnZ2clNTVVURRFOXHihGJsbKwMGjRIOXnypHLmzBll4cKFys2bNxVFUZTp06cr7u7uyvbt25XY2FglJCREMTY2ViIiIp77fgpRlEmRLoQQokDo1auXoq+vr5ibm6uvrl27KoqiKC1atFC+/PJLrfarVq1SHBwcntvfTz/9pNjY2KjLISEhipWVVZZ2uS3Sg4ODtdpUrFhRWbNmjda6adOmKQ0bNnxuTNkV6R9//LG6fP36dQVQJk2apK47cOCAAijXr19X8wCUgwcPqm3Onz+vAMqhQ4cURVGURo0aKf3799c69gcffKC0adNGK++AgACtNrt371YA5c6dO8/NQVEU5ebNmwqgnD59WlGU/3uPVqxYobY5e/asAijnz59XFEVRevTooTRu3Djb/h49eqSYmZkp+/fv11rft29fpUePHjnGIkRRJXPShRBCFBjNmzdnyZIl6rK5uTkAp06dIjIykhkzZqjb0tPTefToEcnJyZiZmbFjxw6CgoK4cOECiYmJpKWlaW1/VXXr1lX//uDBA2JjY+nbty/9+/dX16elpWFlZZWnfmvWrKn+3c7ODoAaNWpkWZeQkIC9vT0ABgYG1KtXT23j7u5OyZIlOX/+PPXr1+f8+fP4+flpHadx48bMnz//uTnlJDo6msmTJ3Po0CFu3bpFRkYGAHFxcVSvXj3bXBwcHNS43d3dOXnyJB988EG2/cfExJCcnEzLli211j9+/BhPT89cxShEUSNFuhBCiALD3NycSpUqZVmflJTElClT6Ny5c5ZtJiYmXL58mXbt2jFo0CBmzJiBtbU1+/bto2/fvjx+/DjHIl2j0aAoita67C6izPyFITMegOXLl9OgQQOtdplz6HPr6QtQNRrNc9dlFsb56emcctK+fXucnZ1Zvnw5jo6OZGRkUL16dR4/fqzVLqe4TU1Nn9t/5vu5detWypYtq7XN2Ng4VzEKUdRIkS6EEKLAq127NlFRUdkW8ADHjh0jIyODuXPnoqf35J4IP/74o1YbIyMj0tPTs+xra2vL9evX1eXo6GiSk5NzjMfOzg5HR0f+/vtvfH1985rOK0tLS+Po0aPUr18fgKioKO7evUuVKlUAqFKlCpGRkfTq1UvdJzIykqpVq+bYr5GREYDW+3T79m2ioqJYvnw5TZs2BWDfvn15jrlmzZrs3LmTKVOmZNlWtWpVjI2NiYuLo1mzZnnuW4iiSIp0IYQQBd7kyZNp164dTk5OdO3aFT09PU6dOsWZM2eYPn06lSpVIjU1lYULF9K+fXsiIyNZunSpVh8VKlQgKSmJnTt34uHhgZmZGWZmZrz77rssWrSIhg0bkp6eztixY3N1e8UpU6YwdOhQrKys8PHxISUlhaNHj3Lnzh1GjBjxut4K4MmI9WeffcaCBQswMDDA39+ft99+Wy3aR48eTbdu3fD09MTb25tff/2VjRs3smPHjhz7dXZ2RqPRsGXLFtq0aYOpqSmlSpXCxsaGb775BgcHB+Li4hg3blyeYx4/fjw1atRg8ODBDBw4ECMjI3bv3s0HH3xA6dKlGTVqFMOHDycjI4MmTZpw7949IiMjsbS01PplQ4jiQm7BKIQQosBr1aoVW7Zs4Y8//qBevXq8/fbbzJs3D2dnZwA8PDz43//+x6xZs6hevTqrV68mKChIq49GjRoxcOBAunfvjq2tLbNnzwZg7ty5lC9fnqZNm/LRRx8xatSoXM1h79evHytWrCAkJIQaNWrQrFkzQkNDcXFxyf834BlmZmaMHTuWjz76iMaNG1OiRAnWr1+vbu/YsSPz589nzpw5VKtWjWXLlhESEoKXl1eO/ZYtW5YpU6Ywbtw47Ozs8Pf3R09Pj3Xr1nHs2DGqV6/O8OHD+eqrr/Icc+XKlfnjjz84deoU9evXp2HDhmzevBkDgyfjhdOmTWPSpEkEBQVRpUoVfHx82Lp16xt5P4UoiDTKsxPxhBBCCFFghYaGEhAQIE8FFaKIk5F0IYQQQgghChgp0oUQQgghhChgZLqLEEIIIYQQBYyMpAshhBBCCFHASJEuhBBCCCFEASNFuhBCCCGEEAWMFOlCCCGEEEIUMFKkCyGEEEIIUcBIkS6EEEIIIUQBI0W6EEIIIYQQBYwU6UIIIYQQQhQwUqQLIYQQQghRwPw/3Ys58pbaKXUAAAAASUVORK5CYII="
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"train data size: 2540320\n"
]
}
],
"execution_count": 16
},
{
"cell_type": "code",
"id": "1a248706-e58a-406f-9268-6dce3de2d863",
"metadata": {
"jupyter": {
"source_hidden": true
},
"ExecuteTime": {
"end_time": "2025-03-31T14:59:05.601202Z",
"start_time": "2025-03-31T14:59:05.593686Z"
}
},
"source": [
"\n",
"\n",
"# catboost_params = {\n",
"# 'loss_function': 'QuerySoftMax',\n",
"# 'eval_metric': 'QuerySoftMax',\n",
"# # 'custom_metric': ['AverageGain:top=10'],\n",
"\n",
"# 'iterations': 5000,\n",
"# 'learning_rate': 0.01,\n",
"# 'depth': 10,\n",
"# 'grow_policy': 'Lossguide',\n",
"# # 'max_leaves': 64,\n",
"# # 'min_data_in_leaf': 50,\n",
"\n",
"# # 'l2_leaf_reg': 5,\n",
"# # 'random_strength': 2.0,\n",
"# # 'bagging_temperature': 1.2,\n",
"# # 'subsample': 0.8,\n",
"\n",
"# 'early_stopping_rounds': 100,\n",
"# 'task_type': 'GPU',\n",
"# 'verbose': 500,\n",
"\n",
"# 'one_hot_max_size': 64\n",
"# }\n",
"\n",
"# gc.collect()\n",
"\n",
"# feature_weights = {col: 2.0 if 'act_factor' in col\n",
"# # or 'af' in col\n",
"# or 'limit' in col\n",
"# else 1.0\n",
"# for col in feature_columns_new}\n",
"# catboost_params['feature_weights'] = feature_weights\n",
"\n",
"# # model, scaler = train_catboost(train_data, test_data.dropna(subset=['label']), feature_columns_new, catboost_params, plot=True)"
],
"outputs": [],
"execution_count": 17
},
{
"cell_type": "code",
"id": "5d1522a7538db91b",
"metadata": {
"ExecuteTime": {
"end_time": "2025-03-31T15:06:24.620370Z",
"start_time": "2025-03-31T15:05:42.433755Z"
}
},
"source": [
"# train_data = train_data.sort_values(by='trade_date')\n",
"# all_dates = train_data['trade_date'].unique() # 获取所有唯一的 trade_date\n",
"# split_date = all_dates[-120] # 划分点为倒数第 validation_days 天\n",
"# print(split_date)\n",
"# print(all_dates)\n",
"# val_data_split = train_data[train_data['trade_date'] >= split_date] # 验证集\n",
"\n",
"score_df = test_data\n",
"numeric_columns = score_df.select_dtypes(include=['float64', 'int64']).columns\n",
"numeric_columns = [col for col in numeric_columns if col in feature_columns]\n",
"# score_df.loc[:, numeric_columns] = scaler.transform(score_df[numeric_columns])\n",
"score_df = cross_sectional_standardization(score_df, numeric_columns)\n",
"\n",
"if use_pca and pca is not None:\n",
" categorical_feature = [col for col in feature_columns if 'cat' in col]\n",
" numeric_features = [col for col in feature_columns if col not in categorical_feature]\n",
" numeric_pca = pca.transform(score_df[numeric_features])\n",
" score_df = pd.concat([pd.DataFrame(numeric_pca), score_df[categorical_feature],\n",
" score_df[['trade_date', 'ts_code', 'future_return', 'future_score', 'label']]], axis=1)\n",
" score_df['score'] = model.predict(score_df[[col for col in score_df.columns if\n",
" col not in ['trade_date', 'ts_code', 'future_return', 'future_score',\n",
" 'label']]])\n",
"else:\n",
" score_df['score'] = model.predict(score_df[feature_columns])\n",
"# train_data['score'] = catboost_model.predict(train_data[feature_columns])\n",
"score_df = score_df.loc[score_df.groupby('trade_date')['score'].idxmax()]\n",
"# score_df = score_df[score_df['score'] > 0]\n",
"score_df[['trade_date', 'score', 'ts_code']].to_csv('predictions_test.tsv', index=False)\n",
"print(score_df['label'].mean())\n",
"print(score_df[['trade_date', 'ts_code', 'future_return', 'future_score', 'label']].head(10))"
],
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"33.37918215613383\n",
" trade_date ts_code future_return future_score label\n",
"244753 2023-01-03 002148.SZ 0.015781 0.035495 45.0\n",
"876303 2023-01-04 601155.SH 0.011962 0.027340 43.0\n",
"57142 2023-01-05 000596.SZ 0.006810 0.025770 42.0\n",
"423377 2023-01-06 002683.SZ 0.030527 0.042989 47.0\n",
"615161 2023-01-09 600197.SH -0.047347 -0.005790 26.0\n",
"771090 2023-01-10 600729.SH -0.040330 -0.005321 23.0\n",
"734311 2023-01-11 600603.SH -0.037655 -0.000025 15.0\n",
"717317 2023-01-12 600556.SH 0.005312 0.028766 42.0\n",
"163236 2023-01-13 001236.SZ 0.240337 0.174003 49.0\n",
"182872 2023-01-16 001339.SZ -0.045814 -0.015564 3.0\n"
]
}
],
"execution_count": 23
},
{
"cell_type": "code",
"id": "d86af99d15cb3bdd",
"metadata": {
"ExecuteTime": {
"end_time": "2025-03-31T14:59:50.861647Z",
"start_time": "2025-03-31T14:59:50.140899Z"
}
},
"source": [
"print(df[(df['ts_code'] == '603577.SH') & (df['trade_date'] >= '2018-06-04')][\n",
" ['trade_date', 'ts_code', 'close', 'open', 'future_return']])"
],
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" trade_date ts_code close open future_return\n",
"255411 2018-06-04 603577.SH 24.57 23.98 -0.044408\n",
"257982 2018-06-05 603577.SH 23.45 24.32 -0.037819\n",
"260550 2018-06-06 603577.SH 23.24 22.74 -0.052262\n",
"263114 2018-06-07 603577.SH 21.88 22.77 -0.028451\n",
"265676 2018-06-08 603577.SH 21.58 21.44 -0.002314\n",
"... ... ... ... ... ...\n",
"5105528 2025-03-24 603577.SH 20.82 20.67 -0.001921\n",
"5108613 2025-03-25 603577.SH 20.33 20.82 -0.005411\n",
"5111699 2025-03-26 603577.SH 20.78 20.33 -0.032771\n",
"5114784 2025-03-27 603577.SH 20.22 20.75 NaN\n",
"5117867 2025-03-28 603577.SH 20.07 20.20 NaN\n",
"\n",
"[1655 rows x 5 columns]\n"
]
}
],
"execution_count": 19
},
{
"cell_type": "code",
"id": "ef9d068e-67f7-412c-bbd8-cdee7492dbc9",
"metadata": {
"ExecuteTime": {
"end_time": "2025-03-31T14:59:51.110863Z",
"start_time": "2025-03-31T14:59:50.995929Z"
}
},
"source": [
"print(train_data[\"future_score\"].corr(train_data[\"label\"]))\n",
"print(test_data[\"future_score\"].corr(test_data[\"label\"]))\n"
],
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.7433127289155628\n",
"0.6971824619501555\n"
]
}
],
"execution_count": 20
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.11.11"
}
},
"nbformat": 4,
"nbformat_minor": 5
}