├── .gitignore ├── Multivariate_Long_Sequence_Time-Series_Forecasting_with_SOTA_Transformers.pdf ├── README.md ├── transformer_timeseries.yml └── patch-tst └── patchTST_WTH.ipynb /.gitignore: -------------------------------------------------------------------------------- 1 | *.pyc 2 | .ipynb_checkpoints/ 3 | *.csv 4 | *.xls 5 | *.ppt 6 | *.pth 7 | wandb 8 | tsai 9 | PatchTST 10 | *.png -------------------------------------------------------------------------------- /Multivariate_Long_Sequence_Time-Series_Forecasting_with_SOTA_Transformers.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/neelblabla/transformers_for_time_series_forecasting/HEAD/Multivariate_Long_Sequence_Time-Series_Forecasting_with_SOTA_Transformers.pdf -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Multivariate Long Sequence Time-Series Forecasting with SOTA Transformers 2 | 3 | We reproduce results from the following papers that introduced two special state-of-the-art transformer architectures for forecasting long sequence time-series data:- 4 | 5 | 1) PatchTST - "A Time Series is Worth 64 Words: Long-term Forecasting with Transformers" (https://doi.org/10.48550/arXiv.2211.14730) 6 | 2) Informer - "Expanding the prediction capacity in long sequence time-series forecasting" (https://doi.org/10.1016/j.artint.2023.103886) + (https://doi.org/10.48550/arXiv.2012.07436) 7 | 8 | Objective: To harness the power of Transformer models for multivariate time series forecasting with a focus on improved efficiency and accuracy. 9 | 10 | Details of the implementation are documented in the PDF report (Multivariate_Long_Sequence_Time-Series_Forecasting_with_SOTA_Transformers.pdf) made available in the repo. 11 | 12 | ### Results: 13 | The results obtained in our implementation are presented below aside to their counterparts listed in the PatchTST introduction paper of 2023. 14 | 15 | ![image](https://github.com/neelblabla/transformers_for_time_series_forecasting/assets/114079228/0ddc430c-a130-4a60-825d-0d1220a76e27) 16 | 17 | As evident, our model implementations managed to reproduce results in close proximity of the ones produced by the authors of ‘PatchTST’ and ‘Informer’ for some datasets. In the case of Informer, the average deviance from the results obtained in the paper only amounts to 0.13 for MSE and 0.07 for MAE; while in case of PatchTST this is about 0.132 for MSE and 0.126 for MAE. Our implementation of PatchTST relies on a scaled-down architecture compared to the one featured in the original paper, primarily due to computational constraints. An intriguing insight gained from our experiments is that an increase in model size to a certain value does not consistently lead to lower MSE and MAE values respectively. Instead, it suggests that further augmenting the model's size may be necessary to achieve improved performance, which had computational constraints in our case. 18 | 19 | Weights and Biases link for visualizations: 20 | https://wandb.ai/kirteshpatel98/transformer_timeseries 21 | 22 | ### Instruction for Demo: 23 | Before running the code please clone the OG time series repository into the patch-tst folder to import the model architecture. 24 | ``` 25 | git clone https://github.com/yuqinie98/PatchTST 26 | ``` 27 | 28 | Install dependent packages: 29 | ``` 30 | conda env create -n myenv -f transformer_timeseries.yml 31 | ``` 32 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /transformer_timeseries.yml: -------------------------------------------------------------------------------- 1 | name: tf_gpu 2 | channels: 3 | - intel 4 | - pytorch 5 | - nvidia 6 | - defaults 7 | dependencies: 8 | - _tflow_select=2.1.0=gpu 9 | - abseil-cpp=20210324.2=hd77b12b_0 10 | - absl-py=1.4.0=py39haa95532_0 11 | - aiohttp=3.8.5=py39h2bbff1b_0 12 | - aiosignal=1.2.0=pyhd3eb1b0_0 13 | - astor=0.8.1=py39haa95532_0 14 | - asttokens=2.0.5=pyhd3eb1b0_0 15 | - astunparse=1.6.3=py_0 16 | - async-timeout=4.0.2=py39haa95532_0 17 | - attrs=23.1.0=py39haa95532_0 18 | - backcall=0.2.0=pyhd3eb1b0_0 19 | - blas=1.0=mkl 20 | - blinker=1.6.2=py39haa95532_0 21 | - bottleneck=1.3.5=py39h080aedc_0 22 | - brotli=1.0.9=h2bbff1b_7 23 | - brotli-bin=1.0.9=h2bbff1b_7 24 | - brotli-python=1.0.9=py39hd77b12b_7 25 | - brotlipy=0.7.0=py39h2bbff1b_1003 26 | - ca-certificates=2023.08.22=haa95532_0 27 | - cachetools=4.2.2=pyhd3eb1b0_0 28 | - catalogue=2.0.7=py39haa95532_0 29 | - certifi=2023.7.22=py39haa95532_0 30 | - cffi=1.15.1=py39h2bbff1b_3 31 | - charset-normalizer=2.0.4=pyhd3eb1b0_0 32 | - click=8.1.7=py39haa95532_0 33 | - colorama=0.4.6=py39haa95532_0 34 | - comm=0.1.2=py39haa95532_0 35 | - confection=0.0.4=py39hd4e2768_0 36 | - cryptography=41.0.3=py39h3438e0d_0 37 | - cuda-cccl=12.1.109=0 38 | - cuda-cudart=11.8.89=0 39 | - cuda-cudart-dev=11.8.89=0 40 | - cuda-cupti=11.8.87=0 41 | - cuda-libraries=11.8.0=0 42 | - cuda-libraries-dev=11.8.0=0 43 | - cuda-nvrtc=11.8.89=0 44 | - cuda-nvrtc-dev=11.8.89=0 45 | - cuda-nvtx=11.8.86=0 46 | - cuda-profiler-api=12.1.105=0 47 | - cuda-runtime=11.8.0=0 48 | - cudatoolkit=11.3.1=h59b6b97_2 49 | - cudnn=8.2.1=cuda11.3_0 50 | - cymem=2.0.6=py39hd77b12b_0 51 | - cython-blis=0.7.9=py39h080aedc_0 52 | - daal4py=2023.1.1=py39h757b272_0 53 | - dal=2023.1.1=h59b6b97_48681 54 | - debugpy=1.6.7=py39hd77b12b_0 55 | - decorator=5.1.1=pyhd3eb1b0_0 56 | - et_xmlfile=1.1.0=py39haa95532_0 57 | - exceptiongroup=1.0.4=py39haa95532_0 58 | - executing=0.8.3=pyhd3eb1b0_0 59 | - filelock=3.9.0=py39haa95532_0 60 | - flatbuffers=2.0.0=h6c2663c_0 61 | - freetype=2.12.1=ha860e81_0 62 | - frozenlist=1.4.0=py39h2bbff1b_0 63 | - gast=0.4.0=pyhd3eb1b0_0 64 | - giflib=5.2.1=h8cc25b3_3 65 | - google-auth=2.22.0=py39haa95532_0 66 | - google-auth-oauthlib=0.4.1=py_2 67 | - google-pasta=0.2.0=pyhd3eb1b0_0 68 | - graphviz=2.38=hfd603c8_2 69 | - h5py=3.9.0=py39hfc34f40_0 70 | - hdf5=1.12.1=h51c971a_3 71 | - icc_rt=2022.1.0=h6049295_2 72 | - icu=68.1=h6c2663c_0 73 | - importlib-metadata=6.0.0=py39haa95532_0 74 | - importlib_metadata=6.0.0=hd3eb1b0_0 75 | - intel-openmp=2023.1.0=h59b6b97_46319 76 | - jedi=0.18.1=py39haa95532_1 77 | - jinja2=3.1.2=py39haa95532_0 78 | - joblib=1.2.0=py39haa95532_0 79 | - jpeg=9e=h2bbff1b_1 80 | - jupyter_client=8.1.0=py39haa95532_0 81 | - jupyter_core=5.5.0=py39haa95532_0 82 | - keras=2.6.0=pyhd3eb1b0_0 83 | - keras-preprocessing=1.1.2=pyhd3eb1b0_0 84 | - langcodes=3.3.0=pyhd3eb1b0_0 85 | - lerc=3.0=hd77b12b_0 86 | - libbrotlicommon=1.0.9=h2bbff1b_7 87 | - libbrotlidec=1.0.9=h2bbff1b_7 88 | - libbrotlienc=1.0.9=h2bbff1b_7 89 | - libcublas=11.11.3.6=0 90 | - libcublas-dev=11.11.3.6=0 91 | - libcufft=10.9.0.58=0 92 | - libcufft-dev=10.9.0.58=0 93 | - libcurand=10.3.2.106=0 94 | - libcurand-dev=10.3.2.106=0 95 | - libcurl=8.4.0=h86230a5_0 96 | - libcusolver=11.4.1.48=0 97 | - libcusolver-dev=11.4.1.48=0 98 | - libcusparse=11.7.5.86=0 99 | - libcusparse-dev=11.7.5.86=0 100 | - libdeflate=1.17=h2bbff1b_1 101 | - libnpp=11.8.0.86=0 102 | - libnpp-dev=11.8.0.86=0 103 | - libnvjpeg=11.9.0.86=0 104 | - libnvjpeg-dev=11.9.0.86=0 105 | - libpng=1.6.39=h8cc25b3_0 106 | - libprotobuf=3.17.2=h23ce68f_1 107 | - libsodium=1.0.18=h62dcd97_0 108 | - libssh2=1.10.0=hcd4344a_2 109 | - libtiff=4.5.1=hd77b12b_0 110 | - libuv=1.44.2=h2bbff1b_0 111 | - libwebp=1.3.2=hbc33d0d_0 112 | - libwebp-base=1.3.2=h2bbff1b_0 113 | - lz4-c=1.9.4=h2bbff1b_0 114 | - markdown=3.4.1=py39haa95532_0 115 | - markupsafe=2.1.1=py39h2bbff1b_0 116 | - mkl=2023.1.0=h6b88ed4_46357 117 | - mkl-service=2.4.0=py39h2bbff1b_1 118 | - mkl_fft=1.3.8=py39h2bbff1b_0 119 | - mkl_random=1.2.4=py39h59b6b97_0 120 | - mpmath=1.3.0=py39haa95532_0 121 | - multidict=6.0.2=py39h2bbff1b_0 122 | - munkres=1.1.4=py_0 123 | - murmurhash=1.0.7=py39hd77b12b_0 124 | - nest-asyncio=1.5.6=py39haa95532_0 125 | - networkx=3.1=py39haa95532_0 126 | - nltk=3.8.1=py39haa95532_0 127 | - numexpr=2.8.7=py39h2cd9be0_0 128 | - numpy-base=1.26.0=py39h65a83cf_0 129 | - oauthlib=3.2.2=py39haa95532_0 130 | - openjpeg=2.4.0=h4fc8c34_0 131 | - openssl=1.1.1w=h2bbff1b_0 132 | - opt_einsum=3.3.0=pyhd3eb1b0_1 133 | - pandas=1.5.2=py39hf11a4ad_0 134 | - pandas-stubs=1.5.3.230203=py39haa95532_0 135 | - parso=0.8.3=pyhd3eb1b0_0 136 | - pathy=0.10.1=py39haa95532_0 137 | - pickleshare=0.7.5=pyhd3eb1b0_1003 138 | - platformdirs=3.10.0=py39haa95532_0 139 | - plotly=5.9.0=py39haa95532_0 140 | - preshed=3.0.6=py39h6c2663c_0 141 | - prompt-toolkit=3.0.36=py39haa95532_0 142 | - psutil=5.9.0=py39h2bbff1b_0 143 | - pure_eval=0.2.2=pyhd3eb1b0_0 144 | - pyasn1=0.4.8=pyhd3eb1b0_0 145 | - pyasn1-modules=0.2.8=py_0 146 | - pycparser=2.21=pyhd3eb1b0_0 147 | - pydantic=1.10.12=py39h2bbff1b_1 148 | - pygments=2.15.1=py39haa95532_1 149 | - pyjwt=2.4.0=py39haa95532_0 150 | - pyopenssl=23.2.0=py39haa95532_0 151 | - pysocks=1.7.1=py39haa95532_0 152 | - python=3.9.18=h6244533_0 153 | - python-dateutil=2.8.2=pyhd3eb1b0_0 154 | - python-flatbuffers=1.12=pyhd3eb1b0_0 155 | - pytorch-cuda=11.8=h24eeafa_5 156 | - pytorch-mutex=1.0=cuda 157 | - pytz=2023.3.post1=py39haa95532_0 158 | - pywin32=305=py39h2bbff1b_0 159 | - pyzmq=25.1.0=py39hd77b12b_0 160 | - requests=2.31.0=py39haa95532_0 161 | - requests-oauthlib=1.3.0=py_0 162 | - rsa=4.7.2=pyhd3eb1b0_1 163 | - scikit-learn=1.2.1=py39hd77b12b_0 164 | - scikit-learn-intelex=2023.1.1=py39_intel_48681 165 | - scipy=1.11.3=py39h309d312_0 166 | - setuptools=68.0.0=py39haa95532_0 167 | - shellingham=1.5.0=py39haa95532_0 168 | - six=1.16.0=pyhd3eb1b0_1 169 | - smart_open=5.2.1=py39haa95532_0 170 | - snappy=1.1.9=h6c2663c_0 171 | - spacy=3.5.3=py39hef0f399_0 172 | - spacy-legacy=3.0.12=py39haa95532_0 173 | - spacy-loggers=1.0.4=py39haa95532_0 174 | - sqlite=3.41.2=h2bbff1b_0 175 | - srsly=2.4.8=py39hd77b12b_0 176 | - stack_data=0.2.0=pyhd3eb1b0_0 177 | - sympy=1.11.1=py39haa95532_0 178 | - tbb=2021.9.0=vc14_intel_43574 179 | - tenacity=8.2.2=py39haa95532_0 180 | - tensorboard-data-server=0.6.1=py39haa95532_0 181 | - tensorboard-plugin-wit=1.8.1=py39haa95532_0 182 | - tensorflow-base=2.6.0=gpu_py39hb3da07e_0 183 | - tensorflow-gpu=2.6.0=h17022bd_0 184 | - termcolor=2.1.0=py39haa95532_0 185 | - thinc=8.1.10=py39hf497b98_0 186 | - threadpoolctl=2.2.0=pyh0d69192_0 187 | - tk=8.6.12=h2bbff1b_0 188 | - tornado=6.3.3=py39h2bbff1b_0 189 | - tqdm=4.65.0=py39hd4e2768_0 190 | - traitlets=5.7.1=py39haa95532_0 191 | - typer=0.4.1=py39haa95532_0 192 | - types-pytz=2022.4.0.0=py39haa95532_1 193 | - typing-extensions=4.7.1=py39haa95532_0 194 | - typing_extensions=4.7.1=py39haa95532_0 195 | - tzdata=2023c=h04d1e81_0 196 | - urllib3=1.26.18=py39haa95532_0 197 | - vc=14.2=h21ff451_1 198 | - vs2015_runtime=14.27.29016=h5e58377_2 199 | - wasabi=0.9.1=py39haa95532_0 200 | - wcwidth=0.2.5=pyhd3eb1b0_0 201 | - werkzeug=2.2.3=py39haa95532_0 202 | - wheel=0.35.1=pyhd3eb1b0_0 203 | - win_inet_pton=1.1.0=py39haa95532_0 204 | - wrapt=1.14.1=py39h2bbff1b_0 205 | - xz=5.4.2=h8cc25b3_0 206 | - yarl=1.8.1=py39h2bbff1b_0 207 | - zeromq=4.3.4=hd77b12b_0 208 | - zlib=1.2.13=h8cc25b3_0 209 | - zstd=1.5.5=hd43e919_0 210 | - pip: 211 | - alembic==1.12.0 212 | - anyio==4.0.0 213 | - appdirs==1.4.4 214 | - bardapi==0.1.34 215 | - beautifulsoup4==4.11.2 216 | - bokeh==3.1.0 217 | - browser-cookie3==0.19.1 218 | - chardet==3.0.4 219 | - cloudpickle==1.3.0 220 | - colorlog==6.7.0 221 | - contourpy==1.1.1 222 | - cycler==0.12.1 223 | - deep-translator==1.11.4 224 | - dm-tree==0.1.8 225 | - docker-pycreds==0.4.0 226 | - en-core-web-sm==3.5.0 227 | - et-xmlfile==1.1.0 228 | - execnb==0.1.5 229 | - fastai==2.7.13 230 | - fastcore==1.5.29 231 | - fastdownload==0.0.7 232 | - fastprogress==1.0.3 233 | - fonttools==4.43.1 234 | - frozendict==2.3.5 235 | - fsspec==2023.9.1 236 | - ghapi==1.0.4 237 | - gin-config==0.5.0 238 | - gitdb==4.0.11 239 | - gitpython==3.1.40 240 | - google-api-core==2.12.0 241 | - google-cloud-core==2.3.3 242 | - google-cloud-translate==3.12.0 243 | - googleapis-common-protos==1.60.0 244 | - googlebard==2.1.0 245 | - googletrans==4.0.0rc1 246 | - greenlet==3.0.0 247 | - grpcio==1.58.0 248 | - grpcio-status==1.58.0 249 | - h11==0.9.0 250 | - h2==3.2.0 251 | - hpack==3.0.0 252 | - hstspreload==2023.1.1 253 | - html5lib==1.1 254 | - httpcore==0.9.1 255 | - httpx==0.13.3 256 | - huggingface-hub==0.17.1 257 | - hyperframe==5.2.0 258 | - idna==2.10 259 | - imbalanced-learn==0.11.0 260 | - importlib-resources==6.1.0 261 | - ipykernel==6.25.2 262 | - ipython==8.16.1 263 | - ipywidgets==8.0.4 264 | - jsonschema==4.19.1 265 | - jsonschema-specifications==2023.7.1 266 | - jupyterlab-widgets==3.0.9 267 | - kiwisolver==1.4.5 268 | - langdetect==1.0.9 269 | - libclang==15.0.6.1 270 | - lightning-utilities==0.9.0 271 | - livelossplot==0.5.5 272 | - llvmlite==0.41.1 273 | - lxml==4.9.2 274 | - lz4==4.3.2 275 | - mako==1.2.4 276 | - markdown-it-py==3.0.0 277 | - matplotlib==3.7.0 278 | - matplotlib-inline==0.1.6 279 | - mdurl==0.1.2 280 | - msgpack==1.0.7 281 | - multitasking==0.0.11 282 | - nbdev==2.3.13 283 | - neuralforecast==1.6.4 284 | - numba==0.58.1 285 | - numpy==1.26.1 286 | - openpyxl==3.1.2 287 | - optuna==3.4.0 288 | - packaging==23.2 289 | - pathtools==0.1.2 290 | - patsy==0.5.3 291 | - pillow==10.1.0 292 | - pip==23.3.1 293 | - plot-model==0.20 294 | - proto-plus==1.22.3 295 | - protobuf==3.20.3 296 | - pyarrow==6.0.1 297 | - pycryptodomex==3.19.0 298 | - pycuda==2022.2.2 299 | - pydot==1.4.2 300 | - pydot-ng==2.0.0 301 | - pyparsing==3.1.1 302 | - python-graphviz==0.20.1 303 | - pytools==2023.1 304 | - pytorch-lightning==2.1.0 305 | - pyts==0.13.0 306 | - pyyaml==6.0 307 | - ray==2.7.1 308 | - referencing==0.30.2 309 | - regex==2023.8.8 310 | - rfc3986==1.5.0 311 | - rich==13.5.3 312 | - rpds-py==0.10.6 313 | - safetensors==0.3.3 314 | - seaborn==0.13.0 315 | - sentencepiece==0.1.99 316 | - sentry-sdk==1.32.0 317 | - setproctitle==1.3.3 318 | - smmap==5.0.1 319 | - sniffio==1.3.0 320 | - socksio==1.0.0 321 | - soupsieve==2.4 322 | - sqlalchemy==2.0.22 323 | - statsmodels==0.13.5 324 | - tensorboard==2.11.2 325 | - tensorboardx==2.6.2.2 326 | - tensorflow==2.11.0 327 | - tensorflow-estimator==2.11.0 328 | - tensorflow-intel==2.11.0 329 | - tensorflow-io-gcs-filesystem==0.31.0 330 | - tensorflow-probability==0.20.0 331 | - textblob==0.17.1 332 | - tf-agents==0.6.0 333 | - tokenizers==0.13.3 334 | - torch==2.0.1+cu118 335 | - torchaudio==2.0.2+cu118 336 | - torchdata==0.6.1 337 | - torchmetrics==1.2.0 338 | - torchsummary==1.5.1 339 | - torchtext==0.15.2 340 | - torchvision==0.15.2+cu118 341 | - transformers==4.33.2 342 | - utilsforecast==0.0.12 343 | - wandb==0.15.12 344 | - watchdog==3.0.0 345 | - webencodings==0.5.1 346 | - widgetsnbextension==4.0.9 347 | - xyzservices==2023.2.0 348 | - yfinance==0.2.12 349 | - zipp==3.17.0 350 | prefix: C:\Users\hp\miniconda3\envs\tf_gpu 351 | -------------------------------------------------------------------------------- /patch-tst/patchTST_WTH.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "id": "f5fc39de", 6 | "metadata": {}, 7 | "source": [ 8 | "### Multivariate Time Series Forecasting by application of PatchTST (Transformer) on WTH Dataset\n", 9 | "-Lookback window = 336\n", 10 | "\n", 11 | "-Forecast window = 96" 12 | ] 13 | }, 14 | { 15 | "cell_type": "code", 16 | "execution_count": 209, 17 | "id": "ed103c66", 18 | "metadata": { 19 | "colab": { 20 | "base_uri": "https://localhost:8080/" 21 | }, 22 | "id": "ed103c66", 23 | "outputId": "6d983b40-6a98-48fd-c1ef-875839b80915" 24 | }, 25 | "outputs": [ 26 | { 27 | "name": "stdout", 28 | "output_type": "stream", 29 | "text": [ 30 | "2.0.1+cu118\n" 31 | ] 32 | } 33 | ], 34 | "source": [ 35 | "import torch\n", 36 | "from torch.utils.data import Dataset\n", 37 | "\n", 38 | "import seaborn as sns\n", 39 | "import matplotlib.pyplot as plt\n", 40 | "import numpy as np\n", 41 | "import pandas as pd\n", 42 | "# !pip install wandb\n", 43 | "import wandb\n", 44 | "import random\n", 45 | "from tqdm import tqdm\n", 46 | "\n", 47 | "from sklearn.preprocessing import StandardScaler\n", 48 | "print(torch.__version__)" 49 | ] 50 | }, 51 | { 52 | "cell_type": "code", 53 | "execution_count": 210, 54 | "id": "3855ec0c", 55 | "metadata": { 56 | "colab": { 57 | "base_uri": "https://localhost:8080/", 58 | "height": 471 59 | }, 60 | "id": "3855ec0c", 61 | "outputId": "caf23e54-39a1-4de5-8a08-40a6b7c38400" 62 | }, 63 | "outputs": [ 64 | { 65 | "data": { 66 | "text/html": [ 67 | "Finishing last run (ID:6fm8pdr3) before initializing another..." 68 | ], 69 | "text/plain": [ 70 | "" 71 | ] 72 | }, 73 | "metadata": {}, 74 | "output_type": "display_data" 75 | }, 76 | { 77 | "data": { 78 | "text/html": [ 79 | "Waiting for W&B process to finish... (success)." 80 | ], 81 | "text/plain": [ 82 | "" 83 | ] 84 | }, 85 | "metadata": {}, 86 | "output_type": "display_data" 87 | }, 88 | { 89 | "data": { 90 | "text/html": [ 91 | " View run decent-field-69 at: https://wandb.ai/kirteshpatel98/transformer_timeseries/runs/6fm8pdr3
Synced 6 W&B file(s), 0 media file(s), 0 artifact file(s) and 0 other file(s)" 92 | ], 93 | "text/plain": [ 94 | "" 95 | ] 96 | }, 97 | "metadata": {}, 98 | "output_type": "display_data" 99 | }, 100 | { 101 | "data": { 102 | "text/html": [ 103 | "Find logs at: .\\wandb\\run-20231103_132403-6fm8pdr3\\logs" 104 | ], 105 | "text/plain": [ 106 | "" 107 | ] 108 | }, 109 | "metadata": {}, 110 | "output_type": "display_data" 111 | }, 112 | { 113 | "data": { 114 | "text/html": [ 115 | "Successfully finished last run (ID:6fm8pdr3). Initializing new run:
" 116 | ], 117 | "text/plain": [ 118 | "" 119 | ] 120 | }, 121 | "metadata": {}, 122 | "output_type": "display_data" 123 | }, 124 | { 125 | "data": { 126 | "application/vnd.jupyter.widget-view+json": { 127 | "model_id": "ad3adbc342b4413eae65a14dca105401", 128 | "version_major": 2, 129 | "version_minor": 0 130 | }, 131 | "text/plain": [ 132 | "VBox(children=(Label(value='Waiting for wandb.init()...\\r'), FloatProgress(value=0.011111111111111112, max=1.0…" 133 | ] 134 | }, 135 | "metadata": {}, 136 | "output_type": "display_data" 137 | }, 138 | { 139 | "data": { 140 | "text/html": [ 141 | "Tracking run with wandb version 0.15.12" 142 | ], 143 | "text/plain": [ 144 | "" 145 | ] 146 | }, 147 | "metadata": {}, 148 | "output_type": "display_data" 149 | }, 150 | { 151 | "data": { 152 | "text/html": [ 153 | "Run data is saved locally in C:\\Users\\hp\\OneDrive - fs-students.de\\FS\\Sem 3\\Deep Learning\\transformers_for_time_series_forecasting\\patch-tst\\wandb\\run-20231103_132702-pnfd65sm" 154 | ], 155 | "text/plain": [ 156 | "" 157 | ] 158 | }, 159 | "metadata": {}, 160 | "output_type": "display_data" 161 | }, 162 | { 163 | "data": { 164 | "text/html": [ 165 | "Syncing run vocal-breeze-70 to Weights & Biases (docs)
" 166 | ], 167 | "text/plain": [ 168 | "" 169 | ] 170 | }, 171 | "metadata": {}, 172 | "output_type": "display_data" 173 | }, 174 | { 175 | "data": { 176 | "text/html": [ 177 | " View project at https://wandb.ai/kirteshpatel98/transformer_timeseries" 178 | ], 179 | "text/plain": [ 180 | "" 181 | ] 182 | }, 183 | "metadata": {}, 184 | "output_type": "display_data" 185 | }, 186 | { 187 | "data": { 188 | "text/html": [ 189 | " View run at https://wandb.ai/kirteshpatel98/transformer_timeseries/runs/pnfd65sm" 190 | ], 191 | "text/plain": [ 192 | "" 193 | ] 194 | }, 195 | "metadata": {}, 196 | "output_type": "display_data" 197 | }, 198 | { 199 | "data": { 200 | "text/html": [ 201 | "" 202 | ], 203 | "text/plain": [ 204 | "" 205 | ] 206 | }, 207 | "execution_count": 210, 208 | "metadata": {}, 209 | "output_type": "execute_result" 210 | } 211 | ], 212 | "source": [ 213 | "\n", 214 | "# start a new wandb run to track this script\n", 215 | "wandb.init(\n", 216 | " # set the wandb project where this run will be logged\n", 217 | " project=\"transformer_timeseries\",\n", 218 | ")\n" 219 | ] 220 | }, 221 | { 222 | "cell_type": "code", 223 | "execution_count": 211, 224 | "id": "5522d111", 225 | "metadata": { 226 | "colab": { 227 | "base_uri": "https://localhost:8080/", 228 | "height": 634 229 | }, 230 | "id": "5522d111", 231 | "outputId": "e7970d24-0ff5-4827-aa0c-b9fb80ce9051" 232 | }, 233 | "outputs": [ 234 | { 235 | "data": { 236 | "text/plain": [ 237 | "\"\\nfrom google.colab import drive\\ndrive.mount('/content/drive')\\n\\nimport os\\nos.chdir('/content/drive/My Drive/')\\n\\n\\ndf=pd.read_csv('WTH.csv')\\n# df.drop('Unnamed: 0',axis=1,inplace=True)\\ndf\\n\"" 238 | ] 239 | }, 240 | "execution_count": 211, 241 | "metadata": {}, 242 | "output_type": "execute_result" 243 | } 244 | ], 245 | "source": [ 246 | "'''\n", 247 | "from google.colab import drive\n", 248 | "drive.mount('/content/drive')\n", 249 | "\n", 250 | "import os\n", 251 | "os.chdir('/content/drive/My Drive/')\n", 252 | "\n", 253 | "\n", 254 | "df=pd.read_csv('WTH.csv')\n", 255 | "# df.drop('Unnamed: 0',axis=1,inplace=True)\n", 256 | "df\n", 257 | "'''" 258 | ] 259 | }, 260 | { 261 | "cell_type": "code", 262 | "execution_count": 212, 263 | "id": "bffcb3d9", 264 | "metadata": { 265 | "colab": { 266 | "base_uri": "https://localhost:8080/", 267 | "height": 36 268 | }, 269 | "id": "bffcb3d9", 270 | "outputId": "0583a406-d5e9-4687-baf9-6e00500e03d9" 271 | }, 272 | "outputs": [ 273 | { 274 | "data": { 275 | "text/html": [ 276 | "
\n", 277 | "\n", 290 | "\n", 291 | " \n", 292 | " \n", 293 | " \n", 294 | " \n", 295 | " \n", 296 | " \n", 297 | " \n", 298 | " \n", 299 | " \n", 300 | " \n", 301 | " \n", 302 | " \n", 303 | " \n", 304 | " \n", 305 | " \n", 306 | " \n", 307 | " \n", 308 | " \n", 309 | " \n", 310 | " \n", 311 | " \n", 312 | " \n", 313 | " \n", 314 | " \n", 315 | " \n", 316 | " \n", 317 | " \n", 318 | " \n", 319 | " \n", 320 | " \n", 321 | " \n", 322 | " \n", 323 | " \n", 324 | " \n", 325 | " \n", 326 | " \n", 327 | " \n", 328 | " \n", 329 | " \n", 330 | " \n", 331 | " \n", 332 | " \n", 333 | " \n", 334 | " \n", 335 | " \n", 336 | " \n", 337 | " \n", 338 | " \n", 339 | " \n", 340 | " \n", 341 | " \n", 342 | " \n", 343 | " \n", 344 | " \n", 345 | " \n", 346 | " \n", 347 | " \n", 348 | " \n", 349 | " \n", 350 | " \n", 351 | " \n", 352 | " \n", 353 | " \n", 354 | " \n", 355 | " \n", 356 | " \n", 357 | " \n", 358 | " \n", 359 | " \n", 360 | " \n", 361 | " \n", 362 | " \n", 363 | " \n", 364 | " \n", 365 | " \n", 366 | " \n", 367 | " \n", 368 | " \n", 369 | " \n", 370 | " \n", 371 | " \n", 372 | " \n", 373 | " \n", 374 | " \n", 375 | " \n", 376 | " \n", 377 | " \n", 378 | " \n", 379 | " \n", 380 | " \n", 381 | " \n", 382 | " \n", 383 | " \n", 384 | " \n", 385 | " \n", 386 | " \n", 387 | " \n", 388 | " \n", 389 | " \n", 390 | " \n", 391 | " \n", 392 | " \n", 393 | " \n", 394 | " \n", 395 | " \n", 396 | " \n", 397 | " \n", 398 | " \n", 399 | " \n", 400 | " \n", 401 | " \n", 402 | " \n", 403 | " \n", 404 | " \n", 405 | " \n", 406 | " \n", 407 | " \n", 408 | " \n", 409 | " \n", 410 | " \n", 411 | " \n", 412 | " \n", 413 | " \n", 414 | " \n", 415 | " \n", 416 | " \n", 417 | " \n", 418 | " \n", 419 | " \n", 420 | " \n", 421 | " \n", 422 | " \n", 423 | " \n", 424 | " \n", 425 | " \n", 426 | " \n", 427 | " \n", 428 | " \n", 429 | " \n", 430 | " \n", 431 | " \n", 432 | " \n", 433 | " \n", 434 | " \n", 435 | " \n", 436 | " \n", 437 | " \n", 438 | " \n", 439 | " \n", 440 | " \n", 441 | " \n", 442 | " \n", 443 | " \n", 444 | " \n", 445 | " \n", 446 | " \n", 447 | " \n", 448 | " \n", 449 | " \n", 450 | " \n", 451 | " \n", 452 | " \n", 453 | " \n", 454 | " \n", 455 | " \n", 456 | " \n", 457 | " \n", 458 | " \n", 459 | " \n", 460 | " \n", 461 | " \n", 462 | " \n", 463 | " \n", 464 | " \n", 465 | " \n", 466 | " \n", 467 | " \n", 468 | " \n", 469 | " \n", 470 | " \n", 471 | " \n", 472 | " \n", 473 | " \n", 474 | " \n", 475 | "
VisibilityDryBulbFarenheitDryBulbCelsiusWetBulbFarenheitDewPointFarenheitDewPointCelsiusRelativeHumidityWindSpeedWindDirectionStationPressureAltimeterWetBulbCelsius
010.016-9137-1467713021.65000030.35-10.3
110.016-9137-1467515021.64000030.34-10.3
210.016-9137-1467519021.65000030.35-10.3
310.016-9137-1467718021.65000030.35-10.3
410.016-9149-1374612021.64000030.34-10.0
.......................................
3505910.0320023-500021.47868630.210.0
350607.030-1025-40511021.47868630.210.0
350615.030-1028-200021.47868630.200.0
3506210.030-1028-20514021.47868630.180.0
3506310.030-12928-292511021.52000030.18-1.5
\n", 476 | "

35064 rows × 12 columns

\n", 477 | "
" 478 | ], 479 | "text/plain": [ 480 | " Visibility DryBulbFarenheit DryBulbCelsius WetBulbFarenheit \\\n", 481 | "0 10.0 16 -9 13 \n", 482 | "1 10.0 16 -9 13 \n", 483 | "2 10.0 16 -9 13 \n", 484 | "3 10.0 16 -9 13 \n", 485 | "4 10.0 16 -9 14 \n", 486 | "... ... ... ... ... \n", 487 | "35059 10.0 32 0 0 \n", 488 | "35060 7.0 30 -1 0 \n", 489 | "35061 5.0 30 -1 0 \n", 490 | "35062 10.0 30 -1 0 \n", 491 | "35063 10.0 30 -1 29 \n", 492 | "\n", 493 | " DewPointFarenheit DewPointCelsius RelativeHumidity WindSpeed \\\n", 494 | "0 7 -14 67 7 \n", 495 | "1 7 -14 67 5 \n", 496 | "2 7 -14 67 5 \n", 497 | "3 7 -14 67 7 \n", 498 | "4 9 -13 74 6 \n", 499 | "... ... ... ... ... \n", 500 | "35059 23 -5 0 0 \n", 501 | "35060 25 -4 0 5 \n", 502 | "35061 28 -2 0 0 \n", 503 | "35062 28 -2 0 5 \n", 504 | "35063 28 -2 92 5 \n", 505 | "\n", 506 | " WindDirection StationPressure Altimeter WetBulbCelsius \n", 507 | "0 130 21.650000 30.35 -10.3 \n", 508 | "1 150 21.640000 30.34 -10.3 \n", 509 | "2 190 21.650000 30.35 -10.3 \n", 510 | "3 180 21.650000 30.35 -10.3 \n", 511 | "4 120 21.640000 30.34 -10.0 \n", 512 | "... ... ... ... ... \n", 513 | "35059 0 21.478686 30.21 0.0 \n", 514 | "35060 110 21.478686 30.21 0.0 \n", 515 | "35061 0 21.478686 30.20 0.0 \n", 516 | "35062 140 21.478686 30.18 0.0 \n", 517 | "35063 110 21.520000 30.18 -1.5 \n", 518 | "\n", 519 | "[35064 rows x 12 columns]" 520 | ] 521 | }, 522 | "execution_count": 212, 523 | "metadata": {}, 524 | "output_type": "execute_result" 525 | } 526 | ], 527 | "source": [ 528 | "df=pd.read_csv('WTH.csv',index_col=None)\n", 529 | "# df.drop('Unnamed: 0',axis=1,inplace=True)\n", 530 | "df.iloc[:,1:]" 531 | ] 532 | }, 533 | { 534 | "cell_type": "code", 535 | "execution_count": 213, 536 | "id": "273ef681", 537 | "metadata": {}, 538 | "outputs": [ 539 | { 540 | "data": { 541 | "text/html": [ 542 | "
\n", 543 | "\n", 556 | "\n", 557 | " \n", 558 | " \n", 559 | " \n", 560 | " \n", 561 | " \n", 562 | " \n", 563 | " \n", 564 | " \n", 565 | " \n", 566 | " \n", 567 | " \n", 568 | " \n", 569 | " \n", 570 | " \n", 571 | " \n", 572 | " \n", 573 | " \n", 574 | " \n", 575 | " \n", 576 | " \n", 577 | " \n", 578 | " \n", 579 | " \n", 580 | " \n", 581 | " \n", 582 | " \n", 583 | " \n", 584 | " \n", 585 | " \n", 586 | " \n", 587 | " \n", 588 | " \n", 589 | " \n", 590 | " \n", 591 | " \n", 592 | " \n", 593 | " \n", 594 | " \n", 595 | " \n", 596 | " \n", 597 | " \n", 598 | " \n", 599 | " \n", 600 | " \n", 601 | " \n", 602 | " \n", 603 | " \n", 604 | " \n", 605 | " \n", 606 | " \n", 607 | " \n", 608 | " \n", 609 | " \n", 610 | " \n", 611 | " \n", 612 | " \n", 613 | " \n", 614 | " \n", 615 | " \n", 616 | " \n", 617 | " \n", 618 | " \n", 619 | " \n", 620 | " \n", 621 | " \n", 622 | " \n", 623 | " \n", 624 | " \n", 625 | " \n", 626 | " \n", 627 | " \n", 628 | " \n", 629 | " \n", 630 | " \n", 631 | " \n", 632 | " \n", 633 | " \n", 634 | " \n", 635 | " \n", 636 | " \n", 637 | " \n", 638 | " \n", 639 | " \n", 640 | " \n", 641 | " \n", 642 | " \n", 643 | " \n", 644 | " \n", 645 | " \n", 646 | " \n", 647 | " \n", 648 | " \n", 649 | " \n", 650 | " \n", 651 | " \n", 652 | " \n", 653 | " \n", 654 | " \n", 655 | " \n", 656 | " \n", 657 | " \n", 658 | " \n", 659 | " \n", 660 | " \n", 661 | " \n", 662 | " \n", 663 | " \n", 664 | " \n", 665 | " \n", 666 | " \n", 667 | " \n", 668 | " \n", 669 | " \n", 670 | " \n", 671 | " \n", 672 | " \n", 673 | " \n", 674 | " \n", 675 | " \n", 676 | " \n", 677 | " \n", 678 | " \n", 679 | " \n", 680 | " \n", 681 | " \n", 682 | " \n", 683 | " \n", 684 | " \n", 685 | " \n", 686 | " \n", 687 | " \n", 688 | " \n", 689 | " \n", 690 | " \n", 691 | " \n", 692 | " \n", 693 | " \n", 694 | " \n", 695 | " \n", 696 | " \n", 697 | " \n", 698 | " \n", 699 | " \n", 700 | " \n", 701 | " \n", 702 | " \n", 703 | " \n", 704 | " \n", 705 | " \n", 706 | " \n", 707 | " \n", 708 | " \n", 709 | " \n", 710 | " \n", 711 | " \n", 712 | " \n", 713 | " \n", 714 | " \n", 715 | " \n", 716 | " \n", 717 | " \n", 718 | " \n", 719 | " \n", 720 | " \n", 721 | " \n", 722 | " \n", 723 | " \n", 724 | " \n", 725 | " \n", 726 | " \n", 727 | " \n", 728 | " \n", 729 | " \n", 730 | " \n", 731 | " \n", 732 | " \n", 733 | " \n", 734 | " \n", 735 | " \n", 736 | " \n", 737 | " \n", 738 | " \n", 739 | " \n", 740 | " \n", 741 | " \n", 742 | " \n", 743 | " \n", 744 | " \n", 745 | " \n", 746 | " \n", 747 | " \n", 748 | " \n", 749 | " \n", 750 | " \n", 751 | " \n", 752 | " \n", 753 | "
dateVisibilityDryBulbFarenheitDryBulbCelsiusWetBulbFarenheitDewPointFarenheitDewPointCelsiusRelativeHumidityWindSpeedWindDirectionStationPressureAltimeterWetBulbCelsius
01/1/2010 0:000.301781-1.580651-1.605506-1.632744-1.014166-1.0355220.6823620.278284-0.0256250.6819930.652382-1.641876
11/1/2010 1:000.301781-1.580651-1.605506-1.632744-1.014166-1.0355220.682362-0.1344720.1701720.6248020.608931-1.641876
21/1/2010 2:000.301781-1.580651-1.605506-1.632744-1.014166-1.0355220.682362-0.1344720.5617680.6819930.652382-1.641876
31/1/2010 3:000.301781-1.580651-1.605506-1.632744-1.014166-1.0355220.6823620.2782840.4638690.6819930.652382-1.641876
41/1/2010 4:000.301781-1.580651-1.605506-1.553935-0.876306-0.9111010.9607690.071906-0.1235240.6248020.608931-1.598387
..........................................
3505912/31/2013 19:000.301781-0.643255-0.650163-2.6572500.0887080.084264-1.982391-1.166361-1.298311-0.2977820.044066-0.148745
3506012/31/2013 20:00-1.172466-0.760429-0.756313-2.6572500.2265670.208684-1.982391-0.134472-0.221423-0.2977820.044066-0.148745
3506112/31/2013 21:00-2.155297-0.760429-0.756313-2.6572500.4333560.457525-1.982391-1.166361-1.298311-0.2977820.000615-0.148745
3506212/31/2013 22:000.301781-0.760429-0.756313-2.6572500.4333560.457525-1.982391-0.1344720.072274-0.297782-0.086287-0.148745
3506312/31/2013 23:000.301781-0.760429-0.756313-0.3718130.4333560.4575251.676673-0.134472-0.221423-0.061499-0.086287-0.366191
\n", 754 | "

35064 rows × 13 columns

\n", 755 | "
" 756 | ], 757 | "text/plain": [ 758 | " date Visibility DryBulbFarenheit DryBulbCelsius \\\n", 759 | "0 1/1/2010 0:00 0.301781 -1.580651 -1.605506 \n", 760 | "1 1/1/2010 1:00 0.301781 -1.580651 -1.605506 \n", 761 | "2 1/1/2010 2:00 0.301781 -1.580651 -1.605506 \n", 762 | "3 1/1/2010 3:00 0.301781 -1.580651 -1.605506 \n", 763 | "4 1/1/2010 4:00 0.301781 -1.580651 -1.605506 \n", 764 | "... ... ... ... ... \n", 765 | "35059 12/31/2013 19:00 0.301781 -0.643255 -0.650163 \n", 766 | "35060 12/31/2013 20:00 -1.172466 -0.760429 -0.756313 \n", 767 | "35061 12/31/2013 21:00 -2.155297 -0.760429 -0.756313 \n", 768 | "35062 12/31/2013 22:00 0.301781 -0.760429 -0.756313 \n", 769 | "35063 12/31/2013 23:00 0.301781 -0.760429 -0.756313 \n", 770 | "\n", 771 | " WetBulbFarenheit DewPointFarenheit DewPointCelsius RelativeHumidity \\\n", 772 | "0 -1.632744 -1.014166 -1.035522 0.682362 \n", 773 | "1 -1.632744 -1.014166 -1.035522 0.682362 \n", 774 | "2 -1.632744 -1.014166 -1.035522 0.682362 \n", 775 | "3 -1.632744 -1.014166 -1.035522 0.682362 \n", 776 | "4 -1.553935 -0.876306 -0.911101 0.960769 \n", 777 | "... ... ... ... ... \n", 778 | "35059 -2.657250 0.088708 0.084264 -1.982391 \n", 779 | "35060 -2.657250 0.226567 0.208684 -1.982391 \n", 780 | "35061 -2.657250 0.433356 0.457525 -1.982391 \n", 781 | "35062 -2.657250 0.433356 0.457525 -1.982391 \n", 782 | "35063 -0.371813 0.433356 0.457525 1.676673 \n", 783 | "\n", 784 | " WindSpeed WindDirection StationPressure Altimeter WetBulbCelsius \n", 785 | "0 0.278284 -0.025625 0.681993 0.652382 -1.641876 \n", 786 | "1 -0.134472 0.170172 0.624802 0.608931 -1.641876 \n", 787 | "2 -0.134472 0.561768 0.681993 0.652382 -1.641876 \n", 788 | "3 0.278284 0.463869 0.681993 0.652382 -1.641876 \n", 789 | "4 0.071906 -0.123524 0.624802 0.608931 -1.598387 \n", 790 | "... ... ... ... ... ... \n", 791 | "35059 -1.166361 -1.298311 -0.297782 0.044066 -0.148745 \n", 792 | "35060 -0.134472 -0.221423 -0.297782 0.044066 -0.148745 \n", 793 | "35061 -1.166361 -1.298311 -0.297782 0.000615 -0.148745 \n", 794 | "35062 -0.134472 0.072274 -0.297782 -0.086287 -0.148745 \n", 795 | "35063 -0.134472 -0.221423 -0.061499 -0.086287 -0.366191 \n", 796 | "\n", 797 | "[35064 rows x 13 columns]" 798 | ] 799 | }, 800 | "execution_count": 213, 801 | "metadata": {}, 802 | "output_type": "execute_result" 803 | } 804 | ], 805 | "source": [ 806 | "scaler = StandardScaler()\n", 807 | "df.iloc[:,1:] = scaler.fit_transform(df.iloc[:,1:])\n", 808 | "df" 809 | ] 810 | }, 811 | { 812 | "cell_type": "code", 813 | "execution_count": 214, 814 | "id": "IMhozIdUX4fg", 815 | "metadata": { 816 | "id": "IMhozIdUX4fg" 817 | }, 818 | "outputs": [], 819 | "source": [ 820 | "class weather_data(torch.utils.data.Dataset):\n", 821 | " def __init__(self, df, mode=\"train\", seq_len=336, pred_len=96,num_feat=12):\n", 822 | " super().__init__()\n", 823 | " self.num_feat=num_feat\n", 824 | " self.df = df.iloc[:,1:num_feat+1]\n", 825 | " # time_stamp = df.iloc[:,0]\n", 826 | "\n", 827 | " assert mode in ['train', 'test', 'val']\n", 828 | " type_map = {'train': 0, 'val': 1, 'test': 2}\n", 829 | " self.set_type = type_map[mode]\n", 830 | "\n", 831 | " self.seq_len = seq_len\n", 832 | " self.pred_len = pred_len\n", 833 | " dataset_len=len(df)\n", 834 | "\n", 835 | " border1s = [0, int(round(0.7*dataset_len,0)) - self.seq_len, int(round(0.7*dataset_len,0)) + int(round(0.1*dataset_len,0)) - self.seq_len]\n", 836 | " border2s = [int(round(0.7*dataset_len,0)), int(round(0.7*dataset_len,0)) + int(round(0.1*dataset_len,0)), int(round(0.7*dataset_len,0)) + int(round(0.1*dataset_len,0)) + int(round(0.2*dataset_len,0))]\n", 837 | " border1 = border1s[self.set_type]\n", 838 | " border2 = border2s[self.set_type]\n", 839 | "\n", 840 | "\n", 841 | "\n", 842 | "\n", 843 | " self.df = self.df.to_numpy(dtype=np.float32)\n", 844 | " # time_stamp = time_stamp.to_numpy()\n", 845 | "\n", 846 | " self.data_x = self.df[border1: border2, :]\n", 847 | " self.data_y = self.df[border1: border2, :]\n", 848 | "\n", 849 | " # self.data_stamp = time_stamp[border1: border2]\n", 850 | "\n", 851 | " def __getitem__(self, index):\n", 852 | " s_begin = index\n", 853 | " s_end = s_begin + self.seq_len\n", 854 | " r_begin = s_end\n", 855 | " r_end = r_begin + self.pred_len\n", 856 | "\n", 857 | " seq_x = self.data_x[s_begin:s_end]\n", 858 | " seq_y = self.data_y[r_begin:r_end]\n", 859 | " return seq_x, seq_y\n", 860 | "\n", 861 | "\n", 862 | " def __len__(self):\n", 863 | " return len(self.data_x) - self.seq_len - self.pred_len + 1" 864 | ] 865 | }, 866 | { 867 | "cell_type": "code", 868 | "execution_count": 215, 869 | "id": "Ds8C5Wv1TZJy", 870 | "metadata": { 871 | "colab": { 872 | "base_uri": "https://localhost:8080/" 873 | }, 874 | "id": "Ds8C5Wv1TZJy", 875 | "outputId": "3523cc60-dc4f-4830-acb8-8140b52c92dd" 876 | }, 877 | "outputs": [ 878 | { 879 | "name": "stdout", 880 | "output_type": "stream", 881 | "text": [ 882 | "24114 3411 6918\n" 883 | ] 884 | } 885 | ], 886 | "source": [ 887 | "from torch.utils.data import DataLoader\n", 888 | "\n", 889 | "train_dataset = weather_data(df=df)\n", 890 | "valid_dataset = weather_data(df=df,mode=\"val\")\n", 891 | "test_dataset = weather_data(df=df,mode=\"test\")\n", 892 | "\n", 893 | "print(len(train_dataset),len(valid_dataset),len(test_dataset))" 894 | ] 895 | }, 896 | { 897 | "cell_type": "code", 898 | "execution_count": 216, 899 | "id": "70a18f29", 900 | "metadata": { 901 | "id": "70a18f29" 902 | }, 903 | "outputs": [ 904 | { 905 | "data": { 906 | "text/plain": [ 907 | "(96, 12)" 908 | ] 909 | }, 910 | "execution_count": 216, 911 | "metadata": {}, 912 | "output_type": "execute_result" 913 | } 914 | ], 915 | "source": [ 916 | "train_dataset[1][1].shape" 917 | ] 918 | }, 919 | { 920 | "cell_type": "code", 921 | "execution_count": 217, 922 | "id": "a2c85a51", 923 | "metadata": {}, 924 | "outputs": [ 925 | { 926 | "data": { 927 | "text/plain": [ 928 | "PatchTST.PatchTST_supervised.models.PatchTST.Model" 929 | ] 930 | }, 931 | "execution_count": 217, 932 | "metadata": {}, 933 | "output_type": "execute_result" 934 | } 935 | ], 936 | "source": [ 937 | "import os\n", 938 | "current_directory = os.getcwd()\n", 939 | "os.chdir(current_directory+r\"\\PatchTST\\PatchTST_supervised\")\n", 940 | "from PatchTST.PatchTST_supervised.models.PatchTST import Model\n", 941 | "os.chdir(current_directory)\n", 942 | "Model" 943 | ] 944 | }, 945 | { 946 | "cell_type": "code", 947 | "execution_count": 218, 948 | "id": "322a0ff3", 949 | "metadata": {}, 950 | "outputs": [ 951 | { 952 | "data": { 953 | "text/plain": [ 954 | "'\\nclass Configs:\\n def __init__(self):\\n self.enc_in = 12\\n self.seq_len = 336\\n self.pred_len = 96\\n self.e_layers = 3\\n self.n_heads = 8\\n self.d_model = 128\\n self.d_ff = 512\\n self.dropout = 0.4\\n self.fc_dropout = 0.\\n self.head_dropout = 0.\\n self.individual = True\\n self.patch_len = 24\\n self.stride = 12\\n self.padding_patch = True\\n self.revin = True\\n self.affine = False\\n self.subtract_last = False\\n self.decomposition = False\\n self.kernel_size = 25\\n \\nmy_configs = Configs()\\nmodel=Model(configs=my_configs)\\n'" 955 | ] 956 | }, 957 | "execution_count": 218, 958 | "metadata": {}, 959 | "output_type": "execute_result" 960 | } 961 | ], 962 | "source": [ 963 | "'''\n", 964 | "class Configs:\n", 965 | " def __init__(self):\n", 966 | " self.enc_in = 12\n", 967 | " self.seq_len = 336\n", 968 | " self.pred_len = 96\n", 969 | " self.e_layers = 3\n", 970 | " self.n_heads = 8\n", 971 | " self.d_model = 128\n", 972 | " self.d_ff = 512\n", 973 | " self.dropout = 0.4\n", 974 | " self.fc_dropout = 0.\n", 975 | " self.head_dropout = 0.\n", 976 | " self.individual = True\n", 977 | " self.patch_len = 24\n", 978 | " self.stride = 12\n", 979 | " self.padding_patch = True\n", 980 | " self.revin = True\n", 981 | " self.affine = False\n", 982 | " self.subtract_last = False\n", 983 | " self.decomposition = False\n", 984 | " self.kernel_size = 25\n", 985 | " \n", 986 | "my_configs = Configs()\n", 987 | "model=Model(configs=my_configs)\n", 988 | "'''" 989 | ] 990 | }, 991 | { 992 | "cell_type": "code", 993 | "execution_count": 219, 994 | "id": "7152de2e", 995 | "metadata": {}, 996 | "outputs": [], 997 | "source": [ 998 | "\n", 999 | "class Configs:\n", 1000 | " def __init__(self):\n", 1001 | " self.enc_in = 12\n", 1002 | " self.seq_len = 336\n", 1003 | " self.pred_len = 96\n", 1004 | " self.e_layers = 3\n", 1005 | " self.n_heads = 4\n", 1006 | " self.d_model = 16\n", 1007 | " self.d_ff = 128\n", 1008 | " self.dropout = 0.4\n", 1009 | " self.fc_dropout = 0.\n", 1010 | " self.head_dropout = 0.\n", 1011 | " self.individual = True\n", 1012 | " self.patch_len = 24\n", 1013 | " self.stride = 2\n", 1014 | " self.padding_patch = True\n", 1015 | " self.revin = True\n", 1016 | " self.affine = False\n", 1017 | " self.subtract_last = False\n", 1018 | " self.decomposition = False\n", 1019 | " self.kernel_size = 25\n", 1020 | " \n", 1021 | "my_configs = Configs()\n", 1022 | "model=Model(configs=my_configs)\n" 1023 | ] 1024 | }, 1025 | { 1026 | "cell_type": "code", 1027 | "execution_count": 220, 1028 | "id": "94fdb9c2", 1029 | "metadata": {}, 1030 | "outputs": [ 1031 | { 1032 | "data": { 1033 | "text/plain": [ 1034 | "torch.Size([1, 96, 12])" 1035 | ] 1036 | }, 1037 | "execution_count": 220, 1038 | "metadata": {}, 1039 | "output_type": "execute_result" 1040 | } 1041 | ], 1042 | "source": [ 1043 | "dat=torch.from_numpy(train_dataset[0][0])\n", 1044 | "dat=dat.unsqueeze(dim=0)\n", 1045 | "dat.shape\n", 1046 | "model(dat).shape" 1047 | ] 1048 | }, 1049 | { 1050 | "cell_type": "code", 1051 | "execution_count": 222, 1052 | "id": "4e2b4427", 1053 | "metadata": { 1054 | "colab": { 1055 | "base_uri": "https://localhost:8080/" 1056 | }, 1057 | "id": "4e2b4427", 1058 | "outputId": "be9af307-b172-4a69-ffd9-61220cb69e4e" 1059 | }, 1060 | "outputs": [ 1061 | { 1062 | "data": { 1063 | "text/plain": [ 1064 | "0" 1065 | ] 1066 | }, 1067 | "execution_count": 222, 1068 | "metadata": {}, 1069 | "output_type": "execute_result" 1070 | } 1071 | ], 1072 | "source": [ 1073 | "import gc\n", 1074 | "torch.cuda.empty_cache()\n", 1075 | "gc.collect()" 1076 | ] 1077 | }, 1078 | { 1079 | "cell_type": "code", 1080 | "execution_count": 223, 1081 | "id": "032b97a3", 1082 | "metadata": { 1083 | "id": "032b97a3" 1084 | }, 1085 | "outputs": [ 1086 | { 1087 | "data": { 1088 | "text/plain": [ 1089 | "'\\n # plotting\\n \\n for i,j in zip(test_pred[0],test_y[0]):\\n pass\\n # print(i[ind].item())\\n test_pred_plot.append(i[ind].item())\\n # print(j[ind].item())\\n test_y_plot.append(j[ind].item())\\n sns.lineplot(x=list(range(len(test_pred_plot)))[:96], y=test_pred_plot[:96], label=\"predicted\")\\n sns.lineplot(x=list(range(len(test_y_plot)))[:96], y=test_y_plot[:96], label=\"actual\")\\n plt.legend(title=\\'Lines\\')\\n plt.show()\\n test_total_loss/= test_iter_count\\n print(\"MSE test loss: \",test_total_loss)\\n\\n '" 1090 | ] 1091 | }, 1092 | "execution_count": 223, 1093 | "metadata": {}, 1094 | "output_type": "execute_result" 1095 | } 1096 | ], 1097 | "source": [ 1098 | "class model_run:\n", 1099 | " def __init__(self,model=model):\n", 1100 | " self.patchtst_model = model\n", 1101 | " \n", 1102 | " def model_architecture(self):\n", 1103 | " n=0\n", 1104 | " for x in self.patchtst_model.state_dict():\n", 1105 | " n=n+1\n", 1106 | " print(x)\n", 1107 | " print(\"layers= \",n)\n", 1108 | "\n", 1109 | " def load_datasets(self,train_dataset=train_dataset,valid_dataset=valid_dataset,test_dataset=test_dataset):\n", 1110 | " self.train_dataset=train_dataset\n", 1111 | " self.valid_dataset=valid_dataset\n", 1112 | " self.test_dataset=test_dataset\n", 1113 | "\n", 1114 | "\n", 1115 | "\n", 1116 | " def model_hyperparameters(self,batch_size=16,lr=0.0001,epochs=20,cuda=True,Dataloader=DataLoader):\n", 1117 | " self.batch_size = batch_size\n", 1118 | " self.lr=lr\n", 1119 | " self.epochs=epochs\n", 1120 | "\n", 1121 | " self.train_dataloader = DataLoader(self.train_dataset, batch_size=batch_size, shuffle=True)\n", 1122 | " self.test_dataloader = DataLoader(self.test_dataset, batch_size=1, shuffle=False)\n", 1123 | " self.valid_dataloader = DataLoader(self.valid_dataset, batch_size=batch_size, shuffle=True)\n", 1124 | "\n", 1125 | "\n", 1126 | " if cuda:\n", 1127 | " self.patchtst_model=self.patchtst_model.to(\"cuda\")\n", 1128 | "\n", 1129 | " self.optimizer = torch.optim.Adam(self.patchtst_model.parameters(), lr=self.lr)\n", 1130 | " self.loss = torch.nn.MSELoss()\n", 1131 | " self.loss_mae=torch.nn.L1Loss()\n", 1132 | "\n", 1133 | " def model_execute(self,):\n", 1134 | " self.load_datasets()\n", 1135 | " self.model_hyperparameters()\n", 1136 | "\n", 1137 | " for epoch in range(self.epochs):\n", 1138 | " iter_count = 0\n", 1139 | " total_loss = 0\n", 1140 | " train_steps=0\n", 1141 | " total_train_mae_loss=0\n", 1142 | "\n", 1143 | " for train_x, train_y in tqdm(self.train_dataloader):\n", 1144 | " train_x = train_x.to(\"cuda\")\n", 1145 | " train_y = train_y.to(\"cuda\")\n", 1146 | " \n", 1147 | " self.i=train_x\n", 1148 | " pred_y = self.patchtst_model(train_x)\n", 1149 | " # print(train_x.shape)\n", 1150 | " # print(train_y.shape)\n", 1151 | " # print(pred_y.shape)\n", 1152 | " train_mae_loss=self.loss_mae(pred_y, train_y)\n", 1153 | "\n", 1154 | " loss_t = self.loss(pred_y, train_y)\n", 1155 | " self.optimizer.zero_grad()\n", 1156 | " loss_t.backward()\n", 1157 | " self.optimizer.step()\n", 1158 | " total_loss += loss_t.item()\n", 1159 | " total_train_mae_loss += train_mae_loss.item()\n", 1160 | " iter_count += 1\n", 1161 | " train_steps += 1\n", 1162 | "\n", 1163 | " valid_iter_count = 0\n", 1164 | " valid_total_loss = 0\n", 1165 | " valid_total_mae = 0\n", 1166 | " with torch.no_grad():\n", 1167 | " for valid_x, valid_y in self.valid_dataloader:\n", 1168 | " valid_x = valid_x.to(\"cuda\")\n", 1169 | " valid_y = valid_y.to(\"cuda\")\n", 1170 | " pred_y = self.patchtst_model(valid_x)\n", 1171 | " loss_v = self.loss(pred_y, valid_y)\n", 1172 | " valid_loss_mae=self.loss_mae(pred_y, valid_y)\n", 1173 | "\n", 1174 | " valid_total_loss += loss_v.item()\n", 1175 | " valid_iter_count += 1\n", 1176 | "\n", 1177 | " valid_total_mae+=valid_loss_mae.item()\n", 1178 | "\n", 1179 | " total_loss /= iter_count\n", 1180 | " total_train_mae_loss /= iter_count\n", 1181 | "\n", 1182 | " valid_total_loss /= valid_iter_count\n", 1183 | " valid_total_mae /= valid_iter_count\n", 1184 | " wandb.log({\"MSE Train\": total_loss, \"MSE Test\": valid_total_loss,\"MAE Train\": total_train_mae_loss,\"MAE Test\": valid_total_mae})\n", 1185 | "\n", 1186 | " print(\"epoch: {} MSE loss: {:.4f} MSE valid loss: {:.4f}\".format(epoch, total_loss, valid_total_loss))\n", 1187 | " print(\" MAE loss: {:.4f} MAE valid loss: {:.4f}\".format(total_train_mae_loss, valid_total_mae))\n", 1188 | "\n", 1189 | " def save_model(self,name):\n", 1190 | " torch.save(self.patchtst_model.state_dict(), name+'.pth')\n", 1191 | "\n", 1192 | "\n", 1193 | " def test_plots(self,ind=3,df_columns=None,scaler=None,column=None):\n", 1194 | " test_total_loss = 0\n", 1195 | " test_total_loss_mae=0\n", 1196 | " test_iter_count = 0\n", 1197 | " test_pred_plot=[]\n", 1198 | " test_y_plot=[]\n", 1199 | " \n", 1200 | " df_y_final=pd.DataFrame(columns=df_columns)\n", 1201 | " df_pred_final=pd.DataFrame(columns=df_columns)\n", 1202 | " \n", 1203 | " for test_x, test_y in self.test_dataloader:\n", 1204 | " test_x = test_x.to(\"cuda\")\n", 1205 | " test_y = test_y.to(\"cuda\")\n", 1206 | " test_pred=self.patchtst_model(test_x.to(\"cuda\"))\n", 1207 | " # print(test_pred.shape)\n", 1208 | " # print(test_y.shape)\n", 1209 | " loss_test=self.loss(test_pred, test_y)\n", 1210 | " test_total_loss += loss_test.item()\n", 1211 | " \n", 1212 | " loss_test_mae=self.loss_mae(test_pred, test_y)\n", 1213 | " test_total_loss_mae+=loss_test_mae.item()\n", 1214 | " \n", 1215 | " test_iter_count += 1\n", 1216 | " \n", 1217 | " df_y=pd.DataFrame(test_y[0].to(\"cpu\").numpy(),columns=df_columns)\n", 1218 | " df_pred=pd.DataFrame(test_pred[0].to(\"cpu\").detach().numpy(),columns=df_columns)\n", 1219 | " \n", 1220 | " df_y_final = pd.concat([df_y_final, df_y], axis=0)\n", 1221 | " df_pred_final = pd.concat([df_pred_final, df_pred], axis=0)\n", 1222 | " df_pred_final=scaler.inverse_transform(df_pred_final) \n", 1223 | " df_y_final=scaler.inverse_transform(df_y_final)\n", 1224 | " \n", 1225 | " df_pred_final=pd.DataFrame(df_pred_final,columns=df_columns)\n", 1226 | " df_y_final=pd.DataFrame(df_y_final,columns=df_columns)\n", 1227 | " \n", 1228 | " \n", 1229 | " sns.lineplot(x=list(range(len(df_y_final)))[:96], y=df_y_final[column][:96], label=\"GroundTruth\")\n", 1230 | " sns.lineplot(x=list(range(len(df_pred_final)))[:96], y=df_pred_final[column][:96], label=\"Prediction\")\n", 1231 | " plt.legend(title='Type')\n", 1232 | " plt.xlabel('Time Step')\n", 1233 | " plt.title(\"Predicted vs Actual\")\n", 1234 | " plt.show()\n", 1235 | " \n", 1236 | " \n", 1237 | " test_total_loss/= test_iter_count\n", 1238 | " test_total_loss_mae/=test_iter_count\n", 1239 | " print(\"MSE test loss: \",test_total_loss)\n", 1240 | " print(\"MAE test loss: \",test_total_loss_mae)\n", 1241 | " \n", 1242 | "'''\n", 1243 | " # plotting\n", 1244 | " \n", 1245 | " for i,j in zip(test_pred[0],test_y[0]):\n", 1246 | " pass\n", 1247 | " # print(i[ind].item())\n", 1248 | " test_pred_plot.append(i[ind].item())\n", 1249 | " # print(j[ind].item())\n", 1250 | " test_y_plot.append(j[ind].item())\n", 1251 | " sns.lineplot(x=list(range(len(test_pred_plot)))[:96], y=test_pred_plot[:96], label=\"predicted\")\n", 1252 | " sns.lineplot(x=list(range(len(test_y_plot)))[:96], y=test_y_plot[:96], label=\"actual\")\n", 1253 | " plt.legend(title='Lines')\n", 1254 | " plt.show()\n", 1255 | " test_total_loss/= test_iter_count\n", 1256 | " print(\"MSE test loss: \",test_total_loss)\n", 1257 | "\n", 1258 | " '''\n" 1259 | ] 1260 | }, 1261 | { 1262 | "cell_type": "code", 1263 | "execution_count": 224, 1264 | "id": "c4be2e6f", 1265 | "metadata": { 1266 | "id": "c4be2e6f" 1267 | }, 1268 | "outputs": [], 1269 | "source": [ 1270 | "x=model_run(model=model)" 1271 | ] 1272 | }, 1273 | { 1274 | "cell_type": "code", 1275 | "execution_count": 225, 1276 | "id": "PRq_t36mOl4T", 1277 | "metadata": { 1278 | "colab": { 1279 | "base_uri": "https://localhost:8080/", 1280 | "height": 1000 1281 | }, 1282 | "id": "PRq_t36mOl4T", 1283 | "outputId": "36d03252-4ea5-48cc-b8ce-66ec139f0b65", 1284 | "scrolled": true 1285 | }, 1286 | "outputs": [ 1287 | { 1288 | "name": "stderr", 1289 | "output_type": "stream", 1290 | "text": [ 1291 | "100%|██████████████████████████████████████████████████████████████████████████████| 1508/1508 [01:00<00:00, 24.77it/s]\n" 1292 | ] 1293 | }, 1294 | { 1295 | "name": "stdout", 1296 | "output_type": "stream", 1297 | "text": [ 1298 | "epoch: 0 MSE loss: 0.5659 MSE valid loss: 0.6731\n", 1299 | " MAE loss: 0.5382 MAE valid loss: 0.6013\n" 1300 | ] 1301 | }, 1302 | { 1303 | "name": "stderr", 1304 | "output_type": "stream", 1305 | "text": [ 1306 | "100%|██████████████████████████████████████████████████████████████████████████████| 1508/1508 [01:00<00:00, 24.96it/s]\n" 1307 | ] 1308 | }, 1309 | { 1310 | "name": "stdout", 1311 | "output_type": "stream", 1312 | "text": [ 1313 | "epoch: 1 MSE loss: 0.5202 MSE valid loss: 0.6677\n", 1314 | " MAE loss: 0.5102 MAE valid loss: 0.5951\n" 1315 | ] 1316 | }, 1317 | { 1318 | "name": "stderr", 1319 | "output_type": "stream", 1320 | "text": [ 1321 | "100%|██████████████████████████████████████████████████████████████████████████████| 1508/1508 [01:00<00:00, 24.94it/s]\n" 1322 | ] 1323 | }, 1324 | { 1325 | "name": "stdout", 1326 | "output_type": "stream", 1327 | "text": [ 1328 | "epoch: 2 MSE loss: 0.5089 MSE valid loss: 0.6622\n", 1329 | " MAE loss: 0.5036 MAE valid loss: 0.5908\n" 1330 | ] 1331 | }, 1332 | { 1333 | "name": "stderr", 1334 | "output_type": "stream", 1335 | "text": [ 1336 | "100%|██████████████████████████████████████████████████████████████████████████████| 1508/1508 [01:00<00:00, 24.92it/s]\n" 1337 | ] 1338 | }, 1339 | { 1340 | "name": "stdout", 1341 | "output_type": "stream", 1342 | "text": [ 1343 | "epoch: 3 MSE loss: 0.5026 MSE valid loss: 0.6561\n", 1344 | " MAE loss: 0.5002 MAE valid loss: 0.5874\n" 1345 | ] 1346 | }, 1347 | { 1348 | "name": "stderr", 1349 | "output_type": "stream", 1350 | "text": [ 1351 | "100%|██████████████████████████████████████████████████████████████████████████████| 1508/1508 [01:00<00:00, 24.74it/s]\n" 1352 | ] 1353 | }, 1354 | { 1355 | "name": "stdout", 1356 | "output_type": "stream", 1357 | "text": [ 1358 | "epoch: 4 MSE loss: 0.4972 MSE valid loss: 0.6522\n", 1359 | " MAE loss: 0.4972 MAE valid loss: 0.5857\n" 1360 | ] 1361 | }, 1362 | { 1363 | "name": "stderr", 1364 | "output_type": "stream", 1365 | "text": [ 1366 | "100%|██████████████████████████████████████████████████████████████████████████████| 1508/1508 [01:01<00:00, 24.48it/s]\n" 1367 | ] 1368 | }, 1369 | { 1370 | "name": "stdout", 1371 | "output_type": "stream", 1372 | "text": [ 1373 | "epoch: 5 MSE loss: 0.4929 MSE valid loss: 0.6491\n", 1374 | " MAE loss: 0.4950 MAE valid loss: 0.5856\n" 1375 | ] 1376 | }, 1377 | { 1378 | "name": "stderr", 1379 | "output_type": "stream", 1380 | "text": [ 1381 | "100%|██████████████████████████████████████████████████████████████████████████████| 1508/1508 [01:01<00:00, 24.43it/s]\n" 1382 | ] 1383 | }, 1384 | { 1385 | "name": "stdout", 1386 | "output_type": "stream", 1387 | "text": [ 1388 | "epoch: 6 MSE loss: 0.4896 MSE valid loss: 0.6478\n", 1389 | " MAE loss: 0.4933 MAE valid loss: 0.5828\n" 1390 | ] 1391 | }, 1392 | { 1393 | "name": "stderr", 1394 | "output_type": "stream", 1395 | "text": [ 1396 | "100%|██████████████████████████████████████████████████████████████████████████████| 1508/1508 [01:01<00:00, 24.61it/s]\n" 1397 | ] 1398 | }, 1399 | { 1400 | "name": "stdout", 1401 | "output_type": "stream", 1402 | "text": [ 1403 | "epoch: 7 MSE loss: 0.4868 MSE valid loss: 0.6556\n", 1404 | " MAE loss: 0.4918 MAE valid loss: 0.5835\n" 1405 | ] 1406 | }, 1407 | { 1408 | "name": "stderr", 1409 | "output_type": "stream", 1410 | "text": [ 1411 | "100%|██████████████████████████████████████████████████████████████████████████████| 1508/1508 [01:01<00:00, 24.34it/s]\n" 1412 | ] 1413 | }, 1414 | { 1415 | "name": "stdout", 1416 | "output_type": "stream", 1417 | "text": [ 1418 | "epoch: 8 MSE loss: 0.4842 MSE valid loss: 0.6545\n", 1419 | " MAE loss: 0.4904 MAE valid loss: 0.5844\n" 1420 | ] 1421 | }, 1422 | { 1423 | "name": "stderr", 1424 | "output_type": "stream", 1425 | "text": [ 1426 | "100%|██████████████████████████████████████████████████████████████████████████████| 1508/1508 [01:01<00:00, 24.47it/s]\n" 1427 | ] 1428 | }, 1429 | { 1430 | "name": "stdout", 1431 | "output_type": "stream", 1432 | "text": [ 1433 | "epoch: 9 MSE loss: 0.4818 MSE valid loss: 0.6574\n", 1434 | " MAE loss: 0.4892 MAE valid loss: 0.5859\n" 1435 | ] 1436 | }, 1437 | { 1438 | "name": "stderr", 1439 | "output_type": "stream", 1440 | "text": [ 1441 | "100%|██████████████████████████████████████████████████████████████████████████████| 1508/1508 [01:02<00:00, 24.06it/s]\n" 1442 | ] 1443 | }, 1444 | { 1445 | "name": "stdout", 1446 | "output_type": "stream", 1447 | "text": [ 1448 | "epoch: 10 MSE loss: 0.4795 MSE valid loss: 0.6614\n", 1449 | " MAE loss: 0.4882 MAE valid loss: 0.5871\n" 1450 | ] 1451 | }, 1452 | { 1453 | "name": "stderr", 1454 | "output_type": "stream", 1455 | "text": [ 1456 | "100%|██████████████████████████████████████████████████████████████████████████████| 1508/1508 [01:03<00:00, 23.64it/s]\n" 1457 | ] 1458 | }, 1459 | { 1460 | "name": "stdout", 1461 | "output_type": "stream", 1462 | "text": [ 1463 | "epoch: 11 MSE loss: 0.4763 MSE valid loss: 0.6616\n", 1464 | " MAE loss: 0.4865 MAE valid loss: 0.5881\n" 1465 | ] 1466 | }, 1467 | { 1468 | "name": "stderr", 1469 | "output_type": "stream", 1470 | "text": [ 1471 | "100%|██████████████████████████████████████████████████████████████████████████████| 1508/1508 [01:02<00:00, 24.26it/s]\n" 1472 | ] 1473 | }, 1474 | { 1475 | "name": "stdout", 1476 | "output_type": "stream", 1477 | "text": [ 1478 | "epoch: 12 MSE loss: 0.4738 MSE valid loss: 0.6610\n", 1479 | " MAE loss: 0.4851 MAE valid loss: 0.5852\n" 1480 | ] 1481 | }, 1482 | { 1483 | "name": "stderr", 1484 | "output_type": "stream", 1485 | "text": [ 1486 | "100%|██████████████████████████████████████████████████████████████████████████████| 1508/1508 [01:01<00:00, 24.56it/s]\n" 1487 | ] 1488 | }, 1489 | { 1490 | "name": "stdout", 1491 | "output_type": "stream", 1492 | "text": [ 1493 | "epoch: 13 MSE loss: 0.4724 MSE valid loss: 0.6614\n", 1494 | " MAE loss: 0.4843 MAE valid loss: 0.5864\n" 1495 | ] 1496 | }, 1497 | { 1498 | "name": "stderr", 1499 | "output_type": "stream", 1500 | "text": [ 1501 | "100%|██████████████████████████████████████████████████████████████████████████████| 1508/1508 [01:01<00:00, 24.51it/s]\n" 1502 | ] 1503 | }, 1504 | { 1505 | "name": "stdout", 1506 | "output_type": "stream", 1507 | "text": [ 1508 | "epoch: 14 MSE loss: 0.4708 MSE valid loss: 0.6660\n", 1509 | " MAE loss: 0.4835 MAE valid loss: 0.5877\n" 1510 | ] 1511 | }, 1512 | { 1513 | "name": "stderr", 1514 | "output_type": "stream", 1515 | "text": [ 1516 | "100%|██████████████████████████████████████████████████████████████████████████████| 1508/1508 [01:01<00:00, 24.48it/s]\n" 1517 | ] 1518 | }, 1519 | { 1520 | "name": "stdout", 1521 | "output_type": "stream", 1522 | "text": [ 1523 | "epoch: 15 MSE loss: 0.4689 MSE valid loss: 0.6636\n", 1524 | " MAE loss: 0.4825 MAE valid loss: 0.5866\n" 1525 | ] 1526 | }, 1527 | { 1528 | "name": "stderr", 1529 | "output_type": "stream", 1530 | "text": [ 1531 | "100%|██████████████████████████████████████████████████████████████████████████████| 1508/1508 [01:01<00:00, 24.50it/s]\n" 1532 | ] 1533 | }, 1534 | { 1535 | "name": "stdout", 1536 | "output_type": "stream", 1537 | "text": [ 1538 | "epoch: 16 MSE loss: 0.4681 MSE valid loss: 0.6668\n", 1539 | " MAE loss: 0.4821 MAE valid loss: 0.5870\n" 1540 | ] 1541 | }, 1542 | { 1543 | "name": "stderr", 1544 | "output_type": "stream", 1545 | "text": [ 1546 | "100%|██████████████████████████████████████████████████████████████████████████████| 1508/1508 [01:01<00:00, 24.45it/s]\n" 1547 | ] 1548 | }, 1549 | { 1550 | "name": "stdout", 1551 | "output_type": "stream", 1552 | "text": [ 1553 | "epoch: 17 MSE loss: 0.4667 MSE valid loss: 0.6606\n", 1554 | " MAE loss: 0.4813 MAE valid loss: 0.5838\n" 1555 | ] 1556 | }, 1557 | { 1558 | "name": "stderr", 1559 | "output_type": "stream", 1560 | "text": [ 1561 | "100%|██████████████████████████████████████████████████████████████████████████████| 1508/1508 [01:01<00:00, 24.54it/s]\n" 1562 | ] 1563 | }, 1564 | { 1565 | "name": "stdout", 1566 | "output_type": "stream", 1567 | "text": [ 1568 | "epoch: 18 MSE loss: 0.4657 MSE valid loss: 0.6631\n", 1569 | " MAE loss: 0.4809 MAE valid loss: 0.5850\n" 1570 | ] 1571 | }, 1572 | { 1573 | "name": "stderr", 1574 | "output_type": "stream", 1575 | "text": [ 1576 | "100%|██████████████████████████████████████████████████████████████████████████████| 1508/1508 [01:01<00:00, 24.33it/s]\n" 1577 | ] 1578 | }, 1579 | { 1580 | "name": "stdout", 1581 | "output_type": "stream", 1582 | "text": [ 1583 | "epoch: 19 MSE loss: 0.4644 MSE valid loss: 0.6642\n", 1584 | " MAE loss: 0.4801 MAE valid loss: 0.5872\n" 1585 | ] 1586 | } 1587 | ], 1588 | "source": [ 1589 | "x.model_execute()" 1590 | ] 1591 | }, 1592 | { 1593 | "cell_type": "code", 1594 | "execution_count": 231, 1595 | "id": "24989d45", 1596 | "metadata": {}, 1597 | "outputs": [ 1598 | { 1599 | "data": { 1600 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjsAAAHHCAYAAABZbpmkAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy88F64QAAAACXBIWXMAAA9hAAAPYQGoP6dpAADwU0lEQVR4nOydd5wU9f3/X7P9eq9wHL1XwYIQRUSqHaOoUcFuQGOMJSb+NBoTvzGJJcaYmESxocauRCUUUUFE2gHSpBwcB1e4XrfP74/PfGZmd2d3Z3Znb/f2Ps/H4x67tzs7O9tm3vN6v97vN8fzPA8Gg8FgMBiMJMUQ7w1gMBgMBoPBiCUs2GEwGAwGg5HUsGCHwWAwGAxGUsOCHQaDwWAwGEkNC3YYDAaDwWAkNSzYYTAYDAaDkdSwYIfBYDAYDEZSw4IdBoPBYDAYSQ0LdhgMBoPBYCQ1LNhhMBiqGThwIBYvXiz+v379enAch/Xr18dtm/zx30aGdmbMmIEZM2bEezMYDN1gwQ6D0UtYvnw5OI4T/2w2G4YPH45ly5ahrq4u3puniU8//RS/+c1v4r0ZPcK+ffvEz6ulpSXi9fz+97/Hhx9+qNt2MRh9CRbsMBi9jMceewyvvfYa/vrXv+Lss8/GCy+8gKlTp6Krq6vHt+Wcc85Bd3c3zjnnHE2P+/TTT/Hoo4/GaKsSi9dffx3FxcUAgHfffTfi9bBgh8GIHBbsMBi9jHnz5uEnP/kJbr75Zixfvhx33303Kisr8dFHHwV9TGdnZ0y2xWAwwGazwWBguxIleJ7HihUrcM0112D+/Pl444034r1JDEafhO2hGIxezsyZMwEAlZWVAIDFixcjPT0dhw8fxvz585GRkYFrr70WAOD1evHMM89gzJgxsNlsKCoqwm233Ybm5mafdfI8j8cffxz9+/dHamoqzjvvPOzZsyfguYN5djZv3oz58+cjJycHaWlpGD9+PJ599llx+55//nkA8EnLUfTeRn9cLhdyc3OxZMmSgPva2tpgs9lw7733irc999xzGDNmDFJTU5GTk4MpU6ZgxYoVYZ8HADZu3IijR49i0aJFWLRoEb766itUV1cHLOf1evHss89i3LhxsNlsKCgowNy5c7F161bxfers7MQrr7wivl/Ul7R48WIMHDgwYJ2/+c1vfN5XAHj55Zcxc+ZMFBYWwmq1YvTo0XjhhRdUvRYGozdjivcGMBiM6Dh8+DAAIC8vT7zN7XZjzpw5mD59Ov70pz8hNTUVAHDbbbdh+fLlWLJkCe666y5UVlbir3/9K3bs2IGNGzfCbDYDAB5++GE8/vjjmD9/PubPn4/t27dj9uzZcDqdYbdn9erVuPDCC1FSUoKf/exnKC4uxr59+7By5Ur87Gc/w2233YaTJ09i9erVeO211wIeH+ttNJvNuOyyy/D+++/jH//4BywWi3jfhx9+CIfDgUWLFgEA/vnPf+Kuu+7CFVdcgZ/97Gew2+3YtWsXNm/ejGuuuSbse/HGG29gyJAhOP300zF27FikpqbizTffxH333eez3E033YTly5dj3rx5uPnmm+F2u/H111/j22+/xZQpU/Daa6/h5ptvxhlnnIFbb70VADBkyJCwz+/PCy+8gDFjxuDiiy+GyWTCJ598gp/+9Kfwer1YunSp5vUxGL0GnsFg9ApefvllHgC/Zs0a/tSpU/zx48f5t956i8/Ly+NTUlL46upqnud5/oYbbuAB8L/85S99Hv/111/zAPg33njD5/bPP//c5/b6+nreYrHwCxYs4L1er7jcr371Kx4Af8MNN4i3ffHFFzwA/osvvuB5nufdbjc/aNAgvry8nG9ubvZ5Hvm6li5dyivtfmKxjUqsWrWKB8B/8sknPrfPnz+fHzx4sPj/JZdcwo8ZMybkuoLhdDr5vLw8/te//rV42zXXXMNPmDDBZ7l169bxAPi77rorYB3y15aWlqb4um644Qa+vLw84PZHHnkk4D3u6uoKWG7OnDk+r5nnef7cc8/lzz33XIVXxWD0Tlgai8HoZcyaNQsFBQUoKyvDokWLkJ6ejg8++AD9+vXzWe6OO+7w+f+dd95BVlYWLrjgAjQ0NIh/kydPRnp6Or744gsAwJo1a+B0OnHnnXf6pEHuvvvusNu2Y8cOVFZW4u6770Z2drbPff4pFSV6YhsBkvrLz8/H22+/Ld7W3NyM1atX46qrrhJvy87ORnV1NbZs2aJqvXI+++wzNDY24uqrrxZvu/rqq7Fz506fdNt7770HjuPwyCOPBKxDzXumhZSUFPF6a2srGhoacO655+LIkSNobW3V9bkYjESCpbEYjF7G888/j+HDh8NkMqGoqAgjRowIMAibTCb079/f57aDBw+itbUVhYWFiuutr68HABw7dgwAMGzYMJ/7CwoKkJOTE3LbaEpt7Nix6l9QD28jQN6fhQsXYsWKFXA4HLBarXj//ffhcrl8gp0HHngAa9aswRlnnIGhQ4di9uzZuOaaazBt2rSwz/H6669j0KBBsFqtOHToEACSekpNTcUbb7yB3//+9wDIe1ZaWorc3Nyw64yWjRs34pFHHsGmTZsCqvdaW1uRlZUV821gMOIBC3YYjF7GGWecgSlTpoRcxmq1BgRAXq8XhYWFQSuCCgoKdNvGSOnJbVy0aBH+8Y9/4LPPPsOll16K//znPxg5ciQmTJggLjNq1CgcOHAAK1euxOeff4733nsPf/vb3/Dwww+HLJ1va2vDJ598ArvdHhCQAcCKFSvwu9/9ThflJtg6PB6Pz/+HDx/G+eefj5EjR+Kpp55CWVkZLBYLPv30Uzz99NPwer1RbwuDkaiwYIfB6CMMGTIEa9aswbRp03zSGf6Ul5cDICrL4MGDxdtPnToVUBGl9BwA8P3332PWrFlBlwt2gO6JbaScc845KCkpwdtvv43p06dj3bp1+PWvfx2wXFpaGq666ipcddVVcDqduPzyy/G73/0ODz74IGw2m+K633//fdjtdrzwwgvIz8/3ue/AgQN46KGHsHHjRkyfPh1DhgzBqlWr0NTUFFLdCfae5eTkKDYrpOoX5ZNPPoHD4cDHH3+MAQMGiLfT1CCDkcwwzw6D0Ue48sor4fF48Nvf/jbgPrfbLR4wZ82aBbPZjOeeew48z4vLPPPMM2Gf47TTTsOgQYPwzDPPBByA5etKS0sDgIBlemIbKQaDAVdccQU++eQTvPbaa3C73T4pLABobGz0+d9isWD06NHgeR4ulyvoul9//XUMHjwYt99+O6644gqfv3vvvRfp6emierVw4ULwPK+oFPm/Z0pBzZAhQ9Da2opdu3aJt9XU1OCDDz7wWc5oNAass7W1FS+//HLQ18FgJAtM2WEw+gjnnnsubrvtNjzxxBOoqKjA7NmzYTabcfDgQbzzzjt49tlnccUVV6CgoAD33nsvnnjiCVx44YWYP38+duzYgc8++yxApfDHYDDghRdewEUXXYSJEydiyZIlKCkpwf79+7Fnzx6sWrUKADB58mQAwF133YU5c+bAaDRi0aJFPbKNcq666io899xzeOSRRzBu3DiMGjXK5/7Zs2ejuLgY06ZNQ1FREfbt24e//vWvWLBgATIyMhTXefLkSXzxxRe46667FO+3Wq2YM2cO3nnnHfzlL3/Beeedh+uuuw5/+ctfcPDgQcydOxderxdff/01zjvvPCxbtkx8z9asWYOnnnoKpaWlGDRoEM4880wsWrQIDzzwAC677DLcdddd6OrqwgsvvIDhw4dj+/btPq/FYrHgoosuwm233YaOjg7885//RGFhIWpqalS/ZwxGrySOlWAMBkMDtPR8y5YtIZe74YYb+LS0tKD3v/jii/zkyZP5lJQUPiMjgx83bhx///338ydPnhSX8Xg8/KOPPsqXlJTwKSkp/IwZM/jvv/+eLy8vD1l6TtmwYQN/wQUX8BkZGXxaWho/fvx4/rnnnhPvd7vd/J133skXFBTwHMcFlEjruY2h8Hq9fFlZGQ+Af/zxxwPu/8c//sGfc845fF5eHm+1WvkhQ4bw9913H9/a2hp0nX/+8595APzatWuDLrN8+XIeAP/RRx+J78cf//hHfuTIkbzFYuELCgr4efPm8du2bRMfs3//fv6cc87hU1JSAsrr//e///Fjx47lLRYLP2LECP71119XLD3/+OOP+fHjx/M2m40fOHAg/4c//IF/6aWXeAB8ZWWluBwrPWckGxzPyzRNBoPBYDAYjCSDeXYYDAaDwWAkNSzYYTAYDAaDkdSwYIfBYDAYDEZSw4IdBoPBYDAYSQ0LdhgMBoPBYCQ1LNhhMBgMBoOR1LCmgiDzeE6ePImMjAzdpwwzGAwGg8GIDTzPo729HaWlpQHzAOWwYAek42lZWVm8N4PBYDAYDEYEHD9+HP379w96Pwt2ALHt+/Hjx5GZmRnnrWEwGAwGg6GGtrY2lJWVBR3fQmHBDqRpwpmZmSzYYTAYDAajlxHOgsIMygwGg8FgMJIaFuwwGAwGg8FIaliww2AwGAwGI6lhwQ6DwWAwGIykhgU7DAaDwWAwkhoW7DAYDAaDwUhqWLDDYDAYDAYjqWHBDoPBYDAYjKSGBTsMBoPBYDCSGhbsMBgMBoPBSGpYsMNgMBgMBiOpYcEOg8FgMBiMpIYFOwwGg8Ho1Tjd3nhvAiPBYcEOg8FgMHot2441Y8Kj/8OfVh2I96YwEhgW7DAYDAaj1/LXdQfR7fLg2yON8d4URgLDgh0Gg8Fg9EoOn+rAFwdOAQDa7K44bw0jkWHBDoPBYDB6Jcs3HhWvt3W747chjISHBTsMBoPB6HW0drnw7rZq8X+m7DBCwYIdBoPBYPQ63txShW6XB/1zUgAAXU4PXB5WlcVQhgU7DAaDwehVuDxevPLNUQDA0vOGire321kqi6FMXIOdF154AePHj0dmZiYyMzMxdepUfPbZZ+L9drsdS5cuRV5eHtLT07Fw4ULU1dX5rKOqqgoLFixAamoqCgsLcd9998HtZl94BoPBSFZW7alFTasdeWkWXDapH9IsRgBAWzdLZTGUiWuw079/f/zf//0ftm3bhq1bt2LmzJm45JJLsGfPHgDAz3/+c3zyySd455138OWXX+LkyZO4/PLLxcd7PB4sWLAATqcT33zzDV555RUsX74cDz/8cLxeEoPBYDBizEsbKgEA155VDpvZiMwUMwDm22EEh+N5no/3RsjJzc3FH//4R1xxxRUoKCjAihUrcMUVVwAA9u/fj1GjRmHTpk0466yz8Nlnn+HCCy/EyZMnUVRUBAD4+9//jgceeACnTp2CxWJR9ZxtbW3IyspCa2srMjMzY/baGAwGgxEdO6qacdnfvoHFaMCGX56Hwgwb5jz9FQ7UteP1m87E9GH58d5ERg+i9vidMJ4dj8eDt956C52dnZg6dSq2bdsGl8uFWbNmicuMHDkSAwYMwKZNmwAAmzZtwrhx48RABwDmzJmDtrY2UR1iMBgMRvLwslBuftGEUhRm2AAAmSkmAEzZYQTHFO8N2L17N6ZOnQq73Y709HR88MEHGD16NCoqKmCxWJCdne2zfFFREWprawEAtbW1PoEOvZ/eFwyHwwGHwyH+39bWptOrYTAYDEasaLO78OnuGgDAkmkDxdszbUIai3l2GEGIu7IzYsQIVFRUYPPmzbjjjjtwww03YO/evTF9zieeeAJZWVniX1lZWUyfj8FgMBjRc7ypC24vj/x0K8b2yxJvZ54dRjjiHuxYLBYMHToUkydPxhNPPIEJEybg2WefRXFxMZxOJ1paWnyWr6urQ3FxMQCguLg4oDqL/k+XUeLBBx9Ea2ur+Hf8+HF9XxSDwWAwdKe21Q4AKM22+dyeaRPSWKyLMiMIcQ92/PF6vXA4HJg8eTLMZjPWrl0r3nfgwAFUVVVh6tSpAICpU6di9+7dqK+vF5dZvXo1MjMzMXr06KDPYbVaxXJ3+sdgMBiMxKZGCHaKM/2CHabsMMIQV8/Ogw8+iHnz5mHAgAFob2/HihUrsH79eqxatQpZWVm46aabcM899yA3NxeZmZm48847MXXqVJx11lkAgNmzZ2P06NG47rrr8OSTT6K2thYPPfQQli5dCqvVGs+XxmAwGAydqWntBgCUZPkrO8yzwwhNXIOd+vp6XH/99aipqUFWVhbGjx+PVatW4YILLgAAPP300zAYDFi4cCEcDgfmzJmDv/3tb+LjjUYjVq5ciTvuuANTp05FWloabrjhBjz22GPxekkMBoPBiBGispOV4nO7VI3F0lgMZeIa7Pz73/8Oeb/NZsPzzz+P559/Pugy5eXl+PTTT/XeNAaDwWAkGNSzw5QdhlYSzrPDYDAYDIYStaKywzw7DG2wYIfBYDAYCQ/P82IaK7iyw9JYDGVYsMNgMBiMhKet241ulwcAUBRQjcU6KDNCw4IdBoPBYCQ8NW2kEis3zQKb2ehzH1V2upweuDxexccfOdWBdfvrFO9jJD8s2GEwGAxGwhOsxw4AZNikWpv2IBVZy1bswI3Lt+JQfUdsNpCR0LBgh8FgMBgJT7BKLAAwGQ1IsxC1J1hF1rHGTgBAfZs9RlvISGRYsMNgMBiMhKcmSCUWJVRFVrfTg04n8fvQS0bfggU7DAaDwUh4aoN0T6aEqshq6HCI17ucrGKrL8KCHQaDwWAkPMG6J1OyQig7jZ1O8Xo3U3b6JCzYYTAYDEbCE8qzA8jKzxU8Ow3tcmWHBTt9ERbsMBgMBiPhCdY9mSKmsRSVHZbG6uuwYIfBYDAYCU273YV2BwlSlErPAZlBWdGzI6WxmLLTN2HBDoPBYDASmjqhXDzTZkKaVXl+daYteBdlX4MyC3b6IizYYTAYDEZCI83EUjYnA3JlRyGN1cEMyn0d5RCZwUgyeJ7HvzdU4vAp3+6pFqMB1589EEMK0uO0ZQxGYvLmd1XYVd3ic5uB43DllDJMKMsO+ritR5tQcbwFS6YNgtHAKS7jcHvw4pdHcN7IQoztlxV2W8L12AHknp0wpecuFuz4c/hUBz6qOInbzhkcVDlTy6H6Dny2uwY3/WgQUi2JE2IkzpYwGDHk+xNtePy/+xTv63B48OcrJ/TwFjEYicvu6lY8+P5uxfu+P9GKj5ZND/rYe/6zE1VNXchOteCKyf0Vl3lpw1H8efUPeHd7Ndb9YkbQoIgSrhILCF2NJVd2uhzMoCyH53nc83YFdla3wuHy4MH5o6Ja3+P/3Yv1B06hy+XBA3NH6rSV0cPSWIw+wdZjTQCAkcUZuHf2cNw7ezhmjSoCAHSynR+D4cPLGysBAGcMzBV/L0vPGwIA2HOyDfYg6kh9mx1VTV0AgJc2VILn+YBlXB4vXvnmKADgWGMXvthfH3Z7tCk7zLOjhe1VzdhZ3QqAqHnRVKt5vTy2HWsW15VIKUMW7DD6BDuqWgAAC8aVYNnMYVg2cxhmjSoEALi9gTtkBqOvUt9mxye7TgIA/t+Fo8Xfy72zR6Agwwq3l8fuE62Kj91xvEW8vremDZsrmwKW+ez7WtTK5lP9e0Nl2G0K1z0ZCF6N5fHyaOqSKTssjeWD/P1vs7vx3rbqiNd1pKFDHMTa0uXC+zsiX5fesGCH0SfYcZycbUwakCPeRqVzj9cbl21iMBKR1749BpeHx+kDczCuv+Sn4TgOkwSvzo6qZsXH0pMKmpV6SSGQobddNaUMRgOHTUcasfdkW8htCtc9GQiu7DR3OSEXmLpZnx2R6uYufP59LQDgmjMHAABe3ngU3ghPALcrfP6RrktvWLDDSHpOtTtwvKkbHAeML5N23iYj+UUyZYfBINhdHryxuQoAcOO0QQH305MFGtT4Q4Ogm380GACwel8dqhq7xPu3VzWj4ngLLEYD7ps7AnPHFgOQ0mbBoEqQGs9Ol9MDl0c6gZGnsOj9DMKrm47BywPTh+bj1/NHIcNmwpGGTnz5w6mI1ke/F1efMQDpVhMOn+rE14cadNziyGHBDiPpqRCk9WGF6eLZHwAYDeTr72HBDoMBAPio4gSaOp3ol52CC0YXBdw/aUA2AOVgx+3xYpfg/fjx5P44d3gBeB5YLvhzAEnVuWRiKfLTrWJA9VHFyYCghNLt9KCli6g1oTw76bIqonZZRRY1J1MllwU7hE6HG29+JwS20wcizWrCotPLAAAvhQk+g0GD3R8NK8CPpxBzupK6Fw9YsMNIeugPcFJZjs/tJgNTdhgMCs/zeGnDUQDA4rMHwmQMPDyM758FA0eUlhrBR0M5UNeObpcHGVYThhSk48bpJJD5z9bjaLe7cLKlG58JKZMlQpBz2oBsTCjLhtPjxRvfViluF32eNIsRGSHKok1GgxjwyCuyaBBFVSE2LoLw3vZqtNvdGJSfhhnDiX/x+qkDYeCArw824Ie6dk3r63C4xcdMGpCNxWcPBMcBX/5wCofqta0rFrBgh5H00LNQelZKkTw7LNhhML453IgDde1ItRhxpXCG70+qxYSRxZkAAtUd+v/EAdkwGDicMywfQwvT0eFw452t1Xh10zF4vDymDs7D6FKyDo7jcOO0gQCIV8jhDlRd5DOxOC50ibpSF2U6KmJAbioAwO7yJoyPJF54vTxe3ngUALBk2kAYhH1hWW4q5oxRl1r0Z1d1C7w80C87BUWZNpTnpYkVr/S54gkLdhhJjcfLY6fQGE1uTgaYssNgyKHphh9P7o+sFHPQ5aRUlq9JWTypEEzMHMdhiRDIvLSxUpYy8fUCzR9XgqJMKxo6HFi5sybg+dR0T6YoVWQ1CsoODXYAoLuPV2St/6EelQ2dyLCZsPA0315I9PN5fztJaapFHuyK6xIUvPe2V6OlS/26YgELdhhJzQ917ehyepBuNWFooW+XZFaNxWAQKhs6sVbod7NYwZgsJ5hJWani8fJJJHCqbu5Ga7cL5XmpmDmy0OdxZqMB108dCIAERf69eag5OZRfh6JUkUXTWP2yU0CFoc4+nsqi6cqrzxgQ0DF5SnkOxvXLgsPtFQNUNfgHuwBw1uBcjCrJhN3lxZvfHY92s6OCBTuMuLDlaBPueH1bQN4/HHVtdix9Yzu+Uenwpz/ACWVZAV1aTYJB2e1hyg4jOfjz/w7gL2sPan7cciFlcf7IQgzKTwu5LFV2dp9ohdNNThRaupw4cqoTADBRdrBLsRjFkmaAeIGUuiVfc8YA2MwG7DkZ2JunRkWPHYpSF2VqUC7IsCLFbATQt+djHahtx4ZDDTBwwPVTywPu5zgON04fCAD4+/rDuOKFb3z+lPoi8TyPCoVgl+M43CQoRa9uOupTJdfTsGCHERde//YYPvu+Fm9uVn/mAAArd9Xgv7tr8KzKHXowczLAPDuM5KK124Xn1h3CU6t/CNrhOBg0wPjxFGWvjpxBeWnISjHD4fZify3pj0MrHgflpyEnzeKz/PVTy5FqMSI3Lfj4iJw0Cy4X0in+XpFaFd2TKaGUnbx0K1ItJNjpyxVZq/YQk/j5o4rQPydVcZkF40rRLzsF7Q43th5r9vn73X/3orq5y2f56uZuNHQ4YTZyGCP4sSgXTShBfroFNa12fBVhSbsesNlYjLhAzwjlHVfVUNNCzvJ2n2iF2+NVrBiRQ9fvb04GpD47LNhhJANytaLD4YZNUDHU4BTOuHNSg3t1KAYDh0kDsrH+wCnsqGrB+P7ZiikMSklWCj772Y9gMhqQYQu+/iVnD8SKzVX4317Sm2dAHjkQ16iYi0VR8uxQg3JeukUYTOns08HOduEEcNqQvKDLWEwGvHvHVOz02z+/+NURbK9qwWubjvnM0KLrHF2aFfC9s5qMePTisSjIsOL0gYEnnT0FU3YYcYGagiuqWjRVRtQI+fsupwc/1HWEXLa124VD9WSZiQo7YSMzKDOSCHklU5dD28GcBvz0BCAcVCmlymmokwoAKM9LQ7/s0AbjYUUZOEfozfPKpqPi7aKyk6nCoOxXjcXzvKjsFMiUnb6axuJ5XladGjrwKMlKwdyxJT5/S88bCoDMvZLPFAwV7ALAgvElOGNQbthquljCgh1GXKA713aHG4dPhQ5a5NAdHyCdTQSDnpWU56UiL90acL+JpbEYSYTdJfkhtBpwqW+NNtoMh1iRdZycrIjp4jAH0HDQMvS3t5DePHaXB41CRZA2ZYcEO51ODxyCipyXbkGKEOz0VYNyZUMnWrtdsJgMGFWSGf4Bfpw3ohAD81LRZnfj/e3S3Cvp88/Wa1N1hwU7jLggV1OCtZ5XQh7shHtcuLMNSdlh1ViM3o/cpyM/61aDqOwomIeVmCD8po41dmHL0Sa0292wmQ0YUZyh6Xn9OWdYAYYUpKHD4ca726pR30ZUGavJgGwVKTbJs0NePy07T7UYkWox9Xllh+4Tx/XLgsWk/fBvMHBiQ0g6Q8vu8mCPMNvstCiD3VjCgh1GXJCXe9OS1fCP4VEnm5Yc7nFKpbByTGxcBCOJoAoGQBQNLdCTD6VKKSWyUsxiKwfaMG58v2yYw3jowiE/mC7/5iiqW4gRtkRFQ0EgsBpLMicT0zTx7PRdg7K4TwxyAqiGKyb395mhtedkK9xeHvnpFvTPCZ9qjBcs2GHEBXm5t1plp7HDAbeXF3tlHDnVGbRRlW9uOltxGebZYSQT0Sk7JFBSq+wA0gHzf3tJdY9eKYzLT+uHrBQzjjV2YYVQrammEgsIrMai5uR8IY0tVWP1zTSWWr9OKPxnaInNBMty4urJCQcLdhhxQR5gHKhrR4eKnTOtyijKsGGgUKlREaSai+amrSaD2N7eH9Gzw/rsMJIAH2VHY7AjeXY0BDvCAZP+lPUKdlItJlx9BunNs3IX6aispnsyEFiNJSo7ab7BTl9MY3U53dhfK82uigb5DK13t1Xrss5Yw4IdRlyQBzs8D+xSUYIulqBm28TccDBVSE1umik7jGQiGmWH/ga0pKH8D27RmpPlXD+13CfwilTZaRSVHZLGSjGTNJbWNF8ysLu6FR4vj6JMqyqzdyjkM7T0CqBiDQt2GHGByua0VFRNv51aWSdVeTWIEpJfJzvo+lifHUYy4RPsaDyYezR6dgBgeFGGqJSUZtlQlBndAVROaXYK5o0tFv9Xe3Cmnp0upwcuj1c0KPunsbr7YBqL7itPG6BPukk+48zAAeP7Z0e9zljCmgoy4gKVzacMzMW6/fXYfiy8SZn22CnOTBHPIiuqmuH18uLUXsq2Yy0AQp9tsmosbeyubsXSFdt9utNGQ4rZiD8sHI9zhhdEtZ5tx5rx4Pu78PCFYzB9WL4u29YbiSqNFYFnx2jgMKF/NjYdadRV1aHcOH2QmMYqVhlIpcvmPLXb3T4NBQEg1do7OyhXNnTijte34Y4ZQ3DJxH4RrUPv8nA6Q2v3iVYML8rwee8TEabsMOICPZOcInTU3HG8JWAAoD+1sk6qI4ozYDMb0GZ340hDp89ye0+2YV9NG4wGTly/ErQay8tDU2PDvsoXB+pR1dSFli6XLn81rXZ89n3glGut/G9vLX6o6xCNsn0VubKj5WDu9fKi70aLsgMAF00oBQBcOL5E0+PUcNqAHMwcWYhUi1EsdQ+HyWgQD7pt3S7RsyMqO0J3365eNvV846EG7K9tF/0xWuF5Htt1MCfL4TgOPzt/GAwcsGCc/p+/3iR2KMZIWmiwM6F/NixGA5o6nahq6kJ5XvAhhDWyGTlmowHj+2Xju6NN2FHV7DPRnM7WmTe2GIUZwc8I5Tt2D8/DgMStJEgE3MJIgUsmluLOmcOiWtfbW6rwz68r4XRHH2R2CD1VXH3caC5XdtQY/ike2UmGSWVTQcrVZ5ThogklIcdARMM/rpsMj5fXNPoi02ZCh8ONNrsraOl5bzMo098e9SBp5WSrHafaHTAZOIwtzdJtu2aNLkLFI7ORkeCqDsCCHUaccAmyeYrFiNGlmag43oIdVS0hg51avxk5kwYIwc7xFnGAYUOHAx9VnATgm1NWQi7Ze7w8NOxP+yTUxJqbZvEJLiOhWKiuceowBZke2D19PB3p8FF21Ac78jYQRpXjIigcx8Us0AGIYVrr7zIzxYyTrXa0dbvF7ssFgrIjdlDWmOaLN/S319jpiOjxNIU1qiRTfA/0IjOGn7+esDQWIy7Qcm+TgZNVVgX37fA8HzD9WDQpyyqy3vi2Ck6PFxPLssN285QrO6wiKzxau+yGglbIudw6BDuCstPXP0O7j2dHvXIh96zp8dnGG3rwbex0oKWL+Mvy/A3KvSyNRX97jR3OiFLu4XqO9QVYsMOIC/KOreEqqwCgqdMJp8cLjoOYmqK55wO1beh0uOFwe/Dat8cAhFd1AD9lp4+nQNRA00ThJs2rwSIoCHooO+3CWbq7j3+GjghLz+XViEkR7AgVWUcbSPdlo4FDttB/p7d2UKb7S7eXj6hAoDfMroo1LI3FiAseWV8P+gPce7INdpdHMT9P/Tr56VZRFSjKtKE0y4aTrXbsqm7FiZZuNHQ4UJxp8ylbDYavstO3UyBqiKTLbjBEZUePNJadprH6drDjOwhUi7IjS2MlQ7AjKDuVDWTAcG6aRazW7K1NBeWBfEOHA9mpFtWPdbg9+F6YXUWn1fdFmLLDiAtyZadfdgoKMqxwe3l8f6JVcXl/vw6Fqjvbq5rx0gZiTL7+7HJVzdE4jhN37n39QKkGrfOTQkE/H4ceaSyq7PTxgNXujk7ZMRq4hG73rxbaRZlWaealSYFBai+dei73ozVoNCnvq2mH0+1FTqoZ5ULn+b5IXIOdJ554AqeffjoyMjJQWFiISy+9FAcOHPBZZsaMGeA4zufv9ttv91mmqqoKCxYsQGpqKgoLC3HffffB7e5dX+a+htz/wXGcOGcnWEdkqceOf7BDHvfGt8ewt6YNNrMB1wit5tXAuiirh55dRjvsEQAswjqcegY7fT6NJb2XmgzKOgaxiQBtVHrkFAl2CjKs4n0plt7ZZ8cl2z9prciSUliJPbsq1sQ12Pnyyy+xdOlSfPvtt1i9ejVcLhdmz56Nzk7fvim33HILampqxL8nn3xSvM/j8WDBggVwOp345ptv8Morr2D58uV4+OGHe/rlMDRAz8LpDpYqNMEmmde0SN2T5dBg56Sg/Cw8rb8midfElB3V6HlQjEUaq68HrHJlR1PpuUc/43kiQJUd+h7IlZ00wbPjdHt71W9evq20nF4tYn+dKCadJwNx9ex8/vnnPv8vX74chYWF2LZtG8455xzx9tTUVBQXK3sw/ve//2Hv3r1Ys2YNioqKMHHiRPz2t7/FAw88gN/85jewWNQf+Bg9h1vcwZKDHg1atgudj/2RKrF8BwKOKc2C2ciJ5tkl0wZq2g6m7KhHV8+OTsqOw+0RTc696eAVC+RNBe0ucjBXE5i6dPxcEwH/UmjaUBCAT9l1l9Md07J5PZGrlo0agx25stOXSSjPTmsr8Wvk5ub63P7GG28gPz8fY8eOxYMPPoiuri7xvk2bNmHcuHEoKioSb5szZw7a2tqwZ88exedxOBxoa2vz+WP0HDzPB6gE4/tnwWjgUNtmx0lBxZFTE8SzYzMbMVpoknXu8AIMLczQtC2SstO3/R5qcMei9DxKZYeqOnqsq7fj739S60sRU8o6pCcTAVqNRcmTBTtWkwH069ubTMry/dMpDWmsU+0OVDd3g+OACWX6NRPsjSRMNZbX68Xdd9+NadOmYezYseLt11xzDcrLy1FaWopdu3bhgQcewIEDB/D+++8DAGpra30CHQDi/7W1yu3jn3jiCTz66KMxeiWMcMhPwE1ilYQJI4szsOdkGyqOt6A021fBqW3z7bEj59ozBqCh3YF7LhiueVuMgrLElJ3w0LNLow4HRbNOyo48XcOUHd/3ssvhUdXwTfxck1TZod2TAVKUkGohHZZ70+RzX8+OemWHqjrDCtN7jYoVKxIm2Fm6dCm+//57bNiwwef2W2+9Vbw+btw4lJSU4Pzzz8fhw4cxZMiQiJ7rwQcfxD333CP+39bWhrKyssg2nKEZnyZmso6tkwZkY8/JNuyoasZ82awVnudR06rs2QGAK08vw5WnR/b50WCrr5tb1RALZSfaPjvtMmWnrwesDrfvwVutb0fPZpGJAPXsUApkyg5AUlkdDrcmE3e88Xgi8+zIJ533dRJCt1y2bBlWrlyJL774Av379w+57JlnngkAOHToEACguLgYdXV1PsvQ/4P5fKxWKzIzM33+GD2HbxMz6StIe0D4V2S1drvEs9YildOP1cJKz9UTiz47TNnRD4e/sqPyYO5fLNDbyUoJruwAQFov7LUjD+TpCAw1sGaCEnENdniex7Jly/DBBx9g3bp1GDQofNfbiooKAEBJCTnznzp1Knbv3o36+npxmdWrVyMzMxOjR4+OyXYzoiNYEzP6g9x9otXnIEj9OrlpFk0DAdVAlaW+rgqoQVR2NM5PUkI0KDPPjm7Y/UYgqB0ZkXTKTgiDMgCk9MIuynI1XG3pudvjxa5q4oPt6+ZkIM7BztKlS/H6669jxYoVyMjIQG1tLWpra9HdTVIWhw8fxm9/+1ts27YNR48exccff4zrr78e55xzDsaPHw8AmD17NkaPHo3rrrsOO3fuxKpVq/DQQw9h6dKlsFqtoZ6eESfkkqx8BzsoPw1ZKWY43F7sr5VM42Ills6qDsCUHS1I3g4d+uyIBuXo3nem7EhQg3J2KjnYq20s6Eoyz066zdedkZvmq+yk9sJeO/KTsQ6HOyCwVeKHug50OT3IsJowtCC6wb3JQFyDnRdeeAGtra2YMWMGSkpKxL+3334bAGCxWLBmzRrMnj0bI0eOxC9+8QssXLgQn3zyibgOo9GIlStXwmg0YurUqfjJT36C66+/Ho899li8XhYjDLTUleMgtnEn/3OKwz2DVWLpgejZYdVYYRFHfOjYQdnj5aMKUtpZsCNCD4D04K61GkuPZpGJgNHAIcNKAp4MmylADZaCnd7p2QHU+XZoz7IJZdk++9m+SlwNyjwfeudUVlaGL7/8Mux6ysvL8emnn+q1WYwYE0o2n1SWg/UHTmFHVTNuOHsgAKBWMCcrVWKRFbqBjlogK7TfSwmqUvT1A6UaXDp6O6iyAxDfjrz/iRZ80lh9OGB1e7zi2X9emgVHTnWqTmMlm2cHICbldoc7IIUF9FZlx/e73dDhRP+c0KMf2KRzX5IjlGf0KkKVuipNQA+r7Kz9DfD0GOCHVZq3xcSaCqrGEwPPDhCdb6fDIU2A7suT6+U9dqiyo1a5SDbPDkAUHcC3ezKFTj7vrQZlQF35OTMn+8KCHUaPI6VDAr9+E4SW5scau8QftNRjJyVgebidwPbXyPVd/9G8LaJnpw8fKNWip2fHLAuYoqnI6mCl5wB8zck02FFbep5ss7EAqfxcSdnpjfOx/JXncGms1i4XDguzwSb24Unncliww+hxxJ2rgkKQlWLG0EJipqsQ1J2Qyk7ll4CdLIfD6wCvth0YU3bUQ6V0PTw7HMeJ6k40VVRyz05f/gypsmMxGsTmcWoP5pKykzyHA1qR5V92DgCpgoeny9V7PDv0N2Izk88o3OTziuoWAMDAvNQAg3ZfJXm+3YxeQzjZ3H8CujQXSyHY+f596Xp3E3CyQtO2sGos9eitAFB1Rzdlpw+XnlNlx2o2iJ6UvqzsZIVQdkTPjkpPUyJA90+0IjVc+TmbhxUIC3YYPU44Q6R8Anq73SXutANKz90OYP9/yfWsAeTy8FpN2yL12em7B0q16OnZAfTposxKzwm06abVZES6UInUpTbYEd5/vT7XRODHU/rj7CF5uGhCScB9qdbe2GeHfLdpU9VwaSxmTg6EBTuMHsd/4rk/9Ae683grTghDQTNtJqRZ/YoHD68DHK1ARgnwo5+T2w6t0bQtrBpLPeE+N63o0UVZHuy4+vBnSEdF2MwG0YDboboaK/kMymcNzsOKW85SHAxMlZ3uXpTGor89Guw0dgYPdrxeXrQATGJ+HREW7DB6nHCy+fCiDKQK82s2HGwAAJQomZP3fEAuR18KDL2AXK/eAnQ3q94W5tlRj94lymYduijL01h9OWClyo7NbESaVVsfGY9XP+N5byDF3PsMynT/RFP5De3B01iVjZ1o7XbBajJgZElgsNdX6RvfbkZCES4dYjRwmNA/GwDw6e4aAAp+HZcd2C/0VhpzGZBdBhSMBHgvcCR8byb5c8m3iRGcWKWxXFEoO/5NBcP17kpWqLJjNRmQJig7aqd6J6OyEwqqfPUuz47vbMBQyg5NYY3vn5U0jSL1gL0TjB7HrWKgJE1lbRd+uAGVWIfWAM52ILM/0P90ctuQ86X7VMKUHfW4da7a0WM+llzZAfru5yhXdlIFZUftuAiP8P4rVUcmI6JBuTelsfwMyk2dzqAnaMycrAwLdhg9jhrZ3P+HGqDs0BTWmEsBup6hQrBzeB2g8gxf6rPDDMrhkDw7OhuUI1R23B4vuv1mBPVVhU6u7Gg2KPc5ZacXprGE315BhhUcB3h5oLlLOZUlmpOFqlYGgQU7jB5Hzc51ot8P1UfZcXUDBz4j18dcJt1ePg0wpQBtJ4BT+1VtC1N21KO3ZyfaPjtK4xD66ufokCs7okG575aeh6I3dlCmQbzNbEBOKumbo1R+3uV0i0OUmbLjCwt2GD1OqHERlIIMK8pyJVOyT/fkg/8DXJ2k3LzfZOl2sw0YOI1cV5nKYtVY6tF7YCRdjyNCZaddGBUhD5r7aidsu6waK11WWq3GwxSqo3ky0hs7KMtPNOgIDKXy813VrfDy5OQw6CzBPkrf+HYzEgqPCs8O4Fs2WSr/4cpTWJzfOobOIpeH1PXbYcqOOnieh0tFkKqa5qO4p/lx/NK0Ajm1G4lapxGqXNAGckDfHQYqNhU0SZ4dt5dXFUiKJx99zbPTi6aey9s+0K7QSsEO668TnLhOPWf0TdTK5qcNyMbHO08CkHl2nJ3SwM+xlwc+iJqUj30DOLsAS+jJwHQHz5Sd0MjfHl28HZuex+ndX+N0E4BvVwJbrED5VGD4POD0mwFj+F0TNSdn2Exo6XbB4+X77OcopbGkaiyAqBc2c+iJ8mpPPpIF+v64PDxcHm+vqFiS7zNpV2ilkRHbBXPyaSyFFUDif8qMpENtOuS0cvKDzbCZxHk/OLQGcHUBOQOBkomBD8ofRtJbHgdwbGPYbWHKjjrkHaZ1KT0/tgkAsMkzGp3WQvJ5HVkPfP4AcOC/qlZBy87TbSYxcO6rn6PdLSk7RgMnzlBSU5HV1zw7NI0F9J5UlrTPlIId/8nnPM+Lyo6/55HBgh1GHFDj2QGAcf2ycPesYXj80rHSjad+IJfl0wNTWAC5baj6EnSpz07fTH+oxS3zwkRdet7dAtR9DwC4y7UMK87+HFj6HTBsNrm/equq1VBlJ91qEoeT9tX5WFTZsQpBDvXtdKpI1YSbVZdsWEwG8bX2FpMyNfETZUc5jVXd3I2GDgfMRg5j+2VF/6T1+0lla5LAgh1Gj6N258pxHO6eNRyXTOwn3dhO0lrILA3+QA3BDlN21CF/f6JWAI5/B4BHg6UfTiEbTi8PFIwARl1E7q/ZqWo11LOTbjUzZYcalE1EtaAVR9qUnb5zOEjpZb4d+WT6PFHZ8U1j7RBGRIwuyQybugz/hG7g1YuB1y4DPr2f/N/L6TvfbkbCEJVs3kY6KiMzcMCfyKBzAIMJaDwEbH815OrEaqw+WsWjFrkXJmoFoIqksI6lTwAg67NTQv5HzU5VfZLknh2TsW9X1dn9lB06R06pPN8fqoaZ+4hBGehdvXZ4npfadcjSWA2dfsGOns0Ej20AOurI9e/+Abx1NeBoj369cYQFO4weR+ygHMnOte0EuczsF3wZWxZwxq3k+sd3Al/9MejBkyk76qAHRAMHGHQKdqozJgKQdVAuGAUYzIC9BWipCrsa0bNjNYmfY6Q9e3o7tOqKKjtpGpSLvubZASSTcm8IdvxPNMRqrHbfNJaulVj7PiGXJRMBk420+/j3HKDlePTrjhMs2GH0OJJnJ4KvX7ug7GSEUHYAYM7vgen3kOvrHgc+vQ/wBu7Y2Gwsdeg2KsJlB05sAwDUZE8kN1Flx2QBikaT6zUVYVclenZsUrDTVz9HWnpO0xepVvWTz/uaZwfoXWks/xRyfpqQxup0iH2UHG4P9p4UmglGO+nc6wX2rSTXZz4ELP4USCsE6vcA/zofOLE9uvXHCRbsMHqciHeubifQeYpcD+XZAYhRedYjwLwnAXDAln8C7y4B3L5nQ0zZUYdHr7P/kzsAjxNIK0RXajkAv9lY8lRWGDqEpoLpVpPYQqCvfo5Snx1qUI5E2ek7hwOaxuoNBmV5AG82GpCfQZQdu8srDnvdc7INTo8XeWkWn2asEVH9HdBRC1gziSWg/2TglnVA4RiS2nrnBtXjeBKJvvPtZiQMEc/ioaqO0QKk5ql7zJm3AVe8RNIjez8CPlrqc7fUZ6dvpj/UIvcMREXVN+SyfCrMQsrFZzYWbSegKtiRPDu0+6+7j3qvxDSW2degrGZkRN9UdrRNho8n/spOqsWEFOFzpuXn8hQWp1SlqgWawho+FzARFQnZZcCNnwFGK0kxNx6O7jniAAt2GD2OJ1LPjjyFpeUHPfZy4MpXyPUDn/vcxZQddVDPTtQHRKG/DgacLQ0C9SgEOycrwp49tstKz6VqrL4ZtDpc0rgIALJhoCoMyn3Ss0OVnV6QxpL9Pujvj6o7DWKwo5M5meeBvR+T66Mv9r3PlgX0P51cP/p1dM8TB1iww+hxIt65tqkoOw9G/zPIpbPdx7vDZmOpQ5dUh9cDHN9Mrg84S2wq6aPsFI0GOCPQ1SB93kHocAQGO331c6TKjlUsPSeXapQdMZDtQ9VYvWk+ljyFTFWbvDTfLsq6TTqvqQBaqwBzqtSNXs7A6eTy6IbonicOsGCH0eN4IjW7UmUnkmDHlildd7SJV5myow55B9eIqd9L3ntLBlA8TlR2fCqozClAwUhyPUwqS25QpoFTsn6O9W12PP/FIZxqD5yHBMgNyr6l51o8O1Gbz3sRvan0XOnkkDYWbOxwor7NjhMt3eA4YHy0wQ5NYQ2dpTxqRx7s9DLfTt/5djMShogHStIz/XCVWEqYrIBJMO7ZW8WbRUWgj3o91CLv4BoxNIVVdgZgMEppLP9hlaUTyWW4YId6duRNBZP0c3xl01H8cdUBvP7tMcX7xT47fqXnavrs9EXPDvU0dbt6QbDjCfx8pPlYDrGZ4IiiDDF9GRE+KaxLlJfpfzrx7XTU9jrfDgt2GD1OxIMHo0ljASTnDPgEO0zZUYcuB0RqTh4wFQBgMSp4dgDVFVnKpefJ6dlp7iKVZ0qTrgFSegwEKjtqxkX0Rc8ONfiq6TAdb9wK+8s8Udlx6Ndf59R+oPEgKQCho1v8Mdt6rW+HBTuMHifinWs0aSxAMdhhs7HUIVVjRbjL4HlJ2SkXgh2axnL7BZoqgh2vl0eHU8mgnJxBK01TBfPg2F2+1VhSB2U11Vh9z7OTZu19pefy35588rloTo62vw5NYQ0+zzft708v9e2wYIfR4yj9eFVBuydnRBrsCD9gu8yz08f7s6hFSUrXRPNRIn0bzEC/yQCkqfcOf2WnaCwAjsxB66hXXF2XyyNaBjLknp0kTWPRQZ9UzZLD87xs6nkk4yL6oLLTizooK6X96XysujY7dlWTk7eolR2awqIz6oLRS307LNhh9DgR9dnheaC9llwPNRcrFIrKDqvGUgOV0iM+IAojIlA6iZiQIVd2/IIdazqQP5xcD6Lu0IO+ycDBajIkvbJDvSXtCkqNy8OLxxyr2dezo8ag3Cc9O8L71NULPDtKnw81KO+sbkG3y4MMqwlDCtIjf5KmI0DdblIJOXJB6GV7qW+HBTuMHscTyZlkVyPpvAsOSC+O7ImZZydiIlbjKMekZoKUoJ4dQJbKqlBcndg92WYCx3FJ79kR01gKyg5VdQDJsyM1FQx/MHf14WqsXtFnRyHNSNNYVPWZOCA7upl1NIU1cDqQmht62V7q2+k7325GwuCKxKBMU1hpBWSGUiSE9OywYCcUrmjTWFXfkssBZ4s3WUxkXQHVWEBY3468oSAgHQhcSZrGCuXZoSkujpMCyHQNpec0QDT2Ic9OioZqtXij1BogL813Hxh1f50j68llOFWH0gt9OyzYYfQ4Ec1ZaqPm5AhTWABTdqIgqtlYHadIlQcADDhTvNliJAccxUnlNNg5GSSN5fALdpI8HdlNPTsKwY58LhZtOpdqlfrIeMO8J1H7sXoh1NPUm0rP5b+9nFQL5B/XpPIozMk8D9TsItf7TVH3mF7o22HBDqPHiciz007LzvtF/sQ02JE1FWTVWOpQKn9VTf0ecpk3FEiRdsrmkMrOeHLZWgV0NQXcTdM5GTZy0Ep2z44jRBrLIZqTjeJt8n4r4Xwpug157UXQ0vPeMPVcybNjMHDIFbooA8DE/tmRP0F7LelYzhlIB3M19ELfDgt2GD0O9exo8n9E01CQYqXVWHJlJ7mrePQiKs8OrajyaxkQ0rNjywJyB5PrCqmsdn9lh1bVKa0rCaAKhNPjFYMbilR2Ln02VpNBPPMPV34ecUfzXkxv6qDsCtIagJqUB+enISctwtQ+ANQKqk7+cLF4ICxmG2kOCvQa307f+XYzEoaIlJ0YpbGYZ0cdUaU6OurIZXqRz81BOyhTQvh2pIaCZp/tSlZlxy5TZ/zVHamhoKTscBynutdOX2wqKHZQdnrAJ3gaRiro8D1cU5PyxGhLzmkKq3i8tsf1Mt8OC3YYPY4nkjJmXdJY2eTS3iLeRM+WWLATmqgOiFTZSSv0uVmu7CgecPwrsuytwJ4Pgc9/haw6Ynimyk6ytxCg6g0Q6NuRRkX47s7TLOp67eg20b4XQT1Nbi+vrCwmEPS3Z/b7fIYUpAEApg3Jj+4JaoWTiZIogp0EDxgBIIpBGgxGZEjdeLUoOzqksUIoO8mqCOgFDVAjGgTaeYpcphf43EyVHZ4nQUrA96FkIrms/Ap4eT6ZmO4lB/rpKUMBPCZ6dsxJnMbied7HSNuuQtkBpC7B4UZGRPR71Mrx78h8OhrAxplU2XvV7fT4+J0SjWCeqvvnjsScMcU4c3BedE9Qu5tcalV2+k3x9e3kD41uO2IMU3YYPY47iCwbkrYoR0UAsmAncOp5sioCeuGK5DOjBEljmWX+n5C9droagWMbSaCT2Z+sykkCKEnZSd6g1eGX5gum7NhM/sGOujRWzD07NTuBl+YA/5olHVjjjMloEJXFRPftKPXZAcjne/bQ/OjSj/ZW0t0cAIrHaXtsL/PtsGCH0eNo7tjq6AAcghqjR7DjaAP8UmluVo0Vkqi67HYIyo5/GkuWdgmYjwWQ5mYzHwJGXgjM/xPws53ArV8AAFI8bTDAKys9T96g1eHyC3aCKDtWc5A0VpiDeUw9OzwPfHo/wHtJU9B3lgDOTv2fJwJSeolJWfLLxeBwTYPPrLLwzQSVKJ9GLo9v1m+bYgRLYzF6HM2jB+gAUEsGYM2I/InpbCzeCzg7AFtm0vdn0YuITOWUTsGz45fGMhk4cBw5Hjo8HgDmwMeec5/v/x5yoDeARw7akW6j1VgGn+1MJvx7wQT37CinsbpUKzsxCHZ2vwsc/xYwp5JqyMaDwGf3A5c8r/9zaSTVYkRrtyvhy89j+vlEak6m5Ampq9ZqfbYnhjBlh9Hj0B+vav8H9etEU4kFACYbYBRKNAXfTjKnP/RENLFq9XV4PTLPjm8ai+M4MZUVtCLLH6NJ7NWTy7Ujw0/ZSUbPjt0v2PGfjyU2FfRTdqSREeE8O1HOPQuGowNY/TC5/qNfAAv/CYADdrxOgqA401vKz12x+nwASdnRak6mpAtqbZCBvYkEC3YYPY4km6v8+rXr4NcBSD99P5OymP5gfXZCEnGqo6uJKGnggNTAqhGrEOxoGvMgrCePaxOVnWQOWu1+fXUC01ihPTvhDuaeWBmUNzxFqihzBgJTlwGDzgHOuZfct/LnQFOlvs+nEXn5eSIjnRzGIo0VpbKTIcwp7KjVZ3tiSFyDnSeeeAKnn346MjIyUFhYiEsvvRQHDhzwWcZut2Pp0qXIy8tDeno6Fi5ciLq6Op9lqqqqsGDBAqSmpqKwsBD33Xcf3O7Elib7MpplWToXKyPKYAcICHaS+SCpJxGbWKk5OTWXqDJ+mMP12lEijQQ7uWjrE54d/4MxHYJKocqOLcCzQ+c/Bd8X8jwvm3um4+Gg6QjwzXPk+pzfEzMrAJz7S6DsLOKbe+9mwOMKvo4Y09s8O7orO24HcGo/ua7VnEyhyo69FXDZ9dmuGBHXYOfLL7/E0qVL8e2332L16tVwuVyYPXs2OjslA9vPf/5zfPLJJ3jnnXfw5Zdf4uTJk7j88svF+z0eDxYsWACn04lvvvkGr7zyCpYvX46HH344Hi+JoQLNKoEeDQUpfiMjWJ8ddUQ0vBWQ+XWKFO+2iMqOhmAnlZTa5nLtYum5KRKFqJdgD2NQDu7ZoQbl4MGO/Guvqydk1UPEkDxkJjBivnS70UTSWbYs4MRW4Oun9HtOjUhprMQ+MY5qVEso6veSCseUHCCrf2TrsGWT8nNAOrFJUOIa7Hz++edYvHgxxowZgwkTJmD58uWoqqrCtm3bAACtra3497//jaeeegozZ87E5MmT8fLLL+Obb77Bt9+SpmL/+9//sHfvXrz++uuYOHEi5s2bh9/+9rd4/vnn4XQ64/nyGEHQ3MRMrzQWEDAyglVjqUPs4qo11SFWYhUo3k3nY/mXV4eCp2kstCHd6ttBORlnnPmnsfw9O1KfHT9lxxp+srf8e6/b1PNDa4AD/wUMJmDu/5H0sZzsAcCsR8n1Hz7X5zkjgFarJbyyE6tqObk52f8zUgvHSScyCe7bSSjPTmsrOQDl5pISuG3btsHlcmHWrFniMiNHjsSAAQOwadMmAMCmTZswbtw4FBVJZ45z5sxBW1sb9uzZo/g8DocDbW1tPn+MnkO7skMbCuqfxqLSvZdH2OnQfRmpi2uEaawwyo6WNJYnhSo7fcSz45/G0qrshEhjyRVNXZSD9jrgk5+T62fcBhSMUF6OekTiqAb0ljRWRLME1RCtOZmSQYOdxPbtJEyw4/V6cffdd2PatGkYO3YsAKC2thYWiwXZ2dk+yxYVFaG2tlZcRh7o0PvpfUo88cQTyMrKEv/Kysp0fjWMUGj2f+hVjQUE9ewAgKcXtDyPFxFX7IhprELFuy3CAVpLGstuIdVYeVy72AlXLD1PxjSWv0FZrbJjCZ/GkgeHUSsHjg5gxY/JpPrcwcCMB4IvKxpb68SeVz0NTWN1J3gayxWr0vNozckUUdlhaSxVLF26FN9//z3eeuutmD/Xgw8+iNbWVvHv+PHjMX9OhoSm9vQet3TAjGYuFiVINRbAfDuhiLjXR5g0lkX4DmhRdrpM2QCAfEMHDML2JPMgUKrc0NcYEOyIU8+DKTvBlQt5FWJUBmWPG3j3RtItOTUPuPZd6bemRHohAI54RroaI3/eKOg1yk4sSs+9HqD2e3I96mBHOJFpZ8FOWJYtW4aVK1fiiy++QP/+klGquLgYTqcTLS0tPsvX1dWhuLhYXMa/Oov+T5fxx2q1IjMz0+eP0XNoOnB21JHSZYNZsXRZMyGUnWQ8UOqFO2LPTpg0lkm7QbnTmA0AyDe0i7cZk9izQ6ux8tJJj6jANJbQZydgEGj4aiyX7P2K+FjK86RR4MFVpJfV1W8DeUNCP8ZolgJg6snrYVLNgmfHldjBjltrXzI1NB0BXJ2AKQXIHxbdutJlKl0Co7mDssfjwfLly7F27VrU19fD67dzWbdunep18TyPO++8Ex988AHWr1+PQYMG+dw/efJkmM1mrF27FgsXLgQAHDhwAFVVVZg6dSoAYOrUqfjd736H+vp6FBaSCHP16tXIzMzE6NGjtb48Rg9ADcqqzlREv04xoEdpbChlJwlTIHrhidSzE2QIKMUsm3yuljYjOTnJgeS1EweBJmHAStNY+elW1LU5FAzKoZWdUMqFvMEnF6lJdeOzwNZ/A+CAhf8Cyk5X97iMIqLattdG7xuJALUdpuNNRLMEw0FTWEVjAEOUQ1B7SWNBzcHOz372MyxfvhwLFizA2LFjI/+BgKSuVqxYgY8++ggZGRmixyYrKwspKSnIysrCTTfdhHvuuQe5ubnIzMzEnXfeialTp+Kss84CAMyePRujR4/GddddhyeffBK1tbV46KGHsHTpUlit1oi3jRE73Fo8O+3Ur6ODORkIo+wknyqgF65IK0LoDjAtmGeHfAe0VGO1gHyGWXwbURU4TjwQJKVnR0hTFWSQ/VkwZSdoNVYoz060PVx++B+w5hFyfe4TwKiL1D82o4SYZOOk7PSeNFYMPDtiJVaE/XXk9JLGgpqDnbfeegv/+c9/MH/+/PALh+GFF14AAMyYMcPn9pdffhmLFy8GADz99NMwGAxYuHAhHA4H5syZg7/97W/iskajEStXrsQdd9yBqVOnIi0tDTfccAMee+yxqLePERvEaiw1siztsZOhgzkZCAh2OI6D0cDB4+WZZycEniCTl0Pi9QBdDeS6jn12mkGUHRM8gL0FSMlJ6qaCNJjJTyfBTrfLA7fHK5qyqfLjX41FOwSrqcaK2K+z801yedr1wFl3aHssPUi2x+cgKRqUEz6NFeGollBQZUcPRS1ZlR2LxYKhQ4fq8uS8iuoXm82G559/Hs8/H3xwXHl5OT799FNdtokRezSdqdDuyTFSdgCIwU4ypkD0IqLJy12NslEReYqLRNJBuc1tQDufggyuG+hs9Al2XEmozvkHOwAxHWelCqoYLT0PUHbI7t3l4eF0e32mzFOi7uFSv5dcjrpY+2PpCUy8lB1z7+izo7uyw/MyZWdC9OtL96usi8V0dh3QvFW/+MUv8Oyzz6oKVBgMf3ie1/bj1bOhIBDQQVm+HcmoCuhFRFPPxVEReYqjIgD5bCz1QUq73Y0mPoP8IyhHydwJmwY7GTaTaEJul42MCKbsUIMyEFzdiepA6nYADQfJ9cII/JEJouwkerDj0tuz015LfjecASjSwddKjeZeN9DdHP36YoRmZWfDhg344osv8Nlnn2HMmDEwm80+97///vu6bRwj+fBtYqbixxvLNJbo90hec6teRKQAdIQeFQFA+9RzkNLrJmSiHPVAZ4OwXcnr2emWlZZn2ExwdDh9ys+l0nPf35PJaIDVZIDD7UWn042cNEvAuqOaeH7qAMB7yMiASE5G4qzsiAblBO+z49G7GoumsPKHA+aU6NdnspATmq5G4ttJU1Zx443mYCc7OxuXXXZZLLaF0QfwaWKmyrOjcxqLjovwugFXF2BJS+pRA3oRkWcnTCUWIBmUnRqClA67G41+yo45idU5uQE53WpCQ4fTx6Qs3R9YVZNmNcHhdgbttUODw4gmatMUVtGYyMYNZMS3ZJmmsTodHrTbJaXMaOBEv1MioPu4CFGNG6XP+gByQtPVSD7LojH6rVdHNH+iL7/8ciy2g9FH0NSenuf1T2NZ0gDOSM5I7a2AJU1SBZLwQKkXEU3GpgexIJVYgCzY0ars8ELQKio7ye/ZSTEbxfEY8vJzu5uOiwj8bNKsRjR1Bq/IiupAWic0pYskhQVIyk5HHTGzR1sCrRGaxmrocGDcb/7nc98v543E7eeG6RXUQ2ieJRgO+rvUY/wOJb2QBL8J3Fgw4iTgqVOnsGHDBmzYsAGnTp3Sc5sYSYw8zRB2B9vdDLjt5LpeaSyOC9prJxlTIHrhiSqNFTzYiSSN1W4naSwAYvfdvuDZsZmNSBdMx1TZ4XlefO8UlZ0wFVlReXbqZMpOJKQVEN8I75VUwB6kX04KRhZnKN638VBDD29NcKSO8zp5dsRgJ3h6WTO9oLGgZmWns7MTd955J1599VWxoaDRaMT111+P5557DqmpqbpvJCN58JmyHE76rhMGuaYXAyYdeybZsoDupoBeO8l4oNSLiLq4imms8MqOFoNyh8MlpbH6gGeH9tlJMRvFKe/UsyPvTxQsjQUEHxkRlWenPspgx2Akql9HLVFwM5Q73scKs9GAz372I5+Glp/ursHP396pKfiONRGdaIRC7Gqu4/stlp8nbrCjOVS855578OWXX+KTTz5BS0sLWlpa8NFHH+HLL7/EL37xi1hsIyOJoD9cAwdxrlFQDq4il0PO03cjRGWHVGSZkrj7rl5o6npNUZPGimA2lk8ai1ZjiSbzxDlI6YU4DsJsQIbNV9mxy3rEKKWxpIqj0MqO5gNpV5OUYo7G+xHniiyO42A1GcU/6uPREnzHGpfeaSyaagpxEqKZOPuv1KBZ2Xnvvffw7rvv+jQCnD9/PlJSUnDllVeKjQIZDCU0SbI/CMHO8Dn6bkSQLspM2QlORM3nOmKk7NjdaISvspPMaaxuhTRWu5+yYzRwiibjdGvoNJamobxyqOqaXQ5YlVNBqsgoAWoq4laR5Y/FlHgnPvorO0JgqaeSJk4+T9zGgpqVna6uLhQVBeb6CgsL0dXVpctGMZIX1R6BxsNAww+AwQQMmanvRtgEVcDe4rMtyagK6EVEB8XO8J4d2kHZoSmNJVd2BM9OErcP8EljBVF2lFQdQNZFOUgvGU+kPVyiTWFR4qzs+BOJhyzWSClkHTw7bofUCydESwjN0HUlyOeohOZ3b+rUqXjkkUdgt9vF27q7u/Hoo4+KwzkZjGCorv6gqk752ZISoxcByg75GSSjKqAXmo2sHreouoRKY0XSQdnHoNzZAPC8qDglo2fHoWRQFpoKBhsCShHnYwVVdsjjzVpVA6rsRFqJRRF77STGQdIcQZPLWBNRCjkYVHkxWoCUnOjXR+kFyo7mNNazzz6LOXPmoH///pgwgbSa3rlzJ2w2G1atWqX7BjKSC7FfS9hg53NyOXyu/hthyyaX/tVYLNgJikvrDrerEQBPqm3S8oMupnU2ltPthcPtldJYHgfg7IBRKFtORnWuW9ZnR/TsOHyVHVsQZSe8QTnCFAkNdpJU2XElUNCs67gIeaPPKIZ4B0AruxytgKtbn2aFOqM52Bk7diwOHjyIN954A/v37wcAXH311bj22muRkpJ4L5CRWKhqfW5vA45tJNdjEuz4jowQPTsJtINLNDR7duSjIkL0T9HaZ4cqFN2wgTelgHN3A50NMBmLfbYzWXB7vGJAkiL37IhpLDoXK4iyYwmt7HgiSU96vUD9PnI96mAnvl2U/YlkMG2s0bX0nPp19DQnA6RZq8lGWoV01AE5A/Vdvw5E1CYyNTUVt9xyi97bwugDqDpLObyOdDjOGwrkxaCxV7A+O0l2oNQTzZ4d6tcJkcICtB9cqKKRYjaCS8sHWo8DXY0wZZUK6+HB8zw4Pc9a44jdr7RcSmNRg3Joz46o7ARrKhiJZ6flGODqBIxWIDfK32dGYnk9zIJBOZGCHV2VHfo+61l2DhCVKL2IfDfae3Gw8/HHH2PevHkwm834+OOPQy578cURTL9l9BlUyeZiFVYMVB2AVWNFgOYurioqsQDtyk6b0NY/3WYiqlHrcaLs5Ejb5eUBvcYIxZtup29peaBBOYxnJxZNBWkKq2BE0AGvqqHKTucpwOMCjObQy8cYqlzGyqDM8zxOttrRL1t9FkRzCjkUKhp9RgwNdhK0/FzVN/XSSy9FbW0tCgsLcemllwZdjuM4eDyJPUGWEV+oZydoczqvBzgotG7Xu+ScQudjUWVH7LOTOGdziYZmb0eHul4e1CPhUHlwoQf5dKtJ8gJ1NfjMWXN7vaKHp7cjn4vFcRwy/JoKhqvGiolnR69KLABIzZfGt3TUA1n9ol9nFFhi7Nl5du1BPLPmIF68bjJmj1Gnrug6CDQWZeeUBG8sqEq79Hq9KCwsFK8H+2OBDiMckmwe5Id7YhtpFGfNAgbEqLqPVWNpxqO1/FVF92RAe58dn+qjVCHY6WyAWZaGSaaKLJqmosqNv7ITrhqLBkHBSvvd4U4+lNCrEgsADIaEMinHOo11qL4DAPD9iVbVj5ECUj08OzFUdhK8saDmd+/VV1+Fw+EIuN3pdOLVV1/VZaMYyUtYoyutwhp6fuwkbf8OysyzE5awQao/Heo8O2JfE5UHF3oQspgMvsqOQa7sJM/n2O0UghmTEOxQz47TDa+XD6vsiMFkEOUsIs+OXpVYFPEgmQDBjlEaCszz+n+P6Pe3odOp+jFuTy/w7ACy8vMkCXaWLFmC1tbAqLS9vR1LlizRZaMYyUtY2TzWfh2AeXYiwK22ZQBFZRrLKh6M1b331EthMXLEswMAXU0+25VMn6NdUHZShKoqWnrO80CXyxNW2QnXN0azZ8fVDTQdJtd1C3YSpyJLrlzGIpVF19nQHigYBCPiLtdKxGIIKEVsLJgkwU6wSofq6mpkZenc/I2RdIgHTaUfbstxoO570ptl6KzYbQQNdjwOwGVnyk4YvF4e9K1RXf6qMY2lVtmhy5mNMmWnswEGAwd6vE4m75W/cmM1GcTva4fd7ePpUYKOPwj2/mr27Jw6QKaUp+Tq14E3gdJYFp9gR//vEQ3WGzUoO6p7k4XD6/Xts6M3Ca7sqLbST5o0CRzHgeM4nH/++TCZpId6PB5UVlZi7twYno0zkoKQ6RA6+LP/GUBaXuw2wpIOgAPAA/ZWWZ+d5DlI6ok8CNRsUFabxlJpUKZnxmajQfLsiMNADXB6vEnl2aHVWFS54TgO6TYTWrpc6HC4xO7KVlMYZSfI+6v5QCpPYelV3i8GO4mg7EivKSbBDk1jdWhQdiId6eFPdzPgJdWM4X6XEZGRJMEOrcKqqKjAnDlzkJ6eLt5nsVgwcOBALFy4UPcNZCQXIWXzWA3+9MdgIPOx7K2AvZUpO2GQp4VUHRQ9bjIVG9Bd2XEFUXYAIRDzJFsaS5qLRUm3kmCn3e6WpbGUD4SSJ0r5PdGs7OhZiUVJTxxlx2jgwHEkTaj2O6kF+v1t7NDg2dGrzw4NQlJyAZMlunUpIR8Z4fWS/WwCoTrYeeSRRwAAAwcOxKJFi2C1WmO2UYzkxR3KoFy9hVzqPfhTCVuWGOwYDeSHn0wHST2Rp4VU+Qa6GiCOikgNrdDRM2mn26uqGSA9WFhNBiBVmO1Dh4EaOcCVXEGrUppK3ljQ7vJVfvwJV+2mucpOz0osSgLNx+I4Mj3e6fbGyLNDPgf62QX73ORE1OVaiViWnQNAWgEAjrQR6GoE0gti8zwRojn0Gj16NCoqKgJu37x5M7Zu3arHNjGSmKA/XGeXNI23J7pviiMjmLITDl9lR8UuQxwVkR9yVAQAWI3S/Wref5ruMssNys4OX+9VEqUjlYKZDFn5uTguIlg1Vpg0oUtrlZ2Yxhqrbnk1JFAaC5D12olBY0H556A2leXy6tRUkBqHY+HXAUj1LP1NJmAqS3Ows3TpUhw/fjzg9hMnTmDp0qW6bBQjeQkqm9MdnTlV/ynnSsiGgdKGdEzZUUZ+hqtqf6uyezIgKQ+AOt+Oj0HZlgUYhPYEXQ2ipyGZglYa7PinsQCg3eEO6MPjT/hqLA2enc4GYQwIBxSOVLX9qqDKTlcj4Faf3okV9EQsFp4d+W9JTSrL6+VBK+BVz6ULRkeMgx0godoI+KP53du7dy9OO+20gNsnTZqEvXv36rJRjOQl6NiBtpPkMrNU32m8wZCVnzNlJzTyDq6qZk51qm9cJjeEqgl2aIm62WQg3xN6JtnZIH6OyRS0Kg36TLcJXZRVKDtmo/Td9iq8L5o8O1TVyRkIWNJUbb8qUnOloDUBFAGtvZ+0oFXZke+Tok9jxbDsnCJ2Ua6P3XNEiOZgx2q1oq4u8AtZU1PjU6HFYCgRdOdKgx16lhdrZCMjpD47yZP+0BO3VhldZSUWQErZ6WrVnEmLTQWpx0TWWDCWZ+TxojuMZ0ccBBrGswNI6RA5mvrsNFeSy/xh4ZfVAscllG8nliMj5N9NNcqOj19OL4NyLJWd9MQa7CpHc7Aze/ZsPPjggz6NBVtaWvCrX/0KF1xwga4bx0g+gnZQbqfKTg/NxmHKjmqkDq4qdxdiGkudQVHLfCynvIMyIFN2GpNU2QlMY4meHYc77CBQufFYSTnTNIqgLYa/0QTy7ZhjmsaS1nlKo7KT8J4d+boTUNnRLMX86U9/wjnnnIPy8nJMmjQJAClHLyoqwmuvvab7BjKSi6DdQNuEnVxmDyk7spERRuGA4Emi/ix6ork8uVNb4zKLyQCH26vq4OJjUAb8RkYU+WxvMqAUzIieHbtb7LAcPI0VuiMw/c6rSpG0niCXsRjWmUCNBcP5nKJBHnCqUXbk+yRz1J6dGFdjAQndWFBzsNOvXz/s2rULb7zxBnbu3ImUlBQsWbIEV199NczmGM0yYiQNnmApkTZhRxoPZSeDKTuh0Dx1WUMaCyAH6nao80j49NkBfIeB0rlGSRS0his9d4RRdowGDkYDB4+XVzx4u7QYlNuqyWXSKzuxTGPJDMqd6pUdjgMMUaexYtg9mZLAjQUjMtmkpaXh1ltv1XtbGH2AoA2y6E6upzw7smDHmJV86Q89oQdJ9Z6dyNJYqgzK/mkshWGgyTguwqcaSyw9d4nKji2IsgMQD0q316P4/nq0qHY9ksZKAGUnzPDUSOF53iegV2dQ1mlUhLMLcJDBxz2Txkq8YCciXey1117D9OnTUVpaimPHjgEAnn76aXz00Ue6bhwj+fAEa33e42ksyaDMPDuhCTup3h+NRshwje/kSINA+5ZnR25AzlBQdoIZlIHQHhTV3Xl5XpbG6q9u47WQQMNALTHy7PjvX1QZlLX65YJBf5OmFMCaEd26QiF2w06CYOeFF17APffcg3nz5qG5uRkeD/kx5uTk4JlnntF7+xhJhktp5+pxS/nkOKSxpD47yaMI6ImmqcseN9AtjIpI09+g7DMbC/Crxopd+iFedCs0FaTKDhkXEXoQKBB6JId48hGug7K9FXB1kuuxUF/F/izxP0jGqvTcX1lTo+xonkofDHnZeSxbe9DSc2c74OyM3fNEgOZg57nnnsM///lP/PrXv/YpNZ8yZQp2796t68Yxkg9Fz05nPZmkzBlVHyCjRuyg3MaUnTC4taSxhNENABd2VARFS6mvM4Rnx5iUyo7ybCzAtxor2CBQQD4MNHifnbAHU+qpS8kFLKnqNl4LCaTsxMqz468UNXU6w35XxbYP0fbYoenBWKawAKIamYXvRwIErnI0BzuVlZViFZYcq9WKzs7EiuQYiYfizlXeYyfMeAHdkCs7gkScTAdJPdF0dilMIEdKjurPUlQeNHh2lKqxTEns2ZErN/LSczXKTiilImjBgD+tMS4goMpOdzPgssfmOVQSq9Jz//ffywPNXaFTWSFnCWqhJ8zJAFGNErSxoOZ3cNCgQYqzsT7//HOMGjVKj21iJDFSqavsqycaH3vIrwNIwY6rCxa4ATBlJxiadrjCBHIxCFFBuPlNcgIMylTZsbfCaiD3JVPQqjQbK91Kql7bul2i+mALoeyE8kS51VbatcWw7Bwg41tMNnI9zqMGYlV6Tj8rq8mAnFTyGYbz7UienQQfAiongabYy9FcjXXPPfdg6dKlsNvt4Hke3333Hd5880088cQT+Ne//hWLbWQkEYrKTk9XYgFSB2UANm8HANZnJxhiRYjqieeQghAVRGVQTskh09V5L7J5Um2SXKXnCmksQdmRx3RWNcqOUlPBYAUD/sS6NQTHEdWh5Rg5SPbEMOAgaKkO1IL8u5ufbkVzlwuNHQ4AwQ3DmntcBUMsGlDXDiIqaPl5AqQk5WgOdm6++WakpKTgoYceQldXF6655hqUlpbi2WefxaJFi2KxjYwkQrHUtad77AAkxWLJAJztSPGQYIcpO8q4tUzG7hQ8O2nq/DqApCqoGwTqZ1A2GIiPpKsBWXwrgPSk+hyVxkWkmo3gOIgDIoEwyk6ItIzqFKV8dl2syCgRgp34HiRj7dkxmwzIS7fgYH34LsoeLScaoRC7J/eAspNdTi6bj8X+uTSgKdhxu91YsWIF5syZg2uvvRZdXV3o6OhAYWEPRIuMpEDZs9PDZecUWxbgbIfN0w6AVWMFQ2wqqCaNRZUdDUbzUNVC/tDeJ2Z5X5m0fKCrATloA5CeVJ+jUhrLYOCQbjGh3UHSrxajIWTDuVBpGdVzz1qFhoKxKDunJEivHYtJ8H7FqBrLbOSQl24FEIc0Vqw9OwCQIwQ7LYkV7Gjy7JhMJtx+++2w24mBLDU1lQU6DE2IlT1GBYNyTyo7gOjbsXmIsT6ZFAE90SSld0aSxiIHck2eHbnnS3iuTG+rsExyfI5eLy+W4/t3SKapLCD4qAiKFEwqjIvQWo0VU2UnMYKd2Hl2JL9ZgRDshCs/192gHMuJ55TsgeSy+Wjsn0sDmt/BM844Azt27IjFtjD6AIo71/YennhOEYIdq5DGSiZjq55E5NnRYFDWUv0iDQKVbYuQMsv0Es9OsnyO8r5DAcGOVRbshGgoCMhLz0MNAg3x2fJ8z5yQUD9J56nYPYcKpOo1vdNYUgo2L80CQIWyo4dnx+uR3tOeSGPlyNJYfOL8FjV7dn7605/iF7/4BaqrqzF58mSkpaX53D9+/HjdNo6RfARMWeZ5WRorhmeNStBgx90OoJApO0HQJKWLyo56z45VS+m5mAoIVHYyBGUnWT5HmsICAsdBaFF2Qpeeq1AOupsBVxe5HstgJy0xSpZjpez4GJQz1Ck7NCWrei6dEp0NQh8zg6aTkIjJKgPAkSaUXY0985wq0BzsUBPyXXfdJd7GcRx4ngfHcWJHZQZDiYChkt3NgLubXI+XsuOmnp3kOEjqjcc/QA1FBKXnWjrWBhiUZc+V6WkGoL/XIl7QuVdmI+fbqgG+yk6oHjuApIIpDgL1qFDtqKqTmgeYbWG3O2ISZK5SrMZFyIfYUmWnoVOdZycqZYf6ddIKeqaPmdlG9uXtJ4m601uDncrKylhsB6OPEGCIpJUXKbmx3ZEqIczHsgjBTrIoAnqjOOIjGJGUnmsIdgKmngOiGTrD0wIgeT7Hbicd8hl4gMqwyYOd0AewUH2MVHl2eqpakg6OTZA0VqyaClpMBplBuQc8O+09WHZOySkXgp1KoP/knnveEGh+B8vLy0P+aeGrr77CRRddhNLSUnAchw8//NDn/sWLF4PjOJ+/uXPn+izT1NSEa6+9FpmZmcjOzsZNN92Ejo4OrS+L0UME7FzjZU4GRGXH7KKeneRQBPTGo2QqV8LrAbroXCztfXZUlZ676XgEhWDHTZSdZFHoaI8dmyUwmPHx7KhMYykZt1V5QmglVqx/o/I0Vhx/iyYxOIxR6bmR8zEo8yF8LZrm0gWjowfLzim0/DyBKrJUKTsff/wx5s2bB7PZjI8//jjkshdffLHqJ+/s7MSECRNw44034vLLL1dcZu7cuXj55ZfF/61Wq8/91157LWpqarB69Wq4XC4sWbIEt956K1asWKF6Oxg9h8u/iVk8uidThGDH4kq+ZnR6InbZDafsdDcDEN5DDZ4dLWfSisqOcMaa7iaBlitJglZ7iFEQtIsyuT+MQTlEMKnKs0N/o7Hqnkyh7Qp4D/kuaejVpCcxGxch85vlpZM0lt3lRZfTgzSr8qFY9TiPUIjdk3ugEotCm0ImUK8dVcHOpZdeitraWhQWFuLSSy8NupxWz868efMwb968kMtYrVYUFytHpPv27cPnn3+OLVu2YMqUKQDIoNL58+fjT3/6E0pLe9jwyghLgLLTHidzMiCeSVq7iSEyWRQBvQkwlQeD+nVs2YDRHHJROWqVHa+XVx5vIHyOqVTZSZKg1R4ijZUeQRor1LiIkAfTnkpjmSykI3Z3M1Ej4hTsaOnorQV524Q0qwkpZiO6XR40dDiCBjsuPfrs9NRcLDkJ2GtHVRrL6/WK/XS8Xm/Qv1iYk9evX4/CwkKMGDECd9xxBxobG8X7Nm3ahOzsbDHQAYBZs2bBYDBg8+bNQdfpcDjQ1tbm85fw/LAK+OIJwOOO95ZERYBnh+5IM+IQ7GSXAQCsXWQbWLCjjOpeLBGUnQPqZ2PJFZuApoIg/ZKscCaNZ4cqOykKaawMTWksFR2UQ6VJeiqNBUgH5M74VWTFzrPja66n6k5DiPJz6fOJxrNDGwrGIY2VQL12ouxUFFvmzp2LV199FWvXrsUf/vAHfPnll5g3b54YVFG1SY7JZEJubi5qa4M3pnriiSeQlZUl/pWVlcX0dUSN1wN8cBvw5f8Bez+M99ZERUA1Vry6JwNCiSRg6awBB2/SHCT1Riw9D+cbiKChICA/kw79/svv92kqaMsCjOTAkY/WpJl6Lnp2olV2QnSoppVroQ3KPZTGAqRUVhzLz2M2LsItGZQBIF9FY0HFjvNa6cm5WBSq7LRWk+NXAqAp2PF6vXjppZdw4YUXYuzYsRg3bhwuvvhivPrqqyFNVpGyaNEiXHzxxRg3bhwuvfRSrFy5Elu2bMH69eujWu+DDz6I1tZW8e/48eP6bHCsOLFd8EMA2PFafLclSgJSIj0xcycYGSUAZ4TB60IhWpiyEwSxqWCslB1h5+8Io+zIlR8fzw7HiamsPK4taT5HWo2lNOQzEoOy4iDQcJ4dnu+Z7skUsfw8nsFOjDw7fn6z/PTwjQXFjvN6BDs9MfGcklFCTkC8bun7E2dUBzs8z+Piiy/GzTffjBMnTmDcuHEYM2YMjh07hsWLF+Oyyy6L5XYCAAYPHoz8/HwcOnQIAFBcXIz6et8fhdvtRlNTU1CfD0B8QJmZmT5/Cc2hNdL1I18mlOlLK4GeHdo9OQ7BjtEkSvP9uIakUQT0RrNnR4M5GVCfNnDJdvwBO38hwMrnWpPGaC6msRSUGy3KTujZWMJnG0y1624G3GQ8UI/8RsUuyvELdkJ5nKJBUnbIe52XFr78XFLCI0zC8Hx8Ss8NRlE5T5Tjlep3cPny5fjqq6+wdu1a7NixA2+++Sbeeust7Ny5E2vWrMG6devw6quvxnJbUV1djcbGRpSUkJTH1KlT0dLSgm3btonLrFu3Dl6vF2eeeWZMt6VHObyWXBqtAHhg55tx3Zxo8GmS5eqWFKt4KDuA6NvpzzUkjSKgNwGpx2BE0FAQUG9Qlg9SDEDYkedzrUnzOYppLIVgxsezE66pYIi0TFg/FvXrpOb3TB+s9Ph3UY7duAg/ZSeDenbCp7EiVnYc7VLT1p707ACysRFHe/Z5g6A62HnzzTfxq1/9Cuedd17AfTNnzsQvf/lLvPHGG5qevKOjAxUVFaioqABAGhZWVFSgqqoKHR0duO+++/Dtt9/i6NGjWLt2LS655BIMHToUc+bMAQCMGjUKc+fOxS233ILvvvsOGzduxLJly7Bo0aLkqcTqagJOCMHceQ+Syx1vxLUPRTT4pERoCsucKpaB9zjC2QdRdpLjIKk3qru4RtBQEJA61oZrKqg4BJQipLHy0So2QeztSBPPFdJYPuMiIvPs8Dwv644d5LOlKYie8OsACTEygprflWaJRQMNnuj3lyo7obooq/JUhYIGq9ZMwJIa2ToiJcF67agOdnbt2hXQ0E/OvHnzsHPnTk1PvnXrVkyaNAmTJk0CANxzzz2YNGkSHn74YRiNRuzatQsXX3wxhg8fjptuugmTJ0/G119/7dNr54033sDIkSNx/vnnY/78+Zg+fTpefPFFTduR0Bz5gsw1KRwNnHk7YM0CWquAo1/Fe8siwudMhZadZ5QQ30U8EJSdUq4haUqW9Ua1ZydKZSdc2kDegTYAMY3VljTNIWmwo5jG0jAuItggULkCFvSzFf06/cNury4ksWdHVHaoQZnOx2qPobJz/FtyWTIhssdHQ4L12lE9LqKpqQlFRcHr9IuKitDc3KzpyWfMmBHS2Lxq1aqw68jNzU3uBoKH1pHLITMBcwowbiGw9SWi7gyeEddNiwSfUtfWOJqTKVlkJ86UneC41Za/dgltITSXnpODedjSc3cI/4IsjZU0nh1R2VFKY8maCoZRdsxBlDP59z3owbS1B83JgGxkRPzTWLFsKggA+XTyeQhlJ2rPztEN5LJ8WmSPj4YE67Wj+h30eDwwmYLHRkajEW537+4Bk3DwvGROHjqLXE76Cbnc9zHQ3RKXzYoGaYK2Ib6VWBRZGitZvB5641Gbxoqw9DzYwdgf/2oWH2RprGQJWrtdtBorMJhJs0q3hfXsBFHO5O9T0INpT5adA7I+O6fiVrIcs9JzMQ0rGJRVzMdyRTMIlOelYGfgdO2Pj5YE67WjWtnheR6LFy8OGNdAcThCDzRjREDdHtLq25wKDJhKbis9jaS06vcC378HnH5TfLdRIx6lNFY8g53sAQCospMY/SASDZeaNJbXG7myo9KgLJ8tFIDwnHlcW9IEO9SgrJTGMhkNYgfe8MoOTWP5vi/ytG1Yz05Pza5LzQfAkdR9V5Ok9PQgaoNvrfinYWnpeXOXCy6PVzHg9KhNISvReIiUnRutQP/TI9zqKKBprI46UoxiTun5bZChWtm54YYbUFhY6NOMT/5XWFiI66+/Ppbb2vegqs7A6VIlBMdJ6s6O1+OzXVHgM9gunt2TKUIaK52zI4PvhDdJDpR6oqqLq72FzDQCIi49V1uNZVE6uPtUYyWXZyeYJ4ealNVWYwWmsaT/jcE8cz3ZPRkg7SBSc8l12h+mh4lZ6blfB+XsVAtoDNMcJJUV1SBQqur0P71nKun8SckhxmgAaKnq+ef3Q7WyIx/GydCZriYyT8i/jwktOacpLMr4q4DVDwMntxP1p2hMj2ymHvicqbQlgLJjToE3tQCGrlOk/JznYUCczNIhWLnrJF7bdAx/uXoSijJ7dselqosrVXWsmYBJWf0NhlWlQdk/DeCDkMbKQQc8SZJOD+XZAUj5+al2R3hlJ4hyRoNYAwcYlD5bnu/5NBZAUlldjXHz7dBgRG/vl1Pom0TXbzRwyE2zoqHDgVMdDhQq/K49antcKRHPFBZATsyzy4G63cSkXDAiPtshkNDjIvoER74E/jgUeOtqwOOSbnd0AMc2kev+wU5aPjBCGKC6Q1u5f7xxy6eex3PiuQxeNCmfSkjfjt3lwSMf7cHmyia8u61auuOL3wOf3B1zb4OqLq6dp8ilRlUHiCSNpbDbSs0FDwMMHI80d4vmbUhEQqWxAGBkSQY4DhhckBZyPcGqi8J2T+5qBDyCPSGjB3+jcR4ZYQ4xXiMaXH6l50D4LsoRDwKNt1+HkkC9dlQpO5dffrnqFb7//vsRb0yfw+sFVv2ayP8/fA789x7gor+QiPjo14DXRSLj3MGBj510HbDvE2Dby0D5VGDURT2//REg7mDhlbUxj3NPpKwyoGZHwlZkfbzzpFixsaOqhdx4aC3w5R/I9QlXAwNi10RTVVPBCMvOyXrVGUL9Byn6YDDCac2B1dGIdI+2qtBEJVwa65mrJuHhC50ozgqt9AVLy6jusZNWqFmti4o4l5/Lg0Oe58Hp1BZDKj2X1kfmY7UHbSwoKuFa01iNh4nf02gB+k8Jv3ysSKBeO6qUHbk3JzMzE2vXrsXWrVvF+7dt24a1a9ciKytOjeF6K3veJxKfORXgDMD2V4Gv/kTuOyRLYSn92IacDww+D3B1AW//BFjzaMIMXAuFeOC0N5AgjzP2bBtzBTiZSTnReu3wPI+XNlSK/1ccbwbvcZEgmVL5ZUy3QdW4iAgbCgK+Te9CtaLwH6QYcL+NPHeGu0nzNiQioaqxAPI+hAt06HJAYDAZ1g/S02XnlDiPjKDBIc9DV6VX9JwZpc8zL4yyE/Eg0GNyv04cjcFir52j8dsGAVXKjtyv88ADD+DKK6/E3//+dxiFD83j8eCnP/1p4s+YSiTcTmDdb8n1H91DPDuf3gt88TgxzfqXnPtjNAHXvgOsfgT49nlgw1PAyR3AFS9JBr8EhJoiLV20oWAxmaMSR7hsksYq5RoTbj7WpsON2F/bjhSzEW6vFw0dTjRv+BdyT+2TFjryJXDu/THbBrcaKb0zskoswFepcXq8QTsChyw9B+BOyQNagUxPi+ZtSERCNRXUgjmYQTlcd16xe3IPNRSkxHlkhPz75fLwCGOJUo1ToZpQ6qKsrOz4pP21kAgpLCCheu1o9uy89NJLuPfee8VAByA9du655x689NJLum5cUrP9FRLtphcBZ/0UOOMW4Oy7yH0fLQWaKwGDGRj0o+DrMJqBub8HFv4bMKWQbssvngvU7++Rl6AVr5cHPVEydwoprHiakwV8lJ1Yp7EOrQG2vkxOG1Xw0kai6vx4Sn+MLs1CBrqQtvFJcucZt5HL6u8AZ1csthaAFKCG9OxEOPEc8J3aHSqVJRqUTcrbQZWdzKRJYwWfjaWFYNVuYRW7ni47p8R5ZIR/8K0X/h2UAdl8rHZlZUf1XDo5ieLXAWS9do6p3ufFCs3Bjtvtxv79gQfT/fv3w5tgZ8UJi6ND8lucez9gEQyGsx4FxlwulfAOOAuwZoRf37grgJvXEMmwpQpY9WBMNjtaPLIvu6lTNioi3vTUfCyPG/jPYmDl3ZKqF4LKhk6s3U92+IvPHohJZdlYavoQVmcTkD8cmPM70sbf45Tawsdis7V4diJIY/kcXEKYlP070PrjSSXG1ixvsgQ7oT07agnn2Qk+BDTOaaw4e3YAfcvPaZ8jH4MynXweTNlRc6LhT9MR0sPMaIlPfx05wokkHG3S0Oc4oflXtGTJEtx000146qmnsGHDBmzYsAF//vOfcfPNN2PJkiWx2Mbk49u/keqVnEHAaTdItxsMwKUvAAPOJv+PvFD9OovHAlcJfXeOf5eQ/h15KaexIwHKzinCfKx8rg1eR2fsnqfxIOBsJ9e//jPw3T9DLv7KN0fB88DMkYUYXJCOaXntWGL8nNw5+3Gi7A06h/x/JHa+HU2enQiUHaOBE3fmoQ4uStUscrwppBIsy9uqeRsSEb3SWOE6KIcfAhqnNFacPDscx4kBoK7BjsJst3CTz1WlkP05+jW5jLdfByDDR6nhPM6pLNV9dih/+tOfUFxcjD//+c+oqSEHrJKSEtx33334xS9+ofsGJh2dDcDGv5DrMx8iByw5Zhtw3QfkTL1cowRZOBqwpAPODqB+HwmAEgifJmYdteRKIig7tmx0IAXp6AbaqoEi7QdsVdQIg3JNKYC7G/j0PuJZUqika+124T9bjwMAbpw2CAAw7chfYOXc2OAdhykDz4cNAAafC+xcEVOTsibPTgTKDkACmG6vR52yE8Sg7KW9drwtEW1DIsHzPOxuvdJY9MDN+1QXha30aYuXskNHRjQQNdSo+TAVNWajAW6vJ6DrdDQoec6oZye8QVmDLnF0I7mMxzwsJbLLSeVt81GgdFLcNkOzsmMwGHD//ffjxIkTaGlpQUtLC06cOIH777/fx8fDCMLXT5Gz++LxJGWlhNlGhnxq/ZEbjEC/08j16i1RbWYskPthOBrsJIKyw3GoATlIG1qPx+55aLBz2vXA5CUAeODdm6R+SjLe2XocXU4PhhelY9rQPODoRqQe/i88MOAx10+wp0ZQiKiyc7IiZjKxqi6uorKjvc8OIB2QHSGCHampYLBgh6SxcviWiLYhkXB5ePH3Eq5pYDjkwaHcg+IONXfJ65X1wephz05qHqlOBS81q+xhYjEyQkrDygzKsmospUpEj9YOyonk16HkyHw7cSSqZHBmZiarwNLCsU3AFiF1Mes3gR2TZYQqwQ1J/zPIpQ7BjsfLw+n2+vxFY+B1+wQ7gkGZnsXFmVqOqAJcW3WYJYMT9v2iwU7pRGD+n4AR80nTtjcXAacOiIu5PV68vPEoAKLqcMc3k/YCAL7OmI8f+DLsqBICm8xSIG8YAF46o9MZTzjfAM9H5dkBpBEQodNYIWZjyZ47Fy0RbUMiYXdLaWibRR/PDuBrAKe/R7PSfqi9hnjBOEPPq68Go9ScMl4jI4QAUc/qTKVgPV8YBur0eNFmD+z87VLT0FNO0xGg/WRi+HUoCdJrR7M+WFdXh3vvvRdr165FfX19wEHZ40k8r0hC0HBQ6JLsBEZdDAyZGXTRjypO4JGP9+CFaydj6hCNZ8r0Cy4EOx9VnMBvV+7Fv244HRPLslWvZld1C67552Z0OHx/gDazAS/dcDrOHqr9oCY3RHLtCZTGAlDHFQA8YIww2Pn2SCMWv/ydWEFDSbMY8frNZ2JS/yygdje5sXg8Ue0W/ht49WLyWf3rApLWPP0mrNlXjxMt3chJNeNyy7fAK0vJ96ZkIg4NugdYV4sdx1ukJxl8LtB4EF0H1uLCT9MxbUg+fnupfilMn0n1SthbSQNMICLPDiCNgAiZxgpTes5TZQdtJADTqRncM2t+wDtbq/H6zWdiUL5yt+Kqxi4senET5o0rwf+7cHTUz0n9OhwXXMlSi08ptdsLCP0BQ3p2aGBeMBIwWaJ6/ohILyK+xjiPjNAzjeU/GwsgKcp0qwkdDjcaOhzISvG1NYQ1kftDVZ1+U4hfJhEQe+30MmVn8eLF2L59O/7f//t/ePfdd/H+++/7/DEU6KgHXl9I0gz9JgOX/SPkjvirHxrQ0uXC+h8i+KHTYKfhB6CrCSs2V6Ghw4lPd9doWs1z6w4FBDoAKYd9Zu1B7dsFaeeaanABDsFEmpEYyk69gRwoze2RBTvPrjkYEOgAQKfTg+e/OERaCTjayARiOiPGkgpc/Tb5Tjhagc/uA/55Hr5a9zkAHn/ptxaWD28hgc6IBcCSTzF6CDlLqqCdlAFg0LkAgK4D63DkVCfe314duTKoQNg0Fk01WNIjNkQGM9HKcYZpKmgQjK1meHRN6X2w4wROtHTj7+sPB13mH18dxslWO17eWInq5ujbANidgl/HZNTWwbd6G+m3JSOYATykZ4euI14ei3iPjAjSmyga/KeeU2iA0yFXdrb8CzjwuXbPTqKlsICEGRmhWdnZsGEDvv76a0ycODEGm5OEODuBFVcRCS9nIDm4hYm4qYRd22rX/nxpeWS8RNMReI5vxa5q8gM7ckp9ldGxxk6s2Ufk40+WTceAPLK9jR0OzH76K3xX2YTvT7RibD9tHbNpd+ISQwu5wZQiTcWNM6eMhYAbMHWc0PzYvSfbsOlII4wGDqvuPgcFGeTUubq5Cwv+sgFr99ejfvghFAJkaKvclJ6WB9y0moz9WPsYULMTj/M/xyLLIIw/foQsM3UZcMFjgMGI8f2tMHDAiZZu1LXZyVDQgdPBg0N+91EUohn1zhycalceLBgJYc8uxRRWZH4dQN18rJCzsQAYLTa08qnI4rqIKqBDc02n24vjTSR4+aDiBO6fOwJ56b6jE1q6nHhvOwmSvTzw2qZjeHD+qKiel+4DUiwa/DqdDcDy+SSgvu+gz4gHs5EjaVa1np2aCnJZMlHrputDAo2M0AOe54O2TqB9pqiah9rdwH9/AVjSwaevAAAY1Xp2qoQWFAMTxJwMSGms1uPECxbJUFMd0PysZWVlup41JjVeD/DezWQ6eUoOcO17QHpB2Ic5BIWgJpJgBxB9O40HNogt5482qg92lgslzzNGFGBc/yxkpZiRlWLG4IJ0LBhP0k602Z0WXMKZZDENdjKKdUs1RMspI1EFLBEEOy8L78X8cSUYWpguvl9jSrNw/shC8DzwQ4VwxlUyIXAFBiNw+s3Asm34LmsuDByP8YYjxC+x4M+kn47QZTrdasLwItJ7SZyTlZqL5syRAICphj0ASI8evQjrG4ii7JxCDwCOKErPTQYODbwQgNPBpFFyvLlLbITpdHvxxuaqgGVWfFcFu8uLDBs5d3zzuyp0KqiiWhB77ARRsRQ5vA5w24lK2OqrUCo1FgwaxPJ8/JUdup/U6XPUijlIb6JIkfsV/b+/dBwIrb7D8c3k0tmBfBcxiatKYznagVbh+6m0n4kXmf3IWCCPk3jB4oTmYOeZZ57BL3/5Sxw9ejQGm5NE8Dzw2f3AgU/JmdbVbwH5Q1U91BGNsgOIg9/cxySTclVjlypzcZvdhf9s8S15lrNEuO2TnSdR36Zt++jzF8mDnQShgQY7XXWk3FUlp9od+KiC7JBunDYw4P4bp5P3i6vdRW4IsROq92bg2oYbcKXj/6FlyKXAT94jQZAfkwbkAAB2HCepGp7nsdpOgp3pRv2DHampYJDdRZTmZECWxlLl2VHe8RsNHBpAgh1vuz6KQKWgiNJjzWvfHhN/nwA5GL76DfEi/L8LR2NQfhra7G5R6YmUbqcQ7GhRdug8PYA0F5UhNRYMNCgHBLFtJ0mQwRnj175CVHbia1DWK9iRr8fs1wGcNo10UGWnWpo7OcB9FIDKNFaDYC9IKyQn14mC0USyDTmDAHtL3DZDc7Bz1VVXYf369RgyZAgyMjKQm5vr88cQ6GoCflgFgAMuf5F0Q1YJPaurbbVHpqKVEWUnp3kXOJAfmdPjxcmW7rAP/c+W4+h0ejC0MB0/GhZ48JpYlo3J5TlweXi8/q02wxmVzYsg+CkSKNhpM+bBwZvA8R5SzaCSNzYfg9PjxaQB2WIQIufsIXkYUZiOkRCUsJLxQdf12rfHSC+U8rORfd0rQU3skwZkA5CUna8PNuC/HcMBAOfb9gPgUalByQtH2OZzOio7oTwSkmdHOQAwGQ1o4Ela1KtT+oMqorNGFaEo04pT7Q78d5d0dvrZ97WobbMjP92KSyaWYokQ8L688Si8UVQuij121Jade71E2aH4tVBQOngHDWKpqlM4Kn5N6eI8MoIqKU6dDMpyo3OAskPTWDTQlwU7A2mwoyaNRYOd/OGRb2isWLYF+FkFSePHCc2enWeeeSYGm5GEpOWREQ5HvgTGXKrpobTXiNPjRVOnM8AjEJbCMYA5FSmuDgzhTuIQTzqgVjZ0oiw3uF/I4+Wx/JujAISS5yApphunDcK2Y814fXMVfnreUNVNz+jOtZBrITekJ06wYzQaUcPnYSBXB7Qcl9qch8Dh9ogBn5IKBpBurEunpCBvXTvcMAD5oxR/dHaXR0yRBFsX5TQh2NlV3QK3x4uXNlZii3cEPJwJua46lHN1ONqg33sbdmCk2FAwcs+OVcWZdLjSc5OBQ6OQxuJ1OkhShWx4UQYmlGXjj6sO4N8bKnHZpH7gOE6cSH/dWeWwmoxYeFp//HHVAVQ2dGL9D/WYOTIyA77mURF13/tWLvkpO0rBZND0ZLz9OkACjIzQV9lxeKTqOv/3m+4/7S4POUlulApABnrJ90tV6XmD0L4if5gOW6wzCWBX0Bzs3HDDDeEXYhAyioEJV2l+mGhUA/HtaA52jCa4iyfCdPwbTDIcQk7ZOGw52ozKhk6cMzy4Z2j13jpUN3cjO9WMyyYFbyQ2Z0wRSrNsONlqx8cVJ3Hl6WWqNov2rMgXlZ3EqMQCyM7kBJ+PgagLOCsOxic7a9DQ4URJlg1zxwYPLubmEin+oLc/jv7QinnjAgPOjypOoKnTiX7ZKbhgdOj3ZXB+OjJtJrTZ3fjv7hqsP3AKHGeDq2QyjCc342zDHmxrUJcyVYNYEcK7gB2vkzEmKdnSAtRXEYWyY1HwlPij1G5fjlHm2dE72BmYn4bzRxbiL2sPYs/JNmw52gyTkUPF8RZYjAZcexYJjtOsJlx9xgC8+NURvLThaNTBjmqD8uG1vv+3+H6HzQql/UE9OycryGXpRHXPHQviPDJC/zSWpKL5n0RS9c7h9gIntgu3cgB4DPaSoFWxF5I/DT+QS1rtyfBB1WlDW1ubz/VQf4zokZcwR+rbOZlOcu3nplTiNCG9Es7HQU3H1545IORO1mQ04IazB4qPUZtqozvXAjHYSYweOwDZ4Z/ghYN1S/hgh+d58az++qkDg/tZAFhOkf4633sHKhq7ybqOAiADP01h+qoYDBwmCp/po5/sBQCcP7IItuEk7TXNsAfHGruiSqPIoZ9b1pZngI+WAp/e67tAV/SeHUl5CL7NNBUQ7L02Gw2iZ0cvY+tR4TczKD8VOWkWXH4aUUlf2lApfv6XTCwVm8MBwPVTy2HggA2HGnCgtj2i55UMyiqDHerXKRPS5UGUHfnBWzE9mQjmZEDy7HQ1Ah5Xjz+93soO9aIpmeutcs/OCSGFJaSw+/G1SIFdpbJD01gJqOwkAKqCnZycHNTXkwg7OzsbOTk5AX/0dkb0yA2QNRpNwJQdPMnbTjYewkChEVqoYOf7E634rrIJJgOH684aGHb9i04fgFSLEftr27HpsLqW7nTnmscLwU6CdE8GJGUHgFTREILNlU3YW9OGFLMRV58RRtkSGrTt4wZhy9Fm7Kpu8bn7m8ONOFDXjlSLUbVKNkloENnUSWbq3Dh9oDg64izDXjjcnoi/O3J4nofby4ODFyl73yY37v2IyO0UalBOC19pGAw1pefhmgoaOKBR8OxwOgQ73U4PTgonG4Py0wFIJvT/7a3FZ9+TxphL/NKO/XNSRaXv5QiqFgHphEdVitjRIZUcTxGGMWvw7PiYX9tOkODVYIqrvwIpucQgDUjfrx5EPk9MD0Kpkj7KDu18P2IekFYIA3gM56rDe3Y8bqBR6AOViJ6dBEBVGmvdunVobW1FYWEhvvjii1hvU9JwqL5Dcec9uCAt5E7MV9kJbypWYnX7AFwCoNhxFEMzw5efU8VhwfgSFGcF6c/y7d+B9b8Hrn4LWeVn44rJ/fHqpmN4aWOlqo7K1KCczwsHykRSdowcTkLwnKhQduhZ/cLJ/ZCdGqbDrBDsZA+eAhwAXlh/GHfOlM6+/v4l2Un9eHL/gA6qwaAmZQAYWZyBqYPzAPdpgMGMfG8bBnD1qDzViX7Z0RlM6QFxqmEvjNS47XECu98BzryN/E+bCkY4FwtQLo32J1xTQY7j0MRlk+s6BDvHmsjvJdNmQk4q+VyGFWXgR8Py8fXBBoDnMXVwHkaXBvaKunHaIHy6uxbv7ziBH08pCzu5fEBeKtKt0u64W/TsCI87tAZY9zgw5/dA+dm+Dz66gXSwzi4XG0yi7aTPEE0pTRimGouqOgVxNCcDpBdLWgHQUUsqsjJ7dl+ht7ITqpKQKjt2p0syJ/efAhSNBo7UY4ThePjS8+aj5DtgTgUye3hKfS9BVbBz7rnnwmAwoLy8HOedd574178/e1NDcetrWxWb+Y0oysCqn58T9HE+yk4EaSyvl8dXJ4AqbwEGGE5hqIvkcqubu+F0ewMOFi1dTnyykxzI/M9SRRoOAqv/HznQffMcUH42Fp89EK9uOoa1++tR09qNkqzQO0e31wsrnMjgO8gNCeXZMaCaF5SJMJ6d+jY7VgtNFxefLXu/vB6xH45IR73QW4LD+eeej6cOVOCz7yVVQM7iMMZkOfLRHzdOF8zkZhvxWVRvwWTuB1Q2dmK6QkWdIgdXkz4dY32H09ID4kLj1+SG1Hxy5r/9NeCMW8ltepaeRzMbC0CLgaSxDF3RBztiCqsg3cdnceP0QSTYgdRawJ/J5TkY3z8Lu6pbsfCFb4I+BwcvXjH/AU6TG6N/vhKWTPIe+hiUGw4C/1lMBgh/fCfw0299G1MeWkMuh55P1FKjhfxO206I3WuVDMpiB2WfYKeCXMbTr0NJF4KdOPTasegd7ARpKAhIAW1q+1FSmm2yAUVjSaHJkfUYyR0PX3pO/Tp5Q+PWtC/RUf2urFu3DjfccAOOHDmCW2+9FeXl5Rg2bBhuu+02vPXWW6iri08/hEQmL82Cwgyr+Efz+gfq2oP2vOF5PmrPzpGGTrTZ3dgFoh5kN1Yg1WKEx8vjuEIr++1VzXB5eAwuSFOen8XzwMqfkx0oABz8H9DZiMEF6SjLTQHPqwvKPF4eBZwwJsJoBWwKzxUnfDw7rdXkNQfhZKsdPA/0y07B0MJ0suzXfwae6A98+UffhWuE/jp5QzFmcD9ce+YAn+8E/bvtnMFB5y4pkZ1qwU3TB2H26CJcPEE2Ob7sTADAZMMP4sE6LDvfBt64Anh3ScAwUY+XRyrsmGv4jtxw6d/IZ1e3m1TtODvIMFMgKoOyVUMH5VCzoloNJJVucHeT9E4UHKHBTp6vofzcYQW4bFI/XDShFDNHFio+luM4PDB3JAbkpip+3vRvQnorzjHuxkR+H1yvX0E6rkNSdzMMDjIE1il4fxoPAVtf9n0yak4ecj450GUJJ6GyoN2s0MeIpmh8UiSiX2di+Dco1ojl5z1/bDEr9CWKhlANMWnjyMK278kNJRNJMCukEUdyVeE7KNNgh6WwgqK6GmvGjBmYMWMGAMBut+Obb77B+vXrsX79erzyyitwuVwYOXIk9uzZE6tt7XW8c7uv3Nzt9GDUw58DIGduadbAt9/ht7OPRNmhE7HrsycAbd+AO7EVA/POxt6aNhxt6MSQgnS/5VsAQDQyB7DzTeDo12S8Q2Yp0HQY+P494MxbxXyz3SkbAOtoJ2cnRt+UjNvLo1DeYycByhEpRgOHGj4PPDhwbjtRK4J0uxYbvpkNgLOLmHb3CHPhvvgdSTPQdu1iGS9pJvi7y8bhd5eN02WbFQdOlp0BbAJOMxzCOjXBzv7/Ah/eIf2/9lHgxlXiZ+P28Jhj2II0zgE+dzC4YbOBUReSz3/7a8DZd5LHmVIAi/pgzR817fmVBin64+BS0M1bkMI5iSJgTQ+6bDiOyiqx5BgMHJ6+amLYx08bmo+v7j8v9EI/rALIRACk1e8A3r4OuPotQdnhcVnV74HG/STlO3kxsP4J8jf+SlIR11RJJl0bTKJnC9kDyG0yk7JF4f31iGks4f3keen7Gk9zMiWOIyNo479QwbcWQo06oR2USzqEYEdoCosi8vseYTgOT7hdZSL32EkQItK7bDYbZs6ciYceegiPPvoo7rrrLqSnp2P//v16b19SYZWlj+Tl5XICg51uzY0F6URsQ5k0AZ2enSqZlGmwI/eBiHQ2Aqt+Ta7PeAA44xZyfddbAKTSWDrLB60ngGcnAi/PD1iVx8tLPXYSqKEgQJQdF0zottJUVnCTMn2tZcYm4OW5JNAxmIQhrDzw4e2AXahMpNOje6p9uzAqZARXhfpTYeT/I+uBdxYDvAcYdTEJWI5vBn74XFzE7fXicprCGr+IBEGTriP/735XGksQhaoDSGks/++/HEcYzw5AFAy9RkYcbSAq6Ki0dmD/p1GtKyinSG+Uvd5yODgbUWk+vB0Opwu3GP+LEY1rAYMZ+PErwI/uBfJHAN1NwIanyOOpqlN2JmATvENZgsld5j1TShO6/UvPW48T/5XBRFIo8SaOIyNi5dlR+u7S40JZpyAUCMOc+fwR8PAc8rh2mOxh3oNE7rGTIGgKdpxOJ7766is8+uijOO+885CdnY3bb78dzc3N+Otf/4rKysgqD/oKBgMnftntQXbqDr8gyO7yorVbW+nl9mNEPSkZcTpRWLqbMSmdmEj9gx2Pl0eFEBwpKjurHyY718LRZCDl2CtIlcSJbUDDQUnZoam3r54kno7q76QDvoDby6OIS7zuyYBk0uywCdsVwqTscHlwGvcDnm67hwQzqXnA9R8D131AzqpbqoBVvyILi8FO8M7JupJZAndmGYwcj9yW3WJDwACObwHevIakJkdeCFzxMnDW7eS+tY8R/xEAvrUa04R5W9yEReT+QeeS1+loBba+RG6LoqEgoK6DcrhBoAD5HBshHPSjVARoGutH234GvHU1CQ71Rgh2Vnmm4NeWB0hg8/17uLbyl/il6U2yzNwngAFnErPx7N+S2759AWg+BhwSuibLu22LgxelgF2ptJ96dkSDMvXrFI4m/q94E8eREboHO6JnJ1CisZmNsMGBUodQTUXH/RhtOMqT/ZG1IYSQwPOsx44KVAc7M2fORE5ODn7605+ivr4et912Gw4fPowDBw7gn//8J6677joMGBC+62xfh1ZldDuVlR0aNKSYjchNI1U+WlJZHQ43fqgj+f2JAwvFLqgTeLJT9a/IOnyqAx0ON1ItRnHApMjRDUDF6+T6hc+QtFR6ATB0Frlt51tiJUG300Ok8x2vS49vPOSzOo/Xi0Ia7CRQ92RAOrttThtMbvhhVdBlDS2VWGH5HXK8zcRIeMsXJG1lzQAu+wcADtjxGlDxJpl2DwDFPRTsADAOIL6difgB1c0K1Xx1e4A3FgKuTmDwecAVL5ED6bSfAbYsoH4vUW0AmPe+BwPHYzM/SjS7wmAAJv6EXN/7IbnUSdkJNRtLjWfHZDDglA7KTrvdhYYOB0ZzR5HaQPokiWXBeiKckR/i++Hd1hFon/9XABzGdm6CkeNxuPQi3/low2aTYNPjBP73EFD5Fbl96PnSMtlU2VEIdtwhlB0xhTVRr1cXHXEcGRGr0nPFNJbJgHFcJYzwknRlJmno6vHy2M+Tz9LUuC/4yjtPAfZWAByQO0SX7U1GVAc7X3/9NfLy8jBz5kycf/75uOCCC1BSkjilw70F2v49eBqL3G41G1CcSc6utJiUd1W3wCuYZ4sybcDgGQCAkbUfApAGG1Kov2dC/2zfElR7GzElA8DkJeTMkkLP8Hf9B6lCbtvu9gDr/w/wyoZo0jyygMvDo0hMYyVOJRYg+Rb2FF9Gbvj+XaBd+Yxy0IGXYONcOGgdS/wtNAgAiF+H+lg+XkYuswcAqT03N46TmZQVZ2T99xdk59j/DGDRG4BJaIiXkgNMu5tc/+JxwO1A6t7/AAA+4c/1XcfEawBwAC8cPKPosQPISqPVKDum4AYGk1Gfyec0hfUTm8ywXaezH5HngVPkjNyZQzpef5d2HjCfmNx3eQdh58Tf+HrbOA6Y8zsAHLDvY2JcTs0HimVpUoU0lpJS4REO5KL5NRGaCcqJ48gINUqjFkL22TEbMckg7Cv7T5H8cl4eB7xEQDA1hAh2qKqTU54YilyCojrYaWlpwYsvvojU1FT84Q9/QGlpKcaNG4dly5bh3Xffxalw/gAGAKnMUF5eLkdsJmYyokTod6NF2aH+m4nUfzN5MWAwI6NuK8ZxR3Cy1e4TaAX4dVqryRnj02PIjyitEJj1iO+TjJgHWDOB1iqMcZMDgK35B2AXOTCin2Cwoz9CAY+PQTmxAmV6dluTMZbkzD1OYOu/Axdsr8OgEx8BAFYW3KxsgD3v1yQVQAO/nvLrUIRBsJMMB1FZ79fBt+kIULUJ4AzAla8EmorPvJ2obi1VwCd3w9x8EHbejLUGv0G22WW+qZMo01jhSs+9Xj5kRQtFrzRWZWMnTHBjATZIN+od7HTUkVQgZ0DeAGJG3VHVApxxC5YVLMdC56Ow2BRm2RWPAyZeK/0/5DzfcmM61621mgwIhfLsMarsmA0GoXNyBbkjnjOx5MRxZIQYHOplUHYH/+5aTQZMNAgpLLrvBAlGqbJjqN8bfOWnqF+HmZNDoTrYSUtLw9y5c/F///d/2Lx5MxoaGvDkk08iNTUVTz75JPr374+xY8fGcluTAimNFcSz45YqfWhzPy2NBcXghZaQZ5aIvVNutZLUzLHGroDlp2edAt6/FXh2Aumj42gjP54rXyFn/HLMKcDoSwAAZ3WsBgBMPPQ3ADww6iJg7EKynF+w4/byKBCHgCaYsmOUqo9w1k/JjVv+Dbj8As3NL8DkdWKbdxhOZAY5AzbbSDrLIFSj9XSwUzQWToMNmVw3uk74HaB3EmM5Bp9HKuv8saQC594nLEvKhFZ5T4fDqBDUnXaddD3aNFaYpoIur3S7OYRB2WTQS9npxAzDTmTxrSSwB0ha1v/7EA30IJUzEOMHkt/DjuPkZOA4XwAXTMGbEc58iDSQA0jJuZyMEuKr87pInxrIZmP5BDsyz05LFfHmGczx7Zwsh+4jupsBt7NHn5p+H906jVwJ1f2bKDtCyl8wJwPkO7+fFwLXU/tJk0glWCWWKiLuPpSWlobc3Fzk5uYiJycHJpMJ+/aFkNoYAKQyw2BpLKrsWCNQdnieR4Wws5wkNxufRUqL5+EbFKIZlQ2k/0i73YUf6tsxijuGqWsWArveJmrEwB8B1/wH+OnmwG6tlAlXAwDGt67HZO4AhjSsA8ARVYNWBPh7djxemUE5MZUdj9dLKpMy+xOj9e53pIXsrSQAAvB390VIsYTo3FAyHrjwaRLojPtxLDc9EKMJzTnEI5RSt0263eslbQQA8fNT5LQbgBypWd57nh8pd3AdMZ+09QeiaigISAeBYNVYcu9EOM+OHsFOZUMnrjAKfpjTrifKFe8lBx29EHujjBCV1Z3HW+Hx8uHHRWSWAJe/SPw8fo0gYTQBWcIgX8G3o+TZ8RkESv06RaOltGa8sWWTyjCgxyuylILDaBANygqBeoazHiVcEzww+PilPF4ex/kCdPJWcB4HUWWVYD12VKE62PF6vfjuu+/w5JNPYt68ecjOzsbZZ5+Nv/3tbyguLsbzzz+PI0eCfBgMEZtYjRUs2JErO6QjcW2QGUf7atrw8c6T4t8bm6vQ0OGE2chhjLyFfekkYMBUmODBdabVqBT8CLuqW2Hi3XjW9iL5MQ04G7h1PbB4JTB8TuhOnAOmAlkDYPN24h+Wp8lt468ECkf5Bjte6XV63Q7kcrR7cmIZlKlfye3lycHiTKE78LcvSA0Gt74MONrQYBuINd7TRP9VUE67DrjtKyBnYOw2PAiefuQMsbhtl3Rj1SZy8LNkACMX+Cx/vKlLNLbDaCbKAQBXajE2escqBzsmKxlfMOBsktqMgnBpLHk6IVQ1lsmoLY2183gLGjscAbc31J/ETIMwgXriNSQtCeibyqKBU8FwDC/KQJrFiA6HGwfr22XjIkJ8x0ZdBCz4s3JwkiUoAoJvR3EQqNyzk2h+HUAYGSGkstoDO47HEqUmjNEQqvt3ThOp2DzElfukld1eHjwMOAShSWR9kO8eC3ZUobqpYHZ2Njo7O1FcXIzzzjsPTz/9NGbMmIEhQ5j7Wwu0L02waix6Zms1h1Z2GjocuOT5jYqy/+jSrMAzwrN+ClRtwrXGNfhz/TIAQ7D9WDOWmj7EcL6SnKFf+YqUJw+HwUCCm6//hHyuDR4YYTz3AXJfVhkpeXfbSTVSLqlwsgq9ItycGSb/1FickZQdIbA57Xpg/R/IDqbySzJN+tu/AQC+KrwGfItB3ZDGOJE2ZBqw63mMcu2Dw+2B1WSUVJ0xl5B0lYyr/rEJjZ1ObH1oFjJsZjEVechdDM/brcE7uE68mvxFSbhBoPRgYeAQcgK00cCprsbacLABP/n3Zoztl4lPlk33GQkxpmk1LJwH3fnjkFI0hlTdHf2aVKrpBU1jFYyE0cBhQlk2vjnciB1VLbKTngi/Y9llwDGI5edStZu89Fym7NCZTIni16EUjADaT5JKuP6Te+xpdZ96HqKSMLOxAgCwC8MgLxynbSMOohwTcJgE2mMu832ws1PqlM2CnZCoVnb++Mc/Yt++fThx4gRef/113HTTTSzQiQCxL02QnTrdyVlNcs9OYLCz7VgznG4vMm0mnD0kT/z70bB83DdbodfCyAXoTO2HXK4DA6o/AQA0HtqCpUZitsWCP6kPdCi0KgvAlpz5QJ7wfTAYpRLIBimVZbWTeUJtpryE6p4MSNVYYo4+JUeoOAJRd3a9JQwk7Ict6cQjkcjBTuawqQCAwYYaVFdXA65uYM+H5E6/FJbHy+Nkqx0OtxeNHYI3guOAcVegI4coGuYYz9uxhGnPr6ahIODn2bG3hPR6/OMrYgr9/kQbNh1uFG9v7nRivocMPDZOEt6rIqrsfB/y+TUhS2MBUpHAjqpmHYIdquwIwY6SsiN818uaN5NAjjOQFHYiIVSTxqTHUQjCfR+1QvsbKX1/U+uJgrjDM9Tndvr5HOaEas86hUCbWgVS86IaxNsXUL0Hu+222zB8OIsco4XK0v7NAyl2t7STo6XnHQ432u2+jQWpsXjB+BKsuOUs8e+1m85UHv5oMKJ13BIAwAVt74F32XFNzRMwcx60DJwHjLk88DHhyB+Go4WzUMvnYGX2dQH3AfAxKdu6yZl2hznxfpQByg4geJ040lF4/f+R26YuQ6eHHIASOdjhUnNx3Ejk77aDG8lYCGc7OQgO8PVhyf1j3X7fSzHVEW7qcpSoVXZCpbAA4tlpRRq8nPDZBFF3fqhrF4d5AsBLG6WGqDWHtmO8oRIumGCZKAT01LSrVxqru0Vqlif8ViaVEbWTKDthPDvh8Cs/V/KgeLw8rHDi7ANPkBtOvwXI9z3gxp0hwriNoxsAj7bmqtGgd+l50EGgNbtgqyH9m75x+x5f6b7oiEEIdpTSWMycrBo2HrWHCZvGEg3KBqRZTci0kUyjv7pD++PQHaQa0qfeiA7ehsGoRufyhRiOKjTxGUi97NmIlZZNU57GWY6/ohZ+fWToj08W7KQ4iIei3RydmTUWSJ4d2c4tbwgwfC653l5DDJOnXa/OT5EAVKcLjQyrv5NSWOMXBXixumTfxS6/76U0Pym2wU64g4uasnOAeHZ4GOCwCN/HIMHOyxuPAgAm9M8CxwFr99eL3cVNwiiUHbYzpLPlglEAOLI+Pfq+0N9FRqk45oG2izhY3yG+D0GrscLhp+yYFYJJt9eL24wrkdVVRSqfZv46sueKJUXjSIrd2U66tvcQJhWz2rQQNFhf+xgA4EPP2TjqLfTpeE4fIwY7zUfJ3EE5Ytk5GxMRjsTeWychVjGNFV7ZAYASwaQs9+24PV7sqibTwxXnWQUhMzsPnxhIb5T0E6R/yL+zlsGSFXkZONkZcz6T2gHIlB2psWCKk5xJd1oSL9hRVHYAsZINAHDmbYA1XVRCIj4Q9RDtBacBAEpr1wGHhbECstQjRa7s+FcJ0pJvU7ipy1Gil7JDgzK7VQhSFEYNNHc68f52MtPrV/NHYeaIQvA8sHxjJeBxo18VSe0eKLpQtoGpovdMF3VHZk6m5KdbMSDX10sVcUBNuyi3VgM8r+hBybVXY6lJSGPP+T3pnp1oGAzAYKGhZQ+mspTSftEgeXZkv6OjG4BDq8EbTHjKTSo27QrVcl2mbKnjfL1fNaBfKpQRHBbs9DA2sfQ82GwsKl+Tj0bJt3OgjlRrZFhNARPMw7EhdyG8PPnBrfScBfvwi7W9AD+CdoQWK7KkYCfNQc6yu+iwzQTCp8+OnEHnkD4m2QOAM24DIP+MEjvYMQwgzQWLHMdI2XTZmZKvSoY8deWvONIuu6Ye8uwEU3bUe3bI/S3pQjqGjlOQseK7KjjcXowpzcQZA3Nw+2mpmGrYA+O2f8P5/u1IczWhkc+AY5Bf/xo9U1niGbnvQcr/5IV6/DST2R8AB7i7gc4GWVNB4fvN87i68TlYORfq8s+WemMlItS3c/iLHntKqamgBs+OvZUYhhUI6KDM88CaR8n1025AFU9OOOX7UbdcVaWeMf9UFktjqYYFOz2M2FQwjGeHKkBKFVnyLskGjemFlOJh+KvnEmz0jMHDrsWalCElrMFeT54Q7HSeArqaAABpgrLT1ZuUHY4DrnsfuHu3mNLoLWmsvPKxaOFlHZIVVB3AN8AJ8Oz4z0+KERZT6LRBqNJdOXQ7jxUK3Z33fiy1DhDW8+qmowCApaelgHtmHE5//2y8afkdHja8BMse0lfpfc+PMKAg23flRULTVD2CHXFwo+9BSmwGCnJg1Pr7FjFZpF5WLVWBacK9H2K8fSscvBm7JjyUcAUDPgwWfDvVWwKGC8cKs9Y0Vncz8JfTgJfmiF2r5Tj8PTsHPiPpZVMKuHPvF4MgeZ8pt0f226OBduXX0vfZ65EMyiyNFZa47q2/+uorXHTRRSgtLQXHcfjwww997ud5Hg8//DBKSkqQkpKCWbNm4eBB33lLTU1NuPbaa5GZmYns7GzcdNNN6Ojo6MFXoY2ws7H8lJ0SsdeO1EV5u+jXydb8/IPy0/CU+0pc6/o1mpDp23wwAlKCNUm0phM/AiD+INNdpOKlOxGVHf9qrBBEXSnTQwwqyMB2L9kJ8kZrYNmqQHcog7L/ZOwYYTGS9zLqNJZwkDqeO5V0GG6tkhrmAfh0dw3q2hzIT7ditv0zoK0a4IxoTyvHas9kvG68DA96f4o/u3+MwQV+ozSCnV1HQlBlR/o92sKoWGERU1lVvk0F7W3A5w8CAF7wXAR75qBga0gMcspJk0veAxz7JvL1/PcXwHNTVHmuxD47CoGLIlXfkiaktbuBmh0Bd1NFzWw0kCBF8OrgrDuAjGJRefNVdmQp5IHnkBu/fxd4ZzHx7rQcAzwOwGiVPFqMoMQ12Ons7MSECRPw/PPPK97/5JNP4i9/+Qv+/ve/Y/PmzUhLS8OcOXNgt0sqx7XXXos9e/Zg9erVWLlyJb766ivceuutPfUSNEMNyo5gaSzq2Qmh7FSI86y0ByqD8qUdeGGGFaVZ0Q2OC5mW8/PtpLtIGqvblnjBTlBlRwF/X1Wikp1qQYVpHACgbeCcwLEfAj7KThCDcrggI1rocM9wwU64NJZZ+BwdnA0YOovcuPdjAOTk6aUNpOrqujPLYNr9Nrn/8hdhvnsHHrA8iIc6f4w3ndPh5Kwo8/PPiGfX9SFa98vZ+jLwwvTAVJqrW5pIXjDS565RJZnia4z6+yUzKfsoFRueBtprUGMsxQvui2Ou2ulCtCXobgew/VWSVt/xWtjFLVrTWNVbpOv7Pw242yXvoLzrP8CpfaTgYdrPAMj3o9LvTyoOMADDLgDm/ZGM89j7IfDiecA+0kIE+cNIuw9GSOIa7MybNw+PP/44Lrss8IyT53k888wzeOihh3DJJZdg/PjxePXVV3Hy5ElRAdq3bx8+//xz/Otf/8KZZ56J6dOn47nnnsNbb72FkydP9vCrUQcNYoKmsWg1VhDPTnOnE0eEqpGJESg7A/OkYGfSgGyfRmqREFKpkldkeVxId7eQZRNS2VGoxgoCnWsWsZ+iB9mUfwXuc92KzaODV9qEVHZ6qvRcNovIqxBwBi3d9cNHoRPmt2EfSWVtr2rBzupWWEwGLC49Rpqx2bKAkRfCZjbi2jOls+PS7BQxlSySPRAwp5Gz6abDwTfC6wE+/xWw8m6gbjfw2QM+qTQS/PMk+PSbKWYxGTCuHzEK0xOjiJGVn9MAyuTuEEeeLE+/EQ5YYIpxIKsLtAT9SIS+ndrvyXBfANjxhu/noYDmpoLHv5OuH1AIdmh1HdzAF78nN07/OZCSDUDWksSnWk6WxuI40tV9yadEMW88CKx+mCzIUliqSNhveWVlJWprazFr1izxtqysLJx55pnYtGkTAGDTpk3Izs7GlCnSpNhZs2bBYDBg8+bNPb7NarCGSWP5p0j8lZ2K6hYAwOD8NOSkWTQ//8B86Ww12hQWECKNBfgqO0JVjJM3wmVNrO7JgDZlh/ZIivpg1AOUFWTjHc8MHGwL3iw9lLIjSuk91GcHUDYpO9WWnss/x2GzAaOFpFHr94m9dC6dWIqs/f8hDxh7BRncCuC6s8pFBUSugIoYDGQcChDct+PoAN7+CfCtoFYbLaTr8uG10jLyFJbCyQZNT0cdTNM0VkuV+L5dYF9NJq3nDcUm45kAYv/Z6sLAHwHgSBVbW432x5/YKl1vOgwcD3188OlL5PUCnQ3BF/Z6gBPbpf/r9wJNlT6L0O/0sBPvktRqRglwhpSBEKt05WkspRONsjPICJpB50i3MXOyKhI22KmtJbNQiop8y6KLiorE+2pra1FY6Nv112QyITc3V1xGCYfDgba2Np+/niJkcADZuAiTr7LT2u1Cl9PtY06OhFSLSSxvPX1g9EGHKL+6veD9z5bkFVntJNg5hWyYE1AR8ZmNFQa7bDJ9okOVvCrZpHt/ukOUnotnlzEuPZcrNkpn064QgxTlmORVdbZMYAgxKnv2foxV35N9wpLJOVIKYNK14mMLM224aDzxmQ0vylB+glAVWW01wMvzyJm90Qos/Ddp1AcA3zwnLddAx0QoH6SmCL/LrFRzyNcaFprGaj0Os9EAIzy4wklSepi6DC6hKjPWqp0upOZKQzIrv9T+eJpmMgoniDteD7k4/T6O8BwE/jkD+OMQYN9K5YXr9wGuTjJzrnw6uc1P3XG6vTDAi2GHXyE3nHOvz8gWJWXH4w1iyk8vAK77EDjnfhLojIquoravkPh76xjwxBNPICsrS/wrKyvrsee2idVLocdF0OUybGakW6XGgmIzwShUmaevmognF47H5PLc8AuHgZ59erx8YGt1esbRdESc33KKz07InSs9SIZTdtwer/g6e0Maizal7HAG95iE6qAszU/qmdJzQNm3o9inRAGTfzqSHgj2fiwGbkPrV5O5bQWjgNLTfB7/yEVjcP/cEbj93CCjcIJVZLVWA/86H6jdRSbAL14JjLsCOOt2gDMSr0nNLrJsEHMy5YLRxfjlvJH4fwtGh3ytYZENAzUbOMw3bEYxTpHtm7BIPJj2CmUHiK4Enc7+Ovsucrnng6Bl4gBg9XTgUdPL+I/hIaCGDOpExRtB1i0EUv1OA0YJvZn8fDsujxfnG7YjteuEMIrmWp/7qbLjCFZ67o/BSJpALtsCFI8N+joYEgkb7BQXkyZKdXW+TcHq6urE+4qLi1Ff7+usd7vdaGpqEpdR4sEHH0Rra6v4d/z4cZ23Pjg0iAk2LkJSdqQDKVV3TrbYUXG8BUBklViUyeU5uPJ0fQI8m0X6CgU0SswoJRUxXjepVgBQx+ck5M5V9HqEmYUjb/rVG9JYqRYS7ATr2O1/n38HZVcPeXYMBk78XiilsdQ3FfSrqhsxDzCYYDy1B+VcLYwGDqZdK8h9k64NSCNlpZrx0xlDUZChMEkckM3IkgU7PA98tAxoO0FaLty8hqQbAKKu0Cq4TX8ll2LZuXKwYzRwuP3cIRjXP8omfzSN5WyHzdOKW02CMnHGrYA5JfTBNBGhJehH1of13PjQ2Qg0C2mlqUtJZZezQzSuB7D7XeQvn4YbTKth4Hjwg4U2Bke+JEZnf2gg1f90YMR8cr3qG7HlBkB+R4uNq8g/kxcD5hSfVUjeR6XS84Q9TPcqEvZdHDRoEIqLi7F2rZTrbmtrw+bNmzF1KhlyOHXqVLS0tGDbNqmN+Lp16+D1enHmmWcGXbfVakVmZqbPX08RLo0lDgKVpUiob2fj4Qa0292wmQ0YWRxEZu9hLEaDeLwIeE0GA5AnNHc7+jUAoJ7PFg9IiYRaz478NVqjLQ3uAWhA1ukIrux0hVR2eqaDMqA8mZuitqmg2V+hS80Vh1vOM3yHMZYacCe2ErVl3JXaN7JQCHZaq0gTOQDY9jIxzppswNVvArl+pdxnLyOX379HWv43CubmWHstzClAGikGyPnhPYwzHIWdNwOn3wxAptr1wGerC2Vnkve4o1ZSx9RA/Tp5w8j3gaoqSkrNN88B790EQ2c9DntLcLXz13As+g95H12dQNWmwMdUC+bk/qeTMvmisaSJ5w+rxEVKnZWYZtwDnjMCU24KWAVViR3uQGWn13w+CU5c99YdHR2oqKhARUUFAGJKrqioQFVVFTiOw913343HH38cH3/8MXbv3o3rr78epaWluPTSSwEAo0aNwty5c3HLLbfgu+++w8aNG7Fs2TIsWrQIpaWl8XthIaARfPBqLN/ScwDiQNDPdhNj3vj+2QlTQcFxnDTJ3alUfi7s0IVp0Ymr7KirxqIqiNVkiLqSrSdIpbPYgnzfAF9lxx5gUO6ZpoKAbGSEJ3BbffqUhIB+jj6+n9EklTXX+B2uMAhl4MNmAxkRjElJzQUy+5Hr9ftI8LLqIfL/+Y8oV8aUTiIBl9cNfPZLwOsiimeWPupqSITnyNryFADgPe8MsTlmr1MOzDZgADnR1VSVJVdeAGDi1QA4cgImNxIfXC1WOLmn/gzznP+HTd4xcHkhtTE4uNp33d3NklLXXyiUoerOgf+Ki13YTTxizQNmS4qbDKuCstPr0owJTly/5Vu3bsWkSZMwadIkAMA999yDSZMm4eGHyRfu/vvvx5133olbb70Vp59+Ojo6OvD555/DZpN6w7zxxhsYOXIkzj//fMyfPx/Tp0/Hiy++GJfXo4aw4yLcvk0FAUnZOSqYTKPteqw3VD1QnPfld/ZajwT17KhUduiZV29IYQFSGss/PSUnpGdHTGPFflchNb4L/AzUTz1X+BxHXggeHCYajuBS7xpy26RrFR6tEqru1O4GPlxKzvgHnA2ceXvwx1CvyA+fkcv8YQEDWWOCYFI2ONrg5Tn80z1XLCToqSGvujJElspSC1V2+k8ml1n9Jf8PHZB76gDw7o1EkTntenCzfgMniEHc5eFJnxsAOLTGb91CViF3sNRGYOQCYdl1gMsOdDXhAjcJzhrGLFHcRJtCNVZPpZD7CsHrUXuAGTNmBFbwyOA4Do899hgee+yxoMvk5uZixYoVsdi8mCBVL3nA83yAOiD22fHx7Pjmd7VMOu8JbArdP0Xyh/r8W89nJ6Qsq7Yai34+vcGcDMiUnVCenRDBjktsKtgDyk6I+VhqDcqKnbDTC9FaMAXZp7YgEx1Aah4wbE7kG1o0Bji0Gvjqj6SlgjkVuPT50MHL0FmkgSAdANpTgxtlKsL/vFNwlC+By8PDYuJ8O/T2FmiQUvk14OzyqWhSxOsFqoWApJ/UogSTfkLUoYo3SZD65iLA0UaUo/l/htFogIEDvDwpSsDg8wDOQD6/luPS++qvGgFAyQQym6ytmlSO1e+DDU7s8ZaDL1W2V9CxOw6FQaCJouL3dti72MNQxYbnfb/YFIdCWXOJX5fjRFN2xAozpQOqv7LD5ySkbE63KZyy01vmYlFosNMZohordAflnhkXAYSefO5UOwhULD33XcfJkgukf8ZfRWZHRQqtyKIT1S94TJqIHgyDAZi6TPo/SNm57mSXi1dfdBPFgQaOPZmi1I2icUStcnUqNu8LoPEQ6StkSpHaBgBEfbFmEe/Vv2aRitGsMuDK18Tvhs88sdRcKaA5JEtl0UosebDDccQYDxAT9JZ/AQCWe+aIQY0/yuMieuHnk8D0jj12EiFvAa80MsIhdlAOrMYCgH7ZKSjKjG7Eg97Ie+0EkDsEgPRjredzElKWVa/s9I5RERSabguVxgo9G6sHPTshutY6Naax/D/HSjoYFAgo+9VMkawkfNC5ioZTRcZfCaQJfcEKx4ReVi+E0nq+fDq28yTAou9vT6YodcNgAMYLA20rVCj6NIVVOhEwyvoWmVOAccKk96b/3967x0dRX///r9l7ks2FBHIBgaBcEgERgmLAiigVbwhCxaJFokiLgoVStGg/KmgRbD9tlYrYjxXkZ1HRn9dqhWoUVOQitKBYjKCItCYgKgTIZW/v7x+b9+zM7uzu7GazM+/NeT4e+4Dszs6+9z2z7zlzzuuc83nQOzf1mWANmzZC52PbudS3zWDe1xbKCgQUxo7CawQAFW26nd1PA8cP4TuWi1f9I6Oevy4Nzw432M24XoqIQGd5ZmC3WuQFOVzj4g8weVFXNgFUenaSLSbYkciia60LqiMkxPTDgm+Ra8o7Fb11duQwliDGDtfseHyBqN8tZgXlNF4QY3l29Keeax/H76zd8EvPLPy12/z21yXp2j8oUs7qAkx4RL/2xuYEfvw0cNHdQP92hNES4bQq4GfvQpr6DPjPjs+vsJ6DIW3GzhfvxK+mLNfAqYp8behPQv+/+s9A6WDVy3IzUG5892sTKR/YBPg8Qa9Ry/FghlhJ2DnV+3zAmRfUAAFYxy5GKxxRi2LG8uzYRTJGTQzNogFEC/soF3nlxTQ/yy4bFO2pr9NRyM1NtQTKgJyh8r2lCxgscmdqM6E7G4u3ihDG2AmNsylKKCuWZ8efRs2OqkR/GDwdPX7quYZmB0HP1guBC/DPrhPaP1CrHZj1PjBnZ+LdpnueE6yem87GjWVDAFeeOiwDQQXKAFB0BtDzvKAh8fFzsbfV0tRwelQB45cD16yRM/aUyOcjX5dLhwRT0D0ngyno3JDqPlTtNQKCobA2UTOTrPj/vBer9hmOVuKKfHxMuF6KCBk7BiAXkAozDqLVcJEkCX2L3QCA804vSsMIE0Mrk0BFm27nOykorDbjnaScxROvqKBgmh2nzSLf0UcTKcduF5E+V7pWfyBOKIwVT6CsrdnhYbyUZdFlF8op3KIQHpYRUqDM4d6dXc9ELzDoaQoVfwwPM3GqpgMDJ2q+FNEM1GIJpaDvf1Nbr6Ma43UAADZkKupZ8FyJ1tst1C5C2RuLUs9TiRgrdoYRLf2cGz82ixShwF9x3TCsuelcDOrRzqqqHUBMgTIgCwO/loJVrc14J6lXs9MqmGZHkiQ5lHUqyvFR1tbx+plKMxOqxdLxxyzHGf088sjZWEmkniPk1cpxGpqAaigORVgmEGDgU2TGhIG4DLw62H/sm72hdg7h1O8CmD/YdJPXRkoAe7hmBwiloO97K7bXCAiGvX6+C63jfi8/Fc0zGTL0tbqeC3h8TEjn/eUbSDTjoDWGHqR3UQ56F2l0YjYBMQXKADD4GsBzEo+/yz075vvxJpqNJUoYCwh6M062+qKGsZrCPCnNXn9EOCgd6a/cKDupUe1ZfyPQ6GEsQKzjlmpCdYwCqvkx481HXLIKghlVn7wYrJXDm4Qq4cZIjyrN7vLx4F5ElWBeTkHfCznxIpqxAwCFfeBp8ir2qd+zI1yFa5NjvqtOJyBqGMsXqs4rEqG+LlE8O3YXcN4tOIRgxVoz/ngTrbMTLYXUjMSrtRP+vNLT40+jiJV7XbQyxxItKhje44x/x2xBikF2BHZbSBOlNOqFDZMMmRr89+PnAb838vVomVI6Cdc4AVCnoIMF6+nklcXcj/L90eY61DMx0rMjpDFqQsS6qmYIcn+sBDw7ZibUyT16ejOQ3gtnoiTaG0sUzQ4Qu4pyIMAi6j01q6q4pk+zkxOjjxcPJcQLY0UTmjeRsRMKy/gCqvkR9mJ6xkWAuwRo+jayjQMQqm4cy/MSA+V8qeirqNmkw5DyKkKw0VrMyNlYpNnpMMRZsTMIZRVlJVpNQEUgS+OuRIt0il0TJVOzsYDQBV7L2FGegzkafbTSWcWVe3a0CiDqLSoY0Qi0DR6qy3J03si9UqCcEZ4dqy0YIgdCbR84jV8Hu9BLFqDs7KR274gSEpVT0AFdhpRs7MQ4d2N5dswY9hcRmkUD0BKjASHNi1OQVgScuGGsNszceDBT6+wASmMn0ohQhrAKsh1t2xlTxZULlJtaY2VjxfPsaIhKATS1eYtyOrFnRylQFl6zw+GhrM/WA03fhZ7nep3igYDTndSuedgvoshl6RAgt63RdO+RcffDDfVYmYRanh3S7KSWznubYyBZUTQUrQKGSAD9YSwzx6ATz8YS5xhxL5SWZ4cfM6fNIhsbyvBqOqu4cs+OpkBZZ+p59GwssRq4dgTcUGxVFJi0WaSooRUhKB0ULAbY8DHw3A3B+kXH/xPsXwWEmn8mgVLQrcJiAa5bB3x/AOgxLO5+9BjqoQxdagTaUZCxYwAuDSs++Df37IhzIQW0f6hamFuzE+pZFggwWKKMUcQwFjcitATKzQojIEvDaJWruKbh7jInhrbIqzf13KpttPLvlN2Jw1jK7KJ0arE6nCHXAQ13Al++p37elgUMmpz0bjVTzzllZwUfOuDvj23shAxRDu9LZ8b1UkQ67y/fQKLW2RGshgsn2vcJx8xFzJSLvi/A4IiywIR0VeIco1j9sZTGm5aHLlRlNx2p58HP1/Ls6NXsRC8q6FN9RmfE0RYe9/oDpr7xSJhzZgSrGgPB1jT5pwUfeT3a1fA1Vq+2RODvj3UTq1VQU9h2HiaFjB0D4BefcE8It+pdgmp29Gdjmc9zpVxQYul2hNTs8DCWN7pmJ8th1UxRT+eC65ZTz6NnY8VPPdeul0RhLMCh8OyYOaScMDYnMPqOlO9Ws85OEoQ0OzGMHVn3GABjDJIkhfrSpSE5oDNAs2gALo2mb0BIDyJuNpb4mh0gdkaWiGEsWaCsIfxVfp8sjWysdKa/ZvNsrHYJlCPDWIwx2djJ6dRhLF43hqU1y05UbFp1dpJAPndt0X9Dypsnvn2oEaj51ksRoTPdAJxRNC7ienbih7ECASa3sDGjW1a/Z0dAgXIMLUyLVhhLq6hgGkKP7jaBtFbqeSh9N/Y4+N24MoylLKLXmT07qgrKJH6NS6jOTuykhXh49Xh2FCEuvo76TVyqQ0TEWbEziJAQNJpmR6zDoieM5VUWMRNAsxMN2SAVyLMj95zSCGM16RQop0ezwz070TU7yXh2lMZbZ9bsKBtb+slrEBdHisJYekKwwYKDwf/zlhE+Sj1PKWJdVTOEaNlLIopfAX3ZWGYvYiZJknyhjOXZaRawx5Ke1HOXPYqxk9ZGoEFjx+tnEem+egqzAdqaHf697VYprrGUych1dnwB+ebDjDceZiGi63mS6BEoS5Ikv84LC5q5LpmI0CwaQLQifKEwlliHRY+xI0IRMz21dni5AJG8b3K7CC3NjqKNAvd6qOrspDH9VVnwTylSZozpFyhrpJ6HWkV0Xr0OoPZUmDlZwCzY5SKM7Qtj6fVKhq+jGZUxZwLoTDeArIz17ES/A/IrFgy7SRdYuSBdjMVNPkYC6apkgbJGGEul2YnZLqLjF1yb1SLf3SrTz5UXG/2NQEPnIqWdB5GLCvpJs6OHVHl2PDoLYnKtJr/pNXN7HREx51Unw4leZ0fMooLceAvvpqyE32lLEqIW7DOaeP2xGGPyMRJJ6Kqnzo4yjKXcLlTFNT3npFbnc+XFRn8j0EjPjkjHrCOQPRU+Rl4DHaROs6PPs+MM8/iTZie1iHVVzRDCT2pOqy904REJZUin1acdyhJhcY3X+VxZ3VSkY8TTrbUqKGsJlFu0PDtpOm5cTK307Cj1O/EbgUZqdpqp4zkAdZE88hrEx56i1HO9ejNXWM9E0uykFppFA9ASggLienaUqfJaF1QAQpSn596LaJodpREgkq4qlmenJV6dnTTfXeZo6Iv4uWOR4p8/Ss8Oa6t1IGt27J1cs6NoBEp1duITs11EAsjVv+NqdnjLCNLsdAR0phtAtDCWqJ4di0WSF9KW8KZ5bYggiIzn2eFGgN0qCXWR0NP1PNuhXWcnnQJlPg4gzLOjMwwAaNdLkjU7TrF+V6mGa0Y8vgC1ItCBXZG91h48OsX1zjDPjpe8bylFnBU7g+AXlfCKwyK2IuBEqwrNMXP1ZE68bCz5+AgkTgZCBoTXzyL0B0rNjtwuQmGE+9PsSs/RaBnB76zj3RkDak+FLxDm2enkYSxlWIYEyvHhNYjSrdmJ8OwIdGNlZmgWDSB6GItn+oh3WLS8AkpEcMnyUI0/ikBZ1Gy5LFVKt/r4cMMmS1lnR2FopNtIzdEoLCin7ur4XSjPr3BjJ6uTh7HsGpodM/8ejSZlmh2dTWzDPTvprHHVGRDvqpoB8NisL8DUZe0FrM7L4RfUaAJlM3c854Q6ZscOY2U5xPrZOKwWecEMN0ZbFALlWF3P06bZ4f2xNLKx9Hh2lEYZ90o1U+o5AKVmhym62Zv392g0doXGqT145PM3Tup5RDYWhbFSiVirdoagNGaUGhehPTs2bR0SJxM0O3I7D8HCWJIkKUTKat0Or72jEigrDQ3ZA5CuMBZvWqqh2YnTFwsI9+wE30dhrCDqbCzyGsQjlHrezt5YOsNYsrzBx3tj6dP6EPqgWTQApTGjvLC0COzZkftjRQljiaHZiZ2N1Sqwpio7SkZWs2bqefB7GtG8lXt2TiqzsXRWoAXUbT/4cTxFFZQBKIoK+gIKzw5dAqLB58vXXs9OWyPReGFYpy3cs2P+NVMk6Ew3AEmSNFtGtMpiUfEOi5xhFi2MJUD8WW82lkh9sTjZUTqftyg0O9wgCgpYA+oWH2lLPY/0QHkSCGMBkUJzCmMFsSuK5Plkr4F5f49GE9LspNezw9dQEdZMkRDvqpohhFyWkZ4dkVoRcOIJlEWIP8fPxuICZfF+NqHqyOowVkiHZFV5rJq9flUl6XS1+Ah5dpTZWPoEnpzwth9UQTmIss6OT4C6V0aT6kagcYsK8mwsLlAWQOcoEuKt2hlCKPOFK+9DrmUxPTv66uyYeXENeXaiZWOJG8biWphwY1TZxd1ps0BqOzxBYyf9zVtzNDxQchhAp2eHH0euN+IGXWf37MiaHWoXoQuHLTWp56GigrHn2mlT3wCLoHMUCZpFgwh3WbYI2oqAkxWldhBHhD4v8Tw7IoexsjSMiECAqersSJIU0u14AqqGqOnX7ER6dvSGXGxhLSNIoByEa0Y8ijAWaXaiI3t22l1UUG8YK+TZYYwp+tKZd80UCTrTDSJcjKbU7ujVJpiJuHV2BOjzEqqzEycbS0DPW7ZGGEvZ64sbAsoaUNwzks7mrbzKsbqooH6BMhBZQoDX7CGBcpuxoxAok2cnOunW7Mh1dnx+KJcg0lWlBvFW7QwhPM23VVF4yqxdwWMRV6AswOIqZ2NFWdxaFV4Q0dDKxlLW0+HfSVlrR059TaOBGioqqAxjJdYzzh4mNKcwVhBV6jn3GtCFNCr2lHU9b6sArlOz0+INqPRy5NlJDWTsGIRcl6ZtIRe5xg4Qvd8XRyzNTiaGsaIbOw6bRT4uyj5aRrQU4NqiU5phLJ2eHatas0MC5SBKDQrXpdlN/Hs0mlQJlPU3Ag1pdpRrkJm94SJBs2gQ4annItdwARR1dqJqdsyfWaC3N5Zo7SKAkBZGeXyU4mQONwhaFALldHrjNAXKOhspcvjFQfbsUJ0dAOou3qTZiU+qs7Hih7FCnh1lIUMz3yCKBJ3pBqG8qACh8I+IehBA6dmJXWfHzIurXWdvLBGPETdolB4TLWPHpcgS9BtgoIbaRfjA2ioaJurZsSk0O4wxWf+T08k9O0rNjggJA0ajNA75uZgMHp0Ce6diDVV7dugYpQLxVu0MIdReQS1QFrHGDqDMxorXLsK8P9x4FZRFDmNla7SC0NKyKAXKRtz98zAWY6HxyWEAHe0iAKWHLoBWX0AWe3b2MJaysaWX6uzERRl2irYm6EE21uNpduTU85Bmx5LG5IBMh4wdg3CGaVxa5VYRYh6S+GEs8xs78XtjiRtqjCVQVn4flbFjQAXXLLtVrvXD088TaQQKhLwVvgBTfd/OHsZSCmT5emPm36PRKHuxtSeU5W2rExXv/HUqpA0+AbJXRYNm0iCUFxVAkekjqGcnXhjLiJBIosTT7LQKHGqU6+xoaXYUHo+QB8hnSKhDkqSQbqctI0tvnRKOrNnxh0JYShF2Z0V5seXd7jv7nMRCeb5xgyUZPHorKCs8O34KM6Yc8VbtDCFcoBwSv4p5SOJqdgQQRMbNxtLQuIhCjsKI4bRohOVcDg3NTpoviDyUJXt2dDZS5NgUYaxmKigoo9SMcI8XeXaio5wbT7s8OzoFykrPjgDZq6Jh3isPgEWLFkGSJNWjoqJCfr2lpQWzZ89GUVER3G43Jk+ejMOHDxs4Yv2EGwey10Bwz06z0JoddTG6cLiIXMRsLO69Udav0RvGSveCG56R5fEH/024qKAijJXTyUNYQHBelO1AgFC1aSISSZJUtYmSRa9A2aXQPfLeZWZeL0XD9CvAwIED8dZbb8l/22yhIf/iF7/A66+/jueffx75+fmYM2cOJk2ahM2bNxsx1ITICtPsCO/ZsfFS59qeHRFKn+vujSWIQer3++H1egEA2dYAeuRa4bYztLS0BF/3etAj14rSHIv8XJFLQo9cK2zMK79e5rbKr6eD3gV2tLZa0dzcjJaWFrik4NjzHUzXOIqzLeiRa4Xk96KpuRk9cq3olW9L63cwK3lOK463+GWPF11MY2O3SvD426nZ0R3GCgnIuYFExmjqML2xY7PZUFpaGvH88ePH8cQTT+Dpp5/GRRddBABYvXo1KisrsXXrVpx33nnpHmpCRNTZEdyzE55KH45RIZFEiJuNJUhxOsYYGhoacOzYMfk5py+ARWOKYbVIOHDgAACgf7YXi8YUI8dplZ8bXuRFvzHFyHEGkNX6LRaNKYbDGnpPOrjxrBy0+rKQ6/0eBw40YkwPYES3YuRnteoax5QKJ646oxiFlkZYWqTgd7Cl9zuYlQfHdsWbn5/EvkbS7OghaGz4kzZ2fP5QNmB8gXJoXaEwY+oxvbGzb98+dO/eHS6XC9XV1Vi6dCl69eqFnTt3wuv1YuzYsfK2FRUV6NWrF7Zs2WJ6Y8cZJlAWuWAdoG4zoIUIMeh4vbFEEShzQ6e4uBjZ2dmQJAkerx/49hQsFgl9inMBAN+caIXzVCu6ZDtQnOcCAHx/ygPniRbkOu3Iy7LBcqwZLrsVvYty0jZ+x/dNONnqQ0meCwXZDji/b8KJVh+Kc13okuNI6P0WCbAcb0GWw4pehen7DmaEMQav/Vtcaf8GH3zVjI/+SxfTeIRqEyUnUFYWB4zbCFTh+eF6NTOvl6JhamNnxIgRePLJJzFgwADU19dj8eLF+MEPfoA9e/agoaEBDocDBQUFqveUlJSgoaEh5n5bW1vR2toq/93Y2NgRw49JVphmR/h2ETZ1WC4cuc+Sid2yeisom9n75vf7ZUOnqKhIft5qC0CyeQFIcDqdkCQJ1hYGycZgdzrhcgWNHYdfgtQcgMVuh93pgGTzw2q3ya+nA7sjAMnvgc3uhMvlhNXhh+S3wOEM/h0PW9v2dkfwe0q2AOwOe1q/g1mx5+ShC2M4x3cET+2WTJ0wYAYc7eyPpRQ2x1v7bFYLbBYJvgCTi3+aeb0UDVMbO5dddpn8/7POOgsjRoxA79698dxzzyErKyvp/S5duhSLFy9OxRCTJryXVKjOjnkvpLFwOdrCcj4/GGOQJPUdiRCeHb29sUwcxpI1OtnZqueltjWTgYEBkAAE2qrCWhTHiv8/wFiwsh8AKc2HjF9/+fj44Qg/p+LBALnyrYlPu7QiSYBkc8BqkdDFZSHPThx4BmCyxo5XZezEn2unzQKfxy8bO2ZeL0VDKLOxoKAA/fv3x/79+1FaWgqPx6PSJQDA4cOHNTU+Su68804cP35cfhw6dKgDR61NZOq5GCGSaHAjjbGQ4aZEqGwsDYFysHli8DuY2bPDCTcMlAZNoO178Ar42sZO0FgAgoZROuFj8DM+zsSMLqltxIyFvqsl3RabSZEgyRNpkaiOSzyULSOSQdkEVI+xztdRnjVp5vVSNIS6sp48eRKff/45ysrKUFVVBbvdjtraWvn1uro6fPXVV6iuro65H6fTiby8PNUj3USGsdo0OwJcSLVQ1mrRahkhQnn6WJ4dpfCae7FEwtJWugEIeUoCGl4P/n/GGNrRDqhdWMLGmajRFbqmMHkfVHI/CJ8bPi9m/j2agfY2A/XqTDvncBkD9+yQMZo6TB3GWrBgAcaPH4/evXvj66+/xr333gur1YqpU6ciPz8fM2bMwPz581FYWIi8vDzcdtttqK6uNr04GdAKY4nt2bFbgxVq/QGGFp8f+bCrXhfDs9OWjaVxF8dDWJKkv22B2bBIgJ/FDg9peXbS7RXh0xvugdIbxuJbMWgbdJ2Z8GmgdgSxaa9mR29fLA6/LoQEynR8UoWpZ/I///kPpk6digEDBmDKlCkoKirC1q1b0a1bNwDAH//4R1x55ZWYPHkyLrjgApSWluLFF180eNT6CO8lJbpnBwhlEyibTXJEr6DcqhAnJ6odMQsqPQ5ie3YCjKt70k/4OBljGNKzCwqyHRFFRvlj0aJFoR3I3iltXVJnJvzcJc9ObNrr2eFZXHqFxjwb91RbpXMz3xyKhqk9O88++2zM110uF1asWIEVK1akaUSpI2oFZUE9O0BQuHvK45crDSvx88Z2JnbLxsrGahFAnByP8PCQliEgKQ0N2aOSvjECoZATNzoZgNqdn6J3YTZyXHasW7cO99xzD+rq6uT3uN1u+f+yZgcAl1+RsRMkfBroYhqbUKf4ZFPPE2tiGwpjUR2kVCPulVVw5NLgvgACARbyHAiajQWEvFJa6edCdD2PUWdHbq0gaGkAQOG1aft+IUNAuY2WQDm9xyxCs8OArsUlKC0rQ2lpKfLz8yFJEkpLS5Gbm4v+/ftj/fr18vslCXh7/es4vawIjSca8d9DX6E4z4Vnn30WI0eOhMvlwqBBg7Bp0ybV5+7ZsweXXXYZ3G43SkpKMG3aNBw9ejRt3zsdhB9Jq4lvPsyAnI2lkXShB71NQDn8ZvdEC089p+OTKsRduQVHadS0+gKhvksCX0zl0JxGGItXUDbznUqsbKyWDDBGtcJDgFq8qxYoG5N6ztf38HFqjSMnJwc//vGPsXr1avk5CcArz63FlVddjeyckMfn9ttvxy9/+Uv861//QnV1NcaPH49vv/0WAHDs2DFcdNFFGDp0KHbs2IH169fj8OHDmDJlSsd8SYMI93CZ+ebDDNgt7dTs+BITKPP1pclDmp1UQzNpEEoPQYvXnxGeHbllhEYYSwjPjo5sLJGPDzdqQmGstuc1BMoA0I52QO1CNsq4B6rt+Whnzs0334wNGzagvr4eAHD06BG8/86buPYnN0B5KOfMmYPJkyejsrISK1euRH5+Pp544gkAwCOPPIKhQ4figQceQEVFBYYOHYpVq1bhnXfewWeffdYRX9MQIsNYdAmIRbs1O3I2VqJhLNLspBo60w3CZrXI1n6LL6RzEVmzw+vPaDUDlTtomziTKVZvrGbB6yABavGx8l/lBVD5f63X00G4URby7GgP5Nxzz8XAgQOxZs0aAMAL655FWY+eOG/k+fJ3AKAqSWGz2TB8+HDs3bsXALB792688847cLvd8qOiogIA8Pnnn6f2CxpIeEjSzBo6M2C3tVezE3yf/jCWOhuLjJ3UYWqBcqbjslnh9fvQ7PEr2kWI6zmI1R+LPDvGowxjMcaiCpQtkoQAY/I8GF9UkI8t+ntuvvlmrFixAgsXLsS6p5/ChCnXAYDK2InFyZMnMX78eDz44IMRr5WVlSUwenMTPodmDiubAXt720X4kvXstBUVJGM0ZYh7m5oBuBwhQW+oXYS4hyS8dpASoTQ7GndxPMyYlQnGTgCqgoHhhyRc25PuVHulbiiYAh8kllD6Jz/5CQ4ePIjly5fjs0/34qprpqqysQBg69at8v99Ph927tyJyspKAMCwYcPwySefoLy8HH379lU9cnIyp4EoZWMlBs+i8rWzzo7ebKxQBWXS7KQamkkDkVtG+DLFsxO/zo6ZswtieXaaM8Gzo+g5pfR4hItW+fUvWo+wjkYpmA4E9Amlu3TpgkmTJuH222/HhReNRUlZD1WdHQBYsWIFXnrpJXz66aeYPXs2vv/+e9x0000AgNmzZ+O7777D1KlT8eGHH+Lzzz/Hhg0bcOONN8LvjzyfRYXq7CRGe1PPPQlWUJbDWG0CZTsdn5RBxo6ByJ3CPX7Zs+PMBM+OVp0dAYoKxs7GajNGBT4+So+Nsnpy+AWQ/y2HsdKt2VGMya8wVuINY8aMGfB4PLhu2nQA6grKALBs2TIsW7YMQ4YMwfvvv49XX30VXbt2BQB0794dmzdvht/vxyWXXILBgwdj3rx5KCgogMXE52yiUAXlxEhdu4jEwlj8tCVjNHWQZsdAePZSY4tPPrlF9hxkxQhjCaHZiVFnpyWTwliqysJa20HeDki/ZgcIpp/7mPpY8PHX1NSgpqYm4j3//e9/UVRUhMuuHI+jTX45m4tTWVmJbdu2Rf3Mfv36CVOBPVkiwlgm9rSaAbutTbOTbJ0dX6J1dtTrCx2f1EHGjoFwz86xJo/8XCbU2WnRECiHPDvm/fHqy8YS2dgJ/qsMDWlVFrZEeHbSf8yCY2AqYyfaMJqamlBfX49ly5bhZz/7GZwOB9DUbFgYzsyEH0sz33yYAUeKPDuJVlDmkOctddBMGggPiRxr9gIQu8kkENkCQwkX+Jl5cdWXjSXu8dEKY2l6diyh7YzCIocU44/ht7/9LSoqKlBaWoo777xTdkX5Y3ivOivhZ6+Zbz7MQPvbRSTXG4tDxyd1iLtyZwA8JHK8zdgRuckkEMfYEcKzE/0CK/fGEtmzIwuUY2dahdfjMeKU1PIuRfttLFq0CF6vF7W1tXC73XLWFg9j9exVDsYYzj777I4fuMmhooKJYUtV6rlNp0A5wrNj3vVSNOhMNxBuHPAwlsjiV0BZZ0cr9Zxrdsz7HTtTnR2t6smcCMFyh48skvCMsETOGj5e8uxEQtlYiZG6MJa+dSPcs2MT2NNvNmgmDYSHRI41hTw7IhNLsyMLlE0suNPTGyt8MRKJ8KKCwee0tlP/ne5GoECkly0Rj6cUbijRBV0mMhuL5iYW7W4XQZ4d00DGjoFEhLEE9+xkxQhj+UXIxmrzOvk14vPNmRDGUmRZaVVPDm0XYe2kncgwlv73hm+q9R07KxGeHRPffJgBWbPjS1azk1xRQQ553lKH2FdXwQmFsYLGjsgFBYF4mh2BKihnuECZBeIIlI23dSKNnUTeHKVIIhFpNNpNHFY2A7wYoJa3Vw+eRAXK5NnpMOhMNxBnhnl2QmEsjTo7fgE0O7Hq7PB2HgIbpMosKy7e1ePZMST1vO004ReZhMJY4fsiz45M+EyY+ebDDPD6OO3W7CRdZ8e866Vo0EwaSFa4QFngCymQ4dlYbS0weCFIEZF7TiEk3pU0joc5BMrtCGOFbZsOY2fRokWGZHt9+eWXkCQJu3bt0rU91dlJDFmzk2QYK9FGoBHGDh2flEHGjoFwT8gpj/itCIDYXc/9AgiUY2Zj+TInjAWEPG26wlhpPmQNDQ24+1cLcOX5wzCkvBhjhvbH1PE/xMqVK9HU1BT3/ZGenY4ZZzTKy8vlVHmth1b1Zz3U1NRg4sSJ7Rqb6lhKJN6OR6jOTnuzsfTNc3gYy8w3h6JBFZQNJNyKFzmtGVD0+tIMY4mk2YnRG0tg7xu/2DLGZO+VZhjLwGP0xRdfYNSoUcjNy8dtv7ob/SrOhMPhxFf7P8XfnnsKPXr0wFVXXRXxPq/XC7vdHvwjXLOT5u/z4Ycfys1DP/jgA0yePBl1dXXIy8sDAGRlZam2V429g1FeSm0U3ouLvZ11dhLtjRV+DTBz42TREPc2NQMIz+wRuVUEEArxtMbw7JhZEClnY2m1i8iAMBYQ8nJwg06fZyd9C+6tt94Km82Gd97fgnHjr8bp/QbgtN7l+OHlV+L111/H+PHj5TGtXLkSV111FXJycrBkyRIAwMqVK3FW5QBUnV6Mq0afg7+98Kz8fbRCPseOHYMkSdi4cSMAYOPGjZAkCbW1tRg+fDiys7MxcuRI1NXVqca5bNkylJSUIDc3FzNmzEBLS4v8Wrdu3VBaWorS0lIUFhYCAIqLi1FaWoqWlhYUFBRg3bp1GD16NFwuF9auXasZBnvooYdQXl4OIBgmW7NmDV555RXZaOVjBoJG4pgxY5CdnY0hQ4Zgy5YtmvOrPJbk1YlPe+vstFegbObGyaJBM2kg4SER4T07bd9HK4wla3ZMfKcSU7PDBcoCHiPGGJo8PjR5fPD4Amjx+nGqxYcWrx+t3oD8Gn+0eP2qR3PY64k8WAItJ7799lv84x//wOzZs5Hrdqte42eN8mK9aNEiXH311fj4449x00034aWXXsLcuXPx83nz8MJbH+BH19fg3l/OwQfvvZvwnP3617/G73//e+zYsQM2mw033XST/Npzzz2HRYsW4YEHHsCOHTtQVlaGRx99NKH9L1y4EHPnzsXevXsxbty4uNsvWLAAU6ZMwaWXXor6+nrU19dj5MiRqvEuWLAAu3btQv/+/TF16lT4fL6I/SjtVjPfeJgFm2zsJKvZCa6FSQuUySBNGRTGMpDwAnUi60GAUBjLF2Dw+QOqTAIx6uy0pWazYKsBOXspwGShYXjRLxFo9vpx5j0bDPnsf983DtkOfcvM/v37wRjDgAEDVF6H0WedAU9rKyQJmD17Nh588EEAwHXXXYcbb7xR3m7q1KmoqanBz2bdgn1HTqL8p33x8b92YOWfHsKkK+MbFEqWLFmC0aNHAwgaJldccQVaWlrgcrnw0EMPYcaMGZgxYwYA4De/+Q3eeustlXcnHvPmzcOkSZN0b+92u5GVlYXW1laUlpZGvL5gwQJcccUVAIDFixdj4MCB2L9/PyoqKlTbKX99ZOvEh4eRPEl2PU+4N1Z46rmJbw5Fg053A4kMY4nnNVCiDPG0KBYHpUbE1JodxcKi9O5wcTIgfhhLFJRr/Nq/1eLvGz/AwIED0draKj8/fPhw1Xv27t2LUaNGqdwXZw8fgX2ffZrw55911lny/8vKygAAR44ckT9nxIgRqu2rq6sT2n/42NtLrPEqUXrGzPxbNAvtraAcSj3XN9cWi6QqQEjHKHWQZ8dAIgXKYtueyruSZo8fbmfw9FJqYETw7ADqMSsF1yLW2cmyW/Hv+4KejS+OnkJTayi80aswG3lZanFsi9eP/UdOyn+XF+XA7UpuqUik4nTfvn0hSRLq6upw+ZUhEfJpvctRkOWIEPbm5ORo7ifaGWZpc2UoQ2ter1dzW6VgmBsIgSQLy2kRPnaLxRIR8os2Ni30jlc5N3QhjU976+wkmnoOBLNyefaXmeuSiQbNpIGEGzeie3YkSZINHmWtHaWXxMwLrHJsyows/l0cVouQok5JkpDtsCHbYUOOwwaX3So/3E6b/Bp/uJ3qbXI0ttH7SETcXFRUhB/+8Id45JFH0NysTjHXs5vKykps3rxZdUHftWMbKirOBBAUDgNAfX196HWd9WnCP2fbtm2q57Zu3ZrwfpR069YNDQ0NKoMnfGwOh0PO8koWlWdHouU/HtxI8SWp2Um0XQSgvgmmMFbqIM+OgYTf9Yru2QGCYZ5WXwCtitCP2rNj3u+oHJtyzM0Z0CqCE26r6aqg3JEDCuPRRx/FqFGjUD3iXNx42+3oXzkQFosFGz/9CJ9++imqqqqivvf222/HlClTMPisISgfch42vbketW/8DX/7+3oAwZTv8847D8uWLUOfPn1w5MgR/M///E/CY5w7dy5qamowfPhwjBo1CmvXrsUnn3yC008/PenvfeGFF+Kbb77Bb3/7W/zoRz/C+vXr8cYbb8jp6kCwfs+GDRtQV1eHoqIi5OfnJ/w5ykNr5hsPsyBrdpLOxuKNQBPw7Ci2NbMnXDTEX70FJtPq7AChME+zJ7Q4KD07Zr5TUa4rKs2ObOyIf3wiDBkdFZTTae2cccYZ+Ne//oWLL74Yyx+8D9eM+wGmXnERVj/+GBYsWID7778/6nsnTpyIhx9+GH/84x8w6eJq/P9rn8Ti3z+C0aMvlLdZtWoVfD4fqqqqMG/ePPzmN79JeIzXXnst7r77btxxxx2oqqrCwYMHccsttyTzdWUqKyvx6KOPYsWKFRgyZAi2b9+OBQsWqLaZOXMmBgwYgOHDh6Nbt27YvHlzwp+jCmOZ+LdoFtqbes4rLyfr2SGDNHWQZ8dAwvUfotfZART9saJ4dqwmLmQmSRJsFgm+ANPU7GSEsRO2eOprBJreY1ZWVoZHHnkEs+5cIndn7+p2ontBSLMTLaX9lltuwc0//Rn21jfKzym/c2VlJT744APVe5T7uvDCCyP2ffbZZ0c8d9ddd+Guu+5SPcezxJSE76+8vDzq2GfNmoVZs2ZFfA6nW7du+Mc//hHxvvD9FRQURP0MpSGrUzPbqeFhrAALrmOJGh+JFhUE1NeBRN5HxIZm0kBcjsyqswNo98dSFrAzu+ZFq9YO/y6JiG3Nip4wliRJqueNsk+V50pCvbHC92PuUy6tKOfRYuKQsllQhp+S8e7IYawEvGjk2ekY6Gw3EIfVolp8RBcoA4r+WB6FsSNAx3OO3B/LrxXGMv/44xFu3ERbS5XPG7XcWlUGl/5RREThTOxNTDfKmSA9SHyURkoyuh2ejaW3qCCgXmfoGKUO8VdvgZEkSRXKEr0RKKAMY4UWBr8ANXY4Wv2xeBgrvAikiERodqIYAqrnjfLsKL0QCb0z3KAz/3mXLnirCYDmRQ/KKtPeJAoLJpONpbzpFWHNFAXxr66CoyxSJ2INl3CyNMNY5q+ezOFVn7WysTItjBUerlJvp/CqGGTtJB3GigjVpWhAGQKfDrqQxsdikeR5SrRlhD/AwJeRRLQ3Ss8OaXZSB82kwSjbD2SGZyfS2PG3eUnMnInFiaXZyYgwluICF+tapzaKOnBAMUjW4FK1RFB4MoggfDroOqqPZDufK7dPJPXcRZ6dDoFOd4NRitEywbOjLVDmYSzzn26yZqcTpJ7HCmOoDQ1jSNbgknR+x84KNxxF0NCZAe5dSVSz06oIeyUUxiLNTodAZ7vBqIydDPAchIwdRZ0dvzhhrM6UjRXLDlC9ZtBhS1agrNyerueRUBgrMRxJVlFWeXYS8GorNTs2cr+lDJpJg1EaOJkggOXfp1nTs2P+xTXk2YkUKHdez45Ymh0gdEEnz04k3BAU4fdoBpJtBupVpJ0nYqyTZ6djIGPHYNRhLPEPR8ZodjRSzzNBU6Xb2FEaGh06oui0J5RGxk4MuGaH5kYX9rbqi4mGsXj15ERFxqTZ6RjEX70FJ0sVxhLfc6CZjeUXybOT4dlYil+86QXKirEmHsZq24fG22pqajBx4kT57wsvvBDz5s1LfIAKUrGPdCGHsQS4+TADsmcnwdRzbhwlUmMHoEagHQW1izAY5YmdUe0ivJF1dkRwyWprdjp3GCtd1NTUYM2aNQAAu92O03r2xKVXX4ub58xPwuCSADBd3+PFF1+E3W7XtdeNGzdizJgx+P7771FQUJDUPoxGIs9OQoT6YyWm2eEFBRP17KgbgYp/TTALNJMGwy+gNouUEWK0WNlYIvxw+Z2UKhurrc9XJoQZ9baB4K9JSG/q9qWXXor6+nrs27cPs2+bh8f+sAxrHlsesVB5PJ6Y+wl5duKPvbCwELm5uUmOOHX7SBd8SkS4+TAD7dXsJJKJBVC7iI5C/NVbcLgnJBO8OoCiXYQ3shGoCC5ZTc9OW+sLZQFIUVFVJdbh2Un3zb/T6URpaSl69+6Nm382CyPOvxAb31yPWTNnYOLEiViyZAm6d++OAQMGAAAOHTqEKVOmoKCgAIWFhZgwYQK+/PJLOVTDmB/z589HQUEBioqKcMcdd0Q0yQwPQbW2tuJXv/oVevbsCafTib59++KJJ57Al19+iTFjxgAAunTpAkmSUFNTo7mP77//HjfccAO6dOmC7OxsXHbZZdi3b5/8+pNPPomCggJs2LABlZWVcLvdsqHX0ch6JrqQ6oKvWwlrdpLoiwWENwKlY5QqMuMKKzDcOMiEEAkQr86O+X+4mtlYPsHr7DAGeE4BnlOQvE2w+pqD//qb5OfDHxZfEyRvEyze6NvoekTpvq0HiwS4XC54vUEvTm1tLerq6vDmm2/itddeg9frxbhx45Cbm4v33nsPmzdvlo0G/p7HVyzHk08+iVWrVuH999/Hd999h5deeinm595www145plnsHz5cuzduxd//vOf4Xa70bNnT7zwwgsAgLq6OtTX1+Phhx/W3EdNTQ127NiBV199FVu2bAFjDJdffjm8Xq+8TVNTE/73f/8XTz31FN5991189dVXWLBgQdLzpRduyJJnRx/JenY8SXQ8B8iz01GQZsdgsjLM2MnSrLPTlo0lwA83IzU73ibgge7ynwN1vKVb26Pd3PU14MhJ+G2MMWx6+2188O7bmFozE/6m48jJycFf/vIXOBwOAMBf//pXBAIB/OUvf5FDbatXr0ZBQQG2f/A+zjn/QvzlsUdw5513YtKkSQCAxx57DBs2bIj6uZ999hmee+45vPnmmxg7diwA4PTTT5dfLywsBAAUFxerNDtK9u3bh1dffRWbN2/GyJEjAQBr165Fz5498fLLL+Oaa64BAHi9Xjz22GM444wzAABz5szBfffdl/BcJQt5dvThSNbYSaIJKBDeCJT8EakiY2ZyxYoVKC8vh8vlwogRI7B9+3ajh6SLzAtjcYGyqJ4djWwsj+CeHYF47bXX4Ha74XK5cPWEKzFu/NWYNX8hAAmDBw+WDR0A2L17N/bv34/c3Fy43W643W4UFhaipaUFhw4ewInG4zjc0IARI0bI77HZbBg+fHjUz9+1axesVitGjx6d9HfYu3cvbDab6nOLioowYMAA7N27V34uOztbNnQAoKysDEeOHEn6c/USqqBs/t+jGZDbRfgSLSqYXOo5LyooSWKsmaKQEZ6ddevWYf78+XjssccwYsQIPPTQQxg3bhzq6upQXFxs9PBiwi+gmVBQEIhWZ0ccgbJmnR3RBcr27KCHpY19h0+ixedHSb4TxW6X5luON3nw1ffNsFstqChth/DWnp3Q5mPGjMHKlSvhcDjQtbgE+482y6/l5Kg9RCdPnkRVVRXWrl0bsZ9G5lLpxvSSlZWV8HuSJTx7S5KkCD1RR5CIeJtQhLEC6RIoB7cnYzS1ZISx84c//AEzZ87EjTfeCCDoqn799dexatUqLFy40ODRxSak2RH0QhoGD2Od8vjxn++bAADfnGgFIMZdCl9gvjnZKo+/qVVwgbIkqUJJkpOBST5YHFmAw6n9Fr8DzC4Fu0UmEYZKlpycHPTt2xcAD38GjR2tM2fYsGFYt24diouLkZeXp3pt/5ETsHn8KCktw7Zt23DBBRcE9+nzYefOnRg2bJjm5w8ePBiBQACbNm2Sw1hKuGfJ749uSFVWVsLn82Hbtm1yGOvbb79FXV0dzjzzzJjfPx2EGoGa//doBngTz29OhNYEPRxubGl7f2LzzK8JdHxSi/DGjsfjwc6dO3HnnXfKz1ksFowdOxZbtmzRfE9raytaW1vlvxsbGzt8nNGQPTuieg3C4EbbNydacf6D76heE+FOhS8wy974FMve+FT1WqaEsSw67uxlPYeBh0ylKdEYx/XXX4/f/e53mDBhAu677z6cdtppOHjwIF588UVcc9Ns5Hctwaxb52DZsmXo168fKioq8Ic//AHHjh2L+pnl5eWYPn06brrpJixfvhxDhgzBwYMHceTIEUyZMgW9e/eGJEl47bXXcPnllyMrKwtut1u1j379+mHChAmYOXMm/vznPyM3NxcLFy5Ejx49MGHChBTNTvJQu4jE4J6Zh97ah4fe2hdn60iSrbMjgidcJISfzaNHj8Lv96OkpET1fElJCRoaGjTfs3TpUuTn58uPnj17pmOomozoU4g+XXNwxeAyw8aQSnoX5WBYrwI4bRbVI9dpw7hBpUYPLy7jBpYi12WLGP/ZPQtQXpQ+D0dHkp9lh9NmRY4zuvGWZbfCZbeiIMu4QnkWSUJBlgNup03TMMvOzsa7776LXr16YdKkSaisrMSMGTPQ0tKCHt0K4bRZ8avbF2DatGmYPn06qqurkZubi6uvvjrm565cuRI/+tGPcOutt6KiogIzZ87EqVOnAAA9evTA4sWLsXDhQpSUlGDOnDma+1i9ejWqqqpw5ZVXorq6Gowx/P3vfzdF4UG30wqbRcI55V2MHooQXHJmSdtvxpLwI9dpw2UJrnvlXYNr6FVnd4+/MaEbiaUjSNyBfP311+jRowc++OADVFdXy8/fcccd2LRpE7Zt2xbxHi3PTs+ePXH8+PEIdzhBiERLSwsOHDiAPn36wOXS1uMQnRs6R4hMorGxEfn5+XGv38KHsbp27Qqr1YrDhw+rnj98+DBKS7UtaqfTCadTW6tAEARBEERmIXwYy+FwoKqqCrW1tfJzgUAAtbW1Kk8PQRAEQRCdE+E9OwAwf/58TJ8+HcOHD8e5556Lhx56CKdOnZKzswiCIAiC6LxkhLFz7bXX4ptvvsE999yDhoYGnH322Vi/fn2EaJkgCIIgiM5HRhg7QLDUerTMCIIgCIIgOi/Ca3YIgohE8CRLogOhc4PojJCxQxAZBK/j0tSkv9Ir0bng54YZav4QRLrImDAWQRCA1WpFQUGB3FAyOztbrphLdG4YY2hqasKRI0dQUFAAqzUzKoIThB7I2CGIDIPXl0pHB21CPAoKCqLWICOITIWMHYLIMCRJQllZGYqLi+H1eo0eDmEi7HY7eXSITgkZOwSRoVitVrqwEQRBgATKBEEQBEFkOGTsEARBEASR0ZCxQxAEQRBERkOaHYSKbDU2Nho8EoIgCIIg9MKv2/GKZZKxA+DEiRMAgJ49exo8EoIgCIIgEuXEiRPIz8+P+rrEqHY4AoEAvv76a+Tm5qa0AFtjYyN69uyJQ4cOIS8vL2X7JeJDc28cNPfGQXNvHDT3xsAYw4kTJ9C9e3dYLNGVOeTZAWCxWHDaaad12P7z8vLo5DcImnvjoLk3Dpp746C5Tz+xPDocEigTBEEQBJHRkLFDEARBEERGQ8ZOB+J0OnHvvffC6XQaPZROB829cdDcGwfNvXHQ3JsbEigTBEEQBJHRkGeHIAiCIIiMhowdgiAIgiAyGjJ2CIIgCILIaMjYIQiCIAgioyFjpwNZsWIFysvL4XK5MGLECGzfvt3oIWUUS5cuxTnnnIPc3FwUFxdj4sSJqKurU23T0tKC2bNno6ioCG63G5MnT8bhw4cNGnHmsmzZMkiShHnz5snP0dx3HP/973/xk5/8BEVFRcjKysLgwYOxY8cO+XXGGO655x6UlZUhKysLY8eOxb59+wwccWbg9/tx9913o0+fPsjKysIZZ5yB+++/X9WXiebepDCiQ3j22WeZw+Fgq1atYp988gmbOXMmKygoYIcPHzZ6aBnDuHHj2OrVq9mePXvYrl272OWXX8569erFTp48KW8za9Ys1rNnT1ZbW8t27NjBzjvvPDZy5EgDR515bN++nZWXl7OzzjqLzZ07V36e5r5j+O6771jv3r1ZTU0N27ZtG/viiy/Yhg0b2P79++Vtli1bxvLz89nLL7/Mdu/eza666irWp08f1tzcbODIxWfJkiWsqKiIvfbaa+zAgQPs+eefZ263mz388MPyNjT35oSMnQ7i3HPPZbNnz5b/9vv9rHv37mzp0qUGjiqzOXLkCAPANm3axBhj7NixY8xut7Pnn39e3mbv3r0MANuyZYtRw8woTpw4wfr168fefPNNNnr0aNnYobnvOH71q1+x888/P+rrgUCAlZaWst/97nfyc8eOHWNOp5M988wz6RhixnLFFVewm266SfXcpEmT2PXXX88Yo7k3MxTG6gA8Hg927tyJsWPHys9ZLBaMHTsWW7ZsMXBkmc3x48cBAIWFhQCAnTt3wuv1qo5DRUUFevXqRcchRcyePRtXXHGFao4BmvuO5NVXX8Xw4cNxzTXXoLi4GEOHDsXjjz8uv37gwAE0NDSo5j4/Px8jRoyguW8nI0eORG1tLT777DMAwO7du/H+++/jsssuA0Bzb2aoEWgHcPToUfj9fpSUlKieLykpwaeffmrQqDKbQCCAefPmYdSoURg0aBAAoKGhAQ6HAwUFBaptS0pK0NDQYMAoM4tnn30W//znP/Hhhx9GvEZz33F88cUXWLlyJebPn4+77roLH374IX7+85/D4XBg+vTp8vxqrT809+1j4cKFaGxsREVFBaxWK/x+P5YsWYLrr78eAGjuTQwZO0RGMHv2bOzZswfvv/++0UPpFBw6dAhz587Fm2++CZfLZfRwOhWBQADDhw/HAw88AAAYOnQo9uzZg8ceewzTp083eHSZzXPPPYe1a9fi6aefxsCBA7Fr1y7MmzcP3bt3p7k3ORTG6gC6du0Kq9UakXly+PBhlJaWGjSqzGXOnDl47bXX8M477+C0006Tny8tLYXH48GxY8dU29NxaD87d+7EkSNHMGzYMNhsNthsNmzatAnLly+HzWZDSUkJzX0HUVZWhjPPPFP1XGVlJb766isAkOeX1p/Uc/vtt2PhwoX48Y9/jMGDB2PatGn4xS9+gaVLlwKguTczZOx0AA6HA1VVVaitrZWfCwQCqK2tRXV1tYEjyywYY5gzZw5eeuklvP322+jTp4/q9aqqKtjtdtVxqKurw1dffUXHoZ1cfPHF+Pjjj7Fr1y75MXz4cFx//fXy/2nuO4ZRo0ZFlFj47LPP0Lt3bwBAnz59UFpaqpr7xsZGbNu2jea+nTQ1NcFiUV82rVYrAoEAAJp7U2O0QjpTefbZZ5nT6WRPPvkk+/e//81++tOfsoKCAtbQ0GD00DKGW265heXn57ONGzey+vp6+dHU1CRvM2vWLNarVy/29ttvsx07drDq6mpWXV1t4KgzF2U2FmM09x3F9u3bmc1mY0uWLGH79u1ja9euZdnZ2eyvf/2rvM2yZctYQUEBe+WVV9hHH33EJkyYQOnPKWD69OmsR48ecur5iy++yLp27cruuOMOeRuae3NCxk4H8qc//Yn16tWLORwOdu6557KtW7caPaSMAoDmY/Xq1fI2zc3N7NZbb2VdunRh2dnZ7Oqrr2b19fXGDTqDCTd2aO47jr/97W9s0KBBzOl0soqKCvZ///d/qtcDgQC7++67WUlJCXM6neziiy9mdXV1Bo02c2hsbGRz585lvXr1Yi6Xi51++uns17/+NWttbZW3obk3JxJjitKPBEEQBEEQGQZpdgiCIAiCyGjI2CEIgiAIIqMhY4cgCIIgiIyGjB2CIAiCIDIaMnYIgiAIgshoyNghCIIgCCKjIWOHIAiCIIiMhowdgiAMo6amBhMnTjR6GARBZDhk7BAE0SFIkhTzsWjRIjz88MN48sknDRnf448/jiFDhsDtdqOgoABDhw6VGzoCZIgRRCZhM3oABEFkJvX19fL/161bh3vuuUfVwNLtdsPtdhsxNKxatQrz5s3D8uXLMXr0aLS2tuKjjz7Cnj17DBkPQRAdC3l2CILoEEpLS+VHfn4+JElSPed2uyO8JxdeeCFuu+02zJs3D126dEFJSQkef/xxnDp1CjfeeCNyc3PRt29fvPHGG6rP2rNnDy677DK43W6UlJRg2rRpOHr0aNSxvfrqq5gyZQpmzJiBvn37YuDAgZg6dSqWLFkCAFi0aBHWrFmDV155RfZEbdy4EQBw6NAhTJkyBQUFBSgsLMSECRPw5Zdfyvvm32nx4sXo1q0b8vLyMGvWLHg8npTNLUEQiUHGDkEQpmLNmjXo2rUrtm/fjttuuw233HILrrnmGowcORL//Oc/cckll2DatGloamoCABw7dgwXXXQRhg4dih07dmD9+vU4fPgwpkyZEvUzSktLsXXrVhw8eFDz9QULFmDKlCm49NJLUV9fj/r6eowcORJerxfjxo1Dbm4u3nvvPWzevBlutxuXXnqpypipra3F3r17sXHjRjzzzDN48cUXsXjx4tROFEEQ+jG6EylBEJnP6tWrWX5+fsTz06dPZxMmTJD/Hj16NDv//PPlv30+H8vJyWHTpk2Tn6uvr2cA2JYtWxhjjN1///3skksuUe330KFDDEDUbtNff/01O++88xgA1r9/fzZ9+nS2bt065vf7o46NMcaeeuopNmDAABYIBOTnWltbWVZWFtuwYYP8vsLCQnbq1Cl5m5UrVzK3263aP0EQ6YM8OwRBmIqzzjpL/r/VakVRUREGDx4sP1dSUgIAOHLkCABg9+7deOedd2QNkNvtRkVFBQDg888/1/yMsrIybNmyBR9//DHmzp0Ln8+H6dOn49JLL0UgEIg6tt27d2P//v3Izc2VP6uwsBAtLS2qzxoyZAiys7Plv6urq3Hy5EkcOnQoiRkhCKK9kECZIAhTYbfbVX9LkqR6TpIkAJCNkpMnT2L8+PF48MEHI/ZVVlYW87MGDRqEQYMG4dZbb8WsWbPwgx/8AJs2bcKYMWM0tz958iSqqqqwdu3aiNe6desW+4sRBGEYZOwQBCE0w4YNwwsvvIDy8nLYbMkvaWeeeSYA4NSpUwAAh8MBv98f8Vnr1q1DcXEx8vLyou5r9+7daG5uRlZWFgBg69atcLvd6NmzZ9LjIwgieSiMRRCE0MyePRvfffcdpk6dig8//BCff/45NmzYgBtvvDHCWOHccsstuP/++7F582YcPHgQW7duxQ033IBu3bqhuroaAFBeXo6PPvoIdXV1OHr0KLxeL66//np07doVEyZMwHvvvYcDBw5g48aN+PnPf47//Oc/8v49Hg9mzJiBf//73/j73/+Oe++9F3PmzIHFQksuQRgB/fIIghCa7t27Y/PmzfD7/bjkkkswePBgzJs3DwUFBVGNi7Fjx2Lr1q245ppr0L9/f0yePBkulwu1tbUoKioCAMycORMDBgzA8OHD0a1bN2zevBnZ2dl499130atXL0yaNAmVlZWYMWMGWlpaVJ6eiy++GP369cMFF1yAa6+9FldddRUWLVqUjukgCEIDiTHGjB4EQRBEplBTU4Njx47h5ZdfNnooBEG0QZ4dgiAIgiAyGjJ2CIIgCILIaCiMRRAEQRBERkOeHYIgCIIgMhoydgiCIAiCyGjI2CEIgiAIIqMhY4cgCIIgiIyGjB2CIAiCIDIaMnYIgiAIgshoyNghCIIgCCKjIWOHIAiCIIiMhowdgiAIgiAymv8HDjoC0n+3S+IAAAAASUVORK5CYII=", 1601 | "text/plain": [ 1602 | "
" 1603 | ] 1604 | }, 1605 | "metadata": {}, 1606 | "output_type": "display_data" 1607 | }, 1608 | { 1609 | "name": "stdout", 1610 | "output_type": "stream", 1611 | "text": [ 1612 | "MSE test loss: 0.485170769399389\n", 1613 | "MAE test loss: 0.48576957206008886\n" 1614 | ] 1615 | } 1616 | ], 1617 | "source": [ 1618 | "x.test_plots(df_columns=df.columns[1:],scaler=scaler,column='WindDirection')" 1619 | ] 1620 | }, 1621 | { 1622 | "cell_type": "code", 1623 | "execution_count": null, 1624 | "id": "c137bc01", 1625 | "metadata": {}, 1626 | "outputs": [], 1627 | "source": [ 1628 | "'''\n", 1629 | "dat=torch.from_numpy(train_dataset[0][0])\n", 1630 | "dat=dat.unsqueeze(dim=0)\n", 1631 | "dat.shape\n", 1632 | "model(dat).shape\n", 1633 | "'''" 1634 | ] 1635 | }, 1636 | { 1637 | "cell_type": "code", 1638 | "execution_count": null, 1639 | "id": "1bfe07c7", 1640 | "metadata": {}, 1641 | "outputs": [], 1642 | "source": [] 1643 | } 1644 | ], 1645 | "metadata": { 1646 | "accelerator": "GPU", 1647 | "colab": { 1648 | "gpuType": "V100", 1649 | "machine_shape": "hm", 1650 | "provenance": [] 1651 | }, 1652 | "kernelspec": { 1653 | "display_name": "gpu1", 1654 | "language": "python", 1655 | "name": "gpu1" 1656 | }, 1657 | "language_info": { 1658 | "codemirror_mode": { 1659 | "name": "ipython", 1660 | "version": 3 1661 | }, 1662 | "file_extension": ".py", 1663 | "mimetype": "text/x-python", 1664 | "name": "python", 1665 | "nbconvert_exporter": "python", 1666 | "pygments_lexer": "ipython3", 1667 | "version": "3.9.18" 1668 | } 1669 | }, 1670 | "nbformat": 4, 1671 | "nbformat_minor": 5 1672 | } 1673 | --------------------------------------------------------------------------------