{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.7.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import os\nimport sys\nsys.path.append('/kaggle/input/timm-0-6-9/pytorch-image-models-master')\nimport glob\nimport numpy as np\nimport pandas as pd\nimport random\nimport math\nimport gc\nimport cv2\nfrom tqdm import tqdm\nimport time\nfrom functools import lru_cache\nimport torch\nfrom torch import nn\nfrom torch.nn import functional as F\nfrom torch.utils.data import Dataset, DataLoader\nfrom torch.cuda.amp import autocast, GradScaler\nimport timm\nimport albumentations as A\nfrom albumentations.pytorch import ToTensorV2\nimport matplotlib.pyplot as plt\nfrom sklearn.metrics import matthews_corrcoef","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-04-16T03:28:18.817312Z","iopub.execute_input":"2023-04-16T03:28:18.818416Z","iopub.status.idle":"2023-04-16T03:28:25.149394Z","shell.execute_reply.started":"2023-04-16T03:28:18.818305Z","shell.execute_reply":"2023-04-16T03:28:25.148193Z"},"trusted":true},"execution_count":1,"outputs":[]},{"cell_type":"code","source":"CFG = {\n    'seed': 42,\n    'model': 'resnet50',\n    'img_size': 256,\n    'epochs': 10,\n    'train_bs': 100, \n    'valid_bs': 64,\n    'lr': 1e-3, \n    'weight_decay': 1e-6,\n    'num_workers': 2\n}","metadata":{"execution":{"iopub.status.busy":"2023-04-16T03:28:25.151747Z","iopub.execute_input":"2023-04-16T03:28:25.152649Z","iopub.status.idle":"2023-04-16T03:28:25.158382Z","shell.execute_reply.started":"2023-04-16T03:28:25.152608Z","shell.execute_reply":"2023-04-16T03:28:25.157253Z"},"trusted":true},"execution_count":2,"outputs":[]},{"cell_type":"code","source":"def seed_everything(seed):\n    random.seed(seed)\n    os.environ['PYTHONHASHSEED'] = str(seed)\n    np.random.seed(seed)\n    torch.manual_seed(seed)\n    torch.cuda.manual_seed(seed)\n    torch.cuda.manual_seed_all(seed)\n    torch.backends.cudnn.deterministic = True\n    torch.backends.cudnn.benchmark = False\n\nseed_everything(CFG['seed'])\ndevice = torch.device('cuda' if torch.cuda.is_available() else 'cpu')","metadata":{"execution":{"iopub.status.busy":"2023-04-16T03:28:25.159617Z","iopub.execute_input":"2023-04-16T03:28:25.160727Z","iopub.status.idle":"2023-04-16T03:28:25.246844Z","shell.execute_reply.started":"2023-04-16T03:28:25.160676Z","shell.execute_reply":"2023-04-16T03:28:25.24588Z"},"trusted":true},"execution_count":3,"outputs":[]},{"cell_type":"code","source":"def expand_contact_id(df):\n    \"\"\"\n    Splits out contact_id into seperate columns.\n    \"\"\"\n    df[\"game_play\"] = df[\"contact_id\"].str[:12]\n    df[\"step\"] = df[\"contact_id\"].str.split(\"_\").str[-3].astype(\"int\")\n    df[\"nfl_player_id_1\"] = df[\"contact_id\"].str.split(\"_\").str[-2]\n    df[\"nfl_player_id_2\"] = df[\"contact_id\"].str.split(\"_\").str[-1]\n    return df\n\nlabels = expand_contact_id(pd.read_csv(\"/kaggle/input/nfl-player-contact-detection/sample_submission.csv\"))\n\ntest_tracking = pd.read_csv(\"/kaggle/input/nfl-player-contact-detection/test_player_tracking.csv\")\n\ntest_helmets = pd.read_csv(\"/kaggle/input/nfl-player-contact-detection/test_baseline_helmets.csv\")\n\ntest_video_metadata = pd.read_csv(\"/kaggle/input/nfl-player-contact-detection/test_video_metadata.csv\")","metadata":{"execution":{"iopub.status.busy":"2023-04-16T03:28:25.24964Z","iopub.execute_input":"2023-04-16T03:28:25.249996Z","iopub.status.idle":"2023-04-16T03:28:26.085831Z","shell.execute_reply.started":"2023-04-16T03:28:25.249958Z","shell.execute_reply":"2023-04-16T03:28:26.08461Z"},"trusted":true},"execution_count":4,"outputs":[]},{"cell_type":"code","source":"!mkdir -p ../work/frames\n\nfor video in tqdm(test_helmets.video.unique()):\n    if 'Endzone2' not in video:\n        !ffmpeg -i /kaggle/input/nfl-player-contact-detection/test/{video} -q:v 2 -f image2 /kaggle/work/frames/{video}_%04d.jpg -hide_banner -loglevel error","metadata":{"execution":{"iopub.status.busy":"2023-04-16T03:28:26.087086Z","iopub.execute_input":"2023-04-16T03:28:26.087463Z","iopub.status.idle":"2023-04-16T03:29:14.616903Z","shell.execute_reply.started":"2023-04-16T03:28:26.087427Z","shell.execute_reply":"2023-04-16T03:29:14.615679Z"},"trusted":true},"execution_count":5,"outputs":[{"name":"stderr","text":"100%|██████████| 4/4 [00:47<00:00, 11.85s/it]\n","output_type":"stream"}]},{"cell_type":"code","source":"def create_features(df, tr_tracking, merge_col=\"step\", use_cols=[\"x_position\", \"y_position\"]):\n    output_cols = []\n    df_combo = (\n        df.astype({\"nfl_player_id_1\": \"str\"})\n        .merge(\n            tr_tracking.astype({\"nfl_player_id\": \"str\"})[\n                [\"game_play\", merge_col, \"nfl_player_id\",] + use_cols\n            ],\n            left_on=[\"game_play\", merge_col, \"nfl_player_id_1\"],\n            right_on=[\"game_play\", merge_col, \"nfl_player_id\"],\n            how=\"left\",\n        )\n        .rename(columns={c: c+\"_1\" for c in use_cols})\n        .drop(\"nfl_player_id\", axis=1)\n        .merge(\n            tr_tracking.astype({\"nfl_player_id\": \"str\"})[\n                [\"game_play\", merge_col, \"nfl_player_id\"] + use_cols\n            ],\n            left_on=[\"game_play\", merge_col, \"nfl_player_id_2\"],\n            right_on=[\"game_play\", merge_col, \"nfl_player_id\"],\n            how=\"left\",\n        )\n        .drop(\"nfl_player_id\", axis=1)\n        .rename(columns={c: c+\"_2\" for c in use_cols})\n        .sort_values([\"game_play\", merge_col, \"nfl_player_id_1\", \"nfl_player_id_2\"])\n        .reset_index(drop=True)\n    )\n    output_cols += [c+\"_1\" for c in use_cols]\n    output_cols += [c+\"_2\" for c in use_cols]\n    \n    if (\"x_position\" in use_cols) & (\"y_position\" in use_cols):\n        index = df_combo['x_position_2'].notnull()\n        \n        distance_arr = np.full(len(index), np.nan)\n        tmp_distance_arr = np.sqrt(\n            np.square(df_combo.loc[index, \"x_position_1\"] - df_combo.loc[index, \"x_position_2\"])\n            + np.square(df_combo.loc[index, \"y_position_1\"]- df_combo.loc[index, \"y_position_2\"])\n        )\n        \n        distance_arr[index] = tmp_distance_arr\n        df_combo['distance'] = distance_arr\n        output_cols += [\"distance\"]\n        \n    df_combo['G_flug'] = (df_combo['nfl_player_id_2']==\"G\")\n    output_cols += [\"G_flug\"]\n    return df_combo, output_cols\n\n\nuse_cols = [\n    'x_position', 'y_position', 'speed', 'distance',\n    'direction', 'orientation', 'acceleration', 'sa'\n]\n\ntest, feature_cols = create_features(labels, test_tracking, use_cols=use_cols)\ntest","metadata":{"execution":{"iopub.status.busy":"2023-04-16T03:29:14.619275Z","iopub.execute_input":"2023-04-16T03:29:14.619786Z","iopub.status.idle":"2023-04-16T03:29:14.915219Z","shell.execute_reply.started":"2023-04-16T03:29:14.619739Z","shell.execute_reply":"2023-04-16T03:29:14.914244Z"},"trusted":true},"execution_count":6,"outputs":[{"execution_count":6,"output_type":"execute_result","data":{"text/plain":"                         contact_id  contact     game_play  step  \\\n0        58168_003392_0_37084_37211        0  58168_003392     0   \n1        58168_003392_0_37084_38556        0  58168_003392     0   \n2        58168_003392_0_37084_38567        0  58168_003392     0   \n3        58168_003392_0_37084_38590        0  58168_003392     0   \n4        58168_003392_0_37084_39947        0  58168_003392     0   \n...                             ...      ...           ...   ...   \n49583  58172_003247_125_52521_52939        0  58172_003247   125   \n49584      58172_003247_125_52521_G        0  58172_003247   125   \n49585  58172_003247_125_52852_52939        0  58172_003247   125   \n49586      58172_003247_125_52852_G        0  58172_003247   125   \n49587      58172_003247_125_52939_G        0  58172_003247   125   \n\n      nfl_player_id_1 nfl_player_id_2  x_position_1  y_position_1  speed_1  \\\n0               37084           37211         41.90         20.08     0.54   \n1               37084           38556         41.90         20.08     0.54   \n2               37084           38567         41.90         20.08     0.54   \n3               37084           38590         41.90         20.08     0.54   \n4               37084           39947         41.90         20.08     0.54   \n...               ...             ...           ...           ...      ...   \n49583           52521           52939         23.44          4.04     1.41   \n49584           52521               G         23.44          4.04     1.41   \n49585           52852           52939         32.67          2.18     2.34   \n49586           52852               G         32.67          2.18     2.34   \n49587           52939               G         37.94          2.10     2.29   \n\n       distance_1  ...  x_position_2  y_position_2  speed_2  distance_2  \\\n0            0.06  ...         39.59         17.07     0.53        0.05   \n1            0.06  ...         41.93         30.61     0.67        0.05   \n2            0.06  ...         40.37         19.88     0.66        0.07   \n3            0.06  ...         40.33         25.28     0.52        0.06   \n4            0.06  ...         40.11         26.73     0.99        0.09   \n...           ...  ...           ...           ...      ...         ...   \n49583        0.15  ...         37.94          2.10     2.29        0.24   \n49584        0.15  ...           NaN           NaN      NaN         NaN   \n49585        0.24  ...         37.94          2.10     2.29        0.24   \n49586        0.24  ...           NaN           NaN      NaN         NaN   \n49587        0.24  ...           NaN           NaN      NaN         NaN   \n\n       direction_2  orientation_2  acceleration_2  sa_2   distance  G_flug  \n0           134.84          84.73            1.43  1.42   3.794232   False  \n1           232.50         227.00            1.82  1.61  10.530043   False  \n2           136.70          88.92            0.90  0.89   1.543017   False  \n3           141.08         100.37            0.59  0.58   5.431841   False  \n4           163.38          90.69            1.68  1.64   6.886697   False  \n...            ...            ...             ...   ...        ...     ...  \n49583       211.73         215.11            2.43 -2.43  14.629204   False  \n49584          NaN            NaN             NaN   NaN        NaN    True  \n49585       211.73         215.11            2.43 -2.43   5.270607   False  \n49586          NaN            NaN             NaN   NaN        NaN    True  \n49587          NaN            NaN             NaN   NaN        NaN    True  \n\n[49588 rows x 24 columns]","text/html":"<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>contact_id</th>\n      <th>contact</th>\n      <th>game_play</th>\n      <th>step</th>\n      <th>nfl_player_id_1</th>\n      <th>nfl_player_id_2</th>\n      <th>x_position_1</th>\n      <th>y_position_1</th>\n      <th>speed_1</th>\n      <th>distance_1</th>\n      <th>...</th>\n      <th>x_position_2</th>\n      <th>y_position_2</th>\n      <th>speed_2</th>\n      <th>distance_2</th>\n      <th>direction_2</th>\n      <th>orientation_2</th>\n      <th>acceleration_2</th>\n      <th>sa_2</th>\n      <th>distance</th>\n      <th>G_flug</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>0</th>\n      <td>58168_003392_0_37084_37211</td>\n      <td>0</td>\n      <td>58168_003392</td>\n      <td>0</td>\n      <td>37084</td>\n      <td>37211</td>\n      <td>41.90</td>\n      <td>20.08</td>\n      <td>0.54</td>\n      <td>0.06</td>\n      <td>...</td>\n      <td>39.59</td>\n      <td>17.07</td>\n      <td>0.53</td>\n      <td>0.05</td>\n      <td>134.84</td>\n      <td>84.73</td>\n      <td>1.43</td>\n      <td>1.42</td>\n      <td>3.794232</td>\n      <td>False</td>\n    </tr>\n    <tr>\n      <th>1</th>\n      <td>58168_003392_0_37084_38556</td>\n      <td>0</td>\n      <td>58168_003392</td>\n      <td>0</td>\n      <td>37084</td>\n      <td>38556</td>\n      <td>41.90</td>\n      <td>20.08</td>\n      <td>0.54</td>\n      <td>0.06</td>\n      <td>...</td>\n      <td>41.93</td>\n      <td>30.61</td>\n      <td>0.67</td>\n      <td>0.05</td>\n      <td>232.50</td>\n      <td>227.00</td>\n      <td>1.82</td>\n      <td>1.61</td>\n      <td>10.530043</td>\n      <td>False</td>\n    </tr>\n    <tr>\n      <th>2</th>\n      <td>58168_003392_0_37084_38567</td>\n      <td>0</td>\n      <td>58168_003392</td>\n      <td>0</td>\n      <td>37084</td>\n      <td>38567</td>\n      <td>41.90</td>\n      <td>20.08</td>\n      <td>0.54</td>\n      <td>0.06</td>\n      <td>...</td>\n      <td>40.37</td>\n      <td>19.88</td>\n      <td>0.66</td>\n      <td>0.07</td>\n      <td>136.70</td>\n      <td>88.92</td>\n      <td>0.90</td>\n      <td>0.89</td>\n      <td>1.543017</td>\n      <td>False</td>\n    </tr>\n    <tr>\n      <th>3</th>\n      <td>58168_003392_0_37084_38590</td>\n      <td>0</td>\n      <td>58168_003392</td>\n      <td>0</td>\n      <td>37084</td>\n      <td>38590</td>\n      <td>41.90</td>\n      <td>20.08</td>\n      <td>0.54</td>\n      <td>0.06</td>\n      <td>...</td>\n      <td>40.33</td>\n      <td>25.28</td>\n      <td>0.52</td>\n      <td>0.06</td>\n      <td>141.08</td>\n      <td>100.37</td>\n      <td>0.59</td>\n      <td>0.58</td>\n      <td>5.431841</td>\n      <td>False</td>\n    </tr>\n    <tr>\n      <th>4</th>\n      <td>58168_003392_0_37084_39947</td>\n      <td>0</td>\n      <td>58168_003392</td>\n      <td>0</td>\n      <td>37084</td>\n      <td>39947</td>\n      <td>41.90</td>\n      <td>20.08</td>\n      <td>0.54</td>\n      <td>0.06</td>\n      <td>...</td>\n      <td>40.11</td>\n      <td>26.73</td>\n      <td>0.99</td>\n      <td>0.09</td>\n      <td>163.38</td>\n      <td>90.69</td>\n      <td>1.68</td>\n      <td>1.64</td>\n      <td>6.886697</td>\n      <td>False</td>\n    </tr>\n    <tr>\n      <th>...</th>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n    </tr>\n    <tr>\n      <th>49583</th>\n      <td>58172_003247_125_52521_52939</td>\n      <td>0</td>\n      <td>58172_003247</td>\n      <td>125</td>\n      <td>52521</td>\n      <td>52939</td>\n      <td>23.44</td>\n      <td>4.04</td>\n      <td>1.41</td>\n      <td>0.15</td>\n      <td>...</td>\n      <td>37.94</td>\n      <td>2.10</td>\n      <td>2.29</td>\n      <td>0.24</td>\n      <td>211.73</td>\n      <td>215.11</td>\n      <td>2.43</td>\n      <td>-2.43</td>\n      <td>14.629204</td>\n      <td>False</td>\n    </tr>\n    <tr>\n      <th>49584</th>\n      <td>58172_003247_125_52521_G</td>\n      <td>0</td>\n      <td>58172_003247</td>\n      <td>125</td>\n      <td>52521</td>\n      <td>G</td>\n      <td>23.44</td>\n      <td>4.04</td>\n      <td>1.41</td>\n      <td>0.15</td>\n      <td>...</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>True</td>\n    </tr>\n    <tr>\n      <th>49585</th>\n      <td>58172_003247_125_52852_52939</td>\n      <td>0</td>\n      <td>58172_003247</td>\n      <td>125</td>\n      <td>52852</td>\n      <td>52939</td>\n      <td>32.67</td>\n      <td>2.18</td>\n      <td>2.34</td>\n      <td>0.24</td>\n      <td>...</td>\n      <td>37.94</td>\n      <td>2.10</td>\n      <td>2.29</td>\n      <td>0.24</td>\n      <td>211.73</td>\n      <td>215.11</td>\n      <td>2.43</td>\n      <td>-2.43</td>\n      <td>5.270607</td>\n      <td>False</td>\n    </tr>\n    <tr>\n      <th>49586</th>\n      <td>58172_003247_125_52852_G</td>\n      <td>0</td>\n      <td>58172_003247</td>\n      <td>125</td>\n      <td>52852</td>\n      <td>G</td>\n      <td>32.67</td>\n      <td>2.18</td>\n      <td>2.34</td>\n      <td>0.24</td>\n      <td>...</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>True</td>\n    </tr>\n    <tr>\n      <th>49587</th>\n      <td>58172_003247_125_52939_G</td>\n      <td>0</td>\n      <td>58172_003247</td>\n      <td>125</td>\n      <td>52939</td>\n      <td>G</td>\n      <td>37.94</td>\n      <td>2.10</td>\n      <td>2.29</td>\n      <td>0.24</td>\n      <td>...</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>True</td>\n    </tr>\n  </tbody>\n</table>\n<p>49588 rows × 24 columns</p>\n</div>"},"metadata":{}}]},{"cell_type":"code","source":"test_filtered = test.query('not distance>2').reset_index(drop=True)\ntest_filtered['frame'] = (test_filtered['step']/10*59.94+5*59.94).astype('int')+1\ntest_filtered","metadata":{"execution":{"iopub.status.busy":"2023-04-16T03:29:14.916583Z","iopub.execute_input":"2023-04-16T03:29:14.917596Z","iopub.status.idle":"2023-04-16T03:29:14.970375Z","shell.execute_reply.started":"2023-04-16T03:29:14.917557Z","shell.execute_reply":"2023-04-16T03:29:14.969176Z"},"trusted":true},"execution_count":7,"outputs":[{"execution_count":7,"output_type":"execute_result","data":{"text/plain":"                      contact_id  contact     game_play  step nfl_player_id_1  \\\n0     58168_003392_0_37084_38567        0  58168_003392     0           37084   \n1         58168_003392_0_37084_G        0  58168_003392     0           37084   \n2     58168_003392_0_37211_46445        0  58168_003392     0           37211   \n3         58168_003392_0_37211_G        0  58168_003392     0           37211   \n4         58168_003392_0_38556_G        0  58168_003392     0           38556   \n...                          ...      ...           ...   ...             ...   \n6626    58172_003247_125_48241_G        0  58172_003247   125           48241   \n6627    58172_003247_125_48335_G        0  58172_003247   125           48335   \n6628    58172_003247_125_52521_G        0  58172_003247   125           52521   \n6629    58172_003247_125_52852_G        0  58172_003247   125           52852   \n6630    58172_003247_125_52939_G        0  58172_003247   125           52939   \n\n     nfl_player_id_2  x_position_1  y_position_1  speed_1  distance_1  ...  \\\n0              38567         41.90         20.08     0.54        0.06  ...   \n1                  G         41.90         20.08     0.54        0.06  ...   \n2              46445         39.59         17.07     0.53        0.05  ...   \n3                  G         39.59         17.07     0.53        0.05  ...   \n4                  G         41.93         30.61     0.67        0.05  ...   \n...              ...           ...           ...      ...         ...  ...   \n6626               G         33.86         -1.28     0.79        0.08  ...   \n6627               G         44.74          3.16     4.72        0.48  ...   \n6628               G         23.44          4.04     1.41        0.15  ...   \n6629               G         32.67          2.18     2.34        0.24  ...   \n6630               G         37.94          2.10     2.29        0.24  ...   \n\n      y_position_2  speed_2  distance_2  direction_2  orientation_2  \\\n0            19.88     0.66        0.07       136.70          88.92   \n1              NaN      NaN         NaN          NaN            NaN   \n2            18.08     1.10        0.10       148.93          92.39   \n3              NaN      NaN         NaN          NaN            NaN   \n4              NaN      NaN         NaN          NaN            NaN   \n...            ...      ...         ...          ...            ...   \n6626           NaN      NaN         NaN          NaN            NaN   \n6627           NaN      NaN         NaN          NaN            NaN   \n6628           NaN      NaN         NaN          NaN            NaN   \n6629           NaN      NaN         NaN          NaN            NaN   \n6630           NaN      NaN         NaN          NaN            NaN   \n\n      acceleration_2  sa_2  distance  G_flug  frame  \n0               0.90  0.89  1.543017   False    300  \n1                NaN   NaN       NaN    True    300  \n2               2.03  2.03  1.258014   False    300  \n3                NaN   NaN       NaN    True    300  \n4                NaN   NaN       NaN    True    300  \n...              ...   ...       ...     ...    ...  \n6626             NaN   NaN       NaN    True   1049  \n6627             NaN   NaN       NaN    True   1049  \n6628             NaN   NaN       NaN    True   1049  \n6629             NaN   NaN       NaN    True   1049  \n6630             NaN   NaN       NaN    True   1049  \n\n[6631 rows x 25 columns]","text/html":"<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>contact_id</th>\n      <th>contact</th>\n      <th>game_play</th>\n      <th>step</th>\n      <th>nfl_player_id_1</th>\n      <th>nfl_player_id_2</th>\n      <th>x_position_1</th>\n      <th>y_position_1</th>\n      <th>speed_1</th>\n      <th>distance_1</th>\n      <th>...</th>\n      <th>y_position_2</th>\n      <th>speed_2</th>\n      <th>distance_2</th>\n      <th>direction_2</th>\n      <th>orientation_2</th>\n      <th>acceleration_2</th>\n      <th>sa_2</th>\n      <th>distance</th>\n      <th>G_flug</th>\n      <th>frame</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>0</th>\n      <td>58168_003392_0_37084_38567</td>\n      <td>0</td>\n      <td>58168_003392</td>\n      <td>0</td>\n      <td>37084</td>\n      <td>38567</td>\n      <td>41.90</td>\n      <td>20.08</td>\n      <td>0.54</td>\n      <td>0.06</td>\n      <td>...</td>\n      <td>19.88</td>\n      <td>0.66</td>\n      <td>0.07</td>\n      <td>136.70</td>\n      <td>88.92</td>\n      <td>0.90</td>\n      <td>0.89</td>\n      <td>1.543017</td>\n      <td>False</td>\n      <td>300</td>\n    </tr>\n    <tr>\n      <th>1</th>\n      <td>58168_003392_0_37084_G</td>\n      <td>0</td>\n      <td>58168_003392</td>\n      <td>0</td>\n      <td>37084</td>\n      <td>G</td>\n      <td>41.90</td>\n      <td>20.08</td>\n      <td>0.54</td>\n      <td>0.06</td>\n      <td>...</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>True</td>\n      <td>300</td>\n    </tr>\n    <tr>\n      <th>2</th>\n      <td>58168_003392_0_37211_46445</td>\n      <td>0</td>\n      <td>58168_003392</td>\n      <td>0</td>\n      <td>37211</td>\n      <td>46445</td>\n      <td>39.59</td>\n      <td>17.07</td>\n      <td>0.53</td>\n      <td>0.05</td>\n      <td>...</td>\n      <td>18.08</td>\n      <td>1.10</td>\n      <td>0.10</td>\n      <td>148.93</td>\n      <td>92.39</td>\n      <td>2.03</td>\n      <td>2.03</td>\n      <td>1.258014</td>\n      <td>False</td>\n      <td>300</td>\n    </tr>\n    <tr>\n      <th>3</th>\n      <td>58168_003392_0_37211_G</td>\n      <td>0</td>\n      <td>58168_003392</td>\n      <td>0</td>\n      <td>37211</td>\n      <td>G</td>\n      <td>39.59</td>\n      <td>17.07</td>\n      <td>0.53</td>\n      <td>0.05</td>\n      <td>...</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>True</td>\n      <td>300</td>\n    </tr>\n    <tr>\n      <th>4</th>\n      <td>58168_003392_0_38556_G</td>\n      <td>0</td>\n      <td>58168_003392</td>\n      <td>0</td>\n      <td>38556</td>\n      <td>G</td>\n      <td>41.93</td>\n      <td>30.61</td>\n      <td>0.67</td>\n      <td>0.05</td>\n      <td>...</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>True</td>\n      <td>300</td>\n    </tr>\n    <tr>\n      <th>...</th>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n    </tr>\n    <tr>\n      <th>6626</th>\n      <td>58172_003247_125_48241_G</td>\n      <td>0</td>\n      <td>58172_003247</td>\n      <td>125</td>\n      <td>48241</td>\n      <td>G</td>\n      <td>33.86</td>\n      <td>-1.28</td>\n      <td>0.79</td>\n      <td>0.08</td>\n      <td>...</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>True</td>\n      <td>1049</td>\n    </tr>\n    <tr>\n      <th>6627</th>\n      <td>58172_003247_125_48335_G</td>\n      <td>0</td>\n      <td>58172_003247</td>\n      <td>125</td>\n      <td>48335</td>\n      <td>G</td>\n      <td>44.74</td>\n      <td>3.16</td>\n      <td>4.72</td>\n      <td>0.48</td>\n      <td>...</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>True</td>\n      <td>1049</td>\n    </tr>\n    <tr>\n      <th>6628</th>\n      <td>58172_003247_125_52521_G</td>\n      <td>0</td>\n      <td>58172_003247</td>\n      <td>125</td>\n      <td>52521</td>\n      <td>G</td>\n      <td>23.44</td>\n      <td>4.04</td>\n      <td>1.41</td>\n      <td>0.15</td>\n      <td>...</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>True</td>\n      <td>1049</td>\n    </tr>\n    <tr>\n      <th>6629</th>\n      <td>58172_003247_125_52852_G</td>\n      <td>0</td>\n      <td>58172_003247</td>\n      <td>125</td>\n      <td>52852</td>\n      <td>G</td>\n      <td>32.67</td>\n      <td>2.18</td>\n      <td>2.34</td>\n      <td>0.24</td>\n      <td>...</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>True</td>\n      <td>1049</td>\n    </tr>\n    <tr>\n      <th>6630</th>\n      <td>58172_003247_125_52939_G</td>\n      <td>0</td>\n      <td>58172_003247</td>\n      <td>125</td>\n      <td>52939</td>\n      <td>G</td>\n      <td>37.94</td>\n      <td>2.10</td>\n      <td>2.29</td>\n      <td>0.24</td>\n      <td>...</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>True</td>\n      <td>1049</td>\n    </tr>\n  </tbody>\n</table>\n<p>6631 rows × 25 columns</p>\n</div>"},"metadata":{}}]},{"cell_type":"code","source":"del test, labels, test_tracking\ngc.collect()","metadata":{"execution":{"iopub.status.busy":"2023-04-16T03:29:14.971947Z","iopub.execute_input":"2023-04-16T03:29:14.973053Z","iopub.status.idle":"2023-04-16T03:29:15.163169Z","shell.execute_reply.started":"2023-04-16T03:29:14.97301Z","shell.execute_reply":"2023-04-16T03:29:15.161938Z"},"trusted":true},"execution_count":8,"outputs":[{"execution_count":8,"output_type":"execute_result","data":{"text/plain":"55"},"metadata":{}}]},{"cell_type":"code","source":"train_aug = A.Compose([\n    A.HorizontalFlip(p=0.5),\n    A.ShiftScaleRotate(p=0.5),\n    A.RandomBrightnessContrast(brightness_limit=(-0.1, 0.1), contrast_limit=(-0.1, 0.1), p=0.5),\n    A.Normalize(mean=[0.], std=[1.]),\n    ToTensorV2()\n])\n\nvalid_aug = A.Compose([\n    A.Normalize(mean=[0.], std=[1.]),\n    ToTensorV2()\n])","metadata":{"execution":{"iopub.status.busy":"2023-04-16T03:29:15.164818Z","iopub.execute_input":"2023-04-16T03:29:15.165415Z","iopub.status.idle":"2023-04-16T03:29:15.174329Z","shell.execute_reply.started":"2023-04-16T03:29:15.165368Z","shell.execute_reply":"2023-04-16T03:29:15.17315Z"},"trusted":true},"execution_count":9,"outputs":[]},{"cell_type":"code","source":"video2helmets = {}\ntest_helmets_new = test_helmets.set_index('video')\nfor video in tqdm(test_helmets.video.unique()):\n    video2helmets[video] = test_helmets_new.loc[video].reset_index(drop=True)\n    \ndel test_helmets, test_helmets_new\ngc.collect()","metadata":{"execution":{"iopub.status.busy":"2023-04-16T03:29:15.178911Z","iopub.execute_input":"2023-04-16T03:29:15.179171Z","iopub.status.idle":"2023-04-16T03:29:15.364346Z","shell.execute_reply.started":"2023-04-16T03:29:15.179146Z","shell.execute_reply":"2023-04-16T03:29:15.363255Z"},"trusted":true},"execution_count":10,"outputs":[{"name":"stderr","text":"100%|██████████| 4/4 [00:00<00:00, 212.67it/s]\n","output_type":"stream"},{"execution_count":10,"output_type":"execute_result","data":{"text/plain":"0"},"metadata":{}}]},{"cell_type":"code","source":"video2frames = {}\n\nfor game_play in tqdm(test_video_metadata.game_play.unique()):\n    for view in ['Endzone', 'Sideline']:\n        video = game_play + f'_{view}.mp4'\n        video2frames[video] = max(list(map(lambda x:int(x.split('_')[-1].split('.')[0]), \\\n                                           glob.glob(f'/kaggle/work/frames/{video}*'))))","metadata":{"execution":{"iopub.status.busy":"2023-04-16T03:29:15.366886Z","iopub.execute_input":"2023-04-16T03:29:15.367499Z","iopub.status.idle":"2023-04-16T03:29:15.409657Z","shell.execute_reply.started":"2023-04-16T03:29:15.367469Z","shell.execute_reply":"2023-04-16T03:29:15.408493Z"},"trusted":true},"execution_count":11,"outputs":[{"name":"stderr","text":"100%|██████████| 2/2 [00:00<00:00, 61.40it/s]\n","output_type":"stream"}]},{"cell_type":"code","source":"class MyDataset(Dataset):\n    def __init__(self, df, aug=valid_aug, mode='train'):\n        self.df = df\n        self.frame = df.frame.values\n        self.feature = df[feature_cols].fillna(-1).values\n        self.players = df[['nfl_player_id_1','nfl_player_id_2']].values\n        self.game_play = df.game_play.values\n        self.aug = aug\n        self.mode = mode\n        \n    def __len__(self):\n        return len(self.df)\n    \n    # @lru_cache(1024)\n    # def read_img(self, path):\n    #     return cv2.imread(path, 0)\n   \n    def __getitem__(self, idx):   \n        window = 24\n        frame = self.frame[idx]\n        \n        if self.mode == 'train':\n            frame = frame + random.randint(-6, 6)\n\n        players = []\n        for p in self.players[idx]:\n            if p == 'G':\n                players.append(p)\n            else:\n                players.append(int(p))\n        \n        imgs = []\n        for view in ['Endzone', 'Sideline']:\n            video = self.game_play[idx] + f'_{view}.mp4'\n\n            tmp = video2helmets[video]\n#             tmp = tmp.query('@frame-@window<=frame<=@frame+@window')\n            tmp[tmp['frame'].between(frame-window, frame+window)]\n            tmp = tmp[tmp.nfl_player_id.isin(players)]#.sort_values(['nfl_player_id', 'frame'])\n            tmp_frames = tmp.frame.values\n            tmp = tmp.groupby('frame')[['left','width','top','height']].mean()\n#0.002s\n\n            bboxes = []\n            for f in range(frame-window, frame+window+1, 1):\n                if f in tmp_frames:\n                    x, w, y, h = tmp.loc[f][['left','width','top','height']]\n                    bboxes.append([x, w, y, h])\n                else:\n                    bboxes.append([np.nan, np.nan, np.nan, np.nan])\n            bboxes = pd.DataFrame(bboxes).interpolate(limit_direction='both').values\n            bboxes = bboxes[::4]\n\n            if bboxes.sum() > 0:\n                flag = 1\n            else:\n                flag = 0\n#0.03s\n                    \n            for i, f in enumerate(range(frame-window, frame+window+1, 4)):\n                img_new = np.zeros((256, 256), dtype=np.float32)\n\n                if flag == 1 and f <= video2frames[video]:\n                    img = cv2.imread(f'/kaggle/work/frames/{video}_{f:04d}.jpg', 0)\n\n                    x, w, y, h = bboxes[i]\n\n                    img = img[int(y+h/2)-128:int(y+h/2)+128,int(x+w/2)-128:int(x+w/2)+128].copy()\n                    img_new[:img.shape[0], :img.shape[1]] = img\n                    \n                imgs.append(img_new)\n#0.06s\n                \n        feature = np.float32(self.feature[idx])\n\n        img = np.array(imgs).transpose(1, 2, 0)    \n        img = self.aug(image=img)[\"image\"]\n        label = np.float32(self.df.contact.values[idx])\n\n        return img, feature, label","metadata":{"execution":{"iopub.status.busy":"2023-04-16T03:29:15.411377Z","iopub.execute_input":"2023-04-16T03:29:15.411823Z","iopub.status.idle":"2023-04-16T03:29:15.429729Z","shell.execute_reply.started":"2023-04-16T03:29:15.411781Z","shell.execute_reply":"2023-04-16T03:29:15.4285Z"},"trusted":true},"execution_count":12,"outputs":[]},{"cell_type":"code","source":"img, feature, label = MyDataset(test_filtered, valid_aug, 'test')[0]\nplt.imshow(img.permute(1,2,0)[:,:,7])\nplt.show()\nimg.shape, feature, label","metadata":{"execution":{"iopub.status.busy":"2023-04-16T03:29:15.431722Z","iopub.execute_input":"2023-04-16T03:29:15.432114Z","iopub.status.idle":"2023-04-16T03:29:15.885701Z","shell.execute_reply.started":"2023-04-16T03:29:15.432073Z","shell.execute_reply":"2023-04-16T03:29:15.884693Z"},"trusted":true},"execution_count":13,"outputs":[{"output_type":"display_data","data":{"text/plain":"<Figure size 432x288 with 1 Axes>","image/png":"iVBORw0KGgoAAAANSUhEUgAAAQYAAAD8CAYAAACVSwr3AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/NK7nSAAAACXBIWXMAAAsTAAALEwEAmpwYAADvmElEQVR4nOz9ebxlyVXfiX5X7L3POXfMm3NmVdakmqSiNKIBBAIZCwmDAdvYbvBrm7bd4Pds3LiH1x7a7fZ7br/G77nt5/bUxm0b8AD4eQKMsEESQvOAkNBUJVWp5iEr57zjOWfvHfH+iGGv2Gffm5mA3JfPp+Lzybzn7BM7xhW/NcSKFeKc4+X0cno5vZx0Mv9nN+Dl9HJ6OR2+9DIwvJxeTi+nhfQyMLycXk4vp4X0MjC8nF5OL6eF9DIwvJxeTi+nhfQyMLycXk4vp4X0VQMGEfk2EfmSiDwuIn/uq1XPy+nl9HL6rU/y1fBjEJEC+DLwrcBzwCeB73POffG3vLKX08vp5fRbnr5aEsObgcedc0845+bATwHf/VWq6+X0cno5/Ran8qtU7u3As+r7c8Bb9stcrK648tix7sFvhRAjsLoyZd4WcKFEWocTQQBnoJkItmIRGn8jdet3RD0TkBbKPTC1TfWnn63DFUKzFNoi/MbTfu2Wm8izX1m/mfb8VqfQJul9zx+Sxr338VaryeZp6Pu+6WYrVP3Zryu/1Wn2/HOXnHMnbybvVwsYbphE5AeBHwQojh7l9v/6zwDghGy0JI6aHj2XD584/8gVDrEgVmhOzvnu1/w6P/fIq3nFPwRaB4V/b+uOMVdfJcyPtaqQUIfz72ef90lOVPt6TTM12ApMA0e/IBx5ckY7LhDrIABCMbO0Y8Plh0fsnrU449vhjAeUWLY04vsIYHw/XREqtP5Zam8YC0zXloUxVG0WF9+V/HsYEz8fbpFibxVA1Zz1xyz9PDCYYhkGt33AWOJvcSziONzMyh7KF8fAhAdWuvGwoX308sZ+6DHtJzvcpEHgu9l0g3e+8uf/26dvtqivFjA8D9yhvp8Lz1Jyzv0o8KMA4zvvcJHQ08A6tRjURAP5SDtwdCtUrOAKx9LajCPlHq4x2AKM9RzbFUK9LDTLzk92K+m9WE9cKIMTqpO4HKPUZ1dK6o8NoyzWIW1oZ+M/m8axdNFhK8N8w9GOHeLANIJE3HJg6lBe6bBWwDkPIA6cIs4ELn1QyNrNADW6A0Ew9iUDDvW+E/wiGQDtxYIW35c4j/qd+NeymKT764wfCyAtVLGSxsUVpIUtzQF91Cs1rH3nQES1rfUZXUFgQr1+hA9OlzfUbz+FXb1RynFZloXXD5whTX8H5buJ9NUChk8C94vIPXhA+F7gD+2bW8BVruuNAwrnB0lzNKt+D8QtkC1QacGO4PSRLe4dv4QZtSCeU9vKYCvjF95ccIXxhKKlFC2pBI6zbwqLcIjT6PVhS6EdhXobi9QWZwREMI1l+UKD2ILNwtCOHK4MEkEsxHlAIEoDmgB0+9Rz2WdRZQu1D4A9aWHf1AcWXW4SWXqpX+9QsT1AyErptysuesGv3EgM4Xdbuq5Mh+fuN1otEVTC50xQsmBawRYulCl+nkR1OfCW2I4MnHt9cppedF46AE70r0DwIOzuCSr5w1tMXxVgcM41IvJDwH8ECuAfO+e+cOA74kgauBoIlSMQQLdIIlj0kduuNnzfuU9y7+gC7VYFzmKmNbbyq2jlxZad20psJRTzUGZYYM7kYnPkgt3kdwPtXKAE6YjSGYc4AeNwI4trhXbJYEfGg1NRsvTiDu1SxezEiHK3RRrL5IoHENMapicsdilSBkgtUMugdCJWSyQsqgnknD5x1lby/P0x7xFgUk8UN01itWqTr6ubnzhm0kqQZlwunUn+bmp35BMKCJKaoIfBeWbgbCjfOA8Cxi9aJ35Bx74mIFX16YGKC1KMl8TEkUDCFk4tfoctAi3q8sTXocc2DbH1NCM20NkAXSXpN+mkiiZjeboPRoMfmarj1eueVHOT6atmY3DOvRt4981lBqlNRjR9Tq0Xv7SdmJ7RpRXMXDh2epNvXf4yf+/y2zjyhYpqawtEEOcwtQUnlHtQr3eTKDbSqSwwPGn978ZCJ/NBMfVfXSEdUah5jegeJwgn1OuG6fF1ZhuGdgxHnhBGm41XKS63mNpQzAzT44524rCVb6Mr/OKKNgVnBQkEUEylW6yRA8WmCl76UpKNNIJR5hU/X705CSDniq5fiPMwb4FGkj1HL7DITdNaC2K+K1yax64tCmSj9KWlFrq8YoFW0lzExRoBK7bLIV1eOuDQxuBYl6RxClKjVskI4wxIEX4Kth9T+4aVU3Ai2MqPUxJcbKgzAx/VbwINh36akMHp39Q8SCua7HIBVUkeafhKkmpnGvHM6gZqYj/9n2Z8zJLzxO2KDhBMk/+eiC0CxNCAO0+A9x69zK4r+NcfejOv+OwUW5mgNjjEOKbHKqJ42U6s554taZQjAi8YvhRqkyQMRcc2qLIOTAvlnkFawdTQVkI1t4y2W6ZHC+br0Cw5miWh3DO0E8EZoZw6li5Yiqkw2zDU6x4gIuDERWGixBQI2v/WAaYzDgzYwoNdt0q6IRWr+upykPULLsyJpkI9BmFMJHBzJ13hqdxQdyojGQM7jolavH3jqVGLVRtkuzaS2hglktjJuEAzUb8gSxo4Emjp+Y79iUUHFcIWztOo8wsRPGDo96URLzkWXVmu8GBP6RYkAdS4AH5eW8mlgMJB6TwBRIm5MV6qtF6CcSMHlfX2s0YQK4heTzeRDgcwFI5mrfUDUzoPz5WnEulxFpzgItpayZUucVA5rs+W+MFH/y+c/KRBnKOd+G6a2tKODJt3G/Zub3FLLVJZbCt+EJ0q13VI7YowEdEybUAKG7hOzmqd9eW4mcHsFZgpgLAtBdW2oZw6TA1LLzmaFfHbqKZbVGJhtGMpZ4KpDc4ItvQTbseKmGwnhnrRFCisb2tqL34so30mElxpfR7UGKp8GTEWSpSNi7kVnITyRRGoKidKd749dPnHLVI4XGNgbpB57Lck0HdKRE/GwgCArnJdH8M/Mf5fTG1j8j5LyFe4JGWJkNQi1xqvPsQx0VMa3ndWoDFIZVlamzIZ1TStR5nl8ZytvQm722NMaSkKi7OCdUJRtpSFHwznhKKwjMqGwjiMuEQ/JhrPw+d5WzCrS+pQhzGW0ljKwmLEYZ14tUQczgnzpqBufN6ybKkKLxLWbYG1hqa5NZelwwEMSsylcMjIYiqLMRZjHEXhBzsOmglspNDEEABiVLY8dekYo0+tcnSrYe/EiHLXUswstjK0E8PeGcvpey/hnNBag+2L0aB+E19nmAzrxO8KhDz6L5Amqh0b7KqhmRU0c8P8iAl6vVBtC6PrPv9sQ6hXSoq5C6DhMHOHmTlGpVCvCs0qNGOHm1hk3PpFENeL82BUVJbJ0pxJ1VAYS2sNTWvYm1VeUg7tcg6KwjKuGpZHtcfBQGRxLKw1NNYg4qiKlioQdvw9LoilUU0R5iKW0ZXl/xpjKUwox1jGRUNVtDTWsD0fM28LmtaksbbpPT8pbWsy8DXGLyYRRxFoob/IWmtwTmha3w9rJY2BnidNT0ZgVDZJSIhzrue0sYaVas5SWfs+4/sL+L5VNUY8LRbGURadvhbLsmGc66agsSb1rygsherDdF5Rz0tceLcoLa2xzGqo64K2LnBOKEcNo1Hb0WwrNHXBvLCIQNsKbVN4ZnoL6XAAQyuU14OMZwq/T2+giRyp6HTUKBVI4OCJU8Q/VuB6RVnA1rmS0XVHMXfINOxKlEK1JVy8uoZtDK6VaNMM9XdlOhukk2gsS0az3iArvVgiWESiihNiAOcNVvN1aCcdM3MCxcxQ7kK5A9WuQ1pox4B4EdXMBWcL3NSELVxJthFTC3bs2F4asV0FVl37HReZB3VgZDuJB9gtHNdGPm/kov6zH+NIyJHArPUEZhvx3F5gZ9Ik7hi5lylsWtRxkTtHepYNW3gnaSCOsBXbDYxzkvoLYNswJ7OiU7gjXUR6ic/i3EV1RKkG6XtPxcrK668l46UO1wrMFQeO7S2dry+oEEmyayVTG6SWpL4mW0P0Twk+KfH36KLSaFXJiVexHNhyxJ7eHQt9baPR0gnFtOdvcRPpUACDWK+Tx4ESK8nSnvI48gnW+qgaNDPzg7B3e0tz1VBtgTSOZlJ4FcDC6jOw2yzjjMNoa78BW/nFm2wIweiXRGM9QdLVrw1nfk1JIIpOLDaNdAAW9GJrwI4czYpjdty3x8x9fbYgWfiLmWC2cl0xAoO3mPvt1zQ2bfcbFlxhcu9KrVOnPqnxjdlMGA8HVRDrzdx/t+MRtnQLxrCWbizAg41Vtoo4VNHibqK6EMfGBF25t0hcAWWgk6i66K3AZIk3Lmmf0TiaOYXpeYvzFcZDl5uMlvEdQ74LEOqKxuW04wOZ3SLtPgyAYxw0T8uS2u4KUnuz9kV7UUyN5OMfuxXaRGJUw1Xvlw4FMCTjE93+syvJByAaHV1w/gkEH20wEvT0aERber6g3POF12tFthVmaqg2oR1LrsY4MAS9PxGyJINR2g5T7dZGUV+BmoRAjEkNL5RRNTKkNuwqSEdYkQARcGE3xMRt1aoj/thuV8S2dECgDWWJ2C2Zka8DMXLDXrbQJO+Taqc0YGw3hsn6rQzELtgo4jjEJEJqFy6UFYDT2xg6RpzapMbOj5PLdy9jO7L2uqxLC1KAypuAKO6VKiG1A4KB9we+uxLli+CyvkNvoUYm0ytae69m7dAZQ5+tcvLq1dSJHbeQDgcw9JOGPyUZRARtg5OJ54pqRCW4Ic+h2oZq27tIz1e8OG1qMK3iHCjii2VYELUYbOW8dT5Z07uZOmiiXH9S41ZejzAl1Al40T/ufyvRUKxanOIyqz3q/ZQnbq/pPSxctqsRgUITv6P7rkEj1ae8KvucOo2ncSCd888CK6P3PZYTJCed75bEX71otZTfz6bLlF6+CMx6/PtlHAAskINfFBz1mO7X9qFnCxprFBZUmd1OTF73EE3eSjo8wJD24+L3fOGJUYst0o8hnD3oxD8I+QrvAZn09IbEMYu590FwxgOJTnHxxkko4q6HFj+HUn/hlqorEVD6IKL7CJm6kuUVpzz3gk2k7Qinz410sqVbWMxRqtJisdPluK4tcUqc9V2wJblNBtWOKLYraabftzhWeQHqueT1L4jAOo/LJZmhsvtjI63+0vs8IDFpcBD9G/n03Kg/ur4B/pA1J6Oz/q7Xfi869neLPIhA9kmHBhgW9C9RC0SJiJnIHbNa6LztwBRQi1CvSDDO+ROO8fCSrcj07Si2altF5JJDXHGh7X0CSz+ER+K5kPSe999ZIHLNtYv9J9ePU8+1ud8Gl+d3QerK2q4IK3k4KjEa6LixGpdUdgCPKOFkbRjggEnMH5AQNOgtjEv47AaeaSkkG4/UF2FosckA6KdcsTs9YNcAqfMuqMA6k+RYoV9b+JL0PG6cNGrtA9y3kg4HMIhfnJoAbUliVxlndLnIODDP2FqQUSdeSeu9HOMOgY174YEzuVIRmSZgRZWDOmLfch0JL+aPDlJKytmX+NRYdGV1851x3CEAkE7fznT5vpTSNXFB4hgyjrmQMY19J0B1GTRoxHZrD8fYhx6rTAeTVAP7INsHhazN+zHIqCJpUNxHvHJ6vHvcPalXuq8sjqkLNt9M9dB0OYDpN71WBxhNej7EK/T46rG7RXA4FMCg7Qfdd5f7iRO5mOrhkNEmvhvydkawUF7c1nJ4nT5uF+1HaNFXuL+4lL9697DL74Rhcbg/oQN1ag88D2wDHJjh7xkxqz4NiuQhj6O3XvqLSpxfxD2AzpoQgRIvMbiB5wvtCGOxn1Tgjb2LfUzlDC0MtbATIEd0PZBN523at0y68YqMRqySfKL0AYNYtJ/0o6vJaDGbF3W2Ygik+vVGiew3EI7pUAAD0B2d1eKgTppFFQO/q58TEODCJHazkM4bxPWeDmQxTCgRjGL+IUmhJ8KmsuKZDs2JhQN1wezsQTq0FDvVHwvVxsWPnQQUwDUzGmrJxrGo6sQFGyWVBYDWHDEX2+IWnpbAMkOmbl98NrD4Fji4bt/gwon158OTAWffp0F1IXH+fZKDzpsUiLsNQypgVhcd+CXQ2OdU7EKj4suqEVl2p545NTR9EeYW7QyHAxgEL84H4ktHoelQWRM47b4lJSqUaD3si3NOb9t1Q5z2uUuHi++nRe4WOW6fONWC6+vuabHHyTE97qVke008WoVYEPMHFMdUryiQ3U/SiUSt29wNXwILio7ofCVdX9PizShSN0jVe6MdBtHldXVkxfTb0M9/QNmpiHIxq+5fvw3axhK3WDNQRANkXq6eg740IC3ZOY+F99XcJ1Ts1bMviEUVu+38g25VbDgcwOAIRpoomg3Sfc5NB5LmYH27hJ5ksZI7rxi8O684b303elWzP9ENiHn76aHeuCUx6/7t7723bzs0+kRPTdWu/TjjAod1vTZJcGjS1WQcV/I2HrQw9TAK+1LyvnOqJJQFBqjrFG46eumQNBGDsSwcmjuonAAUC93er5/qeQTfffvdlwogl+j2fy0HwcILpwZSgKCbTYcDGPCSgWNA5IVcir5R/3pouqAPu8XZzLbYFhrG/jNyE1xw6PO+fYiOQeqdJPiodkhvMPbdzXAsqC2D+q7+MdajRXr9jvIqXDAuHiCmS3tz7RA959J97w9Ztgj6i+6AeRmqK4LMgrExZVysV0TVpaSlbC764Cldv2I5mSTplMelrlAOAAU9T3G3TvCnOoXkLNYf/xulwwEMkaiyI8xqFbhu8oZ2IQ4sOkyGXkwucm9Htz3Zc0g6UDSNKVv4LhPLF0Tr/ThsT8JIR6eNcmTqtae/oLOtTJc7Lg0r90N96aPlPp+zd1jgUNlvur39My37iOJOo19UrXrVDm5l3mzabzyEQb1fT6PrPc9sS0Opd5xCA8FCXXGSbUcDqfID+piGriCbw0g7EA7KHrDdPZQOBTCYFkbXBFf6oBe27DkeSU4MB6UFQ1ecEOWmCySdPTn5oMTmWxnDAVFaE3O2vafL1oCQfpPFdvelgYX6e5JOAD5neucIhnZX9uvnAf3vj20cR7EyfBYgjndqh2TlxN9SvMisPx04LDQABSK98g6UuZUomXa51DgtYHnk7r1FmhZ4z4iry8mYjd5638c4Grdgo2v2oMTZYzCdodpltK8B6xbtjsAhAQac90a0aqKcCmTh1JbVDTlEsuTn5WfliOI2SkoZVCcOGtQhMb0nLWga74de0xl82+IuigKH+L2/s6H/9haFK1wifKlN36id5V1UtehUl4GU7ZjEmA+x5QPnCBYqjtu5CggJIrm4bjFlQNErM6omC0LOLUsPseWS2qB1eYnt7EtoSlTvRKC8n44BCURJDGnhOsmkYaCLlTEEdjqcnuTzQWyvakvarr/FsTkUwOAKmG04Fd2n9zemg8S2fQsPf003UVqXTGLuECAsyJF5GlroCzEi4/Me4URumy00ybPkBe/zeeC7DuO1cDhKi177EYsb5sCZNOaClBAoum+kXKhD+33EcVVSjBNRi23/NPR7pqffaAHcLP30534fqSUH9gPKQLXdiTqM54FJlHOYZoSLc91DrqGkp9gOq2M3SocDGAy0y73VqonkBpOZibf7WeODu25fBBNHiN7EAjFIK12wz33aMSSmJXvBAe2OhqHUnmJ/cFpYDPsZ11x30lMHex0mChXiXHrjEevWHI6Oo0MHiqLQVrqiQ3OkKz/Ny7Dk40ovlqet0gKGTiXm/WV4zBh4nnd9MT/dvPm29/Jl73h0y0R/XV54nse37NFDI4tj3u+XNiZm7dc0KYMgnvph3C0bHuGQAAOQW9/DoC8Yl+JA9rYzM4Sl+yy971qHFZ2vtwUnBE7b+sjNkZvHY9cLExUXTOIeN5gM7WcQUz/iMqpdC+8v1t+9gzpw5fMuFBEANOP+/YWgkzIELx6GCpOkpSRx+cKKoAzoAwaZ/h3+9p3cnAv90f4DQ6DbF8/2A5SwqJNKQleeg06y1MbS/gruSbJpTPQFNLH8aFsYULNSXg1mZrG6hS+q8puxHxx0zma/dDiAIXIVjZC9swEZmu+3Zy1dHi3SxzI8EitUyPKqOgJYiAVD2LFQI7XAVZXrrg8isn/EnBSh2ILM1U1L4jvgoLtXItJw1Ld15Zo4+yCZ6UoDY4QfB2nVYtDiOF19Obj62BRp0UdpZAiE9wMvtQgSx+2D0kKbI3LRSTmh7mR7kYH3hpLJQcuDg0vOXJ1Rtet8PKq+H3AmrIlla4m3V1fqUqvKi22P/8Lx80w1G6JZ9dvAJkvObG9RaDgcwKAWPdwYBbWtoP9uQmLXW5yRkHqSAXQTHzleCkYq6dV0m1GmZ2uAitGU2k6c123SfXMhtLmZ0923EH70TinScc/+mCQrvRtuR+A6icm3vfdVgbZQ9SwQcPCMtPn7C5JOb8FLWLmdGN1x5/5YLJSzQN1xYcriPIcgLRnR3xQw9Noc5tv3LRCAuM64Cn4u47kIt/h+UoUyMbTXnl777aT7knnZQjYX6bnt1a/zdgWp6iS7G+NWZYbDAQywL4eNRJWHHvPddOT6VRqAIVFTWLAwRwu0i6HcbFdX2heOi0WrChpcYuw+RSyZCqT+Jjpyvrx2rBqhCClFEtJi6T4u0RI7rOqI1UaQS+OiF7kus0eEUdpfMK4qztbvbxKdYx9CRxeARI9/qidIIqUNwC7e7T0UqMvNy++VnQoeeNb7PZWDGguDn49UV4iGHSvO9Ff1V8+xkugSoPWlV0I+RwjO4/MlKUWPu+tiew6BQSoyA9mcOQ1t7twoHRpgAPblGINZ1FZX+o2cYLtywqOeCpIs6ZHg48JKNgsVxDN70Zfl1QC/kiKB9avOuaXLJjK7mDaKo0MTONgXF5uYL2z9ewZk0rn9ajzQBBgX/QAhpm3EIXtO7KMoR7E+MPZBOU6f4oApjoNWnfZLtyga99/VwJ3Ef6sWfwAIcd3CPbB+B7SQ7vCIh63ssARZ7Pp9cr3t6mlPUiSrpOL2b+4SFugyxYNU7Unz2Q60/wbp8ABDRqX6mUpJQusDiELFIDprxyXoCFeXmxbMwPHobLJUHfpHH89QOq8y/X5sR3+B6EIjB7eL7c3y7mfYE7rdDNflzYYmGkHjgm8Vd8IXmgLHBkI08QRqBIR4uA38+PYWeAbWQ7sO/X5Lx4CjHtyFtfMvpWPySirMpIW4SPq6v1N93sdYuEA+cWy1FBbLGDghuSDqw4K3YqaC9UDRl9sxtoRFYX6zczwZUeZFaFuPbqOmGT8e7C+R75MODTD0DSQLIiPd3/4CSgsmUK+ETAvxG/pGIQfiXEZ8OQG57NWkWmQineu8DHWbbuEwW2Z0Ha6+A0XdhNgHvd0a34tErk52ivW3Yrl4AYyQQt2ZueIqMTRe6broVqoNKdkgQaQToKqdqRO9v/TaGX/TRK46Hrmt1u1Fl+PysZa4EBwkg2XcTdL2hV6K6pBuXz+vHodMHRmQjrLy+uWqzrs+USvQi7aebEhif6XLM+w4F+g69X+43/ulwwEMPVAAekS++MpBOmZiXFoKiVy3N2EOfDTnfnv6TXRxEtXquBmD0EJBvd/VhC+osRrkdJuV3i5W/PVkKOKx3QIpZhJucJK0jWorh5ig1xeOdiQ+DHwcqhAKPd1zIF2ZLrbVBqITslDv+yY17gtqiuKYooA7qRvRm7VfXm8oPYhIN71tN4YuXix5UFpYXL3ncXEp9/oMFPrzuk+b+0kDeRzPWKbrtyFm1aikaUaretFeEk4P30o6HMCwn7iVcUz1o3ELi2jRuNNDbXp76zHtAy5D1WpjZAb0fSIY6kv/tx4gZJ8jQehFE1WGBEp0x8cj94ltQrwoGwLamNbTSDvuLmANWgSucjAODVCEn9oak7YdRNEl22oN+XvRp2O7EkYPgGe3ny+dUBZjVtzM1vQ+4Jp2G8KO0oGAfVAakhSk97sGsvh7T3zPJEAtHQ0tWmGBSWQpGiXbgXd0OzTzuoV0OIABxY0U98ilrK5nfWkhMzjqwcwq6P3tpSH7QvblRtLJrSTba7PLJ6/POVP9plsw2pLd377VW2ftkkMa0rZoDAKrF126PTwaU3V7NGdPB89cul3a7yAEFUW7PavFFCWLbjckZKu7W7cXT7dKigCepdi2tsfQ+/WhxisumIMA+6AkdOECYzFW3bwtcc5UgxRN9FXCrI99SUC9v+B0poEJuot49FoYklpuJM0NpEMDDPvZGPyPB7wzlD893Odz792hctPgW7UzkXHGXFoYtFEMFj7AOcg5fl9dgLCwXYgspY7m+stsPdFm4rY6VONKvMU8EnFsa1jgiehjfa26OCZKAWH1+ctjJPOmi/d7eCNqfrtzJg3GBRpUGtOCmfmMtnIQo3hFg7AM7ArFbT6k45ZGNX9AItGc/BYl6tQH0WH6pNfO2IYksal29FMEKA0KivcA2S7VAo3rg3tq4WtmsGBo1BLqTabDAQzSiX2DNoXeZGYTHGRPp3TL/dKgWqAHzXUZ0yCHLahorEugoLaAMkuw2rHYt6/7NVRLS7Hc2K7AdkXfxuRIOxpDwIXznPzAeqPYH9FwgBCzHZEIJEo6cIWjLfeXNPSzVGYyWIaMC0eUAwgN9Q1ojcvH3XmJRwtY8aBXEiNukLLr58jba9KVc7mkltSUW0kJWMhsIl1Dujb3JcvODtTFFbGV8yoh+N0ULR3Fon677kr00XOBiDPu2XseiDYtaMW+xSni0wOLWggL3E2JjYXKp0Ah3qUYXxPUezJAZKGtfUAbtKvEhbrfGPXGRBrJ1Qk1Tl04PLfAybItts5K10X/EbxhNkkwrrvSHpL0ApAulA0u4WlQtGQlJFCIYOPGpIUWY2G6IkgQdM9ElRmdkVJX2nChULCtJBCK1ap+usplYe6zKwhio/rShjicFUwDpo52Hd9mO/IepMnQGdqCCzFFejaSNK1xYRcuc4BKuwxRJ7DeRqQ9czH4W8VL19me2s4RKpMcElPhltKhAYYsrFm2gFSeOFYxiIvoSRZ1gjJfVEMHmiJHQQFHck7Rg9khyQKBava0YDVHEZx+P6G4DOdBTeiQrtQn2vDT0GUtQLoLtM9xM6nLqB/oQDET/6NkJipQLt2YxDyd7h04qzKapoUQACKpCbYDo2S4k3AQrRc6P6mcWRsd8SSnGLC98xPaTV1KBgPTujgneu4jEBX+WsQYJk3foyotlGFXKN7d6W06Pq++uzOqWMk5DjqJKNRnLEjdtUsizfWAARzWSfLWlNCJzHhLNzf/SY2PIvIUsIXnE41z7o0icgz4aeBu4CngDzrnrh5YkJ48WNTpVb4kHRA+t4TboX3miJgp6vMiJnR1xivS99vn1e9mB5lYjM4zWEfXJt3+bEFrETGCh5I0uqIlB0u1NnUdzhAu+PUvKwzK9vuzFvfav+AXQZQ3wmKN6kVyQoo2iW7AxII04KykxSGhDa7E20taL+2IA4t4LhqA3sxMugA4+lQk0brt2R6USO9Cu9LcSlywvq40vlEKCt/1Yo0DlAWHjRJCqewvLeF++u53V3ipKi5op+bbpblzPYeoKIGRXe6b6iycn1PiRUxkDmk6/kbX/o7JycKE3zj9VkgMv8M5d0l9/3PAe51zPyIify58/7O/oZKHOuNA1AI1U6Ha9gNpx+FW6nhbsuYc/ROPrhtYCknnJHx+VXEmueQXrwxtX3b1qcnTE6dUCBf7GPeb44LricJ6KLJqwkNTB6I3XgS30N31GY2QUVTXkoPmjD0LeT95LUnScXS9EATx+nxYlJFTGhOkhohOQxUogEsLUS9e6aSOLAxflFLSHOdzk3YJonhtwE3cQsBdfWvVkAFZ2iABKKCM78Wt4kRz8b0yAs0AHcUKMuDXINFJeRkdOwXGgNTSSVfxXVXGQp37Mch90ldDlfhu4O3h848D7+cmgCGbFCfIkGyOzkPSVdP7TmiXLK7yYeHiTVP7GfuSOhkJIw2oZHkG2+r8pO07+GrCNDfP9PUFDu6yhZqlIv9NFIE7EUy0BRQd8WRt0SpRlMYUGA2CcK8JOl8UaTO1QgGAK5zHQ6Xz99UAfU+otIKpA4etXODManDUOKZFrF2mMylLkgRQTAUz9w5cdkx2yW/qf1rkofkawKKz2JBTVqHnU/0Wt3W1AVoBb7agycu2RQC0KC1UXoqS1qUx1O9nRSlQ7M/dre7G/GaBwQG/KH4k/4Fz7keB0865F8Pv54HTQy+KyA8CPwhQHD3aEbPiFClvn2gjdxJoJ4527InIFWDHNhisgsjb+HUeF0xf7LqRx96+XLSP1EOf9SLU5QXuCy4XiXWZWRjlgd+cdJJFAa6luzItGEdNA+0I70lXSuivS1f16XMUC/06gJDisfSkU8etvHirlzo4lO0c2I64k1rg6OwSLZ7bBkt9pl71xiDZh2M5YXF39hpvLIzGUROYjVvyLyQVrs0Xvq3A6XtFwtHldPtZAiQ1bBrsYiyNPjbbnou+KClAVBFKihMbXNXjM6Hbmo6u6BqU41/lTxEl0P4N5TdKv1lg+Ebn3PMicgr4JRF5VP/onHMiw0srgMiPAozvusPZyuWGPegGu/euiWGxgkuvK3PumwbfOGwVPkcLboO34Cqi64feHrRtqElMIvkQKPTsCt1hJTqwcqG9TjzBhYWa1KSBEesDSD84bLQtxHdNUG4FhzUqf9SDS+vdZFvptvXi2PfVHzU8YvHibYxXER2UonU95I0Ba1JSp0HTeDtvG0oame5SD0Ay42YEgpi39TSRDh9JBxK28szDBYcs03QLvwMmv9uADQtbOlqMNoODgqYkScNFCcJ1pyuTChDzu/SeuA4sHEpyiJJWowJJBTtK8l/R4KqStmmk/mVixc2l3xQwOOeeD38viMi/Bd4MvCQiZ51zL4rIWeDCTRWmF0c/FHlSHcLkBSNVnLRBZZz4u8vKSEYwIZce4swqsdCpUU+6P5Chs2YdSlxMOn3ihtKpEKq85LikI0tlhk7fpnxrUf0Ovo/BCBjbYScOO1bbWQmYwgJu1H6foG7/lowzLagaTpDWIXOTthJxnrNF7ubSfObDmwF4NPo6B3ELUIG7jXkDCETVIFnlw8JwAlL6bcNovEt90m7cju7AV1ioLoETyUAZuXbaLo39jgu7v/DUnCSbjqZX4ucuDya0MzIRvYDjIo59D9viCViiakN43nXX/9VnWuL46Aw3mX7DwCAiK4Bxzm2Fz+8E/p/AzwLfD/xI+PszNyxMD4gEAs8WmUucLm6XuT5U3qjjCljSVuGCV12ov781OMDBgfxMgcsXkMRFlUkOXd1p9iJK4VL9acFEMT0SO+SLNBYZt/R0e0MeU0vqu/f/kLS4tC7cB5BFvV01vRHKmnRBsLYPuYLkTZn0YQUqMeZBFvMhvhfrsmHwA9ePaqYOW5fp0XGMwRuS00DF8qRbvEUH2i6JKZLaEHezUl+1y3OcqlD2oN6u5sCJl1DMTCj06VWBJkZw0lJgxJFIl1Uop1TA3YjftbD5lHcDkH+/EQnvl34zEsNp4N+KV15K4F845/6DiHwS+Jci8seBp4E/eFOl6V7GhZG2zTzF6vsS/DuKIpUPxGDxIU8CBwDTc4hKRUiSXjJnmLiQ8eAh8fLCQGDp2LfDW43bjpi0w1N2PDmtx7BoFNeUQAjpAlS90FSTJYyZUypO4lY2Na9beOE5UTqIVBzfHQCfJNKXLkk62c3N4hI3TGMa1aLegtdxIVJ9xHaHZkQJofBbdMnbUnpNs/gtw9iO8GsqM27pxeGoOgDWu1CRw2ZdVvOtDYcLgKBpN4Fr+NoqFSeOgQUm+TsZ4ChntUQrSVVSFx/3aDIl1V/dxFtJv2FgcM49Abx24Pll4HfecoGKU4uTcFTUpTDonZFwoIviwBzc9bTn7lwODk5F6IkTZMKx5P6t1ANtztSYyM0IrtH9yE4y0Hq1WB2CVmajHQWk09FVBOhUVtp+U84skZOLGra4sDIpySX9NXVB6e998TmBwNhLb31bSx6/sIsJoBdGCsoS34nBX3qEbgv8DlNczLBQp0geMzMOXOL4UcUScE6yWJ7ZOKtBEQ1WWUYGJrBrS9pKjAwiqL3tRGgjAkbVZehagtCGzGgKyTYi1u+uHBhfod/GAUZyM+lweD7K4oRnenRfHhpC7LiI9wvbLl2+REhxj7td9FdfaM8CN5FclaBrbzQ2pQtgY19knwtVIuc09Ixc/sBS5xZMzsZU3wbnXXOkaJPRkoeSspKe26p3h6QGiwe8KDFBcsf14m4szPdZ3AHluYHPsa1CZ+GHzpAXRHu9De05q5KWuuq7bcUC33jT1aPLHUpaokioHukiA9eYLaIX3rNTCNHFnTpPEeZSR9bqj4UC5jjbXk3rgcLA/Cx2YrBrN0yHAxjwg+pw9CPm9vf8F047RoI7YIJ9QfGvmhBFWXE/PBkFrXTWaTqg0O1biKWXcU79PFimk56RNyUl2yMuXZbrylmoTksCEXyCbTGpFHGLrgGj9u6jrj501iJ9TNKG4rZJDVGZnepYj+WmCMyxvVHcTZSv6ortCOMrDUoqkAWPxYOmPVvIQndysZdlSBroXPS7OXFmsW8ZVw5zJG2k3ZCnz7CixNOf2x6wxbFP/Yzv0WGVKk431f82BMg3kQ4HMKQBUaDQQ+fkox/3lGFYOjhoEITMELVfW+LVa5K4RPd+eo7irgP1Z4eotKQQF/A+7duXYPr963GtBApazwfE9i6JccHHoe72yJM/f5IcOuJPaoajW5TQXaSiCDdrdxCnMxuO+DB4FMGAHA17heq64vqd44/47Wbltpx2faDbFtXgRNeXpBJKyKsYDdG9WRkZ8/fVeKs6sp0JLWnpcdbjbnJjbBrTQG/aFpRC/sc64gGtqE5HIE/gT7y8PW8C3TK61XQ4gKEvmkGauAgIekHLXLqB74uOUYfsc7OwHeokab3db3FRWVGTEySFwCnjOwvAoolRKf8LF97E7BHl9cJSYxABJZ0ShO74cawiAobaekug0CNYLQ0gQOFoK7AjMBWdD0CTq1MSiV/tWCzo8vFjDJoSF13qaFiARhaMw37bWAIXjuu/k0i6ezGimhLaYTsfliQlxi3pvmoXxlfPmT+H0PlC6HyuCFgztJDCWErIayJwdT91VUf6ywC9N74J4Fw3Fk30s+jel2AwT/Yi00mEBzHBVNdvABTgsACDnqT4PTEZJS8pYoFu0WZ9L/L3gU4N6Z3U6y/uBWt8XODaxJtQnmHWnyhk4J0sT3DbBeLlKdnr8dKbyD0HpJPMek3w7FvMlr8T1qsz3vFHLLQKhGJ70/qmA56kVi0IsCgOqbg3fudiCFC0/Uhb+pP4nKpYDMkXgTN9biUvW+fVzEP/i/mceqU3CQvSQ+9z4taQuHeS1rQfzn70FaQFD6pkEobflqRTfSJQBKnN4vzqjX0YouvfRDocwACdMSmOuh4Q8r8eNd3CYGQGQZ00t3LqmTIWxjK6BvX+kv/mObvLJ33olFtsm/qb6C9a460kTpQaFDht1CszIu011qnFGOs50NwSxzUCUl+s0duJMa86T7Ag7RDGQoVET3VFn4HMM9XndzG/yVWtrOwoOQ5duCMut12owc3KQz3X50gS86Hrq5YAu851kkf2nMQ8ott0FlxGAU0ftJOEpgEhtkddSDwoTfe/G/VY96Xft1tIhwMYnCK6qJvGPemBDmmX1b64BiTCHRyMnoifb93lbeq3UafIddMEhglOOqQ2PPXK0JKDvvCmA6iej0BvYUVxtVvPecEZhx1YLIlYWsn9H7IOqjYK6ayCjhztFsZrYNdFuj5oEPX9Dg0b2HrLdjMW+hbAIPbHBnB0ufShC8qiJ+ukjclq5yOqGn6epVPxYlvieAQbTJQS0thrqUsW50TfG5qMsQFgTACKduwZhL6jJBnfe/1J/hGqfbHe3742BugmtSceYxeJNuqmQws8Gc9Qz4e2z2CRsDOurRZQfKQnWru/RiBqJa6Pbj32OGVfaugvwPRYEecCyHQCQu+DqkqJ7wucLi2CSOhZizIO3Bk1JbkJa9du/YoGr87LNNSlDMVp8fa4eT7+CjSEzvhsovdr98y5CBQD3LrPLU3/N3X/QsSaCAox4Ez0Ck0dIEkqgnffdpUfzHTmoggnJbumdXW67n3E4ZShUiw+UIvgD8dFmotGYDvQxzQnvX6q/h+4czOQDhEw+JaLi6HEFBcc4ryRYPVz8YirASCzTGtED55/mVtuQP2EuADNgHSh8nrPxbBnPXDceSis3GLfe68pDpjq7HODPpfXgNiTmJwqKEk0grrdebGsPqCC6p/imEPtT9uMUV3TEl6SQHJj6X4qWwQFXU/yYnXGH6SLR7Qdi+3qSxxG7W6lOsKlLtF4KqJsBj0pSLmSA5hwWY+tJNmEks9IpCFtOI9/m7xh4vCHpoIdzO9a+NVvqx5o9cAuk1J6U5JU1N+OwCCOFLTUb2eR7S4kbkHMowg/iYHS6cZxkGz3mxPp3GodYcuuC3veXbJCF4JL6LaOehZsEdKE77e1mPKFL5nzkPqbcclYbuwn/ruo3/0+vqIEp96P5fYIITO+6efaYJgeKozJwopJ7onalxqKbtwzKUX7PKQmh2PYqT9de3yxosawBzSQ3M1t6XdY0viq8cjmIixWEfFgr45ox4UTo4hlOzpxmOPcRVoL7YlnUXCe80cVWOouJkRGG1EQUuXFvybGEg3SaFS5IoBKPJ+Cisl5EEBnk3PAbwPpUAAD4Dse9CRx4GKAU6O2F43iHpADgnKzTaKbkgj8ha7SvRcQuruw1HUTaDuuBh3BODzxi16A6p1cLw11uK7OTAeOCyLzxJOOGDNO5bKFLY0Eo7cCEOkIKvUlDIZRh7CcgBu5LjZFLFdLTxF3naADmUS3XGlIZxhM4HzpNKQCBTv2AVdMLYm4F3TxHojHRmaRqOPjAlxhoQAzFcyeUE2Nj1oVzlO4UpUDybrvjAeQdrlBKDzHtvE2rtCmyqX2Z3ePxp0G6WI6RiKzIVqTXbJpTF3hoLJQG39LmBV/zF3FHIm3hwFJChEryFwCoxTMTEKMkRD4ZtShnh1bZKlFSpsO0Yk4bGNgbpCZ8aCV7vHkltLhAIaxhbt3aa3pAnWK3/42xiLGURQ2i6xjjOtCtTvBWsFaT0nWSnfOPfyzUbwtfFmmsBh1/iAZoawJONEFQmkbkwx1Uvj9KddKd5mtC2Wkf/79RByt4CqLWWq6hWB834rSUhSWwlisE9rWhDb7fsTk7ICFrpc08xhkIkEnLoqW8bhhaVT7sXHQtAVNa2hb4+t1fjydVe0QcHEswOveMWCrcVA6pLBpLMy4pazadFDMhHk0JmsVVdHSWN/vfvgOa41XO6KkII7SWOZNwXxWUTf+dykcRhym8OPp8/q21/PSvy+OlUnNfF5Q7/mIwktrM1aXZqnuIlj+mrbAOiiMY1S0VEWLER+AtbWGNrRn3pTMG+9xZwOtVUXLuGrYno5pW4MxljK0qbUm2Q1EoDCWsmhxTqjbgqYpaOqCelrC1HhwHFlvt6hNikomYYt2NG48rbQGU1jGaw2jsqW1vrw2zGnb3ph+dDoUwDCuGh6+/QWssl5ZhMYaaltg8BNmFNFYJ36Swjsxz3I5999DXuuEuS2ZtwXOCeOyYbmcs1R43aV1QmMLGmdorKFxhY++q+qprX9Wik0E0uyzUFtrsAjb8xGVsUybktYKJ5Z3OT7ZwSLM24LSWEqxlKalEt83ozayrTPMbJHavlOPgW5hjExDqcbEOlloky/Tpf74MfN5StMyMp1zhO5/Y00a21jmuPDjZp2hCWWMTEPjCrbmY8ZFgxHH+mjKvC2YthUj01KaVtVv0rzO2tITbgCrVo35rC4TUTsnlGWbFqwNC2gyqllbmiUgMeKo24K6KSgLy6hsWK5qCrHs1iO2ZyPqtmC6N6KtDdS+D/NZRV01LI/nFOJSO1bHM5bKLlyzHstIl601FFVNa4WdvTFtU3gQG0eQgFEo24hjdzaith48isImAGmtYXde0kSAseIBdgQ0BtkrkHh0O5GI4HbGzCYjKL2k4ypHvVozWZozKltGZQOlZ7DT+taW+qEAhum85LPP3Z6kgqiXN3XhubX2qENxLS0KR7VjZJHSSxlGSRQxibHdVqCSMny+rk0SREcInFicL9M4L8UINI3xdirjuWBpbOJus7r03Dcged0WvLi15rmwI0ky/Tp9/xcVQs0xk6usLEpN/Xxa6oj5IocZuuhUAvG76FsR1DBjLGXlCbksrD8hLn7TaN6UVEXL7nREWVqaxvcbcbieBOYag6v9/EmIK2Bi+PXYL6VuITCHXN0Q2As+A2mCgpoZVTdXBlFbHHZaIlPPbU0tVHOSrURsxbRYYmfiaJZtF7V61O006F0TYltitOygxpoayqCyzZaW2JvYdIJyMwYMssG+EQL3utL6RV0bzK7xkcniFYJhRyPeY5HU5GAwFrxqZza9aJ2CtmwWzMyYaQy/F4ygQ1coHJQOBTDI3GCeXvI2Nz34Fqq4ZQRERxPTu91ZE1SMDBSFD1d0eiCB0LV8He14Sp1XDfPfXdDfrYRIZtGvwHWF9NeYnsym8LFW4nn6ZPeA7nh0MDTtt5XXDzybNbPvuRgyRJtDJFAdol+PX5/wjagxjWUBtcBcxTTUhrU98cF3raOLHxGNZpDbSNRn337J7AM6UpML/TO18gRUBuQs0G4wHpsaXFnQjktcAaXt3rOVt40Qbvc2c6GYQrkrlFtFFxRl24Ryc1tHbBdx7pLBW6m5DcieSXaDtIsQ/sbnLlx2aVqQ2hsfnUh3e3icbwO2t0VpS4cbkYK2JBW1IYT1UxMq3Xq42XQogMFJmCxlcEth1wVoXDLouQLauJ8eC1DAII36Qegi9gwo3S78HgFnwcoLi6fxNGHL4rP+AtV7zskwGAjbOcmPWg+Ul9WrPOQyIOtPemxLWDgWSeNgY4zMoX5qy3lctLENgTum4KSQwqjZEuLZimiYTLd0RQctPV5ZO6VDgritqfIJEMPipyPYgdA1MKSAKHERBDCxEiIyVaQI0XFx4gRTOezYGxRNLcqI6rK6IvNwdDTTjZcLtOaUAThkcS4ZxuNujovGxih54NvXRglFD1GcJ82EgqSU7p+ITNDQXVUXy+7T1k2mQwEMCAolw6IXP/H+Mhk8qw6DZEu38D6EMSgkW7jRmtzllSQF6P37JFH0/QPS2YtOStHXoKUdEBQBaZ/3kD9rp1rVWU8ET9BzSTdUx0KSd5308se26xT99yMHaUnbXq7s3s38LsLWWpKoXLcT48cyiKRRVA/vRPDF+fISCMWI0TGf6nf/8FtKLtxXKUqyiSAXF1Rsu6G7XRoQ57p4j1WHNWmsXbeD4qWAMJ/BFd9OvL9Aoh3tIBTaGsnFg1y+6BwdOHW3gpMAIdFcyLdw36Xur2YQqT4yBmMaodgLOy7hSj9bQDraD4vxPm8hHQ5gAGJ/YlyEeIrMFc4bYyLS9/6m1Cc0JUXk91S6xXHSZbpuwoe4dvoo3btp3UQRuI9brve8/1kRsMQyDRCjTbkQaq6vsgQgS5w0joGhszVo0HCeK7roh6CubuuPZT8l8Ou3ERKnlrBzo5+5AHbpsJEaPC2NZEAV5khf+Nq/ZmRBMhM8NSvOHKWmdPozzZn4RRSPciuCyObBqrmT3ti7wY9Znv0O2iVpWL8cJcK+ZCV0854kwdDWstutSVJkCwv3rTpZBOEbpEMDDImDR6IJx2ttCdIPsaY40MLilRB7MeXtJJAuz3AbhvT0gxZJVH8iOKQr0UB5tg1VtFiPqN9s5ZBC/Rg7oCQcLRHlbuTo/zoHnagLR8KyCSd9vv7R7viupl8hqT5pQdHlPYj48ojc+VgkiUfliYCVylQMutPVdeaB9yNQqoVhY1BV4/NnUoVKDtK1cEM0kPLdDCNWjEADbNavEn/nppP8ElsNCmE+4jJpR55Wuqv4Qpk9PxFp3QKw3igdGmDo7mpwWVxDxHXi70DndHSFyLkzD0DIBmnh/f0IegAU+vniGQBXdndbdIbSfcpUksZQSkbTqC5Fou6fGdGEMhQwRucb+JsVJXRGN2HBQNu/F3RRJWIRkLvHi4tP1I/xe1zAkbtHDqqNyZp7ajUwcnTjcut7kFbSFYCQ2Sl0CLXYhhiwxZYeRFKMyhssrARkAumqPN3nOK+995wei9AvG2m6N1fOBboIRBt3IrKAMHHsVNm3aniEwwQMektSE1lieXQEpBdXBBLUM1icgSHOEHWxqL6IeqxQfr9kQkhwZ+mOECsLcdaemPqiok6WdIkW4d5HrSJFrh2fKexcrCP1UUsVzlNuT8z0+3Ok33Sw3MR547NYlh4wnYZAeeB51lwTiTvEuAx1OiFF6xLVFx0NaQH0wwA6R7KB6CFJdVmS3SICwr7c/wCpIBkiVRSmQJbdHMUxU5w8MyS3kjwqRc+JarMLFxN1q138tXV6HiGnBad+vxnJRqXDAQzOL7LY+Tj5kSDd0CrV4BB2FbpBI4lcgykzRob3dXMi9wrW7fRc8tcTh43cp2dkjE1ZrD8vL5aZzhgInYTQa+qgcKMNZbr6AXBMIKsKlLDj4Fro30WZ0ahegJqlpd8UMS+A8EDDVTu7bcBFsVfr5N7S3xM29HjHhdcVndUfT4j2Yx5029tdnVr6O9DxVBkm4lpMQx3po0+MfdUqIZcKeKMnsk979POopOa1a94NuFwvHRpgyLaaVMTf7MAUdAtVo2DyKYh77OrMfyZhHAAuA43yYeDzdoIiRGX0w5EZAbNqtBgfiKffJoekQB/9Ng4ZVbX4nHGLwKVE1xHe6z9ygnfIond4CCUVyDBJpQWoubbuuwzk7wTCLG9a3KqMzHaUrXzSQblE8Kpj3vjqsnsiMz4QDZOx/jiGfdRVdonBhZ3K6ySp2JnEqPuD7dRmRF/8T7suLm255wfRQpmB1nV8mrxBKCmiK/tG1yv00+EABqHbrgSPpvoQzQL895IGgEAsznYElCYfOtAY4ngLn6Po0X0VLU7326MJWrqJS1xX96PHtaGTQAgSSGqrkkYy558EjC6sj4EYkwdwOq2b6vEZirg0XECPOGXxWR8U+2pOlq+WNL6asNNr+v3IjU0IaacBLY2vYq8KZKKjlIACkEU0T2CluXkfLAalsq69Geg4de9Hr4n0P+vHA4t9QYWy+zRnPyC6QTocwADe+NW/rzL9qJ7pBan/9rcZUVwvvtM7benvR6A3UyqFBRrbJciCaJrUHlAHqOg4sO6GknC0upSBVXDtJVj9/eUvkoACB6IdhvoAExenAqd9t13j71bFcwyeorFBfe6ed2hgvOj1W4N2fyyE/FhyPArdB+I4X+GZdiLK6ukxEqfe6az8UcLI6SVtaffZcMyjbS6pjgEurNof1dt0E5WyZ/TzprJtrxnByJjmle5zqqOvGuu2OKUy3UI6HMCgkbUnUqa/psuTHVlVCyt+T2pJ5RbdgQ8a1IGUkDkuWOkWsVjC1pJRC3vRi3LBAIfqY5RwgmSiw+RL2zk69d2EiW1X0kV/TG/YsV7fu3a7jp0dsB/XB41cdFaAFKQQoDMyF907cSfJVWQ3b4v+3XqXYa+yOeyoN3+aJHrqZwqmE9qjvTGzNg71LfbP5UO6wJ17gBbbFN2dgbS7ZurgTyLgygDE0cAopBvEk9RiwEYjZx/09puelNVlIHiz6XAAA/QMJf0fXRD91J2SKrNGxGTVjcgcOY4ObjqU+gOnuYkjTZZk9eCPF0ed0ASbkhJnvYoUwMl1EsVwHyW5uUrr97N9zAjfp7Qg9CW0YRw6Au8Vq4pf6KeVdD+E9iaNPiQLkoYwPE5pHlz2PIv3oG77ciaEY4vjGz0oywj8vs8utjF6DhauA/2u2gN3E/rh3+JcLahA2YT3GE8sa6iOPoDoYuNc91Xi+NXF/rnOqzMAhESas57R+Q0JSWXoJnd9pZtoTRMDdd8oHQ5giFxeo3KkTFEDEpA/Jo32C0QM/uSStmYrDh5Ffb+jMDxqCQT6gWdjOUXHvfrJNIFTNcLCDaNJn+/6msTIqGOLwxaSPBfFeu7hzwy4/HyEMiBm4xLb3lUz3A468Ems8IDFtmgn6PVHp8i8e74WWbSlIH3Fy2mzgDtRAkselZKN0YKUmToamEmPW6btySFJ4SDp8aCFtc9rEfRcTzqy0TFJ06CuQ0iqYBy7tGuzD/DHU7ALtPYbTIcDGGAA2RTRhkWzKC67BW6Z6FbUgga/CJQ6kl0OG9/vicKpPfshr44PqVSABEb68tYASOl+x1iN5nrxjIHuX8way9nnQNhCiu1W9SsBIy2CqBJJEtMl/ZYb2lSZus3qe1qwoW1+YQci7+3YZFIJIXpRDH+g6uvsRWHetIGWbCgzwNc2Jz1OnX7fMYwFw1EqsPdZA1CPEWVvainD0B2lDmOSzoLEZ5A7buEZoIvttYJpou1noMJIJqGNC6SqPUhvMh0OYAjcNxOHooSQBdIc6J0EH4RIQJFS9Eg4CX73HRV3BiFZoId+WnC9dbm9YjHcXLfQ+m2NeVJeTeRDYdwTsHV5kq+B3mt3muhjfepfvxlxYQz0MUlWi0Ox2D793faeS7dtmMWv7B2iSiChBBas8ucRkkdjJ/n1wsPFfoTfom9G/4ShqTvumxknB7pG/vO+aRAUdFscg+7aKbsmWX26NK4LF5naPhXLwDNH51PRA7GbSYcDGKA7Lhq5bzxYEynF6R2BnqQQ3oOQv/e7WOcJMpxdT2I7imMbFq9IFzKOlJLJwUirNz7ysqMtu3bHJkPH1XT5XTsPRqgMFJw6yqvLHCrnBkShoxpnYnZsvpYWdNLPHJ3bcr966ThmuBU0k9Jc0RnZUtgzK9kp1sQR4+dwI5P2KEzrJIQxy3cQAn/QFK8XliNzrEpdUABmR949P518jQ5wrsunDcTiQBrJFj+qXGLeGIq+9cZKGx39YjzKsjN4a+kjGWnD2CepStGUD1n321Vi6KXM+25ocaF08kECFqLendA4yHGiRPI0VlG3184vfcEjzm5PhM0WkZYsUntc9npC8nhGP76nRUm1xZR0f5M/R5WniRjXu3B1H6zJ1AldfypHZdbPdXlpEasyE9F2YyKG3MagFWuXE3LWdw12TpUdQUj1mYH5ALW4QpvSuRvbG8v9kp5vJ0ij7unoebqmohwhirj/LUbCGuTssXDx7uC2522bNcWS1FUJ9ad1YMAV0tkiEg26nKneZDo8wNBv+QAgxDymzX8HBf5qnzq7mKNH6HrxRG7kgrqhpYisftUGSYu249Dd9WSiIgLnKzNNpAos4tvngrogGSAk+0o4D5K+R0+5xEoX6/JEsj9JaBDUjjiODogy9Sm2VVWT+SHovFqtser5gNSh1YR0RFsDy35zF8chHF5K9WknJz3PVrJ3tcSVMYpeN+M7Ptq2ZMPcb9tCAZHH9SWp+F5c5EgC5xS6T9th4jmMZqCMMCbpa1wbPYnpVtINz12JyD8WkQsi8nn17JiI/JKIPBb+Hg3PRUT+NxF5XEQ+KyJvuOUWRcJ3yk03Pqf3WRnJ0r8QSzAZ/mw3UNG6PcTt9fdOVOsINNPXFSjEwhJHiQQXIvmK9QQVr503c0lx/GJ5UeT091xIfiMzXZ302tctonAIR49LUqnY95+06l+jxi2G04uomXZGFv8lUNBEWrjuKjuV9MJPB7Ikjpcqt8/1IwiW/p8Nf9Nc9jhx9szGPknwhSA5UmX0MZBSM8LOQpSIxPlyTN21e4ix6XBzmu5S4aG9GvAzAy75mEjYvozqS7/8hZBzbp+23US6mQOZPwZ8W+/ZnwPe65y7H3hv+A7wu4D7w78fBP7+TbfEQQq/rhdbTGqyu/BYmgh7jkWhzBzRXcrfWb7o3utJKXpQXeCqi4QYtw9d5kqcLZxQwIJNRPYhFvYh1tjWHiE43QfVr5vmFAp8hxZm6mcAvy5Mft6BCIam9osxLcI2Z2mpaD0/MUsk9IruRKGqRg1nNwbxPdNJGJlEOOBP4OjeTwu+P2TS/e5CSLzkhKSGepBOFW1G2khjGNsQ7Fq2csF+4ZLfS1+t0+pVYlwRTPXfPlCJ+nwL6YaqhHPuAyJyd+/xdwNvD59/HHg/8GfD859w3nvlYyKyISJnnXMv3qievsEsEUKfuJV027WRMGiueydb7Ytl6DBy/iUS141HqMXRXUXfa0x3VHi4zVnRgt+Pj8fDNdeO4mN8X1N1bKICxPg64lIb0uGtoX7uAw4Li1+PdwSIRulSETD1bVrS67MdKDtKRbb7nDoR//VAP7cvLXSJaJfIGEC/f/0dklBWKi4YOpN5Qrel3z/pYo562xV+5WhJSQloXZ3D9NfZw/IYkaAkg9DJPr3ofNnkJlW0a09iUsJ/skAtp9ViPw+cDp9vB55V+Z4Lzw4GhjAYTnOHIZYZiUdFjU6Dh6LFyDSteklIBqdokMpOXw4NfFQJekSsj1tnRrOI9KY3EX3UR5UV9WMFErrvSUXJGqY4a7hFKasrG9sDxIaFvIEww9V9SeWJ+q8hBWXNGFJcPEhabHqB6e/ZWA6kQdWx/6gPLv382jCZAR1JCkkSA3R6/n6LJ0hpnfiuJtF26iNqa7RjHJLTtJbotDQTv7tFptNnMoM/aHqkG/Me7t50+k0bH51zToYuQrhBEpEfxKsblBtHu1j7hQsBWHvy2lDPojUXNTl9AqT7nog56JsLbeoTmSET4VKKV4LF7FFUTOXH53QAUPqCvZhNR2xxAovF2c8WkbY0Q7Bd+JnPfEB6Y7UQ3advjY9UE+oxNYyv+ZDqpnGZERDn7SW2hGZZmK9Du+wwNdhR74BZtCGEqEpdbMVubLs2dePUjYH6PMR4DyILXYfL6xVH51XYm++DMDRrn9I98l2prqAkbfbL0DpCtEnFx9Fm1ki2BZtJNQOdHjKSe8mXzE/mVtJvFBheiiqCiJwFLoTnzwN3qHznwrOF5Jz7UeBHAcbn7nDogck4gTp52CNin1eCxCHdAiIMZtj6iYOaRCrXGytdLr2/mvPR5cv0WH0/oIoQ3M+X6Z+6P6nBClyGuKrOIx3BJKt+BAezuLOSuFN8VxGTLR1u7JHTXDchb36DdLTetyNwIbpUs+yYPHidva+s5/dTxvtGo4PRQUKLKElJpQXJom807rp1cNkxj96hIgeIBKr7STLWH+1OYy7Q3VqU1+XHq4tAttDmSOO9Lc+szCh9RI4fgDajpT4IyPD4pLy3yLp/o8Dws8D3Az8S/v6Mev5DIvJTwFuA6zdjX4jElBGQGgx92Cfpslq/g4VFnRm1YMHlNOPKus74t/fc9X53jnCoRxLQuFhuuDMga1tYjLZ0iFk87p2pJbo9urn9Ge85Wun6UtFNjEnpHWfEuXCxj6cmU/uxKY9NaWYl5uKYZtkTrqldIqq0yWGgXgMzh9F14bWnX+ALxrL72aPeYGgU0SuQPihlN0qF9qct0zg+MYiNk87AdlAKY6rXYwICzbm1RGpzm4FmIC4QQaTDoX4lcAhvZFUoRpfKz17uNV/bZML7g+AJi9u18TdNz7eYbggMIvKTwNuBEyLyHPA/4QHhX4rIHweeBv5gyP5u4NuBx4Fd4I/edEsi4g0htxbTw6QOisOo9xfKdXkddESfCEWBRkJ/p7JH7qI9/IYkDXoSgSNxhqSjDqREWNK5Ekvqn2p/fBbr1CKz7Wwi3l4AbSG4cNtyBBJx3dkEqX3fjxzdYffZEYW6Pak72Zj3c3oSpmcbLk1XmIxqduNP4aJbDyKuM+juR5ySW/pTn6IbcHwedp50mLf9WGTfAzMCRFqgEsrX9UEX5yJf4VkVESCiQXLfRXezi7Hf7/6rToGgNsxCx9zIQxMmrIvjfovSAtzcrsT37fPT7xzI64A/devN8CnT1/QiTBXojNI5OqnfE1HQrfW4YIg/9SctcvQF5c0/l9rr87bsLiURiz+XoVUVCPcYSLfFFYleg1i/P7pb8XlmcaZzzlF3Ifh9bUkUMGTYsxX59eu6XAvFTJgfb2n3Kr7noU/wH8YPsflLZ6h2fT0mgIcNxsd2LIyvObbfNOWfvfUf8Z6th/mJz72FIosp4PwdjQcdpc863hsTNQ4J/9Jdk8rPIo1pz+nI5kxgULLU9Q4xo/2amhbbAOfv2cPSbpG2U0VjVw98FqRFk4NZJvGoen2ougHHsYH23Eo6PJ6PaosQh7/sswcSmmNKPzp0TGqAsq2ksM87tDBdpTmx61hMr7w0uQ7vL98DoEhcpvXc2BVCuxT2qE33+6AOmDraFz07uhXwl6dEvTQaUReOdfs/NoATgnfyQXn+hVu+5mdq1o/vsPPYBqeqTf7oXR/h/3X776HaFsw89sf5GArGN2i0Y5kszXnjuOX/d3UZd3kMd+9izy9RTCWXbGL79yNO592MF54NLlLZdwFH7p0WbQSVocWR5qoncWhwVVWmd3qP+s87gHKp2P626hAoxJ+EPJ+JnplqS7Nnisqan7loR0andrFuJd1i9q9SUgs37i6YOngJzoQi/PNeg3jxM0gT6W/kVnQcPf3r1ZXqs+KjAhEnMFBTdFSKk1FAGw7QxMAZQHdCE0VjIbxbOYVyD4o9QaLDT+hT5mVY9z0OycPDqfo8IIV3aukIYUBSiMlv04WdEOXlF6/+u/vOi7zxzLOMNoV/f+E1nKmuceyBKzTLQrUbLn5tApA00KwI06OGvRdX+UsX3sRHzt/DvQ8/z3c+8Dnscpu8PPWY3FS8wbR49OG33r+2m0+93gaZAV15Cehjua33Li3mUMxItBU9C5OU6cg8DW/mn7gozUjm5RlVoOShqulWO1pFKSdezxiv1Ytb09Ll1+qll1DpvCxNF7djQVW7iXQoJIYogmcGpQHO6geuG6xMBFSPdMEu/q2AsRLjVCWZg1CsNxj2BMmNO73XQQkZ0QGmhHkZ8imxP7ZlkCPF8hxZvxJQpu2/ficVNwjvpEjbEUgcOOnsFeKg3BZmxywXt1a5trtEuQtPvPsV/NBdd2JmhskEmolQ1C4ZfNuRl5R2bhfWv1Tw/o9/PZv3CW/93Z/AiOP73vxxfun5VzJrCnZ3x7iXJpRb4qNO6f5qaSzFWQj9jTdax3HWUpobGHsZeNabp2iX0uPuQN1LmjdNz9PgenLdn2z6egAlTrrzM7pNA1KMDj8ngL7IN6NPJaX6GBdx/PzgxFus+i7StyoCHApgcIL3fdeT5NRAK13QQWeE0b/HAY2zpfL68l0avCwEGWQE09u08AvJEIKyKlQHqHpFROSO90mqvizYDXTaZ6fE4cclrSVddw9EE6dxJN8BM2fh/gTvuATF1BsQd64uMTpfMSq8hLP+5ZLpcUe95iNTjbcc81WDLbx9oV6NYeCE2VFhfAV+9kNvBHH8sbf/Cv/Xez/A3aOLPF8f5X/+zLcj11eR1vmt47jA9ZCH1Z+fvsw/J6yUgTyKy+43vEn8Vnmiqp/Gb6hu2N9jMC7Q/vsKTOJdFBrYUoOIXN51ecL7icaVRJwZTgfaAXhm5iQd5e57VN5KOhTAAORXlEsnPey7LRUddWL+KNbrCYuEsKCUwQIY9LPE79GVWTGczDVWpcwarjh/ZwQbnp2OoDUikChac9uOyJUeHnXRSPS1UO56Ubnc8eBS7kT3W8/B9047qjO7zK9OmFwQbAXNUqi+CtVHVSr0yzQ+HkQxFdqxN2yaBlaeN9Qr8C+feD0//OAv85bxDv+qPk69M6JsgILclVqPcbCRZLZWszhlQ2s3zXHP+WtwjMN47mvfCYCe/7bo9ZpJO7ExPYklfu7vCvQ2vkCir4g6ag7dYSnoIl/pevbro9CpwZoOe027mXRogKHTnXLRMkUNVskDQQ4kIF10XV2sA+8ZqeVQcjFOi+L0iLInlRAmdEGkHyIa1YZMYuhRZ1/01duWi6qPalokLtWvduyQRhhtwuSKY+c2YfehKeMnJqw+4wd0b02oHtrkdWee58OXH6Dcc8xHklSe0VWh3PP1TY8YH5zUehBYuuj73iwJ1Y6jWfaI2dy/y7Kx/M8f+w7+ydmrXNpcYfkrI0wD7ZIaO500OKv+IAOcWi3STJJU73Rj0qsrceyBy13V2GWcWXH1BTDTbdegEBmBep52k4LhIhpH006Zy4tZGBcl2WRMrk9LSVqkW0t0/fntKTEMoa7N0T3bNQiDmybN0Xn77WfR7l4bRt/9OEKfQPTJt9j2fj09DOr62FvoWmdgn8lT/fEBanqZgzjqXHBkOlrjNkuKqcE0jp17G/6Pb/hx/sUDX88vf+kB2KqYvFhgG8M7jn2Rjx25h3JaUMwc7cSrGOLA1I5mIt7gGvoTDVtiodxzFDMP0K6Ah29/ESMW8zPHsDunWB8L7dixd9ITv6vIYy3ERVioIVEce9HNNw942x+j+ENcHPtg8DB3jz8pUMhoT4vl+9DH4MKOUi+AkaxN0S0+qZ/69aiiyiIddePidPW5hOBC7AibS5W3kg4HMEDnD5CiVLCIymoh9Xd8tLjuIB9pIQOETHAIXDKfmQGZrX87034pln8QSvdE1n57srYYl933m4FhzBLun2gmjtfc8xzPbh6hfuoEy5csZrvgsdkZzi1d5Xc8+GVK0/K+xx/k+OoelbT8sVd/hH84/0aOf2TE0mWLtCHegRFG2xbT5u2zpaQ+tiNvyd++E1678Rxf2DzL/IgwPSlMLjpMA+NrULfC9Hjn9S7KkJqMtnF8hzhx/N7jrm7gt8zeFN+PdbIofWZpME6nH/Rkl9ILEdLEZA5pOqtemIou9guDB7nklAGQAj9dR59c445bCl9It1N0s+nwAENvwPsLP6oE8XNKeiGpRZkNunp24CKMaYBz9Y9p6yCsiwDWEaLrE1J8Z2CBJxE6A4ZQhvKc1P0XC+2yxUyF4viM1288y1Y95qURNGNh+XnDX/uV70Dm/lIcO/EF7SyN+NcvvYHvOf1r/LVv+Ff8pZXvov7wGpOrjulxYeecBWuotr3+ayuHmQurzzrGm5bZEcPOWWH3/jnf8tCjfNPqo/zzL7wJOeP4A9/6YX7hmYfY/tJRll6C8RXX2SVKaCeOdtRtg2YBV3pzp/Vyv1g6y33KHmkjSWTdGEaRfcF4158zNZcL06J0g749IzEkGwrQEoQS47Wa4uch1BBtZaot3t9mETGckW6rXPUnq0v3Tf3ubnGlHw5gUIgeU5o/vdj0xIb3Uub+hOuzERFlwucMWKT7eUhFsGNLFoMy1JHEwth+TZCaaIbaF7lkrzuD3FL7YcQxsKp/gKssZqvk5LFNzo2usFtXVJtQ1LD6vOXoY2DqlmJmcYWwc6bi0hvW+czmhC9dPMUfeeAT/G9v+Cn+xol38tSH7gQcr/zap/maIy/y9O4xAO5avsInLt3F1Z+7HbGGi29t+JoHnuPrjj3J9WaJX956CHlmiXJPqF3B6bUtll8zB+CFZ44zeqlktClMrni7xM45S32sYfRChTHQViyMsZ6ftGDDAS23n2gsPVraz4DYW0Rq7acpGJI8EwgFRMpApE8n6jEoZlGQO/SpNuWV519jyIBchFPZIwNxdG7yTQCi35bAAJ3/u07isoHrSwNDon1GFInz57JdtEWkpPezs/I7qpFa8olTxaKK0yJsv5oMgLSRbYDLhO539eitzMCB7FqLG1moBTtyLFc1a8Ue66MZ89ZRbbfM1wuuv6L07Wk9Uc6OQnl2h7fc+RSPXTvJP/j023jg3AP8vrOf5v2/c5cvXDzDO04+wusmz/D88lFuL6/y8GiLv21qfuKVp5GVht/38Ge4Y3KFH3/867BOOLu+SbtmQQz/6tNfS3Wxojkz53tf+0nefO8v8vNXXst7P/Zqjn9GKPccO+fgv3jjR/ixj38Do4slTryjka1c8vYblObiOA6Qy2CSYJuIX7Wzks7WkybTz0MSRaSPQJjRT2Ih3kZ8v1+fCzaASFIK+FL/VH39KFVJXdZSK3j/BSXBmIbkQr7fWO6XDofnI0Sjbf4veorFkGGN/5cdoDLO34wdQmilQBwadTXHjp9VuC2v3/a8HcMKlkaQGKtR/wuxGaOfQNKddcizKEmotKA/uuHYlkkE1rEjVZxB0wKVpVqqoXS0y5bTS1ucKa9jA8VJ6y8p2XvzDkd+14tU77qE/eZrVK+5RlW1vLh7hDedfIbxUs0z77uL/+Wj385KOef+4xe5MF/n1/bupsCyYfbYso7VYsrrH36SP/TaT/KF62f5Wx98JztfPMqRpSlfeuosR85d5w+888Msb+yx/hjc/jMlP/mrb+FYsc3XrX8FCke161i+0GDmwh89+gne9NAT/vyJJYU2SzQxJBX057G3oDWIauKKtoz0s+n+9eMxLoBCZEKaISQpMdCoBoWYJ9Fa965WmeI8mngNYR+0wrve8BvDEtL9C745NvroqH7FuKNm7ts+vjIwlgekQyMxDO0hx6RFQb9eBUFxXNH/XDpwk+2P633uPrdxXZ7IXbo4gfGkIFkgmLxtkhMLpFuDFncnlOzqeiCns0S9WDlWRa46P2qR01M2VqZMRjXnN4/ByHLvykU2zJRnLh3l+KbDNI5qx2Gt4d4jl/jVF+9g++oy1YWK6rpwYXqEr9xzGz/ybT/Fn738n3H6fSWf+Nxr2bqv5VPlPcikZWV9yqhs2JuNmM8qnIVPz+5i/QsjlpbhDd/xRd6w/gx/+8l3cO+xS+zaEd93/6f4Jw+/nY2fqTn7nhHfb/5LTp65zuqTBfWyY3wdmvWWE2bE244+zmfaB6imQrMcjrHH+AcMjPktcr6FFIEfJeXtV2bE99L5e0/a7u7LZPzobYEnz0UtDYQ/aSuRbk6z7cQoGccIWX1HpQVa6j4mKUMd6ouObK6AaufWBu4QAUP+XTsDaecUP2Cukwgy0aBfqJr0GNJdSw8D+bN3bbcgRdyiASdxeT8res85tXGIq4V3soCxQ8Q/0K1m2WGPNKwvzxBxbO1NkLHFObg8X+Wp+hj1zDd0vl5S7bSMHl3ig3Iv488vc/uXWsZX5xR7DcVezdUL60zfWfFnv+nn+etb38XJT1vGVw22NMyPVDTLE3aNJ7CVObRjwo6Dw37Tdf6H297NX3n+O5BGuGflMv/qU2/k6OlNjj9wmYuvP8nRR2vO/XzB1rmTrL3YsnVnAVJi1qYUItw1ukh9smb8/Mhv4cU5ixe6oKSsfPjylFlkF5nMvpIbUSWI76r1rpmJMv76NkZX8VxVSdMW5z2G4bcM0l5md9SSguqjliaHI1IrqTWE5JudbpmPLOMXKja+bH1wnVtIhwMYBgZs0X7QeQAuShe9z5Ifd5a283nIAsI4vCEr3vDUE+Uy8TEu7qFTbjG6Dx0h9C3Ni33uo4FqvybkKBU5b8l2GzVrG7uURct0XjGfhXPgjeGFvXXshuH0yevUy6cC1zAcfbRlemGJpcst46sNpra0SyVuZFh9Yc5f/sR38e++6e/xtrd9nl8ZP8SRLxuqbUex589HGEfwWQA3gWsPOZbvvc6feuADXLETPvn0XYwvFnxp6zTl5ZLio8e4/q4dTrzrPM/ecYrTH4ejX65plgzzI47ZBhzb2KF1jjPldcbrM+S5UVqUSUpyaQhYOBJ/s2nI+HjgnCjQiSqE8wea9ILNubhbBKpYfbxijv4ql64u6cVTiDdMhXibmvVlqkpWEWAI6i3c/8rn+a/v+iX+7ZU38Cu8nqWL+/R5n3Q4gKGf4khoTqvFtkzXi7KZGim9oLOTkEJ2X1csznSqQFa/St0pOJeJo9l7SiXpU592UhpMGWW4TjaM42DArjcsr00Zl75TdV3Q1gbXGmiFZzeP8sSxU9yzfoVHx6dYvmAR5xhtWkab/p12bLAjQ7NsqLZbyu2aYx9c5i/d9d08tP4ib3zD43zm5Dnc08tUOyQP1HYC9aqlPdrwpgef5G1HH+dKs8o/v/xWykeXOfZIyyMr97B8Xjj6yA5XHl7mHa/8FO8Bdp48w/h6y2zdMDvVUmwbji3tsu1qRpQY47Cm06GLPekWnuuGpC86LwzuzagcUXSP8n72jmSSQgYQJfk8a/q8GczqBeztq7j5trbrwEF3UUkM0QYHnrbbsaNZcn7sCnjbycd5eHSZjRMfonlXwYeefgX87ZtoZ0iHExjUYusQUrrfWjUTCdVFr76OAKJhyIq6xUeS5BClgH31zaHv8Vn0c9ffyTGsD/UZ4ru82SlD/7n4bdPRypxR2bI7q2hbQ9sUuMZb1GRuuPTMBv+mfB33b1xkelw4+ekpzUrlry4z3knHCRTTFlP7xop1HHlizq9/8S4eOXaao2u7vPmup5meK3l++wjb0zFGHNYJd65vcm7lGjNb8tPPfi17dcmVF45w6knH+GrDmY+VFFNLsVez+uwKL0w3ePGlDU5ec5R7DTu3VRy7/RpbnzuORXihKWkR2tbgRp2EthAOf0C1yi4DpjfY8bf+3An5YS1DbqMiLsB4yW5X3uAuyT5C32Db4+eeBBOVkL764QR/eK/XrUTTwRBtGh9mzx4T7FKLXDKMNuEffeIb+cfVWzGV5Y13PcP3v+rj/I83aKpOhwcYNGcAZUMIv2tE7Q12d0BHOiNhHPj+xMSsMUip4IOfaOTWhKIs41k4+gP6ENsZjYixY33VJL3WPzQUKUCxRTdyjEYN86Zgb3scHgrUBiqLNEK5Yzj/+VM8f/wo5oTl6itXWHtmjjSuC0Yj4IxgZi3tpMAVBjNrWXp+zNK5KS89dYyX5Bh3vOIi9x65THW0pbYFu03FbjPi4myV5zfXufrMUYotw/HHYPliQzsp/DHtGbiq4OiXat7/K69h6aow3mpoK0O5i3/PwKuOnOdT07v42snTtK1JgpzMwxz2g+oMjXWkmQQEvViaQ+lmuLv2wo3TFyN/98u/YRu7DPo1Z/yORLwgN57IXdgZ0ztYrUAJzjmkwBvGrZfm5kdbGLdUuyXl1HH7LxSMrzqQgqfOPMDH33Yf8PM30XmfDgcw9BcwZADQGR3DYJWuQ95kwJNu8akyOiR2iXgycSxVI50Koo1O+7QXWLSDSP7ZgbpLk8Uyh1QmXUdsX+FgZBmVDdeurSBXR37PuoByKjRrvozqujC+Cu2zY6anHFt3C+tPOWyppJomXJ469mx5vl5hWseZj81o3lZzpXQc/2TJlafOcv7oGeqNFpm0YBzlc2PEwuk3nefakTknPzhm9dkpzVKBG4fzFiPD3uklxlfn3P9PrjE/s8b0WMXu6Yr1Z1tGW4br37rLG1af5lq7zJfrU9jGYEoH1ofPM40sjNXQ8Cw8EEUr+6To6JPZHcj/JpoI3LszQErGHIYuHdJlaQE2SQMKWGwJFOr8i2aC4jLakFhflDRLqJe8UXF+xHHi3itcPH+EYs+xe0q48lpY//KYE5+bsv7kHkW9xDMHjEs/HQ5gYB9dbUAczLhwBJQkYykxvhfjP5XXKZjZ/QP6TgCcoI8Jx33kJFKGAqWn0iwkUc0fEIeH8ud996cBbQlm5Btk90qWLhuq7eBePAKkQELkJGf8qUfzgq+8WS4optabbo34U6nRplL4sTFzi6ktl//DWXj1nKtf41h/TFh71nHlVQViSx/bIYDRXl1hd0omVxrsyFCvl9n8iXPJCl5d2cNWBluWFHuWvQcKvvOBz3GlWWWrnfC5rXOYwtGuWIqtAhMdyXo2hkxqHwJaDa5prHuh2hyKQAbGnJxEfAyOLtiKlyq7Se37nuz3Wd8E5Ula6S3GLdJI/7N+bEinXbHennD2wQu84+yX+KdPfSPlHuzd3vAXf8fP8s8efAtP33YbJ37dLapnN0iHBhiSq296MJBJx2jQnoAhRUCQ+LkHLAl5Q3CM3OATM7nk9pqcliLa9wc34lOfuDQx6uQG2tsrLzNK2dDg0jGe1OzNRsheQbUNk8uOYu6ol4T5rkDydPOcxjQOWwjbZ0uOPDlP3oSmdVgjuNKDhLSOdlIgjeXsh7aoV9ZY+bpLXFpd58SHK9pJcI4RmD60h7s6wnzoBGeetkBDvVIi1tFODNWOxdSOYtYijaXZWPaCWG0ZX2vYuqNi91VTrtXLPLlznKuzZa7tLiHiMCs1xaWCYk+o193i9t6CqnXA9zC4falAwAepzadksY5ANwKkm8Z7kqg2QGbvK5rT9mOdp6MP6cpTfzNzmUD/Pqe4NRmlxpNLO3zu+m0U24Zi7ii3Cyam5htOPsF7XlNx/vhRxi/e2lI/HMDgCCHM1bM4SIGTJ0ciWERqhcyEQzkx8Gm2SOPC60+o2lpM9xdEBSO0K4uGE0/haQKKv+kJ1dJN/0fIjFtA5xyD4ipqDPa2xhRzSb4VSxdrlq1j+7YReycM83XvAOWM1zvbied07XjMkSdrxDrqlZJi2uJKAzZIDwCFQGNZfc5x6coqK8f22L5jRHtixrSqcKXjnrOXeWL3NMcecUwuzphvjGiWDbMjwt5JYf1JKObBwGnUiUQH1+4fce3hhlfcfolPvHgn2+dXwTiKtZqisLR1yeqzII1jc40Ut1CfhnS9sR6y6Xjfgk6iTPOjaUS9F79riSRbyHGa9ZkVlTnl7akig0ktfNOm7It0rIpcuIxHSVCm8cFyjo53+cDHvoajj/lxG18W/h+/9rupr40pNwuqO3dZef31/Vo1mA4FMIj1urK+5deVEXGl8w1QKL1wQY2D/pHaBT0y/cAgCAFpO9KJ921wlesAoFV+5/FZnUeSyphAfDU+t5LXFzrb7Yh06kq8gs6Wzrs8twZqk+oyrbcduMJgSx9ybXrKUsyk47b4svbOODAVa881rDyxyezMKtVWTbNShvF3zDYqRkYo5o7q6TGz8RhWHNVSTe2EYtLw1IvHWXq2AmlolktM45ivCPN1Yb7hKGovbdlxsGE4wo4IbN3lqI7MePbSBjy1wtKWMD9maQtH64TxCxVLl1rG1xqq3YqrrzTURxy0AaAbLzan04V6CBUHF/BqiI5z6LoxXYhLkGNzoAGynSrt35LKiHOm510UufUYUGa0FNT9q3T03fZ4R3SmGrjNS/BjIQIv7a35ZgfX6qNfbmmeWWLpcoO0LZt3LbN5zzK3kg4FMOQidO97lBSUu3J0MHGV962XVsIWpsvBIC4yLfapNGjBDtuaJpxRsKNAmNFgadXspwUcXg13K3QV9PpoOq6WWT6jBBH3pZvozirYSpgX0K54XwUdNRnxv7cTaJccbmRxtSEKy2L9VpYrYPPr9pgc3+TCvz3FyU9tMj21jGkdWD9mxcxhK8PkcsPpTxlm6wX1CuzMVxgB5d6IYgbVtmN0vaEdGa7dP2LnNj8YZgajTe8X0U5K5kd8sEppHdONgnJXsE8us/K8YBrH7ml/lBtg9FLJ0S9Zll+cerVjYqi2Dc1KN96m6eZ9AYj7cx0XvxLbJdLWQanPaAZ+i64wWgrN6tQ7TwQpJ5XV3TeSfo95TbjWTp+g1I56gVFof4b429XpEpyYIXaCaaGYW5wx3s5jHRtfmbJyvuTxG3Rfp0MBDF707YnVCSi03Ne79iuK9Oqh3+qSLgR7Jh/myetqktqQpIBwAEVcCP/e+klxJhCzhImxHQdbiPCTKqEzburmZkQYThTio/wWe0K5692Qm2Vol4RmVmBmJoQUV68WwvSY0CzrQxWh6gaqLaFdgu981ef4a2c+yh9dfyfPXnqAycU57VJnNCn3fKG2NFQvzZhcFNpxwfIFLxn4fXPrD2YVwtUHR2zd7VfD2lOGja/U/rdRga384o9jUu45xle8XaPc85f2FHNYOl8gbcHxLzRUOw3tpMSOHGZm2Xi8RdqC2XHnF0XtB6xec2kxCnQnCukAI417VBE091YLuj9PUc0UPyWLcxm5eS/ISiZF9gGrV6W4IP3QvStRWoh9MV46cuKvS5BwSjLSv1arixpeeuIEd97/Ei/dfRtnPl5T7ra04xHtWJCywFY+mtetpEMBDLlBphsgr+933M9/UNy7AbEGVzpsAUgIb5ZQXKNIx5EzThLK6mLy+7zxJF45BzOTdEzW1j5waqRMGSK0yME0ocRtUp1XVF0l/uKV0EZbglvxZyPacRA1g9qiiaheEr9YALNrKOZd/QDzI476dM1b1x7DYHjzxpP86htfyZlPVDQTQzm1jK432MJgWgsO7NgbI01rKeaOYq9l71RFtQOj6w0vvWlC+5ZN7KVl1h8t2fhKzfjyjL3TE0+A1u90OCNeKhFoVgz1mqMdCaMtbzx1AkuXLcvPbdMuVTRrFQ7vjDW5OMNWE5oVQ7PiPSPbifPHssMdHclfZcAorGkoqQFO0VGcJ51U4NXEUKyaYy15BgmFIC2I9WdxYp0S62s6JqPpLdF6ZERNV7ct6VTpAHbtyHkJtekOcpnGu6pXjxU8f3QD8zXbXLu8ytHH5hR7NjAkwY4EFDO5mXQogCHqS5qTpss44sm2iMBKnCYG91D+C9JK56wUL9yIRqymu0sxXdMeYw4WXX7fgEDQCKZ0iRBd4cK1byyeiyByE58nbZlaP5nOqiPWEfXTCTrnvf9KsPH+C/x3SpftyIh1KRjufF28r0FYLLbIxWdn4MxtV3nr5HmuWuHF+QbOwPaZgr0zgjSGjcd9p8s961WKUijCFqY0Dlcayj0f32Hz7jE7d7V81z2P8sjRM7z0hTuRxrFz+xLlXmehc4XQLBkml2v2bq/4k//5z/ELFx7mqf9wT7rEZbLlWHl+DzsqQKCYBbftykebWn5pxs7pJaZnLE783BRbBa7wx8yTJFY4ZNxiyrC9OyuS45cZtWn928bAXBkPosSojc/R5T3qfCGP04ZiQR3bp2NAhUNKi4jDWsHtlQu7K/HCoMQ89ME+ASeOYs+kMl3hbyJ3IaxAohsLUhvKXWHpgsAzSxT3bXH9oZZ6bcTxzzdBgvNzOSQxH5QOBzBMWspXbmKMw4ijDQH5RRxV0bI0qqmMpbGGxhqsE5wTysITUtMWtNY/mzeFj60PFIXFRGcS511vrRWsjb87jLE+kKrzgOL/kW0RWRvedYIxjnHZUhqb3m1Vm1IZ4PsS6m1bk34HsKE8gLKwlGVLUVhPZ05CO317nRXqaRmAJqgbdQcMG7dv0jqhUX0HaBtDsznij979USzwS7t38qGXXsHoukfZagumJx1XX2l8xKeZSTr88kVLMbdI0O3LPUs7MtQrwrHPGH71vjv5Gw/+NH/49H/FqV/z/gxeWnBgBFtIMpDOjgn3j86zfXzClzbuZukCLF9sGV+ZU1zZwR5ZRmqLayyuKija1qtXtT82zmrNeKlmdnkJ00IzdrjVBlNZqqplNGpYX5qyXNXUbcFuXTGrS8ZVw6hoE5OP8zGUrBOatvBbp2GOWmuYNwWtNZ5PCBhjKY1lXDVUxvp5j3Qc6ojv78xHns6MpTA28TYbaAbAOcE6sJG2rZ9HYzwdmbgrN0BXhTh2dsfsuWXKPWHvyhICTE9Ytu4oWLrsKGY2SJi/DVWJUdFyx9FrgB+ovaaidcKoaBkXTXpeFUIhllEEBGv8okRorKFuC9Ym3cTU4Vlrharw7xXGg0VlwuIWx15TMWtKv/DFUYTJ1xMYF7FRgDEumpRXt0enxvlnIo5x0WDEUduCui2oA6AY6TYny0BEpVjmtmDeFsybksvz1c6OYcHMA/FOYG1UU4ijCXW31tBaoa0M9525yB9ae4IrFj5w/QFefGmD8cgzxI3HG+oXDNOjXqdtljoR1huvDKMtX89oO0SNNlDtOi5/9Az/vfkDFHtC9eI1pF6j3hhTzCy2Mulg2vRExcoLlv/73/4Bth5oMXdMqV9YYunTOxRXt3BLY2g89xc/wF4lDM5Xa8/Muf7imOYOx+iyd4AqtwtmjeBGjnnhmE9adrYm3uHHRvuSAoDoiDay3hPVOEzhMEVLWVoPyOISeDsntG0AZnVILaVQhhiHFC6PJhWAwRTWMyAnHugbLwVIYb1DV/juGoHGIHOhmBqkhfpImyTXuDUebVQ+HH2gwbFF9gqOPCc0K0Aj/tCg+MuB2soDazFrf3tKDNO9EV/+4rlMXQDS1ecQRL6ku6tn0HU6GA21vh8NQzG+f9zJ6Iycuf3BxWhQVpCZSbYELerJANdx0hv5KI5mRBPaqm9qVu3vl5u2TI1DllrfdqEL6V74+yMufv5Ud7YgjJGZg6vgR773n2AwPFGv8/T2Mdy8wJbOE85IGF9rKaeOpfNTpqfGzFe9VNCs+MjO01MwueC3MXduk3AUW5hcgqefPMk7vuvX+Wj7Wk5/Ysbo6ox2XCy4irdjYe35liNPO577vcL2HY7iyiZuVFGfWqW8NiVdPFM4TNuCMdhRgTg4976aJ39fRfnANu1XVjsdfs/Pj2wW3kiXdiNk0S4Qx783dRFHkjoaVD3jhCK8G1XaUHSYq1iAtkFI9psJ1kZDUHGbro3ZnZxNODfRelUh8yQN82lVZDJxhBOVsHQBVl5qw+5YyfSEo9j1O1V7pwymgWq7wZYLcQwOTIcCGMRCuRUhsuu8C4eiMjdW6dxtuwK6v/EATrqaDbqFR3iOZBeY+jwBGHrxGvJLK3tNsX0qUVn1tlUEtP4z8s/penfpjt26wt/3YFdrrHGMr8Fo0+vBsyOG3dOOYkra845ENLksbL5mzoNVwRN1za9sv5JnrhzFbBeMrsdw84b5qqGcObbvWqKY+ZusTWMwNdjSW8WXLllG25bRNT+mu6fFu2nvFCwVc3jzdZ45ts6JT1esPjfzVvVg+GomwnjTUsws7dhQvDTmxKsv8OgP384DP3aNYntOuzrGTH18c6kt0rbeaFj5A17ltSnjYxV//KGP8H986Z0Ue0KzGo1zfkBTxCzTE5t7U7PfzWZxJ6p74NIVc5iwMHNSWDB8StxdijaeaA+I9FDhd7KsohFASrC2o1lT+/ryS2pTs7AlSOGNj9WOo5xaiqll43HH3pUCO3K0lXcwa0eCE6Hcmg93fJ90KIDBQeZvIK4zBnZuyN0MLwRq6ZdXeslAh0cDcsRtOjHNA3OQHEJV3ifdqb1xWSCq/a6cS83tgUC2TSm9vKF90aHHllEq8p8ny3NmBqYnCpwYf4/kstAuWeJlJjGG4GhT2Dvl+L7Xf4Ir7YwP7j3ABy7ex96lZVZfMKw+b6lX/DZnMXPMjhm27mtgbKERqivC+FIAhYuWpUsN1WbN6HrB/EhJOymZHYXlFw3vf+4+1pamHHvtLlcvnGXtKctsY8zuSUO14xhtWb8dPTI0Y2HlOWH8upa//13/iD8x+aM8+I93Ka5Pg4Ql0DrcuABjskXtvrTKl+86g6ugDX4A/uZzNa4ysPAVo+xvIy7kUwDfMafePPaBXYNFbEt47O2OXgrQDksJNER9b73vjL5NPcWjVKAQgSU5wdV+excHo82aaruhWS6YrXtpq5xapscr6jvH8PGBfu+TDgUwJLFef+7f+BRFQukhO3ke0ZOgnqU9bRPLDz+qfX+gc7sNaL9w2aoWTQfqTx91G3q/DQgYXbbeO9KCXW35/fd9hmUz55N33sVjl09y6ekjTC4J1XYABQPFroDxl9Muv/Uyf/L4R7hoSz6zfSdPv3Sc0aWCdgIX3yC4M1PKUcvaL62wdX/D3/qd/4zjxTYA55sNHpnexvnZER65fpqru0tM5xWzPQOXDVI774fwFOx9+CjXlmF615xjmw47Lrh6v2Hvzpr1L1aUe0K1azFzS7kL1a7huUsbvO5V1/gH7/wn/DdP/wB3/twlcN7PgUJwVeGlxcLbG5qNCUcfdbzn+Nd4go0bC/GG7DiVUfKyuWSHWqxDakWc0siE0tpXIJOeufx7oqv+PLtgK44/KrUgSRuO7KRvnMe0TTmQR99uVdQ5LcncUu7VVFdhdKVCWm/Mffp3LVHfOYMf56bToQAGcQr9w/ahFxFd3I3suL9KmQdhLKuV7MRa8mcQf5xX4iUn8bo1FCD1Fm+6RgwykDqAaQwnBSb75U39jETcdqrF2qltvvfIJzlTwGuXnuHXN+7kgxv38YXHb6e8UiViiR6YO7db/tS9H+JkMeZXZ0d5avsY9vKI1QvC9Vc2vP0Nj/CW9SfYtWP+j89+G/fd/yJvm1yiEkMlBWZ8ld+zco2Za6jPtljnaHHsOseVtuJ8u84PffwPsf5LwvLFgmqr8WpCPUXmlvmGwyw3YCrma8LObSXjq47li43njOLYsY5vXtrl4e96lPOfvZflZzZxI0+OzgRX78rgSqGYBTvICyXNqkuAGectjl3mK0C+aNLAq+3DDLz7kkS22rtHQz93jCSvN23BoySZAGjRTpDc7HXZCviyLXFNH9H3wUExs5i6ReoWmTfIdI7MKhDBjUrmpytWVmfcSrohMIjIPwZ+N3DBOfdwePaXgR8AYiS5v+Cce3f47c8DfxxvH/2vnHP/8WYaovVvgS46Us+9dWGuexcMxOu5skUb9qL9Xr8vy1XeizEFxlConoXoi+UMcfkIGhGb+uBiyewYWuRN/e6NQeqjgAkG0/uOXeJMAetmQiUNR4pd3nT0ab68ehIuVtjSO7q4whsdb3v1S/y+1ceoXcEvXH01z17bYHylwNQOWW559erzvGHpKZ6tjzO9f8Y3n3yMZ1vD1BXs2jGng+SwZiznytWsy2eLllezx2hcM3puh62vP8PuqZLJ1RY7N1RtzelPWOrlCeXMcu0+Lz0UmwXFrxXYUlhZnnHdVmzVLZvzCe2SwZWGduzFX1cKtjDJTgGwd9xQr7p0+MgGA+xwcNSBqVKGyeRBaIJorkFjaJoVqC8YH7UEqUlRqRWZJBtopNjtHQnX7wcGaYPK5COiqwA2rlsvsw2h2quYXHRgvc8JZYEblbTLI4qtGcVmwe40n8cbpZuRGH4M+DvAT/Se/03n3F/XD0TkIeB7ga8BbgPeIyIPOOcG7qHuJa0LErjfgLFOL8AoWmVGniJIBnUnUkI3Kd6rrIuWoycvlUu3OKPY1xdDtdoDPXCIycaDLd2OiO6LH7O8DBzeCxK/yNuJ497VSyybikIME6k5U11no9ilLC1s+2PKMY5Bs+L4oXvex4lihQvtDi/trbN9aYWVPbj6+obf/5pf412rX6B2hs/vneOecxd5/fJT7NqKFmHD7LFiLBVwqlimdZaZayhEMHiJYuZqHjh5kee/6RVcebVj6a4tLm2NOXfmKk9c3ODo+w0bX5mxd3LE8nmHHZWsPg1iHVt3CEvG8jObr+fifI3nfu5uTl/cwy5V2FFBMWuTBd20jqaCnbNjds8Idmwx2xLc010mHeiDZ1oN1bQBpDMmfpKVtClkunyWlGqSrf0M1SV/5ro2JdoyXgaO15nsB2hRgjBK18kM16ovsw2hWS5ZXjGMti3FdEy13VBsTTGNH5yjnxdmR3+LdyWccx8QkbtvsrzvBn7KOTcDnhSRx4E3Ax89sI5kV/ALWxpv9dYimh7I4ShN3aJzEnqmLMRJTSkcdpQYR77glQ5nLJi5dCBS5OqEsi6lr5k4KR3R2uDdpqWBITE1AksRDMiuAHv/Lt979OOMZUTrLBNp2DC7XHarrC9PuXxkzY+ZFYo5NA/v8HWT54FV/t32/XzumdsYXShp37jF//Kaf8+7lp/n6abgY3uvYLOZ8IZjz7Jjx5wstjDAiaLmbLHMnpvzYrvLr81O8cj0dh7fPcVGtcvb1r7E/dUl/thtH+RTP/wclbR8Zfckn790FiOO/+YN7+EfrH4j563BuRnyySOc/mTD8jNb2KWK6dEVpvOKf/3ka2k+eZTjT7bsnh1T7nqHKmakhWBqC8sFuyeNd4VuPWjaMJB6ESbXdn1MP81V98VWMb9n6YLLxX3F6TPdvl9mmrgOEPrGx6gaRklQq7V21Jt8TeMOtSaCKqHoOD5vR8LsuKVda5kdK1l+saTadkyuGeToiNH1mqKxbDy2R7v8ny4eww+JyB8BfhX4b51zV4HbgY+pPM+FZwtJRH4Q+EGAcuNo5tIcT0xGbp0ZePTgsAi6nWUi/KZBRO0bp0krFCcIz5LLNYTZ1uJKL0Vw0QYvBXSZ1fwmkgNvVAtqyF2nrnBXWQOekipldj+2tMu1KTRLQjtyzDcc/8VDn+CEGXHd7vGprbuwOxVHX3+R/+a+X+L28ipfrCc83xyldiXHqx3um5znTHmd2hWsmTkrYth2Mz40PcrfffZbeOSRcyw/V7J0wRscf+G2r2fnvjmnb7vGa088z9euPc07Tn2BC8fX+MTOvZwpr/OmM8/yF87+Bz42vYu/uPl7sG+cAQXtIyusPgd7z6/ixpa1Pdg7Ydg7ISy/JBz90tx7TgYQteOC3RMl0xNxQYdtUj35UUzXY3jAWHdnKNzgnCyAf6pL/aB3L4yiNfVO+u46ibG/65G9oqTTzK7VyxgNky7Qrt9ZE9qJo171MTfnqyb4dZRIa/3BtvImCTCk3ygw/H3gr4Ru/BXgfwX+2K0U4Jz7UeBHAcbn7nBOyK5cT0dTE1eQzkA3hNypXPKFqcXKeM4iGHxcEbYFA/dPp9vo/aZVF+gmqNeOaMxSTegOUsVnB7UdvITixBO/wMnJNkfMBACLY+oKdtyI2hXcsXKVp2Z3M576vjZ3T/mu9c8wlhEf2lvh2Z2jFGs1f/juj1Pg+GvPfjsPrr3E161+hdcuPQ3AcbPHRFoMMHWGqbM824z5y49+F/P3nODMBctos2HrXMF8XZhcdqw/VVIvn+TDp07xi/d9Df/z2/4t3778LKeKLdbMnMmJX+VcOeaFeoPvfPVn+ZEzH2bb1bzv1ef4F+ffwu6Fk8yfW0FcFIUd23cIziyx8fgsBJIR9k6MggoRwCLEK9BOa2kOwjz3dyIWxjjORx+se/OSzXXwjRjabh4EfQUo/tRsXrgkQo7ZtN6TN7YviejymxXnAWDuwwPMN/yt4lioWkc7NrRLJe3E0I7+Ezg4OedeSm0U+YfAvw9fnwfuUFnPhWcHpjRQUWQKl7TmxjwFFAostPiVyoqfoz5JtzAliJtZUBclimZcIup10VYQj3lDIpjo65ARQ2y3Ki9TNfYDbxOIPbRldtzy4OpLSdecuZqpm7Bjx2zaJV6xdIlfvKtm+ckKW8FbXvEUD1ZFAJCKkWlZX9vlib2TfHh6H5975E4+v3wbVx5Y4Q+f/AhfP5mxax3x9jKLpQZ+7NLbmL/3BEe/VFOvGuxI2P2Wbf7q636GZ+tj/K0PvpOTHytYed6xdKHib539Fr71NT/G68eWkjH3VVts2Tn3j1/iu9c+y7JZYZkR37N6iXe84l/z3J0l/+r+N/LuZx5i68mjVNue412/H+rVCac+tYeZteycKZgfdWou8zF0xnVb1xqpD2COC7q6XovKz6DP0bXhuG9E1qCfmIumXcOwEbqnpmQAoWhb6CSTuIVurAfU0ab3UnWVo1mxtJPCH80PjK5ZKmjH8p9GYhCRs865F8PX3wt8Pnz+WeBfiMjfwBsf7wc+caPyolikvcL8D8N5u/HrBdKMfgcDUoWgJq3w3JfwzI4dbYU/+da3cvfalAye1p9TSEalONH08roBQjkgxWPVWODkjDeuPEERnC+WZMSIljPldY4X23y8vo/b7rzMtSfPMN+w/OCZX+G6nfOZ2Qaf37uD0rSMypZffv5+dvbGMG7Z2NihNC3X7DKtm7LlLLWDuTOMxPJEvc4Hnr2X5SuOrTvLAH7Ct937CL975TJwmb+z/nbG18fUK8J403Hh10/w1EMjvnZU8MFpyS9uvo5n9o5RmZZXnPml1DeDcNQscWJs+JqTn+FPHfsoP/mK1/CzL7yGp588yfh8hWmgWSmZHhuze5vartaArLaarXFdVKeekDmUslgKShURC9RKClHgk97tmpDmG9cdok2eq0C6czIDoQBevWcLtosB9SF9dV0x46vC7h0tDzz0HF9+9jRut6Re9UzPjoL3adETYW8y3cx25U8CbwdOiMhzwP8EvF1EXoev8ingTwA4574gIv8S+CL+BPifupkdCYFe3P4eQGixjd5vveQgu4wk+62H+qmc6IbsCLqZZGqEC9IBOsybVf7rykCU3GFVg24SE4gRl6T126rz3ZJ/9MLb+IWlTc5P13jH8Uc4WW5xrV3m9uoqJ6ot3nrqSX5x9wzlqT3eON7l47N1fmnzYT537Taeu7ZB2xqm2yOoDcVKw9KoprEFc1fwYjvnfLvM881RJlLzuvEFJlKzc3mZ45dbmiUPlFt3Fvzik69kbkuuzZcYPbKMWB/FqZh79+uL7Rrv3Wv50z/9X7L6dIi4ZOA/O/dq/rv/7N/w+9eeZFlGVFJQu5ZKCs6Wq/zw0cd51+oX+IfH38Z7nn6QrWnFzjda3FMrjK57n/9kD4jGwSHHsSHdbmiMM4kzf1ZMuzsgu50Af8AsRptKdASdehP9JqJPgvgf485Jeq9/PaL+LYizi059kmXyhnV/HgKB73nrJ/iB4x/i+2d/hPPPHKNet5i6wJS+7bbyB+BuigBVupldie8bePyPDsj/V4G/eiuNkDYEMS1U+7MBIS1cn/8m4G9oIPQKDZwHF52rOp8JG9QDF9+Bzj216Fa6aSQZiIb207PtLa2b7jdJrlNXpics1dqcL108xRfbM8wuLfH0ncf41tsf5dGt07z2yPO8fvkpro+WmG/AeFLz/7n8tfzTT38d4yfHTO+YM1qbM98aYTZLiplQt0J10nLv8kWOF9s8364ytRUFjhUzo3Uw9+IU7dgHTCn3LGvPttQ/u8YnqtdjK1iuHbsni9Bnx87tljvKa/zfHv1D3PmLU+brVTiJKZSPOf7Xf/77+Pl3Psb/cMfP8/DIJmCoA8+4qxT+9In38+1Hfp3jxQ4niznfOfkBmo8f9VJevB7O0XknRkNyK0pSkIxOFsdXkDqokcpY7EOk+Z2CZHiOZRq6HSmj/sbpdCjjIskvZuHMTXxXMZZURwSFQGOpPy7+R1K3va+KZxw7r9vjh098kAK4Y+0aL403vEox9bFBbSmUld+tKma3hgyHwvPRlh6t25HDjUmOQQtiGCwg7UJy+3ymp+MN5PFOJTGz+ivd5El0vAoqhemVkazL4T1LrzxH3yerZ8H2oPA73vJ53nrkcbbshKemJ7jzoSu8VK/z0Uv38NRjp/nymVM8cvoM2/WYZtlRfniDn/vFb+KOZ1tG1/d46c1LTN80D0FihHJXqE/bdIx96iouNutsFLtU0jCRmhUj1E3Biduv8+LbjoXYk0XiitIKxx6xOIHdUz54izNCdW6HY6bhhSdOcNeyY+t2f9px815ozs1Y/+SEZ/7pffzBb/oT/MQ3/CMeHjXUrvU2DdfyQtuyLPDNS7v8+ObdnCmvce+xSzxWH/XDYqTj2EFy6MR91+nmcXKHrP/JCABOHIbOCS4uynQ5selF25L4XM1vfKy+2JIF9SFTP7IP4bl1+9O2ApL4rhPPyLbua/jpb/xRThdLXGr3ODHewTkYr86Y7xYUu8aHSxQfrLfa4pbSoQCGaqlGGijwRkcHiUMMpoOAQfb5TDxeq35zJH97+r8xIJ26RW+1pLr0mrawZXZAm2PWYuapbuXOTd517HNMpOZec4E7qit8y9J5Pjg9wb/82Js58kjJzvY6XxnVTOsSVzhWX3CsvDBHnMPULccerblUrVLfW2NqGF+G+UbJ3u0VhVgKHMeKbdbNlEpaChwf3DvLmfIaf/WV/5aP3nE/F+drPLZ5kpVqxm1Lm1yZL/PZ6atYe8Yyvu6jSM3XhDeee9b3Y6WhWa6wlZf+6hM1/+Ct/5SfuO8b+PV/8xDrH1viL539Pfz0gz+JFYvBMHVzJuJYEcPn544fec938vBrnubs0nUeWYVyB5peRPDMBgCLjCI6u5l8QWt93TqXGYQ7FaKLv7igtqj5SvNsPNAkiVKpq7Ep4ujOXbgFsuy1Pa8oqdZBtfEBguH7vu5jfO2oYOYartiC06NNqknDbGcEyy12LhTB3lGv+C3tW0m3tofxVUqnxltMT9tOjLpBH+L2zeA//Xs4LmvD1mOMxRDP1i8WnP9L+8XRVS3ogCnsXLIxdHVFZyhNHEmX7XetX1+I4Xd8ZReAT+zcy44bcbzY5n17Z/jY9n2MrhSMr/l2HFvaZX1pGoKrOpqVgmZSUK9WmNpx8tNzZOQPFVS7juq64fL2Mrt2xMlii7uraxwxMybSUomldgXnmw0+vPMAP/G5t/CL73kDX/7ybZxZ2uKdG59jrZp66a72xtpmyetKK+WMiQjf/7qP8eI3+kCwyxctK1+p+PDOA/yNO36e0Tdfotx1PPurt/Nrsw1KCiopsMDZYolKDH/r/DsotwzfcOwr3Ld8gWbZs8oU/zCcH1kAXXHZvxgqL46xxDsi6+iJOkBiaV6DQ1sZ59JlwLJAL5DNcxQwunBxvW1O/R6dJKoJxCk6SqpJ6L8zsPbmi/zJ4x9h5hpeaud8cPc+du2ItdU9cIKpWtzxOfVGy3zD0qw6ZicOMMwNpEMhMRwxNfe+8TE++94HkRrciBuCw2BSHCFt9STuIsk3Qm8JZltgqO8xaUNDX6LQJ0AXOERubU7dGcKk8MyO/A5JYSwv1EexTrjWrlAVLRebNX7hmYdYewqWLjeMr1Q8e3WDY6u7lLveAn3llRXlruPEZ3ZpVkrK2lK8OMGW3kFo9TnHpTMrTF9RUbuC00XLzFkut3CmgMnkWf78s9/N537xQe76yIzR5U2uv2qN9156Pb9w5tWYrYKzj7Y+wCs+QMjmHSVnxps8Xk947fIz/Ol3/gd+/BVfx+XPHOPkZ1r+3Y99Mx/73fewtTNhaV1YOg///trr+Oalj2CdY1UqKil4sd3jI0/cy8Pf8AR/5tgXec/eGrZ0lFOh3RHasfO2hjjPdOsp+9yX8vop7vj0uHvaZRBwQXZPDmt6AuMajiQRVEtnXHd7nQQyspDuveqrCEEC0NubmZ0i5El2ryq05/Y9/uarfpqzxTJfafb44O59PDM7zgfO38uVl9ZB4MiRXc4duc5qOWPalnzx/BnqHe1qeeN0KIAB4E+cfT8/cOI+RpdNEpv2TQeoGNpNFvIFKY1SEN3B77keFqTfhORElYygaVJdJ47avLzBdmvgCJ/NTKjbggvzdS7XK9xeXuVCu8Zz82PszSqOTGHy4i5n98Y8N1nnhXtGbDzj7TTbd1ooHNX2MisvzrGlYeNLMD8itBVMdiwbXyy58rUrPDyqWZIxMGMkLctmzNTNmLYV9RHLU7+3RI6McO0cro0wOz6s2tadhqWLltG2w1bCtTfNeNXkBT62dy/Xm2XuGV/ghx98H9P7K/7fd7+L0/9RuPQv72DNeSC1I+HDL97DlVO/zNlyFYPQOsvn5ic4eWyTP3fHuykpOFNsYtdaXIjLYFqhDTtFQ1LDjb4vJNfT+9NEJD6CcwPPe3PnlJGpT7NJchgAhfS7YijZe5o2Ghht+2jgv/dVn+H1o4ZN2/Do/CSf2z3H41snuXxtFZkWlMenvP7U87zr2Oe4s7zCjhvx0Y37+eULD/z2u9S2cY7bii2O33WV69eP+wCktwZwXeotvgzxtX6nMGKBCHrvJ12UXhnKt95zkEXucDOCjyaEyBXrYH5/vjnKRzfv45HrpxmPGjZfISxdWWbywi4nP1OxdXnC5IpldkQoT+9QFI75kTWOPjJjdnzC2vM1u3VJM/Yt2XhsziNXT1OdK7hq95g6x9wZnmtmtAh/4Y6f58Jta9xeXmPDzPlKfZT3b72K56YbXJmtMGtLLm2vsDv1E/TDD38AI5Z//uSbufTMBmZmGJ3b4ffe9+v87W/4F/x/z30rL/7iHVRb/n6JYuYHsBIJDlsNqzLmYrPOm04+w7FiSsOIDTNn9cQO7XjDO+qM3ODcDklig9uZB6WeSpDNd3jg+vmlW9ipvr5UYZUE4xZ/1ymBRFR9Ysy5KEVU0Jys+cPHPkqN419sPcgzs+M8ev00T148TnNlgtkzrK3u8a1Hv8Dbl17gVLHCdbvNHeWneGDyIu+/iaGI6VAAQ4uwZiy//65P878/8zuYnC/9keii82zb9+RbTH2RjwH9jUURH8jcqBd2MuKzvqoRRU16xBmf9w56DRKodKIiBNWk9LdJX5qvstdWvOfqQzx69RSzumR1MuPSQ9tcmq5ydnvEyrM7jK+OqNdKdk+V2LZApPWqw7ik3G0xdctK65gdLamXDK4QVqo5rXNcsR6AamfYdSUFjpPFHreVe0ydsONKNopdvuPIZ9haW+Jyu0rrhOPlNgWOTTvhzvIKLcKrjp/nI48e47YPWsx8wk99x9fz9m97hH9y/0/y7Vs/gP3lo5htmK8KX3/6GdbMiKebOcvimBQtlfh/T9THgCucNIa33v4k7z/yumRwM8HGkM2z4r7aB0arlJlTnKWLimTyMugvYHqf46M+R9fqAJ2akak1/Xdc3kY//119MYy9M357cnqm4W0PfZk1afiFnTv4+PV7eGrzOJe3l5nvjCim3vvxxPIut1VXaQOnW5Ux12WXU8WtbUscCmAw+M2B7zvyad7z4Ct59uIdwdDSk6+Cg8eCDSibyB4Q9EU0o3Y9dAHhPa0e4BRoaOIKImLmcHWA7aBrwOLzvk5sauHScxt8dHfMK09fYN4WNG3B+mRGVbQcWd3j4l0Ttp8Zs/a0xcxbqi2QtqTdK2DJR3uer1dMzu8idcto2tCOV5ivGnZOl9wbgrBcsyMmYaXVrmCHgufrI9SuZGorTNi9aBGsM1TSsGZ8bMaJ1EyKmqmrOFns8F+e/gCr3zznF9ZezcmPlKw+KfzrK29kcuKjVEWLbPvtvN3bHa9bfQaDYSKONVPQOsebJs/w+PQ0H9p+gEerLf7z9S/wqpUXeV/1OkKVHdhqCUuNXwJqK9kZmTT8vdgeaNc7LdbHskz3eQEf9HZm/NNA0fgHtuzuOumHBkguzyyigxNva9KkYho4c89lfv+JX+XdO6/iZ198LZd2l9nenTC/NobWh/iT1SbYo9a5u9zmut1jWUZMRKj09WU3kQ4FMDigEGGC8MfPfYg/f8f3MH525HcQ+hF2jOsuBI1p0Mq3+NN+CzUakBbyKFDwji2B8lp1LXo8mqt95JUkMOgzcQOpp7xeMBuNKc+2TIqGcdlgnfDCtXX2tiYwsmzeXbL8UpkCn66eb5k/McIVsP6UZXJpitnaZeeVJ9k7XjA9IbQjsGMoTcuzre9AhaUWQ0XLZjthakfs2BG7dkwd9BoPEL5DLYaZrThWbnOs2GYkLZftEiNa/sjxD/MH3/EJ/s5D38IX3vsAv/ze1/G+ux5k/NllllvH3inhxNee54HReV5q91gW4YhZonYtn5ud4Mc//fWwU/K6Vz/Bd65+njuqK7TLltH1ItfXlU1IG+7ixkQ/LKB/t7P7JP+DPqcW79ymj8wLpN0AfVo2nodJ8+68w5tJMVfFl5XmPBdlNVBE92lN69Ez19Qw37B8/10fY91M+ez2Ob5y/qRnAo2huuIdzeYnWtbW99icTfjI1n3cXV3iSuu4p/INekW5uw/RDadDsV1Z4GidYywl37N6iVfceYFiBmZG8mOXJkZ2VggrrrsNKP6LE24l/ZN2n3+NpHLTv1hcKD4592ipQPLP/iQmuWi63+6QIuosSSettBPH+rEdwN9kfGlzhecvbLD3wirmUoXslLRLjvmRkurqHq4QVr+yyclfrznyuKXas+zetsT115/ihW8quPQGx87r9qiPOOoVx688dR//cftrWJGGXVeyaysAVsyMiZmza8cBGAquNCvUruBkucUdo8ucKa9zW3WVNTNl6irmrmDLTthxIy7bFV5RbfIXz/08t33jc1SbwsrHljn6Za/ezNcd33HbF5i7gp/ZfhW/NtsAYNfNefeV17D05THFtuGh9fOsGeFkuemD27hhXb1vzY8P850p6c4/9EFaSRqxHNMKxdT/i8Fv+vOU7ArKU1EcPtbHeDHmw5AldMg4Gmm9mHqA8XeY+jAELYafu/Y6nto6TjstMNslZurDw4+uCcWOoW4KtqZjPnP1HJ+bneOZ5ijXbctxs0Q9QHIHpUMhMdRhRRUiWCzfdPJxfqo6h2nFH3YaFNOlO70Sk7YfqL8Lc9DLkwXoGLIHaKJK0kOuJ2bbS9FoZLsmxndSmxQxphS8+EzjL4357HO301yeMLpcMJlBtQ3VlqOcOoq5pdzzwT7Hz13HLY1wIuyeMuyeFZqTNavHdjm9NOXK9jLzeUm5LYyvwrX1Cd9/5LNMnWOn9SRwzS6xY8e8UB/lpfoItSs4Uu5SBVVjx46SQRS86jF1FRgonKOWkg2zy1PNKiNa/pd7/zV/Y+ldfOa9D7LyIkyuWnbOFTw4eZF1M+Vqs8LKZMa2nfNkbbg4W2XvlVO+99W/yp878UlWzQqP1RbGLaYtfUg3R7r1Om0J9khCcOk0o3ZIS9cQdKTik4riFeNImqCvRtf4zI7RPyWpthb98LjsWPiNUjb/1r9TzCKohH42wq9t3sVXNk/w/KUNzFZJteklQCAFHtq7vMR8rWZ3OuLdk1fzruNf4JOu5JPAxCwD52/YnpgOBTA44KItqWTOiWKFb159lH+29M1U2+IHC7rFFg+piNL/I2dQnFr6FQx8z4xIvYWaOExkGlpkDYemnCpPwl//O6kRmT1j4GCYlh6ig42phZ2Ly5TXS1YuCaNrPkjKeNMyuTCj2Kkxs5r5qVWuPbhKvbLG9LgwO+ZwZ/c4fnQbI45ZXXLx+ir1hSWqTcPoOpS7jmO3XWfuHK2DUTgqes0us2WXmLqKy/UKO80YJnB2dI01swd4NUKnidThuVAAO27ECnOWiyl3lY7/8faf57/9xiWe27mLtWcs83XLHdVlrrSrnJ8d4eLSOk83F3l0fpat+ZjV9T0q02JCPQ9We7z9VV/mI88/zPiK0Czlc+MM2VWC2qlN0oR4ScwDiqjzDj3HJUf6rS1dMlLquUqAHukn1JdLLCzSWyzGqd/7snpiFn5LNzplgTc+fvbSbVzfWsI9v8T4moSzEM5HGYuOgeHKRYBnNo/yuaVzrBYzCrEB4D/PzaZDAQyXm1V+dvN1fM/6r3HEtLx2tEu7aqm2iwQAAh2XyPQ2/yU5NA1VoLl5TGrhZ2fle1td0djpOYV0uqXrql9wpop1xnrSbx0a9FTO7BUzEyYvVhRTKPagnMLkSutDnYnQrlRQGrZvH/HSN7WcvuMqJyd7XJ9N2NydcG1zmfq6F8vLHcPKFoyvO8o9y8Wvhb/5yn9PAVx3BXMMBQ6DtyNMpGa9nGLEMTE1BZZC/F2JtSt8PnFeehAwWNbNFPBAsWamVFh2rWXNwJ++87389Xe8i/PX1nnFsWucNDOutcvUzvDs/DiPzU7z65s+hIdzwueu38aLGx/nXjPiRLHCf3/mP/Kdr7iX8kPL4ILKFsct3nCe9H+XifbpsFNURx2JscQbvrTdIDmnxSlMJyVz2tD2jiEVUxtDs6TzRymmF4ougZYEWjNQTOHSC0eQvYLJNWF8HaJNQ1qYH4F2teXM7VfZmY2YTisuPHmcd28u8857v8RGtcuTu8e5lXQogGFrNuFXr95F7QpeNXmB37XyAqfvvcT186dDgBR/HTx4q70QUdolScEZp047LtaRSROaS0diCC7OaZHHiY/vxxe0HaHoPu9HBFlwl/C+VeJpVnbsX7BrtGNvfGpHhAtmHdJYXBm2HV+swRUsVTUvbK6zszXBblWMrhSsXhOqHUe8jQgHV18p/Ol3/gLfsnSFXSesmZa6New4b2OYmJo1ppwdXaN2RVIjogrRhiAI8aInf0FsydRV6SBW7QqstMngf391mb9237/iifkpb8QUWDdTCnF8cvMuHrl8hkvn16lW55Sl5fp8ia1g85i5mrvKkj/5mg/wo4+/i/GVyCm7Rdq/kIV2cX4R5++oiPPdNwy7Tr/Hib+iMNh8opoZ43YigUlAHkEKstgN6bt2dov1p3aRCHDIzdufKvV2sNGFEjMXqm0o9lyye7kixiARLl1dw704Yeklw0hgfn2FDy/dw7ec+zInR9vcSjoUwFAWLX/47Ec53xxhYmqsc/zX976Hv27fycUXNhi9VFJtmeDb4EUsF2IAJnRuZAgPuiTdwtdXiEX3aLE+eIvrL/YBLp+JjrHsCEgaSQSc8oZ0vcNAGTcSRdBBRy53/dmJNjgnmdr6yL9zL2OOLsxZfuYYTy8dp3xxzOp5odxzmDmYxiHOX1VWzBw7Z4V3fdsn+f71L7JlfaSmqaJGf6TJBq6/R+1KWvylu3NXUmBpMdS28Bf/hu/Q0DpDJbBpfQg6IxZjHXWQRs4UM7bKTXbsmGebZQCe2TnKo8+fwV71e/B1K9i1mnHRcKyo045IJQXvWP0if+++b2L88eVk6I3nVFKgXW1T0EOsOXH8Hhc63XtxEQPJCCytt2mYBrDSnV1QKZ2ZEU9L/QjV+xo9Fb0MeW1muxaFlw7KKYyvOYp5CKO/A/MVKFaFyfkS83TJ2jOWaq/l0msK2olj6/ENPrt6O1+z8SK3kg4FMDRtwS9ffxWPbZ7ksUdux1WWn/zW/513v+bH+Lvn3sRP/Zu3+yjB1gcFmR53+T60IQWQ1aKgTnGLSW8/OwdiHWbPn28v4+SLmnCjvvcP0+iKemCRjNHpdqOQOe5w6PcjIQRx15b+WPDKk5Zqz9GM/aUrpm6D5TyImvOa9acse2crquvC+KrDNJ5oYiAZt+QNbcVbrvLfnfplWoRd5yM22dDgaDsYSYtVym+84durE2HLckBXa8PDCC61K9gCdu2YFmHLztmxY56Yn+K82WBmK770sbtZfV5olv1Cb2oPDk+Pj/L+s3fzNeMXeHjkvSPft/NK7NUx7ZK3+LcjlyS3zPhrQ6yFfb3g6O6jjAtzwdkhj9eA81Kbife1mA6YXBHoyaj51kmrK9CFGhySahfAQz1QVu6i9sZnU3tbRLUHxbN+bZRTR7XTsneiZOMtL/HSxSOsf2LCV0a3cf0Vk33HZCgdCmAQcbz/2fuo64K1rxQUe4b3ff1DfN2JL/Ha5Wf4iSOWOx4+z/1HLvIr730NJsaExI+XqYFShhFBL1aF3on7F3iCanORDzzYpC2xuDVF935GBy7/K1G/je9rG8iA2gFRpXGJq4iFpfNTzKwJBOULciKIc7hRxWjLsvaVktGm5yS2ElrlQScNbN8Df+aBD3C28Na7LbvHlvMHqVoMU+u3HQuxzF2RgUNMprf/WoTFVxCcoJxhYmYUOArVwdqVbDrDmfI6j0xvZ7cd8++efQ0nP+0wrWXnVOFFZiPYkWH3yjJ/74m3Mypafuie93FvdZG/99lv5sQnDbtnUmOy3YI0HwYcBwRqifMR/iYdP4JAdDKKXoeAGKEuQJboxHfFBPKj1j2VQNTVA4T3nfMMqVUqRA8UNLhJ3HYPYFLtWMzct8/ModxpvZoU+rx3ouTafYZ3nXqaX5nfRzuesPRiwSWOHTAoi+lQAMNdy5f5hnNPMDYN6w9O+cy1cxwJDhlniutU53b4A+c+xZ/aeJY/864ZP/9Lb8LMOo4OdNfJ9QG5J8rp7cy06CtvwzBtCOnmolhIVlinh+KvD4uLL5SXbZXGeo363hctewQcid2EK9NnG8LkSkVZmLAYhGKvQcThrIWyZHR1ztEve0BAwM2EYs/iSmH3RMHWPZ7D/d0vfTNvet2P8WDl9fwr7SqbdsJEakbBltA6w0haammZB1UC+P+39+bRvmR1Ye/nu6vqN5353Pnevj130wP0RDMjKBIMHSMkUWM0IfhcIc/ge+rT5JHEFbNWhpf4osbEpysY5MFTQI2iqKAoIINAAw236W66m567b/ed+p57xt9UVXu/P/ZQu+r3O3cgLX1Y6+616vx+p35Vu3bt/d3feUBhKF3wSoIOXnSZFCQYMilCH7610LTUgHVjOYgZKfj06at54On99O7qsryeM9yVkIwM6bqh7KhgQzx5cgFj4Mjey/iz8QuZ/3iP+SdG9Pd17Jw7uT/2awjKw2nUuDnHkZ7IAKSOeyw9cnZrpAFfWNnU8zTE/QXF53QiH52MiUVz8acNtu7pa6Nkhe6xASZRmJayHriJrfM5WrJIYeHlJ2mrgnGRQMuOr/1sMuUB27cdgRjWyh63zj7Ja3sPsT+BB+eP0FM5ubFuuYeW1ziZz9PXY35m7yf50MGbyB7sUMxE1MHJmYFtix9gpnyXapN64CijtG2xhhsq9l85l9fSUZW4v4joVC0itLHlIyCIpkysrceccpuk7CgQoejZF2sbUKMSMYJOVehT5YZ0UDrRqGC4r0t/v5DPapbuE2Y+O8v3fe+P8rHv+CXmlLA/WaenRszLiOUkZ2iEvk4Zo1gte3SkGzgKa5GwSkaNUKJIjCaXhI7kQfHozZdKNEoMGZp5RmyR8fGt67jvkUMsfyGje7qk6KmaDK9G9lMPFUYZFndv8mh/N184cg0Hz2jGC2lIlCuJBC/UsOYxJzBF3AnzWzpxQioOoPqRCon7ZiodVIzgA8cRsZAqcBOm0hN4nwaPuGKi0WyBcFis4jlIq78Syq5h9aqEdNChdcZGz5YtRdlVDHYptg4KoytGdNKCO09dzuDoHB2fy+LC0jHsDMSwenqW/3r/t/P3XvYwI6O5qVWSSMIZPWRDz5OXCR879gLeungnl6Y9fvCmL/I7T76abEMoZqz21mPiqVmm/UJ4oFHR2kuE3SPs7JODNCdVO3lAZxX1MG7hg8gwrUUUZJoTlj8fsg6lhrJjqVT79JB0kGJErMlSiROLbFrwrf2pVToWNtVasavFYJfN+7fwkNA9o8k2Cw7/bsp3df4JP33zn3Nj+yiPj3fzwOAg60WX3Cgy0cykI67vPsPl2bMoscrIFpoxKiCK3CRsOe9IOyeKEgmxFQkWKXREM6M0cybn/v4BKC0F7O+xBVE6Z7RNa+7k+GRkkV2ZGYbjjDvvv5LF+xKSUcHW/iQkmNWOCsbBUttxYc0mxj5HFfaZQX+UuviGaPNWTlER5Z6CjGoWL7GcXU0U8JvdZwuLkc+0cXulo0MIHj5NAqMlw8p1GdmGRZRFVxgvQD5rKHslJlccPbWEXmkxc1RRzLguzzEvzbYjEEMyhsFmm560yM2QvsnpkTE2hv3JJq/e+whHVi/hz/rX8sPzT/HDS5/jA1fczvyfd9i6RMhd+bJAtbU/qgk2iakjhQigtJM1axs3ll9jkcKZkMJ5f41/LjQWuf6uzb79GMKlDhHpFAZ7DFKklO0e3WfHqHGJGhWUvRaFKzmmcsNwt5DPQv9Mi86zhs5qyezRgtZ6gs6sEnK0lNFZGXPwPW1++fo3M16A1hp0TxnSkQkxF8MFxYcuEUa7SlBw2QuO86KlZwCYT4dc2j7N5dkpLk3PkIlmaBJWdZcN3aU0ytazkJJMCq5M19itWmg0D63vsfUvWtYMC9DaEKdM06QDIRlYV+StBYOIoftYi8VHc4quRSTplgEtDHcb2leuY44sMFrStshKzIE1oyaj7z4DdxAbQrakSd1EnGg25kxj60QwSTaXVEc6BHCiSPR/LGJGcLedt6QYkLEtRDRaNOjU5nHUmR1LMhJEK9SZhPaZjJnjmrxrGCQSsplfSNsRiMEoMIUiNyU9ycixiUI7IiSq5G8sHOGWmSe4f3CIH3v6Mt6+9xO84dr7+Yv7bwPcpLkYduVKg8fsnihH1bU77f6PTUa2Izee6HtV0ITwrJoPgg8FDsqsqF8a38/RgkXFCKItJzRehPUsYbjcYfZowcyDa+hWSmutJJ+3YXhqDKNLclo3bXHmgUV6T6fMPuMzLQk6E1RpGM9lmBT239knXdlCBiNMmmBmu5hEUIOc+dKSPpOlkCp0a54H0kXyuYzRUsrmIUU+C6MrRlx68DSL7QG3Lj7Fa2cfYMu0uDxbAWBGCjKx5kZI+J79X+Wd5WHSLeMyULtM1IJNxoI1zaoc0jMp49mUtG1swZtEULlVuqoW6D1jvvfqI/zGk99Ga00F06Ofb+1T65lqveKNXXZMDdnXgugkCtzDBIQfA4eYGA7s+eD3EiGb6XZI94x4XCb6fRo34b57Dqa1Liw+YnU6RcfODUDRVXRWCpJhyWBPxubhKTUrzrPtCMSAgPQTVvSYA0kPbSrefU6l3NoqeGHrOB9bvYGPffpmnrptiTfuvY+/uGWd8v450k2pAqCcEjJ2fLFERIIDildS1fIw+AupgKjmWxB9eq5A5dZd1Ze7K9tnz+93/vPhnLW0BdJ81rKMUqSI2UO6VaAToWwpK1oAlMLG6RnaV24ye8sWw9/dR2dFk+TGFlIp7cDLlmK8mJHPLtjhOcWVUR7Jeb8Lm+w128xJtsYkW2M6xwyLd5eYLEH3WowX9/DsrOIPF6/kN696Le3r1njTFffwvQtfYndqlV0KIRHFzd0nGOzT6ERRzBrSLWE8K7TXNKKhtWVspinn1DVeb5H5ADdnQlSl3fSzi32u7zyDbmvSvmK4bNdJ5c4d2s97EymYKBw6ZuENwZwcrFUNvUW8kMb7SzS4yqB/PRvHCBgs4p/gDqYhBWEiWlQ7Mbd3fIQa5uhW6sDGoFNF/0CbE68wmFZB55lvbIvvCMRgsJQ5N5CIok1G34zJRNGVFsfKPv/p1Lfz0a+8kPmjikcGl/Gbt/V4/eUP8kdPv5juw2JlqXhSo4WvyaLhgdU1YrAJXCKlj1cYTegB/Hcv93nkE0dXRi7W8b3nPR9e3+Gcr7x8OdwjFDMZ849bXYNu2ZoB2ZZh7oGM0bLh9Tfdw9v3fIK/8aKf5OrfGtkaDzMqcCGe8pKCFAY11sGMph2SsG7Gdh7GCy3UjPVE1GmFUaU0pIOC1mrJ7CMlu++Cjavn+OM938b7bnwlP/iqz/JTu+4Mc3x5uklySZ/0yVlAyOcNrTVLQXUKZVYpeMqOqQXIeRu9LmG0LLzhkofpqVFwF05Gtr6lr/itt0v26xYwdmn26x/Pezjn4cB7sLpNGkSEmHIYqemuwk8N7nHS14G6GOSuC5aWOHrYXV/MGE6/MGG42GXmZIvxrGI8Z5F7Pi+MFg0zh9fYPN2r7r1AGLxAyeOvqDkdQCJQOm5BG2MPDL+9fhMf/uhLWPxqRt6zYaknH9nF/tY6i1ecCcoon/RUJ9EiBxYsely06PZhhNBuVViuw38GtnHamFObvLXsGsq2CTUpamXy4hwCsV/9lBYDjc907L09dWYzM+czsH5ZikmF9pmcdDNHjWHjupy/9oYv87Y9n+TqrM0/e/0fsXWoYxWXfR10COKqSVvlmkCUDMduAFPNkbbcg86s9tukVtlZ9BKbkbqbks+3KBbblPMt2mcK9n1ujWv/3z5/9K5v4433vIUjzktzWaW86OAziLGxH8WMleuyLUNrU1f5D7TlwnDZvFVhdRBiDOuXKto3n+H22cf49MYLaC0N6R80tNZB8kp5WFPwNTa4XxOvg/LFYpowgreAlFIpEN0imWjTVhnDDTq16+XzMExc48WI7QrwRjAbFqGGJOz3ZCTk85ozLzScuD1l/XLFxhWwcTn092uKBWsVUu0yvPNZc6hOaTsDMRgsEGC1/iOTU2LIRPFkMeA9D7+MxQdtNZ0kh2LWpoLPVMGte58mn7Fytskq+S4sRs1uXWWHrhSUjaP0LrBUIdS6vl6+1UxY/ndDpWfwJ6PFPVer3LTrF6tSKGYNRQ9GS1B0FK3jG6xc32P3W5/gz9/wi/zcgU9zdWpf9kcWnqT3j59muLdL9+gGnVMjyyHkJoxZ5dqJDh4ZGLcxNcmoDN/VWKNyTTLUpIOSbKMgHVhkI84SkvdSipmEjatnGezvsucrfdq/ssz3fvTtHBmNaEvGSxafoHT5CtTYUmBVWE7F+w34NUjaJWXHcimj+YTT16f0bxlw457j/MnpF/E/vng7l+9e4eqXPYFJqkpm1h1cUKU7Cnfk4hC//a5yqVLJN8QChOBE5Td82TGUrQpRm9RxiU0CVIHaJEWRhvIx2vix+Bs4he3gDUscTcuQXzlgvGAqTgh77/JMnyTVtTT2F9J2BmIQoFMypyzJHZqSvjEoFO9dfRn5F5forNpg+XQL0i0hWxzyku5jXNU7RT6vKwWkr4HpuIdpsQ9+w4fkLLr6xF/jN7sHnAYSgGijR88OlCLG/s1ju2kw1DThMSYxjlKABZ6tAwlPfs8evvPHPsf7r/ldrspm6SnrhOSrY7/7mvfzzA+OWb1xEYBkZClz2i9tUJYmbG4pIuTgEIUqLUYUbUhyiwiMQJJbRGE5ChegFLHgOhOGe6zp4fIPwvf99k+wpoecHM+F+Uq3lE1BN6tcNWZbGyMZ2mcnaUnZ0/T3KFavUQyuGzI/N+Do5iJ3fvEFzDya8cb99/KWg5/DCKQDp5n3a1E01tQ17y/hRUG7xhFX4Deoi8kIXKiHpSZnQV2kDArIWiKO6sJY8ghIIHAW8UGD0yCIlMWMrV3ZejZhYaFPsTcPIdo+CdFSu89Mb/QN7/AdgRikhKSlnehgUZwCPjOc4b1fegW77yvQqaBbLjiogHylw38/8Rr6usXM1WuWCuWEhQ0bPmBRwqJZRZbL7BNTFUdpwjWF1KMjm+JAQ/abqk1uii1U19TiL4BJP2t/ztjkLW1LuZIRrL54xL/6kd/k3+/9MguqS2k0fT0mp6Sg5NlyQN8I//Wl7+f0m/oUsxlirF5AtAlcgOQajAFjkFxXHIKL5vTXUdrfk2HpKLtl8wEbbmms6TQZWv2DUTCeV2ztT7n0T8e8+t0/zZXdU/RvHtA7Ydn/zevHlG2hfaYMwV9gqeF43eUy7Njgoc5DHcZ3LrPxBwdYvF/YumbMHbP38d0zx9i6bkS2YQIy0JmdK0/dPTUNDm3xHAckbiYycPl7pLS6DOU2X40r9RaQxrqGtYPo4facKiMvSiKCFes8GvoPIkQiBeQL1kS/9ugSM4sDyq5xHBikmwptFLfvf4p8xq5NlGPnvNrOQAwGdCEol153SXXRwO+cfim9R1okQxtIZB18QJWQ9BV3PX2YDz95A6NxSv+6EcnIRSSOqTaj4w6C7doXHDH19Trr+DyCcRtZFZD2hXTTpQAr6pSAaf16rJ84CtSsc3iWcVgEZlN4dU4LW5cV/MzL/5g7eic4Wfb5er7FphmRiJCRoFAsJ20+vnUti6rPSy99ktFCEriDZFggpbaHthvZH+jphzQOShsCbv8nfHo/jHSgSYeWw8jnE5YeMGij+Hcv+X1WboDRsoFCyGeEsqNIR6bygixABgpSu9l33Zdz8C+H7PpaQWvDsHEZXHn5SU6VXTJJeMW1j9qyeArGC67SWESN43WZ4OTieXbw4UP9xeubciEZ19MA1jxaS2ehyn0IdIRU3Kb3A6lv/knWo+aSHcNFjCCco5RuG9qnFeNRSjlf2kDDArJ1Yatocf3MMYq9OdmWTRN3IW1HIAYMmEHKhi5pi9WAlwa+dPwwvWOWmllvMgJnkAyE4tFZ+keWmemO+Mcv/hTD3ZZiqTH41GshbDZWQjUVU0QsXfPwLKEXP5yGWuWQ5A54vB3c6y7iHJKR3FwpvSpPP59bUBrj8C0We7INmzfxh175Od46/wxfyxO+92tv4W0P/hBr2mY+ShxyXdNjHhgcYE6NOdBZszkZNHiLghqXdmMXNpQ7HLmN4ozPSanDtRaRON2ERxAR9yCFCQpONbaBXXlXoVPhvz/0Sl7fO8r1r3gMk0B318CFFFuqpls294SUluoZMfQPGE7fkHHq5g6nr0859TJN94ZVFloD7uxfTWkMP7Tvc/QPWE4qGYmtBj2K9AixSNHk8iIlo9dDSKyHyO1a++tULnbdRuLykkpYx2SEq0QtteJGMZGIHZ6m7wWp4NQTsJj7NRUMgUUSszND0pncms61UPQMG6M2J/J5rr7sBPms5XgupO0MxCAgY2ElSs+TCKyt9uieqQfn6NRqhZNxtTD7Zjf54cUjXP/qRxnuqSwLsTY2lg/PRwkYhhb0EhL0FzozFF0oOs49N6mujbXdXlSJ/1djy2lkmzbpRjqwcq8U0nho1J+jSACzN5/mf9/1eR4v+vzkg3+Xwe/v4/RHD/J7Gy9kZHLakqEQHsq7bOQdcqM4MZqje9p6TYo2oC1UBeqvdXUYu9nj/8VZJyxbHUO5p4rGAWzlPWgrVFdJWEUb8i8u8UdbV/BvL/t9kqs2uf3Qk/QPGpKRRpV2Y3sHIQ8XxaxhuNuweblmuFdjlGGr3+aZzQWObFzCV8YpL2uf5opXPllHyvHm8bK6Vxb6scfXFxW3EJBJoy8ffi155cPikQZMlxzOx0zYVDTWRF1dwV7w1XHjTYZC0TW8cM8xRGmSgb1OjYUTxxZ5ZHM3ezqbjJc0M8cuLFhiRyAGI9BeSfja6AC5KUl80sS1jNZalA/fsVHWtGjvyxfspG5pwz89/BEGh4pqI8XKpLQKgSX2UDwHogjWAadB9gog3YrMlJmpL65EZjOoRJeIYwj9RO61FXchFdA6QDUJrF+j+fFrPs7YGH78se9j46P7mTmh2fPVMb/yoTfysydeyZOFzdQzp8bcNv8EN7ZStFEkwxLVd9glVESx3FgYo+dOjBcrsEjCmMa1lYLyrM3Nfd4VykxYeEzz8/e/nkVV8Mu3vY+res+SL5RsHswoMwn6o2yzkueTgcvX6Lwbk4GiXG+xst6jX7RY1T12JzP84ME7GS1FFoNYcedbc7NGFL3JRTbUAhNiR5PVn6aYrJlHTf05TVFDmud8H/E0Gw/XlktprULZ1Xz3rrvRZUI6tKbgbAtaxzKOb83TTXKyg1sX7AG5IxADYv32P7txNV/Px/S11UJlG4p0fURIbkGF1ZMxZJuW+j5ycjd3j/dzMOkzt3+jStEmBK/EwKK5FosLE6sSHX7De2Wk5VTsUfk7WAxf79Q/KOYkqGWKqQXixJr0ILM6kWNsZefv/fbP87dnj/L+9Zt57KNXMPdUic6E8XzC3i9pPvd/v5Q3fP5Hedf6JTww3seLOk9xohzw4MpefPEeo8Rudr/xY2TgLRLGcgyirf+AF0GCktJQIQf3u9dVqNwqLSuTKAGhqwLSjy3yW+s385rOmMvaz5ItjhgtCK0NTfdkTnvDioOtNSHdSOx8D4RsXWF2jSmXc1CGdttijqfGu/jCKGelnKWY1ejMj6c+j8nYHvEc1zZ+Ax6DpcFbKLxVwisyva+KB5+i6rtm8YqtXlP+j83iNf1FDCtEz3ExGJmtLkC612XbGiToxHKxZduabFc2ewzKjFsOPc3qtRe21c/p+Sgih4H3AvvcVLzTGPNLIrIM/BZwOfA48P3GmDMiIsAvAXcAfeCtxpgvn/Uhxk58YRI2dIuj5ZDj5azNgJsoRBuyvqZsKVt6HetXL4WVuzefmOEr113Gd3RP8ZpDj/KxxReHiQuL6RN7ejkTOCca9Zg8XsCoqbCrLSBJZFry7xX70FeTOuVZUkccQRs+tn0uv/gkP7vnC9yfK37lL1/HwYetibZ0OpeyLXTOlBx8Z4tfueHNrN2Yc+3Vx3jovkMc/qihfWLNxUP41MNYriCm/D5M1CODkKjUYB17xIU7G0QpjLbXB+ep0qAzFUQOSa0eprUJ4zlhNC90VjS/+snX89o7HuBNM4/z68vrrHRnKLoKMULRcdan3Cp41dh9HwhyTU6vM2Z1dYayVDxwah93fe0KWqdSip6hvaas1yTRxm9wA/EaeVDwuHyqwth/jczV4TpvVTIVbIRkPhHS8P1M40x9VO6EPwzRecHmdvTPL2zJvs3rcm49eIw/fvYmSAyjXRoprRJW9zRZqXhsfZm/ceg+vvrCg1OAbvt2Pi7RBfBTxpgvi8gccJeI/BnwVuBjxpj/ICLvAN4B/J/AG4Fr3PEy4Ffd57ZNduWUL11nLh0yJuHxfJG/2LgelcPgQBc1rpJfxn4CYmyqq2xD+OBjN/EDC1/kp/Z+jM/efjnFJ3ehchuOqnIJWuqzaoWhLhN6IIjMnrXYfKAmjsSURhrX+WunvX8MFP67669swXjRcNvSSR4rSv7dU9/Dri/ZupQ6E9KhIe9ajqroKdojzfLXRiw+rDCru7ju5Emk1OiFGXzmJ6Cq5hUjBo0NDQ5cjdhDa4sAjAnp9AwaUTYazTiOwyNxo0GUhOLEXj73rP2Bv4B//oK/w7uvfR8rWz2SEaxdkZAMrc5m81KNGkNr3YoRRdeyx+Xjs5TXrtqKS8fmWD6SsHy8RHTJeE4xXILRknUEo291UIiNnvXzOpESnmpTS2Pj13QGRXXe+zcYT3CIYIDGWsagEsMM9WvjZqQaU1CWunEnI3vP8JY+//zWj/KZ1av59N3Xkc6PaV0xZHBsltbePrcdOsoLZk/wldXDnMl7pGk5+aCztHPyF8aYY57iG2M2gPuBQ8CbgPe4y94DvNl9fxPwXmPb54FFETlwtmdc3V3hA7f/d/7O4hfpSM4zxRKfe/YKTAL9PQkmEbJNa+uONfvigmqSAWw9tsCHNm7m0rTHdbtOTpilaosWbURg0tkpdniKkAIQXK99VepYgzxxv1dmNR1tGs+fsIQ45VvRhc0X5Iz3FnzmUy/kuz/y4zz4J9fQWbFxEqqwirvWpqa9ah2WRkspxWxicz/mGr3QIz+wiG4lVqPrmuQlFNoiAY8AwFoZjEG0rpSQdvGteDEuoHBWidxZNrzZ051XTU6Eak6MEtprJSsfvIQvj/bzz274U0ZLBpVbj87xIpi2qSNLbVnk1hlh/UyPpd4AEsPM8ZJ0q2SwnLB+mWK4yz1DrBOQv9f4jdxAChMuyTF30WT/4zWTqi8vJgaHpTgkO0Y+sYSqz36osnHOISY1sv/3bxzyXdfcz8dXruPzT1wenjHfG5LtGXDtvlO8Zd9nuaS1wiMru/i9L97O4MFFLqRdUBCViFwO3ArcCewzxvjUs8exogZYpPFUdNtRd27bNLXaGGakYEYKjpc97usf4vHH9tLVMNwlJKOEmROa9lpp7d5uU+jUBv0kY+ieULz7/pfzlUOH+cKRa5jLYTRvaht2wh8+xuyRmNBU+ExrNdGhcU/TrBSzoTYKs+q7Bqwe4DSgoOwa5vZssvXYAvs/r+keH1H0Srvxc4skVWlQI+18QZSjNlbe160EtEKNy0o8cFYHKcsKGYTz0SRoHaZKRjkUBSQJtDLotDCRboJUQQ5kjo9WyiaNSUz07parEWMYLSTsvnfAT37yB/j4X/vP6Gu3yB6foegJw8XqPlVaUclvNjWGzhNtntzcR9pXFB2DGhuXEdsl9O1DvgBF15q4xSuhoZaRK3CP55Am/X3aWTS0018FXxlV78tIdK5sMKWxGHIezw0wawgiVf+Q4eVXPcZq3uXOB65EBgnJ8ohL965w/cIJ9hzc4IXdo2RS8O4nXon61CK7NkwQwc+3nTdiEJFZ4HeBnzDGrItUDzLGGBE5j1et9fc24G0ABw8lrOoWQ5Oyobvcs3qQztEMVVpRYLgstNcV2WZJtmWpiwUWt/jOM628d477//I69p3UDHaDFBZpqLHbjEFj7UJeY33DN9B80JSdBCp5MOZUkjrn4YFoO0tI0TOkfZtcQ6eGjZOztDZtyPh4weVf8EghryIjMZCUpXu+BH8D4yMlc4NPSy/j3CKFVNkaFa2UYjazwVEd5TT6diOnQ03nxMjmbxiNLQdRalDKPtf5LxifZk4bTGkQ5ZWRdjw2u5SVlcezQue04tBHEt77kpfyT170KX7tq3eQbbicDEVixT+sE0/l1Sqkm5YIpANobZZkmwUmFcqT4jgFoWwZTEvbvIheTJiiyJvmZ2BPUOcqIhHRZFjh2m1yHekIYj0D0flpzzwX3HkRxfeZjGE8D9e85AnevOfL/MaxV9CaHdNaLjBGyFTJ/vYal7RWOFXM8bP3/k3kswvMHdNW1LzAdl6IQUQyLFL4TWPM77nTJ0TkgDHmmBMVTrrzTwOHo9svcedqzRjzTuCdANe+qGMy0STknDaznNyctRpkbYOHdAvnuQedMyVFVzFc8rwcNdbOehVa2XuEkM8YVLvySLMLKJMYO2Ina1xAY3HD5dM2t9TPBSTgXWcnOqn3o1PrtWYSWHjpSXb3tnjoxB6691pzXqt0MQ2CrS/hOAtvFYgm134kKnxXw7G1JOQFJkvRcx1Gu7vks4q8pxgtulTu3t3XRSom45T0qpTWao+ZEyW9x9ctt5EIRlQlaoTnOmWkc3rSIiRjDaIoXQZr0TBeTOmeGPHeT7yGT/zt/8QHXn075f/Yw3hU5bcoXMZz6wRm13a8ZJP29k7ZnTPY16JsuUI0bVuVyRfCtZnEpeYO32Tvq7FPrp9fQ79WAC6tJWW7gWyaIqsOTFLoHhUhj7Ps1cApuKYKKDvALeu89dBf0tdtVoddWq2Cw4urtFTJoMj47OkreXrtVvIvLrH73oJ0MKa/J6XoSSX6nmc7H6uEAO8C7jfG/EL004eAfwj8B/f5B9H5HxORD2CVjmuRyDG1jU3KQ+O97E9XWS17rK7OMOM2shpZBdxwl5CMFbNPDlB5Sj6ThUxA1gXXkM8J4yVDOhQ6pzUooZgzJC7AJrYSxEEvE/ZtGkAzRfyYBkCVcw9BezNh7jdMUK/4fDK2G+D2PU/x3UtH+C/mOzlWztI5U5L0rUVBFdpZCAQ1LB3bajs1iXuwsnPjE7mUcx3LQSRdhnu7DHYlNjFKxyKDsuM4Kcf2i0tZXratM9d4XhjtShnPL9I7kdM6PbA6CmVf0qctE3H5HjzXoJ3XqtuYqjQkAysGbl3SYflu4Wdedgf/5fr384M3/m/MPWZrVGqg7BnrxDNjQgVpNaryRg72JYx2lcw8qWivmKDkbK0kltNIK27NWyFirZpX8hm3xt7VOIaBmrVCIvjxPjFxk6rPWEnuQSh+/rmc7Pwzk6HVNfVvGHLL3hPctXUFmZTMtkaURrhx4Rh7W+too/jgUzez+dgCh7+c0z49ZLivS9GzyW8uNOz6fPDIq4B/ANwjIkfcuX+BRQi/LSI/AjwBfL/77cNYU+XDWHPlD5/rAZmUzKkBq7rH0fEuzCBxiiqLLW2RERjPCOOlFmm/pL2m0UlC2bYU1IsTvmBMe61k9klhvKbA2CxIRjkljpNda3n3XIutArXNHlGOqUKTp0YNDsb/NmHJiFrozzkySQkfefAGHr9kmVNbs2xcbti8NEVMiuSQbdlCt90VQ/fkmNapLVeqzKB7Lcp2Qj6XoV18SdER8lmh6FquwCs4g8emd6Ly/iIeit04VWEHOV6AMzOK4XKbhUcVnRN9ZFQ6rkU7E6ZGjNjNWNjcjbjUbFZGtxtbpzYtWe9UyWe+dD0/8z0f4eWveIB7H78BncJo2Xry+XFKYb1dMVYcHC8I5oYNbjtwjCPDa2itY2trjKxpdO0FmnTvgOFmi87RlrWQ+E3pOYjoO+BKwlVrFs5HIkKsE4rXuOYgJfXrMNV0GuIv1b01TtNzgSWMFiG9dZW/c9n93Ld2gE8dv4prFk9x/fxxDndWWE42+frwAEdWL+HZ+/bQOyWsXq3gmqyKy7nAACo4D8RgjPkM20tE3znlegO8/UIG0ZWCW9qrjI1hl9ri/XtfjDywaNkx7+moYbworM5k9E4kZH1bpckXNVUFdJ41jKKSczMnCqRM0Zl1PS56QtFxG0Gsacy3CaVQtDGaQS3eq3GC8ksEPNH1E4hkO92G2zDpAJY+0eGp2SvYuHXEVbcd5fj6HJtneqBhXAqDrYStLSEddDj4KU3r6TOgNfn+WTYPthjuspQ3n7NReKqUmo8EhlrAD66mTZCpE3thiAMBqz9IDP19UHQyFrqzzDzVt8pN72ZduolRgjdxqlyjsVmrVeHc2pWl7kVXsXy38Muv+Hb+1aE/5rtuvJbZR1JHnYWy46ImdSVieAVgt53zyqVHOXLoElbTDrNPKpYezMGkdA5u8W9u+hAPj/bx34avY+bJhKJr1x5vOfDroqvPacrB2Iw5sb7+8obYIERz6UWIiDg0/Swk6gfc9Qoufe2TvOuaD/BE0ePY8HVcOXuaV89/nblkwPF8kV997LWcfGAPaV/IRi6QbLFCpt4qdiFhALBDUrtlolhSHTJJ2JeULHSHbLmSYN7UJA5JFF0YLfjQVbtLPYBnAwOrgLYOP37yVQHKxfmPF2y5+GxLQtmxbTduhARqVMBUyCqWKwPCMEwm+4y/Qw3wfPPBXq6mK+nQIKnm4Sf2Mfu1Fvuf1iRjrz+AvAv5HKxd1WWxtMrGtctbDPa5DaUFFKihBLMdmqo4T3MchopZKLEXxQgu0s2UHVi7KqHozjD/2JBkc2RFi1TZwruthKDfKC1C8YpIBEqndyk6QmvT8IdfupUf/euf5NYbHuPxu69GnlHWX2AswcW5bNvFksRmSN7qt2mrnG+78hEOXL/GHz9xI6e6S+SzhnaiWUy2uL7zNAevPsWJzX2kQwlrM9XtOOLspior3Rp75BCck/zae4RhqnsMEbfY4E7DtEdcaBBB3DMKo7hzeJB7B5fwyNoubtr1DKeKee7aupw/ePAm2nfNMD+IPDONtcx4PUXNbH8BbUcghq8PlviPp2/kDXP3cHMLbt/zJJ/b3Id2LKPPtGO0j0q02ZxEW1m1bEnQzHsTks4EiVioMpNAJReuO836Ro/23da5Rrt8jbHS0UCFILaZ1Jq4EIsYBTVZtiaeRMDTREhq7JxnEsjnhMFegx6kLB7JmH3GKtvSfmnzHgwKdNu+4Hgx5elvn6Hses2/lc3V2MYaiCFkTtapdfgJnpzTEJZyyCnaDeJ+8+7FZctGepYthU66LDwC6eY4OFH5DajGGqMEJVYRGcK03WQbZddy72cTPvvaK/nPl3+QNxz4p7RXQHeciOOQmtWlWCSXDKA42eW+rUN8x+L9vK73OC+ffZj7rzrEgewMn1i9nj9cvZWHN/bwnQce5DeeXaD9hW7QVcSi4oTeqblu0Rx58SP4K8Q6hCacRPqGQEzcd08EpjnBVRYJw+rvHOJnF/8+oi1i/PPlPXw8v4XOaWFuzdBe1S6DlTVJFl0XXFjYgsYxV3whbUcgBr2S8Tvveh2//uJX8o6X/AkHWmvkMxbzgWeJTADwrO/88ZWbgJZdEZ2Kc2QRxrN2lWOsqXIrbqwcW0B1i7BwQQTw2L85wFhAVNX1OmMypNdEwAaBLa8FSsUsfPQwawXwjizGxmOcSDEKRgvKOniRkIw0utWyIdOloXt8SHv/DGt7bHx+rARNxoQ4BQpQfhyxI1wDoNWw4hiaFCco7JTLSTGAogf5fEZ2estOQWZTxptUOecnKgeoNAGvSHQWlrIldFZK/u2n/yZ3/PVfRF+7hb5rFlU6EbBrx97atOOQwiqb5x5XfGT+Rm562VNcks7SklNc1zrF0CT059v8zjMv5tGv7+eWVx7l+kuOc/QLV1hqnOLStFFZCryYEFUjU4VFrlJIfY3dmuqkSgQTc5G1orgRQHlRKqy/tyYZXLZui7jLGTsWVdpCxfOPa1rrJeP5hMEe66vSWdHW9DtvEUHZkuDrMVoQxgvilPIVwbmQtiMQgyoMSw/lzB5r8fNPvYn0unX0HmHmaUO2bguieCxbtsQiBm2plXVasZpvnTjForLA5HM3gtP2J7YeZLqSkm1kQZMthYSoPE9ZA7voFU+4veFEGp2aCkgiUuGf6RPKBErkKEGMSEJyE6Jn+oK1qQvScqy3Zy91Cip3JrgsIc8ENZPSe1azdYmySGBkNytiGLchDtsNVEpVY4szEXngCmOPMxVRscxly3InhUvOm89lDHbvZv6xIdnpLUzLpnxTuf2UQqNEoUtbQFiJPa99CrVM2PPZhDu/Yz/fdvmjfO6+m9CZsUrj1I697FqOQY3t9cnQkKxk9HWbvh6zquHDmzfyhdUruGb2JC/b9TjZdSWDMmM2G7F1iY2GNW1tYz5Sg8qs74coQ5aVKKURgbJUFHnCOFeYss7+ifIHNrW9wwDaCGWhMLmCIpIxffPimMv/UOMiU41JNbgoUmlZc8nWICVdTSi7CWamgEJBu2StUEimUZmm3MiQTokZJqSrCcWeMUt7NhgXKYNxgtYKdWFuRjsDMehEGC5bP4W9X9JsPr2ASW0qbJ3A2FhOwFNYnabMnChIRoay7TgDxxZq8dSWII/rVIJJThXQXrVBKP0DEqwfOjO1cF18+XKBUG3I6Sx0igUuMeBy7Fkq4kk1FRUpbQ4Gn7jDs+QV51ABT9k1lN0SM1OispIk1cijPdK+UyA5zz2dVWw4YmtOaMc2jg+NoFBIu6TVyWm3qrB1bYSiSIIJ1RhBKUOSaBJlPR2VGLRn84FUDEppjBFKrciLBBFDqgxZYtmOQivaaUk/T1m/e5EDn1G0T/VJN8dWntAGEoUYTaLEiVnKrpWb73xG6J0seOfR1/DWQ3/Jx6+4rrYJ9TBFWiVmlCCDhGzDZrMyiaGvW3xlnPJbK6/iD++6hd7jGXfufQELV53hLVfdyUdP3sCDRy4lKUBSYFwpjAxpEB3HTO5lMQ4WYkKQGIzTGEpikERXHCVu7RWornV6MIU3IUdIZJxU14YHuQGMFWSWYmSLQzr7c8pSkY/tJsiykiTR5HnKaJCFa2lpyjkh6ZQYIxTuuUppjL4we+WOQAyenfR23+5pzWhBWL8aioUCWpr2zJhuOycvE1a/Pk86SugdzzGSWP0BFYs7XrSbMNuyLF3pQlF1227ysgPFUoHqFIHaizIuZMDY9Y8wbJqViBjKUqFLRaIMShnStKQsFWWp7GZJ7QazhyFNSooyYXPQJs8TlNKkqSZLy4DBtdtwZanopCWdrCBNSsZFQicreGZXm/xk6nQqFcX28+YzLOddoVgqmFkYorXd8K20YL4zIktKEtHkOmFUpJR+4xshVZpU6fC+xgiJ0qSi0QgKg0bCOEdlwrhIAqLwYx+PU9qtguG+gvXLWuzazEnWBuhey3FGJSZVqLFNQa988R/n42ARm/Dg0X20LilBQ7KWBZ1CmgOSonJbkTwZ27VtrSp+65Hb+L3kZrbuXubQEU1rY4zOhP6RZf7r678Ds95i+T6bP9KngPMIQMUxMiEhLpWo5ya6ioWQGhel04ir8joHhyTKTlrpDCK9BkAadDwVJopFS92yiMNIm6HXVWB/zxXk7lx77OA3CubSpzv0VcemCbgwRqGC+W/stue4OaWWjSOwZrag1CkUjBXjrZR8YUxvdkTZsxWNxBiS3FC6YqlgF268YChmdEixZZwsaDKH+QFKQW859b9bIB0hAzGO1TOQe/YuVzXZfOT7clRklBjILIULEcxaLFuphVIMucAALMsY0sYJlPbYxLGZpWDammRTTegA/P86qUq9qRJaJ1KGa3MB2IbAaruiZl5WDmX3qHQf9p0jOI3+qbkPO6tGLYGNG/MwM7S1LYyzeu0Mc0+lpKsjixSUQtCIsrksjLJ1GI1TFBuBvKfgVJuxSZB+Qu8ZFTwMgyXF2Anw8nrnWSj+chEzgF2nrT5j80BGkhvaG5rFT3fCxpXC2Ipkkc7EzoepuDhDUMzWFIdOXDXK1g/x3KWN16GeINYjnVzqHEj8PX4e1T1i7CY3o4rYeQetcH8kfjb78uLohO20CUPnaDsCMYiBdGSC04tNJQ7tFWFcKrJ1Z257ukupunQ1dM4ULouxS2QKoXJyuimoceJqDFRAXLbAZFYGT72CzSvBghKBilpESjyT2L5VWV2rs0jB6bMxRWXHJ6wRpg4IsexesxBg+9JtV+h1FKF9EQwW63gqpQrrbdhaE8qhhAAf6+yVTIyj5rHnKVfo37/3JCTVEYfrK/UY2faTDIWyBetXCsNdHZbvT+g+tY4YF7TlYmxSoOwkVYCUU8ot3Sd89rXXYOYKRCfBd8GHb4u2c2P9Ibz1xOqU1i9XVVyK06skLslsQIA6DKHO/jf+r21YAUOl6wnrhYtbiZzDajVN4kjL2DFKnA6nue4xwoo4gMrtnTDX4beojyCqqui1pPrtQtqOQAxWFrfY3Mft69RuZJ3ZOo5WNLBYP9uC1kaOyktEp6Gmoc3cZOicJmR5UrkJmNRbLZomIm/xiCmJb148KV2iUo+Ra1GSUGMhPdavvZ+3fiTUqUgDcfjDF88J9/v4BwFpsrau32QUUXSvC4kB0lEzr1H3CsiYpQ1u0f7R8SbCIb6oPz9xHhGWLRNMd0UP1Cij/WyG2hjaQrla2/ElNt1c7D+uU6H3bMlHH7uO7tyIotMmGWHNlUlV9LboERCfzuxzk1FFSFXkp2GU5QStB60ES0iYyykbZqo7fCReNP1X7PWmjuzDfEuAjZibCH0LNQtGzVU/uiYWR5rxFk2vy3hsF8op+LYjEIOvgOQ97bwjTTFr0F1jHTZKY+XBwl5fthPUoEBKQzIy6J6rRJRXIbFiotoHuJyCmiDX+uZZ2UrZWP0WtPGJhNBbv7mmYWGPYLyTUv3HycX0uQ3Dbw5Y1QiruPSJUURqeo8aALg+04FB5xV76xWcgZV27LcxQCoTvht2MuoZqy0lM9W7FhGsSR3wvVUo3kCjZVi9bpalr7oX1SBaoyhcRKZLNNtSAdHKXfP0Dxe0u44oUCFanTrXd/dM78yDWMms5qAUbSrPWdkXiyg00af7rTbH8b+xSGUaffnbFU7k8IigEjerOaOOOFx/do3ZBq5M9OzGj/G74IlH9A4XyC3ADkEMVsfgHWAcALt8ffOXnmF4dDezRy3F9s5OtgCrsgijMC7nou3O24Zr3mQRVvW/B8D2mDhmlfF9RZg+xvqmcX0ENKrZT7SJxf3vWd6Q2p6qfz9miMyeMWBR719Ki4iKTsXuBsTlx6zqAOWDh6RBoSR6lwq4qof5DWo189FPpr4xfX9l27B1UNE9NUv3yTUkLzGtNGSCAki8nE9C0VMsPqLpnE4Yz0uFOP2Y3dwrTbBUea9YG0TlOSup4CBmwSPWOqyT1M/H4695RXoCZprnIwSrCRaLaRyoRwSBCMX+0O6hUwOezvbM+D1iWGqeu4C2MxADFjB8xiO/cXpPKw6/eo2vv7iFemIWNbAIwfr+G1CCKo2FMVNRyGTsyrGVWGeWTBrPgqDRn8I2N1lp4xFWVGbdI4za/o/vi8QA++PkZo697oKji6oouTiEGacnD/jBITsxhAhJ3YqeEcu2EQcQxJ1oswTOIKY85wAmXww2jEVARgQffS8XJ2NbXGbj0oxkPEe2MgiZn0yq0KRIYXe2yhSt9dJxNwrRyjqvxT4lEr1LNLdNhJS4/A81xySqdw/zHiF7PycxQQlinGmsl4GQGBdA1ecj1mXU1t1j3AgxBv8VbaYSp/j9AoKftlYNrsHn1Jjo7zzahRk3/4qaGEjG2mbjcaxomQmzx0vufvgw73jhn/DszcLsUyPrE+40zL4QTdmyh1ckGmWLvhY9W+gkfo4YnJmpUeU43hzxpnB9KlffUeWOazFUKbga12OoqhhFVY1CpaW8MpOhK6RoOSX/HHvE8mwNINxnUNi2IiTndQnxZ3TEY/XIOBTOcch1atGc+Cir9wl9eOsB7pwD/mxdGOwW+vta6HZqE724DNO+1oVoQ7pVkIzKcH86tAVrxKWVtxyWqScxiahoQKx+vtz81tbFO241EIKKEHVYh5AJu3rnGuWWysTu4asGP02uI16LaZvVc0NldTSfGxfQCfBUc5qr3idxMGQ56gtjG3YMx+CpphUNAIGiLSx/IePD193Ed73uy3zxvtuYfaaoWONCU3ZUZZuOlD6uy2CRqDaIVArAaIPVlDXbsIGWEsT8OIEseNlwot6CiSmHu1bXrwkUzPVZe2wDuEJ+A8fJWMvA5Hg9kMbFWybG1YSV6NwEsmMSmJv3VzoJqg0ihOi+rQOKdNilV2obri1i3acrjyt7g4MFlQs+vYRJjAvZlpq2Px5f+CylMgXLlOvi88YN01Njbx704zCN9W6+s2ouWDRXTY7BU3F/jes/6GkiWJyAP4/YImTY5HBjHUgY8hRu4nzazkAMrp6BKsCM/VsKRVvondR85S9ewC/83Xdz/B/N8eS7rmH5vk10pihmW8HSULpwaqOktulFmbCBIKKa0wALwgR6fds0eS+W9YIdPzo3TdNtxQB3bUOr7cc1bWH9dWXmFIdO/PFenUWvet/QX8TFhLyUMXwHJLP9+1cDi95r8rVq90gDoJsmv3wG1i5LKVtz9J4ZWk7J2KSyfsOEqlfaEwrwKdFRlUk4Ht/ElKX4CQ/PD8revP5eTUReq/ugca609mW86HYu2ltDBJ4qbLPZjTthRQg70GBpivRNdixm6jqY6MuEiAM1l/3zbTsDMYBlF0MdA4u6y5ZitKBY+prhJ77wA3zs1b/Mj/yDv8fauw6x/PnjmIOLFJ2M3G0OLy/G8pdhisWhsSmnOZqE+6MS7wFTU/9fjKlwhNTwRXUNTYBpfk7hJvx5Ze3xnqIlY1dazr2bB9YJyuHY6QmwMNU106h+PD/N96i1mOp6RBxzYtE1HiGPlqHsKqBDeyUnGZYkpaHsJCShWI3tsGnb99yRDwiaWLN4XE1OECq9kJ8fUw2wMjE35j+Yez0n03jUNGTemJ9p5umgSPXP8cNOIotG5HsROlIRrMVMUYwUJsRbM7HO52o7AzEYbGoyLSisutwoZRNgzkF7BHs/2OYHl9/C+254L295699n9MwyrVNbyMGOzYAroDZMSOJR616IHE+kArYwuSYAd6z8w93nx1jbSNHm8s4vEzUaGmPwgKJj27b/DErCyFwYITHPDZWZzWQlBtrrmtYmDDOZ0BZ5JVas1Y/fw18TztlH29eIOKppIoW/NiAEqfc1YZHx8+XmpOgZVq9WdE+0WHx0hBlbd2ltQMV1NctqM4Y5icKdwyMbiCFWUtaQlxe7Il1J7dVU9WIeCTfff6rFACYR7dk2or+WGPFU79HUQQTYCePDIc+IKEx7ZrTO51VSMGo7BzEU2ml2bdyBpYyabDOh6Aozx0vG797Lz/zEHbz3ut/gr/3oP+GyX+rQe2ZI0ekGh6iYWkBFJYJc3ph0q92fwu75DdnYDDUgbJiuPHfi+629Ykz5GhunBmwO4CfYTrHhtPksoVITRlUedFOAYio1a3IJzd895ddT3r859ury6h//1c+Jp5AOgFUOMrJu6yDMPpOgRqXNTWkIKep8hStVODHC6YVi79L44U1fgvgd/NhqlqQIRvzvnrMUlwXMchdVx03HuPCsaM6CRSLmLmImJELCU5WQMmXtqd8jjhg5H1h7rUOGMk0RApVIc55tR1glwFddNoF9lEKjE6G1pUkHhsGulJnjIx75xRt428N/l/e85N088v1dsjMDdn3xWctqJzZQpuwIZdsehfuuW1HAi/v0ZjDdckFW/jwEHwOfz78WCJPUDx0dxrnpWq/N6UetAKpMAZbI7z7MUOLeoQ3pFnRO27nKexWAxRryaGqrzxhZxOa9xhFbHWLTnr9fmtd7yhU/fwqBiuuO+vTwxYxCty1ySEYl3lcglL2LCuh6T8eyZWNegsJZNeYg+n8CsXs9RXyP/x7HO4T1lXBYfVYjNiJ1ka2ZhCje8NtZNnmAl3id/fUqusc0fqPqsxYTET/nwnDA1LYzOIa4GYPkmkQLrY2Ssq3IXKamM1d3WHx0xMp7LuVDP3ErP3fH+/i/7vkh9n3s6TAZoYYEdpOqnOCxWH8OlTIpyjUQ2NApCyIGa3/22NlzI2n9GiPUK1XBBJU2MUVpcCrx9U05c/4Ry4NK6fIZtCSMtyZzx2JIRMVqhHIad+nHqytZ1W6megry2KkmiBO6/n98rY/69fENytXk3Dic0F4pMO0EDCTDAhGxbtCqqteYjKN5CWtiqiHH8+wWwwfM+cQpHtkHfxk//xGCiPVQtTlqsEbeXBgQpHj3bKmQZeIsbGW1Nh4ZVJNTPXMaNxZENv9V1dfRcw6xiFjvoEKyF9J2BGKoNKniNoxzD/V1FIyQlIYkh/6+FosP9fkff/oqvvP77uPmf3QPR++5wvrQz1CnkFgk0fQBqG3ixsI3rQMxkFyIcvdssqinwrXlmkJZ4ueldzxLLy0o3rfPhmAbMM6vomxb5GCoAHCCwnhPyIhb2E4hZXUyUpfBI71LbT5iRGCq302jv+2a35BJrikz5dyJLYVWhaF0yCEsq6PmTYemOmdgKuRo7wobVidUSmo/T5GyL+aQal6ojbkKokasS3LvHRBlWXnyNsdbDdVUa3EWRH3OFvpoyjpcsBgBOwQxAI4KG1szIbE7WZyTiY+BTwe2FNtouc2uuw3/8qa/xYde9B5e/pb/g8N/qkm3FON5apQOqkVsslrbAWw8tT56b+J6qapZTcieDcCr9W2oZ3GaCiz1T4C1zQ7fceVDfPLqfcw9ZgvqIHUOKYyx+V4e+KlzRNu+f5MNb77bNPY1vvc8BNTA3aQ2Z2W2UdpITSUhx4R1k3abS6pgusrXYHvkFsbjkKIRE3KAxlXIjDKB9cc4sbFoIEXPDTXeM4axcJ2pz4+hMR9uzZMhFRaJCFTsdh3fU01czC1EXIN4hanTPETWuQu1SMCO0TFAXERVCm31DS4OIhmWtq6A8+QqeopsoNn6i718vH8Jv/7GX2PlupTeyTJ4sNVqUTa1y1CTyesyZeMIbKbnD02gSDHFrG2IcwFr7InYuLe2GaNDPTjLn91/PTqF/n5huEvZDXQeLbZ8xPK0r9rcPEKau1gvklZzQlMej9ngBldxrnGVGWweTBjPJ1WcQ1rJ9VCtn8q9XwNOQRgvYnX435oig93g0phbh2zKBlJozP/Emvhbnc7Cz5sOyIcgvkzjFpqwgzt8ANa0+WvCXGgNWA4emQ3dy4W0ncMx+ArLxr6UorRMRCrgah/qKAdBmQl7vzTiZ25+M59/zS/zojffz8O/dh2dZw3jeQm27opiRI9qAm4kZkyT96ubqhaUcJ47ie9pmMLq71nnMLY1czW4hmQErLbINoV8zqDbVuGlxpPXxtJRDMT+DWqbeNoQPTlqnBMqBDZVHnbvNs0yM3Ff9JnPwHBZWcXkSLs8kYQUdt5no2LJtxm4e6B3GrJIou4y7F3u3YXVZozFoXh8EVc34cPgLTdCUDYGUTHSK8RxETXdlXtME3FYZy8nYtQm2P3eRFb+XZ0/jeUWqhvOh4Nrtp2DGADPT4kxmCRBjAnpxwGMsqhUyioz9O4Pt/nwiy/j5w7/Id/28ms48Albj2Cwp6ql4AnDhHLMb6iyOZDzHS8VsHoq6rB9rLmvOaMY6nUdGv351vSXSPuQbdp6CkaEsmcY7oLWugS2NNYv1HQpnmKeJ4DESlFoUDep3jEoPb2+JKm/V42lnmKvD89IbJkAjKK7AtlGic5UJVLoav2CfqZm4q0mziIwB0eRqOc5DW/enSb6xUrBWC8V1jgmAlRIwDTur+kUzoZ8a2OO/vcbWxn7zMb1UrvOHYnzjzFcsM/CtLZjRAmAOLxX9V0R1tKKFirXTuasKMBwd8bsM2P+/VffyKJK+V9f9Qn6+5S1RLikKjozNtFrZKasZT6OPmtAG3ED27aI+tcA4SxsWxyUtJ3IMeFEBWRbhu4JIe0bescNnVNCa11C8FNgXeMxmUngriGPbQdZ/R6AXiKNeiySRIeviVEz+XlPxaif0L8CnRryWcN4zjDcLQyXFMVMYjOAJ0IcWxCC0orp61JDOJF1wDiKrr0JORadsiqhTcikPY3ji9aiZrJ1//s0AXF6eH9frQ/Xd8zFQDRfHrlGyHfCa1dF3901OrFimc4sNz3tuJC2IziGirJE7E+qkFxjMmVzBjidg5QGMpvApOgI+UzK7J+2+cxtC7xx7h7+2wtex97PWtNaLes3ZioHaoR6Lge3ueta7ajFECmVyDKhcPRsYFNUiDZdrG2f1n1MEfIZl6ost1GHPqW+zRBN1ZFQ20wxZQ3Pi5Ff/D8RpaTayLXgtCkcQaCUJl7L+nyHHJFT3ldw+SSUYWMGim5C+4yrlp1JKGvnn2kRj1X+6tQqJXWU9TRwDRK5yrvHxzqApuK3jliq32JY8CJCbPEJiDi8VIOj2e4Z/tqGeCUu6Mykk3PW1EF5q8ZEMFfzXS6w7QjEoFsKkyWoYYHuZugsQeUl3sfbaLuzVGkwPnGnK0+Xzyrmn8r5ya98P198xa8xd2id9vocyTCl6Eb5/kwd6P1qBM3yxA6tXTZ93FEyWHtx1L+ytngfO2CINlw0jhpwetEyZmvd/9k69E6VdE7b6NLxQspwUYUgKmkCX0yd6688gfCa71jTB0yZh6Z1JpyPMV74ncnmdQH+8hwrhmDfe7RkdSrZpt3Iw2WFt8B4amqRVpQ5u9m9kYl5PWc7y1rXrBAmmpum+HcW8eGsz4vnN5m4svptom+p/TbVkjTt/3O0HYEYyrawfvUcs08NrEUCiwG96GASCxg+5FhckE06tNcmgxLumWP48pLDi6tsjWeQwtZpUBtVmjNqsGL7sJuoIgFTRYft5ImYihpqugojWE6niZDi36ctnltn73Xoz3XOaGaeHoIIo6UWw2XFaLHBLUwbYmzWi7mh6LW2s9g0r50mhZjov0r56eYSUx9ajBDijRXNnSqd+JdUUbNG4fw1ojEZLIIrBJOaQGXr/gzUNvF271u7/iwt+EA0XslE73HeGzDmFBrPP5suKJ67GuI39TX6RriEuO0IxKAzOHOdouj2WHhkSLoxAq0pZ9rWrltqixwcorCbvlIkDfe06J40vPPMbVw6c4a75y+1eoZeCRuNV4woeJ3HM9HixjzwWWb4bJMvFeIJa+cB1ANANCQgKPFUCdmmob1uRSejoH2mwCihf7DDYFkYLVW5GLYbl+W2qDly1dj9bca/ndVGYFK8mrKZJPozLYvRNEoZHMtcjsqya+ejbAvpwJAMYbRkkwUnQ9AtQbeM9UPw+oGpSJ2avqCmfLzQzePFqrjF8RDRsa3Dkr+8OQfnwaHWxtFE3H4sMXK5kD4bbUcgBgzkc5qNyxVlq8PSQ0LrqTOodoZOFT4dlhhIhyX5TEo6dApFZ/ftnDH8ybEb+M79D5L1NbvvKdm6LKGYMahxPHsNwPfUXoehBK12uDZqNS7ZUC1GQ0yI6xdOULH42dWttazOqhB039De1CQjizHGiy1GcxYplB22186bqmPTyIpdE2emmVSnAHNt/CE5bfQK0xBNU4xp5FCY9l2nhIQ3ZcsW5NUpqLGrDeKctGy8iam4htCXBMwXTMlNL89ItzAxXWdTxW/H9ke+K15cFE3dpHiuPqdxD9vd4pF9zHXRQERNse8C+vdtRyAGwW6kfMawfhUUMx12yzKtlQFpf4xupVZmV6BGJRmQz6YYEdK+pugpEm04+tBe2P8g/d0pe/70UZYPX8mZG7w4ss3kuAmtKd2msfnbNJ/FuNlfzfY9hVUPL974X2egW1bplvaFbuFMtokVofI5YbwY5ceMBlshPFN7L+8R54dXDT4aM/XvMaB5gK/93njnCT3HxExVLypxxzQ2pAJfH9Qm77FIsOg5hXLLZg/HVElXfMkBr5MKyCBOvefWJPgxxAh+4oWmDD020U5rse6BKUi70bb1cznfTezfKb52im4oXPutiBggWkCBwV7Dsze3WXw4oXusj4wLZKAxWWJ1DEocFbVFbYuOdRFePqI4+pIlFt5ylLXNy1m+f8D6ld1QFLVmcWhS/kbbVpqIdRFTNNv+XWI7+NRnxADgvzvgksIWjTECZcuutjXXUreVF95Xw4ssZmJDVtYQMwFxNaoPNQCK58iLONL4vfZ+nKU1f/QUPXquaIOJuS8hFBAyiS0oI9oiTc8tqIGi6BlwXFEyqsLePdKoxSpApQeash7b/b/dRm36H9R0Gmr7+yCau+1ErOa5mBto3uc4p6Z79ln7PUfbGX4Mpgpv9p/DZcOpW1JO3TbHePcMlDYFGICUNnFo2i9RY23rSiQwe6zgY3e+kHdc/mH4R6c4c22X1poEyi1lxd77NqHFddjWiwCq9O61/nCus7l3oaWWONUrDUOizjghbMkkpYiRArbPbAtmj2q6Z7TTsdhgsqJnEaG3tOi2rd5czWPkDhy7C8cvK2ZCvKlxMM0jOm/iLrejbA2OqYmApflbQD6CKmxJQZXbNcvnrK7BByt5s6nklnsoeoZiOSe9cpOyY0i3nOUCW/49iULmfULe2ueUpLdhTE035rNxC4332VZXHb+/b5Hb9ITYM21zx0ih8VnrIxZjPRd1Ae2ciEFEDovIJ0TkayJyn4j8uDv/r0XkaRE54o47onv+uYg8LCIPish3nXMUhlBn0m9AW98QhruEtStaDA/NWpPmuESNCyS38fuqMGSbJenQbp5Dn4Cfvvf7+FdX/yErrxvaVPLDyqQXZP8IIMJkN7GzkfrCbZM5OWR+9oiiqL7HWX1jwJGoz+AcM66uSweG9pmcbLMg6ReUbZtKvaZo8+/TAIS4b48Qw1HIBCKLM1lP2zRhk0xBILGDU8wd+fcK79jsN5oPVThEO6qqTQVEgPX67Jw2tNYg6QvtM0K6JWRXbjC7q29Lz6eG0ZJhcElBXHU8vOPYpsRTuTV7x4fPUh2vaYy8wlxOIwLNc3HOyAgRTMRfTNkDTZ1IbTy6fi5GXnFcBtF8e5j0a3wh7XxEiQL4KWPMl0VkDrhLRP7M/faLxpj/FF8sIjcAPwDcCBwE/lxErjXGbOt47AGpiSE9gIyWBJNmzGaK3tHNyqSZKKTQpKXBjKzvaOvMiOHvL/H2rR/ClIoiVtL5CS+ltvAmUvr58QSgzZloNbOXbsitETWdYJfdJR4wmgVaxBAqWFmvTRWSlxSzCWVLLCUcWR5WJ/XnTRujjpyPJvQHDZHKj7O5DjWPRX+LVPfHMnxwHfbKXC+bO8Bs6lcgusex4cG13ItkpeMkx9Y6YbM8CYURlnoDjj20gBLQlw05vHuVEyv7g5WjQlImbFgTIbUwFL8wUfKTOLntRHTldqJm3KbNr39Mcz38GBrrWk14NVfeaav2KLP9/38lVgljzDHgmPu+ISL3A4fOcsubgA8YY0bAYyLyMPBS4HNnf1D9ZYJM6DZe0RG29ieU7Tl6x4YkW2MUBbqTYbCUwCih7GXMPTWm9fvOrLds/RmSodTy88duxCYGluaExwARy90xixaxaoELjBc+uj/2wmsupsqNrdWoXF2MjkJMGmosWBHK3qeKahPZnBNSc1X2z0v7jWmeBtANBFYTHWJvx0i+rTk8KSr9SOzyHT2zaQGYkJHj+TGOWyiq5yc5iDYkG1bfonJDfnSG1YNzzI5AFYZ13eFovkxvXWzQGfaeJqu/nVwvGoKHbBinTL/2PDZbTdc05V2nNlOZVCfWyrj3wa13DR7NRN8+D4P6BmInLkj5KCKXA7cCdwKvAn5MRN4CfAnLVZzBIo3PR7cdZQoiEZG3AW8DyOaXpge3xBTIWLfgfCZBZ11mjimS9bGFIqXwMehl2/raiza0NqCYEfTARiHGm7kWX1A2NsE0oG2MyVO3CYBv3Df194jyxvKkzmzsg0lgtOjHY0WFZGRZDinteMvMAlAydnkRxQRK6w8xVtYOz483e3M9Gu/Z1GxPyL+u+QpYvrbHBJKhotzRq9fmpDaX0Xz433VqIzBFC0UX5p4qaa2OmHmoz8K9KeN9M5RthRqnjE62Q8RpSA8XPb9ecJZJZE81DjummFo150jc9TF5ji6fhhDitp2OxnOcjX5qFq6JBasQUXzjhVjY4nbeiEFEZoHfBX7CGLMuIr8K/Bs31H8D/Dzwv5xvf8aYdwLvBOjuP2xUPkmFAtVRVDVJFAx2K3TaZu4pa740GYDgU4Gp3Ng6jkBr3ZCMqlx8NdnRT5gTY4J35BSqWptgf39zs0+hwLWowmluytH1YoBpYg2Qt6Viq0uXRqy0Nv5piMzb0ouOqVtQoIYg42dMbc3fIvY6Ns15TsEjnibyMdP6cs/2CFLlxooMnmKqKijLj7XoCv09KfmsItndsUlkxaa4ywYGVuw1thS8x8Cm8tvwyLFRFsBmDWvM4RSiUIeNCvFMvWfa/DYR33Yig/8TwVTTkjFVXG1wDd+AFAGcJ2IQkQyLFH7TGPN7AMaYE9Hvvwb8kfv3aeBwdPsl7tz2zQNuk0LVFq46rxMYzSuy5RadUyMXT18tdDLSiBbSoaBKxRigJfU8i75rVQfwpgkqjGPaAm4HQP7niG1uUsftApL89c1NFDaarSRfReG5ZLA1WT+mLO4hNYWk8UgloqjRZpxqcfDAqCqImzrmaaJCPP4GRQ1r4kWxBHQ0P2VL6tGZKfTbguikchvX1SY1EuWmFP8Mqb1bvLHC0KMK6D6H4jQCsR0XMI3g1GBtCoKdaukwU841+9gG7ppj+0Z0C76dEzGIiADvAu43xvxCdP6A0z8A/C3gXvf9Q8D7ROQXsMrHa4AvnPUZNBDBtBa9dJLbdG/9vQpo0z6TV4DqE19qwbg6l2oMydDYzM0t21ez4OfEYjao8JS9Wm1yqb7H54kAHOrnJihqHGbbYHHj52GoRAafKbmReLZ2X7whPdBqZ4aNshXVlIXNMRHdG1MlU0c22yGTZr/hXPSbHVe0U6UxX1GuC6/LqFl8kPrYYNLk2BxXzA36nxqV0o3UP6ExD8252I77aiLKbYjCtC0w4W8yrZ1l/v+qErW8CvgHwD0icsSd+xfA3xORW+yQeBz4xwDGmPtE5LeBr2F10W8/m0XCjryBXafMQF3MqJK1DJcUySgJAVe42oZqpGmtFrTaCePFlOFiYusxFDZe3aTUMW+8oFM2p5dTa9r5CIADB+eoYPC0bGr0Yy7Cy+QxAhGs/79MPs9uYvtD2CzxXNXco91nzPFgx0YCJjP138PkTudqAlcRrZP1PSDkhDhvAGwgjCD3x0i6wULXNqgywRVe5fWNauL7/PptR+Ubp6dp8qugvUmEWEMGZsr90ziv6OF1fQDV5m7AYnNMU9tZENK2Xr9naWKeg2wv/7NNRE4BW8Czz/dYzqPt5ltjnPCtM9aL43zu27SxXmaM2XM+N+8IxAAgIl8yxtz+fI/jXO1bZZzwrTPWi+N87tv/7Fh3hkv0xXaxXWw7ql1EDBfbxXaxTbSdhBje+XwP4Dzbt8o44VtnrBfH+dy3/6mx7hgdw8V2sV1sO6ftJI7hYrvYLrYd0p53xCAif92FZz8sIu94vsfTbCLyuIjc40LLv+TOLYvIn4nIQ+5z6XkY16+LyEkRuTc6N3VcYtt/cXP8VRG5bQeM9bkL23/uxrldioEdNa/fnFQIxjxvBzZp+CPAlUALuBu44fkc05QxPg7sbpz7OeAd7vs7gP/4PIzrNcBtwL3nGhdwB/ARrLvMy4E7d8BY/zXw01OuvcHBQRu4wsFH8k0a5wHgNvd9Dvi6G8+OmtezjPM5m9Pnm2N4KfCwMeZRY8wY+AA2bHuntzcB73Hf3wO8+Zs9AGPMp4CVxuntxvUm4L3Gts8DiyJy4JsyULYd63btTbiwfWPMY4AP2/8rb8aYY8aYL7vvG4BPMbCj5vUs49yuXfCcPt+I4RDwVPT/1BDt57kZ4KMicpcLFQfYZ6o4kePAvudnaBNtu3Ht1Hn+MceC/3okju2IsTZSDOzYeW2ME56jOX2+EcO3Qnu1MeY24I3A20XkNfGPxvJqO860s1PHFbVfBa4CbsEmAvr553U0UWumGIh/20nzOmWcz9mcPt+I4cJDtL/JzRjztPs8CXwQy4Kd8Cyj+zz5/I2w1rYb146bZ2PMCWNMaYzRwK9RsbbP61inpRhgB87rdqkQnqs5fb4RwxeBa0TkChFpYXNFfuh5HlNoIjLj8lwiIjPAG7Dh5R8C/qG77B8Cf/D8jHCibTeuDwFvcVr0lwNrEWv8vLSGLN4M2/8BEWmLyBWcR9j+czimqSkG2GHzut04n9M5/WZoUc+hYb0Dq1V9BPiXz/d4GmO7EqvNvRu4z48P2AV8DHgI+HNg+XkY2/ux7GKOlRl/ZLtxYbXm/4+b43uA23fAWP8/N5avOsA9EF3/L91YHwTe+E0c56uxYsJXgSPuuGOnzetZxvmczelFz8eL7WK72Cba8y1KXGwX28W2A9tFxHCxXWwX20S7iBgutovtYptoFxHDxXaxXWwT7SJiuNgutottol1EDBfbxXaxTbSLiOFiu9gutol2ETFcbBfbxTbR/n+VkZtjjmoCUgAAAABJRU5ErkJggg==\n"},"metadata":{"needs_background":"light"}},{"execution_count":13,"output_type":"execute_result","data":{"text/plain":"(torch.Size([26, 256, 256]),\n array([4.1900002e+01, 2.0080000e+01, 5.4000002e-01, 5.9999999e-02,\n        2.5269000e+02, 2.6231000e+02, 9.2000002e-01, 8.9999998e-01,\n        4.0369999e+01, 1.9879999e+01, 6.6000003e-01, 7.0000000e-02,\n        1.3670000e+02, 8.8919998e+01, 8.9999998e-01, 8.8999999e-01,\n        1.5430166e+00, 0.0000000e+00], dtype=float32),\n 0.0)"},"metadata":{}}]},{"cell_type":"code","source":"class Model(nn.Module):\n    def __init__(self):\n        super(Model, self).__init__()\n        self.backbone = timm.create_model(CFG['model'], pretrained=False, num_classes=500, in_chans=13)\n        self.mlp = nn.Sequential(\n            nn.Linear(18, 64),\n            nn.LayerNorm(64),\n            nn.ReLU(),\n            nn.Dropout(0.2),\n            # nn.Linear(64, 64),\n            # nn.LayerNorm(64),\n            # nn.ReLU(),\n            # nn.Dropout(0.2)\n        )\n        self.fc = nn.Linear(64+500*2, 1)\n\n    def forward(self, img, feature):\n        b, c, h, w = img.shape\n        img = img.reshape(b*2, c//2, h, w)\n        img = self.backbone(img).reshape(b, -1)\n        feature = self.mlp(feature)\n        y = self.fc(torch.cat([img, feature], dim=1))\n        return y","metadata":{"execution":{"iopub.status.busy":"2023-04-16T03:29:15.886819Z","iopub.execute_input":"2023-04-16T03:29:15.887218Z","iopub.status.idle":"2023-04-16T03:29:15.897953Z","shell.execute_reply.started":"2023-04-16T03:29:15.88716Z","shell.execute_reply":"2023-04-16T03:29:15.896844Z"},"trusted":true},"execution_count":14,"outputs":[]},{"cell_type":"code","source":"test_set = MyDataset(test_filtered, valid_aug, 'test')\ntest_loader = DataLoader(test_set, batch_size=CFG['valid_bs'], shuffle=False, num_workers=CFG['num_workers'], pin_memory=True)\n\nmodel = Model().to(device)\nmodel.load_state_dict(torch.load('/kaggle/input/nfl-exp1/resnet50_fold0.pt'))\n\nmodel.eval()\n    \ny_pred = []\nwith torch.no_grad():\n    tk = tqdm(test_loader, total=len(test_loader))\n    for step, batch in enumerate(tk):\n        if(step % 4 != 3):\n            img, feature, label = [x.to(device) for x in batch]\n            output1 = model(img, feature).squeeze(-1)\n            output2 = model(img.flip(-1), feature).squeeze(-1)\n            \n            y_pred.extend(0.15*(output1.sigmoid().cpu().numpy()) + 0.85*(output2.sigmoid().cpu().numpy()))\n        else:\n            img, feature, label = [x.to(device) for x in batch]\n            output = model(img.flip(-1), feature).squeeze(-1)\n            y_pred.extend(output.sigmoid().cpu().numpy())    \n\ny_pred = np.array(y_pred)","metadata":{"execution":{"iopub.status.busy":"2023-04-16T03:29:15.899604Z","iopub.execute_input":"2023-04-16T03:29:15.900304Z","iopub.status.idle":"2023-04-16T03:47:11.284807Z","shell.execute_reply.started":"2023-04-16T03:29:15.900263Z","shell.execute_reply":"2023-04-16T03:47:11.282999Z"},"trusted":true},"execution_count":15,"outputs":[{"name":"stderr","text":"100%|██████████| 104/104 [17:50<00:00, 10.29s/it]\n","output_type":"stream"}]},{"cell_type":"code","source":"test_filtered['contact'] = y_pred\n\nsub = pd.read_csv('/kaggle/input/nfl-player-contact-detection/sample_submission.csv')\n\nsub = sub.drop(\"contact\", axis=1).merge(test_filtered[['contact_id', 'contact']], how='left', on='contact_id')\nsub['contact'] = sub['contact'].fillna(0)#.astype('int')\n\nsub[[\"contact_id\", \"contact\"]].to_csv(\"cnn_output.csv\", index=False)\n\nsub.head()","metadata":{"execution":{"iopub.status.busy":"2023-04-16T03:47:11.286987Z","iopub.execute_input":"2023-04-16T03:47:11.287424Z","iopub.status.idle":"2023-04-16T03:47:11.459471Z","shell.execute_reply.started":"2023-04-16T03:47:11.287374Z","shell.execute_reply":"2023-04-16T03:47:11.458261Z"},"trusted":true},"execution_count":16,"outputs":[{"execution_count":16,"output_type":"execute_result","data":{"text/plain":"                   contact_id  contact\n0  58168_003392_0_38590_43854      0.0\n1  58168_003392_0_38590_41257      0.0\n2  58168_003392_0_38590_41944      0.0\n3  58168_003392_0_38590_42386      0.0\n4  58168_003392_0_38590_47944      0.0","text/html":"<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>contact_id</th>\n      <th>contact</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>0</th>\n      <td>58168_003392_0_38590_43854</td>\n      <td>0.0</td>\n    </tr>\n    <tr>\n      <th>1</th>\n      <td>58168_003392_0_38590_41257</td>\n      <td>0.0</td>\n    </tr>\n    <tr>\n      <th>2</th>\n      <td>58168_003392_0_38590_41944</td>\n      <td>0.0</td>\n    </tr>\n    <tr>\n      <th>3</th>\n      <td>58168_003392_0_38590_42386</td>\n      <td>0.0</td>\n    </tr>\n    <tr>\n      <th>4</th>\n      <td>58168_003392_0_38590_47944</td>\n      <td>0.0</td>\n    </tr>\n  </tbody>\n</table>\n</div>"},"metadata":{}}]},{"cell_type":"code","source":"a=list(globals().keys())\nfor key in a:\n    if not key.startswith(\"__\"):\n        globals().pop(key)\n\nimport gc,psutil,os\nfrom numba import cuda\ncuda.select_device(0)\ncuda.close()\n_ = gc.collect(2)\nprint(psutil.Process(os.getpid()).memory_info().rss/1024/1024)","metadata":{"execution":{"iopub.status.busy":"2023-04-16T03:47:11.46154Z","iopub.execute_input":"2023-04-16T03:47:11.462279Z","iopub.status.idle":"2023-04-16T03:47:13.062264Z","shell.execute_reply.started":"2023-04-16T03:47:11.462235Z","shell.execute_reply":"2023-04-16T03:47:13.061257Z"},"trusted":true},"execution_count":17,"outputs":[{"name":"stdout","text":"2955.4375\n","output_type":"stream"}]},{"cell_type":"code","source":"import psutil\nimport os\nimport gc\nimport subprocess\n\nimport numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\nimport matplotlib.patches as patches\nfrom IPython.display import Video, display\n\nfrom scipy.optimize import minimize\nimport cv2\nfrom glob import glob\nfrom tqdm import tqdm\n\nfrom sklearn.model_selection import GroupKFold\nfrom sklearn.metrics import (\n    roc_auc_score,\n    matthews_corrcoef,\n)\n\nimport xgboost as xgb\n\nimport torch\n\nif torch.cuda.is_available():\n    import cupy \n    import cudf\n    from cuml import ForestInference\n\ndef setup(cfg):\n    cfg.device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')\n    \n    # set dirs\n    cfg.INPUT = f'../input/{cfg.COMPETITION}'\n    cfg.EXP = cfg.NAME\n    cfg.OUTPUT_EXP = cfg.NAME\n    cfg.SUBMISSION = './'\n    cfg.DATASET = '../input/'\n\n    cfg.EXP_MODEL = os.path.join(cfg.EXP, 'model')\n    cfg.EXP_FIG = os.path.join(cfg.EXP, 'fig')\n    cfg.EXP_PREDS = os.path.join(cfg.EXP, 'preds')\n\n    # make dirs\n    for d in [cfg.EXP_MODEL, cfg.EXP_FIG, cfg.EXP_PREDS]:\n        os.makedirs(d, exist_ok=True)\n        \n    return cfg\n\nclass Config:\n    AUTHOR = \"colum2131\"\n\n    NAME = \"NFLC-\" + \"Exp001-simple-xgb-baseline\"\n\n    COMPETITION = \"nfl-player-contact-detection\"\n\n    seed = 42\n    num_fold = 5\n    \n    xgb_params = {\n        'objective': 'binary:logistic',\n        'eval_metric': 'auc',\n        'learning_rate':0.03,\n        'tree_method':'hist' if not torch.cuda.is_available() else 'gpu_hist',\n        \"max_depth\":10,\n        \"subsample\":0.7,\n        \"colsample_bytree\":0.8,\n        \"lambda\":10,\n        #\"gamma\":5, \n        \"max_delta_step\":1,\n        \"max_bin\":512,\n    }\ncfg = setup(Config)","metadata":{"execution":{"iopub.status.busy":"2023-04-16T03:47:13.063753Z","iopub.execute_input":"2023-04-16T03:47:13.065465Z","iopub.status.idle":"2023-04-16T03:47:15.290981Z","shell.execute_reply.started":"2023-04-16T03:47:13.065426Z","shell.execute_reply":"2023-04-16T03:47:15.289953Z"},"trusted":true},"execution_count":18,"outputs":[]},{"cell_type":"code","source":"# ==============================\n# function\n# ==============================\n# ref: https://www.kaggle.com/code/robikscube/nfl-player-contact-detection-getting-started\ndef add_contact_id(df):\n    # Create contact ids\n    df[\"contact_id\"] = (\n        df[\"game_play\"]\n        + \"_\"\n        + df[\"step\"].astype(\"str\")\n        + \"_\"\n        + df[\"nfl_player_id_1\"].astype(\"str\")\n        + \"_\"\n        + df[\"nfl_player_id_2\"].astype(\"str\")\n    )\n    return df\n\ndef expand_contact_id(df):\n    \"\"\"\n    Splits out contact_id into seperate columns.\n    \"\"\"\n    df[\"game_play\"] = df[\"contact_id\"].str[:12]\n    df[\"step\"] = df[\"contact_id\"].str.split(\"_\").str[-3].astype(\"int\")\n    df[\"nfl_player_id_1\"] = df[\"contact_id\"].str.split(\"_\").str[-2]\n    df[\"nfl_player_id_2\"] = df[\"contact_id\"].str.split(\"_\").str[-1]\n    return df\n\n# cross validation\ndef get_groupkfold(train, target_col, group_col, n_splits):\n    kf = GroupKFold(n_splits=n_splits)\n    generator = kf.split(train, train[target_col], train[group_col])\n    fold_series = []\n    for fold, (idx_train, idx_valid) in enumerate(generator):\n        fold_series.append(pd.Series(fold, index=idx_valid))\n    fold_series = pd.concat(fold_series).sort_index()\n    return fold_series\n\n# xgboost code\ndef fit_xgboost(cfg, X, y, params, add_suffix=''):\n    \"\"\"\n    xgb_params = {\n        'objective': 'binary:logistic',\n        'eval_metric': 'auc',\n        'learning_rate':0.01,\n        'tree_method':'gpu_hist'\n    }\n    \"\"\"\n    oof_pred = np.zeros(len(y), dtype=np.float32)\n    for fold in sorted(cfg.folds.unique()):\n        if fold == -1: continue\n        idx_train = (cfg.folds!=fold)\n        idx_valid = (cfg.folds==fold)\n        x_train, y_train = X[idx_train], y[idx_train]\n        x_valid, y_valid = X[idx_valid], y[idx_valid]\n        #input(len(x_train.groupby(\"game_play\")))\n        \n        display(pd.Series(y_valid).value_counts())\n\n        xgb_train = xgb.DMatrix(x_train, label=y_train)\n        xgb_valid = xgb.DMatrix(x_valid, label=y_valid)\n        evals = [(xgb_train,'train'),(xgb_valid,'eval')]\n\n        model = xgb.train(\n            params,\n            xgb_train,\n            num_boost_round=10_000,\n            early_stopping_rounds=100,\n            evals=evals,\n            verbose_eval=100,\n        )\n\n        model_path = os.path.join(cfg.EXP_MODEL, f'xgb_fold{fold}{add_suffix}.model')\n        model.save_model(model_path)\n        if not torch.cuda.is_available():\n            model = xgb.Booster().load_model(model_path)\n        else:\n            model = ForestInference.load(model_path, output_class=True, model_type='xgboost')\n        pred_i = model.predict_proba(x_valid)[:, 1]\n        oof_pred[x_valid.index] = pred_i\n        score = round(roc_auc_score(y_valid, pred_i), 5)\n        print(f'Performance of the prediction: {score}\\n')\n        del model; gc.collect(2)\n\n    np.save(os.path.join(cfg.EXP_PREDS, f'oof_pred{add_suffix}'), oof_pred)\n    score = round(roc_auc_score(y, oof_pred), 5)\n    print(f'All Performance of the prediction: {score}')\n    return oof_pred\n\ndef pred_xgboost(X, data_dir, add_suffix=''):\n    models = glob(os.path.join(data_dir, f'xgb_fold*{add_suffix}.model'))\n    if not torch.cuda.is_available():\n         models = [xgb.Booster().load_model(model_path) for model in models]\n    else:\n        models = [ForestInference.load(model, output_class=True, model_type='xgboost') for model in models]\n    preds = np.array([model.predict_proba(X)[:, 1] for model in models])\n    preds = np.mean(preds, axis=0)\n    return preds","metadata":{"execution":{"iopub.status.busy":"2023-04-16T03:47:15.292506Z","iopub.execute_input":"2023-04-16T03:47:15.292904Z","iopub.status.idle":"2023-04-16T03:47:15.316106Z","shell.execute_reply.started":"2023-04-16T03:47:15.292864Z","shell.execute_reply":"2023-04-16T03:47:15.315078Z"},"trusted":true},"execution_count":19,"outputs":[]},{"cell_type":"code","source":"\n\nif not torch.cuda.is_available():\n    tr_tracking = pd.read_csv(os.path.join(cfg.INPUT, 'train_player_tracking.csv'), parse_dates=[\"datetime\"])\n    te_tracking = pd.read_csv(os.path.join(cfg.INPUT, 'test_player_tracking.csv'), parse_dates=[\"datetime\"])\n    sub = pd.read_csv(os.path.join(cfg.INPUT, 'sample_submission.csv'))\n\n    train = pd.read_csv(os.path.join(cfg.INPUT, 'train_labels.csv'), parse_dates=[\"datetime\"])\n    test = expand_contact_id(sub)\n    \nelse:\n    tr_tracking = pd.read_csv(os.path.join(cfg.INPUT, 'train_player_tracking.csv'), parse_dates=[\"datetime\"]).sort_values(\"datetime\")\n    te_tracking = pd.read_csv(os.path.join(cfg.INPUT, 'test_player_tracking.csv'), parse_dates=[\"datetime\"]).sort_values(\"datetime\")\n    sub = pd.read_csv(os.path.join(cfg.INPUT, 'sample_submission.csv'))\n\n    train = cudf.read_csv(os.path.join(cfg.INPUT, 'train_labels.csv'), parse_dates=[\"datetime\"])\n    test = cudf.DataFrame(expand_contact_id(sub))\n\ntrain[\"is_test\"]=0\ntest[\"is_test\"]=1\ntest[\"contact\"]=-1\ntest = add_contact_id(test)\n\ncols = ['x_position','y_position','speed','distance','direction','orientation','acceleration','sa']\n\nfeature_cols=[]\n\nmain_data=[tr_tracking,te_tracking]\nfor j in [0,1]:\n    data=main_data[j]\n    data[\"game_play_player_id\"]=data[\"game_play\"]+\"_\"+data[\"nfl_player_id\"].astype(\"str\")\n    a=data.groupby(\"game_play_player_id\")\n    \n    for i in [16,32]:\n        for k in cols:\n            k_name=f\"{k}_mean{i}\"\n            data[k_name]=a[k].rolling(i).mean().reset_index(0,drop=True)\n            feature_cols.append(k_name)\n            k_name=f\"{k}_std{i}\"\n            data[k_name]=a[k].rolling(i).std().reset_index(0,drop=True)\n            feature_cols.append(k_name)\n            k_name=f\"{k}_max{i}\"\n            data[k_name]=a[k].rolling(i).max().reset_index(0,drop=True)\n            feature_cols.append(k_name)\n            k_name=f\"{k}_min{i}\"\n            data[k_name]=a[k].rolling(i).min().reset_index(0,drop=True)\n            feature_cols.append(k_name)\n    main_data[j]=cudf.DataFrame.from_pandas(data)\n    \ntr_tracking,te_tracking=main_data\ndel data,a,main_data\n\n\nfeature_cols=list(set(feature_cols))\ntr_tracking[feature_cols]=tr_tracking[feature_cols].astype(\"float32\")\nte_tracking[feature_cols]=te_tracking[feature_cols].astype(\"float32\")\n\n#print(tr_tracking[feature_cols])\n_ = gc.collect(2)\nprint(psutil.Process(os.getpid()).memory_info().rss/1024/1024)","metadata":{"execution":{"iopub.status.busy":"2023-04-16T03:47:15.31805Z","iopub.execute_input":"2023-04-16T03:47:15.318509Z","iopub.status.idle":"2023-04-16T03:48:24.730098Z","shell.execute_reply.started":"2023-04-16T03:47:15.318456Z","shell.execute_reply":"2023-04-16T03:48:24.728222Z"},"trusted":true},"execution_count":20,"outputs":[{"name":"stdout","text":"4245.56640625\n","output_type":"stream"}]},{"cell_type":"code","source":"\ndef create_features(df, tr_tracking, merge_col=\"step\", use_cols=[\"x_position\", \"y_position\"]):\n    output_cols = []\n    df_combo = (\n        df.astype({\"nfl_player_id_1\": \"str\"})\n        .merge(\n            tr_tracking.astype({\"nfl_player_id\": \"str\"})[\n                [\"game_play\", merge_col, \"nfl_player_id\",] + use_cols\n            ],\n            left_on=[\"game_play\", merge_col, \"nfl_player_id_1\"],\n            right_on=[\"game_play\", merge_col, \"nfl_player_id\"],\n            how=\"left\",\n        )\n        .rename(columns={c: c+\"_1\" for c in use_cols})\n        .drop(\"nfl_player_id\", axis=1)\n        .merge(\n            tr_tracking.astype({\"nfl_player_id\": \"str\"})[\n                [\"game_play\", merge_col, \"nfl_player_id\"] + use_cols\n            ],\n            left_on=[\"game_play\", merge_col, \"nfl_player_id_2\"],\n            right_on=[\"game_play\", merge_col, \"nfl_player_id\"],\n            how=\"left\",\n        )\n        .drop(\"nfl_player_id\", axis=1)\n        .rename(columns={c: c+\"_2\" for c in use_cols})\n        .sort_values([\"game_play\", merge_col, \"nfl_player_id_1\", \"nfl_player_id_2\"])\n        .reset_index(drop=True)\n    )\n    output_cols += [c+\"_1\" for c in use_cols]\n    output_cols += [c+\"_2\" for c in use_cols]\n    \n    if (\"x_position\" in use_cols) & (\"y_position\" in use_cols):\n        index = df_combo['x_position_2'].notnull()\n        if torch.cuda.is_available():\n            index = index.to_array()\n        distance_arr = np.full(len(index), np.nan)\n        tmp_distance_arr = np.sqrt(\n            np.square(df_combo.loc[index, \"x_position_1\"] - df_combo.loc[index, \"x_position_2\"])\n            + np.square(df_combo.loc[index, \"y_position_1\"]- df_combo.loc[index, \"y_position_2\"])\n        )\n        if torch.cuda.is_available():\n            tmp_distance_arr = tmp_distance_arr.to_array()\n        distance_arr[index] = tmp_distance_arr\n        df_combo['distance'] = distance_arr\n        output_cols += [\"distance\"]\n        \n    df_combo['G_flug'] = (df_combo['nfl_player_id_2']==\"G\")\n    output_cols += [\"G_flug\"]\n    return df_combo, output_cols\n\n\nuse_cols = [\n    'x_position', 'y_position', 'speed', 'distance',\n    'direction', 'orientation', 'acceleration', 'sa'\n]+feature_cols\ntrain, feature_cols = create_features(train, tr_tracking, use_cols=use_cols)\ntest, feature_cols = create_features(test, te_tracking, use_cols=use_cols)\n\ndel tr_tracking,te_tracking\n_ = gc.collect(2)\nprint(psutil.Process(os.getpid()).memory_info().rss/1024/1024)","metadata":{"execution":{"iopub.status.busy":"2023-04-16T03:48:24.732347Z","iopub.execute_input":"2023-04-16T03:48:24.733069Z","iopub.status.idle":"2023-04-16T03:48:27.339152Z","shell.execute_reply.started":"2023-04-16T03:48:24.733025Z","shell.execute_reply":"2023-04-16T03:48:27.337904Z"},"trusted":true},"execution_count":21,"outputs":[{"name":"stdout","text":"4316.05078125\n","output_type":"stream"}]},{"cell_type":"markdown","source":"# Exclude distance > 2\nif the distance between two players is greater than 2 then the probability of contact is so low, we will consider it = 0, training data will be reduced from 4.7 M rows to 660 K","metadata":{}},{"cell_type":"code","source":"DISTANCE_THRESH = 2\ntrain=train.sort_values(\"contact_id\")\ntest=test.sort_values(\"contact_id\")\n\ntrain_y = train['contact'].to_pandas().copy().values\noof_pred = np.zeros(len(train))\ncond_dis_train = (train['distance'].to_pandas()<=DISTANCE_THRESH) | (train['distance'].to_pandas().isna())\ncond_dis_test = (test['distance'].to_pandas()<=DISTANCE_THRESH) | (test['distance'].to_pandas().isna())\n\ntrain = train[cond_dis_train]\ntrain.reset_index(inplace = True, drop = True)\n\nprint('number of train data : ',len(train))\n\n_ = gc.collect(2)\nprint(psutil.Process(os.getpid()).memory_info().rss/1024/1024)","metadata":{"execution":{"iopub.status.busy":"2023-04-16T03:48:27.341056Z","iopub.execute_input":"2023-04-16T03:48:27.341503Z","iopub.status.idle":"2023-04-16T03:48:28.606382Z","shell.execute_reply.started":"2023-04-16T03:48:27.341459Z","shell.execute_reply":"2023-04-16T03:48:28.605262Z"},"trusted":true},"execution_count":22,"outputs":[{"name":"stdout","text":"number of train data :  660553\n4389.1015625\n","output_type":"stream"}]},{"cell_type":"markdown","source":"# Helmet track Features","metadata":{}},{"cell_type":"code","source":"helmet_train = cudf.read_csv('/kaggle/input/nfl-player-contact-detection/train_baseline_helmets.csv')\nhelmet_test = cudf.read_csv('/kaggle/input/nfl-player-contact-detection/test_baseline_helmets.csv')\n#CLUSTERS = [10, 50, 100, 500]\nCLUSTERS = [8,32,128,512]\n#CLUSTERS = [8,16, 32,64, 128, 256,512]\n\ndef add_step_pct(df, cluster):\n    df['step_pct'] = cluster * (df['step']-min(df['step']))/(max(df['step'])-min(df['step']))\n    df['step_pct'] = df['step_pct'].apply(np.ceil).astype(np.int32)\n    return df\n\nmain_data=[train,test]\nhelmet_data=[helmet_train,helmet_test]\n\nfor i in [0,1]:\n    data=main_data[i].to_pandas()\n    helmet=helmet_data[i].to_pandas()\n    helmet.loc[helmet['view']=='Endzone2','view'] = 'Endzone'\n    helmet.rename(columns = {'frame': 'step'}, inplace = True)\n    \n    for cluster in CLUSTERS:\n        data = data.groupby('game_play').apply(lambda x:add_step_pct(x,cluster))\n        for helmet_view in ['Sideline', 'Endzone']:\n            \n            helmet_cache2=helmet.groupby('game_play').apply(lambda x:add_step_pct(x,cluster))\n            helmet_cache2=helmet_cache2[helmet_cache2['view']==helmet_view]\n            \n            helmet_cache2['helmet_id'] = helmet_cache2['game_play'] + '_' + helmet_cache2['nfl_player_id'].astype(str) + '_' + helmet_cache2['step_pct'].astype(str)\n\n            helmet_cache2 = helmet_cache2[['helmet_id', 'left', 'width', 'top', 'height']].groupby('helmet_id').mean().reset_index()\n            \n            for player_ind in [1, 2]:\n                data['helmet_id'] = data['game_play'] + '_' + data['nfl_player_id_'+str(player_ind)].astype(str) + \\\n                                        '_' + data['step_pct'].astype(str)\n\n\n                data = data.merge(helmet_cache2, how = 'left')\n\n                data.rename(columns = {i:i+'_'+helmet_view+'_'+str(cluster)+'_'+str(player_ind) for i in ['left', 'width', 'top', 'height']}, inplace = True)\n\n                del data['helmet_id']\n\n                feature_cols += [i+'_'+helmet_view+'_'+str(cluster)+'_'+str(player_ind) for i in ['left', 'width', 'top', 'height']]\n            del helmet_cache2\n            _ = gc.collect(2)\n            \n            \n    cache=data.groupby('game_play')[\"step\"]\n    data[\"step_rate\"]=cache.apply(lambda df:(df-min(df))/(max(df)-min(df)))\n    feature_cols += [\"step_rate\"]\n    main_data[i]=cudf.DataFrame.from_pandas(data)\n\ntrain,test=main_data\n\ndel main_data,helmet_data,data,helmet,helmet_train,helmet_test,cache\n_ = gc.collect(2)\nprint(psutil.Process(os.getpid()).memory_info().rss/1024/1024)","metadata":{"execution":{"iopub.status.busy":"2023-04-16T03:48:28.608089Z","iopub.execute_input":"2023-04-16T03:48:28.60851Z","iopub.status.idle":"2023-04-16T03:50:50.951421Z","shell.execute_reply.started":"2023-04-16T03:48:28.608472Z","shell.execute_reply":"2023-04-16T03:50:50.950167Z"},"trusted":true},"execution_count":23,"outputs":[{"name":"stdout","text":"4363.59765625\n","output_type":"stream"}]},{"cell_type":"markdown","source":"# add cnn feature","metadata":{}},{"cell_type":"code","source":"train_cnn_feature = cudf.read_csv('/kaggle/input/zzy-cnn-train-output/zzy_cnn_prid_data.csv')\ntrain_cnn_feature.rename(columns={\"contact\":\"cnn_feature\"}, inplace = True)\n\n\ntrain=train.merge(train_cnn_feature, how = 'left',on=\"contact_id\").sort_values(\"contact_id\").reset_index(drop=True)\nprint(np.corrcoef(train[\"cnn_feature\"].to_pandas(),train[\"contact\"].to_pandas())[0,1])\ncache=train[\"cnn_feature\"].to_pandas().to_numpy()\ncache[torch.randperm(len(train))[:int(len(train)//19)]]=0\ntrain[\"cnn_feature\"]=cache\nprint(np.corrcoef(train[\"cnn_feature\"].to_pandas(),train[\"contact\"].to_pandas())[0,1])\n\ndel train_cnn_feature\n\nif os.path.exists('/kaggle/working/cnn_output.csv'):\n    test_cnn_feature = cudf.read_csv('/kaggle/working/cnn_output.csv')\n    test_cnn_feature.rename(columns={\"contact\":\"cnn_feature\"}, inplace = True)\n    test=test.merge(test_cnn_feature, how = 'left',on=\"contact_id\").sort_values(\"contact_id\").reset_index(drop=True)\n    del test_cnn_feature\nelse :\n    print(\"test_cnn_feature have not load\")\n    \n\n\ntrain[\"cnn_feature\"]=train[\"cnn_feature\"]>0.4\ntest[\"cnn_feature\"]=test[\"cnn_feature\"]>0.29\nfeature_cols += [\"cnn_feature\"]\n_ = gc.collect(2)\nprint(psutil.Process(os.getpid()).memory_info().rss/1024/1024)","metadata":{"execution":{"iopub.status.busy":"2023-04-16T03:50:50.952908Z","iopub.execute_input":"2023-04-16T03:50:50.95337Z","iopub.status.idle":"2023-04-16T03:50:51.998541Z","shell.execute_reply.started":"2023-04-16T03:50:50.953333Z","shell.execute_reply":"2023-04-16T03:50:51.997256Z"},"trusted":true},"execution_count":24,"outputs":[{"name":"stdout","text":"0.7697179293171271\n0.7438046266461408\n4364.21875\n","output_type":"stream"}]},{"cell_type":"markdown","source":"# Fill missing values for the ground","metadata":{}},{"cell_type":"code","source":"main_data=[train,test]\nfor i in [0,1]:\n    data=main_data[i].to_pandas()\n    for cluster in CLUSTERS:\n        for helmet_view in ['Sideline', 'Endzone']:\n            data.loc[data['G_flug']==True,'left_'+helmet_view+'_'+str(cluster)+'_2'] = data.loc[data['G_flug']==True,'left_'+helmet_view+'_'+str(cluster)+'_1']\n            data.loc[data['G_flug']==True,'top_'+helmet_view+'_'+str(cluster)+'_2'] = data.loc[data['G_flug']==True,'top_'+helmet_view+'_'+str(cluster)+'_1']\n            data.loc[data['G_flug']==True,'width_'+helmet_view+'_'+str(cluster)+'_2'] = 0\n            data.loc[data['G_flug']==True,'height_'+helmet_view+'_'+str(cluster)+'_2'] = 0\n    main_data[i]=cudf.DataFrame.from_pandas(data)\ntrain,test=main_data","metadata":{"execution":{"iopub.status.busy":"2023-04-16T03:50:52.00065Z","iopub.execute_input":"2023-04-16T03:50:52.001081Z","iopub.status.idle":"2023-04-16T03:50:56.296286Z","shell.execute_reply.started":"2023-04-16T03:50:52.001038Z","shell.execute_reply":"2023-04-16T03:50:56.295254Z"},"trusted":true},"execution_count":25,"outputs":[]},{"cell_type":"markdown","source":"# Diffrence & Product features","metadata":{}},{"cell_type":"code","source":"main_data=[train,test]\nfor k in [0,1]:\n    data=main_data[k].to_pandas()\n    cols = [i[:-2] for i in train.columns if i[-2:]=='_1' and i!='nfl_player_id_1']\n    data[[i+'_diff' for i in cols]] = np.abs(data[[i+'_1' for i in cols]].values - data[[i+'_2' for i in cols]].values)\n    feature_cols += [i+'_diff' for i in cols]\n    \n    cols = ['x_position', 'y_position', 'speed', 'distance', 'direction', 'orientation', 'acceleration', 'sa']\n    data[[i+'_prod' for i in cols]] = data[[i+'_1' for i in cols]].values * data[[i+'_2' for i in cols]].values\n    feature_cols += [i+'_prod' for i in cols]\n    main_data[k]=cudf.DataFrame.from_pandas(data)\n\ntrain,test=main_data\n\n\n\nfeature_cols=list(set(feature_cols))\nprint('number of features : ',len(feature_cols))\nprint('number of train data : ',len(train))\n_ = gc.collect(2)\nprint(psutil.Process(os.getpid()).memory_info().rss/1024/1024)","metadata":{"execution":{"iopub.status.busy":"2023-04-16T03:50:56.298044Z","iopub.execute_input":"2023-04-16T03:50:56.298408Z","iopub.status.idle":"2023-04-16T03:51:03.21415Z","shell.execute_reply.started":"2023-04-16T03:50:56.298371Z","shell.execute_reply":"2023-04-16T03:51:03.212065Z"},"trusted":true},"execution_count":26,"outputs":[{"name":"stderr","text":"/opt/conda/lib/python3.7/site-packages/pandas/core/frame.py:3678: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead.  To get a de-fragmented frame, use `newframe = frame.copy()`\n  self[col] = igetitem(value, i)\n","output_type":"stream"},{"name":"stdout","text":"number of features :  324\nnumber of train data :  660553\n4637.859375\n","output_type":"stream"}]},{"cell_type":"code","source":"main_data=cudf.concat((train,test))\n\ndef normalization(x):\n    return (x-x.mean())/(x.std()+1e-9)\n\ndef show(cache):\n    index=cache[:,1].astype(np.float32).argsort()\n    cache=cache[index][::-1]\n    print(cache)\n\ndef get_point(train,feature_cols):\n    cache=[]\n    for key in feature_cols:\n        a=train[key].copy()\n        target=train[\"contact\"][~a.isna()]\n        a=a[~a.isna()]\n        a=np.corrcoef(a,target)[0,1]\n        cache.append([key,abs(a)])\n    cache=np.array(cache)\n    return cache\n\ndef fix_distributed(a):\n    a=normalization(a)\n    skew=(a**3).mean()\n    if skew<0:\n        a=-a\n        skew=-skew\n    i=0\n    while skew>0.6:\n        a=np.log(a-a.min()+1)\n        a=normalization(a)\n        skew=(a**3).mean()\n        if i==10:\n            break\n        i+=1\n        \n    kurt=(a**4).mean()\n    i=0\n    while kurt>3:\n        a=np.tanh(a/2)\n        a=normalization(a)\n        kurt=(a**4).mean()\n        if i==10:\n            break\n        i+=1\n\n    return a\n\n\ncache=get_point(train.to_pandas(),feature_cols)\nprint(cache[:,1].astype(np.float32).sum())\n\nfor key in tqdm(feature_cols):\n    a=main_data[key].to_pandas()\n    main_data[key]=fix_distributed(a).astype(\"float16\")\n\ntrain=main_data[main_data[\"is_test\"]==0]\ntest=main_data[main_data[\"is_test\"]==1]\n\ncache=get_point(train.to_pandas(),feature_cols)\n\nindex=cache[:,1].astype(np.float32).argsort()\npoints=cache[index][::-1]\n\n\ndel main_data,a\n_ = gc.collect(2)\nprint(points[:,1].astype(np.float32).sum())\nprint(psutil.Process(os.getpid()).memory_info().rss/1024/1024)\nprint(points[:30])","metadata":{"execution":{"iopub.status.busy":"2023-04-16T03:51:03.215837Z","iopub.execute_input":"2023-04-16T03:51:03.216256Z","iopub.status.idle":"2023-04-16T03:52:04.000735Z","shell.execute_reply.started":"2023-04-16T03:51:03.216188Z","shell.execute_reply":"2023-04-16T03:52:03.999636Z"},"trusted":true},"execution_count":27,"outputs":[{"name":"stdout","text":"20.254223\n","output_type":"stream"},{"name":"stderr","text":"100%|██████████| 324/324 [00:41<00:00,  7.82it/s]\n","output_type":"stream"},{"name":"stdout","text":"26.291609\n4638.80078125\n[['cnn_feature' '0.691583960033721']\n ['distance' '0.5451771844924183']\n ['y_position_diff' '0.31902659835122904']\n ['orientation_mean32_diff' '0.26898531285596305']\n ['width_Endzone_512_2' '0.264008873769464']\n ['height_Endzone_512_2' '0.2639868395277524']\n ['width_Sideline_512_2' '0.25637196843119353']\n ['height_Sideline_512_2' '0.25533307093084967']\n ['height_Endzone_128_2' '0.2536208266043178']\n ['width_Endzone_128_2' '0.2510600343485478']\n ['width_Endzone_32_2' '0.2506891066117257']\n ['width_Endzone_8_2' '0.2483446832576441']\n ['height_Endzone_32_2' '0.24752704225064595']\n ['height_Endzone_8_2' '0.24565121352386685']\n ['G_flug' '0.24393068433483814']\n ['height_Sideline_128_2' '0.23696566552015963']\n ['orientation_mean16_diff' '0.23148808146575542']\n ['y_position_mean16_diff' '0.22860718332150592']\n ['width_Sideline_128_2' '0.2255441032458971']\n ['width_Sideline_32_2' '0.22531453216184788']\n ['width_Sideline_8_2' '0.22295493383052897']\n ['height_Sideline_32_2' '0.22068827735176316']\n ['width_Sideline_512_diff' '0.21957892967290932']\n ['height_Sideline_8_2' '0.21941029975899798']\n ['y_position_min16_diff' '0.21648015754221775']\n ['width_Sideline_128_diff' '0.21559753321847333']\n ['width_Sideline_32_diff' '0.21469686605047264']\n ['y_position_max16_diff' '0.2134513616478546']\n ['width_Sideline_8_diff' '0.21238593321109006']\n ['height_Sideline_512_diff' '0.2059030263023747']]\n","output_type":"stream"}]},{"cell_type":"code","source":"\ntest[\"cnn_feature\"].to_pandas().hist(bins=200)\nplt.show()\ntrain[\"cnn_feature\"].to_pandas().hist(bins=200)\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-04-16T03:52:04.006269Z","iopub.execute_input":"2023-04-16T03:52:04.006599Z","iopub.status.idle":"2023-04-16T03:52:05.069442Z","shell.execute_reply.started":"2023-04-16T03:52:04.006568Z","shell.execute_reply":"2023-04-16T03:52:05.068474Z"},"trusted":true},"execution_count":28,"outputs":[{"output_type":"display_data","data":{"text/plain":"<Figure size 432x288 with 1 Axes>","image/png":"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\n"},"metadata":{"needs_background":"light"}},{"output_type":"display_data","data":{"text/plain":"<Figure size 432x288 with 1 Axes>","image/png":"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\n"},"metadata":{"needs_background":"light"}}]},{"cell_type":"markdown","source":"# Train & Infer XGBoost model","metadata":{}},{"cell_type":"code","source":"train=train.to_pandas()","metadata":{"execution":{"iopub.status.busy":"2023-04-16T03:52:05.071046Z","iopub.execute_input":"2023-04-16T03:52:05.071464Z","iopub.status.idle":"2023-04-16T03:52:07.782549Z","shell.execute_reply.started":"2023-04-16T03:52:05.071425Z","shell.execute_reply":"2023-04-16T03:52:07.781478Z"},"trusted":true},"execution_count":29,"outputs":[]},{"cell_type":"code","source":"\n\ncfg.folds = get_groupkfold(train, 'contact', 'game_play', cfg.num_fold)\ncfg.folds.to_csv(os.path.join(cfg.EXP_PREDS, 'folds.csv'), index=False)\n\noof_pred[np.where(cond_dis_train)] = fit_xgboost(cfg, train[feature_cols], train['contact'], \n                                              cfg.xgb_params, add_suffix=\"_xgb_1st\")\nnp.save('oof_pred.npy',oof_pred)","metadata":{"execution":{"iopub.status.busy":"2023-04-16T03:52:07.784464Z","iopub.execute_input":"2023-04-16T03:52:07.784874Z","iopub.status.idle":"2023-04-16T03:58:24.032248Z","shell.execute_reply.started":"2023-04-16T03:52:07.78483Z","shell.execute_reply":"2023-04-16T03:58:24.031118Z"},"trusted":true},"execution_count":30,"outputs":[{"output_type":"display_data","data":{"text/plain":"0    119036\n1     13030\nName: contact, dtype: int64"},"metadata":{}},{"name":"stdout","text":"[0]\ttrain-auc:0.71586\teval-auc:0.69865\n[100]\ttrain-auc:0.98232\teval-auc:0.96550\n[200]\ttrain-auc:0.99375\teval-auc:0.97059\n[300]\ttrain-auc:0.99656\teval-auc:0.97153\n[400]\ttrain-auc:0.99822\teval-auc:0.97193\n[500]\ttrain-auc:0.99905\teval-auc:0.97190\n[520]\ttrain-auc:0.99917\teval-auc:0.97194\nPerformance of the prediction: 0.97194\n\n","output_type":"stream"},{"output_type":"display_data","data":{"text/plain":"0    119346\n1     12837\nName: contact, dtype: int64"},"metadata":{}},{"name":"stdout","text":"[0]\ttrain-auc:0.72378\teval-auc:0.70825\n[100]\ttrain-auc:0.98239\teval-auc:0.96564\n[200]\ttrain-auc:0.99380\teval-auc:0.97029\n[300]\ttrain-auc:0.99676\teval-auc:0.97140\n[400]\ttrain-auc:0.99832\teval-auc:0.97158\n[500]\ttrain-auc:0.99915\teval-auc:0.97156\n[574]\ttrain-auc:0.99947\teval-auc:0.97143\nPerformance of the prediction: 0.97143\n\n","output_type":"stream"},{"output_type":"display_data","data":{"text/plain":"0    118752\n1     13412\nName: contact, dtype: int64"},"metadata":{}},{"name":"stdout","text":"[0]\ttrain-auc:0.72876\teval-auc:0.69315\n[100]\ttrain-auc:0.98268\teval-auc:0.96061\n[200]\ttrain-auc:0.99395\teval-auc:0.96599\n[300]\ttrain-auc:0.99681\teval-auc:0.96689\n[400]\ttrain-auc:0.99833\teval-auc:0.96715\n[500]\ttrain-auc:0.99914\teval-auc:0.96710\n[507]\ttrain-auc:0.99917\teval-auc:0.96710\nPerformance of the prediction: 0.9671\n\n","output_type":"stream"},{"output_type":"display_data","data":{"text/plain":"0    119387\n1     12574\nName: contact, dtype: int64"},"metadata":{}},{"name":"stdout","text":"[0]\ttrain-auc:0.73276\teval-auc:0.71228\n[100]\ttrain-auc:0.98254\teval-auc:0.96053\n[200]\ttrain-auc:0.99382\teval-auc:0.96593\n[300]\ttrain-auc:0.99671\teval-auc:0.96689\n[400]\ttrain-auc:0.99824\teval-auc:0.96711\n[500]\ttrain-auc:0.99906\teval-auc:0.96723\n[600]\ttrain-auc:0.99949\teval-auc:0.96731\n[642]\ttrain-auc:0.99962\teval-auc:0.96733\nPerformance of the prediction: 0.96733\n\n","output_type":"stream"},{"output_type":"display_data","data":{"text/plain":"0    119720\n1     12459\nName: contact, dtype: int64"},"metadata":{}},{"name":"stdout","text":"[0]\ttrain-auc:0.72374\teval-auc:0.71268\n[100]\ttrain-auc:0.98320\teval-auc:0.96063\n[200]\ttrain-auc:0.99386\teval-auc:0.96544\n[300]\ttrain-auc:0.99676\teval-auc:0.96630\n[400]\ttrain-auc:0.99826\teval-auc:0.96645\n[435]\ttrain-auc:0.99860\teval-auc:0.96645\nPerformance of the prediction: 0.96645\n\nAll Performance of the prediction: 0.96887\n","output_type":"stream"}]},{"cell_type":"markdown","source":"# Submission","metadata":{}},{"cell_type":"code","source":"\ndef func(x_list):\n    score = matthews_corrcoef(train_y, oof_pred>x_list[0])\n    return -score\n\nx0 = [0.5]\nresult = minimize(func,x0, method=\"nelder-mead\")\ncfg.threshold = result.x[0]\nprint(\"score:\", round(matthews_corrcoef(train_y, oof_pred>cfg.threshold), 5))\nprint(\"threshold\", round(cfg.threshold, 5))","metadata":{"execution":{"iopub.status.busy":"2023-04-16T03:58:24.033722Z","iopub.execute_input":"2023-04-16T03:58:24.034321Z","iopub.status.idle":"2023-04-16T03:59:11.762799Z","shell.execute_reply.started":"2023-04-16T03:58:24.034281Z","shell.execute_reply":"2023-04-16T03:59:11.76162Z"},"trusted":true},"execution_count":31,"outputs":[{"name":"stdout","text":"score: 0.74478\nthreshold 0.34062\n","output_type":"stream"}]},{"cell_type":"code","source":"del train\n_ = gc.collect(2)","metadata":{"execution":{"iopub.status.busy":"2023-04-16T03:59:11.764651Z","iopub.execute_input":"2023-04-16T03:59:11.765193Z","iopub.status.idle":"2023-04-16T03:59:11.999913Z","shell.execute_reply.started":"2023-04-16T03:59:11.765146Z","shell.execute_reply":"2023-04-16T03:59:11.998738Z"},"trusted":true},"execution_count":32,"outputs":[]},{"cell_type":"code","source":"sub_pred = pred_xgboost(test.loc[cond_dis_test, feature_cols].to_pandas(), cfg.EXP_MODEL, add_suffix=\"_xgb_1st\")\n\ntest['contact'] = 0\ntest.loc[cond_dis_test, 'contact'] = sub_pred\ntest[['contact_id', 'contact']].to_csv('xgb_output.csv', index=False)\n\ntest['contact'] = (test['contact'] > cfg.threshold).astype(int)\ntest[['contact_id', 'contact']].to_csv('submission.csv', index=False)\ndisplay(test[['contact_id', 'contact']].head())","metadata":{"execution":{"iopub.status.busy":"2023-04-16T03:59:12.001871Z","iopub.execute_input":"2023-04-16T03:59:12.002345Z","iopub.status.idle":"2023-04-16T03:59:12.639107Z","shell.execute_reply.started":"2023-04-16T03:59:12.002302Z","shell.execute_reply":"2023-04-16T03:59:12.638016Z"},"trusted":true},"execution_count":33,"outputs":[{"output_type":"display_data","data":{"text/plain":"                   contact_id  contact\n0  58168_003392_0_37084_37211        0\n1  58168_003392_0_37084_38556        0\n2  58168_003392_0_37084_38567        0\n3  58168_003392_0_37084_38590        0\n4  58168_003392_0_37084_39947        0","text/html":"<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>contact_id</th>\n      <th>contact</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>0</th>\n      <td>58168_003392_0_37084_37211</td>\n      <td>0</td>\n    </tr>\n    <tr>\n      <th>1</th>\n      <td>58168_003392_0_37084_38556</td>\n      <td>0</td>\n    </tr>\n    <tr>\n      <th>2</th>\n      <td>58168_003392_0_37084_38567</td>\n      <td>0</td>\n    </tr>\n    <tr>\n      <th>3</th>\n      <td>58168_003392_0_37084_38590</td>\n      <td>0</td>\n    </tr>\n    <tr>\n      <th>4</th>\n      <td>58168_003392_0_37084_39947</td>\n      <td>0</td>\n    </tr>\n  </tbody>\n</table>\n</div>"},"metadata":{}}]}]}