Files
NewStock/code/train/Rank.ipynb
2025-04-03 00:45:25 +08:00

1775 lines
212 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-04-02T14:12:37.373532Z",
"start_time": "2025-04-02T14:12:36.959182Z"
}
},
"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-04-02T14:13:37.437375Z",
"start_time": "2025-04-02T14:12:37.383638Z"
}
},
"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-04-02T14:13:49.617975Z",
"start_time": "2025-04-02T14:13:37.783573Z"
}
},
"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-04-02T14:13:49.892104Z",
"start_time": "2025-04-02T14:13:49.635085Z"
}
},
"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-04-02T15:03:19.084540Z",
"start_time": "2025-04-02T15:03:19.044068Z"
}
},
"source": [
"import numpy as np\n",
"import talib\n",
"\n",
"def get_rolling_factor(df):\n",
" old_columns = df.columns.tolist()[:]\n",
"\n",
"\n",
" # 按股票和日期排序(如果尚未排序)\n",
" df = df.sort_values(by=['ts_code', 'trade_date'])\n",
"\n",
" grouped = df.groupby('ts_code', group_keys=False)\n",
"\n",
" # 提前计算布尔掩码\n",
" window = 20\n",
" return_threshold = 0.0\n",
"\n",
" df['_is_upside'] = df['pct_chg'] > return_threshold\n",
" df['_is_downside'] = df['pct_chg'] < -return_threshold\n",
" \n",
" # 1. 上行波动率 (20日)\n",
" def rolling_upside_volatility(series, _is_upside, window):\n",
" # 提取正收益\n",
" positive_returns = series.where(_is_upside, np.nan)\n",
" # 计算滚动窗口标准差\n",
" return positive_returns.rolling(window=window, min_periods=2).std()\n",
" \n",
" df[f'upside_volatility_{window}'] = grouped.apply(\n",
" lambda x: rolling_upside_volatility(x['pct_chg'], x['_is_upside'], window)\n",
" ).reset_index(level=0, drop=True)\n",
" \n",
" # 2. 下行波动率 (20日)\n",
" def rolling_downside_volatility(series, _is_downside, window):\n",
" # 提取负收益\n",
" negative_returns = series.where(_is_downside, np.nan)\n",
" # 计算滚动窗口标准差\n",
" return negative_returns.rolling(window=window, min_periods=2).std()\n",
" \n",
" df[f'downside_volatility_{window}'] = grouped.apply(\n",
" lambda x: rolling_downside_volatility(x['pct_chg'], x['_is_downside'], window)\n",
" ).reset_index(level=0, drop=True)\n",
" \n",
" # 3. 上行/下行波动率比率 (20日)\n",
" df[f'volatility_ratio_{window}'] = df[f'upside_volatility_{window}'] / (df[f'downside_volatility_{window}'] + 1e-8)\n",
" \n",
" # 4. 上行半方差 (20日)\n",
" def rolling_upside_semi_variance(series, _is_upside, window, threshold):\n",
" # 提取正收益\n",
" positive_returns = series.where(_is_upside, np.nan)\n",
" # 计算平方偏差\n",
" squared_deviation = (positive_returns - threshold)**2\n",
" # 计算滚动窗口均值\n",
" return squared_deviation.rolling(window=window, min_periods=2).mean()\n",
" \n",
" df[f'upside_semi_variance_{window}'] = grouped.apply(\n",
" lambda x: rolling_upside_semi_variance(x['pct_chg'], x['_is_upside'], window, return_threshold)\n",
" ).reset_index(level=0, drop=True)\n",
" \n",
" # 5. 下行半方差 (20日)\n",
" def rolling_downside_semi_variance(series, _is_downside, window, threshold):\n",
" # 提取负收益\n",
" negative_returns = series.where(_is_downside, np.nan)\n",
" # 计算平方偏差\n",
" squared_deviation = (negative_returns - (-threshold))**2\n",
" # 计算滚动窗口均值\n",
" return squared_deviation.rolling(window=window, min_periods=2).mean()\n",
" \n",
" df[f'downside_semi_variance_{window}'] = grouped.apply(\n",
" lambda x: rolling_downside_semi_variance(x['pct_chg'], x['_is_downside'], window, return_threshold)\n",
" ).reset_index(level=0, drop=True)\n",
"\n",
" # 8. 正负收益天数比率 (20日)\n",
" df[f'positive_negative_days_ratio_{window}'] = grouped['pct_chg'].rolling(window=window, min_periods=2).apply(lambda x: np.sum(x > 0) / (np.sum(x < 0) + 1e-8)).reset_index(level=0, drop=True)\n",
"\n",
" # 9. 正收益幅度均值 (20日)\n",
" def average_positive_return_magnitude(series):\n",
" positive_returns = series[series > return_threshold]\n",
" if positive_returns.empty:\n",
" return 0\n",
" return positive_returns.mean()\n",
" df[f'avg_positive_return_magnitude_{window}'] = grouped['pct_chg'].rolling(window=window, min_periods=2).apply(average_positive_return_magnitude).reset_index(level=0, drop=True)\n",
"\n",
" # 10. 负收益幅度均值 (20日)\n",
" def average_negative_return_magnitude(series):\n",
" negative_returns = series[series < -return_threshold]\n",
" if negative_returns.empty:\n",
" return 0\n",
" return np.abs(negative_returns.mean())\n",
" df[f'avg_negative_return_magnitude_{window}'] = grouped['pct_chg'].rolling(window=window, min_periods=2).apply(average_negative_return_magnitude).reset_index(level=0, drop=True)\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": 20
},
{
"cell_type": "code",
"id": "53f86ddc0677a6d7",
"metadata": {
"jupyter": {
"source_hidden": true
},
"scrolled": true,
"ExecuteTime": {
"end_time": "2025-04-02T15:03:25.185749Z",
"start_time": "2025-04-02T15:03:19.095058Z"
}
},
"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": 21
},
{
"cell_type": "code",
"id": "dbe2fd8021b9417f",
"metadata": {
"ExecuteTime": {
"end_time": "2025-04-02T15:03:25.217714Z",
"start_time": "2025-04-02T15:03:25.211561Z"
}
},
"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']\n"
]
}
],
"execution_count": 22
},
{
"cell_type": "code",
"id": "85c3e3d0235ffffa",
"metadata": {
"ExecuteTime": {
"end_time": "2025-04-02T15:03:25.263787Z",
"start_time": "2025-04-02T15:03:25.256627Z"
}
},
"source": [
"print(df[df['is_st']][['ts_code', 'trade_date', 'is_st']])"
],
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Empty DataFrame\n",
"Columns: [ts_code, trade_date, is_st]\n",
"Index: []\n"
]
}
],
"execution_count": 23
},
{
"cell_type": "code",
"id": "92d84ce15a562ec6",
"metadata": {
"ExecuteTime": {
"end_time": "2025-04-02T15:26:42.881004Z",
"start_time": "2025-04-02T15:03:25.275794Z"
}
},
"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",
" if 'in_date' in df.columns:\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: 123 entries, ts_code to mv_momentum\n",
"dtypes: bool(12), datetime64[ns](1), float64(106), int32(1), int64(1), object(2)\n",
"memory usage: 4.3+ GB\n",
"None\n"
]
}
],
"execution_count": 24
},
{
"cell_type": "code",
"id": "b87b938028afa206",
"metadata": {
"ExecuteTime": {
"end_time": "2025-04-02T15:26:44.711178Z",
"start_time": "2025-04-02T15:26:43.785812Z"
}
},
"source": [
"from scipy.stats import ks_2samp, wasserstein_distance\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": 25
},
{
"cell_type": "code",
"id": "f4f16d63ad18d1bc",
"metadata": {
"ExecuteTime": {
"end_time": "2025-04-02T15:26:44.722470Z",
"start_time": "2025-04-02T15:26:44.717192Z"
}
},
"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": 26
},
{
"cell_type": "code",
"id": "40e6b68a91b30c79",
"metadata": {
"jupyter": {
"source_hidden": true
},
"ExecuteTime": {
"end_time": "2025-04-02T15:26:45.656660Z",
"start_time": "2025-04-02T15:26:44.774542Z"
}
},
"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",
"\n",
"import pandas as pd\n",
"from sklearn.preprocessing import StandardScaler\n",
"\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",
"\n",
"import numpy as np\n",
"import pandas as pd\n",
"import statsmodels.api as sm\n",
"\n",
"from concurrent.futures import ProcessPoolExecutor\n",
"\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()\n",
"\n",
"\n",
"def mad_filter(df, features, n=3):\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",
"\n",
"def percentile_filter(df, features, lower_percentile=0.01, upper_percentile=0.99):\n",
" for col in features:\n",
" # 按日期分组计算上下百分位数\n",
" lower_bound = df.groupby('trade_date')[col].transform(\n",
" lambda x: x.quantile(lower_percentile)\n",
" )\n",
" upper_bound = df.groupby('trade_date')[col].transform(\n",
" lambda x: x.quantile(upper_percentile)\n",
" )\n",
" # 截断超出范围的值\n",
" df[col] = np.clip(df[col], lower_bound, upper_bound)\n",
" return df\n",
"\n",
"\n",
"from scipy.stats import iqr\n",
"\n",
"\n",
"def iqr_filter(df, features):\n",
" for col in features:\n",
" df[col] = df.groupby('trade_date')[col].transform(\n",
" lambda x: (x - x.median()) / iqr(x) if iqr(x) != 0 else x\n",
" )\n",
" return df\n",
"\n",
"\n",
"def quantile_filter(df, features, lower_quantile=0.01, upper_quantile=0.99, window=60):\n",
" df = df.copy()\n",
" for col in features:\n",
" # 计算 rolling 统计量,需要按日期进行 groupby\n",
" rolling_lower = df.groupby('trade_date')[col].transform(lambda x: x.rolling(window=min(len(x), window)).quantile(lower_quantile))\n",
" rolling_upper = df.groupby('trade_date')[col].transform(lambda x: x.rolling(window=min(len(x), window)).quantile(upper_quantile))\n",
"\n",
" # 对数据进行裁剪\n",
" df[col] = np.clip(df[col], rolling_lower, rolling_upper)\n",
" \n",
" return df\n"
],
"outputs": [],
"execution_count": 27
},
{
"cell_type": "code",
"id": "47c12bb34062ae7a",
"metadata": {
"ExecuteTime": {
"end_time": "2025-04-02T15:52:19.994776Z",
"start_time": "2025-04-02T15:47:05.010739Z"
}
},
"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')['pct_chg']\n",
" .transform(lambda x: x.rolling(days).std().shift(-days))\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'] <= '2024-03-01') & (df['trade_date'] >= '2000-01-01')]\n",
"test_data = df[(df['trade_date'] >= '2024-03-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",
" 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",
"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 = quantile_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 = quantile_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",
"all_dates = train_data['trade_date'].unique() # 获取所有唯一的 trade_date\n",
"split_date = all_dates[-validation_days] # 划分点为倒数第 validation_days 天\n",
"train_data_split = train_data[train_data['trade_date'] < split_date] # 训练集\n",
"val_data_split = train_data[train_data['trade_date'] >= split_date] # 验证集\n",
"\n",
"feature_columns, _ = remove_shifted_features(\n",
" train_data_split,\n",
" val_data_split,\n",
" feature_columns)\n",
"\n",
"feature_columns = remove_highly_correlated_features(train_data,\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: 114\n",
"去极值\n",
"去极值\n",
"检测到 13 个可能漂移的特征: ['vol', 'pct_chg', 'turnover_rate', 'obv', 'log(circ_mv)', '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', 'upside_volatility_20', 'downside_volatility_20', 'volatility_ratio_20', 'upside_semi_variance_20', 'downside_semi_variance_20', 'positive_negative_days_ratio_20', 'avg_positive_return_magnitude_20', 'avg_negative_return_magnitude_20', 'return_skew', 'return_kurtosis', 'volume_change_rate', 'cat_volume_breakout', 'turnover_deviation', 'cat_turnover_spike', 'avg_volume_ratio', 'cat_volume_ratio_breakout', 'vol_spike', 'vol_std_5', 'atr_14', 'maobv_6', 'rsi_3', 'return_5', 'return_20', 'std_return_5', 'std_return_90', 'act_factor1', 'act_factor2', 'act_factor3', 'act_factor4', 'rank_act_factor1', 'rank_act_factor2', 'rank_act_factor3', 'cov', 'delta_cov', '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",
"1107768\n",
"最小日期: 2018-06-04\n",
"最大日期: 2024-03-01\n",
"191955\n",
"最小日期: 2024-03-01\n",
"最大日期: 2025-03-28\n"
]
}
],
"execution_count": 42
},
{
"cell_type": "code",
"id": "8f134d435f71e9e2",
"metadata": {
"jupyter": {
"source_hidden": true
},
"ExecuteTime": {
"end_time": "2025-04-02T15:52:20.199221Z",
"start_time": "2025-04-02T15:52:20.184447Z"
}
},
"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",
" # 计算每个 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": 43
},
{
"cell_type": "code",
"id": "c6eb5cd4-e714-420a-ac48-39af3e11ee81",
"metadata": {
"ExecuteTime": {
"end_time": "2025-04-02T16:43:22.759100Z",
"start_time": "2025-04-02T16:41:20.073261Z"
}
},
"source": [
"print('train data size: ', len(train_data))\n",
"\n",
"label_gain = list(range(len(train_data['label'].unique())))\n",
"label_gain = [gain for gain in label_gain]\n",
"light_params = {\n",
" 'label_gain': label_gain,\n",
" 'objective': 'lambdarank',\n",
" 'metric': 'ndcg',\n",
" 'learning_rate': 0.1,\n",
" 'num_leaves': 1024,\n",
" 'min_data_in_leaf': 128,\n",
" 'max_depth': 8,\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': 'goss',\n",
" 'verbosity': -1,\n",
" 'extra_trees': True,\n",
" 'max_position': 5,\n",
" 'ndcg_at': 1,\n",
" 'quant_train_renew_leaf': True,\n",
" 'lambdarank_truncation_level': 1,\n",
" 'lambdarank_position_bias_regularization': 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: 1107768\n",
"feature_contri: [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, 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, 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",
"原始训练集大小: 1107768\n",
"划分后的训练集大小: 1017570, 验证集大小: 90198\n",
"feature_columns size: 94\n",
"Training until validation scores don't improve for 50 rounds\n",
"Early stopping, best iteration is:\n",
"[26]\ttrain's ndcg@1: 0.527242\tvalid's ndcg@1: 0.572077\n",
"Evaluated only: ndcg@1\n"
]
},
{
"data": {
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
],
"image/png": "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nTqV3r174+npWW4gC3DjjTcyc+ZMJk2axIABAzhw4ADffPMNrVq1stNZVU9UVBS33nor8+fPJykpyToN3vJ9qU/FMkXjJQGQEA3IggULiIqK4qOPPuL555/HycmJiIgI7rnnHq666irrfi+//DIxMTG88cYbpKenM2TIkEoHQAAPPPAAgYGB/O9//2PWrFkYDAY6dOjAv/71r3Jf161bN/744w+mTp3Kyy+/TPPmzZkxYwZxcXElAqCXX36Zixcv8uOPP/L9999z/fXXs3LlyjKTve0tKiqKlStX8vTTT/PSSy8RFhbGzJkzOXLkCEePHq3w9Y899hh79+7l888/Z968eYSHh1cYAD3//PNkZmayePFilixZQs+ePVm+fDnPPfecvU6r2r788kuCg4P59ttv+eWXXxg+fDhLliyhffv29aLqthCKKlltQghRaWPGjOHQoUOl5jI1Vnv37iUyMpKvv/6a8ePHO7o5QpRLcoCEEKICVy6keuLECVasWGFdQqQxKm1x2fnz56PT6Rg8eLADWiRE5cgQmBBCVKBVq1ZMnDiRVq1aERMTw4cffoizszPPPvuso5vmMG+88Qa7du1i2LBhODk5sXLlSlauXMlDDz1EWFiYo5snRIVkCEwIISowadIk1q9fT3x8PC4uLvTv35/XXnuNnj17OrppDrNmzRpmzJjB4cOHycjIoEWLFtx777288MILssK8qBckABJCCCFEoyM5QEIIIYRodCQAEkIIIUSjIwO1pTCbzVy4cAEvLy8p6CWEEELUE6qqkp6eTmhoKDpd+X08EgCV4sKFCzKLQQghhKinzp49S/PmzcvdRwKgUnh5eQFw5swZmjRp4uDWOIbRaGT16tXW5RQaK7kOcg1ArgHINbCQ61C3r0FaWhphYWHW/+PlkQCoFJZhLy8vL7y9vR3cGscwGo24u7vj7e1d537Aa5NcB7kGINcA5BpYyHWoH9fAlvQVSYIWQgghRKMjAZAQQgghGh0JgIQQQgjR6EgOkBBCCFFLzGYzeXl5jm5GtRiNRpycnMjJycFkMtXqexsMBvR6vV2OJQGQEEIIUQvy8vI4c+YMZrPZ0U2pFlVVCQ4O5uzZsw6plefr60twcHC131sCICGEEKKGqapKXFwcer2esLCwCov01WVms5mMjAw8PT1r9TxUVSUrK4vExEQAQkJCqnU8CYCE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"
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
],
"image/png": "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cqJixYr4+fmRkpKi3ufl5cXatWu5efMmSqWSqKgo7t+/T4sWLYovYEChUqlUxRqBEC/Bzz//TGhoKBcuXMDU1BRPT088PT0JDw/XKLd7925atGjBkSNH+PTTTzlz5gweHh5MnDiR999/n2PHjlG7du2nthUbG0vLli2Jjo5m0qRJnDp1iu3bt9OsWTNmz57N119/zbVr16hSpQqTJ0/mgw8+4OLFi1SoUEGjnj59+hAREYGrqyuBgYEEBgaq99WuXZvOnTsTEhICgEKh4Msvv2TLli3s3LmTMWPGALBx40ZGjRrF5MmTuXXrFu3bt2f58uVYWFg89Rju3buHhYUFmzZtokOHDurtdevWpX379kyfPh2VSoWTkxOjRo1i9OjRANy5cwd7e3siIiL46KOPntoGQFpaGlZWVlQatZYHBmbPLC8eMtZXMadBLmOP6JOVqyjucF4bkjftSc50I3nTTUnO28VZHZ5ZZsuWLaSnp1O1alWuXr1KaGgof//9N8eOHWPfvn00atSIjz/+mO3bt2NgYICpqSk//fQT3t7eLzzevM/vO3fuYGlp+dSyBi+8dSFeMVevXqVHjx7MmTOHLl26cPfuXfbt20fv3r1JSUkhLS2NFStWAGBtbU16ejodO3akbdu2rF69muTkZIYPH651u+PHjyc8PJyKFStSpkwZwsLCWL16NV999RVubm7s3buXjz/+GFtbW5o0acK6devo2rUriYmJWFpaYmJiolV7ISEhzJo1iwULFmBgYMB3331HUlISGzdu5LfffuPWrVt069aNWbNmMWPGjKfW9eDBA3JzcylVqpTGdhMTE/X80OTkZK5du0abNm3U+62srGjYsCGHDh0qsLORlZVFVlaW+nlaWhoAxnoq9PXlvEdhGeupNP4VhSN5057kTDeSN92U5LwVZkbCo5+37u7u1KlTh8qVK7N27VqcnJwIDg7m1q1bbN26FRsbG3755Re6devGrl27qFGjxkuPN490NsQb7+rVqzx48ID3338fFxcXAPV/OhMTE7KysnBwcFCXj4iIQKlU8u2331KqVCmqV6/OlStXGDx4sFbtTp06lbZt2wIPv2TPnDmTHTt24OXlBUDFihXZv38/y5Yto3nz5lhbWwNgZ2dH6dKltT7Onj170rdvX41tSqWSiIgI9UhGr1692Llz5zM7GxYWFnh5eTFt2jTc3d2xt7fnhx9+4NChQ1SuXBl4eNULAHt7e43X2tvbq/c9LiwsjNDQ0HzbJ3kqMTXNLdyBCrVp9ZTFHcJrSfKmPcmZbiRvuimJeYuOjtbpdXZ2duzcuZM2bdrw1VdfsWjRIu7fv8/ff/9N3bp1cXFxYcKECVp/h3mWzMzMQpeVzoZ449WqVYvWrVtTo0YNfHx88Pb25oMPPqBMmTIFlj9z5gw1a9bUOKuf10HQRr169dQ/X7hwgczMTHXnI092djaenp5a1/2s9vK4urpqTJlydHQkNTW1UPV9//33fPLJJ5QtWxZ9fX3q1KlDjx49nmuhWVBQECNHjlQ/T0tLw9nZmZYtW2JjY6NzvSVNTk4OMTExtG3bFkNDw+IO57UhedOe5Ew3kjfdSN60k56ezo0bN3jnnXfUswaaN2+Ou7u7uswXX3xBuXLl8PX1faFt581MKAzpbIg3nr6+PjExMRw8eJDt27ezePFiJk6cSFxcXJG2a2b2vzUI6enpAGzevJmyZctqlDM2Nn5qPXp6ejy+tKqg4ctH28vz+B9rhUKBUlm4M0aVKlViz549ZGRkkJaWhqOjI927d6dixYoA6tGgf//9F0dHR/Xr/v333yeuazE2Ni7weA0NDeWDRQeSN91I3rQnOdON5E03kreCjR49mk6dOuHi4sI///zDlClT0NfXp2fPnuqZBwEBAYSHh2NjY8PGjRvZsWMHv/322wvPpzb1ydWoRImgUCho3LgxoaGhHDt2DCMjIzZs2ICRkRG5uZrTd9zd3Tl58qTGFZUOHz78XO1Xq1YNY2NjUlJSqFy5ssbD2dkZACMjI4B88dja2nL16lX187S0NJKTk58rHm2YmZnh6OjIrVu32LZtG++99x4AFSpUwMHBgZ07d2rEFhcXp9NIkBBCCCGe7MqVK/To0YOqVavSrVs3bGxsOHz4MLa2thgYGLBp0yZsbW3p1KkTNWvWZNWqVaxcufKFj2poS0Y2xBsvLi6OnTt34u3tjZ2dHXFxcfz333+4u7tz//59tm3bRmJiIjY2NlhZWdGzZ08mTpzIgAEDCAoK4uLFi/muWqUtCwsLRo8ezYgRI1AqlTRp0oQ7d+5w4MABLC0t6dOnDy4uLigUCn777Td8fX0xMTHB3NycVq1aERERQadOnShdujTBwcHo6+u/oOw82bZt21CpVFStWpULFy4wZswY3n77bfW6EIVCQWBgINOnT8fNzY0KFSowefJknJycXpl7lwghhBBviqioqAK35812cHNzeyXuGP446WyIN56lpSV79+5lwYIFpKWl4eLiwty5c2nfvj316tUjNjaWevXqkZ6err707a+//sqgQYPw9PSkWrVqzJ49m65duz5XHNOmTcPW1pawsDD++usvSpcuTZ06dZgwYQIAZcuWJTQ0lPHjx9O3b1969+5NREQEQUFBJCcn07FjR6ysrJg2bdpLGdm4c+cOQUFBXLlyBWtra7p27cqMGTM0hk7Hjh1LRkYGAwcO5Pbt2zRp0oStW7fmu4qVEEIIIUomuc+GEKLY5F2n+/r167JAXAs5OTlER0fj6+sr85q1IHnTnuRMN5I33UjedFMcedPmPhuyZkMIIYQQQghRJKSzIYSWBg0ahLm5eYGPQYMGFXd4hZKSkvLEYzA3NyclJaW4QxRCCCHEG0DWbAihpalTpzJ69OgC9z1rKPFV4eTkxPHjx5+6XwghhBDieUlnQwgt2dnZYWdnV9xhPBcDAwP1ncCFEEIIIYqKTKMSQgghhBBCFAnpbAjxiouNjUWhUHD79u0ibysiIoLSpUurn4eEhDzxbuBCCCFKhlmzZqnvrZSnRYsWKBQKjcfrsm5RvFzS2RBCC2/6l+/u3btz7ty54g5DCCHEKyI+Pp5ly5ZRs2bNfPsGDBjA1atX1Y85c+YUQ4TiVSedDSGEmomJyWu/HkUIIcSLkZ6ejp+fH8uXL6dMmTL59puamuLg4KB+vC4XSREvl3Q2RImjVCqZM2cOlStXxtjYmPLlyzNjxgwAxo0bR5UqVTA1NaVixYpMnjyZnJwc4OEUo9DQUE6cOKEeMo6IiHhqWz179qR79+4a23JycnjrrbdYtWoVAFlZWQwbNgw7OztKlSpFkyZNiI+P1+nYLl26RKdOnShTpgxmZmZUr16d6Oho4H/TsTZv3kzNmjUpVaoU77zzDgkJCerXPz6N6nFJSUlUrFiRgIAAVCoVWVlZjB49mrJly2JmZkbDhg2JjY3VKXYhhBCvlqFDh9KhQwfatGlT4P41a9bw1ltv4eHhQVBQEJmZmS85QvE6kKtRiRInKCiI5cuXM3/+fJo0acLVq1c5e/YsABYWFkRERODk5MSpU6cYMGAAFhYWjB07lu7du5OQkMDWrVvZsWMHAFZWVk9ty8/Pjw8//JD09HTMzc0B2LZtG5mZmXTp0gWAsWPHsm7dOlauXImLiwtz5szBx8eHCxcuYG1trdWxDR06lOzsbPbu3YuZmRmnT59Wt5tnzJgxLFy4EAcHByZMmECnTp04d+7cM+86evLkSXx8fOjXrx/Tp08HICAggNOnTxMVFYWTkxMbNmygXbt2nDp1Cjc3t3x1ZGVlkZWVpX6elpYGQLPZO3hgaKbVsZZkxnoqptWDulO3kqVUFHc4rw3Jm/YkZ7p51fOWEOLzzDJr167l6NGjHDp0iJycHFQqFUqlUn0Crnv37pQvXx5HR0dOnTrFxIkTOXPmDD/99JPOceXVnfevKJziyJs2bSlUKpWqCGMR4pVy9+5dbG1tWbJkCf37939m+fDwcKKiovj999+Bh2s2Nm7c+NR7VDzqwYMHODo6Mm/ePHr16gU8HO1QKpVERUWRkZFBmTJliIiIoGfPnsDD/8Curq4EBgYyZswYYmNjadmyJbdu3XrqqANAzZo16dq1K1OmTMm3L6+eqKgo9WjLzZs3KVeuHBEREXTr1o2IiAgCAwPVi9HzjvfLL7+kY8eOTJw4kVGjRgEPbwxYsWJFUlJSNO7L0aZNGxo0aMDMmTPzxRASEkJoaGi+7ZGRkZiamj47oUIIIYrcf//9x+jRowkNDcXV1RWAiRMnUqFChSd+dp48eZLg4GCWLl2Ko6PjS4xWFIfMzEx69uzJnTt3njl9TkY2RIly5swZsrKyaN26dYH7165dy6JFi0hKSiI9PZ0HDx481xxUAwMDunXrxpo1a+jVqxcZGRls2rSJqKgo4OG0pJycHBo3bqx+jaGhIQ0aNODMmTNatzds2DAGDx7M9u3badOmDV27ds23qM/Ly0v9s7W1NVWrVn1qWykpKbRt25YZM2ZoXInk1KlT5ObmUqVKFY3yWVlZ2NjYFFhXUFAQI0eOVD9PS0vD2dmZ6cf0eGCor82hlmgPz5oqmfy73it51vRVJXnTnuRMN6963p41srFp0ybu3LmjPrkEkJuby+nTp9myZQvp6eno62v+zW7evDnBwcE4Ozvj7e2tU1w5OTnExMTQtm3bZ462i/8pjrzlzUwoDOlsiBLFxMTkifsOHTqEn58foaGh+Pj4YGVlRVRUFHPnzn2uNv38/GjevDmpqanExMRgYmJCu3btnqvOJ+nfvz8+Pj5s3ryZ7du3ExYWxty5c/nss890rtPW1hYnJyd++OEHPvnkE3XnK+/D5ujRo/k+dB6fupXH2NgYY2PjfNv3jmvzxA6KyC8nJ4fo6GiOBreTD2QtSN60JznTzeueNx8fH06dOqWxrW/fvrz99tuMGzeOUqVK5XvNn3/+CYCzs/NzH7OhoeFrmbfi9jLzpk07skBclChubm6YmJiwc+fOfPsOHjyIi4sLEydOpF69eri5uXHp0iWNMkZGRuTm5mrVZqNGjXB2dmbt2rWsWbOGDz/8UP2ftFKlShgZGXHgwAF1+ZycHOLj46lWrZoOR/jwD/2gQYNYv349o0aNYvny5Rr7Dx8+rP751q1bnDt3Dnd39yfWZ2Jiwm+//UapUqXw8fHh7t27AHh6epKbm0tqaiqVK1fWeDg4OOgUuxBCiOJnYWGBh4eHxsPMzAwbGxs8PDxISkpi2rRpHD16lIsXL/LLL7/Qu3dvmjVrVuAlckXJJiMbokQpVaoU48aNY+zYsRgZGdG4cWP+++8//vzzT9zc3EhJSSEqKor69euzefNmNmzYoPF6V1dXkpOTOX78OOXKlcPCwqLAM/WP69mzJ1999RXnzp1j9+7d6u1mZmYMHjyYMWPGYG1tTfny5ZkzZw6ZmZn069dP6+MLDAykffv2VKlShVu3brF79+58HYmpU6diY2ODvb09EydO5K233qJz585PrdfMzIzNmzfTvn172rdvz9atW6lSpQp+fn707t2buXPn4unpyX///cfOnTupWbMmHTp00Dp+IYQQrz4jIyN27NjBggULyMjIwNnZma5duzJp0qTiDk28gqSzIUqcyZMnY2BgQHBwMP/88w+Ojo4MGjSIfv36MWLECAICAsjKyqJDhw5MnjyZkJAQ9Wu7du3K+vXradmyJbdv32bFihX4+/s/s00/Pz9mzJiBi4uLxvoMeHhnVqVSSa9evbh79y716tVj27ZtBV7T/Flyc3MZOnQoV65cwdLSknbt2jF//vx87Q0fPpzz589Tu3Ztfv31V4yMjJ5Zt7m5OVu2bMHHx4cOHToQHR3NihUrmD59OqNGjeLvv//mrbfe4p133qFjx45axy6EEOLV9ehlzZ2dndmzZ0/xBSNeK3I1KiFKCG2uavWypKWlYWVlxfXr12XNhhby5oP7+vrKvGYtSN60JznTjeRNN5I33RRH3vI+vwtzNSpZsyGEEEIIIYQoEtLZEOI5rFmzBnNz8wIf1atXf+HttW/f/ontFXRfCyGEEEKI4iRrNoR4Du+++y4NGzYscF9RDGV+88033Lt3r8B9z7rbeIsWLZBZk0IIIYR4maSzIcRzsLCwwMLC4qW1V7Zs2ZfWlhBCCCHE85JpVEIIIYQQQogiIZ0NIYQQQog33KxZs1AoFAQGBqq3ffrpp1SqVAkTExNsbW157733OHv2bPEFKd5I0tkoJiEhIdSuXfupZS5evIhCoeD48eMvJSZR9GJjY1EoFNy+ffuF1y3vFyGEEAWJj49n2bJl+e7uXbduXVasWMGZM2fYtm0bKpUKb29vcnNziylS8SaSzkYxGT16NDt37lQ/9/f3z3cXZ2dnZ65evYqHh8dLjk47hek4iYcaNWrE1atXsbKyAiAiIuKVuefF48LCwqhfvz4WFhbY2dnRuXNnEhMTNcrcv3+foUOHYmNjg7m5OV27duXff/8tpoiFEEI8Lj09HT8/P5YvX57vZrEDBw6kWbNmuLq6UqdOHaZPn87ly5e5ePFi8QQr3kjS2Sgm5ubmz7yJmb6+Pg4ODhgYFM86/uzs7Jfankql4sGDBy+1zZfNyMgIBwcHFApFcYfyTHv27GHo0KEcPnyYmJgYcnJy8Pb2JiMjQ11mxIgR/Prrr/z000/s2bOHf/75h/fff78YoxZCCPGooUOH0qFDB9q0afPUchkZGaxYsYIKFSrg7Oz8kqITJcErezWqrVu3Mn36dBISEtDX18fLy4uFCxdSqVIlGjVqRNOmTZk9e7a6/H///YeTkxM7d+6kWbNmXL16lf79+7Nr1y4cHByYMWMGEyZMIDAwUGO+4pMoFAq+/PJLfvnlF2JjY3F0dGTOnDl88MEH6jKnTp1i+PDhHDp0CFNTU7p27cq8efMwNzcHHk6ZGTt2LH/++SeGhoZUr16dyMhIXFxcCAkJYePGjRw/fpyQkBBWrlypbhdg9+7duLq6UqFCBY4dO0bNmjUpX748EydOZPDgweoYjh07Rt26dUlOTsbFxYXbt28zevRoNm3aRFZWFvXq1WP+/PnUqlXrmcecF1NAQAAzZszg0qVLKJXKp9YZERFBaGioRuwrVqygRYsW6tjzRj1u375NmTJl2L17Ny1atFDf0To6OppJkyZx6tQptm/fTkhICDVr1qRUqVJ88803GBkZMWjQIEJCQp55DHlxfPXVV/z666/s2rULFxcXvvvuO2xtbenfvz/x8fHUqlWL77//nkqVKgGQlJTEyJEjOXz4MBkZGbi7uxMWFqbxx7kw7ymFQsHy5cvZvHkz27Zto2zZssydO5d3331X/Z7Iu4v38ePH6du3r0bupkyZQkhICAqFgg0bNmiMdpUuXZoFCxbg7+8PwJEjR/j00085c+YMHh4eTJw4MV8uEhISGDNmDPv27cPMzAxvb2/mz5/PW2+99cw8bt26VeN5REQEdnZ2HD16lGbNmnHnzh2+/fZbIiMjadWqFfDwd+/u7s7hw4d55513CvHbeqhh2E4eGJgVunxJZ6yvYk4D8AjZRlbuq99xfVVI3rQnOdNNUeft4qwOhSoXFRXFH3/8QXx8/BPLfPnll4wdO5aMjAyqVq1KTEwMRkZGLypUIV7dzkZGRgYjR46kZs2apKenExwcTJcuXTh+/Dh+fn7MmTNHvdgJYO3atTg5OdG0aVMAevfuzfXr14mNjcXQ0JCRI0eSmpqqVQyTJ09m1qxZLFy4kO+//56PPvqIU6dO4e7uTkZGBj4+Pnh5eREfH09qair9+/cnICCAiIgIHjx4QOfOnRkwYAA//PAD2dnZHDlypMAz2qNHj+bMmTOkpaWxYsUK4OE9E/755x91GT09PXr06EFkZKRGZ2PNmjU0btwYFxcXAD788ENMTEzYsmULVlZWLFu2jNatW3Pu3Lln3ocB4MKFC6xbt47169ejr6//zDq7d+9OQkICW7duZceOHQBYWVlpNZVm/PjxhIeHU7FiRfUQ78qVKxk5ciRxcXEcOnQIf39/GjduTNu2bQtV57Rp05g3bx7z5s1j3Lhx9OzZk4oVKxIUFET58uX55JNPCAgIYMuWLcDDYWZfX19mzJiBsbExq1atolOnTiQmJlK+fHmg8O+p0NBQ5syZw+eff87ixYvx8/Pj0qVL+fLfqFEjFixYQHBwsHp6Ul5H9VnS09Pp2LEjbdu2ZfXq1SQnJzN8+HCNMrdv36ZVq1b079+f+fPnc+/ePcaNG0e3bt3YtWtXodp51J07d4D/3c/j6NGj5OTkaHTI3n77bcqXL8+hQ4cK7GxkZWWRlZWlfp6WlgaAsZ4KfX25B0hhGeupNP4VhSN5057kTDdFnbecnJxnlrl8+TLDhw8nOjoafX19cnJyUKlUKJVKjdd369aNFi1acO3aNebNm8eHH37Inj17KFWqVJHE/jR5cRXm+MT/FEfetGnrle1sdO3aVeN53pnp06dP061bNwIDA9m/f7+6cxEZGUmPHj1QKBScPXuWHTt2EB8fT7169YCHN0Nzc3PTKoYPP/yQ/v37Aw+/vMbExLB48WK+/PJLIiMjuX//PqtWrcLM7OEZ2SVLltCpUydmz56NoaEhd+7coWPHjuqz5+7u7gW2Y25ujomJCVlZWTg4ODwxHj8/P+bOnUtKSgrly5dHqVQSFRXFpEmTANi/fz9HjhwhNTUVY2NjAMLDw9m4cSM///wzAwcOfOYxZ2dns2rVKmxtbQtdp7m5OQYGBk+N/WmmTp2arxNRs2ZNpkyZAoCbmxtLlixh586dhe5s9O3bl27dugEwbtw4vLy8mDx5Mj4+PgAMHz5cPaoAUKtWLY3Rn2nTprFhwwZ++eUXAgICtHpP+fv706NHDwBmzpzJokWLOHLkCO3atdMoZ2RkhJWVFQqFQuvcRUZGolQq+fbbbylVqhTVq1fnypUrGh3RJUuW4OnpqXFn8e+++w5nZ2fOnTtHlSpVCt2eUqkkMDCQxo0bq9cQXbt2DSMjo3xrTuzt7bl27VqB9YSFhalHwh41yVOJqaksSNTWtHrK4g7htSR5057kTDdFlbfo6Ohnljl8+DCpqak0aNBAvU2pVLJv3z6++OILfvrpJ/VJxTz+/v58/PHHhISE0KxZsxced2HFxMQUW9uvs5eZt8zMzEKXfWU7G+fPnyc4OJi4uDiuX7+OUvnwP2xKSgoeHh54e3uzZs0amjZtSnJyMocOHWLZsmUAJCYmYmBgQJ06ddT1Va5cOd/CqGfx8vLK9zzvSj9nzpyhVq1a6o4GQOPGjVEqlSQmJtKsWTP8/f3x8fGhbdu2tGnThm7duuHo6KhLOgCoXbs27u7uREZGMn78ePbs2UNqaioffvghACdOnCA9PT3fWpB79+6RlJRUqDZcXFzUHY0XVeez5H15f9TjV8xwdHTUamTq0dfb29sDUKNGDY1t9+/fJy0tDUtLS9LT0wkJCWHz5s1cvXqVBw8ecO/ePVJSUgDt3lOPtm1mZoalpaXWo2rPcubMGfVUszyPv19PnDjB7t27CxwtSUpK0qqzMXToUBISEti/f7/uQQNBQUGMHDlS/TwtLQ1nZ2emH9PjgaH+U14pHmWsp2JaPSWTf9cjSylTWwpL8qY9yZluijpvCSE+zyzTtGlT9Um3PAMGDKBq1aqMHj26wIvPZGVloaenR7Vq1fD19X1h8RZWTk4OMTExtG3bFkNDw5fe/uuqOPKWNzOhMF7ZzkanTp1wcXFh+fLlODk5oVQq8fDwUC9a9vPzY9iwYSxevJjIyEhq1Kih8WXyVbBixQqGDRvG1q1bWbt2LZMmTSImJkarueyP8/PzU3c2IiMjadeunbojkJ6ejqOjI7GxsfleV9grHj3aeXqeOvX0Hl57QKX63xDyk4bcHm8TyPefRaFQqDuchfHo6/OmrhW0La/O0aNHExMTQ3h4OJUrV8bExIQPPvhAp0Xyzxt73msezR1oPzyanp6uHml7nDad3oCAAH777Tf27t1LuXLl1NsdHBzIzs7m9u3bGu+Ff//994kjNcbGxuoRskftHdfmmRdMEP+Tk5NDdHQ0R4PbyQeyFiRv2pOc6eZVyJu1tXW+6bvm5ubY2tri6enJX3/9xdq1a/H29sbW1pYrV64wa9YsTExM6NSpU7H+vg0NDeX9poOXmTdt2nklr0Z148YNEhMTmTRpEq1bt8bd3Z1bt25plHnvvfe4f/8+W7duJTIyEj8/P/W+qlWr8uDBA44dO6beduHChXx1PMvhw4fzPc+bCuXu7s6JEyc0rsxz4MAB9PT0qFq1qnqbp6cnQUFBHDx4EA8PDyIjIwtsy8jIqFDXte7ZsycJCQkcPXqUn3/+WeO469Spw7Vr1zAwMKBy5coaj8IsCC5IYeosKPa80ZGrV6+qt73K9384cOAA/v7+dOnShRo1auDg4KBx6b8X9Z563JN+77a2thq5O3/+vMaQpbu7OydPnuT+/fvqbY+/X+vUqcOff/6Jq6trvt9dQR28x6lUKgICAtiwYQO7du2iQoUKGvvr1q2LoaGhxiWcExMTSUlJyTfKIoQQ4tVSqlQp9u3bh6+vL5UrV6Z79+5YWFhw8OBB7Ozsijs88QZ5JTsbZcqUwcbGhq+//poLFy6wa9cujakX8PBseOfOnZk8eTJnzpxRz5GHh4tU27Rpw8CBAzly5AjHjh1j4MCBmJiYaHXJ0Z9++onvvvuOc+fOMWXKFI4cOUJAQADwcIShVKlS9OnTh4SEBHbv3s1nn31Gr169sLe3Jzk5maCgIA4dOsSlS5fYvn0758+ff+K6DVdXV06ePEliYiLXr19/4llsV1dXGjVqRL9+/cjNzVVf5QigTZs2eHl50blzZ7Zv387Fixc5ePAgEydO5Pfffy/0cT+qMHW6urqSnJzM8ePHuX79OllZWZiYmPDOO+8wa9Yszpw5w549e9RrS15Fbm5urF+/nuPHj3PixAl69uypMRrxot5Tj3N1dSU9PZ2dO3dy/fp1dYeiVatWLFmyhGPHjvH7778zaNAgjbMIPXv2RKFQMGDAAE6fPk10dDTh4eEadQ8dOpSbN2/So0cP4uPjSUpKYtu2bfTt27dQHduhQ4eyevVqIiMjsbCw4Nq1a1y7do179+4BDy8E0K9fP0aOHMnu3bs5evQoffv2xcvL67lG74QQQhSN2NhYFixYAICTkxPR0dH8+++/ZGdnc/nyZdasWaNxwlSIF+GV7Gzo6ekRFRXF0aNH8fDwYMSIEXz++ef5yvn5+XHixAmaNm2qvmJQnlWrVmFvb0+zZs3o0qULAwYMwMLCQqurK4SGhhIVFUXNmjVZtWoVP/zwA9WqVQPA1NSUbdu2cfPmTerXr88HH3xA69atWbJkiXr/2bNn6dq1K1WqVGHgwIEMHTqUTz/9tMC28uZR1qtXD1tbWw4cOPDEuPKOu0uXLpiYmKi3KxQKoqOjadasGX379qVKlSp89NFHXLp0Sb1uQVuFqbNr1660a9eOli1bYmtryw8//AA8XIz84MED6tatS2BgINOnT9cphpdh3rx5lClThkaNGtGpUyd8fHw01mfAi3lPPa5Ro0YMGjSI7t27Y2try5w5cwCYO3cuzs7ONG3alJ49ezJ69GhMTU3VrzM3N+fXX3/l1KlTeHp6MnHixHzTpZycnDhw4AC5ubl4e3tTo0YNAgMDKV26tHqa29MsXbqUO3fu0KJFCxwdHdWPtWvXqsvMnz+fjh070rVrV5o1a4aDgwPr16/XOR9CCCGEeLMoVI9PDH9DXblyBWdnZ3bs2EHr1q2fWb6g+xwI8Sht31Miv7S0NKysrLh+/bqs2dBC3nxwX19fmdesBcmb9iRnupG86UbyppviyFve5/edO3ewtLR8atlXdoH489q1axfp6enUqFGDq1evMnbsWFxdXYv1Um7i9SbvKSGEEEII7byS06hehJycHCZMmED16tXp0qULtra26puxrVmzBnNz8wIf1atXL+7Qi0z16tWfeNxr1qwp7vAKpTh/d097T71uUlJSnphHc3Nz9SV/hRBCCCGexxs7suHj46O+gdvj3n33XRo2bFjgvrwvjm/i7LLo6OgnLjzXdU3Hy1aY311Redp76nXj5OT01KuDOTk5vbxghBBCCPHGemM7G09jYWGBhYVFcYfx0rm4uBR3CM+tpP7uXrS8SxkLIYQQQhSlN3YalRBCCCGEEKJ4SWdDCCGEEOIVMGvWLBQKBYGBgept9+/fZ+jQodjY2GBubk7Xrl35999/iy9IIbQknQ0hSojY2FgUCgW3b98u7lCEEEI8Jj4+nmXLllGzZk2N7SNGjODXX3/lp59+Ys+ePfzzzz+8//77xRSlENqTzoYQQgghRDFKT0/Hz8+P5cuXU6ZMGfX2O3fu8O233zJv3jxatWpF3bp1WbFiBQcPHuTw4cPFGLEQhSedDfHaaNGiBZ999hmBgYGUKVMGe3t7li9fTkZGBn379sXCwoLKlSuzZcsWlEol5cqVY+nSpRp1HDt2DD09PS5duvTM9hQKBcuWLaNjx46Ympri7u7OoUOHuHDhAi1atMDMzIxGjRqRlJSk8bqlS5dSqVIljIyMqFq1Kt9///0LqXfTpk3UqVOHUqVKUbFiRUJDQ3nw4IFGvd988w1dunTB1NQUNzc3fvnlFwAuXrxIy5YtAShTpgwKhQJ/f38AXF1dWbBggUZbtWvXJiQk5LljFkII8WxDhw6lQ4cOtGnTRmP70aNHycnJ0dj+9ttvU758eQ4dOvSywxRCJyXyalTi9bVy5UrGjh3LkSNHWLt2LYMHD2bDhg106dKFCRMmMH/+fHr16kVKSgo9evQgMjKSwYMHq1+/Zs0aGjduXOgrc02bNo158+Yxb948xo0bR8+ePalYsSJBQUGUL1+eTz75hICAALZs2QLAhg0bGD58OAsWLKBNmzb89ttv9O3bl3Llyqm/7OtS7759++jduzeLFi2iadOmJCUlMXDgQACmTJmirjc0NJQ5c+bw+eefs3jxYvz8/Lh06RLOzs6sW7eOrl27kpiYiKWlJSYmJlrlXtuYtdEwbCcPDMy0fl1JZayvYk4D8AjZRlauorjDeW1I3rQnOdNNXt4KIyoqij/++IP4+Ph8+65du4aRkRGlS5fW2G5vb8+1a9deQKRCFD3pbIjXSq1atZg0aRIAQUFBzJo1i7feeosBAwYAEBwczNKlSzl58iR+fn7MnTuXlJQUypcvj1KpJCoqSv36wujbty/dunUDYNy4cXh5eTF58mT1/TaGDx9O37591eXDw8Px9/dnyJAhAIwcOZLDhw8THh6u0dnQtt7Q0FDGjx9Pnz59AKhYsSLTpk1j7NixGp0Nf39/evToAcDMmTNZtGgRR44coV27dlhbWwNgZ2eX74OrKHJRkKysLLKystTP09LSADDWU6Gv/+bd26aoGOupNP4VhSN5057kTDd5+XrSva3yXL58meHDhxMdHY2+vj45OTmoVCqUSiU5OTnq0evH61GpVOTm5j6z/tdN3vG8acdV1Iojb9q0JZ0N8Vp5dOGcvr4+NjY21KhRQ70t7+aEqampvPvuu7i7uxMZGcn48ePZs2cPqampfPjhhzq1l1f34+3dv3+ftLQ0LC0tOXPmjHrEIU/jxo1ZuHDhc9V74sQJDhw4wIwZM9RlcnNzuX//PpmZmZiamuar18zMDEtLS1JTUwt9vE+jbcwFCQsLIzQ0NN/2SZ5KTE1zX0icJcm0esriDuG1JHnTnuRMNzExMU/df/jwYVJTU2nQ4H/DIEqlkn379vHFF18wZcoUsrOz+fHHHzE3N1eXuXTpErdu3SI6OrrIYi9Oz8qbKNjLzFtmZmahy0pnQ7xWHr9LuEKh0NimUDwc5lcqH34w+vn5qTsbkZGRtGvXDhsbG53ay6v7ae0VVb3p6emEhoYWeAWSUqVKFVhvXj3Pik1PTw+VSvOsZUFnLF5ELoKCghg5cqT6eVpaGs7OzrRs2VKr30tJl5OTQ0xMDG3bts33OxdPJnnTnuRMN4XNW9OmTdUjxnkGDBhA1apVGT16NM7OzkyfPh0DAwN8fX0BSExM5L///qNv3740bNiwSI/jZZP3m26KI295MxMKQzob4o3Ws2dPJk2axNGjR/n555/56quvirQ9d3d3Dhw4oJ7uBHDgwAGqVav2XPXWqVOHxMTE57rrt5GREfBwRORRtra2XL16Vf08LS2N5ORkndt5GmNjY4yNjfNtNzQ0lA8WHUjedCN5057kTDfPypu1tbV6imsec3NzbG1t8fT0BKBfv36MHTsWOzs7LC0t+eyzz/Dy8qJJkyZFGntxkvebbl5m3rRpRzob4o3m6upKo0aN6NevH7m5ubz77rtF2t6YMWPo1q0bnp6etGnThl9//ZX169ezY8eO56o3ODiYjh07Ur58eT744AP09PQ4ceIECQkJTJ8+vVB1uLi4oFAo+O233/D19cXExARzc3NatWpFREQEnTp1onTp0gQHB6Ovr/9c8QohhHgx5s+fj56eHl27diUrKwsfHx++/PLL4g5LiEKTS9+KN56fnx8nTpygS5cuWl+BSVudO3dm4cKFhIeHU716dZYtW8aKFSto0aLFc9Xr4+PDb7/9xvbt26lfvz7vvPMO8+fPL/RVtQDKli2rXmhub29PQEAA8HBqU/PmzenYsSMdOnSgc+fOVKpU6bniFUIIoZvY2FiNy5GXKlWKL774gps3b5KRkcH69etxcHAovgCF0JJC9fhkbSGEeEnS0tKwsrLi+vXrsmZDCzk5OURHR+Pr6ytTDbQgedOe5Ew3kjfdSN50Uxx5y/v8vnPnzhMvCpNHRjaEEEIIIYQQRUI6G6JEWrNmDebm5gU+qlevXtzhCSGEEEK8EWSBuCiR3n333SdeMlCGboUQQgghXgzpbIgSycLCAgsLi+IOQwghhBDijSbTqIQQQgghhBBFQjobQgghhBA6WLp0KTVr1sTS0hJLS0u8vLzYsmWLev+1a9fo1asXDg4OmJmZUadOHdatW1eMEQvx8klnQwgttWjRgsDAwFeirpCQEOzt7VEoFGzcuPGFxCSEEKJwypUrx6xZszh69Ci///47rVq14r333uPPP/8E4JNPPiExMZFffvmFU6dO8f7779OtWzeOHTtWzJEL8fJIZ0OI19SZM2cIDQ1l2bJlXL16lfbt2z93nREREZQuXfr5gxNCiBKgU6dO+Pr64ubmRpUqVZgxYwbm5uYcOXIEgEOHDvHZZ5/RoEEDKlasyKRJkyhdujRHjx4t5siFeHmksyHEayopKQmA9957DwcHB4yNjYs5ov/Jzc1FqVQWdxhCCPHS5ObmEhUVRUZGhvpqh15eXqxdu5abN2+iVCqJiori/v37tGjRoniDFeIlkqtRCfEcbt26xfDhw/n111/JysqiefPmLFq0CDc3N3WZAwcOMHHiRI4cOYKxsTENGjQgKiqKMmXK5Ktv8+bN9OzZky+//BI/P78nthsSEkJoaCgAenoPzxmoVCri4+OZMGECx44dIycnh9q1azN//nzq1Kmjfu3t27cZN24cGzdu5M6dO1SuXJlZs2Zhbm5O3759AVAoFABMmTKFkJCQZx5nREQEgYGBrFq1ivHjx3Pu3DkuXLiAq6trofLYMGwnDwzMClVWgLG+ijkNwCNkG1m5iuIO57UhedNeSc/ZxVkdnlnm1KlTeHl5cf/+fczNzdmwYQPVqlXj4sWLREZG8vHHH2NjY4OBgQGmpqZs2LCBypUrv4TohXg1SGdDiOfg7+/P+fPn+eWXX7C0tGTcuHH4+vpy+vRpDA0NOX78OK1bt+aTTz5h4cKFGBgYsHv3bnJzc/PVFRkZyaBBg4iMjKRjx45PbXf06NG4urrSt29frl69qt5+9+5d+vTpw+LFi1GpVMydOxdfX1/Onz+PhYUFSqWS9u3bc/fuXVavXk2lSpU4ffo0+vr6NGrUiAULFhAcHExiYiIA5ubmhTpOgMzMTGbPns0333yDjY0NdnZ2+eLOysoiKytL/TwtLQ0AYz0V+voqLbNfchnrqTT+FYUjedNeSc9ZTk7OM8tUrFiR+Ph40tLSWLduHX369GHr1q0ABAcHc+vWLbZu3YqNjQ2//PIL3bp1Y9euXdSoUaOow3/t5OW7MHkX/1McedOmLYVKpSqZf0GE0FGLFi2oXbs2Q4cOpUqVKhw4cIBGjRoBcOPGDZydnVm5ciUffvghPXv2JCUlhf379z+1Ljc3NyZOnMimTZto3rx5oeLYuHEjXbp04Wn/hZVKJaVLl1Z3YLZv30779u05c+YMVapUyVc+b4Ti9u3b6m3nz59/5nFGRETQt29fjh8/Tq1atZ4Yz6MjMo+KjIzE1NS0UMcthBCvsuDgYBwcHOjSpQuDBw9m0aJFlC9fXmO/o6MjgwcPLsYohXg+mZmZ9OzZkzt37mBpafnUsjKyIYSOzpw5g4GBgcadyG1sbKhatSpnzpwB4Pjx43z44YdPrefnn38mNTWVAwcOUL9+/eeK6d9//2XSpEnExsaSmppKbm4umZmZpKSkqOMpV65cgR2NJynMcQIYGRlRs2bNp9YVFBTEyJEj1c/T0tJwdnZm+jE9HhjqFzqmks5YT8W0ekom/65HlrLkTW3RleRNeyU9ZwkhPlq/ZsGCBdja2qpHcZs3b467u7t6/xdffEG5cuXw9fV9YXG+KXJycoiJiaFt27bqUXPxbMWRt7yZCYUhnQ0hipCJickzy3h6evLHH3/w3XffUa9ePfV6CV306dOHGzdusHDhQlxcXDA2NsbLy4vs7OxCx6MrExOTZ8ZubGxc4EL2vePaYGNjU1ShvXFycnKIjo7maHA7+UDWguRNe5KzpwsKCqJ9+/aUL1+eu3fvEhkZyZ49e9i8eTOZmZlUrlyZgIAAwsPDsbGxYePGjezYsYPffvtN8vkUhoaGkh8dvMy8adOOXI1KCB25u7vz4MED4uLi1Ntu3LhBYmIi1apVA6BmzZrs3LnzqfVUqlSJ3bt3s2nTJj777LPniunAgQMMGzYMX19fqlevjrGxMdevX1fvr1mzJleuXOHcuXMFvt7IyCjfepLCHKcQQpREqamp9O7dm6pVq9K6dWvi4+PZtm0bbdq0wcDAgE2bNmFra0unTp2oWbMmq1atYuXKlTKqIUoUGdkQQkdubm689957DBgwgGXLlmFhYcH48eMpW7Ys7733HvDwrFeNGjUYMmQIgwYNwsjIiN27d/Phhx/y1ltvqeuqUqUKu3fvpkWLFhgYGLBgwQKdY/r++++pV68eaWlpjBkzRmM0o3nz5jRr1oyuXbsyb948KleuzNmzZ1EoFLRr1w5XV1fS09PZuXMntWrVwtTUtFDHKYQQJdG3335b4Pa8xbNubm5yx3BR4snIhhDPYcWKFdStW5eOHTvi5eWFSqUiOjpaPbxYpUoVtm/fzokTJ2jQoAFeXl5s2rQJA4P8/fyqVauya9cufvjhB0aNGqVTPN9++y23bt2iTp069OrVi2HDhuW7KtS6deuoX78+PXr0oFq1aowdO1Y9mtGoUSMGDRpE9+7dsbW1Zc6cOYU6TiGEEEKIgsjVqIQQxSYtLQ0rKyuuX78uaza0kDeP3tfXVzp8WpC8aU9yphvJm24kb7opjrzlfX4X5mpUMrIhhBBCCCGEKBLS2RDiFWVubv7Ex759+4o7PCGEEEKIZ5IF4kK8oo4fP/7EfWXLln15gQghhBBC6Eg6G0K8oipXrlzcIQghhBBCPBeZRiWEEEIIIYQoEtLZEEIIIUSJtXTpUmrWrImlpSWWlpZ4eXmxZcsWjTKHDh2iVatWmJmZYWlpSbNmzbh3714xRSzE60U6G0K8ABcvXkShUDx1nYUQQohXT7ly5Zg1axZHjx7l999/p1WrVrz33nv8+eefwMOORrt27fD29ubIkSPEx8cTEBCAnp58hRKiMOR/ihBP4e/vT+fOnYs7DABiY2NRKBTcvn27uEMBICQkBIVCofF4++23izssIYTQSqdOnfD19cXNzY0qVaowY8YMzM3NOXz4MAAjRoxg2LBhjB8/nurVq1O1alW6deuGsbFxMUcuxOtBOhtCFDOVSsWDBw9eaps5OTkvpJ7q1atz9epV9WP//v0vpF4hhCgOubm5REVFkZGRgZeXF6mpqcTFxWFnZ0ejRo2wt7enefPm8rdOCC3I1aiEAH7++WdCQ0O5cOECpqameHp64unpycqVKwFQKBQA7N69mxYtWnDkyBE+/fRTzpw5g4eHBxMnTix0W7GxsbRs2ZLo6GgmTZrEqVOn2L59O82aNWP27Nl8/fXXXLt2jSpVqjB58mQ++OADLl68SMuWLQEoU6YMAH369CEiIgJXV1cCAwMJDAxUt1G7dm06d+5MSEiIOv4vv/ySLVu2sHPnTsaMGQPAxo0bGTVqFJMnT+bWrVu0b9+e5cuXY2FhUahjMTAwwMHBodDH/iQNw3bywMDsuespKYz1VcxpAB4h28jKVRR3OK8NyZv2XvecXZzVoVDlTp06hZeXF/fv38fc3JwNGzZQrVo19ehGSEgI4eHh1K5dm1WrVtG6dWsSEhJwc3MryvCFeCNIZ0OUeFevXqVHjx7MmTOHLl26cPfuXfbt20fv3r1JSUkhLS2NFStWAGBtbU16ejodO3akbdu2rF69muTkZIYPH651u+PHjyc8PJyKFStSpkwZwsLCWL16NV999RVubm7s3buXjz/+GFtbW5o0acK6devo2rUriYmJWFpaYmJiolV7ISEhzJo1iwULFmBgYMB3331HUlISGzdu5LfffuPWrVt069aNWbNmMWPGjELVef78eZycnChVqhReXl6EhYVRvnz5J5bPysoiKytL/TwtLQ0AYz0V+voqrY6nJDPWU2n8KwpH8qa91z1nhR3FrVixIvHx8aSlpbFu3Tr69OnDjh07yM7OBqB///58/PHHAMyZM4cdO3awfPnyJ/6tzGv3RY0ilxSSN90UR960aUs6G6LEu3r1Kg8ePOD999/HxcUFgBo1agBgYmJCVlaWxtn7iIgIlEol3377LaVKlaJ69epcuXKFwYMHa9Xu1KlTadu2LfDwS/jMmTPZsWMHXl5ewMMPv/3797Ns2TKaN2+OtbU1AHZ2dpQuXVrr4+zZsyd9+/bV2KZUKomIiFCPZPTq1YudO3cWqrPRsGFDIiIiqFq1KlevXiU0NJSmTZuSkJDwxJGRsLAwQkND822f5KnE1DRX62Mq6abVUxZ3CK8lyZv2XtecRUdHa/2axo0bs23bNsaOHUvXrl0ByM7O1qjLysqKuLi4Z9YfExOjdftC8qarl5m3zMzMQpeVzoYo8WrVqkXr1q2pUaMGPj4+eHt788EHH6inKz3uzJkz1KxZk1KlSqm35XUQtFGvXj31zxcuXCAzM1Pd+ciTnZ2Np6en1nU/q708rq6uGh0DR0dHUlNTC1Vf+/bt1T/XrFmThg0b4uLiwo8//ki/fv0KfE1QUBAjR45UP09LS8PZ2ZmWLVtiY2NT2EMp8XJycoiJiaFt27YYGhoWdzivDcmb9kpqzhYsWIC9vT3+/v6EhoZiYmKCr6+vev+UKVPw8fHR2Paokpq35yV5001x5C1vZkJhSGdDlHj6+vrExMRw8OBBtm/fzuLFi5k4cSJxcXFF2q6Z2f/WKKSnpwOwefNmypYtq1HuWVc80dPTQ6XSnOJQ0PDmo+3lefyPkkKhQKnU7Qxm6dKlqVKlChcuXHhiGWNj4wKPx9DQUD5YdCB5043kTXtvcs6CgoJo37495cuX5+7du0RGRrJnzx62bduGkZERY8aMYcqUKdSpU4fatWuzcuVKEhMTWbdu3TNz8ibnrShJ3nTzMvOmTTvS2RCCh1+yGzduTOPGjQkODsbFxYUNGzZgZGREbq7m9B53d3e+//577t+/rx7dyFtEqKtq1aphbGxMSkoKzZs3L7CMkZERQL54bG1tuXr1qvp5WloaycnJzxWPLtLT00lKSqJXr14vvW0hhNBVamoqvXv35urVq1hZWVGzZk22bdumHmkODAzk/v37jBgxgps3b1KrVi1iYmKoVKlSMUcuxOtBOhuixIuLi2Pnzp14e3tjZ2dHXFwc//33H+7u7ty/f59t27aRmJiIjY0NVlZW9OzZk4kTJzJgwACCgoK4ePEi4eHhzxWDhYUFo0ePZsSIESiVSpo0acKdO3c4cOAAlpaW9OnTBxcXFxQKBb/99hu+vr6YmJhgbm5Oq1atiIiIoFOnTpQuXZrg4GD09fVfUHaebPTo0XTq1AkXFxf++ecfpkyZgr6+Pj169CjytoUQ4kX59ttvn1lm/PjxjB8//iVEI8SbRzobosSztLRk7969LFiwgLS0NFxcXJg7dy7t27enXr16xMbGUq9ePdLT09WXvv31118ZNGgQnp6eVKtWjdmzZ6sXEupq2rRp2NraEhYWxl9//UXp0qWpU6cOEyZMAKBs2bKEhoYyfvx4+vbtS+/evYmIiCAoKIjk5GQ6duyIlZUV06ZNeykjG1euXKFHjx7cuHFDfcWsw4cPY2trW+RtCyGEEOL1oFA9PtlbCCFekrS0NKysrLh+/bosENdCTk4O0dHR+Pr6yrxmLUjetCc5043kTTeSN90UR97yPr/v3LmDpaXlU8vKHcSFEEIIIYQQRUI6G0K8YIMGDcLc3LzAx6BBg4o7vEJJSUl54jGYm5uTkpJS3CEKIYQQ4jUgazaEeMGmTp3K6NGjC9z3rKHGV4WTkxPHjx9/6n4hhBBCiGeRzoYQL5idnR12dnbFHcZzMTAwoHLlysUdhhBCCCFeczKNSgghhBBCCFEkpLPxCmvRogWBgYHFHYZ4gVxdXVmwYEGR1C3vFyFEUZk9ezb169fHwsICOzs7OnfuTGJiokaZpKQkunTpgq2tLZaWlnTr1o1///23mCIWQrwqpLPxCoiNjUWhUHD79m2N7evXr2fatGnFE1QhXbx4EYVC8dT5/eJ/4uPjGThwoPq5QqFg48aNxRfQE8TGxvLee+/h6OiImZkZtWvXZs2aNfnK/fTTT7z99tuUKlWKGjVqEB0dXQzRCiGK2r59+xg6dCiHDx8mJiaGnJwcvL29ycjIACAjIwNvb28UCgW7du3iwIEDZGdn06lTJ5RKZTFHL4QoTrJm4xVmbW1drO3n5OS81OtcZ2dnY2Rk9NLaKw6vyw3vDh48SM2aNRk3bhz29vb89ttv9O7dGysrKzp27Kgu06NHD8LCwujYsSORkZF07tyZP/74Aw8Pj2I+AiHEi/Tbb79pfB5ERERgZ2fH0aNHadasGQcOHODixYscO3ZMfSGMlStXUqZMGXbt2kWbNm2KK3QhRDEr1pGNrVu30qRJE0qXLo2NjQ0dO3YkKSkJgEaNGjFu3DiN8v/99x+Ghobs3bsXgKtXr9KhQwdMTEyoUKECkZGRWk1TUSgUfPPNN3Tp0gVTU1Pc3Nz45ZdfNMokJCTQvn17zM3Nsbe3p1evXly/fl29/+7du/j5+WFmZoajoyPz58/PN53l+++/p169elhYWODg4EDPnj1JTU0FHo4MtGzZEoAyZcqgUCjw9/cHNKfFTJgwgYYNG+Y7hlq1ajF16lT182+++QZ3d3dKlSrF22+/zZdfflmoXOSNUKxdu5bmzZtTqlQp9Znsp9VZoUIFADw9PVEoFLRo0SJf7Hk6d+6sPjZ4OKVo2rRp9O7dG0tLSwYOHEhERASlS5dm27ZtuLu7Y25uTrt27bh69WqhjsPf35/OnTszc+ZM7O3tKV26NFOnTuXBgweMGTMGa2trypUrx4oVKzReN27cOKpUqYKpqSkVK1Zk8uTJ5OTkaJSZPn06dnZ2WFhY0L9/f8aPH0/t2rXztR0eHo6joyM2NjYMHTpUo55H35+urq4AdOnSBYVCoX6eV8+jAgMD1bmFh2cRe/fujbm5OY6OjsydOzdfLrKyshg9ejRly5bFzMyMhg0bEhsbW6g8TpgwgWnTptGoUSMqVarE8OHDadeuHevXr1eXWbhwIe3atWPMmDG4u7szbdo06tSpw5IlSwrVhhDi9XXnzh3gfyfFsrKyUCgUGBsbq8uUKlUKPT099u/fXywxCiFeDcU6spGRkcHIkSOpWbMm6enpBAcH06VLF44fP46fnx9z5sxh1qxZKBQKANauXYuTkxNNmzYFoHfv3ly/fp3Y2FgMDQ0ZOXKk+kt8YYWGhjJnzhw+//xzFi9ejJ+fH5cuXcLa2prbt2/TqlUr+vfvz/z587l37x7jxo2jW7du7Nq1C4CRI0dy4MABfvnlF+zt7QkODuaPP/7Q+BKak5PDtGnTqFq1KqmpqYwcORJ/f3+io6NxdnZm3bp1dO3alcTERCwtLTExMckXp5+fH2FhYSQlJVGpUiUA/vzzT06ePMm6desAWLNmDcHBwSxZsgRPT0+OHTvGgAEDMDMzo0+fPoXKx/jx45k7dy6enp7qDsfT6jxy5AgNGjRgx44dVK9eXeuRifDwcIKDg5kyZQrwcKg+MzOT8PBwvv/+e/T09Pj4448ZPXp0gdN4CrJr1y7KlSvH3r17OXDgAP369ePgwYM0a9aMuLg41q5dy6effkrbtm0pV64cABYWFkRERODk5MSpU6cYMGAAFhYWjB07Vp3bGTNm8OWXX9K4cWOioqKYO3euurOVZ/fu3Tg6OrJ7924uXLhA9+7dqV27NgMGDMgXZ3x8PHZ2dqxYsYJ27dqhr69f6LyNGTOGPXv2sGnTJuzs7JgwYUK+911AQACnT58mKioKJycnNmzYQLt27Th16hRubm6FbivPnTt3cHd3Vz8/dOgQI0eO1Cjj4+Pz1GlhWVlZZGVlqZ+npaUB0Gz2Dh4YmmkdU0llrKdiWj2oO3UrWUpFcYfz2pC8PVlCiE+B2/NOljx60kSpVDJ8+HAaNWpE1apVycnJoW7dupiZmTFmzBimTZuGSqVi4sSJ5Obm8vfff+c7efOmKyhv4tkkb7opjrxp01axdja6du2q8fy7777D1taW06dP061bNwIDA9m/f7+6cxEZGUmPHj1QKBScPXuWHTt2EB8fT7169YCHZ+C1/RLl7+9Pjx49AJg5cyaLFi3iyJEjtGvXTv0Fe+bMmRoxOjs7c+7cORwdHVm5ciWRkZG0bt0agBUrVuS7B8Enn3yi/rlixYosWrSI+vXrk56ejrm5ufrMkJ2dHaVLly4wzurVq1OrVi0iIyOZPHky8PALcMOGDdWXKJ0yZQpz587l/fffBx6OOpw+fZply5YVurMRGBiofn1h6sybFmRjY4ODg0Oh2nhUq1atGDVqlPr5vn37yMnJ4auvvlJ3qgICAjRGb57F2tqaRYsWoaenR9WqVZkzZw6ZmZlMmDABgKCgIGbNmsX+/fv56KOPAJg0aZL69a6urowePZqoqCh1Z2Px4sX069ePvn37AhAcHMz27dtJT0/XaLtMmTIsWbIEfX193n77bTp06MDOnTsL7Gzk5a506dJa5S49PZ1vv/2W1atXq993K1euVHec4OFN+VasWEFKSor6/Th69Gi2bt3KihUrNN7ThfHjjz8SHx/PsmXL1NuuXbuGvb29Rjl7e3uuXbv2xHrCwsIIDQ3Nt32SpxJT01ytYhIwrZ7MhdeF5C2/Z623iomJUf/81VdfcfToUcLCwjReN2LECL766iuWLFmCQqGgadOmVKxYkStXrpTY9VyP5k0UnuRNNy8zb5mZmYUuW6ydjfPnzxMcHExcXBzXr19XLyJLSUnBw8MDb29v1qxZQ9OmTUlOTubQoUPqLzuJiYkYGBhQp04ddX2VK1emTJkyWsVQs2ZN9c9mZmZYWlqqR0dOnDjB7t27MTc3z/e6pKQk7t27R05ODg0aNFBvt7KyomrVqhpljx49SkhICCdOnODWrVsax1mtWrVCx+rn58d3333H5MmTUalU/PDDD+ozyxkZGSQlJdGvXz+NL7YPHjzAysqq0G3kddxeZJ2FbS+PqampuqMB4OjoqNWIVfXq1dHT+98MQXt7e401BPr6+tjY2GjUuXbtWhYtWkRSUhLp6ek8ePBA4wZ8iYmJDBkyRKOdBg0aqEe4Hm370REKR0dHTp06VejYCyMpKYns7GyNaXXW1tYa77tTp06Rm5tLlSpVNF6blZWFjY2NVu3t3r2bvn37snz5cqpXr/5csQcFBWmMhqSlpeHs7Mz0Y3o8MCz8yE5J9/AMvZLJv+vJGXotSN6e7GkjGzExMbRt2xZDQ0OGDx9OQkIC+/fvzzey6+vry8SJE7l+/ToGBgaULl0aZ2dnmjdvjq+v78s4jFfG43kThSN5001x5C1vZkJhFGtno1OnTri4uLB8+XKcnJxQKpV4eHiQnZ0NPPxyPWzYMBYvXkxkZCQ1atSgRo0aLzSGx38pCoVC3RlIT0+nU6dOzJ49O9/rHB0duXDhwjPrz8jIwMfHBx8fH9asWYOtrS0pKSn4+Pioj7OwevTowbhx4/jjjz+4d+8ely9fpnv37upYAZYvX55vbYc203PMzP43leV56tTT00OlUmlsK2jI7dH28hT0O3m8rqcp6PVP+z0fOnQIPz8/QkND8fHxwcrKSj1NSltPa6ewCpu7p0lPT0dfX5+jR4/m+10V1Hl+kj179tCpUyfmz59P7969NfY5ODjku6zlv//++9RRGmNjY4053Xn2jmujdSeoJMvJySE6Opqjwe3kA1kLkjfdGRgYMGLECDZt2kRsbOxTZxE4OjoCD6e0pqam0qVLlxKbb0NDwxJ77M9D8qabl5k3bdopts7GjRs3SExMZPny5eppUo8vInvvvfcYOHAgW7duJTIyUuPLTtWqVXnw4AHHjh2jbt26AFy4cIFbt269sBjr1KnDunXrcHV1xcAgf6oqVqyIoaEh8fHxlC9fHng4r/3cuXM0a9YMgLNnz3Ljxg1mzZqFs7MzAL///rtGPXnrHHJznz6NpFy5cjRv3pw1a9Zw79492rZtq75Ttb29PU5OTvz111/4+fk934H/v8LU+aTYbW1tNRZ15+bmkpCQoF4M/yo5ePAgLi4uTJw4Ub3t0qVLGmWqVq1KfHy8xnswPj7+uds2NDQsMHcJCQka244fP67+j12pUiUMDQ2Ji4tTv+9u3brFuXPnaN68OfBwwX5ubi6pqanq/1/aio2NpWPHjsyePVvjcr15vLy82Llzp8aFAGJiYvDy8tKpPSHEq2vYsGFERUWxadMmLCws1NMlrays1OsMV6xYgbu7O7a2thw6dIjhw4czYsSIfKP9QoiSpdg6G2XKlMHGxoavv/4aR0dHUlJSGD9+vEYZMzMzOnfuzOTJkzlz5ox6bQXA22+/TZs2bRg4cCBLly7F0NCQUaNGYWJiol5Q/ryGDh3K8uXL6dGjB2PHjsXa2poLFy4QFRXFN998g4WFBX369FFf5cjOzo4pU6agp6enjqF8+fIYGRmxePFiBg0aREJCQr57Z7i4uKBQKPjtt9/w9fXFxMTkiWef/fz8mDJlCtnZ2cyfP19jX2hoKMOGDcPKyop27dqRlZXF77//zq1bt/It5C2sZ9VpZ2eHiYkJW7dupVy5cpQqVQorKytatWrFyJEj2bx5M5UqVWLevHn57iPyqnBzcyMlJYWoqCjq16/P5s2b2bBhg0aZzz77jAEDBlCvXj0aNWrE2rVrOXnyJBUrVnyutl1dXdm5cyeNGzfG2NiYMmXK0KpVKz7//HNWrVqFl5cXq1evJiEhAU9PT+DhyES/fv0YM2YMNjY22NnZMXHiRI2pY1WqVMHPz4/evXurF/z/999/7Ny5k5o1a9KhQ4enxrV79246duzI8OHD6dq1q/qLhZGRkXqN0fDhw2nevDlz586lQ4cOREVF8fvvv/P1118/V06EEK+evCnMj14VDx52MPKuMpiYmEhQUBA3b97E1dWViRMnMmLEiJccqRDiVVNsl77V09MjKiqKo0eP4uHhwYgRI/j888/zlfPz8+PEiRM0bdpUfRY3z6pVq7C3t6dZs2Z06dJFfQWhUqVKvZAYnZycOHDgALm5uXh7e1OjRg0CAwMpXbq0+ovdvHnz8PLyomPHjrRp04bGjRurLxMLD89SR0RE8NNPP1GtWjVmzZpFeHi4Rjtly5YlNDSU8ePHY29vT0BAwBNj+uCDD7hx4waZmZn5Lo/av39/vvnmG1asWEGNGjVo3rw5ERER+ebVauNZdRoYGLBo0SKWLVuGk5MT7733HvBwUXyfPn3o3bs3zZs3p2LFiq/kqAbAu+++y4gRIwgICKB27docPHhQvQg/j5+fH0FBQYwePZo6deqQnJyMv7//c7/X5s6dS0xMDM7OzurOhI+PD5MnT2bs2LHUr1+fu3fv5pvC9Pnnn9O0aVM6depEmzZtaNKkiXqEL8+KFSvo3bs3o0aNomrVqnTu3FljFO5pVq5cSWZmJmFhYTg6Oqofj148oFGjRkRGRvL1119Tq1Ytfv75ZzZu3Cj32BDiDZSdnY1Kpcr3ePRy5rNmzeLatWtkZ2dz7tw5Ro4c+cJO/gkhXl8KlTaT4V9xV65cwdnZmR07dqiv0vOyZWRkULZsWebOnUu/fv2KJQbxcrRt2xYHBwe+//774g7ltZWWloaVlRXXr1+XNRtayFt74OvrK/OatSB5057kTDeSN91I3nRTHHnL+/y+c+eOxgV1CvJa30F8165dpKenU6NGDa5evcrYsWNxdXVVr5d4GY4dO8bZs2dp0KABd+7cUV+iNe8Mv3gzZGZm8tVXX+Hj44O+vj4//PADO3bskMvzCSGEEEI8RbHeQfx55eTkMGHCBKpXr06XLl2wtbVV3+BvzZo1mJubF/h43st3Pi48PJxatWrRpk0bMjIy2LdvH2+99dYLbeN5zZw584n5aN++fXGHV2hPOgZzc3P27dtXZO0qFAqio6Np1qwZdevW5ddff2XdunW0adOmyNosSu3bt39iHrW9B4cQQgghxJO81iMbeZeULci7776b73KteV7kEJOnpydHjx59YfUVlUGDBtGtW7cC9xV0x/JX1fHjx5+4r2zZskXWromJCTt27Ciy+l+2b775hnv37hW4L28BuBBCCCHE83qtOxtPY2FhgYWFRXGH8cqwtrZ+I75E5t0tXTyfouyYCSGEEELkea2nUQkhhBBCCCFeXdLZEEIIId4AYWFh1K9fHwsLC+zs7OjcuTOJiYn5yh06dIhWrVphZmaGpaUlzZo1e+K0SiGEeF7S2RCvDX9//3z3FnlcixYtNO5oLYQQJcWePXsYOnQohw8fJiYmhpycHLy9vcnIyFCXOXToEO3atcPb25sjR44QHx9PQECAxk1BhRDiRXpj12yIohMSEsLGjRufulhbCCHEy7V161aN5xEREdjZ2XH06FH1JeFHjBjBsGHDGD9+vLpc1apVX2qcQoiSRU5lCPECZWdnF3cIQggBwJ07d4D/XWEuNTWVuLg47OzsaNSoEfb29jRv3pz9+/cXZ5hCiDecjGyUUEqlkvDwcL7++msuX76Mvb09n376KRMnTmTcuHFs2LCBK1eu4ODggJ+fH8HBwRgaGhIREUFoaCjw8N4TACtWrMDf3/+p7Z09e5b+/fvz+++/U7FiRRYtWkTbtm3ZsGGDemrUqVOnGD58OIcOHcLU1JSuXbsyb948zM3NC6wzIyODwYMHs379eiwsLBg9enS+MllZWUycOJEffviB27dv4+HhwezZs2nRogXw8MxfYGAga9euJTAwkMuXL9OkSRNWrFiBo6PjM/Po7+/P7du3qV+/Pl988QXGxsYkJydz+fJlRo0axfbt29HT06Np06YsXLgQV1dXAGJjYxk7dix//vknhoaGVK9encjISFxcXABYunQp4eHhXL58mQoVKjBp0iR69eqlblehULB8+XI2b97Mtm3b1Hetf/fddwHIzc1l4MCB7Nq1i2vXrlG+fHmGDBnC8OHD88XepEkT5s6dS3Z2Nh999BELFixQXx46KyuL4OBgIiMjSU1NxdnZmaCgIPr16wdAQkICY8aMYd++fZiZmeHt7c38+fO1vs9Mw7CdPDAw0+o1JZmxvoo5DcAjZBtZuYriDue18Trn7eKsDlqVVyqVBAYG0rhxYzw8PAD466+/gIej0+Hh4dSuXZtVq1bRunVrEhIScHNze+FxCyGEdDZKqKCgIJYvX878+fNp0qQJV69e5ezZs8DDywZHRETg5OTEqVOnGDBgABYWFowdO5bu3buTkJDA1q1b1fedsLKyempbubm5dO7cmfLlyxMXF8fdu3cZNWqURpmMjAx8fHzw8vIiPj6e1NRU+vfvT0BAABEREQXWO2bMGPbs2cOmTZuws7NjwoQJ/PHHH9SuXVtdJiAggNOnTxMVFYWTkxMbNmygXbt2nDp1Sv3BmpmZSXh4ON9//z16enp8/PHHjB49mjVr1hQqlzt37sTS0lJ9N/GcnBz1sezbtw8DAwOmT59Ou3btOHnyJHp6enTu3JkBAwbwww8/kJ2dzZEjR9Sdtw0bNjB8+HAWLFhAmzZt+O233+jbty/lypWjZcuW6nZDQ0OZM2cOn3/+OYsXL8bPz49Lly5hbW2NUqmkXLly/PTTT9jY2HDw4EEGDhyIo6Ojxv1Wdu/ejaOjI7t37+bChQt0796d2rVrM2DAAAB69+7NoUOHWLRoEbVq1SI5OZnr168DcPv2bVq1akX//v2ZP38+9+7dY9y4cXTr1o1du3YVmKusrCyysrLUz9PS0gAw1lOhr68qVL7Fw3w9+q8onNc5bzk5OVqVDwgIICEhgd27d6tfmzfy2r9/fz7++GMA5syZw44dO1i+fDkzZsx4Yrvatl/SSd50I3nTTXHkTZu2FCqV6vX7qyuey927d7G1tWXJkiX079//meXDw8OJiori999/B7Rfs7F161Y6derE5cuXcXBwAGDHjh0aIxvLly9n3LhxXL58GTOzh2e4o6Oj6dSpE//88w/29vbqM/EbN24kPT0dGxsbVq9ezYcffgjAzZs3KVeuHAMHDmTBggWkpKRQsWJFUlJScHJyUsfTpk0bGjRowMyZM4mIiKBv375cuHCBSpUqAfDll18ydepUrl279sxj8/f3Z+vWraSkpGBkZATA6tWrmT59OmfOnFF3ILKzsyldujQbN26kXr162NjYEBsbS/PmzfPV2bhxY6pXr87XX3+t3tatWzcyMjLYvHkz8HBkY9KkSUybNg142FkzNzdny5YttGvXrsBYAwICuHbtGj///LM69tjYWJKSktDX11e3o6enR1RUFOfOnaNq1arExMQUeKf06dOns2/fPrZt26beduXKFZydnUlMTKRKlSr5XhMSEqIeGXtUZGQkpqamBcYthNDO119/TVxcHDNnzsTe3l69/d9//+XTTz8lMDBQPboL8Pnnn6Ovr8/IkSOLIVohxOsoMzOTnj17cufOHSwtLZ9aVkY2SqAzZ86QlZVF69atC9y/du1aFi1aRFJSEunp6Tx48OCZb6SnSUxMxNnZWd3RAGjQoEG+mGrVqqXuaMDDL91KpZLExESND0yApKQksrOzNe4Sb21trbHQ8dSpU+Tm5ub70puVlYWNjY36uampqbqjAeDo6Ehqamqhj69GjRrqjgbAiRMnuHDhQr6bSt6/f5+kpCS8vb3x9/fHx8eHtm3b0qZNG7p166aetnXmzBkGDhyo8drGjRuzcOFCjW01a9ZU/5x3CctH4/7iiy/47rvvSElJ4d69e2RnZ2uM+gBUr15d3dHIO/ZTp04BD+/Wrq+vX2CHKO84d+/eXeA0t6SkpAI7G0FBQRpfaNLS0nB2dmb6MT0eGOrnKy8KZqynYlo9JZN/1yNL+XpNBypOr3PeEkJ8nllGpVIRGBjI8ePH2bt3b75pUSqVitDQUExMTPD19VVvnzJlCj4+Phrb8uTk5BATE0Pbtm3V0yvFs0nedCN5001x5C1vZkJhSGejBDIxMXnivkOHDuHn50doaCg+Pj5YWVkRFRXF3LlzX2KEL0Z6ejr6+vocPXpU4ws1oPEF+fH/mAqFAm0G/B7tIOW1W7du3QKnYdna2gIP17kMGzaMrVu3snbtWiZNmkRMTAzvvPNOodstKG6lUglAVFQUo0ePZu7cuXh5eWFhYcHnn39OXFxcoet42vsk7zg7derE7Nmz8+170noXY2NjjI2N823fO66NRgdQPF1OTg7R0dEcDW4nH8haeNPzNmTIECIjI9m0aRPW1tbcuHEDeDjVNe//85gxY5gyZQp16tShdu3arFy5ksTERNatW/fUnBgaGr6ROStqkjfdSN508zLzpk070tkogdzc3DAxMWHnzp35plEdPHgQFxcXJk6cqN526dIljTJGRkbk5uYWur2qVaty+fJl/v33X/UIRXx8vEYZd3d3IiIiyMjIUH95P3DgAHp6egVelrFSpUoYGhoSFxdH+fLlAbh16xbnzp1Tn4n39PQkNzeX1NRUmjZtWuh4n1edOnVYu3YtdnZ2Tx0R8vT0xNPTk6CgILy8vIiMjOSdd97B3d2dAwcO0KdPH3XZAwcOUK1atULHcODAARo1asSQIUPU25KSkrQ6jho1aqBUKtmzZ0+B06jq1KnDunXrcHV1xcBA/pQIUdyWLl0KoDFFCjQv4hEYGMj9+/cZMWIEN2/epFatWsTExGiM7gohxIskl74tgUqVKsW4ceMYO3Ysq1atIikpicOHD/Ptt9/i5uZGSkoKUVFRJCUlsWjRIjZs2KDxeldXV5KTkzl+/DjXr1/XWPBbkLZt21KpUiX69OnDyZMnOXDgAJMmTQL+d0UrPz8/SpUqRZ8+fdSLGj/77DN69eqVbwoVPByZ6NevH2PGjGHXrl0kJCTg7++vcWOqKlWq4OfnR+/evVm/fj3JyckcOXKEsLAw9dqHouDn58dbb73Fe++9x759+0hOTiY2NpZhw4Zx5coVkpOTCQoK4tChQ1y6dInt27dz/vx53N3dgYdnHiMiIli6dCnnz59n3rx5rF+/vsCrbT2Jm5sbv//+O9u2bePcuXNMnjw5XwfvWVxdXenTpw+ffPIJGzduVB/Hjz/+CMDQoUO5efMmPXr0ID4+nqSkJLZt20bfvn216owKIV4MlUpV4OPxqwWOHz+ey5cvk5GRwcGDB2nSpEnxBCyEKBGks1FCTZ48mVGjRhEcHIy7uzvdu3cnNTWVd999lxEjRhAQEEDt2rU5ePAgkydP1nht165dadeuHS1btsTW1pYffvjhqW3p6+urF3XXr1+f/v37q0dOSpUqBTxcN7Ft2zZu3rxJ/fr1+eCDD2jdujVLlix5Yr2ff/45TZs2pVOnTrRp04YmTZpQt25djTIrVqygd+/ejBo1iqpVq9K5c2fi4+PVoyFFwdTUlL1791K+fHnef/993N3d6devH/fv38fS0hJTU1POnj1L165dqVKlCgMHDmTo0KF8+umnAHTu3JmFCxcSHh5O9erVWbZsGStWrMh3tvJpPv30U95//326d+9Ow4YNuXHjhsYoR2EtXbqUDz74gCFDhvD2228zYMAA9d2InZycOHDgALm5uXh7e1OjRg0CAwMpXbq03I1YCCGEEIBcjUoUkwMHDtCkSRONq0CJkictLQ0rKyuuX78uaza0kLf2wNfXV+Y1a0Hypj3JmW4kb7qRvOmmOPKW9/ktV6MSr4wNGzZgbm6Om5sbFy5cYPjw4TRu3Fg6GkIIIYQQbzCZ6yCe25o1azA3Ny/wUb16deDhvT2GDh3K22+/jb+/P/Xr12fTpk3FHPmzPem4zM3N2bdvX3GHJ4QQQgjxSpORDfHc3n33XY37XTwqbzivd+/e9O7d+2WG9UI87caFZcuWfXmBCCGEEEK8hqSzIZ6bhYVFvhvYvSkqV65c3CEIIYQQQry2ZBqVEEIIIYQQokhIZ0OIV9S1a9do27YtZmZmlC5durjDEUK84sLCwqhfvz4WFhbY2dnRuXNnEhMT85U7dOgQrVq1wszMDEtLS5o1a8a9e/eKIWIhREkgnQ0hXoKQkBBq166t1Wvmz5/P1atXOX78OOfOnXshcbRo0YLAwMAXUtejVCoV7du3R6FQsHHjxhdevxDi2fbs2cPQoUM5fPgwMTEx5OTk4O3trb43DjzsaLRr1w5vb2+OHDlCfHw8AQEBcm8cIUSRkTUbQryikpKSqFu3Lm5ubsUdSj7Z2dkYGRmpny9YsEB9N3ghRPHYunWrxvOIiAjs7Ow4evQozZo1A2DEiBEMGzaM8ePHq8tVrVr1pcYphChZ5FSGEIW0detWmjRpQunSpbGxsaFjx44kJSWp91+5coUePXpgbW2NmZkZ9erVIy4ujoiICEJDQzlx4gQKhQKFQkFERMRT23J1dWXdunWsWrUKhUKBv78/APPmzaNGjRqYmZnh7OzMkCFDSE9P13jtgQMHaNGiBaamppQpUwYfHx9u3bqFv78/e/bsYeHCheo4Ll68CDw8I9qgQQOMjY1xdHRk/PjxPHjwQF1nixYtCAgIIDAwkLfeegsfHx/1vuPHjzN37ly+++6750uwEOKFunPnDgDW1tYApKamEhcXh52dHY0aNcLe3p7mzZuzf//+4gxTCPGGk5ENIQopIyODkSNHUrNmTdLT0wkODqZLly4cP36czMxMmjdvTtmyZfnll19wcHDgjz/+QKlU0r17dxISEti6dSs7duwAwMrK6qltxcfH07t3bywtLVm4cCEmJiYA6OnpsWjRIipUqMBff/3FkCFDGDt2LF9++SXw8It/69at+eSTT1i4cCEGBgbs3r2b3NxcFi5cyLlz5/Dw8GDq1KkA2Nra8vfff+Pr64u/vz+rVq3i7NmzDBgwgFKlShESEqKOaeXKlQwePJgDBw6ot2VmZtKzZ0+++OILHBwcdM5tw7CdPDAw0/n1JY2xvoo5DcAjZBtZuTKiVFivc94uzuqgVXmlUklgYCCNGzfGw8MDgL/++gt4OK0zPDyc2rVrs2rVKlq3bk1CQsIrOYoqhHj9vbDOxu3bt2URq3ijde3aVeP5d999h62tLadPn+bgwYP8999/xMfHq88iPnrZXHNzcwwMDAr9hdzW1hZjY2NMTEw0XvPoegtXV1emT5/OoEGD1J2NOXPmUK9ePfVzQH1jRQAjIyNMTU016vzyyy9xdnZmyZIlKBQK3n77bf755x/GjRtHcHCwei63m5sbc+bM0YhzxIgRNGrUiPfee69Qx5WVlUVWVpb6eVpaGgDGeir09VWFqkM8zNej/4rCeZ3zlpOTo1X5gIAAEhIS2L17t/q12dnZAPTv35+PP/4YePg3Y8eOHSxfvpwZM2Y8sV1t2y/pJG+6kbzppjjypk1bOnU2Zs+ejaurK927dwegW7durFu3DgcHB6Kjo6lVq5Yu1QrxSjt//jzBwcHExcVx/fp1lEolACkpKRw/fhxPT091R6Oo7Nixg7CwMM6ePUtaWhoPHjzg/v37ZGZmYmpqyvHjx/nwww+1qvPMmTN4eXlprLlo3Lgx6enpXLlyhfLlywNQt25djdf98ssv7Nq1i2PHjhW6rbCwMEJDQ/Ntn+SpxNQ0V6u4BUyrpyzuEF5Lr2PeoqOjC13266+/Ji4ujpkzZ3Ly5ElOnjwJwL///gs87HQ8Wp+VlRVxcXFPbSMmJkbHyEs2yZtuJG+6eZl5y8zMLHRZnTobX331FWvWrAEeHlhMTAxbtmzhxx9/ZMyYMWzfvl2XaoV4pXXq1AkXFxeWL1+Ok5MTSqUSDw8PsrOz1dOcitLFixfp2LEjgwcPZsaMGVhbW7N//3769etHdnY2pqamRRqHmZnmNKddu3aRlJSUb0Sza9euNG3alNjY2Hx1BAUFMXLkSPXztLQ0nJ2dadmyJTY2NkUR9hspJyeHmJgY2rZti6GhYXGH89p40/OmUqkIDAzk+PHj7N27N9+0KJVKRWhoKCYmJvj6+qq3T5kyBR8fH41ted70nBUVyZtuJG+6KY685c1MKAydOhvXrl3D2dkZgN9++41u3brh7e2Nq6srDRs21KVKIV5pN27cIDExkeXLl9O0aVMAjUWVNWvW5JtvvuHmzZsFjm4YGRmRm/t8Z+6PHj2KUqlk7ty56qlNP/74o0aZmjVrsnPnzgJHD54Uh7u7O+vWrUOlUqlHNw4cOICFhQXlypV7Yjzjx4+nf//+Gttq1KjB/Pnz6dSpU4GvMTY2xtjYON92Q0ND+WDRgeRNN29q3oYMGUJkZCSbNm3C2tqaGzduAA9HLvJORIwZM4YpU6ZQp04dateuzcqVK0lMTGTdunVPzcmbmrOiJnnTjeRNNy8zb9q0o9PVqMqUKcPly5eBh1foadOmDfDwrMnzfqES4lVUpkwZbGxs+Prrr7lw4QK7du3SOEPfo0cPHBwc6Ny5MwcOHOCvv/5i3bp1HDp0CHi4viI5OZnjx49z/fp1jXULhVW5cmVycnJYvHgxf/31F99//z1fffWVRpmgoCDi4+MZMmQIJ0+e5OzZsyxdupTr16+r44iLi+PixYvqqWBDhgzh8uXLfPbZZ5w9e5ZNmzYxZcoURo4c+dRr7zs4OODh4aHxAChfvjwVKlTQ+viEEM9n6dKl3LlzhxYtWuDo6Kh+rF27Vl0mMDCQoKAgRowYQa1atdi5cycxMTFUqlSpGCMXQrzJdOpsvP/++/Ts2ZO2bdty48YN2rdvD8CxY8c0FsUK8abQ09MjKiqKo0eP4uHhwYgRI/j888/V+42MjNi+fTt2dnb4+vpSo0YNZs2ahb6+PvBwalG7du1o2bIltra2/PDDD1rHUKtWLebNm8fs2bPx8PBgzZo1hIWFaZSpUqUK27dv58SJEzRo0AAvLy82bdqEgcHDQczRo0ejr69PtWrVsLW1JSUlhbJlyxIdHc2RI0eoVasWgwYNol+/fkyaNOk5MiaEeNlUKlWBj7xLZ+cZP348ly9fJiMjg4MHD9KkSZPiCVgIUSLoNI1q/vz5uLq6cvnyZebMmYO5uTkAV69eZciQIS80QCFeFW3atOH06dMa21Sq/13VxsXFhZ9//rnA1xobGz9x35MUdCfuESNGMGLECI1tvXr10njevHlzjcvTPqpKlSrq0ZbHX3PkyJEnxlLQ+ouCPJoPIYQQQgidOhuGhoaMHj063/bHvwQJIYQQQgghSi6d7yD+/fff06RJE5ycnLh06RIACxYsYNOmTS8sOCHeVGvWrMHc3LzAx6P3xRBCCCGEeJ3pNLKxdOlSgoODCQwMZMaMGepF4aVLl2bBggWFvsGXECXVu++++8Qrt8kVOIQQQgjxptCps7F48WKWL19O586dmTVrlnp7vXr1CpxeJYTQZGFhgYWFRXGHIYQQQghRpHSaRpWcnIynp2e+7cbGxmRkZDx3UEIIIYQQQojXn06djQoVKnD8+PF827du3Yq7u/vzxiSEEEKIx4SFhVG/fn0sLCyws7Ojc+fOJCYmapRp0aIFCoVC4zFo0KBiilgIIXScRjVy5EiGDh3K/fv3UalUHDlyhB9++IGwsDC++eabFx2jEEIIUeLt2bOHoUOHUr9+fR48eMCECRPw9vbm9OnTmJmZqcsNGDCAqVOnqp+bmpoWR7hCCAHoOLLRv39/Zs+ezaRJk8jMzKRnz54sXbqUhQsX8tFHH73oGIUoEVq0aEFgYGBxhwHAiRMn6NGjB87OzpiYmODu7s7ChQvzlYuNjaVOnToYGxtTuXJlIiIiXn6wQpQQW7duxd/fn+rVq1OrVi0iIiJISUnh6NGjGuVMTU1xcHBQPywtLYspYiGE0KGz8eDBA1atWkWbNm04f/486enpXLt2jStXrtCvX7+iiFGI1152dvZr1dbRo0exs7Nj9erV/Pnnn0ycOJGgoCCWLFmiLpOcnEyHDh1o2bIlx48fJzAwkP79+7Nt27bnbl8I8Wx37twBwNraWmP7mjVreOutt/Dw8CAoKIjMzMziCE8IIQAdplEZGBgwaNAgzpw5Azw8gyJDtEJoatGiBR4eHhgYGLB69Wpq1KjB4sWLGTNmDPv27cPMzAxvb2/mz5/PW2+9hb+/P3v27GHPnj3qEYTk5GRiY2MJDAzk9u3b6ro3btxIly5d1HfrDgkJYePGjQQEBDBjxgwuXbqEUqlEoVCwfPlyNm/ezLZt2yhbtixz587l3XfffWb8n3zyicbzihUrcujQIdavX09AQAAAX331FRUqVGDu3LkAuLu7s3//fubPn4+Pj49W+WoYtpMHBmbPLigAMNZXMacBeIRsIytXUdzhvDZe9bxdnNWh0GWVSiWBgYE0btwYDw8P9faePXvi4uKCk5MTJ0+eZNy4cSQmJrJ+/fqiCFkIIZ5JpzUbDRo04NixY7i4uLzoeIR4Y6xcuZLBgwdz4MABbt++TatWrejfvz/z58/n3r17jBs3jm7durFr1y4WLlzIuXPn8PDwUM+1trW1LXRbFy5cYN26daxfvx59fX319tDQUObMmcPnn3/O4sWL8fPz49KlS/nOhBbGnTt3NF536NAh2rRpo1HGx8fnqVPBsrKyyMrKUj9PS0sDwFhPhb6+SuuYSipjPZXGv6JwXvW85eTkFLpsQEAACQkJ7N69W+N1ffv2Vf/89ttvY2tri4+PD2fPnqVSpUo6x6RNbELypivJm26KI2/atKVTZ2PIkCGMGjWKK1euULduXY2FaQA1a9bUpVoh3ihubm7MmTMHgOnTp+Pp6cnMmTPV+7/77jucnZ05d+4cVapUwcjISD3XWlvZ2dmsWrUqXwfF39+fHj16ADBz5kwWLVrEkSNHaNeunVb1Hzx4kLVr17J582b1tmvXrmFvb69Rzt7enrS0NO7du4eJiUm+esLCwggNDc23fZKnElPTXK1iEjCtnrK4Q3gtvap5i46OLlS5r7/+mri4OGbOnMnJkyc5efLkE8vev38fgKioqAIvWV9YMTExOr+2JJO86UbyppuXmTdtpmfq1NnIWwQ+bNgw9TaFQoFKpUKhUKjvKC5ESVa3bl31zydOnGD37t2Ym5vnK5eUlESVKlWeqy0XF5cCR0Ie7fibmZlhaWlJamqqVnUnJCTw3nvvMWXKFLy9vZ8rzqCgIEaOHKl+npaWhrOzM9OP6fHAUP8prxSPMtZTMa2eksm/65GlfPWmA72qXvW8JYQ8ffqhSqUiMDCQ48ePs3fvXtzc3J5Z58GDBwHo1KmTTicCc3JyiImJoW3bthgaGmr9+pJK8qYbyZtuiiNveTMTCkOnzkZycrIuLxOiRHl0xC89PZ1OnToxe/bsfOUcHR2fWIeenp56bUaegoYuHx9dzPP4Hx2FQoFSWfizuqdPn6Z169YMHDiQSZMmaexzcHDg33//1dj277//YmlpWeCoBjy88aexsXG+7XvHtcHGxqbQcZV0OTk5REdHczS4nXwga+F1z9uQIUOIjIxk06ZNWFtbc+PGDQCsrKwwMTEhKSmJyMhIfH19sbGx4eTJk4wYMYJmzZppnPzQhaGh4WuZs+ImedON5E03LzNv2rSjU2dD1moIoZ06deqwbt06XF1dMTAo+L+dkZFRvlFBW1tb7t69S0ZGhrpDUdANNYvCn3/+SatWrejTpw8zZszIt9/LyyvftI+YmBi8vLxeSnxClDRLly4FHl6A4lErVqzA398fIyMjduzYwYIFC8jIyMDZ2ZmuXbvmO1EghBAvk06djVWrVj11f+/evXUKRog31dChQ1m+fDk9evRg7NixWFtbc+HCBaKiovjmm2/Q19fH1dWVuLg4Ll68iLm5OdbW1jRs2BBTU1MmTJjAsGHDiIuLeyn3skhISKBVq1b4+PgwcuRIrl27BoC+vr56utagQYNYsmQJY8eO5ZNPPmHXrl38+OOPGus6hBAvzuOjnI9zdnZmz549LykaIYQoHJ06G8OHD9d4npOTQ2ZmpnqBq3Q2hNDk5OTEgQMHGDduHN7e3mRlZeHi4kK7du3Q03t4u5vRo0fTp08fqlWrxr1790hOTsbV1ZXVq1czZswYli9fTuvWrQkJCWHgwIFFGu/PP//Mf//9x+rVq1m9erV6u4uLCxcvXgSgQoUKbN68mREjRrBw4ULKlSvHN998o/Vlb4UQQgjx5lKonnWqpJDOnz/P4MGDGTNmjHzZEEIUSlpaGlZWVly/fl3WbGghb+2Br6+vzGvWguRNe5Iz3UjedCN5001x5C3v8/vOnTtYWlo+tazWdxB/Ejc3N2bNmpVv1EMIIYQQQghRMr2wzgY8vLv4P//88yKrFEIUgUGDBmFubl7gY9CgQcUdnhBCCCHeEDqt2fjll180nqtUKq5evcqSJUto3LjxCwlMCFF0pk6dyujRowvc96zhUCGEEEKIwtKps9G5c2eN5wqFAltbW1q1asXcuXNfRFxCiCJkZ2eHnZ1dcYchhBBCiDecTp0NbW4KJoQQQgghhCiZdFqzMXXqVDIzM/Ntv3fvHlOnTn3uoIQQQojXUVhYGPXr18fCwgI7Ozs6d+5MYmKiev/Nmzf57LPPqFq1KiYmJpQvX55hw4Zx586dYoxaCCGKjk6djdDQUNLT0/Ntz8zMJDQ09LmDEkK8ejZu3EjlypXR19cnMDCwuMMR4pW0Z88ehg4dyuHDh4mJiSEnJwdvb28yMjIA+Oeff/jnn38IDw8nISGBiIgItm7dSr9+/Yo5ciGEKBo6TaNSqVQoFIp820+cOIG1tfVzByWE0F1ISAgbN27k+PHjL7TeTz/9lL59+zJs2DAsLCw09l24cAFPT0/09fW5ffv2C21XiNfJ1q1bNZ5HRERgZ2fH0aNHadasGR4eHqxbt069v1KlSsyYMYOPP/6YBw8eYGCg08eyEEK8srT6q1amTBkUCgUKhYIqVapodDhyc3NJT0+Xy2YK8QZKT08nNTUVHx8fnJycNPbl5OTQo0cPmjZtysGDB4spQiFeTXnTo552Ii7vpljS0RBCvIm0+su2YMECVCoVn3zyCaGhoVhZWan3GRkZ4erqipeX1wsPUoiSRqlUEh4eztdff83ly5ext7fn008/ZeLEiYwbN44NGzZw5coVHBwc8PPzIzg4GENDQyIiItRTGfNOBqxYsQJ/f/+ntjdv3jxWrFjBX3/9hbW1NZ06dWLOnDmYm5sTGxtLy5YtAWjVqhUAu3fvpkWLFgBMmjSJt99+m9atW+vc2WgYtpMHBmY6vbYkMtZXMacBeIRsIys3/yizKNjz5u3irA5alVcqlQQGBtK4cWM8PDwKLHP9+nWmTZvGwIEDtY5HCCFeB1p1Nvr06QNAhQoVaNSokdxKXogiEhQUxPLly5k/fz5NmjTh6tWrnD17FgALCwsiIiJwcnLi1KlTDBgwAAsLC8aOHUv37t1JSEhg69at7NixA0DjpMCT6OnpsWjRIipUqMBff/3FkCFDGDt2LF9++SWNGjUiMTGRqlWrsm7dOho1aqQ+S7tr1y5++uknjh8/zvr165/ZTlZWFllZWernaWlpABjrqdDXV2mdp5LKWE+l8a8onOfNW05OjlblAwICSEhIYPfu3QW+Ni0tDV9fX9zd3Zk4caLW9b8MeTG9irG9yiRvupG86aY48qZNWwqVSvVcn1b3798nOztbY5vcFEwI3d29exdbW1uWLFlC//79n1k+PDycqKgofv/9d+DFrNn4+eefGTRoENevXwfg9u3blClTRmNE48aNG3h6erJ69WqaNWtGREQEgYGBT12zERISUuBFJCIjIzE1NdU5XiFeNV9//TVxcXHMnDkTe3v7fPvv3btHSEgIxsbGTJo0CSMjo2KIUgghdJOZmUnPnj3V00CfRqcJopmZmYwdO5Yff/yRGzdu5Nufm5urS7VCCODMmTNkZWXRunXrAvevXbuWRYsWkZSURHp6Og8ePHjuDv6OHTsICwvj7NmzpKWl8eDBA+7fv09mZuYTOwEDBgygZ8+eNGvWrNDtBAUFMXLkSPXztLQ0nJ2dadmyJTY2Ns91DCVJTk4OMTExtG3bVkaYtfAy8qZSqQgMDOT48ePs3bsXNze3fGXS0tLo0KED9vb2/PLLL690R1vea7qRvOlG8qab4shb3syEwtCpszFmzBh2797N0qVL6dWrF1988QV///03y5YtY9asWbpUKYT4fyYmJk/cd+jQIfz8/AgNDcXHxwcrKyuioqKYO3euzu1dvHiRjh07MnjwYGbMmIG1tTX79++nX79+ZGdnP/GL0K5du/jll18IDw8HHn7JUiqVGBgY8PXXX/PJJ5/ke42xsTHGxsb5thsaGsoHiw4kb7opyrwNGTKEyMhINm3ahLW1tfqEnJWVFSYmJuqORmZmJmvWrOHevXvcu3cPAFtbW/T19Yskrucl7zXdSN50I3nTzcvMmzbt6NTZ+PXXX1m1ahUtWrSgb9++NG3alMqVK+Pi4sKaNWvw8/PTpVohBODm5oaJiQk7d+7MN43q4MGDuLi4MHHiRPW2S5cuaZQxMjLSanTx6NGjKJVK5s6di57ew1vv/Pjjj8983aFDhzTa2bRpE7Nnz+bgwYOULVu20O0L8SZZunQpgHq6YZ68CzX88ccfxMXFAVC5cmWNMsnJybi6ur6MMIUQ4qXRqbNx8+ZNKlasCDxcn3Hz5k0AmjRpwuDBg19cdEKUQKVKlWLcuHGMHTsWIyMjGjduzH///ceff/6Jm5sbKSkpREVFUb9+fTZv3syGDRs0Xu/6f+3deVxU1f/48dewDTsIgYAimCuKIK6RG+aGpLmVppZQprll7ksq4hZqLqC5pH6ETNMW19RINEFFwyRx31ARK9dSEUlkub8//DHfJhZhBEbl/Xw85qFz77nnvO8bdOY959w77u5cvnyZxMREKleujJWVVb6zCbmqV69OZmYmixcvpnPnzsTFxbF8+fInxunh4aH1/MiRIxgYGBR41x0hyoMnXQbp5+f3xDZCCPEi0ekbxF9++WUuX74MQO3atTWfgv7www/Y2tqWWHBClFdTpkxh9OjRBAcH4+HhQa9evbh58yZvvPEGI0eOZNiwYdSvX5+DBw8yZcoUrWN79OiBv78/rVu3xsHBgfXr1xc6lre3NwsWLGDOnDl4enqybt06QkNDS/P0hBBCCFFO6HQ3qoULF2JoaMjw4cPZvXs3nTt3RlEUMjMzWbBgAR9//HFpxCqEeMGkpqZiY2PD7du35QLxYsjMzGTnzp0EBATIuuZikLwVn+RMN5I33UjedKOPvOW+fpfa3ahGjhyp+Xvbtm05e/YsCQkJVK9eHS8vL126FEIIIYQQQrxgdCo2/u3hw4e4ubnh5uZWEvEIIUrYunXr+PDDD/Pd5+bmxqlTp8o4IiGEEEKUFzoVG9nZ2Xz66acsX76cGzducP78eV5++WWmTJmCu7s7/fv3L+k4hRA6euONN2jatGm++2SaWgghhBClSadiY9asWXz55ZfMnTuXAQMGaLZ7enoSFhYmxYYQzxArKyusrKz0HYYQQgghyiGd7ka1Zs0aVqxYQd++fbW+gMjb25uzZ8+WWHBCCCGEEEKI55dOxcYff/yR58uIAHJycsjMzHzqoIQQcP36ddq1a4eFhYXcUlqIZ0RoaCiNGzfGysoKR0dHunbtyrlz57TarFixAj8/P6ytrVGpVNy9e1c/wQohxDNAp2KjTp067N+/P8/277//Hh8fn6cOSogXTUhICPXr1y/WMQsXLuTatWskJiZy/vz5EonDz8+PESNGlEhfAB9++CHVqlXDzMwMBwcHunTpIrOb4oUWGxvL0KFD+eWXX4iOjiYzM5P27dvz4MEDTZv09HT8/f355JNP9BipEEI8G3S6ZiM4OJjAwED++OMPcnJy2LRpE+fOnWPNmjVs3769pGMUoly6ePEiDRs2pEaNGvoOJY9Hjx5hYmJCw4YN6du3L1WqVOHvv/8mJCSE9u3bc/nyZa0llkK8KKKiorSeR0ZG4ujoSEJCAi1btgTQFPQxMTFlHJ0QQjx7ijWzcenSJRRFoUuXLvzwww/s3r0bCwsLgoODOXPmDD/88APt2rUrrViF0KuoqCiaN2+Ora0t9vb2dOrUiYsXL2r2//777/Tu3Rs7OzssLCxo1KgR8fHxREZGMm3aNI4dO4ZKpUKlUhEZGVnoWO7u7mzcuJE1a9agUqkICgoCYMGCBdSrVw8LCwtcXV0ZMmQIaWlpWsfGxcXh5+eHubk5FSpUoEOHDty5c4egoCBiY2MJDw/XxJGcnAw8/rS2SZMmqNVqnJ2dmTBhAllZWZo+/fz8GDZsGCNGjOCll16iQ4cOAAwcOJCWLVvi7u5OgwYNmDlzJlevXtX0K8SL7t69ewDY2dnpORIhhHg2FWtmo0aNGly7dg1HR0datGiBnZ0dJ06coGLFiqUVnxDPjAcPHjBq1Ci8vLxIS0sjODiYbt26kZiYSHp6Oq1ataJSpUps27YNJycnfvvtN3JycujVqxcnT54kKiqK3bt3A2BjY1PoWL/++iv9+vXD2tqa8PBwzMzMADAwMGDRokVUrVqVS5cuMWTIEMaNG8fSpUsBSExMpE2bNrz//vuEh4djZGTE3r17yc7OJjw8nPPnz+Pp6cn06dMBcHBw4I8//iAgIICgoCDWrFnD2bNnGTBgAKampoSEhGhi+vLLLxk8eDBxcXEF5iciIoKqVavi6uqab5uMjAwyMjI0z1NTUwFoOWc3WcYWRfgpCAC1gcKMRtBwehQZOSp9h/PceFLeToZ0KFZ/OTk5fPzxx7z66qvUqlUrzzWLuQV7Zmbmc3s9Y27cz2v8+iJ5043kTTf6yFtxxlIpiqIUtbGBgQHXr1/H0dERAGtraxITE3n55ZeLH6UQz7nbt2/j4ODAiRMnOHjwIGPGjCE5OTnfTzhDQkLYsmULiYmJRe6/a9eu2NraFjoL8v333zNo0CBu374NQJ8+fUhJSeHAgQP5tvfz86N+/fqEhYVptk2aNImNGzdy5swZVKrHb8CWLl3K+PHjuXfvHgYGBvj5+ZGamspvv/2Wp8+lS5cybtw4Hjx4QK1atdixYwfVqlXLd/yQkBCmTZuWZ/vXX3+Nubl5gecpxLNo+fLlJCQkEBoayksvvZRn/4kTJ5gyZQpr167F0tJSDxEKIUTpSE9Pp0+fPty7dw9ra+tC2z7VN4gXo04R4rl34cIFgoODiY+P5/bt2+Tk5ACQkpJCYmIiPj4+pb6UYvfu3YSGhnL27FlSU1PJysri4cOHpKenY25uTmJiIm+99Vax+jxz5gy+vr6aQgOgWbNmpKWl8fvvv1OlShUAGjZsmO/xffv2pV27dly7do158+bRs2dP4uLiMDU1zdN24sSJjBo1SvM8NTUVV1dXZh41IMtYrvEoqsef0Ocw5YiBzGwUw5PyVpyZjY8//piTJ09y4MABqlatmm8bC4vHs3Xt27d/bu8ol5mZSXR0NO3atZMvAS0GyZtuJG+60UfeclcmFEWxio3cdd7/3SZEedC5c2fc3NxYuXIlLi4u5OTk4OnpyaNHjzTLnEpTcnIynTp1YvDgwcyaNQs7OzsOHDhA//79efToEebm5qUaR+4bp/+ysbHBxsaGGjVq8Morr1ChQgU2b95M796987RVq9Wo1eo82/eNb4u9vX2Jx/yiyszMZOfOnSQE+8sLcjGURN4UReGjjz5i69atxMTEFHoDByOjxy+xxsbGz/3P6UU4B32QvOlG8qabssxbccYpVrGhKApBQUGaNwsPHz5k0KBBed6EbNq0qTjdCvHM++uvvzh37hwrV66kRYsWAFpLlby8vFi1ahV///13vrMbJiYmZGdnP1UMCQkJ5OTkMH/+fAwMHt/b4dtvv9Vq4+XlxZ49e/JdqlRQHB4eHmzcuBFFUTQfHsTFxWFlZUXlypWLFaOiKCiKonVdhhAvkqFDh/L111+zdetWrKysuH79OvC46M4t9q9fv87169dJSkoCHi+nsrKyokqVKnIhuRCi3CnW3agCAwNxdHTUfJL5zjvv4OLionme+xDiRVOhQgXs7e1ZsWIFSUlJ/Pzzz1rLgXr37o2TkxNdu3YlLi6OS5cusXHjRg4dOgQ8vrvU5cuXSUxM5Pbt2zq9Ga9evTqZmZksXryYS5cu8dVXX7F8+XKtNhMnTuTXX39lyJAhHD9+nLNnz7Js2TLNNR3u7u7Ex8eTnJysWQo2ZMgQrl69ykcffcTZs2fZunUrU6dOZdSoUZqiJj+XLl0iNDSUhIQEUlJSOHjwIG+99RZmZmYEBAQU+/yEeB4sW7aMe/fu4efnh7Ozs+bxzTffaNosX74cHx8fBgwYAEDLli3x8fFh27Zt+gpbCCH0plgzGxEREaUVhxDPNAMDAzZs2MDw4cPx9PSkVq1aLFq0CD8/P+DxjMGuXbsYPXo0AQEBZGVlUadOHZYsWQJAjx492LRpE61bt+bu3btERERobmdbVN7e3ixYsIA5c+YwceJEWrZsSWhoKP369dO0qVmzJrt27eKTTz6hSZMmmJmZ0bRpU82SpjFjxhAYGEidOnX4559/uHz5Mu7u7uzcuZOxY8fi7e2NnZ0d/fv3Z/LkyYXGY2pqyv79+wkLC+POnTtUrFiRli1bcvDgQc1NJIR40RTlWsWQkBCtO7kJIUR5Vqy7UQkhRElKTU3FxsaG27dvyzUbxZB77UFAQICsay4GyVvxSc50I3nTjeRNN/rIW+7rd1HuRlWsZVRCCCGEEEIIUVRSbAihB+vWrcPS0jLfR926dfUdnhBCCCFEiXiq79kQQujmjTfeoGnTpvnuk6ljIYQQQrwopNgQQg+srKywsrLSdxhCCCGEEKVKllEJIYQQQgghSoUUG0IIIcT/FxoaSuPGjbGyssLR0ZGuXbty7tw5rTYPHz5k6NCh2NvbY2lpSY8ePbhx44aeIhZCiGebFBtCPKOuX79Ou3btsLCwwNbWVt/hCFEuxMbGMnToUH755Reio6PJzMykffv2PHjwQNNm5MiR/PDDD3z33XfExsby559/0r17dz1GLYQQzy4pNoQoAyEhIdSvX79YxyxcuJBr166RmJjI+fPnSyQOPz8/RowYUSJ95fanUqm0HoMGDSqx/oUoa1FRUQQFBVG3bl28vb2JjIwkJSWFhIQEAO7du8f//vc/FixYwGuvvUbDhg2JiIjg4MGD/PLLL3qOXgghnj1ygbgQz6iLFy/SsGFDatSooe9Q8nj06BEmJiYADBgwgOnTp2v2mZub6yssIUrcvXv3ALCzswMgISGBzMxM2rZtq2lTu3ZtqlSpwqFDh3jllVf0EqcQQjyrpNgQooiioqKYOXMmJ0+exNDQEF9fX8LDw6lWrRoAv//+O2PHjuWnn34iIyMDDw8PlixZwpkzZ5g2bRoAKpUKgIiICIKCggocy93dnStXrgCwZs0aAgMDiYyMZMGCBURERHDp0iXs7Ozo3Lkzc+fOxdLSUnNsXFwckyZN4vDhw6jVapo0acKGDRsYOXIksbGxxMbGEh4eDsDly5dxd3cnNjaWsWPHcuzYMezs7AgMDGTmzJkYGT3+L8LPzw9PT0+MjIxYu3Yt9erVY+/evcDj4sLJyempcts0dA9ZRhZP1Ud5ojZUmNsEPEN+IiNbpe9wnhu5eSuqnJwcRowYQbNmzfD09AQeL280MTHJs7SxYsWKXL9+vQSjFUKIF4MUG0IU0YMHDxg1ahReXl6kpaURHBxMt27dSExMJD09nVatWlGpUiW2bduGk5MTv/32Gzk5OfTq1YuTJ08SFRXF7t27AbCxsSl0rF9//ZV+/fphbW1NeHg4ZmZmABgYGLBo0SKqVq3KpUuXGDJkCOPGjWPp0qUAJCYm0qZNG95//33Cw8MxMjJi7969ZGdnEx4ezvnz5/H09NTMRDg4OPDHH38QEBBAUFAQa9as4ezZswwYMABTU1NCQkI0MX355ZcMHjyYuLg4rVjXrVvH2rVrcXJyonPnzkyZMqXA2Y2MjAwyMjI0z1NTUwFQGygYGirF+GmUb2oDRetPUTS5+crMzCxS+2HDhnHy5En27t2rOSYrKyvfPhRFITs7u8h9Py9yz+dFO6/SJnnTjeRNN/rIW3HGUimKIq9WQujg9u3bODg4cOLECQ4ePMiYMWNITk7WLLf4t5CQELZs2UJiYmKR++/atSu2trZERkYW2Ob7779n0KBB3L59G4A+ffqQkpLCgQMH8m3v5+dH/fr1CQsL02ybNGkSGzdu5MyZM5qZl6VLlzJ+/Hju3buHgYEBfn5+pKam8ttvv2n1t2LFCtzc3HBxceH48eOMHz+eJk2asGnTpnzHDwkJ0czy/NvXX38ty6/EM2XFihXEx8fz6aefUrFiRc3248ePExwczNq1a7VmFAcMGEDnzp1544039BGuEEKUqfT0dPr06cO9e/ewtrYutK3MbAhRRBcuXCA4OJj4+Hhu375NTk4OACkpKSQmJuLj45NvoVGSdu/eTWhoKGfPniU1NZWsrCwePnxIeno65ubmJCYm8tZbbxWrzzNnzuDr66spNACaNWtGWloav//+O1WqVAGgYcOGeY4dOHCg5u/16tXD2dmZNm3acPHiRc3ysn+bOHEio0aN0jxPTU3F1dWVmUcNyDI2LFbc5ZnaQGFGoxymHDEgI0eWURVVbt7atWuHsbFxvm0URWHEiBEkJiayb9++PNdMNWvWjBkzZmBkZERAQAAA586d49atW7z33ns0bdq01M+jLGVmZhIdHV1ozkRekjfdSN50o4+85a5MKAopNoQoos6dO+Pm5sbKlStxcXEhJycHT09PHj16pFnmVJqSk5Pp1KkTgwcPZtasWdjZ2XHgwAH69+/Po0ePMDc3L9U4LCyefE1F7hutpKSkfIsNtVqNWq3Os33f+LbY29s/fZDlRGZmJjt37iQh2F9ekIshN2/GxsYF5m3IkCF8/fXXbN26FTs7O/766y/g8dJHMzMzXnrpJfr378+4ceNwdHTE2tqajz76CF9fX5o3b16Wp1OmCsuZKJjkTTeSN92UZd6KM47c+laIIvjrr784d+4ckydPpk2bNnh4eHDnzh3Nfi8vLxITE/n777/zPd7ExITs7OyniiEhIYGcnBzmz5/PK6+8Qs2aNfnzzz+12nh5ebFnz54C+8gvDg8PDw4dOsS/V1TGxcVhZWVF5cqVixVj7jIxZ2fnYh0nxLNi2bJl3Lt3Dz8/P5ydnTWPb775RtNm4cKFdOrUiR49etCyZUucnJwKXDoohBDlnRQbQhRBhQoVsLe3Z8WKFSQlJfHzzz9rLQfq3bs3Tk5OdO3albi4OC5dusTGjRs5dOgQ8PjuUpcvXyYxMZHbt29rXSRdVNWrVyczM5PFixdz6dIlvvrqK5YvX67VZuLEifz6668MGTKE48ePc/bsWZYtW6a5psPd3Z34+HiSk5M1S8GGDBnC1atX+eijjzh79ixbt25l6tSpjBo1CgODgv+LuHjxIjNmzCAhIYHk5GS2bdtGv379aNmyJV5eXsU+PyGeBYqi5Pv4993jTE1NWbJkCX///TcPHjxg06ZNT31HNiGEeFFJsSFEERgYGLBhwwYSEhLw9PRk5MiRfPbZZ5r9JiYm7Nq1C0dHRwICAqhXrx6zZ8/G0PDxdQg9evTA39+f1q1b4+DgwPr164sdg7e3NwsWLGDOnDl4enqybt06QkNDtdrUrFmTXbt2cezYMZo0aYKvry9bt27V3MJ2zJgxGBoaUqdOHRwcHEhJSaFSpUrs3LmTw4cP4+3tzaBBg+jfvz+TJ08uNB4TExN2795N+/btqV27NqNHj6ZHjx788MMPxT43IYQQQryY5G5UQgi9SU1NxcbGhtu3b8s1G8WQe+1BQECArGsuBslb8UnOdCN5043kTTf6yFvu63dR7kYlMxtCCCGEEEKIUiHFhhB6sG7dOiwtLfN91K1bV9/hCSGEEEKUCLn1rRB68MYbbxR4P36ZOhZCCCHEi0KKDSH0wMrKCisrK32HIYQQQghRqmQZlRBCCCGEEKJUSLEhyh0/Pz9GjBih7zCeOTExMahUKu7evavvUIQoVfv376dz5864uLigUqnYsmWL1v4bN24QFBSEi4sL5ubm+Pv7c+HCBf0EK4QQzzkpNoR4AUgBJUTRPXjwAG9vb5YsWZJnn6IodO3alUuXLrF161aOHj2Km5sbbdu25cGDB3qIVgghnm9yzYYQQohyxd/fn86dO+e778KFC/zyyy+cPHlSc2e4ZcuW4eTkxPr16/nggw/KMlQhhHjuycyGKNfu3LlDv379qFChAubm5nTs2FGzXEJRFBwcHPj+++817evXr4+zs7Pm+YEDB1Cr1aSnpz9xrLt37/Lhhx9SsWJFTE1N8fT0ZPv27Zr9GzdupG7duqjVatzd3Zk/f77W8UuXLqVGjRqYmppSsWJF3nzzTQCCgoKIjY0lPDwclUqFSqUiOTn5ifHs3LmTmjVrYmZmRuvWrfM95sCBA7Ro0QIzMzNcXV0ZPny45tPdTz75JN87anl7ezN9+vQnji/EsygjIwMAU1NTzTYDAwPUajUHDhzQV1hCCPHckpkNUa4FBQVx4cIFtm3bhrW1NePHjycgIIDTp09jbGxMy5YtiYmJ4c033+TOnTucOXMGMzMzzp49S+3atYmNjaVx48aYm5sXOk5OTg4dO3bk/v37rF27lmrVqnH69GkMDQ0BSEhIoGfPnoSEhNCrVy8OHjzIkCFDsLe3JygoiCNHjjB8+HC++uorXn31Vf7++2/2798PQHh4OOfPn8fT01PzJt/BwaHQeK5evUr37t0ZOnQoAwcO5MiRI4wePVqrzcWLF/H392fmzJmsXr2aW7duMWzYMIYNG0ZERAR9+/YlNDSUixcvUq1aNQBOnTrF8ePH2bhxY7F+Dk1D95BlZFGsY8oztaHC3CbgGfITGdkqfYfzTEme/fpTHV+7dm2qVKnCxIkT+eKLL7CwsGDhwoX8/vvvXLt2rYSiFEKI8kOKDVFu5RYZcXFxvPrqq8DjL9tzdXVly5YtvPXWW/j5+fHFF18AsG/fPnx8fHByciImJobatWsTExNDq1atnjjW7t27OXz4MGfOnKFmzZoAvPzyy5r9CxYsoE2bNkyZMgWAmjVrcvr0aT777DOCgoJISUnBwsKCTp06YWVlhZubGz4+PgDY2NhgYmKCubk5Tk5ORTr3ZcuWUa1aNc3sSa1atThx4gRz5szRtAkNDaVv376aa0Fq1KjBokWLaNWqFcuWLaNu3bp4e3vz9ddfa+Jet24dTZs2pXr16vmOm5GRofnkGCA1NRUAtYGCoaFSpNjF43z9+0/xfzIzM5+4779tsrKytLZ9++23DBw4EDs7OwwNDWnTpg3+/v4oilJo/y+ignImCid5043kTTf6yFtxxpJiQ5RbZ86cwcjISGspkL29PbVq1eLMmTMAtGrVio8//phbt24RGxuLn5+fptjo378/Bw8eZNy4cU8cKzExkcqVK2sKjfxi6dKli9a2Zs2aERYWRnZ2Nu3atcPNzY2XX34Zf39//P396dat2xNnVAo79/8ugfL19dV6fuzYMY4fP866des02xRFIScnh8uXL+Ph4UHfvn1ZvXo1U6ZMQVEU1q9fz6hRowocNzQ0lGnTpuXZPtknB3PzbJ3OpTyb0ShH3yE8c3bu3PnENtHR0VrPExIS8nyZ5vTp03nw4AFZWVnY2NgwduxYqlevXqT+X0T/zZkoGsmbbiRvuinLvBVl+XguKTaEKES9evWws7MjNjaW2NhYZs2ahZOTE3PmzOHXX38lMzNTMytSGDMzs6eKw8rKit9++42YmBh27dpFcHAwISEh/Prrr9ja2j5V3wVJS0vjww8/ZPjw4Xn2ValSBYDevXszfvx4fvvtN/755x+uXr1Kr169Cuxz4sSJWsVIamoqrq6utG7dGnt7+5I/iRdUZmYm0dHRtGvXTr5xvhgKylvDhg0JCAgo8LgLFy5w8eJFwsLCaNeuXVmE+syQ3zXdSN50I3nTjT7ylrsyoSik2BDlloeHB1lZWcTHx2sKhr/++otz585Rp04dAFQqFS1atGDr1q2cOnWK5s2bY25uTkZGBl988QWNGjXCwuLJ1xp4eXnx+++/c/78+XxnNzw8PIiLi9PaFhcXR82aNTXXdRgZGdG2bVvatm3L1KlTsbW15eeff6Z79+6YmJiQnV30mQEPDw+2bdumte2XX37Ret6gQQNOnz5d4JIogMqVK9OqVSvWrVvHP//8Q7t27XB0dCywvVqtRq1W59lubGwsLyw6kLzpJiMjg/Pnz2ueX716lVOnTmFnZ0eVKlX47rvvcHBwoEqVKpw4cYKPP/6Yrl27FlqQvOjkd003kjfdSN50U5Z5K844cjcqUW7VqFGDLl26MGDAAA4cOMCxY8d45513qFSpktaSJj8/P9avX0/9+vWxtLTEwMCAli1bsm7duiJdrwGPl2O1bNmSHj16EB0dzeXLl/nxxx+JiooCYPTo0ezZs4cZM2Zw/vx5vvzySz7//HPGjBkDwPbt21m0aBGJiYlcuXKFNWvWkJOTQ61atQBwd3cnPj6e5ORkbt++TU5O4ctrBg0axIULFxg7diznzp3j66+/JjIyUqvN+PHjOXjwIMOGDSMxMZELFy6wdetWhg0bptWub9++bNiwge+++46+ffsWKR9C6FNCQgI+Pj6a655GjRqFj48PwcHBAFy7do13332X2rVrM3z4cN59913Wr1+vz5CFEOK5JcWGKNciIiJo2LAhnTp1wtfXF0VR2Llzp1bF3qpVK7Kzs/Hz89Ns8/Pzy7PtSTZu3Ejjxo3p3bs3derUYdy4cZrZiAYNGvDtt9+yYcMGPD09CQ4OZvr06QQFBQFga2vLpk2beO211/Dw8GD58uWsX79e8z0AY8aMwdDQkDp16uDg4EBKSkqhsVSpUoWNGzeyZcsWvL29Wb58OZ9++qlWGy8vL2JjYzl//jwtWrTQvBlzcXHRavfmm2/y119/kZ6eTteuXYucDyH0pVWrViiKkueRW3APHz6cq1ev8ujRI65cucKMGTMwMTHRb9BCCPGcUimKIrczEULoRWpqKjY2Nty+fVuu2SiGzMxMdu7cSUBAgCw1KAbJW/FJznQjedON5E03+shb7uv3vXv3sLa2LrStzGwIIYQQQgghSoUUG0KUgHXr1mFpaZnvI3epU1kaNGhQgfEMGjSozOMRQgghRPkkd6MSogS88cYbeb63Ipc+poKnT5+uubj8v5403SmEEEIIUVKk2BCiBFhZWWFlZaXvMDQcHR0LvQWtEEIIIURZkGVUQgghhBBCiFIhxYYQQogXyr59++jcuTMuLi6oVCq2bNmitT8tLY1hw4ZRuXJlzMzMqFOnDsuXL9dPsEII8YKTYkM8lZCQEOrXr695HhQUJN+18Jz6789SiOfVgwcP8Pb2ZsmSJfnuHzt2LFFRUaxdu5YzZ84wYsQIhg0bxrZt28o4UiGEePFJsSHEc8Dd3Z2wsLAS6y+/T3vHjBnDnj17SmwMIfSlY8eOzJw5k27duuW7/9ChQwQGBuLn54e7uzsDBw7E29ubw4cPl3GkQgjx4pNiQ4gXRHZ2Njk5OTofb2lpKV+sJ8oFX19ftm3bxh9//IGiKOzdu5fz58/Tvn17fYcmhBAvHLkb1Qvm+++/Z9q0aSQlJWFubo6Pjw9bt25l6NCh3L17lyZNmhAeHk5GRgajRo3ik08+YeLEifzvf//D3NycGTNm8N5772n6Gz9+PJs3b+b333/HycmJvn37EhwcXOTbuebk5DBv3jxWrFjB1atXqVixIh9++CGTJk0qUv8hISFs2bKFwYMHM3PmTP766y86derEypUrsbGxKVIMq1evZv78+SQlJWFnZ0ePHj34/PPPAUhJSeGjjz5iz549GBgY4O/vz+LFi6lYsaLW+KNHj2bKlCncuXOHjh07snLlSs3dp550jlevXmX06NHs2rULAwMDWrRoQXh4OO7u7sDjpWd3796lefPmzJ8/n0ePHvH2228TFhaGsbExfn5+XLlyhZEjRzJy5EgAFEUhMjKSESNGsGbNGiZMmMD58+dJSkri1q1bfPLJJxw9epTMzEzq16/PwoULadCgAYBm3NxPfd3c3EhOTtaca2Jioua8Zs6cyYoVK7h16xYeHh7Mnj0bf39/AJKTk6latSobN25k8eLFxMfHU6NGDZYvX46vr2+Rfja5mobuIcvIoljHlGdqQ4W5TcAz5CcyslX6DqdMJc9+/an7CAsLY+jQoVSuXBkjIyMMDAxYuXIlLVu2LIEIhRBC/JsUGy+Qa9eu0bt3b+bOnUu3bt24f/8++/fvR1EUAH7++WcqV67Mvn37iIuLo3///hw8eJCWLVsSHx/PN998w4cffki7du2oXLky8PiWrpGRkbi4uHDixAkGDBiAlZUV48aNK1JMEydOZOXKlSxcuJDmzZtz7do1zp49q9lflP6TkpL49ttv+eGHH0hNTaV///4MGTKEdevWPXH8ZcuWMWrUKGbPnk3Hjh25d+8ecXFxwOM30126dMHS0pLY2FiysrIYOnQovXr1IiYmRtPHxYsX2bJlC9u3b+fOnTv07NmT2bNnM2vWrCeeY2ZmJh06dMDX15f9+/djZGTEzJkz8ff35/jx45iYmACwd+9enJ2d2bt3L0lJSfTq1Yv69eszYMAANm3ahLe3NwMHDmTAgAFa55eens6cOXNYtWoV9vb2ODo6cunSJQIDA1m8eDGKojB//nwCAgK4cOECVlZW/Prrrzg6OhIREYG/vz+Ghob55i48PJz58+fzxRdf4OPjw+rVq3njjTc4deoUNWrU0LSbNGkS8+bNo0aNGkyaNInevXuTlJSEkVHe/14yMjLIyMjQPE9NTQVAbaBgaKg88ecpHlMbKFp/lieZmZnFPiYrK4vMzEzNsYsWLeLQoUNs2rSJKlWqcODAAYYOHYqjoyNt2rQp6ZCfa7k50yXv5ZnkTTeSN93oI2/FGUul5L4TFc+93377jYYNG5KcnIybm5vWvqCgIGJiYrh06RIGBo9Xz9WuXRtHR0f27dsHPF6GY2Njw6pVq3j77bfzHWPevHls2LCBI0eOAOT5NDz3U/otW7Zw//59HBwc+Pzzz/nggw+KdA759T9z5kyuXLlCpUqVAIiKiuL111/njz/+wMnJqdD+KlWqxHvvvcfMmTPz7IuOjqZjx45cvnwZV1dXAE6fPk3dunU5fPgwjRs3JiQkhM8++4zr169rZjLGjRvHvn37+OWXX554jmvXrmXmzJmcOXMGlerxJ9CPHj3C1taWLVu20L59e83P5uLFi5o3/j179sTAwIANGzYAj2cjRowYwYgRIzR9R0ZG8t5775GYmIi3t3eBOcjJycHW1pavv/6aTp06AY+v2di8ebPWxfz//VlWqlSJoUOH8sknn2jaNGnShMaNG7NkyRLNzMaqVavo37+/Vv7OnDlD7dq188QSEhLCtGnT8mz/+uuvMTc3L/AchNBV165dmTBhAq+88grwuODt27cvEyZMoFGjRpp2n3/+OX/99RdTp07VV6hCCPHcSE9Pp0+fPty7d++JXxYsMxsvEG9vb9q0aUO9evXo0KED7du3580336RChQoA1K1bV1NoAFSsWBFPT0/Nc0NDQ+zt7bl586Zm2zfffMOiRYu4ePEiaWlpZGVlFfkbqM+cOUNGRkahnxQWpf8qVapoCg14vN46JyeHc+fOFVps3Lx5kz///LPA8c+cOYOrq6um0ACoU6cOtra2nDlzhsaNGwOP3+j/+wv7nJ2dNTl60jkeO3aMpKSkPF/49/DhQy5evKh5XrduXa0ZBmdnZ06cOFHgueUyMTHBy8tLa9uNGzeYPHkyMTEx3Lx5k+zsbNLT00lJSXlif7lSU1P5888/adasmdb2Zs2acezYMa1t/x7f2dkZeJz7/IqNiRMnMmrUKK1xXF1dmXnUgCzj/GdYRF5qA4UZjXKYcsSAjJzytYzqZEiHYh/TsGFDAgICyMzMZOvWrWRlZdGkSRPNkkCA7du3AxAQEFBisb4IMjMziY6Opl27dkVePiskb7qSvOlGH3nLXZlQFFJsvEAMDQ2Jjo7m4MGD7Nq1i8WLFzNp0iTi4+MB8vwCqlSqfLflXmR86NAh+vbty7Rp0+jQoQM2NjZs2LCB+fPnFykeMzOzQvc/bf9PO35RFZajJ42RlpZGw4YN813y5eDgUKQxCmNmZqaZMckVGBjIX3/9RXh4OG5ubqjVanx9fXn06NET+9PFv2PPjaWg2NVqNWq1Os/2fePbysXpxZCZmcnOnTtJCPaXF+R8pKWlkZSUpHl+9epVTp06hZWVFebm5rRs2ZKJEydiZWWFm5sbsbGxrF27lgULFkg+C2BsbCy50YHkTTeSN92UZd6KM47cjeoFo1KpaNasGdOmTePo0aOYmJiwefNmnfo6ePAgbm5uTJo0iUaNGlGjRg2uXLlS5ONr1KiBmZlZgbdTLWr/KSkp/Pnnn5rnv/zyCwYGBtSqVavQ8a2srHB3dy9wfA8PD65evcrVq1c1206fPs3du3epU6dOUU7xiefYoEEDLly4gKOjI9WrV9d6FPUCd3g8g5GdnV2ktnFxcQwfPpyAgADq1q2LWq3m9u3bWm2MjY0L7c/a2hoXFxfN9S3/7ruouRFCX44cOYKPjw8+Pj4AjBo1Ch8fH80SvrVr19K4cWP69u1LnTp1NNdgDRo0SJ9hCyHEC0lmNl4g8fHx7Nmzh/bt2+Po6Eh8fLzmLkLHjx8vdn81atQgJSWFDRs20LhxY3bs2FGswsXU1JTx48czbtw4TExMaNasGbdu3eLUqVP079+/yP2bmpoSGBjIvHnzSE1NZfjw4fTs2fOJ12vA42sEBg0ahKOjIx07duT+/fvExcXx0Ucf0bZtW+rVq0ffvn0JCwsjKyuLIUOG0KpVK6213E9zjn379uWzzz6jS5cuTJ8+ncqVK3PlyhU2bdrEuHHjNBfiP4m7uzv79u3j7bffRq1W89JLLxXYtkaNGnz11Vc0atSI1NRUxo4dm2cGJrcIa9asGWq1WrPU7t/Gjh3L1KlTqVatGvXr1yciIoLExMQiXZgvhD75+fmR3+WIuTNCTk5ORERE6CEyIYQof2Rm4wVibW3Nvn37CAgIoGbNmkyePJn58+fTsWNHnfp74403GDlyJMOGDaN+/focPHiQKVOmFKuPKVOmMHr0aIKDg/Hw8KBXr16a6x2K2n/16tXp3r07AQEBtG/fHi8vL5YuXVqk8QMDAwkLC2Pp0qXUrVuXTp06ceHCBeDxLNDWrVupUKECLVu2pG3btrz88st88803JXaO5ubm7Nu3jypVqtC9e3c8PDzo378/Dx8+LPK1LwDTp08nOTmZatWqaS2/ys///vc/7ty5Q4MGDXj33XcZPnw4jo6OWm3mz59PdHQ0rq6umk9//2v48OGMGjWK0aNHU69ePaKioti2bZvWnaiEEEIIIQojd6MSz7T/3iFJvFhSU1OxsbHh9u3bcs1GMeR+Qh8QECDrmotB8lZ8kjPdSN50I3nTjT7ylvv6XZS7UcnMhhBCCCGEEKJUSLEhnmuWlpYFPvbv36/v8IQQQgghyjW5QFw800JCQggJCSlwf2HLq/793RxCCCGEEKLsSbEhnmvVq1fXdwhCCCGEEKIAsoxKCCGEEEIIUSqk2BBCCPFC2bdvH507d8bFxQWVSsWWLVu09qelpTFs2DAqV66MmZkZderUYfny5foJVgghXnBSbAihg/zewLzoQkJCqF+/vr7DEOKJHjx4gLe3N0uWLMl3/9ixY4mKimLt2rWcOXOGESNGMGzYMLZt21bGkQohxItPig0hRB75FVNjxoxhz549+glIiGLo2LEjM2fOpFu3bvnuP3ToEIGBgfj5+eHu7s7AgQPx9vbm8OHDZRypEEK8+KTYEKKcyM7OJicnR+fjLS0t5Yv3xAvB19eXbdu28ccff6AoCnv37uX8+fO0b99e36EJIcQLR+5GJcqdFStWEBISwu+//46Bwf/V2126dMHe3p7Vq1ezbNky5s2bx9WrV6latSqTJ0/m3Xffzbe/mJgYWrduzZ07d7C1tQUe35LXx8eHy5cv4+7uTmRkJCNGjGDt2rWMHj2aq1evEhAQwJo1a/juu++YOnUq9+7d491332XhwoUYGhoCkJGRwaRJk1i/fj13797F09OTOXPm4Ofn98TzzB1zzZo1TJgwgfPnz5OUlMStW7f45JNPOHr0KJmZmdSvX5+FCxfSoEEDANzd3QE0nwq7ubmRnJyc59vcc3JymDlzJitWrODWrVt4eHgwe/Zs/P39i/0zaRq6hywji2IfV16pDRXmNgHPkJ/IyFbpO5wylTz79afuIywsjKFDh1K5cmWMjIwwMDBg5cqVtGzZsgQiFEII8W9SbIhy56233uKjjz5i7969tGnTBoC///6bqKgodu7cyebNm/n4448JCwujbdu2bN++nffee4/KlSvTunVrncdNT09n0aJFbNiwgfv379O9e3e6deuGra0tO3fu5NKlS/To0YNmzZrRq1cvAIYNG8bp06fZsGEDLi4ubN68GX9/f06cOEGNGjWKNOacOXNYtWoV9vb2ODo6cunSJQIDA1m8eDGKojB//nwCAgK4cOECVlZW/Prrrzg6OhIREYG/v7+m8Pmv8PBw5s+fzxdffIGPjw+rV6/mjTfe4NSpUwXGlpGRQUZGhuZ5amoqAGoDBUNDpbgpLbfUBorWn+VJZmZmsY/JysoiMzNTc+yiRYs4dOgQmzZtokqVKhw4cIChQ4fi6Oio+T9BPJabM13yXp5J3nQjedONPvJWnLGk2BDlToUKFejYsSNff/215o3F999/z0svvUTr1q1p0aIFQUFBDBkyBIBRo0bxyy+/MG/evKcqNjIzM1m2bBnVqlUD4M033+Srr77ixo0bWFpaUqdOHVq3bs3evXvp1asXKSkpREREkJKSgouLC/D4uomoqCgiIiL49NNPizTm0qVL8fb21mx77bXXtNqsWLECW1tbYmNj6dSpEw4ODgDY2tri5ORUYN/z5s1j/PjxvP322wDMmTOHvXv3EhYWVuCFuaGhoUybNi3P9sk+OZibZz/xfIS2GY10Xxb3vNq5c2exj0lISMDY2Bh4XPBOnTqVCRMmYGBgwO+//467uzuvvPIKn3zyCVOnTi3pkF8I0dHR+g7huSR5043kTTdlmbf09PQit5ViQ5RLffv2ZcCAASxduhS1Ws26det4++23MTAw4MyZMwwcOFCrfbNmzQgPD3+qMc3NzTWFBkDFihVxd3fH0tJSa9vNmzcBOHHiBNnZ2dSsWVOrn4yMjCJfO2FiYoKXl5fWths3bjB58mRiYmK4efMm2dnZpKenk5KSUuRzSU1N5c8//6RZs2Za25s1a8axY8cKPG7ixImMGjVKqx9XV1dat24t14MUQ2ZmJtHR0bRr107zJloUrGHDhgQEBJCZmcnWrVvJysqiSZMmWkv+tm/fDkBAQIC+wnwmye+abiRvupG86UYfectdmVAUUmyIcqlz584oisKOHTto3Lgx+/fvZ+HChTr1lXvdh6L835KW/KYX//sfgEqlyndb7kXcaWlpGBoakpCQkGcp078LlMKYmZmhUmmv6Q8MDOSvv/4iPDwcNzc31Go1vr6+PHr0qEh9Pg21Wo1arc6z3djYWF5YdCB5y19aWhpJSUma51evXuXUqVNYWVlhbm5Oy5YtmThxIlZWVri5uREbG8vatWtZsGCB5LMA8rumG8mbbiRvuinLvBVnHCk2RLlkampK9+7dWbduHUlJSdSqVUtzgbSHhwdxcXEEBgZq2sfFxVGnTp18+8pddnTt2jUqVKgAoLmI+mn4+PiQnZ3NzZs3adGixVP3lysuLo6lS5dqPsG9evUqt2/f1mpjbGxMdnbBy5qsra1xcXEhLi6OVq1aafXdpEmTEotVCF0cOXJEa8lj7mzau+++S48ePVi7di3BwcH07duXv//+Gzc3N2bNmsWgQYP0FbIQQrywpNgQ5Vbfvn3p1KkTp06d4p133tFsHzt2LD179sTHx4e2bdvyww8/sGnTJnbv3p1vP9WrV8fV1ZWQkBBmzZrF+fPnmT9//lPHV7NmTfr27Uu/fv2YP38+Pj4+3Lp1iz179uDl5cXrr+t2V54aNWrw1Vdf0ahRI1JTUxk7dixmZmZabdzd3dmzZw/NmjVDrVZriqh/Gzt2LFOnTqVatWrUr1+fiIgIEhMTWbdunU5xCVFS/Pz8tGYac2VmZrJz506cnJyIiIjQQ2RCCFH+yPdsiHLrtddew87OjnPnztGnTx/N9q5duxIeHs68efOoW7cuX3zxBREREQXebtbY2Jj169dz9uxZvLy8mDNnDjNnziyRGCMiIujXrx+jR4+mVq1adO3alV9//ZUqVaro3Of//vc/7ty5Q4MGDXj33XcZPnw4jo6OWm3mz59PdHQ0rq6u+Pj45NvP8OHDGTVqFKNHj6ZevXpERUWxbdu2It0lSwghhBDlg0rJ7+MfIYQoA6mpqdjY2HD79m25QLwYcj+hDwgIkHXNxSB5Kz7JmW4kb7qRvOlGH3nLff2+d+8e1tbWhbaVmQ0hhBBCCCFEqZBiQ4jnVMeOHbG0tMz3UZTv4BBCCCGEKG1ygbgQz6lVq1bxzz//5LvPzs6ujKMRQgghhMhLig0hnlOVKlXSdwhCCCGEEIWSZVRCCCGEEEKIUiHFhhCixAQFBdG1a1d9hyHKgX379tG5c2dcXFxQqVRs2bJFa79KpcrzMDExYfPmzfoJWAghyikpNkS55+fnx4gRI/QdxjMrOTkZlUpVIt+KLkRJefDgAd7e3ixZsiTf/deuXdN6rF69GpVKha+vbxlHKoQQ5ZtcsyFECXj06BEmJib6DqNAmZmZcs9y8ULp2LEjHTt2LHC/k5OT1vOtW7fi5+eXZ7sQQojSJTMbolwLCgoiNjaW8PBwzVKLyMhIbG1ttdpt2bIFlUqleR4SEkL9+vVZtWoVVatWxdTUFHi8dGPVqlV069YNc3NzatSowbZt27T6io2NpUmTJqjVapydnZkwYQJZWVkArFixAhcXF3JycrSO6dKlC++//77m+datW2nQoAGmpqa8/PLLTJs2TdNHbhzLli3jjTfewMLCglmzZhWahzt37tC3b18cHBwwMzOjRo0aREREAFC1alUAfHx8UKlUmm9Sz87OZtSoUdja2mJvb8+4ceOQ7wgVz6IbN26wY8cOgoKC9B2KEEKUOzKzIcq18PBwzp8/j6enJ9OnTwdgx44dRTo2KSmJjRs3smnTJgwNDTXbp02bxty5c/nss89YvHgxffv25cqVK9jZ2fHHH38QEBBAUFAQa9as4ezZswwYMABTU1NCQkJ46623+Oijj9i7dy9t2rQB4O+//yYqKoqdO3cCsH//fvr168eiRYto0aIFFy9eZODAgQBMnTpVE0dISAizZ88mLCwMI6PC/6lPmTKF06dP8+OPP/LSSy+RlJSkua3u4cOHadKkCbt376Zu3bqaGZz58+cTGRnJ6tWr8fDwYP78+WzevJnXXnutwHEyMjLIyMjQPE9NTQWg5ZzdZBlbFCnvAtQGCjMaQcPpUWTkqJ58wHPkZEgHnY7LysoiMzMz332rV6/GysqKTp06sX///gLbibxycyU5Kx7Jm24kb7rRR96KM5YUG6Jcs7GxwcTEBHNzc83yin8XDoV59OgRa9aswcHBQWt7UFAQvXv3BuDTTz9l0aJFHD58GH9/f5YuXYqrqyuff/45KpWK2rVr8+effzJ+/HiCg4OpUKECHTt25Ouvv9YUG99//z0vvfQSrVu3Bh4XMxMmTCAwMBCAl19+mRkzZjBu3DitYqNPnz689957RTqXlJQUfHx8aNSoEQDu7u6afbnnZ29vr7UEJSwsjIkTJ9K9e3cAli9fzk8//VToOKGhoUybNi3P9sk+OZibZxcpVvF/ZjTKeXKj50xuUV1cCQkJBS4VXLJkCb6+vuzfvx+A6OhoneMrryRnupG86UbyppuyzFt6enqR20qxIYSO3Nzc8hQaAF5eXpq/W1hYYG1tzc2bNwE4c+YMvr6+WkuymjVrRlpaGr///jtVqlShb9++DBgwgKVLl6JWq1m3bh1vv/02BgaPVz0eO3aMuLg4raVR2dnZPHz4kPT0dMzNzQE0hUNRDB48mB49evDbb7/Rvn17unbtyquvvlpg+3v37nHt2jWaNm2q2WZkZESjRo0KXUo1ceJERo0apXmempqKq6srM48akGVctCJP5M5s5DDliIHMbPx/DRs2JCAgIM/2AwcO8Mcff7Blyxbq1KlDdHQ07dq1k2uYiigzM1NypgPJm24kb7rRR95yVyYUhRQbQvyHgYFBnjfM+U0XWljkv+znv//QVSpVnmswCtO5c2cURWHHjh00btyY/fv3s3DhQs3+tLQ0pk2bpplR+Lfca0cKiy8/HTt25MqVK+zcuZPo6GjatGnD0KFDmTdvXpH7KAq1Wo1arc6zfd/4ttjb25foWC+yzMxMdu7cSUKwv7wg/39GRkb55uLLL7+kYcOGNGrUSPPv2NjYWPJWTJIz3UjedCN5001Z5q0448gF4qLcMzExITv7/5bwODg4cP/+fR48eKDZVlK3ffXw8ODQoUNaxUxcXBxWVlZUrlwZeFwwdO/enXXr1rF+/Xpq1apFgwYNNO0bNGjAuXPnqF69ep5H7uyHLhwcHAgMDGTt2rWEhYWxYsUKAM01Gv/OkY2NDc7OzsTHx2u2ZWVlkZCQoPP4QhRHWloaiYmJmn+bly9fJjExkZSUFE2b1NRUvvvuOz744AM9RSmEEEJmNkS55+7uTnx8PMnJyVhaWtK0aVPMzc355JNPGD58OPHx8URGRpbIWEOGDCEsLIyPPvqIYcOGce7cOaZOncqoUaO0CoW+ffvSqVMnTp06xTvvvKPVR3BwMJ06daJKlSq8+eabGBgYcOzYMU6ePMnMmTN1iis4OJiGDRtSt25dMjIy2L59Ox4eHgA4OjpiZmZGVFQUlStXxtTUFBsbGz7++GNmz55NjRo1qF27NgsWLODu3bs650aI4jhy5IjmOiZAszwvMDBQ8+91w4YNKIqiuYZKCCFE2ZOZDVHujRkzBkNDQ+rUqYODgwOpqamsXbuWnTt3Uq9ePdavX09ISEiJjFWpUiV27tzJ4cOH8fb2ZtCgQfTv35/JkydrtXvttdews7Pj3Llz9OnTR2tfhw4d2L59O7t27aJx48a88sorLFy4EDc3N53jMjExYeLEiXh5edGyZUsMDQ3ZsGED8Hh5yqJFi/jiiy9wcXGhS5cuAIwePZp3332XwMBAfH19sbKyolu3bjrHIERx+Pn5oShKnse/PxgYOHAg6enp2NjY6C9QIYQo51SK3BhfCKEnqamp2NjYcPv2bblmoxhyr9kICAiQdc3FIHkrPsmZbiRvupG86UYfect9/b537x7W1taFtpWZDSGEEEIIIUSpkGJDiHJg0KBBWFpa5vsYNGiQvsMTQgghxAtKLhAXohyYPn06Y8aMyXffk6Y/hRBCCCF0JcWGEOWAo6Mjjo6O+g5DCCGEEOWMLKMSQgghhBBClAopNoQQQjxz9u3bR+fOnXFxcUGlUrFly5Y8bc6cOcMbb7yBjY0NFhYWNG7cWOtL/YQQQuifFBtClBB3d3fCwsL0HUaZiYmJQaVSyRf5iVLx4MEDvL29WbJkSb77L168SPPmzalduzYxMTEcP36cKVOmYGpqWsaRCiGEKIxcsyFEAZKTk6latSpHjx6lfv36ZTauu7s7I0aMYMSIEWU25pP4+flRv379clVMCf3q2LEjHTt2LHD/pEmTCAgIYO7cuZpt1apVK4vQhBBCFIPMbAjxlB49elTmY2ZnZ5OTk1Pm4wrxLMjJyWHHjh3UrFmTDh064OjoSNOmTfNdaiWEEEK/ZGZDlHs5OTnMmzePFStWcPXqVSpWrMiHH37I5MmTAfDx8QGgVatWxMTEEBQUxN27d2ncuDFLlixBrVZz+fLlIo+nKArTpk1j9erV3LhxA3t7e958800WLVqEn58fV65cYeTIkYwcOVLTPjIykhEjRrBmzRomTJjA+fPnSUpKwtnZmUmTJrF+/Xru3r2Lp6cnc+bMwc/PD0Bz3DfffMOIESO4evUqzZs3JyIiAmdnZwCysrIYNWoUa9aswdDQkA8++IDr169z7949tmzZQlBQELGxscTGxhIeHg6gdb4JCQmMHz+e06dPU79+fSIiIqhVq1axfgZNQ/eQZWRRrGPKM7Whwtwm4BnyExnZKn2HU2zJs19/quNv3rxJWloas2fPZubMmcyZM4eoqCi6d+/O3r17adWqVQlFKoQQ4mlJsSHKvYkTJ7Jy5UoWLlxI8+bNuXbtGmfPnuXw4cM0adKE3bt3U7duXUxMTDTH7NmzB2tra6Kjo4s93saNG1m4cCEbNmygbt26XL9+nWPHjgGwadMmvL29GThwIAMGDNA6Lj09nTlz5rBq1Srs7e1xdHRk2LBhnD59mg0bNuDi4sLmzZvx9/fnxIkT1KhRQ3PcvHnz+OqrrzAwMOCdd95hzJgxrFu3DoA5c+awbt06IiIi8PDwIDw8nC1bttC6dWsAwsPDOX/+PJ6enkyfPh0ABwcHkpOTgcfLWebPn4+DgwODBg3i/fffJy4uLt9zz8jIICMjQ/M8NTUVALWBgqGhUuxclldqA0Xrz+dNZmZmsY/JysrSHJf7O9S5c2eGDRsGQN26dTlw4ABLly7l1VdfLXRcXcYvryRnupG86Ubypht95K04Y0mxIcq1+/fvEx4ezueff05gYCDweN138+bNNW+m7e3tcXJy0jrOwsKCVatWaRUgRZWSkoKTkxNt27bF2NiYKlWq0KRJEwDs7OwwNDTEysoqz5iZmZksXboUb29vTT8RERGkpKTg4uICwJgxY4iKiiIiIoJPP/1Uc9zy5cs169mHDRumKRoAFi9ezMSJE+nWrRsAn3/+OTt37tTst7GxwcTEBHNz8zwxAcyaNUvzSfKECRN4/fXXefjwYb4X6oaGhjJt2rQ82yf75GBunl3EDIpcMxo9n0vp/v37VVQJCQkYGxsDj3+nDQ0NMTQ01OrLxMSE48ePP7F/XT4kKO8kZ7qRvOlG8qabssxbenp6kdtKsSHKtTNnzpCRkUGbNm2KdVy9evV0KjQA3nrrLcLCwnj55Zfx9/cnICCAzp07Y2RU+D9HExMTvLy8NM9PnDhBdnY2NWvW1GqXkZGBvb295rm5ubnWhbPOzs7cvHkTgHv37nHjxg1NsQNgaGhIw4YNi3xNyL9jyl2adfPmTapUqZKn7cSJExk1apTmeWpqKq6ursw8akCWsWGRxhOPZzRmNMphyhEDMnKev2VUJ0M6FPuYhg0bEhAQoHneuHFjAK1tq1evxtvbW2vbv2VmZhIdHU27du00hYsonORMN5I33UjedKOPvOWuTCgKKTZEuWZmZqbTcRYWul9f4Orqyrlz59i9ezfR0dEMGTKEzz77jNjY2EL/kzAzM0Ol+r83lmlpaRgaGpKQkIChofYbdUtLS83f/9unSqVCUUpu+c2/+8+Nr6BCRa1Wo1ar82zfN76tVoEkCpeZmcnOnTtJCPZ/YV+Q09LSSEpK0jy/evUqp06dws7OjipVqjBu3Dh69eqFn58frVu3Jioqih07dhATE/PEnBgbG7+weSstkjPdSN50I3nTTVnmrTjjyN2oRLlWo0YNzMzM2LNnT559uTMX2dklv7zHzMyMzp07s2jRImJiYjh06BAnTpzQjFuUMX18fMjOzubmzZtUr15d65Hfcqf82NjYULFiRX799VfNtuzsbH777TetdkWNSYiScuTIEXx8fDQ3aBg1ahQ+Pj4EBwcD0K1bN5YvX87cuXOpV68eq1atYuPGjTRv3lyfYQshhPgPmdkQ5ZqpqSnjx49n3LhxmJiY0KxZM27dusWpU6cIDAzEzMyMqKgoKleujKmpKTY2Nk89ZmRkJNnZ2TRt2hRzc3PWrl2LmZkZbm5uwOPv2di3bx9vv/02arWal156Kd9+atasSd++fenXrx/z58/Hx8eHW7dusWfPHry8vHj99aLd8eejjz4iNDSU6tWrU7t2bRYvXsydO3e0ZlHc3d2Jj48nOTkZS0tL7OzsnjoPQhTGz8/viTNw77//Pu+//34ZRSSEEEIXMrMhyr0pU6YwevRogoOD8fDwoFevXty8eRMjIyMWLVrEF198gYuLC126dCmR8WxtbVm5ciXNmjXDy8uL3bt388MPP2iWEU2fPp3k5GSqVauGg4NDoX1FRETQr18/Ro8eTa1atejatSu//vprvtdLFGT8+PH07t2bfv364evri6WlJR06dNC6wHvMmDEYGhpSp04dHBwcSElJ0e3khRBCCFGuqJSSXLwthHju5eTk4OHhQc+ePZkxY0apjpWamoqNjQ23b9+WazaKIfeajYCAAFnXXAySt+KTnOlG8qYbyZtu9JG33Nfve/fuYW1tXWhbWUYlRDl35coVdu3aRatWrcjIyODzzz/n8uXL9OnTR9+hCSGEEOI5J8uohChh69atw9LSMt9H3bp19R1eHgYGBkRGRtK4cWOaNWvGiRMn2L17Nx4eHvoOTQghhBDPOZnZEKKEvfHGGzRt2jTffc/itLCrq2uB3/gthBBCCPE0pNgQooRZWVlhZWWl7zCEEEIIIfROllEJIYQQQgghSoUUG0IIIcrcvn376Ny5My4uLqhUKrZs2aK1PygoCJVKpfXw9/fXT7BCCCF0JsWGEC+Q5ORkVCoViYmJT93Xpk2baN++Pfb29k/sU1EUOnbsmO+bRiHy8+DBA7y9vVmyZEmBbfz9/bl27ZrmsX79+jKMUAghREmQazaEKIcePXqEiYlJoW0ePHhA8+bN6dmzJwMGDCi0bVhYmNY3jgvxJB07dqRjx46FtlGr1Tg5OZVRREIIIUqDzGwI8ZyJioqiefPm2NraYm9vT6dOnbh48SIAVatWBcDHxweVSoWfnx/weElK165dmTVrFi4uLtSqVeuJ47z77rsEBwfTtm3bQtslJiYyf/58Vq9e/XQnJsR/xMTE4OjoSK1atRg8eDB//fWXvkMSQghRTDKzIcRz5sGDB4waNQovLy/S0tIIDg6mW7duJCYmcvjwYZo0acLu3bupW7eu1uzFnj17sLa2Jjo6usRiSU9Pp0+fPixZsuSpPoFuGrqHLCOLEovrRac2VJjbBDxDfiIj+9mbUUqe/fpT9+Hv70/37t2pWrUqFy9e5JNPPqFjx44cOnQIQ0PDEohSCCFEWZBiQ4jnTI8ePbSer169GgcHB06fPo2DgwMA9vb2ed78W1hYsGrVqicunyqOkSNH8uqrr9KlS5citc/IyCAjI0PzPDU1FQC1gYKhoVJicb3o1AaK1p/PmszMzGIfk5WVpXXcv3/Pa9eujYeHB7Vr12b37t289tprTxWXLvGVV5Iz3UjedCN5040+8lacsaTYEOI5c+HCBYKDg4mPj+f27dvk5OQAkJKSQp06dQo8rl69eiVaaGzbto2ff/6Zo0ePFvmY0NBQpk2blmf7ZJ8czM2zSyy28mJGoxx9h5CvnTt3FvuYhISEJ37ppbW1NVu3buXhw4e6hgZQorN75YXkTDeSN91I3nRTlnlLT08vclspNoR4znTu3Bk3NzdWrlyJi4sLOTk5eHp68ujRo0KPs7Ao2WVKP//8MxcvXsTW1lZre48ePWjRogUxMTF5jpk4cSKjRo3SPE9NTcXV1ZXWrVtjb29fovG9yDIzM4mOjqZdu3bP5LfS66Jhw4YEBAQUuP/333/n/v37tG3bttB2hXkR81baJGe6kbzpRvKmG33kLXdlQlFIsSHEc+Svv/7i3LlzrFy5khYtWgBw4MABzf7cmYvs7NKfJZgwYQIffPCB1rZ69eqxcOFCOnfunO8xarUatVqdZ7uxsbG8sOjgec5bWloaSUlJmudXr17l1KlT2NnZYWdnx7Rp0+jRowdOTk5cvHiRcePGUb16dV5//fWnPufnOW/6IjnTjeRNN5I33ZRl3oozjhQbQjxHKlSogL29PStWrMDZ2ZmUlBQmTJig2e/o6IiZmRlRUVFUrlwZU1NTbGxsdBrr77//JiUlhT///BOAc+fOAeDk5KT1+K8qVapo7oolREGOHDlC69atNc9zZ7wCAwNZtmwZx48f58svv+Tu3bu4uLjQvn17ZsyYkW+xKoQQ4tklxYYQzxEDAwM2bNjA8OHD8fT0pFatWixatEhzi1sjIyMWLVrE9OnTCQ4OLnA5U1Fs27aN9957T/P87bffBmDq1KmEhIQ85ZmI8s7Pzw9FKfgC959++qkMoxFCCFFapNgQ4jnTtm1bTp8+rbXt32/aPvjggzzLmyIjI4s9TlBQEEFBQcU6prA3j0IIIYQof+RL/YQQQgghhBClQooNIcqh/fv3Y2lpWeBDCCGEEKIkyDIqIcqhRo0akZiYqO8whBBCCPGCk2JDiHLIzMyM6tWr6zsMIYQQQrzgZBmVEEIIIYQQolRIsSGEEKLE7du3j86dO+Pi4oJKpWLLli0Fth00aBAqlYqwsLAyi08IIUTZkGKjEMnJyahUKlnb/gIICgqia9eu+g5DiHLjwYMHeHt7s2TJkkLbbd68mV9++QUXF5cyikwIIURZKpfFxrP0xjMmJgaVSsXdu3f1HQoA9+/fZ8SIEbi5uWFmZsarr77Kr7/+qtVGURSCg4NxdnbGzMyMtm3bcuHChTKP9VkrBv38/BgxYoS+w9DYs2cPr776KlZWVjg5OTF+/HiysrK02hw/fpwWLVpgamqKq6src+fOLXL/K1eupEWLFlSoUIEKFSrQtm1bDh8+XNKnIZ5THTt2ZObMmXTr1q3ANn/88QcfffQR69atw9jYuAyjE0IIUVbKZbFRFhRFyfPGrrRlZmY+dR8ffPAB0dHRfPXVV5w4cYL27dvTtm1b/vjjD02buXPnsmjRIpYvX058fDwWFhZ06NCBhw8fPvX4z6JHjx49d+MdO3aMgIAA/P39OXr0KN988w3btm1jwoQJmjapqam0b98eNzc3EhIS+OyzzwgJCWHFihVFGiMmJobevXuzd+9eDh06hKurK+3bt9f6XRGiIDk5Obz77ruMHTuWunXr6jscIYQQpeSFvhvV999/z7Rp00hKSsLc3BwfHx98fHz48ssvAVCpVADs3bsXPz8/Dh8+zIcffsiZM2fw9PRk0qRJRR4rJiaG1q1bs3PnTiZPnsyJEyfYtWsXLVu2ZM6cOaxYsYLr169Ts2ZNpkyZwptvvklycjKtW7cGoEKFCgAEBgYSGRmJu7s7I0aM0PqkvH79+nTt2pWQkBBN/EuXLuXHH39kz549jB07FoAtW7YwevRopkyZwp07d+jYsSMrV67Eysqq0HP4559/2LhxI1u3bqVly5YAhISE8MMPP7Bs2TJmzpyJoiiEhYUxefJkunTpAsCaNWuoWLEiW7Zs4e233y5yzorizp07DBs2jF27dpGWlkblypX55JNPeO+996hatSoAPj4+ALRq1YqYmBiys7MZO3Ysq1evxtDQkP79+xfrm639/Pzw9PTEyMiItWvXUq9ePfbu3cvJkycZO3Ys+/fvx8LCgvbt27Nw4UJeeuklgoKCiI2NJTY2lvDwcAAuX75MTEwMI0aM0Jq52rJlC926ddPEFBISwpYtWxg2bBizZs3iypUr5OTkoFKpWLlyJTt27OCnn36iUqVKzJ8/nzfeeOOJ5/DNN9/g5eVFcHAwANWrV2fu3Ln07NmTqVOnYmVlxbp163j06BGrV6/GxMSEunXrkpiYyIIFCxg4cOATx1i3bp3W81WrVrFx40b27NlDv379ippuAJqG7iHLyKJYx5RnakOFuU3AM+QnMrJVZT5+8uzXn7qPOXPmYGRkxPDhw0sgIiGEEM+qF7bYuHbtGr1792bu3Ll069aN+/fvs3//fvr160dKSgqpqalEREQAYGdnR1paGp06daJdu3asXbuWy5cv8/HHHxd73AkTJjBv3jxefvllKlSoQGhoKGvXrmX58uXUqFGDffv28c477+Dg4EDz5s3ZuHEjPXr04Ny5c1hbW2NmZlas8UJCQpg9ezZhYWEYGRmxevVqLl68yJYtW9i+fTt37tyhZ8+ezJ49m1mzZhXaV1ZWFtnZ2ZiammptNzMz48CBA8DjN9DXr1+nbdu2mv02NjY0bdqUQ4cOlXixMWXKFE6fPs2PP/7ISy+9RFJSEv/88w8Ahw8fpkmTJuzevZu6detiYmICwPz584mMjGT16tV4eHgwf/58Nm/ezGuvvVbkcb/88ksGDx5MXFwcAHfv3uW1117jgw8+YOHChfzzzz+MHz+enj178vPPPxMeHs758+fx9PRk+vTpADg4OBR5vKSkJDZu3MimTZswNDTUbJ82bRpz587ls88+Y/HixfTt25crV65gZ2dXaH8ZGRn5/hwfPnxIQkICfn5+HDp0iJYtW2ryBtChQwfmzJnDnTt3NAVwUaWnp5OZmVlobBkZGWRkZGiep6amAqA2UDA0LHpBWN6pDRStP8uaLrOoWVlZmuN+++03wsPDiY+P15oBzs7OLpEZ2oLk9l2aY7xoJGe6kbzpRvKmG33krThjvdDFRlZWFt27d8fNzQ2AevXqAY/fdGVkZODk5KRpHxkZSU5ODv/73/8wNTWlbt26/P777wwePLhY406fPp127doBj99Yffrpp+zevRtfX18AXn75ZQ4cOMAXX3xBq1atNG/MHB0dsbW1LfZ59unTh/fee09rW05ODpGRkZqZjHfffZc9e/Y8sdiwsrLC19eXGTNm4OHhQcWKFVm/fj2HDh3SfCfD9evXAahYsaLWsRUrVtTsK0kpKSn4+PjQqFEjANzd3TX7ct/M29vba/0sw8LCmDhxIt27dwdg+fLl/PTTT8Uat0aNGlrXL8ycORMfHx8+/fRTzbbVq1fj6urK+fPnqVmzJiYmJpibm2vFUlSPHj1izZo1eQqUoKAgevfuDcCnn37KokWLOHz4MP7+/oX216FDB8LCwli/fj09e/bk+vXrmiLo2rVrwOOfZe7sUK7cn+v169eLXWyMHz8eFxcXrUL0v0JDQ5k2bVqe7ZN9cjA3zy7WeAJmNMrRy7g7d+4s9jEJCQma6zK2bdvGzZs3efnllzX7c3JyGDduHHPmzGHlypUlFmt+oqOjS7X/F5HkTDeSN91I3nRTlnlLT08vctsXttjw9vamTZs21KtXjw4dOtC+fXvefPPNAt9AnTlzBi8vL61Pg3MLhOLIfVMMjz+tTk9P1xQfuR49eqRZ+vO0/j1eLnd3d60lU87Ozty8ebNI/X311Ve8//77VKpUCUNDQxo0aEDv3r1JSEgokXg7duzI/v37AXBzc+PUqVOFth88eDA9evTgt99+o3379nTt2pVXX321wPb37t3j2rVrNG3aVLPNyMiIRo0aFWspVcOGDbWeHzt2jL1792JpaZmn7cWLF6lZs2aR+86Pm5tbvjMhXl5emr9bWFhgbW1dpJ9l+/bt+eyzzxg0aBDvvvsuarWaKVOmsH//fgwMSv5SrdmzZ7NhwwZiYmLyzKj828SJExk1apTmeWpqKq6ursw8akCWsWGBxwltagOFGY1ymHLEgIycsl9GdTKkQ7GPadiwIQEBAQA0bdqUYcOGae3v1KkTffr0ITAwkFq1apVInP+VmZlJdHQ07dq1kwvSi0hyphvJm24kb7rRR95yVyYUxQtbbBgaGhIdHc3BgwfZtWsXixcvZtKkScTHx5fquBYW/7fuPC0tDYAdO3ZQqVIlrXZqtbrQfgwMDPK8Oc5vyurf4+X67y+aSqUiJ6don4BWq1aN2NhYHjx4QGpqKs7OzvTq1UvzCWTup/Y3btzA2dlZc9yNGzeoX7/+E/tftWqVZhlUUf5BdOzYkStXrrBz506io6Np06YNQ4cOZd68eUU6H139N69paWl07tyZOXPm5Gn77zz819P8HOHpfpajRo1i5MiRXLt2jQoVKpCcnMzEiRO1fpY3btzQOib3eXFmZ+bNm8fs2bPZvXu3VnGUH7Vane/v/r7xbbG3ty/ymOVdZmYmO3fuJCHY/5l9QU5LSyMpKUnz/OrVq5w6dQo7OzuqVKmS53fM2NiYSpUq4enpWeqxGRsbP7N5e1ZJznQjedON5E03ZZm34ozzQt+NSqVS0axZM6ZNm8bRo0cxMTFh8+bNmJiYkJ2tvWTDw8OD48ePa91R6Zdffnmq8evUqYNarSYlJYXq1atrPVxdXQE06+X/G4+Dg4NmuQs8riAvX778VPEUh4WFBc7Ozty5c4effvpJczF41apVcXJyYs+ePVqxxcfHF2kmqFKlSpoc5C5vexIHBwcCAwNZu3YtYWFhmrsl5Zc7GxsbnJ2dtYrKrKysp56ZadCgAadOncLd3T3PzzK3UMjv98rBwYH79+/z4MEDzbayvFWvSqXCxcUFMzMz1q9fj6urKw0aNAAez9zt27dPq/iJjo6mVq1aRV5CNXfuXGbMmEFUVFS+s2yi/Dpy5IjmphzwuPj18fHR3LRACCFE+fDCzmzEx8ezZ88e2rdvj6OjI/Hx8dy6dQsPDw8ePnzITz/9xLlz57C3t8fGxoY+ffowadIkBgwYwMSJE0lOTn7qT8+trKwYM2YMI0eOJCcnh+bNm3Pv3j3i4uKwtrYmMDAQNzc3VCoV27dvJyAgADMzMywtLXnttdeIjIykc+fO2NraEhwcrHXhcGn56aefUBSFWrVqkZSUxNixY6ldu7bmuhCVSsWIESOYOXMmNWrUoGrVqkyZMgUXF5dS+e6S4OBgGjZsSN26dcnIyGD79u14eHgAj69zMTMzIyoqisqVK2NqaoqNjQ0ff/wxs2fPpkaNGtSuXZsFCxY89feYDB06lJUrV9K7d2/GjRuHnZ0dSUlJbNiwgVWrVmFoaIi7uzvx8fEkJydjaWmJnZ0dTZs2xdzcnE8++YThw4cTHx9PZGTk0yemCD777DP8/f0xMDBg06ZNzJ49m2+//Vbze9SnTx+mTZtG//79GT9+PCdPniQ8PJyFCxcWqf85c+YQHBzM119/jbu7u+aaHUtLy3yXm4nyxc/Pr1hLF5OTk0svGCGEEHrzws5sWFtbs2/fPgICAqhZsyaTJ09m/vz5dOzYkQEDBlCrVi0aNWqEg4MDcXFxWFpa8sMPP3DixAl8fHyYNGlSvktmimvGjBlMmTKF0NBQPDw88Pf3Z8eOHZoLcytVqsS0adOYMGECFStW1KxjnjhxIq1ataJTp068/vrrdO3alWrVqj11PE9y7949hg4dSu3atenXrx/Nmzfnp59+0pouGzduHB999BEDBw6kcePGpKWlERUVVehafV2ZmJgwceJEvLy8aNmyJYaGhmzYsAF4fC3GokWL+OKLL3BxcdHMvowePZp3332XwMBAfH19sbKyKvSLxYrCxcWFuLg4srOzad++PfXq1WPEiBHY2tpqroEYM2YMhoaG1KlTBwcHB1JSUrCzs2Pt2rXs3LmTevXqsX79es2ti0vbjz/+SIsWLWjUqBE7duxg69atWgWhjY0Nu3bt4vLlyzRs2JDRo0cTHBxcpNveAixbtoxHjx7x5ptv4uzsrHmU9hI3IYQQQjw/VEpxPnoSQogSlJqaio2NDbdv35ZrNooh95qNgIAAWddcDJK34pOc6UbyphvJm270kbfc1+979+5hbW1daNsXdmZDCCGEEEIIoV9SbBTRoEGDNGvR//sYNGiQvsMrkpSUlALPwdLSkpSUlKce49NPPy2w/44dO+ZpX9Z5LYsclIWyyFthecq9fbEQQgghRGFe2AvES9r06dMZM2ZMvvueNH30rHBxcSn0TkguLi5PPcagQYPo2bNnvvvy+3b0ss5rWeSgLJRF3grL039v5SyEEEIIkR8pNorI0dERR0dHfYfxVIyMjDTfBF5a7OzsNN+KXhRlndeyyEFZKIu8vQh5EkIIIYR+yTIqIYQQQgghRKmQYkMIIYQQQghRKqTYEEIIIYQQQpQKKTaEEEIIIYQQpUKKDSGEEEIIIUSpkGJDCCGEEEIIUSrk1rdCCL1RFAWA+/fvY2xsrOdonh+ZmZmkp6eTmpoqeSsGyVvxSc50I3nTjeRNN/rIW2pqKvB/r+OFkWJDCKE3f/31FwBVq1bVcyRCCCGEKK779+9jY2NTaBspNoQQepP7BZApKSlP/M9K/J/U1FRcXV25evVqiX1jfHkgeSs+yZluJG+6kbzpRh95UxSF+/fv4+Li8sS2UmwIIfTGwODxZWM2NjbywqIDa2tryZsOJG/FJznTjeRNN5I33ZR13or6IaFcIC6EEEIIIYQoFVJsCCGEEEIIIUqFFBtCCL1Rq9VMnToVtVqt71CeK5I33Ujeik9yphvJm24kb7p51vOmUopyzyohhBBCCCGEKCaZ2RBCCCGEEEKUCik2hBBCCCGEEKVCig0hhBBCCCFEqZBiQwghhBBCCFEqpNgQQujNkiVLcHd3x9TUlKZNm3L48GF9h/RM2bdvH507d8bFxQWVSsWWLVu09iuKQnBwMM7OzpiZmdG2bVsuXLign2CfEaGhoTRu3BgrKyscHR3p2rUr586d02rz8OFDhg4dir29PZaWlvTo0YMbN27oKeJnw7Jly/Dy8tJ8KZivry8//vijZr/k7Mlmz56NSqVixIgRmm2St7xCQkJQqVRaj9q1a2v2S84K9scff/DOO+9gb2+PmZkZ9erV48iRI5r9z+prghQbQgi9+Oabbxg1ahRTp07lt99+w9vbmw4dOnDz5k19h/bMePDgAd7e3ixZsiTf/XPnzmXRokUsX76c+Ph4LCws6NChAw8fPizjSJ8dsbGxDB06lF9++YXo6GgyMzNp3749Dx480LQZOXIkP/zwA9999x2xsbH8+eefdO/eXY9R61/lypWZPXs2CQkJHDlyhNdee40uXbpw6tQpQHL2JL/++itffPEFXl5eWtslb/mrW7cu165d0zwOHDig2Sc5y9+dO3do1qwZxsbG/Pjjj5w+fZr58+dToUIFTZtn9jVBEUIIPWjSpIkydOhQzfPs7GzFxcVFCQ0N1WNUzy5A2bx5s+Z5Tk6O4uTkpHz22WeabXfv3lXUarWyfv16PUT4bLp586YCKLGxsYqiPM6RsbGx8t1332nanDlzRgGUQ4cO6SvMZ1KFChWUVatWSc6e4P79+0qNGjWU6OhopVWrVsrHH3+sKIr8rhVk6tSpire3d777JGcFGz9+vNK8efMC9z/LrwkysyGEKHOPHj0iISGBtm3barYZGBjQtm1bDh06pMfInh+XL1/m+vXrWjm0sbGhadOmksN/uXfvHgB2dnYAJCQkkJmZqZW32rVrU6VKFcnb/5ednc2GDRt48OABvr6+krMnGDp0KK+//rpWfkB+1wpz4cIFXFxcePnll+nbty8pKSmA5Kww27Zto1GjRrz11ls4Ojri4+PDypUrNfuf5dcEKTaEEGXu9u3bZGdnU7FiRa3tFStW5Pr163qK6vmSmyfJYcFycnIYMWIEzZo1w9PTE3icNxMTE2xtbbXaSt7gxIkTWFpaolarGTRoEJs3b6ZOnTqSs0Js2LCB3377jdDQ0Dz7JG/5a9q0KZGRkURFRbFs2TIuX75MixYtuH//vuSsEJcuXWLZsmXUqFGDn376icGDBzN8+HC+/PJL4Nl+TTDS6+hCCCFEKRk6dCgnT57UWg8uClarVi0SExO5d+8e33//PYGBgcTGxuo7rGfW1atX+fjjj4mOjsbU1FTf4Tw3OnbsqPm7l5cXTZs2xc3NjW+//RYzMzM9RvZsy8nJoVGjRnz66acA+Pj4cPLkSZYvX05gYKCeoyuczGwIIcrcSy+9hKGhYZ47jNy4cQMnJyc9RfV8yc2T5DB/w4YNY/v27ezdu5fKlStrtjs5OfHo0SPu3r2r1V7yBiYmJlSvXp2GDRsSGhqKt7c34eHhkrMCJCQkcPPmTRo0aICRkRFGRkbExsayaNEijIyMqFixouStCGxtbalZsyZJSUnyu1YIZ2dn6tSpo7XNw8NDswTtWX5NkGJDCFHmTExMaNiwIXv27NFsy8nJYc+ePfj6+uoxsudH1apVcXJy0sphamoq8fHx5TqHiqIwbNgwNm/ezM8//0zVqlW19jds2BBjY2OtvJ07d46UlJRynbf85OTkkJGRITkrQJs2bThx4gSJiYmaR6NGjejbt6/m75K3J0tLS+PixYs4OzvL71ohmjVrluc23ufPn8fNzQ14xl8T9Hp5uhCi3NqwYYOiVquVyMhI5fTp08rAgQMVW1tb5fr16/oO7Zlx//595ejRo8rRo0cVQFmwYIFy9OhR5cqVK4qiKMrs2bMVW1tbZevWrcrx48eVLl26KFWrVlX++ecfPUeuP4MHD1ZsbGyUmJgY5dq1a5pHenq6ps2gQYOUKlWqKD///LNy5MgRxdfXV/H19dVj1Po3YcIEJTY2Vrl8+bJy/PhxZcKECYpKpVJ27dqlKIrkrKj+fTcqRZG85Wf06NFKTEyMcvnyZSUuLk5p27at8tJLLyk3b95UFEVyVpDDhw8rRkZGyqxZs5QLFy4o69atU8zNzZW1a9dq2jyrrwlSbAgh9Gbx4sVKlSpVFBMTE6VJkybKL7/8ou+Qnil79+5VgDyPwMBARVEe3+pwypQpSsWKFRW1Wq20adNGOXfunH6D1rP88gUoERERmjb//POPMmTIEKVChQqKubm50q1bN+XatWv6C/oZ8P777ytubm6KiYmJ4uDgoLRp00ZTaCiK5Kyo/ltsSN7y6tWrl+Ls7KyYmJgolSpVUnr16qUkJSVp9kvOCvbDDz8onp6eilqtVmrXrq2sWLFCa/+z+pqgUhRF0c+cihBCCCGEEOJFJtdsCCGEEEIIIUqFFBtCCCGEEEKIUiHFhhBCCCGEEKJUSLEhhBBCCCGEKBVSbAghhBBCCCFKhRQbQgghhBBCiFIhxYYQQgghhBCiVEixIYQQQohi8fPzY8SIEfoOQwjxHJBiQwghhChBQUFBqFSqPI+kpKQS6T8yMhJbW9sS6UtXmzZtYsaMGXqNoTAxMTGoVCru3r2r71CEKPeM9B2AEEII8aLx9/cnIiJCa5uDg4OeoilYZmYmxsbGxT7Ozs6uFKIpGZmZmfoOQQjxLzKzIYQQQpQwtVqNk5OT1sPQ0BCArVu30qBBA0xNTXn55ZeZNm0aWVlZmmMXLFhAvXr1sLCwwNXVlSFDhpCWlgY8/sT+vffe4969e5oZk5CQEABUKhVbtmzRisPW1pbIyEgAkpOTUalUfPPNN7Rq1QpTU1PWrVsHwKpVq/Dw8MDU1JTatWuzdOnSQs/vv8uo3N3dmTlzJv369cPS0hI3Nze2bdvGrVu36NKlC5aWlnh5eXHkyBHNMbkzNFu2bKFGjRqYmprSoUMHrl69qjXWsmXLqFatGiYmJtSqVYuvvvpKa79KpWLZsmW88cYbWFhYMGDAAFq3bg1AhQoVUKlUBAUFARAVFUXz5s2xtbXF3t6eTp06cfHiRU1fuTnatGkTrVu3xtzcHG9vbw4dOqQ1ZlxcHH5+fpibm1OhQgU6dOjAnTt3AMjJySE0NJSqVatiZmaGt7c333//faH5FOKFpgghhBCixAQGBipdunTJd9++ffsUa2trJTIyUrl48aKya9cuxd3dXQkJCdG0WbhwofLzzz8rly9fVvbs2aPUqlVLGTx4sKIoipKRkaGEhYUp1tbWyrVr15Rr164p9+/fVxRFUQBl8+bNWuPZ2NgoERERiqIoyuXLlxVAcXd3VzZu3KhcunRJ+fPPP5W1a9cqzs7Omm0bN25U7OzslMjIyALPsVWrVsrHH3+see7m5qbY2dkpy5cvV86fP68MHjxYsba2Vvz9/ZVvv/1WOXfunNK1a1fFw8NDycnJURRFUSIiIhRjY2OlUaNGysGDB5UjR44oTZo0UV599VVNv5s2bVKMjY2VJUuWKOfOnVPmz5+vGBoaKj///LOmDaA4Ojoqq1evVi5evKgkJycrGzduVADl3LlzyrVr15S7d+8qiqIo33//vbJx40blwoULytGjR5XOnTsr9erVU7Kzs7VyVLt2bWX79u3KuXPnlDfffFNxc3NTMjMzFUVRlKNHjypqtVoZPHiwkpiYqJw8eVJZvHixcuvWLUVRFGXmzJlK7dq1laioKOXixYtKRESEolarlZiYmALzKcSLTIoNIYQQogQFBgYqhoaGioWFhebx5ptvKoqiKG3atFE+/fRTrfZfffWV4uzsXGB/3333nWJvb695HhERodjY2ORpV9RiIywsTKtNtWrVlK+//lpr24wZMxRfX98CY8qv2HjnnXc0z69du6YAypQpUzTbDh06pADKtWvXNOcBKL/88oumzZkzZxRAiY+PVxRFUV599VVlwIABWmO/9dZbSkBAgNZ5jxgxQqvN3r17FUC5c+dOgeegKIpy69YtBVBOnDihKMr/5WjVqlWaNqdOnVIA5cyZM4qiKErv3r2VZs2a5dvfw4cPFXNzc+XgwYNa2/v376/07t270FiEeFHJNRtCCCFECWvdujXLli3TPLewsADg2LFjxMXFMWvWLM2+7OxsHj58SHp6Oubm5uzevZvQ0FDOnj1LamoqWVlZWvufVqNGjTR/f/DgARcvXqR///4MGDBAsz0rKwsbG5ti9evl5aX5e8WKFQGoV69enm03b97EyckJACMjIxo3bqxpU7t2bWxtbTlz5gxNmjThzJkzDBw4UGucZs2aER4eXuA5FebChQsEBwcTHx/P7du3ycnJASAlJQVPT898z8XZ2VkTd+3atUlMTOStt97Kt/+kpCTS09Np166d1vZHjx7h4+NTpBiFeNFIsSGEEEKUMAsLC6pXr55ne1paGtOmTaN79+559pmampKcnEynTp0YPHgws2bNws7OjgMHDtC/f38ePXpUaLGhUqlQFEVrW34XS+cWPrnxAKxcuZKmTZtqtcu9xqSo/n2huUqlKnBb7hv8kvTvcypM586dcXNzY+XKlbi4uJCTk4OnpyePHj3SaldY3GZmZgX2n5vPHTt2UKlSJa19arW6SDEK8aKRYkMIIYQoIw0aNODcuXP5FiIACQkJ5OTkMH/+fAwMHt/D5dtvv9VqY2JiQnZ2dp5jHRwcuHbtmub5hQsXSE9PLzSeihUr4uLiwqVLl+jbt29xT+epZWVlceTIEZo0aQLAuXPnuHv3Lh4eHgB4eHgQFxdHYGCg5pi4uDjq1KlTaL8mJiYAWnn666+/OHfuHCtXrqRFixYAHDhwoNgxe3l5sWfPHqZNm5ZnX506dVCr1aSkpNCqVati9y3Ei0iKDSGEEKKMBAcH06lTJ6pUqcKbb76JgYEBx44d4+TJk8ycOZPq1auTmZnJ4sWL6dy5M3FxcSxfvlyrD3d3d9LS0tizZw/e3t6Ym5tjbm7Oa6+9xueff46vry/Z2dmMHz++SLe1nTZtGsOHD8fGxgZ/f38yMjI4cuQId+7cYdSoUaWVCuDxDMJHH33EokWLMDIyYtiwYbzyyiua4mPs2LH07NkTHx8f2rZtyw8//MCmTZvYvXt3of26ubmhUqnYvn07AQEBmJmZUaFCBezt7VmxYgXOzs6kpKQwYcKEYsc8ceJE6tWrx5AhQxg0aBAmJibs3buXt956i5deeokxY8YwcuRIcnJyaN68Offu3SMuLg5ra2utokmI8kJufSuEEEKUkQ4dOrB9+3Z27dpF48aNeeWVV1i4cCFubm4AeHt7s2DBAubMmYOnpyfr1q0jNDRUq49XX32VQYMG0atXLxwcHJg7dy4A8+fPx9XVlRYtWtCnTx/GjBlTpGs8PvjgA1atWkVERAT16tWjVatWREZGUrVq1ZJPwH+Ym5szfvx4+vTpQ7NmzbC0tOSbb77R7O/atSvh4eHMmzePunXr8sUXXxAREYGfn1+h/VaqVIlp06YxYcIEKlasyLBhwzAwMGDDhg0kJCTg6enJyJEj+eyzz4odc82aNdm1axfHjh2jSZMm+Pr6snXrVoyMHn9+O2PGDKZMmUJoaCgeHh74+/uzY8eOMsmnEM8ilfLfBZ5CCCGEEKUsMjKSESNGyLd8C/GCk5kNIYQQQgghRKmQYkMIIYQQQghRKmQZlRBCCCGEEKJUyMyGEEIIIYQQolRIsSGEEEIIIYQoFVJsCCGEEEIIIUqFFBtCCCGEEEKIUiHFhhBCCCGEEKJUSLEhhBBCCCGEKBVSbAghhBBCCCFKhRQbQgghhBBCiFIhxYYQQgghhBCiVPw/tzFpbnn+DZIAAAAASUVORK5CYII="
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"train data size: 1107768\n"
]
}
],
"execution_count": 70
},
{
"cell_type": "code",
"id": "1a248706-e58a-406f-9268-6dce3de2d863",
"metadata": {
"jupyter": {
"source_hidden": true
},
"ExecuteTime": {
"end_time": "2025-04-02T16:43:22.895694Z",
"start_time": "2025-04-02T16:43:22.891020Z"
}
},
"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": 71
},
{
"cell_type": "code",
"id": "5d1522a7538db91b",
"metadata": {
"ExecuteTime": {
"end_time": "2025-04-02T16:43:27.845040Z",
"start_time": "2025-04-02T16:43:22.900703Z"
}
},
"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": [
"25.79150579150579\n",
" trade_date ts_code future_return future_score label\n",
"108174 2024-03-01 600515.SH -0.021294 -0.014906 21.0\n",
"137114 2024-03-04 601377.SH -0.005138 -0.003597 22.0\n",
"137115 2024-03-05 601377.SH -0.007065 -0.004945 16.0\n",
"20064 2024-03-06 000950.SZ 0.056106 0.039274 46.0\n",
"43829 2024-03-07 002252.SZ 0.015518 0.010862 18.0\n",
"9725 2024-03-08 000650.SZ 0.040857 0.028600 34.0\n",
"58797 2024-03-11 002539.SZ 0.003740 0.002618 21.0\n",
"30855 2024-03-12 002030.SZ -0.005742 -0.004020 26.0\n",
"164833 2024-03-13 603366.SH 0.005460 0.003822 22.0\n",
"62880 2024-03-14 002616.SZ 0.036372 0.025461 32.0\n"
]
}
],
"execution_count": 72
},
{
"cell_type": "code",
"id": "d86af99d15cb3bdd",
"metadata": {
"ExecuteTime": {
"end_time": "2025-04-02T16:43:28.288257Z",
"start_time": "2025-04-02T16:43:28.041487Z"
}
},
"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": 73
},
{
"cell_type": "code",
"id": "ef9d068e-67f7-412c-bbd8-cdee7492dbc9",
"metadata": {
"ExecuteTime": {
"end_time": "2025-04-02T16:43:28.315175Z",
"start_time": "2025-04-02T16:43:28.292264Z"
}
},
"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.7619606950196554\n",
"0.7280155931953278\n"
]
}
],
"execution_count": 74
}
],
"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
}