├── .qrignore ├── LICENSE.txt ├── README.md └── calspread ├── Introduction.ipynb ├── Part1-Historical-Data-Collection.ipynb ├── Part2-Calendar-Spread-Research.ipynb ├── Part3-Moonshot-Strategy.ipynb ├── Part4-Realtime-Data-Collection.ipynb ├── Part5-Moonshot-Native-Spread-Strategy.ipynb ├── Part6-Scheduling.ipynb ├── __init__.py ├── calspread.py ├── calspread_native.py ├── collect_combo.py ├── quantrocket.countdown.crontab.sh ├── quantrocket.master.rollover.yml └── quantrocket.moonshot.allocations.yml /.qrignore: -------------------------------------------------------------------------------- 1 | README.md 2 | LICENSE.txt 3 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. 10 | 11 | "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. 12 | 13 | "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. 14 | 15 | "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. 16 | 17 | "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. 18 | 19 | "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. 20 | 21 | "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). 22 | 23 | "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. 24 | 25 | "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." 26 | 27 | "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 28 | 29 | 2. Grant of Copyright License. 30 | 31 | Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 32 | 33 | 3. Grant of Patent License. 34 | 35 | Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 36 | 37 | 4. Redistribution. 38 | 39 | You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: 40 | 41 | You must give any other recipients of the Work or Derivative Works a copy of this License; and 42 | You must cause any modified files to carry prominent notices stating that You changed the files; and 43 | You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and 44 | If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. 45 | You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 46 | 47 | 5. Submission of Contributions. 48 | 49 | Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 50 | 51 | 6. Trademarks. 52 | 53 | This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 54 | 55 | 7. Disclaimer of Warranty. 56 | 57 | Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 58 | 59 | 8. Limitation of Liability. 60 | 61 | In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 62 | 63 | 9. Accepting Warranty or Additional Liability. 64 | 65 | While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. 66 | 67 | END OF TERMS AND CONDITIONS 68 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # calspread 2 | 3 | Intraday trading strategy for futures calendar spreads. Uses crude oil futures and 1-minute bid/ask bars from Interactive Brokers with a Bollinger Band mean reversion strategy. Runs in Moonshot. Demonstrates using exchange native spreads for live/paper trading, and non-native spreads for backtesting. 4 | 5 | ## Clone in QuantRocket 6 | 7 | CLI: 8 | 9 | ```shell 10 | quantrocket codeload clone 'calspread' 11 | ``` 12 | 13 | Python: 14 | 15 | ```python 16 | from quantrocket.codeload import clone 17 | clone("calspread") 18 | ``` 19 | 20 | ## Browse in GitHub 21 | 22 | Start here: [calspread/Introduction.ipynb](calspread/Introduction.ipynb) 23 | 24 | *** 25 | 26 | Find more code in QuantRocket's [Code Library](https://www.quantrocket.com/code/) 27 | -------------------------------------------------------------------------------- /calspread/Introduction.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "\"QuantRocket
\n", 8 | "Disclaimer" 9 | ] 10 | }, 11 | { 12 | "cell_type": "markdown", 13 | "metadata": {}, 14 | "source": [ 15 | "# Intraday Futures Calendar Spreads\n", 16 | "\n", 17 | "This tutorial demonstrates the mechanics of intraday trading of futures calendar spreads. Uses crude oil futures and 1-minute bid/ask bars from Interactive Brokers with a Bollinger Band mean reversion strategy. Runs in Moonshot." 18 | ] 19 | }, 20 | { 21 | "cell_type": "markdown", 22 | "metadata": {}, 23 | "source": [ 24 | "## Native vs non-native spreads\n", 25 | "\n", 26 | "For backtesting, non-native spreads are used. That is, the spread is computed in the Moonshot code from the historical market data of the individual legs. \n", 27 | "\n", 28 | "For live/paper trading, exchange native combos are used. Native combos typically offer narrower bid-ask spreads compared to trading the legs separately. Interactive Brokers provides real-time market data for native combos but does not provide historical data for native combos, hence the need to backtest with non-native spreads. \n", 29 | "\n", 30 | "(For more on combos, see the usage guide.)" 31 | ] 32 | }, 33 | { 34 | "cell_type": "markdown", 35 | "metadata": {}, 36 | "source": [ 37 | "## Backtesting (non-native spreads)\n", 38 | "\n", 39 | "* Part 1: [Historical Data Collection](Part1-Historical-Data-Collection.ipynb)\n", 40 | "* Part 2: [Calendar Spread Research](Part2-Calendar-Spread-Research.ipynb)\n", 41 | "* Part 3: [Moonshot Strategy](Part3-Moonshot-Strategy.ipynb)" 42 | ] 43 | }, 44 | { 45 | "cell_type": "markdown", 46 | "metadata": {}, 47 | "source": [ 48 | "## Live/Paper trading (native spreads)\n", 49 | "\n", 50 | "* Part 4: [Real-time Data Collection](Part4-Realtime-Data-Collection.ipynb)\n", 51 | "* Part 5: [Moonshot Native Calendar Spread Strategy](Part5-Moonshot-Native-Spread-Strategy.ipynb)\n", 52 | "* Part 6: [Scheduling](Part6-Scheduling.ipynb)\n" 53 | ] 54 | } 55 | ], 56 | "metadata": { 57 | "kernelspec": { 58 | "display_name": "Python 3.11", 59 | "language": "python", 60 | "name": "python3" 61 | }, 62 | "language_info": { 63 | "codemirror_mode": { 64 | "name": "ipython", 65 | "version": 3 66 | }, 67 | "file_extension": ".py", 68 | "mimetype": "text/x-python", 69 | "name": "python", 70 | "nbconvert_exporter": "python", 71 | "pygments_lexer": "ipython3", 72 | "version": "3.11.0" 73 | } 74 | }, 75 | "nbformat": 4, 76 | "nbformat_minor": 4 77 | } 78 | -------------------------------------------------------------------------------- /calspread/Part1-Historical-Data-Collection.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "\"QuantRocket
\n", 8 | "Disclaimer" 9 | ] 10 | }, 11 | { 12 | "cell_type": "markdown", 13 | "metadata": {}, 14 | "source": [ 15 | "***\n", 16 | "[Intraday Futures Calendar Spreads](Introduction.ipynb) › Part 1: Historical Data Collection\n", 17 | "***" 18 | ] 19 | }, 20 | { 21 | "cell_type": "markdown", 22 | "metadata": {}, 23 | "source": [ 24 | "# Historical Data Collection\n", 25 | "\n", 26 | "For backtesting we will collect 1-minute bid-ask bars for all CL futures. " 27 | ] 28 | }, 29 | { 30 | "cell_type": "markdown", 31 | "metadata": {}, 32 | "source": [ 33 | "First, start IB Gateway:" 34 | ] 35 | }, 36 | { 37 | "cell_type": "code", 38 | "execution_count": 1, 39 | "metadata": {}, 40 | "outputs": [ 41 | { 42 | "data": { 43 | "text/plain": [ 44 | "{'ibg1': {'status': 'running'}}" 45 | ] 46 | }, 47 | "execution_count": 1, 48 | "metadata": {}, 49 | "output_type": "execute_result" 50 | } 51 | ], 52 | "source": [ 53 | "from quantrocket.ibg import start_gateways\n", 54 | "start_gateways(wait=True)" 55 | ] 56 | }, 57 | { 58 | "cell_type": "markdown", 59 | "metadata": {}, 60 | "source": [ 61 | "## Collect CL futures chain\n", 62 | "\n", 63 | "Next, we need to collect contract details for all available CL futures. CL is included in QuantRocket's free sample data, so we can collect the contract details by specifying the \"FREE\" country: " 64 | ] 65 | }, 66 | { 67 | "cell_type": "code", 68 | "execution_count": 2, 69 | "metadata": {}, 70 | "outputs": [ 71 | { 72 | "data": { 73 | "text/plain": [ 74 | "{'status': 'success', 'msg': 'successfully loaded IBKR FREE securities'}" 75 | ] 76 | }, 77 | "execution_count": 2, 78 | "metadata": {}, 79 | "output_type": "execute_result" 80 | } 81 | ], 82 | "source": [ 83 | "from quantrocket.master import collect_ibkr_listings\n", 84 | "collect_ibkr_listings(countries=\"FREE\")" 85 | ] 86 | }, 87 | { 88 | "cell_type": "markdown", 89 | "metadata": {}, 90 | "source": [ 91 | "## Define universe of CL futures\n", 92 | "\n", 93 | "Next we define a universe of CL futures for easy reference. To do so, download a CSV of CL futures from the securities master database:" 94 | ] 95 | }, 96 | { 97 | "cell_type": "code", 98 | "execution_count": 3, 99 | "metadata": {}, 100 | "outputs": [], 101 | "source": [ 102 | "from quantrocket.master import download_master_file\n", 103 | "download_master_file(\"cl_futures.csv\", exchanges=\"NYMEX\", sec_types=\"FUT\", symbols=\"CL\")" 104 | ] 105 | }, 106 | { 107 | "cell_type": "markdown", 108 | "metadata": {}, 109 | "source": [ 110 | "Then upload the CSV to create the \"cl-fut\" universe:" 111 | ] 112 | }, 113 | { 114 | "cell_type": "code", 115 | "execution_count": 4, 116 | "metadata": {}, 117 | "outputs": [ 118 | { 119 | "data": { 120 | "text/plain": [ 121 | "{'code': 'cl-fut', 'provided': 209, 'inserted': 209, 'total_after_insert': 209}" 122 | ] 123 | }, 124 | "execution_count": 4, 125 | "metadata": {}, 126 | "output_type": "execute_result" 127 | } 128 | ], 129 | "source": [ 130 | "from quantrocket.master import create_universe\n", 131 | "create_universe(\"cl-fut\", infilepath_or_buffer=\"cl_futures.csv\")" 132 | ] 133 | }, 134 | { 135 | "cell_type": "markdown", 136 | "metadata": {}, 137 | "source": [ 138 | "## Define rollover rules\n", 139 | "\n", 140 | "For the purpose of defining calendar spreads, we must define rollover rules to specify which contract should be considered the front month and the various back months. Example rules are defined in [quantrocket.master.rollover.yml](quantrocket.master.rollover.yml), where we specify to rollover 10 business days before expiration. See the usage guide for more rollover rule options.\n", 141 | "\n", 142 | "The master service looks for this file in the `codeload` directory, so move it there to install it:" 143 | ] 144 | }, 145 | { 146 | "cell_type": "code", 147 | "execution_count": 5, 148 | "metadata": {}, 149 | "outputs": [], 150 | "source": [ 151 | "# move file over unless it already exists\n", 152 | "![ -e /codeload/quantrocket.master.rollover.y*ml ] && echo 'oops, the file already exists!' || mv quantrocket.master.rollover.yml /codeload/" 153 | ] 154 | }, 155 | { 156 | "cell_type": "markdown", 157 | "metadata": {}, 158 | "source": [ 159 | "## Collect historical data\n", 160 | "\n", 161 | "Next we collect 1-min historical data with the following parameters: \n", 162 | "\n", 163 | "* `bar_type`: The `BID_ASK` bar type provides the average bid and ask over the period of the bar. \n", 164 | "* `outside_rth`: We opt to include data from outside regular trading hours so that our moving averages and Bollinger Bands aren't jumpy.\n", 165 | "* `shard`: We shard/partition the database by month, resulting in a separate database per month (see the usage guide for more on sharding).\n", 166 | "* `start_date`: We enforce a start date of 2.5 years ago. IBKR only provides historical data for futures that expired less than 2 years ago, but the IBKR API will sometimes unsuccessfully look for data much earlier than that, which slows down data collection. " 167 | ] 168 | }, 169 | { 170 | "cell_type": "code", 171 | "execution_count": 6, 172 | "metadata": {}, 173 | "outputs": [ 174 | { 175 | "data": { 176 | "text/plain": [ 177 | "{'status': 'successfully created quantrocket.v2.history.cl-1min-bbo.sqlite'}" 178 | ] 179 | }, 180 | "execution_count": 6, 181 | "metadata": {}, 182 | "output_type": "execute_result" 183 | } 184 | ], 185 | "source": [ 186 | "from quantrocket.history import create_ibkr_db\n", 187 | "import pandas as pd\n", 188 | "\n", 189 | "start_date = (pd.Timestamp.today() - pd.Timedelta(days=365*2.5)).date().isoformat()\n", 190 | "\n", 191 | "create_ibkr_db(\"cl-1min-bbo\", \n", 192 | " universes=\"cl-fut\", \n", 193 | " bar_size=\"1 min\", \n", 194 | " bar_type=\"BID_ASK\", \n", 195 | " outside_rth=True,\n", 196 | " shard=\"month\",\n", 197 | " start_date=start_date\n", 198 | " )" 199 | ] 200 | }, 201 | { 202 | "cell_type": "markdown", 203 | "metadata": {}, 204 | "source": [ 205 | "Then we collect the data. Be prepared for intraday data collection to take some time (perhaps a day or so depending on several variables)." 206 | ] 207 | }, 208 | { 209 | "cell_type": "code", 210 | "execution_count": 7, 211 | "metadata": {}, 212 | "outputs": [ 213 | { 214 | "data": { 215 | "text/plain": [ 216 | "{'status': 'the historical data will be collected asynchronously'}" 217 | ] 218 | }, 219 | "execution_count": 7, 220 | "metadata": {}, 221 | "output_type": "execute_result" 222 | } 223 | ], 224 | "source": [ 225 | "from quantrocket.history import collect_history\n", 226 | "collect_history(\"cl-1min-bbo\")" 227 | ] 228 | }, 229 | { 230 | "cell_type": "markdown", 231 | "metadata": {}, 232 | "source": [ 233 | "Monitor flightlog for completion:\n", 234 | "\n", 235 | "```\n", 236 | "quantrocket.history: INFO [cl-1min-bbo] Collecting history from IBKR for 144 securities in cl-1min-bbo\n", 237 | "...\n", 238 | "quantrocket.history: INFO [cl-1min-bbo] Saved 22664 total records for 50 total securities to quantrocket.v2.history.cl-1min-bbo.sqlite\n", 239 | "```\n", 240 | "\n", 241 | "Note that it is normal to see warning messages like the following:\n", 242 | "\n", 243 | "```\n", 244 | "quantrocket.history: WARNING [cl-1min-bbo] IBKR reports CLZ8 FUT (sid QF000000023508) cannot be found in their system, this is commonly due to a stock delisting or switching exchanges or a derivative contract expiring, see http://qrok.it/h/err/200 for more help (error code 200: No security definition has been found for the request)\n", 245 | "```\n", 246 | "\n", 247 | "The CL futures chain collected earlier contains contracts that precede the approximately 2-year period for which IBKR provides historical data. The warning message reports that IBKR does not have historical data for this particular contract. \n" 248 | ] 249 | }, 250 | { 251 | "cell_type": "markdown", 252 | "metadata": {}, 253 | "source": [ 254 | "***\n", 255 | "\n", 256 | "## *Next Up*\n", 257 | "\n", 258 | "Part 2: [Calendar Spread Research](Part2-Calendar-Spread-Research.ipynb)" 259 | ] 260 | } 261 | ], 262 | "metadata": { 263 | "kernelspec": { 264 | "display_name": "Python 3.11", 265 | "language": "python", 266 | "name": "python3" 267 | }, 268 | "language_info": { 269 | "codemirror_mode": { 270 | "name": "ipython", 271 | "version": 3 272 | }, 273 | "file_extension": ".py", 274 | "mimetype": "text/x-python", 275 | "name": "python", 276 | "nbconvert_exporter": "python", 277 | "pygments_lexer": "ipython3", 278 | "version": "3.11.0" 279 | } 280 | }, 281 | "nbformat": 4, 282 | "nbformat_minor": 4 283 | } 284 | -------------------------------------------------------------------------------- /calspread/Part2-Calendar-Spread-Research.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "\"QuantRocket
\n", 8 | "Disclaimer" 9 | ] 10 | }, 11 | { 12 | "cell_type": "markdown", 13 | "metadata": {}, 14 | "source": [ 15 | "***\n", 16 | "[Intraday Futures Calendar Spreads](Introduction.ipynb) › Part 2: Calendar Spread Research\n", 17 | "***" 18 | ] 19 | }, 20 | { 21 | "cell_type": "markdown", 22 | "metadata": {}, 23 | "source": [ 24 | "# Calendar Spread Research\n", 25 | "\n", 26 | "This notebook looks at how wide the typical spread is between different CL contracts." 27 | ] 28 | }, 29 | { 30 | "cell_type": "markdown", 31 | "metadata": {}, 32 | "source": [ 33 | "First, load the last 30 days of prices. For the `BID_ASK` bar type, the `Open` field contains the average bid and the `Close` field contains the average ask:" 34 | ] 35 | }, 36 | { 37 | "cell_type": "code", 38 | "execution_count": 1, 39 | "metadata": {}, 40 | "outputs": [], 41 | "source": [ 42 | "from quantrocket import get_prices\n", 43 | "import pandas as pd\n", 44 | "\n", 45 | "start_date = pd.Timestamp.today() - pd.Timedelta(days=30)\n", 46 | "\n", 47 | "prices = get_prices(\"cl-1min-bbo\", universes=\"cl-fut\", start_date=start_date, fields=[\"Open\",\"Close\"])\n", 48 | "bids = prices.loc[\"Open\"]\n", 49 | "asks = prices.loc[\"Close\"]\n", 50 | "midpoints = (bids+asks) / 2" 51 | ] 52 | }, 53 | { 54 | "cell_type": "markdown", 55 | "metadata": {}, 56 | "source": [ 57 | "Using a DataFrame of prices, we can use the function `get_contract_nums_reindexed_like` to obtain a similarly indexed DataFrame showing each contract's numerical sequence in the contract chain as of any given date. Using the `limit` parameter, we ask the function to sequence the next 15 contracts.\n", 58 | "\n", 59 | "> Note: Because each column in the DataFrame represents an individual futures contract and each individual contract only trades for a limited window of time before trading shifts to later contracts, it is normal to see NaNs in the data. NaNs mean that the particular contract did not trade at that particular date and time. " 60 | ] 61 | }, 62 | { 63 | "cell_type": "code", 64 | "execution_count": 2, 65 | "metadata": {}, 66 | "outputs": [ 67 | { 68 | "data": { 69 | "text/html": [ 70 | "
\n", 71 | "\n", 84 | "\n", 85 | " \n", 86 | " \n", 87 | " \n", 88 | " \n", 89 | " \n", 90 | " \n", 91 | " \n", 92 | " \n", 93 | " \n", 94 | " \n", 95 | " \n", 96 | " \n", 97 | " \n", 98 | " \n", 99 | " \n", 100 | " \n", 101 | " \n", 102 | " \n", 103 | " \n", 104 | " \n", 105 | " \n", 106 | " \n", 107 | " \n", 108 | " \n", 109 | " \n", 110 | " \n", 111 | " \n", 112 | " \n", 113 | " \n", 114 | " \n", 115 | " \n", 116 | " \n", 117 | " \n", 118 | " \n", 119 | " \n", 120 | " \n", 121 | " \n", 122 | " \n", 123 | " \n", 124 | " \n", 125 | " \n", 126 | " \n", 127 | " \n", 128 | " \n", 129 | " \n", 130 | " \n", 131 | " \n", 132 | " \n", 133 | " \n", 134 | " \n", 135 | " \n", 136 | " \n", 137 | " \n", 138 | " \n", 139 | " \n", 140 | " \n", 141 | " \n", 142 | " \n", 143 | " \n", 144 | " \n", 145 | " \n", 146 | " \n", 147 | " \n", 148 | " \n", 149 | " \n", 150 | " \n", 151 | " \n", 152 | " \n", 153 | " \n", 154 | " \n", 155 | " \n", 156 | " \n", 157 | " \n", 158 | " \n", 159 | " \n", 160 | " \n", 161 | " \n", 162 | " \n", 163 | " \n", 164 | " \n", 165 | " \n", 166 | " \n", 167 | " \n", 168 | " \n", 169 | " \n", 170 | " \n", 171 | " \n", 172 | " \n", 173 | " \n", 174 | " \n", 175 | " \n", 176 | " \n", 177 | " \n", 178 | " \n", 179 | " \n", 180 | " \n", 181 | " \n", 182 | " \n", 183 | " \n", 184 | " \n", 185 | " \n", 186 | " \n", 187 | " \n", 188 | " \n", 189 | " \n", 190 | " \n", 191 | " \n", 192 | " \n", 193 | " \n", 194 | " \n", 195 | " \n", 196 | " \n", 197 | " \n", 198 | " \n", 199 | " \n", 200 | " \n", 201 | " \n", 202 | " \n", 203 | " \n", 204 | " \n", 205 | " \n", 206 | " \n", 207 | " \n", 208 | " \n", 209 | " \n", 210 | " \n", 211 | " \n", 212 | " \n", 213 | " \n", 214 | " \n", 215 | " \n", 216 | " \n", 217 | " \n", 218 | " \n", 219 | " \n", 220 | " \n", 221 | " \n", 222 | " \n", 223 | " \n", 224 | " \n", 225 | " \n", 226 | " \n", 227 | " \n", 228 | " \n", 229 | " \n", 230 | " \n", 231 | " \n", 232 | " \n", 233 | " \n", 234 | " \n", 235 | " \n", 236 | " \n", 237 | " \n", 238 | " \n", 239 | " \n", 240 | " \n", 241 | " \n", 242 | " \n", 243 | " \n", 244 | " \n", 245 | " \n", 246 | " \n", 247 | " \n", 248 | " \n", 249 | " \n", 250 | " \n", 251 | " \n", 252 | " \n", 253 | " \n", 254 | " \n", 255 | " \n", 256 | " \n", 257 | " \n", 258 | " \n", 259 | " \n", 260 | "
SidQF000000023507QF000000023508QF000000023535QF000000023536QF000000023564QF000000023565QF000000023599QF000000023601QF000000023603QF000000023605...QF000000025052QF000000025053QF000000025054QF000000025055QF000000025057QF000000025076QF000000025085QF000000025105QF000000025356QF000000026350
DateTime
2019-09-0623:55:003.015.09.0NaN1.02.04.08.014.013.0...11.010.0NaNNaNNaNNaNNaNNaNNaNNaN
23:56:003.015.09.0NaN1.02.04.08.014.013.0...11.010.0NaNNaNNaNNaNNaNNaNNaNNaN
23:57:003.015.09.0NaN1.02.04.08.014.013.0...11.010.0NaNNaNNaNNaNNaNNaNNaNNaN
23:58:003.015.09.0NaN1.02.04.08.014.013.0...11.010.0NaNNaNNaNNaNNaNNaNNaNNaN
23:59:003.015.09.0NaN1.02.04.08.014.013.0...11.010.0NaNNaNNaNNaNNaNNaNNaNNaN
\n", 261 | "

5 rows × 24 columns

\n", 262 | "
" 263 | ], 264 | "text/plain": [ 265 | "ConId 81093789 97589583 97589608 117170265 138979250 \\\n", 266 | "Date Time \n", 267 | "2019-09-06 23:55:00 3.0 15.0 9.0 NaN 1.0 \n", 268 | " 23:56:00 3.0 15.0 9.0 NaN 1.0 \n", 269 | " 23:57:00 3.0 15.0 9.0 NaN 1.0 \n", 270 | " 23:58:00 3.0 15.0 9.0 NaN 1.0 \n", 271 | " 23:59:00 3.0 15.0 9.0 NaN 1.0 \n", 272 | "\n", 273 | "ConId 138979281 174230593 174230603 174230606 174230608 \\\n", 274 | "Date Time \n", 275 | "2019-09-06 23:55:00 2.0 4.0 8.0 14.0 13.0 \n", 276 | " 23:56:00 2.0 4.0 8.0 14.0 13.0 \n", 277 | " 23:57:00 2.0 4.0 8.0 14.0 13.0 \n", 278 | " 23:58:00 2.0 4.0 8.0 14.0 13.0 \n", 279 | " 23:59:00 2.0 4.0 8.0 14.0 13.0 \n", 280 | "\n", 281 | "ConId ... 174230633 174230636 212921485 212921491 \\\n", 282 | "Date Time ... \n", 283 | "2019-09-06 23:55:00 ... 11.0 10.0 NaN NaN \n", 284 | " 23:56:00 ... 11.0 10.0 NaN NaN \n", 285 | " 23:57:00 ... 11.0 10.0 NaN NaN \n", 286 | " 23:58:00 ... 11.0 10.0 NaN NaN \n", 287 | " 23:59:00 ... 11.0 10.0 NaN NaN \n", 288 | "\n", 289 | "ConId 212921494 212921497 212921500 212921509 212921514 \\\n", 290 | "Date Time \n", 291 | "2019-09-06 23:55:00 NaN NaN NaN NaN NaN \n", 292 | " 23:56:00 NaN NaN NaN NaN NaN \n", 293 | " 23:57:00 NaN NaN NaN NaN NaN \n", 294 | " 23:58:00 NaN NaN NaN NaN NaN \n", 295 | " 23:59:00 NaN NaN NaN NaN NaN \n", 296 | "\n", 297 | "ConId 212921519 \n", 298 | "Date Time \n", 299 | "2019-09-06 23:55:00 NaN \n", 300 | " 23:56:00 NaN \n", 301 | " 23:57:00 NaN \n", 302 | " 23:58:00 NaN \n", 303 | " 23:59:00 NaN \n", 304 | "\n", 305 | "[5 rows x 24 columns]" 306 | ] 307 | }, 308 | "execution_count": 2, 309 | "metadata": {}, 310 | "output_type": "execute_result" 311 | } 312 | ], 313 | "source": [ 314 | "from quantrocket.master import get_contract_nums_reindexed_like\n", 315 | "\n", 316 | "limit = 15\n", 317 | "\n", 318 | "contract_nums = get_contract_nums_reindexed_like(midpoints, limit=limit)\n", 319 | "contract_nums.tail()" 320 | ] 321 | }, 322 | { 323 | "cell_type": "markdown", 324 | "metadata": {}, 325 | "source": [ 326 | "Next we get a Series of midpoints for each contract num by masking the midpoints DataFrame with the contract num DataFrame and taking the mean of each row. In taking the mean, we rely on the fact that the mask leaves only one non-null observation per row, thus the mean simply gives us that observation." 327 | ] 328 | }, 329 | { 330 | "cell_type": "code", 331 | "execution_count": 3, 332 | "metadata": {}, 333 | "outputs": [], 334 | "source": [ 335 | "midpoints_by_contract_num = {}\n", 336 | "for i in range(1,limit+1):\n", 337 | " midpoints_by_contract_num[i] = midpoints.where(contract_nums == i).mean(axis=1)" 338 | ] 339 | }, 340 | { 341 | "cell_type": "markdown", 342 | "metadata": {}, 343 | "source": [ 344 | "We loop through the contract months to generate a matrix of dollar spreads between contract months: " 345 | ] 346 | }, 347 | { 348 | "cell_type": "code", 349 | "execution_count": 4, 350 | "metadata": {}, 351 | "outputs": [], 352 | "source": [ 353 | "data = {}\n", 354 | "\n", 355 | "for col_i in range(1,limit+1):\n", 356 | " data[col_i] = []\n", 357 | " for row_i in range(1, limit+1):\n", 358 | " if col_i == row_i:\n", 359 | " data[col_i].append(None)\n", 360 | " continue\n", 361 | " spreads = (midpoints_by_contract_num[col_i] - midpoints_by_contract_num[row_i]).abs()\n", 362 | " data[col_i].append(spreads.median())\n", 363 | " \n", 364 | "pct_spreads = pd.DataFrame(data, index=range(1,limit+1))\n", 365 | "pct_spreads.index.name = \"contract month\"\n", 366 | "pct_spreads.columns.name = \"contract month\"" 367 | ] 368 | }, 369 | { 370 | "cell_type": "markdown", 371 | "metadata": {}, 372 | "source": [ 373 | "The matrix can be used to generate a heat map, which reveals that the closer the contract months, the tighter the spreads:" 374 | ] 375 | }, 376 | { 377 | "cell_type": "code", 378 | "execution_count": 5, 379 | "metadata": {}, 380 | "outputs": [ 381 | { 382 | "data": { 383 | "text/plain": [ 384 | "Text(0.5,1,'Average dollar spread between CL contracts')" 385 | ] 386 | }, 387 | "execution_count": 5, 388 | "metadata": {}, 389 | "output_type": "execute_result" 390 | }, 391 | { 392 | "data": { 393 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAA0sAAAGDCAYAAAD6YIuGAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAIABJREFUeJzs3Xd4U9Xjx/F3kqYL2gKlpbRlFCiHPWWj7CGg4oKvoiAoOEBkudmCoqAoywEK8gNlIwjInoJsBVkXKFA6gZbR0pn1++OmpaHpEGyS4nk9T5+n6T25+eTmtj3nnnE1FosFSZIkSZIkSZIkyZbW2QEkSZIkSZIkSZJckWwsSZIkSZIkSZIk2SEbS5IkSZIkSZIkSXbIxpIkSZIkSZIkSZIdsrEkSZIkSZIkSZJkh2wsSZIkSZIkSZIk2SEbS5Ik/WcJIcYLIRYVsuwlIUTHf/q84kwIsUAIMSmPbS8JIX53dCZJkiRJciQ3ZweQJMl1CSF2AvWBIEVRMpwcR3pACCFeAl5RFKW1s7PkRwhRHZgMtAP0QCSwAPgKqABcBPSKohidkK0tsEhRlNAi2v94oJqiKC8Uxf4lSZKKC9mzJEmSXUKIysDDgAV4vIhe4z93wUYIoSui/WqEEPJv+r9ECFEVOABEAXUVRfEDngUeAnycma2w/ou/X5IkSf82+YdUkqS89AX2o1YY+wHLAYQQzYFfgBBFUUzWnz0JTFAUpZ61wv4OMBAoBWwDXlMU5bq1AXYReAUYB1wCHhFCLEdtmHkBx4DXFUU5ad23P+rV/DaAAmwC2mb1SgghagAzgcbANWCMoijL7L0hIUSYdV+NrO9NuWv748AnQAjwlzXH6YIOVAH5FwBpQCXre3gC2HrX818CxgIBQAIwWlGUxdafDwSOon4eccBgRVG2WZ+3E9gLtLW+p7pCiGvAF0A3wAzMB8YpimKyNgDmovYWWqzHcrCiKDet+2sIfA+EAxusZfKjEULMzCObn70cQHXgG0AvhLgNGIGGwJ9AGUVRzEKIecDjiqIEWve1CDisKMqXee03x7k4AHgbCAIOAoMURYm0brMArwMjgbLAT8AQRVHsvc8JwD5FUUZk/UBRFAV43rqvUgUcm2xCCC9gEvAM6u/E30AnRVHS8jvnhBCXgFnW41sJ2Ij6u6gDfgM8rMcQ63EdBNQB0lEvcIwQQhxH7QmriXoergRGKIqSaX2N2sCXqL8/BmvZo8AHqJ9vTyBCUZT6eZ2nhT0OkiRJxZG8CilJUl76AoutX12EEOUAFEXZD6QA7XOUfR614gkwFOiJ2jAIBm4As+/adxvUylsX6+PfUCvogagVtZwVsNnW1wtCrSj2y9oghCgBbLG+diDwHDDHWgG05yfgCGpF+aO79lUd+BkYhloZ3AD8KoRwz2NfOeWXH9TjMxm1R8Jmno/1PcwAHlUUxQdoiVppztIMuGDNPA5YJYQok2P7i6iVZB/UYWI/ojZAqqE2QjqjNk4BNKgV82DU418BGG/N4Y7aCP4/oAxq4/jpAt53ftns5rA2BF4D/lAUpaSiKKUURbkIJFnLgdrwvC2EqGl9/AiwK7/9Wt9DT9RK/lOon+Ee1M80px5AE9QGYy/unIN36wisKOD9F9Y01MZIS9Rj+w5gLuQ51wvoCoQB9YCXFEVJAR4FYq3HsKSiKLHW8k9Yc5dCPQ9NwHDUz6gF0AF4A0AI4YPacN+Iek5UA7YpirIR+BhYat13/UKcp5IkSQ8k2bMkSVIuQojWqFeylymKkiCEiECt8E+3FvkZtWGyxVrh6gaMsm57FfVqfbR1X+OBy0KIF3O8xHhrhQ8ARVF+yPHa44Eb1h6E26gV9jqKoqQCp4QQP6L2pIBa8b2kKMp86+OjQoiVqFfwT971niqiVpI7Wudf7RZC/JqjSG9gvaIoW6zlpwFvoVYKd+Z3vPLKryjKLeuP1yiKstf6fbqdXZiBOkKIy4qixKH20mS5Cnxp7f1YKoQYCXRHbdQALMjRi1UOtRJdSlGUNCBFCDEdtTH1raIo54Hz1uddE0J8gdrIAWiOOi8n67VWCCGye1XyYDebEGJzfjny2NcuoI0QIsb6eIX1cTrgCxwr6P2hnnuf5OiZ+Rj4QAhRKat3CZhi7Um7KYTYATRAbSzczR/bz+GeWHtaBwDNFUXJem/7rNsKc87NyGoIWc/XBgW85B+Kovxi/T4N9eJAlktCiG9RL1Z8ifr7E68oyufW7emoPcl5ye88lSRJeiDJxpIkSfb0AzYripJgffyT9WfTczzeJ4R4HfUq/tEcldFKwGohhDnH/kxAuRyPo7K+sc7hmYw6HyQAtUIG6pVwL9S/U1H2nmt9rWZCiJs5fubGnYZETsHAjZyNNNSemAo5tme9B6zDwaJQh0flqYD8WY2lKDtPzXqdFGuleRTwvRBiLzBSUZQz1iIxdw0Ti7RmzXL38dADcUKIrJ9ps8oIIQJRewceRu2J0qL2/GW9f3uvlZ+8suWbIw+7UIeORQO7URsLL6JW4PdYP4+C9lsJ+EoI8XmO/WpQP8Os9xKfY1sqUDKPPIlA+XzyFlZZwBOIsLOtMOfc3Xlzfvb22Bxja+/VF6hzrbxRfz+yGlAV8siVSyHOU0mSpAeSbCxJkmTDOr+iF6ATQmRV1DyAUkKI+oqiHFMU5ZQQIhL1Kn/OIXigVtYG5OhJybnvytZvc1awn0cdOtQRdQ6TH2oFXoM6B8kIhAJnreUr5HhuFLBLUZROhXhrcUBpIUSJHA2mijmyxAJ1c2TVWF8rhvzllz9LvnN/FEXZBGzKMbdlLmqDBiBECKHJ0SipCKzNY99RQAZQNo8V2j6xlq+nKEqiddjaLOu2uDxeK7/KdF7ZCsph73jsAqaiNpZ2oQ5X/Aa1sZQ1BK+g/UYBk/+leTRbUXs15xdUsAAJqO+hKup8tpzu9ZyDvM+pu3/+Nep8sOcURUkWQgxD7XkF9Xg9V9j9F3CeSpIkPZDknCVJku7WE7UnqBbqkJ8GqPNb9qDOY8ryE+r8pEewLv5g9Q0w2doLgBAiQAjxRD6v54NaAU5EvfL9cdYG66T9VcB4IYS3dTGHnBnWAdWFEC8KIfTWryY55rqQY1+RwGFgghDC3TrU8LEcRZahDiHrIITQoy4CkIF1yNS95C8MIUQ5IcTj1jkhGahDD005igQCQ63v7VnUz2KDvX1Zh0ZtBj4XQvgKIbRCiKpCiDY5st5GHYIWgroQQpY/UBumQ4UQbkKIp4CmBcS3m60QOa4AoTnn5iiKcg512NgLwG5FUZKs5Z7G2lgqxH6/Ad7PmrMmhPCz5roX44CWQoipQogg6/6qCSEWCdvFHTyEEJ45vmz+ryqKYgZ+AL4QQgQLIXRCiBZCCA/u/ZwD9dj4W4er5scHdT7Ybevvz+s5tq0DgoQQw4QQHkIIHyFEsxz7r5z1fgpxnkqSJD2QZGNJkqS79QPmK4pyWVGU+Kwv1B6IPuLOcsQ/o84d2p5juB6oq2mtBTYLIZJRV51rRt4Wog5FigFOWcvnNAS1tyYedXjdz6iVNRRFSUad4P8/1Kv08cCnqD1h9jxvzXIdtTK8MGuDdaWzF1BX1ktAbUg9lrVq2H3kL4gWtZIca83VBusEfKsDqItHJKAO93tGUZTEfPbXF3C3ZrmBOvcnazjZBNRV824B61EbogBY3+dTwEvW5/XOuT0P+WXLL8d21Dll8UKInOfOLiBRUZTLOR5rUHtGCnx/iqKsRv38lwghkoATqL2f/5iiKBGoCyJUBk4KIW6hriR3GEjOUfQ2aiMv66s9uY1CXQHvEOpn/CmgvY9zDuvwt5+BC0KIm0KIvIbnjUI975NRe4KW5thHMtDJ+rrxwDnUe0rBnQsgiUKIoxR8nkqSJD2QNBZLQSvDSpIkuQ4hxKeoN8ntV2DhYk4Uk5u3SpIkSdKDSs5ZkiTJpVmHDrmjXplvArzMnaWwJUmSJEmSioxsLEmS5Op8UIcbBaMuVf05sMapiSRJkiRJ+k+Qw/AkSZIkSZIkSZLskAs8SJIkSZIkSZIk2SEbS5IkSZIkSZIkSXa47Jyla9eSi+34wIoV6zg7wn2p4hvk7Aj3paZnOWdHuGe1ND7OjnBfamc4O8G9q66/7ewI9yWoYpKzI9wX73CdsyPcM7eqxftvprZCqLMj3LugYpwd0JQuvv+vADSlyhdcyEVpy+S12n7xoC9bRVNwKddiSLhwX3V7Z71nl20sSZIkSZIkSZL0gDAXz/tYy2F4kiRJkiRJkiRJdsieJUmSJEmSJEmSipbF7OwE90Q2liRJkiRJkiRJKlpm2ViSJEmSJEmSJEnKxSJ7lqR/Q6dObZg2bRw6nY4FC5YwbdrXNttbtWrK1KnjqFu3Bn37vsnq1Ruyt02a9B5du7YHYMqUGaxYsc6h2e/Wul1z3ps0Ap1Oy8rFa5k3c6HN9p69uzNy7Jtcjb8GwE8/LGfl4rXOiApAgzaN6D/uFbQ6HduWbOaXr1fabC8bXJYhXwyjhG9JtFotiz79kT93HOHhnm14fNCT2eUq1azMO92Hc+nURUe/hWw9PxtI9fYNSUlMYnaX93Jtr/dES1q/9hgAmanp/Dp6PldOX3Z0TLuafDGQ4E4NyUhIYmO73NkBAlrUpOHEF9HqdWRcT2bHU5McnDJvFae+iW+HhzAm3uJMp6G5tuv8SlBx6lA8KgVhzsjk8qiZpJ91jWOvDQyg1Oj30ZUpg8ViIXXtOlKX2/4eeHbqSMk+/wPAkpbGrc+/xHg+whlxc9GUCcD7lXfR+JUGi4XMXevJ3LLablldmKDE6Bmkfj0J4+E9Dk6am8a3DB6Pv4ampB9YLBiO7sB4aJNNGX3z7ujqtFTLa7VoyoaQ+sXrkJ7ijMg24pNSGb32CIkp6Wg0Gp5uUJk+TavZlElKy2Tc+qNE30jB3U3HhO6NqBbo66TEtjIMRgZ8tRKD0YTRbKFjg6q80a25TZkj52OYumoP52ITmNKvK50aVstjb46VkWmg/+R5GAwmjGYznZrU5o2nO9iUWbbtIEu3HkCn1eDl6c7YAT2pGhLopMS2MjIN9H/vUzINBkwmMx1bNWZwn552y27ee5hRU77m5y/GUDu8smOD2pGRkUm/wW+r2Y0mOrVrzZBXXsxVbuO23cz5YREaNIjwKnw2/l0npJXulWwsuRCtVsuXX35E9+59iImJ5/ff17Ju3VbOnDmXXSYqKpZBg0YybNggm+d27dqeBg3q0KzZo3h4uLN58zI2bdpJcrJzlkPWarV8OOVtBvZ6kyuxV1m6aQE7Nu0h4qxtA2Ljmq1M/mCaUzLmpNVqeeWjV5nYZyzX4xOZsvZzDm89SPS5qOwyT7/Zm33r9rJ50W+Ehlfgg/ljeaP1QPb8sos9v+wCoKKoxLvzPnRqQwngzxV7OPDjFp764jW7229EXeOH3h+RnpRKeNv6PPHJy3zXc5yDU9p3adkezs/fQrMZ9rPrfb1pPKU/u5//lNSYRDz8XaOylSVx+Tau/bieStOH2d1ebvCzpJ26wMVBn+BRNYQKk17l/HNjHZwyDyYTSbO+xnj2HBovL8r+8C2Zhw5jvBR5p0hcHIlvDsOSfBuP5k3xe2ckiYPecGLoHEwm0pZ+gznyPHh6UXLc1xhPHsEce1djVKPF89lXMJ447Jyc9pjNZG79CXP8JXD3xOvljzBd/BtLQmx2EcP+9Rj2rwdAF94QfbOuLtFQAtBptYzsWJeaQaVIyTDw3PwdNA8LpGrAnd/PefsURDk/pj/TnIsJyXyy6Rjf9WntxNR3uLvpmPvmk3h7uGMwmej/5Upa16xMvbA7y8IHlfZhYp+OLNx+1IlJc3PXuzHv/QF4e3pgMJp46aO5tK5fnXrVKmSX6dayHr06NAVg59HTTFv8G1+/089ZkW24692YN3kU3l6eGIxG+r07hdaN61K/RlWbcimpafz061bqiipOSpqbu7ueH2ZMwdvbC4PRSN/XR/Fw84eoX6dmdpnIqBjm/d9S/u/rz/Hz9SHxxk0nJnayYjoMT66G50KaNGlARMQlLl2KwmAwsHz5r/To0cmmzOXL0Zw4cQbzXSdczZrh7NlzAJPJRGpqGn//fZrOnds4Mr6Nuo1qEXUxmujIWAwGIxt+2UK7ro84LU9BqjUIJ/5SHFejrmA0GNn76x6adGpmU8ZiseBd0gsAbx9vbly9nms/rR9/hN/X7nZI5vxEHjxD2q28G8pRR8+RnpSa/b1vUBlHRSvQtf1nyLiRd/ZKT7YkesMhUmMSAchIdK37C6UcPIXpZt75PcMrkLz3OAAZETG4hwbiVtbPUfHyZU68jvGsenHGkpaG8dJltGXL2pQxnDiJxXoRJvPkKXQBZXPtx1kst66rDSWA9DTMcZfRlsqdz71jTwyH92BJcp1Ki+X2TbWhBJCZjjkhFo1P3r+XbrVbYDz5h2PCFUJASU9qBpUCoISHnir+Ply9nW5T5kJCMs0qBwAQVtaH2FupJN5Vxlk0Gg3eHu4AGE1mjCYzmrvu6BLi70v1kLJo7t7gZBqNBm9PDwCMJhNGU+7lmUt6eWZ/n5aRmeu9OZNGo8Hbms9oNGE0muwe41mLf6H/U4/iodc7OmKeNBoN3t5qvcBoNGI0GnNlX7F2I/976jH8fNX7KPqXLuXwnC7DYr6/LydxeGNJCNHf0a9ZXAQHBxEdHZf9OCYmjpCQwt3s8PjxU3Tp0hYvL0/8/UvTpk0LQkOdd8O1ckGBxMVeyX58JfYq5YICcpXr1KMdq3YsYvq8TwgKdt6QgDJB/iTEJWQ/ToxLoEyQv02ZZV/+zMNPtuXb/T/wwYJxfD/2u1z7aflYa35f4/zG0j/RuHdbzu085uwYheZTNQh3vxK0W/khnTZNovKzrnFlurDSTl+kVNcWAHjXD8c9JBB9eddpcGTRBZVDX70ahlOn8yzj3aMbGfsPOjBV4Wn8y6GrWA3jhTO2Py/lj75RKzJ3OHeYcn40fmXRBlXCHJPH8EY3d3RV62E8fcixwQop5mYKZ67com5waZufVy/nxzZF7Sn7O/Y6cbdSuZKc5oyIdpnMZnp9+jPtP/ie5qICdSsXn5sNm8xmen04i3aDp9C8TjWbXqUsS7bsp/vIz5m+ZBPvvtjdCSnzZjKZeXboeNq+OJwWDWtR767eo9MRkcRfu06bpvWdlDBvJpOJp/sN5pEez9GiSUPq1a5hsz0yKobIqBheeG0kzw8cxu/7XahH29HMpvv7chJn9CxNcMJrFgv2rvRYLIW72fG2bXvYuHEHO3as4scfZ3LgwFGMRuO/nPAfsPdesH0vOzbvodNDPXmq3Qv8sfsgH8903jAwjZ3Adx/71o8/ws4V23m1+QA+fmkCb3453OYKUniD6mSkZRDlIvNPCiOsRS0a9W7L5ilLnB2l0DQ6HWXqhbH7hWnsem4KtYY9SckqxadSc2XOSnR+JRG/TSegf3dST14Ao2vdqE/j5UnpyRNJ+mo2ltRUu2XcGzbAu3s3kr7OfdHA6Tw8KTFkHGk/z4F02/xez79B+vJ5rruErd4Dj2feInPzIsi035DQVW+IKeqsywzByyk108ioVQd5u2NdSnrY9gAMaFGdpHQDveZtZ8nhC4ggP3Ra1xngotNqWfbuc2ya2J8TkVc4H5vo7EiFptNqWTZ5CJu/epsTF6I5F3UlV5n/dWrO+s9HMqx3F+au2en4kPnQ6bQsnzGeLfOnceLsRc5FRmdvM5vNTJ23lFEv93ZiwrzpdDpW/jibbav/j79PneXchUs2240mE5HRMcyf9SmfTXiPcVO+JMlJUyScrpj2LBXJnCUhxPE8NmmAckXxmg+CmJh4QkPLZz8OCSlPbGzuP3h5+eyzWXz22SwAFiyYwfnzl/7tiIV2Je4q5YPvfNTlggO5Gp9gU+bWjTvDp1YsWsOIMUMclu9uifEJlM1xdd+/fFluXLEdZtehdycm9R0PwNmjCu4e7viU8SUp8RYArR57mL1rnT9RvLDK1ajAE1Ne4f9e+oy0fIaNuZrUuOtkXE/GlJaBKS2Da/vPUKpWRW5fiHd2tEIx307j8qgZ2Y9r7f2ODDsVG6fR6Sg9aSJpm7eSvtv++exWtQp+743i+qj3sCS51jBIdDq8h4wn849tGI/8nntz5ep4v/4hAJqSfrjVa0qayYTxz32OTpqbVofHM29hPLEPk5L31We3Wq41BC+LwWRm5MoDdKsdSocaIbm2l/TQM7FHY0C9GNVtzmZCSnk7OmaBfL09eCg8hL2nI6kW7F/wE1yIbwkvmtQIY9/xc4RXsF/d6tq8LpMXOG8xpfz4lvTmobqCvUdOEF4pFICUtHTOR8bw8gefAZBw4xZDJ81gxuihLrHIQxZfn5I0aVSP3/cfJrxK5eyflwsoS/3aNdC7uREaHETliqFERsdQt6ZwXljpHymqSzrlgL7AY3a+is+lGgc7fPgY1aqFUalSBfR6Pc8++xjr128p1HO1Wi1lyqjjYOvUqUGdOjXYutV5w8FO/HmailUqEFKxPHq9G916dmLHJts8ZQPv/BNq1+VhLpy75OCUd5w/do7yYcEEViiHm96NVo89zKEtB2zKJMReo26regCEVAtF76HPbihpNBpadG/lEvOVCsMv2J//fTOMlcO/JvFi8WhkZInZdISAZgKNTovOyx3/RlVJPhdb8BNdhM63BBq9ep3K/7lOpBw8hfm26wxF8nv/HYyRkaQsXW53u7ZcIKUnT+TmR59gioq2W8aZvPqPwhwbSebmlXa3J7/zIslvv0Dy2y9gOLybtP+b4RoNJcC9xytYEmIxHvgt70IeXugq1cB01rUWGbBYLExYf5Swsj682Czcbpmk9EwMJvXq8Kq/LtG4gn+u3idnuZ6cRlJqBgDpmUYOKFGElStdwLNcw/WkFJJS1L8h6ZkG9p+MoHKw7dDeyBwXK3f/dZaKQa7TCLx+K5mk22oPcHpGJvv/Ok1YjgvHPiW82f3TV2z8/jM2fv8Z9URVl2koXb9xM7uXKD0jg/2H/iSsku0QyA6PtODgUXWo+42bt7gUFUOF4PK59vWfYDbf35eTFNVqeOuAkoqi/HX3BiHEziJ6zWLPZDIxfPhYfv11ITqdjh9/XMbp0+cYM2YER48eZ/36rTRuXI+lS7+jVCk/unXryOjRw2ncuBN6vZ6tW1cAkJyczIABwzDZmeTpyPcy+f1pfLdkBlqdltU//0qEcpEh7wzi5LHT7Ni0hxcG9qZd54cxmUzcupnEh0MnOi2v2WRm3thvGb1wPFqdlu3LthJ9LoreI54n4vh5Dm89yI+TfuC1KUPo8fITWCwWZo/8Kvv5tZrVJjEukasu0kPwzIzBhDWviXdpH0b+MZMd01egtVbQDy/eRtuhT+Jd2ocek9QphGajiW8fH+PMyNmazxlMYMuaeJTx4bEjMzkx7U72iIXbSD4XS9yO43TZPgXMZi78tJNbiutU2ivPHEnJFnVwK+1L7QPfE/fFz9mNo8RFG/GoFqqulGcyk34uisvvzHRy4jv09erg3bUzhvMRlJ0/F4Dkb+ehK6fOJ0xd8ys+L/VF6+eL30h1tT+LyUTiK/ZXLnQ0XXgd3Ft1whR1gZITvgEgfeUPaMuo+TN3uu48JW2F6ujrPYz5ymU8X5kMgGHHMjR+aqXWeHQ7AG7iIUwX/gZDhtOy2vNXdCLrTkQRHuBLr3lq1jfb1iI+Sa3EP9sojIsJyYz+9Qg6jYYqZX0Y372RMyPbSEhKYcyiLZgtFswWC50bhPNInTDmrN9PrYqBtK1bhRORVxgxbz1JaRnsPnGJr387wKoP+jg7Ogk3kxn93UrMZjNms4XOzerQpmENZq/cSu2wENo2qsmSLQfYfzICvU6LTwkvPhr0tLNjZ0u4fpPRX36PyWzBbDbTpXUT2jStz+xFv1ArvDLtmjVwdsQ8XUu8wYeTpmEym7GYLXRp/zBtWzVj1tyF1K5RnXYPN6dVs8bsO3iUx/sMQqfVMXLwy5Tyc61VXB2luN5nSVPYOTGOdu1asmsGK4SKFes4O8J9qeJbfOZ/2FPTs/iO9Kyl8XF2hPtS27Xqb/9IdX3xGYpoT1BFFxsO9w95h+ucHeGeuVUt3n8ztRVCnR3h3gUV4+yApnTx/X8FoClVfHtItGWctwjWv0FftooLrWlYOBnn9t1X3d4jvKVT3rO8z5IkSZIkSZIkSUWrmPYsuc4yNJIkSZIkSZIkSS5E9ixJkiRJkiRJklS0nHivpPshG0uSJEmSJEmSJBWtYjoMTzaWJEmSJEmSJEkqWk5c/vt+yDlLkiRJkiRJkiRJdrhsz1JxX367OEtIv+XsCPclQV98l99OcPN0doT7cs3N3dkR7lmZjOJ97D2vGJwd4b64eaU4O8I903oV73uta/SucWPYe6HRFLvVk21YjEZnR7g/puKb31xM589kK1vF2Qn+OTkMT8rp8uUTzo5wz+pUa+LsCJIkSZIkSdKDpJgOw5ONJUmSJEmSJEmSipTFUjx782RjSZIkSZIkSZKkolVMh+HJBR4kSZIkSZIkSZLskD1LkiRJkiRJkiQVLTlnSZIkSZIkSZIkyY5iOgzvgWwsderUhmnTxqHT6ViwYAnTpn1ts71Vq6ZMnTqOunVr0Lfvm6xevSF726RJ79G1a3sApkyZwYoV6xyavbhr16E1kz79EJ1Oy+KFK5g5fa7N9r4DejPglT6YTCZSUlIZ9dZYzioRPNKuJaPHj8RdryfTYGDimM/4ffcBh2Zv2rYJQya8gU6nZf3Pv/HT7CW5yrTt0YaXRvTFYrEQcfoCk4Z8DMCgD16hRftmACz8ajE7ft3pyOi5vPDZ69Rt34jkxFtM6jIq1/ZyVYN5ceobVKgdxq/TlrB17q9OSGlf+2kDqdyhAWmJSfzc8f08ywXWr8Iza8az6Y2ZRGw45MCE+av15WsEdGpEZkISf7TJfewrvfEY5Z9uDYDGTUeJ8BB21noF403XXDrbLagswVNH4hZQGswWbizdyI0f1zg7ll3agAB83vkQbZkyYDaTvuFX0lavtCnj0b4j3r2fB8CSlkbyjC8wXYhwRlwbmtJl8ew3Co2vepwNe3/DsMP2OOvC6+L12jjMCfEAGP/aR+ZvPzkjbi4anzIBPoa9AAAgAElEQVS4d38FTUk/sFgw/rUL45EtNmXcmnbFrVYL9YFWi8Y/mLSZQyHd+ed+fFIqo9ceJvF2BhoNPN0wjD5Nq9mUSUrLZNy6I0TfTMFdp2NCj0ZUC/RzUuI7MgxGBsxag8Fowmg207F+Fd7o2tSmzJGIWKb+spdzcYlMebETnepXdVLa3DIyDfT/ZL6a32SmU5NavPFkO5syCzfuY/Xuo+i0Wkr7lGDCy08QXLaUkxLfkZFpoP8HU8k0GDGZTHRs2ZjBzz9ut+zmvUcY9dm3/DztA2qHV3ZsUFdRTJdrf+AaS1qtli+//Iju3fsQExPP77+vZd26rZw5cy67TFRULIMGjWTYsEE2z+3atT0NGtShWbNH8fBwZ/PmZWzatJPk5NuOfhvFklarZcrnY+nVcwCxMVfYtGM5mzZs56xypyKyavk6Fv6wFIAuj7Zjwsfv8dzTA7meeIMXe7/Olfir1KgZzpJV82hQs41Ds7816U1GPf8u1+Ku8c362ezdvI/Ic5ezy4SEhdBnyHMMefItbt+6TSl/9Q918/bNqF4nnFe6vIre3Z2vVnzOgR0HSb2d6rD8d9u/Yie7ftxIvy8G292ecvM2y8fPp35n11sm/szy3fy9YAsdv3w1zzIarYaW7/fm8q7jDkxWOLFLdhH1/SbqzLJ/7CPn/ErkHLVxWrZzIyq92t1lG0oAmExc/WQe6aci0JbwovLqGaTsPUrm+ShnJ8vNZCLl29kYz59D4+VFqTlzyTxyGNPlyDtF4uO4OXIoltu3cW/SDJ9ho7g59HUnhs4KZiJj5VzMURHg4UWJ92ZgOv0n5vjLtsXOnyDt6/HOyZgPi9lE5o6lWK5Egrsnnv3GYbp0EktibHYZ48GNGA9uBEBXtT5uTbq4REMJQKfRMLJDXWqWL01KhoHnfthB87BAqgb4ZpeZt09BlCvF9GdbcDEhmU82/cV3fR52YmqVu5uOuW88jreHHoPJRP+Zv9C6RkXqVQ7KLhNUuiQTn2vPwp1/OTGpfe56N+a92w9vTw8MRhMvffwDretWo161CtllalQqz0/jBuHl4c6y7YeYvmwLU9941ompVe56N+Z9NAJvL08MRiP93vuM1o3rUF/Y3gMpJTWdn9Ztp271MCcldRHFtGepyBZ4EELUEEJ0EEKUvOvnXYvqNQGaNGlARMQlLl2KwmAwsHz5r/To0cmmzOXL0Zw4cQbzXWMna9YMZ8+eA5hMJlJT0/j779N07uy4Cntx16hxPS5euEzkpWgMBgO/rNpA1+4dbMrcTr7zj9Hb2xuLxQLAieOnuRJ/FYAzp8/h4emBu7vjbpRYo4Eg5lIscZfjMBqMbF+zk1adW9mU6fF8N375cQ23b6mN55uJNwGoVL0Sx/Yfx2Qyk56WzvnTF2ja1rmNkPMHT5NyK+9G/u3EJCKPR2Ayut5VntgDCuk3879AUa9/ZyJ+O0RaYpKDUhXezf2nMRSQP0vQk62IX723iBPdH+O1G6SfUi94mFPSyIy4jL5cWSenss98/TrG8+qFMUtaGqbLkWjLBtiUMZ46ieW2+vkYTp9EGxCQaz/OYEm6oTaUADLSMMVHoSnl79xQ/0TKLbWhBJCZjjkxDo1P3lf+dbWaYzy930HhChbg40XN8qUBKOGhp4q/D1eT02zKXLiWRLMw9XwJK+tD7M1UEm+nOzzr3TQaDd4e6v9Lo8mM0WTOdbPekDK+VA/2d8mb+Go0Grw9PQAwmkwYTSa4K2fTmmF4eag3Pa9bNZSr113jb79Go8HbS72heVZ2e0d41k9r6P9UFzwcWK+R/j1F0lgSQgwF1gBvAieEEE/k2PxxUbxmluDgIKKj47Ifx8TEERISlM8z7jh+/BRdurTFy8sTf//StGnTgtDQ4KKK+sAJCi5HbMydYx8bE09Q+XK5yvV/5XkO/LWZMRNH8eE7k3Nt7/FEF04cP0VmpqFI8+YUUL4s1+KuZj++Fn+NgPK2FZUKYaGEVgll5uovmbN2ZnaDKOJUBE3bNcHD0wO/0r40bNGAwGDXqIA9iEoElaZK14c48X/bnB3lvmi93CnbrgFX1jl2uOn90IcE4lmrKmnHzjg7SoG05YJwqxaO8cypPMt4du1O5iHXO/6aMoHoKlTFdEnJtU0XVhPvD2bjNXgi2vIVnZCuYBpff7TlKmKOvWC/gJs7urA6mJQjjg1WSDE3Uzhz5SZ1Q8rY/Lx6OT+2nVF7yv6OuU7crVSu3NWgchaT2UyvactoP3YBzauHUrdS7v+9rsxkNtNrzNe0GzqV5rWrUq9qaJ5lV+8+Sqt61fLc7mgmk5lnh02kbd9RtGhQi3p39SqdvnCZ+ITrtGlSz0kJXYjZfH9fTlJUw/AGAo0VRbkthKgMrBBCVFYU5Suw2+j+19i7aJLVe1GQbdv20LhxfXbsWEVCwnUOHDiK0Wj8lxM+uOxesLJz7OfP+4n5837iqWd6MPzt1xn6+nvZ20SNaoyZMJJeT75chEntyR3+7ug6Nx2hYSEMe3YkAeUDmLlqOv07vMLh3UeoUV8we81X3Ey8xcmjpzCZXK/H5kHx8LgX2PfxEizmwv1eu6qAzo25eUhx7SF4OWi8PQmZ9SFXJn+H+bZrVBDz5OmF79iJ3P56JpZU+8Nh9fUb4vlod24OG+LgcAXw8MRr0GgyVnwL6bbZTVER3B7TDzLS0dVugterY0kZ/4qTguZB74HHk0MwbPsZMu33uuiqNcAcc95lhuDllJppZNTKA7zdqR4lPWx7AQa0FHy2+Ri95m4jPNAXEeSHTusaPTU6rZZlo3qRlJbBiB82cj4ukWrli0/PpE6rZdlHr5OUksbwmUs5F32F8NDcDb51+45x6mIsP7zf3wkp7dPptCz/cixJt1MZ/skczkXGEF4pBACz2czU75fx0dCXnBvSVchheDZ0iqLcBlAU5RLQFnhUCPEFRdxYiomJJzS0fPbjkJDyxMZeKfTzP/tsFs2bd6NHjxfQaDScP3+pCFI+mOJirhAccufYB4cEER9/Nc/yq1eu59Ecw/TKB5dj/uJZDHn1XSIvOnY+xLW4awSUD8x+HBAUQEJ8Yq4yezftw2Q0ER8Vz+WIKELC1Ktfi2b+xCtdXmPU8++i0WiIvhjj0Pz/JYH1wugyewh9902naremtJn8EmFdGjs71j8W1LOlyw/By+amI3TWhySt3Uny5n3OTpM/nQ6/cRPJ2L6VzN/32C8SVgWfEW+TNPYDLMmuMZwHAK0Or4GjMRzcgfEvO8c5PRUy1AaI6eQh0LmhKeGbu5yzaHV4PDkE46k/MJ3Nu9dIV7MpxlOu16NnMJkZuXI/3epUoEONkFzbS3romfjYQywb2IFJjz/EjdRMQkqVcELSvPl6efBQtWD2nnHBOYWF4FvCiyY1KrPv7/O5tu0/GcG8X/fw1bDncNe73pR735LePFRXsPfoyeyfpaSlcz4yhpdHf07Xge9zXLnA0MmzOXnukvOCOlMx7VkqqsZSvBCiQdYDa8OpB1AWqFtErwnA4cPHqFYtjEqVKqDX63n22cdYv35LwU9EneRfpow6xrpOnRrUqVODrVt3F2XcB8qfR/+mStVKVKwUgl6vp+dT3di0YbtNmbAqlbK/79SlLRcuqGPcff18WLzsWyZP+IJDB/50aG4A5ZhCaFgIQRWCcNO70f6JtuzbYltZ+X3TPhq0VE9rv9K+VKgSSlxkHFqtFt9SaoWlSs0wqtYI4/Cuww5/D/8VC1uNYGHL4SxsOZyIDQfZ9eECLm5yzeE8eXHz8aJ0i1pc3Vg8zpPyHw8jMyKK6/NXOztKgXxGvovxciRpK5fZ3a4NCMRv3EckfToZU0y0g9Plz/PFYZjjozBst3+cNb6ls7/XVqoOGg2WFNdp7Lk/2h9zYizGQ5vzKeSFroLAdP6o44IVgsViYcL6o4T5+/Bis3C7ZZLSMzGY1Arbqr8u0bhi2Vy9T85w/XYaSWkZAKRnGjlwNpqwQOevFFdY15NSSEpRe6vTMw3sP3WByuVt50WejozjowXr+Oqt5/D3LWlvN05x/VYySdbFnNIzMtl/7DRhoXemfviU8Gb3oulsnPsJG+d+Qj1RhRkfDv7vroZXTBVV07wvYDN+TVEUI9BXCPFtEb0mACaTieHDx/LrrwvR6XT8+OMyTp8+x5gxIzh69Djr12+lceN6LF36HaVK+dGtW0dGjx5O48ad0Ov1bN26AoDk5GQGDBgmh1P9AyaTifdHfcSSVd+j02n5edFKlDPneeeDNzn25wk2/baDlwf14eG2LTAajNy6mcTQ19QheC8P7ENYlYqMePt1RrytrkzV+8mXSUi47qDsZr4aM5Opi6eg1Wr5belGLp2NpP+ofijHzrJvyx8c3HmIhx5pzILt32M2m/lm0nck3UzC3UPPjFXTAUi9ncrkoVMwmZzb1dx/xltUb16LkqV9mPzH16yfvgyd9UrcnsVb8A3w4921U/As6YXFYqHdgG581GkE6S4wvKrzrMGENK+JZ5mSvHRwBgc+X4lWrwPg5KLtBTzb+ep+M5TSLWuhL+PDw3/OIWLqcrRuav7ohVsBCOjWlMRdxzGnZjgzaqF4Na5FqSc7kH7mImFrZwJw9fMfSXHBCwJutevi2akLxgsRuH8zD4CUH+aiDVSH86SvW4v3i/3Q+PrhM3Q4ABaTiZuD81550VF0VWujb9YRU8xFvN+fBUDG2h/RllHnPxr2bMCtYWv0D3dXl981ZJL2wxRnRrahDQnHrU4rzFej0L00AYDM3SvR+qrzfox/7QRAV70RpksnwZDppKT2/RWdyLq/LxMe6Euvuep8yDfb1Sb+lloRfrZxFS4mJDN67WF0Wg1VyvoyvnsjZ0bOlpCUypift2M2mzFbLHSuX41Haldmzm8HqVUhgLZ1wjhx+Soj5m8kKS2D3Scv8fXGQ6x693/Ojg5Awq1kRs/95U7+prVp00Awe9V2aocF07ZhDaYv3UxqRiZvz1YvggT5+zFj2PNOTg4JN24x+sv5mKzZu7R6iDZN6jF78RpqVatEu2YNCt7Jf0kxvSmtprDzeRzNy6uSawYrpMuXTzg7wj2rU831lpP+J2r65D0x1NXVcitTcCEXVsvk7uwI90w4cEGRohDqm+zsCPelbGXXm79SWJ7h3s6OcF90lQq3CJIr0pQvvtkB8C9eCzHcTVOm+ObXlC7eC3h51GjjGhPm/oG03Qvuq27v9chLTnnPrjfoU5IkSZIkSZKkB0sx7VmSjSVJkiRJkiRJkoqWXA1PkiRJkiRJkiTpwSF7liRJkiRJkiRJKlpyGJ4kSZIkSZIkSZIdxXQYnmwsSZIkSZIkSZJUtGTP0r+rim/xXQ40If1WsV9+uzg7nxrv7Aj3zL2Ey/5KFopW5+fsCPfM5AI3l7wfmUnF99gDGM/rnB3hngVkFO9l271SLjs7wj1zS7rt7Aj3RVP6mrMj3B//WGcnuGeWwCvOjnB/arRxdoJ/TvYsSQ+SE+cPOTvCPWsoWjg7giRJkiRJkvQAkI0lSZIkSZIkSZKKlhyGJ0mSJEmSJEmSZIdsLEmSJEmSJEmSJNlRTOcsyZvSSpIkSZIkSZIk2SF7liRJkiRJkiRJKlpyGJ5rat2uOe9NGoFOp2Xl4rXMm7nQZnvP3t0ZOfZNrsary3f+9MNyVi5e64yoALTr0JpJn36ITqdl8cIVzJw+12Z73wG9GfBKH0wmEykpqYx6ayxnlQgeadeS0eNH4q7Xk2kwMHHMZ/y++4CT3kXx1LZDKyZ8/B46nY6f/28ls7/63mb7Cy/14qVX/ofJZCYlJZV3h4/nnHIBNzc3pn41gbr1a6Jzc2PFkrXM/nKew/M/1LYxr49/Ha1Oy8afN7J0zjKb7a+NG0T9FvUB8PDyoJR/KZ6q80z2du+S3szb8R17N+5j9pg5Ds2eU5/PXqNO+0YkJybxcZdRubaXqxrMC1NfJ7R2GOumLWHb3HVOSJm3jlMHEtahAamJSSzu9H6e5crVq0KvNeP5bfBMzm9wjdUn6335KoGdGpKZkMTuNu/k2l7ljR4EP90KAK2bjpLhIWypNQjDzRRHR7Ur5NOh+LZvgjHxFue6Dsm1XetbgtDP3sK9UhCWDAPR73xFxlnXWDZbGxiA3wcfoPMvg8VsJu3XdaSuWGlTxrNTR0o8/xwAlrQ0kj6fjjEiwhlxc9GUCcB70Hto/EqDxULmjvVkblllt6wuTFBi7ExSZ0/CeHi3g5Pap/Hzx+OZIWhKlgKLBcOhrRj/2JCrnDasFu7d+6PR6rCkJpM+b5wT0trS+JTG/dGX0ZTwA4sZ4/HdGI9usynj1qQLbjWbqQ+0OjRlypM2ZzikO/93Nz4pjdHrjpKYko5Go+Hp+pXo06SqTZmk9EzGrf+T6JupuLtpmdCtIdUCfJ2U+I4Mg5EBs9ZgMJowms10rF+FN7o2tSlzJCKWqb/s5VxcIlNe7ESn+lXz2Nt/QBEPwxNCeAK7AQ/UNs4KRVHG3VXGA1gINAYSgd6KolzKb78PdGNJq9Xy4ZS3GdjrTa7EXmXppgXs2LSHiLMXbcptXLOVyR9Mc1LKO7RaLVM+H0uvngOIjbnCph3L2bRhO2eVO/8MVy1fx8IflgLQ5dF2TPj4PZ57eiDXE2/wYu/XuRJ/lRo1w1myah4NahbDNfidRKvVMumz0Tz/1EDiYuNZv20pmzfu4JxyIbvMLyvXs2iB2gDp1LUt4ya9wwvPvkaPJzrj7uFOx9ZP4enlyY4/1rBm5Qaioxx3/wmtVsuQSYN57/kPSIhLYOa6GfyxZT+Xz92pCH4z4bvs75946XGq1rH9g91vVF+O7//bYZnzsn/FLnb9uIm+Xwy2uz3l5m2Wj19A/c4POThZ4ZxavptjP26h8/RX8yyj0Wpo9X5vLu867sBkBYtesotL32+iwaw37G6/MGcdF+aojdPAzo0Ie7WbyzSUAG6s3EbiwvVU+Hy43e2Bg3uRfuoCl1/7GI8qoQRPfI2LL4x2cMo8mEwkz5mD8ew5NF5e+M/7joxDhzFFRt4pEhfH9TffwnL7Nu7NmuL79kiuv2b/s3I4k4m0n7/BHHkOPL0oOeEbjCePYI6NtC2n0eLZayDGvw87J2dezCYyf1uIOfYiuHviNfhTTOePY7kWfaeMpzcejw8kfcFkLLcSoITzK+sAFrOZzJ3LsFy9DHoPPF8cgynyFJbEuOwyxkObMB7aBICuSn3cHuroEg0lAJ1Ww8j2takZVIqUDAPPLdhF87AAqpa9c3zn7TuHKOfH9KebcTExmU82H+e751o5MbXK3U3H3Dcex9tDj8Fkov/MX2hdoyL1Kt+5V2hQ6ZJMfK49C3f+5cSkLqLoe5YygPaKotwWQuiB34UQvymKsj9HmZeBG4qiVBNC/A/4FOid306LbM6SEKKpEKKJ9ftaQogRQohuRfV69tRtVIuoi9FER8ZiMBjZ8MsW2nV9xJER/pFGjetx8cJlIi9FYzAY+GXVBrp272BT5nbynT9u3t7eWCwWAE4cP82V+KsAnDl9Dg9PD9zdi/dNNh2pQeO6XLp4mcuR0RgMRtas+o3Oj7a3KWN77L2yj73FYsHb2wudToenpweGTAO3kx17o0TRQBB7KY74y/EYDUZ2rd1Fy85532+q7RNt2blmZ/bj8LrVKB1QiiO7jzogbf4iDp4m9Vbex+92YhKXj0dgMpocmKrwYg8qpN/M//Ov378z5387RGpikoNSFc71/WcwFJA9S/CTLYldva+IE/0zqQdPYrqZ9w1iPapV4PY+tYGacSEafWggbmVLOSpevsyJ1zGePQeovUbGyEh0AWVtyhhOnMRyW/18DCdPoQsIcHjOvFhuXVcbSgDpaZhjI9GWLpurnHunnhgO78GSdNPBCfNnSb6pNpQAMtMxX4tB41vGpoxb/dYYTx5QG0oAKS7y+5tyS20oARgyMF+PQ1OydJ7FdTWbYjx90EHhChZQ0pOaQervYQkPPVX8fbianG5T5kJiMs0qqed7mL8PsbdSSUxJz7UvR9NoNHhbb2huNJkxmsxoNBqbMiFlfKke7J/r5/9JFvP9fRVAURSLoihZ/8T01i/LXcWeAH60fr8C6CCEyPfDKZLGkhBiHDAD+FoI8QkwCygJvCeE+LAoXtOeckGBxMXeuUPzldirlAvK/c+lU492rNqxiOnzPiEoONBR8XIJCi5HbMydK0GxMfEElS+Xq1z/V57nwF+bGTNxFB++MznX9h5PdOHE8VNkZhqKNO+DpHz5QOJi4rMfx8deoXz53OdCv5f/x+9HfuPDCSMZ+94nAKxfu4XU1DSOnt7BweNb+Hb2Am7edOw/0bJB/lyLvXMn+GtxCfgH+dstGxgSSFCFIP7aewxQ/9gPGjOIuZMcP3Twv6hEudJU7fIQfy/aVnBhF6X1ciegXX3i1xWvob7ppy/i10W9iOBVPxz3kEDc8vg9cSZdUBD68HAMp07nWcarR3cyDrhOhTcnTdly6CpVwxhhm19Tuiz6xq3J3P6rk5IVjqZUANryYZijz9n8XOsfjMarBJ4vj8fzjU9xa+B6F181vv5oAytijrtgv4CbO7rKdTCdc/6FMXtibqZy5uot6gbbNvaqB/qy7axaP/o79gZxt9K4kuz8xhKAyWym17RltB+7gObVQ6lbKXe9TXIcIYROCPEXcBXYoijK3f+oQoAoAEVRjMAtIN9/BEXVs/QM0Ap4BBgM9FQUZSLQhQK6uv5VdtqJlrsamDs276HTQz15qt0L/LH7IB/PdN74Y7sXHSx3N4hh/ryfaNagM5PGfc7wt1+32SZqVGPMhJGMGub8cdTFip2Db7Fz7H/8fgmtGz/Kx+O/YOhIdZhVg8Z1MZtMNK7VnhYNuzLojX5UrBRa5JFtFDI/QNvH27Bnwx7M1u7wx/r24OD2g1yLSyjSiJKqzfgX2PvJEixm+59PcVCucyNuHFJcagheYVz7ZgVav5JUW/8V/v0eI+3kBTC5Vg+lxsuLUh9NIGnmLCypqXbLuDdsgHf3biR/862D0xWChycl3hxP2uI5kG6b3+v5N0hfNte1lw9298Tj+VFkrp8PGWm223Q6tMFVSF/4CekLJqFv9wwa//LOyWmP3gOPx9/AsGMpZNpvSOiq1scce95lhuDllJppZNTqg7zdoQ4lPWxHxgxoHk5Seia9ftjBkiMXEOX80LlIT41Oq2XZqF5sGteXE5evcj4u0dmRXJfZfH9fhaAoiklRlAZAKNBUCFHnriJ2a9v57bOo5iwZFUUxAalCiAhFUZIAFEVJE0I47K/klbirlA++08IvFxzI1XjbCuGtG3d6AFYsWsOIMbknBTtKXMwVgkPu/OENDgki3jq0zp7VK9fz6Rd3GkXlg8sxf/Eshrz6LpEXo4o064MmLvYK5UNyjDEOLkd8/LU8y69Z9Rsffz4GBkPPp7uxc9tejEYjiQnXOXTwL+o1rM3lyOg8n/9vS4hLICD4Tq9pQPmyXL9y3W7Zto+3Ydbo2dmPazWuSZ2mdXis72N4lfDETe9GWkoaP0yZX+S5/4sC64bx6Cz174xnGR8qt6uP2WjmwuYjTk5WeME9XW8IXmGYb6cR885X2Y/FnnlkRl3J5xkOptNR6qMJpG3ZSsbuPXaLuFWpgu87b3Pj7XexJLnIMLAsOh3eb44nc982jEd+z705rDrer6tzxDQ+frjVb0qa2YTx6F5HJ7VPq8Pj+ZEYj+3BdCp3r53lViKmlCQwZIAhA9Ol02jLV8KUY26Q02h1eDz+OsbT+/PtNdLVaILxtOv1CBtMZkauPki32qF0EMG5tpf00DOxeyNAvRDY7esthJTydnTMfPl6efBQtWD2nomiWnnX67F2CQ5cDU9RlJtCiJ1AV+BEjk3RQAUgWgjhBvgB9itMVkXVs5QphMg6ixtn/VAI4Qc47Eid+PM0FatUIKRiefR6N7r17MSOTbYr75QNvHNCt+vyMBfOXXJUvFz+PPo3VapWomKlEPR6PT2f6samDdttyoRVqZT9facubblwQZ086+vnw+Jl3zJ5whccOvCnQ3M/CI4dPUFYlYpUqBiCXu/GE089ypaNO2zKhFWpmP19h86PcDFCHSMeGx1Hy0fU1W+8vL1o9FC9XIuIFDXlmEJI5WCCKpTDTe9Gm8fb8MeW/bnKhVYJpaSfD6eO3BkeM2XoZ7zQvC99W/bju0nz2Lpym2woFaEFrUcwv9Vw5rcazvkNB9kxekGxaii5+XhRpkVNrmwsPpmzaH1KoNGr1whL/68zKQdPYr6dVsCzHMfv3XcwRl4mddlyu9u1gYGUmvQRtyZ/jCnacRdjCsvr5VGYYy+TuWmF3e3Jo14geVQfkkf1wXBoN2k/znCdhhLg/tTrWK7GYNxrf4VN4+lD6CrXBK0W9O7oKlTDfDXGwSntc+/SD/P1OIxHtuRTyAtdqMAU4VoLDVgsFiZs+JMwfx9ebFrNbpmkdAMGk1p9XHUsksYV/HP1PjnD9dtpJKVlAJCeaeTA2WjCAl1jHqRLslju76sAQogAIUQp6/deQEfgzF3F1gL9rN8/A2xXFMUpPUuPKIqSAaAoSs7GkZ47AYucyWRi8vvT+G7JDLQ6Lat//pUI5SJD3hnEyWOn2bFpDy8M7E27zg9jMpm4dTOJD4dOdFQ8u3nfH/URS1Z9j06n5edFK1HOnOedD97k2J8n2PTbDl4e1IeH27bAaDBy62YSQ197D4CXB/YhrEpFRrz9OiOsQ/N6P/kyCQn5NpYlK5PJxJh3Pmbxim/R6nQsXbyas2ciGPX+YI79eZItG3fy0sDnad2mefaxHz74AwAWfP8zX8yaxLZ9v6DRaFj20y+cPnXWofnNJjOzxszh40WT0eq0bFq6mcizkfQd+SJnj59jv7Xh1O6Jtuxcu9Oh2f6pl2YMJbx5LUqW9uGjP+awYfpydHodAL8v3opPgB/vrP0Ez5LqIhttB3RjcqeRpMUzrvMAACAASURBVLtIpbfrzMGEtqiJZ+mSDDgwgwNfrERrzf/3ou0FPNu5GnzzJv4ta+Jexof2f87i3NQVaNzUfxOXF24FIKhbExJ2HceUmuHMqHZV+GoUJZrXxa20LzX2zefKlz+hcVOP/fWfNuJZLZTQz0dgMZvJOHeZ6HdnODnxHfq6dfHq2gVDRAT+36vzB5PnzkUXqI6OSFu7lpIv9UPr54vvcOtqfyYTiYPyXnXRkXThdXBv1RlT1AVKTlSHB6av+B6tvzr3M3OHay3xfzdtpRroG7bBHB+J55CpABg2/4SmlLpIhfHgFizXYjCd/QuvNz8HixnD4W1Yrjp/FIc2pBputVtivhaNru9YADL3rEZrXaDCeGwXALrwhpgiT4Ih02lZ7fkr+jrrTkYTHuBLrx/Ui5RvtqlFfJI6jPPZhmFcTExm9Lqj6DQaqpT1+X/27jusqauB4/g3g6moIHuIqBj33lrB3WqttrW12mG1rqq17rbauqqtrXWPttbWUfeeOHBvcVtXQBRBGQIKyM56/wiiCCiCZPiez/PwmOScJL9cb27uuefcc5nYsY4xI2eLS0rlh9UH0Gq1aHU62teuRMvq5Vm4K4hqXk741/DhSvh9RizZTVJaBkeuhvH77jNs+uYjY0c3juLvWXIDlikUChn6DqF1SqVyh0KhmAycVSqV24C/gX8VCsVN9D1KL/zPkOR3XoOxVXdpbJrBCiAuPdHYEYrsyk3TuO5LYdRV5D8LnKmrVsLA5zq9YpVlpY0dodB8tcY/SlkUlTJM69ybl1XO1rAzSL5KTl75z8BnDmx8ZMaOUGhyT4cXVzJhEnvz3WYCSMqa8fJ3zj3cz5zYdBpmGidtvYS01ROKtG9v02OSUT7za32dJUEQBEEQBEEQTIABz1l6lURjSRAEQRAEQRCE4mXKM2E+h2gsCYIgCIIgCIJQvMy0Z6m4ZsMTBEEQBEEQBEEwa6JnSRAEQRAEQRCE4mWik8q9iMk2lqpau7y4komKs7AzdoQiuZkabdYzypmzq8nGn4a2KNJtVcaOUGipFvbGjlAkydZWxo5QJEkZpYwdodC8QyyNHaFIXB6Y70yEnEuilFu6sVMUmrxM/hc/NwdyJxtjRyg0qUe0sSMUTSdjBygEMx2GZ7KNJUEoigvKk8aOUCh1KjcxdgRBEASzYc4NJUH4vyMaS4IgCIIgCIIgCHkw09nwxAQPgiAIgiAIgiAIeRA9S4IgCIIgCIIgFCudVkzwIAiCIAiCIAiCkJs4Z0kQBEEQBEEQBCEPZnrO0mvZWKrjV4/eE/oilcnYv2YvW37fmKPc0d2RITOHUaJUSaRSKSt+WcaFg+d4o6sf7/R/N7ued9XyjOk0nLBrtw2WvZF/Q4ZMGoRMJmXn6l2sWrAmVx3/t/34fMRn6HQ6Qq/fYsqQnwDoP7YvTVs3BmD5nJUc3H7IYLmzs7VpzqSfvkUmk7H6340smPN3jvJPPv+Qz/t+hEajJSUllW+GTyREeQu5XM70OZOoWbsqMrmcDWu2sWD2YoPnN2f+bVow+edvkT5e9s8sv097f0ivvj3QZi37McMmEqIMBaBq9cr8MnMCJe1KotVp6dS6OxkZmQbN38i/IUMnD0YqlbJzdQAr81j3W3X2o/eIXuh0Om5eC+XHrHV/4Lj+NG3TGKlUwpkj55g7foFBs9fwq0PP8b2RyKQcXbufgN+35Cgv6+FI718HY+dQipTEZP4aNoeH0Q8A6PbtJ9RqVQ+A7fM2cGbHCYNmf9bb0/tRqXVdUuKT+Kv9t7nKK7erT8uR3UCrQ6vRsHfSv9w9G2yEpLk1ntkP97Z1SY9LYlfr3Nmdm1bljSUjSInQT9ccEXCGq7M2GzpmvirOHIRDuwao4hK52Gp4rnKZnS2+87/GysMRiVxG5O9bub/2oBGSFozM1QmXn0Yjc7QHrY6kDQEkrtjy4icagdTJCbsx45A6OIBWS3rAdtI259x3sGrdFtvuPQHQpaXxaO5MNLdCjRE3B0lZJ0oMGYu0jAPotGTs20FGQM7sFg2aY/1RH/11bjQaUpfOR3PjPyMlzkli74h1r1FISunXE9XxXagObs1RR+ZbE5uBE9DG6af7Vl88QeauVcaIm4PEzgGrd/ojKVkGdFpUFw6hPrM3Rx2LJh2R1dBfjkUikSFxdCd11mBITzFGZOMSw/BMg1Qqpe+PA5j88XgeRMczbdsMzu4L4m7Ik+vXvP9Vd07sOM7eFbvw9PVi7JLxDGrRj6NbDnN0y2EAyim8+WbxOIM2lKRSKV9P+YpRPb8hNiqWP3Yu4PjeE9wJCc+u4+HjwcdDejDk3a9JTkymTNkyADRp3ZjKNXzp22EAFpaWzNkwg9MHg0hNTjVo/im/fk/P9/oRFRnNzv1r2bv7ICHKW9l1tmzcyYql6wBo96Y/E6aM4ZMPBvJ2l/ZYWlnStsV7WNtYc/DkVrZuDOBuRKTB8pszqVTK1Onj6PFuP6IiYwg4sJa9uw5mN4YANm/Yyb9Lspb9W62ylv0AZDIZc/+cxtcDv+PaFSX29qVRqdQGzz986lBG9BhDbFQsiwIWcmzvSe6E3Mmu45m17g/qOjTHul+jQTVqNqxO77b9AJi/ZQ51mtbm4slLBskukUr5ZHJfZnwymQfRDxi/bRoXA88SefNudp0Px/bixKZDnNh4mCpNa/D+mI9ZPGIetVrVw7u6DxM7jkJuacG3ayfz36ELpCenGSR7Xi6tP8rZZYF0njkwz/Lbx68QHHgOAOcqXry7YCh/thltyIj5urX2KMFLAmkyJ+/sALGnlRzp9ZsBUxVc7LpDRC/Zhe/coXmWu/Z+k7TgCG70+hl52VLUPTqX2E1H0Rn4+1pgag1x0xeRef0mElsbPNfNJ/XEeVS3wl/8XEPTaEj5cwHqmyFIbGwos/AvMs+dRRP+ZBukiY4iYeRQdMnJWDZsjN2wUSQM/dKIoR8H05C2fCGa2yFgbUOpXxahunwW7d0n2VVXzqMadRwAWbkKlBgxkaRhnxkrcU4aDRkb/0IbEQpWNpT4di6a6xfQRudcTzQ3r5D2+0TjZMyPTkPm/tVoo++ApTU2fSajuX0FXdyTfRfVqQBUpwIAkPnWwaLRm/+fDSUz9trNhlepji/RYVHcj4hBrVJzfPtRGrZrnKOOTqfDtqT+Qmq2drY8vP8g1+u0eKclx7YdMUjmx6rUUXAvLJKo8CjUKjUHth6iefvmOeq83bMjW5ZtJTlRfxHBhPgEALwre3Pp1GU0Gi3paencvH6LRv4NDZq/Tv2ahN0OJ/zOXVQqNVs37aL9W61z1El+9GQDYWtrgy7ras46nQ5bWxtkMhnW1laoMlUkPzLjCyUaWN36NQm7FZG17FVs3RRAh46tctTJtezRL3u/1s24fjWYa1eUADx8mIjWwOOKq9atwr2we9nr/v6tB2nRoVmOOm/37MTmpdtyrfs6HVhaWSK3lGNhaYFcLuNh7EODZa9QpxL370QTG3EfjUrN6e3HqdM+53fP3deT68f1R3FvnLxC3XYNsx9Xnr6GVqMlMy2DiOth1PSrY7DseYkIukFaQv7fPVVqRvZtC1srwHSOFMaevkHmQ/PdbiSduob6efl1OmRZv10yW2vUCcno1BoDpXt5mrgHZF6/CYAuNQ3VrQjkLo5GTpU37YMHqG+GAPpeI034HaSOTjnqqK9dRZes//9RXb+K1Mkp1+sYgy7hgb6hBJCehubeHaQOzyzn9KcOwFhb6zecJkKX9FDfUALISEMTHYGkTFnjhiogXXKivqEEkJmONj4SiV3+FziXV2uK+uopA6UzQVpt0f6MxGCNJYVCsdwQ7+PgWpa4qLjs+/FRcTi45vzSrZu9mjfe9efPU/8wdukE/h6/KNfrNOvcgmNbDdtYcnJzJDbqfvb92OhYnNxyZvfy8cSzgifzNs9m4bZ52Q2i0GuhNGrVECtrK0rbl6Ju0zo4uxt2Q+7m5kzUvSdXxI6OjMHNzTlXvV5ffMSxc7sYN2kk47/9GYCd2wJJTU3j/PWDBF0O5M8FS0lISDJYdnPn6uZC5L2o7PtRkTG4urnkqterbw+On9/F95NGMP4b/RC2ChXLg07Hyg2L2H1oPV8O7WOo2NkcXR25H/nkSvaxUbE4ueb8sfeq4IlXBU8WbJnD79ufrPtXz13jwomLbD6/ns0X1hF0+Cx3bhruyHUZFwceRD7Z5jyMisfexSFHnYjrYdR/S3/B4XodGmNjZ0uJMiWJuH6Hmv51sbS2pKS9HVWa1sDBzTR3Jp+m6NCAAfun033JaHaMzr39NGWO9SvxZuBP+K0YQ6nKHsaO81Ki/tmFja8nDS4ups7BmYT98I9J7fQ+j9zdBcuqFUm/fMPYUV5I6uKKvJIv6hvX8q1j/WYnMs+cNmCqgpE6uSL38UUdcj1XmUWjFpSavZyS300j5fdfjJDuxSQOzsi8KqIJU+Yqk/lUxXbsAmwGT0bqVs4I6Z5PUtoRqYs32nv5DM2UWyKrWBP1jTOGDWZKzLSxVCzD8BQKxbZnHpIArRQKRRkApVL5TnG8r/6NJLke0z3zY9LinZYc2nCA7X9toXI9BV/NHs6Idl9l1/OtU5mMtAwigg09VCCv7Dnvy+QyPH08GPbBSJzcnJi3aRa92/Tl7JFzVKmtYMHWOSTEJ3L1/DU0GgMfcZS8eNkDLPt7Dcv+XkPX9zsydOQAhg8eR536NdFqNNSv1prSZUqxaecyjh46Rfidu7meL+SWx6LPe9kvXs2yxavp2q0TX48ayLBBY5HJZTRsUo+OrbuTlpbOui1/89/Fqxw7YrgdgYLkf7zuD+02Amc3J+Ztns3nrb+gtENpvH3L0a1BdwBmrJlO7cY1uXTaMOPxJQVY79dNXc7Hk/vSvFsrgoOu8SAqHq1Gy9Wjl/CpVZGxm6byKD6Jm+eDDf+9LQTlnrMo95zFq1EV/EZ+wKqPfzZ2pAJ58F8Y2xp9jTo1A7fWtWn5zwh2tBhp7FgFZu9fh5Srt7nabQLW5V2ptnY8SW1GojHisM2CkNhY4zrrB+J/+QNdiuGGhheKtQ2lxk8m+fd56FLzzmpRuy7Wb3UiYdgQA4d7AWsbSoyaROqS+ZCWO7sq6BiqoGPIq9bCpvsXJP9oYuu+lTU2/b8nY8OfkJ4zvyYilOQfekFGOrLqDbEZMJ6UiX2NFDQPFlZYvf8VmYErITM9zyoy37po7ob8fw/BM5ODO88qrp4lTyAJmAnMyPp79NTtYhMfHYfjU0dmy7o58jAm5zC7Nt3bcWLHMQCCzyuxtLLEzqFUdnnzzm9wfNvR4oyZp9ioWJye6olxcnUiLjo+V53je06gUWuIjogmPDQCDx9PAFbMW0XfDgMZ1fMbJBIJd2/fM2j+qMgY3Dxcs++7ursQHR2bb/2tm3bRoZN+mF7X9ztyaP9x1Go18XEPOBN0kVp1qxd75tdFVGQM7h5u2ffd3F2Iib6fb/2tGwOyl31UZAynjp/l4YME0tPSORB4lBq1qxV75qfFRsXl6Al1cnMiLib3un9sr37dj4qIJiI0Ak8fT954swVXz18nLTWdtNR0Th8Iolo9w+V/GB2Pg/uTbY69W1kS7uccBphw/yELBk5nUqfRbJq+GoC0R/qdgR0LNjGx42hmfPojEgnE3I7CXEQE3cDe2xkb+5LGjlIg6uQ01FnDCKMOXEJiIcPSwTyyAzh/1Jr4AP1BjPSwaDLC72NTycR7x+QyXGf/wKOdB0jZd9zYaZ5PJqP0hMlkHNhH5rG89wFkPhWwGzGapPFj0T0yodEPMhklR04i8+g+VEHP339RX7+M1NUdiV1pA4UrAKkMm37fowo6iPpiHpPcpKdChr4Rorl6BmRyJCVK5a5nDFIZVu8PRX3lJBrl2Xyryas3/v8egmfGiqux1AA4B4wDEpVK5SEgTalUHlYqlYeL6T0BuHkpBDcfd5y9XJBbyGne+Q3OBOY8Qh4XGUvN5rUA8KjkiYWVBUnxiYD+KHHTTs0Nfr4SgPKSEk8fD1y9XJFbyGndxZ8TgTk3Gsf2nKBOM/05DaXtS+FVwZOoO1FIpVJKldFvOCpU9aFiFR/OHs7/S1scLp2/gk+FcniV88DCQk6X994icHfOmZp8KjzpOm/TviW3Q/W9d5F3o2jWshEANrY21GtQi9Bgw02uYe4unr+CT8XHy96CLu91ZO+u/Jd92w5+3A7Vj7M+vP84VatXxtrGGplMRpPmDXJMDGEINy7ewNPHA7esdb9Nl1Yc35tz3T+6+zj1nln3I8OjuB95nzpNaiGTSZHJZdRpWsugw/BuX7qJS3k3HD2dkVnIady5ORcDcw6zKGlvl90D1WnQuxxbdwDQTw5Roox+Z92zijeeVby5etQwE1MUlr33k+GdrjXKI7OQk2Ym5wlZOz3ZOXSoUwGJVELmA/PIDpBxL44yLWoCYOFYGuuK7qSHxxg51fM5Tx5B5q0IEpdvMnaUF7Ib+Q3q8DukbVyXZ7nUyZnSE34k6ZepaO6Z1qgH2y/HoLkXTsaO9XmWS12fNKplPr5I5HJ0jxINFe+FrD8dhjY6AtWBvGenlJR6ch6Q1LsySCToUkyjsWrZ6Qt08ZGog3bnX8nKBlm5KmiCzxkumCkSw/CeUCqVWmCWQqFYn/VvTHG917O0Gi2Lx//J98snIpVJObBuH3dDIug+oiehl29ydl8Qy6b8w8BpQ3j7iy7odDoWjJyT/fxqjasTHxXP/QjD/wBpNFrm/DCP6SunIZVK2bV2N2HBd+g9qhfKS8GcCDxJ0KEzNGhZn6UH/kar1fLHlEUkJSRhaWXB3E2zAEhNTmXq0GloNIZdsTQaDT+M+YmVG/5EKpOxduVmgm+EMuq7wVy6cJXA3Yf4vF9PWvg1Qa1Sk5iQxPDBYwFY+vdqZs6fwv4TW5BIJKxbtYXr10xjOmJzoNFo+H7MVFZtXIRUJn1q2Q/h0sWrBO46yOf9evKGX1PUav2yHzZIv+wTE5NYtHAZAfvXokPHgcCj7N9r2IMFGo2W2d/P47dVvyCVSglYu4uw4Dv0GfU5yktKjmet+w39GrD84D9oNRoW/riIpIdJHNpxhHrN67J0/2J0Ojh96AwnAk8aLLtWo2XF+MWMWP49UpmUY+sOEBlyl67DuxP2XygX951F0aQ63cZ8jE6nIzjoGivG66d1l1nI+G79jwCkJafx1/C5aA38vX1W17mD8W5aFRt7O746NY8jszYgk+s33+dX7qfKWw2p+f4baFUaVBmZbBo8z6h5n9Zs4WCcm1bFysGOLmfn8d+MDUizst/8dz9ebzfC97O2aNUaNOkqTnw538iJc/JdOJzSzaojd7Cj/rlFRPy2FomFDICY5XuJmLUe3zlDqH1gJhKJhDtTV6B+8MjIqfNnXbc6du+0JSP4Fp4bFgLwYM4SUo+a3jkb8uo1sW7XAfWtUCz/0H8/U/75C6mz/uBA+o5t2H7aC0mp0tgN1U/rrtNoSBg8wGiZH5NVqYmVXwfUd0Kxm67PnrbqL6SO+uyZgduwaNwSK7/26DQayMwgedZkY0bOQVaxOhaN26K5dxvb7/TfyYxty5A66EcbqI4GIK/bAos3OoFWA6pM0v6ZZszI2aSelbGo1QJtTDjWffXbctXB9UhK6883V5/XH7SUK+qjuXUFVIa9JIfJMdOpwyV5ndfwqikUik5Ac6VSObagz+nm/Y55LlEgTmPiY7Jf4GZq9IsrmbgLSsPtLL9KdSo3MXaEIqlo6/riSiaqkkX+MxiZg4o6K2NHKJIKKmMnKDxvXd7nKJgLl7Lm07v2rFJu5r3s5WXyOGHTjMidbIwdodCkHqYxm2FhlRi33OxWntTpfYq0b287+h+jfGaD9PYolcqdwE5DvJcgCIIgCIIgCCbGTHuWXrvrLAmCIAiCIAiCILwKBulZEgRBEARBEATh/5fOiJM0FIVoLAmCIAiCIAiCULzMdBieaCwJgiAIgiAIglC8dObZsyTOWRIEQRAEQRAEQciDyfYsVZPYGTtCocXJrY0doUgsS5jsalEgV5MjzH4KbnMVnBJp7AiFpiphnke8HkuXlzF2hCJJtTTfKYiT1eabHSAp1sLYEQrNJSnN2BGKxNbWvK+7U9I+w9gRCs02xnAXLy8OJYwdoDDEMDxBEF6Fi8GnjB2h0Gr6NjJ2BEEQBEEQTJGY4EEQBEEQBEEQBCEPomdJEARBEARBEAQhD2KCB0EQBEEQBEEQhNeH6FkSBEEQBEEQBKF4iWF4giAIgiAIgiAIuenEBA+mp+uv/ajcui4p8Uks6PBtrvJaXZrRYmBnADJT09n+/RJirpvOVJKf/PolNVvX41F8IlM6jMpV7lLRnU+nD8Krug/bf1vDvr+2GyFlTg386/PlxC+RyqTsXr2btQvX5SgfOKE/tZvWBsDKxooyZcvwXo1u2eW2JW1ZfHARx3efYMEPCw2a3b9NCyb//C1SmYzV/25kwezFOco/7f0hvfr2QKvRkpKSyphhEwlRhgJQtXplfpk5gZJ2JdHqtHRq3Z2MDPOeEtbQWrVpwY/TxiKTSVm5fAPzn1n+n/XuTu++PdFoNaQkpzJ62ASClaHUrVeT6XMmASCRSPht2gJ27dhn0OxN/BsybPIQZFIZ21bv5N8Fq3PVadPZny9G9EKng5vXQpkwZAquHi78vHgyUpkUuVzOhiWb2Pyv4b/Htfzq8tmEL5DKpBxcs4/tv2/KUe7o4UT/6UMo5VCK5IRkFg6bzYPoeLyrlafP1IHYlLRBq9GyZf4GTu04bvD8j733a38UWdv8uR2+yVVeu0tzWmZt8zNS09n2/T9Em9A2v+Vv/SjXtg5pcUlsbPtdvvUca1egy7aJHBg0j9s7zxgwYf5qzB6AU7t6ZMYlcdxvdK7y8oPexv39FgBI5DJK+npwoFo/VAkpho6ap3LTv6JUmwao4xO50W5ornJZ6RKUmz4UK29XtBmZhI+aR3qw6aw7z5K7OuL2yyhkjvag1ZGwbhcJ/241dqw8yZydsB//LdKyDqDVkbJ1Bynrcm6D5N5e2I8bg4XCl6Q//yF51bp8Xs2wJGWdKDF0LNIyDqDTkhG4g4ydG3PUsWjYHOseffS9KhoNqUvmo7nxn5ESG5mZ9ixJdDrTDD6+/MdFDubdqAqZKem8N3Ngno0lr3q+xN68R3pSKr7+tWk17D0WdZ1Q1LclDlWRXwOgUqOqZKSk02vm4DwbSyXLlqKshxO12zckNTHllTWWbmqSCvU8qVTKP0cW823PscRFxTFvx1x+HjKN8JC8f1C6fP4OFWtUZOaoWdmPfTlxIKXLluZRwqNCN5auJkcUKvvRszvp8W4/oiJjCDiwlkF9R2c3hgBK2pUg+ZH+h73dW63o1ecjPvlgADKZjN2H1/P1wO+4dkWJvX1pEhMfoS3kEZT/x6nDpVIpJ87t4sOuXxAVGcPug+v48otRBOez/Nu/1YrPv+hBz279sbGxJjNThUajwdnFiQPHNlO7ih8ajealMviUcC109rVHl/N1j9Hcj4rln4A/GD/oR8JC7mTX8fTxYOofExjy4QgeJSZjX7YMD+MTkFvIkUgkqDJV2Nhas/LAEvp3GUJcTPxL5/Ap5HWWJFIpMw8t4OePJxIfHc+Ubb8yf+hM7oXcza7z9cLRnN9/lqMbD1KtWU38PmjN78Pn4OrjDjod0WFRlHG2Z+rO3xjd5itSk1JfPr+k6NcqKp+1ze8288s8G0vl6vly/2Yk6UkpVPavTeth7/NH1/FFf1/1qzn917WxAlVKBv6zB+TbWJJIJXRc/S3qDBXBaw+/ksaSl0pd5Newb1IFTUo6NecPzrOx9DSn9vUoP6AjZ96fUuT3dbF6NddZKtGoGtrUdLxnDcuzseQ+9nO0qWlEz16LVUUPvKYM4GaPoq87xXWdJZmTPXInBzKuhSIpYUP5jXO5N/hHMkNfbQPvVVxnSVrWAVnZsqiCQ5DY2uC85A/ivxmPOuzJNlRqXwaZqws2LZujfZT8ShpLtu5F7+WQlHFAal8Wze0QsLah1PRFJP/yPdq7T7JjbQPp+vVU5l2BEiMnkjT0syK/t/3GQ5Iiv4iBJY9+t0j79iWnbzbKZzbIBA8KhaKFQqEYoVAo2hvi/R67E3SDtMTkfMsjzoeQnvWjHnE+hFKuDoaKViA3g66T8pz8yfFJ3Lkcikb9cjuFxUVRR0FkWBTR4dGoVWoObztMs/ZN863v38WfQ1sPZd/3rVkJe6cynDty3gBpc6pbvyZhtyIIv3MXlUrF1k0BdOjYKkedxzvqALa2NujQf+f9Wjfj+tVgrl1RAvDwYWKhG0r/r+rWr8XtW+HZy3/LxgA6dGydo86zy5+sAz1paenZDSNra0sMfQCoWt0q3A2LJDI8CrVKzb6tB2jZoXmOOl16vs2GpVt4lPV9fhifAIBapUaVqT+4YmFliURq+N+BSnV8iQmL4n5EDBqVmpPbj1G/Xc5Gr4evJ1ePXwbg2on/ssujb0cSHRYFQML9hyTFJVLKobRhP8BTwoJukPqcbWb4+RDSk1Kybt+ktIlt86NPK8lIyD8/QPXe7bkdcIb0uMId1CouD0/dKHAvkdu7zYnafKKYE72clKBraJ6z7K19vXiU9R3ICL2Hpaczckfjresvool9SMY1/cEmXUoaGaERyF3KGjlV3rTxD1AFhwCgS01DFRaOzMkxZ52HCaiuK9GZyP7OY7qEB/qGEkB6Gpq7d5A65Mz+uKEEgJV19m+XYD6KpbGkUCiCnrrdD5gP2AETFApF7i4eE1C/uz8hhy4ZO4ZZc3QtS2xkbPb92Kg4yrrmvXF29nDG1cuVi8f1y1wikdD/h/78NWVxnvWLm6ubC5H3orLvR0XG4Ormkqter749OH5+F99PGsH4b34CoELF8qDTsXLDInYfWs+XQ/sYKvZrw83Nmch70dn3oyJjcMtj+ffu25NTF/bww6RRjMta/qBv9cy4PwAAIABJREFUbB0+uZ2Dx7cyZsSkl+5VKgonV0fuR97Pvn8/KhYn15w/ll4VPClXwYs/t8zjr+0LaOLfMLvM2d2JfwMXs/XMWlYsWFOoXqWisHd1ID4qLvv+g6h4HJ753t65Hkajt/QHPhq+2QRbO1tKlrHLUadibV/klhbE3InGHDTo7k+wmW3zbV3tKf9WA67/u9/YUQpNamOJY6vaxOw4bewoLyXt+m3KvKn/DtjW9sXSwxkLN8cXPMs0yD2csa5akfRLSmNHeSGZqwsWlSuRefW6saO8NKmTK3IfX9QhubNbNGpBqbnLKTl2GikLfjFCOhOh0xbtz0iKq2fJ4qnb/YF2SqVyEtAe+LiY3rPQfJpWo153f/ZOW2PsKOZNkvuoeH5H+f3f8eNowNHsHpjOn71N0IEgYp/aaTOkPKLnmX3Z4tU0r/cWUyfO4utRAwGQyWU0bFKPIf3H0PWtT3mrUxtatGxc3JFfK5K81h1yL/8li1fRpG4HpkycwfDRA7Mfv3DuMn5NO/Nm6w8ZOrwfVlaWxZr3aXlmf2bdkctlePl4MKjbMMYP+pHvfhtNyVIlALgfGcun7fryQfNP6PhBe+wd7Q2S+zEJL86/cspSqjSpzk8BM6jauDrxUXE5GqRlnO35ctbX/DlqnsF79grDp2k16nf3Z/e03OeWmbKmEz8h6Kc16Mx03D+Ac/v6JJxRmsy5SgUVs3AjstIlUeyahVPvTqRevQUm1suRF4mtNR5zv+f+z3+iTXn54bGGJLGxxuHnSSTOXogu1bSz5mJtQ4nRk0hdMh/ScmdXBR0jaehnpPz6PTY9vjBCQBOh1RXtz0iKa4IHqUKhsEffGJMolcpYAKVSmaJQKIo+OPoVcqniRZdpffn3819Je8HwB+H54qLicHJ3yr7v5ObIg5gHedb1f8eP+d8vyL5frX5VajSqQefPOmNTwhq5hZy0lDT+mbak2HODvifD3cMt+76buwsx0ffzrb91YwA/z/gh+7mnjp/l4QP90KoDgUepUbsax46Y15FTY4qMjMHd48k5Q27uLkRH5b/8t2wM4JcZuc8vDAm+RWpqGlWq+nLp4tViyfqs+1GxOLs7Z993dnPK1Tt0PyqWK+evoVFriIqIJjw0Ai8fT64/daQ3LiaeW8Fh1Glck4M7jxgkO8CD6HjKPnWE3MGtLA+f+d4m3H/I7AH6o6FWttY0fKsJaY/0OwQ2JW0YvWQc639bxc0LwQbLXVguVbx4d1o/ln3+i9lt851q+dB6wRAArB3s8GpdG61ay50954ycrODcujY1uSF4BaFNTiN81Nzs+9WOLyIjIsaIiQpALsNj7vckbT9IcqCJL3OZDIefJpG2Zx/ph48aO83LkckoOXoSmUf3oTr9/Ozqa5eRurgjsSuN7lGigQKaDnM90FNcPUulgXPAWcBBoVC4AigUipKQx2FMIyntXpaP/hjGxuG/E3/bPIaOmDLlJSUe5d1x9XJBbiHH7x0/TgbmnqzAs4InJUvbce3ck67qaUN/5ZMmn/FZs14smrKYfRv3G6yhBHDx/BV8KpbDq5wHFhYWdHmvI3t3HcxRx6dCuezbbTv4cTtUfwLn4f3HqVq9MtY21shkMpo0b5BjYgjhxS6e/48KFb0p561f/l3fz2v5e2ffbtvBj9u39Mu/nLcHMpkMAE8vdypW8iEi/J7Bsl+/eAMvHw/cvFyRW8hp26U1R/fm3DE5svsY9ZvVBaC0fSm8KnhyLzwKJzdHrKz1vWB2pUtSq2ENwkNffoKSogi9FIKrjxtOXs7ILOQ07dyCc4E5Jw2ws7fL7kHrMvh9Dq87AIDMQs7wRd9ydOMhTgeY+M4Y+m3+x38MZ8PwhWa5zV/TbARrmg5nTdPh3N4ZxPFxS82qoSS3s8G+aTXu7z5r7CgvTVaqBBIL/fHlsj3akRJ0DW3yq5lcori4ThlGRmgED5duNnaUF7IfNxr1nXCS12wwdpSXZjtoDJq74WRsX59nudTVI/u2zMcXiVz+f9lQMmfF0rOkVCrL51OkBd4tjvfMS7e5g/FpUhVbeztGnpzHwVkbkGZt7M6u3I//0Hextbfj7Sm99eHUGv585wdDxXuh3nO/pnKTapS0t2Pqyd/ZOWsdsqz8R1cGUsqpNN9sm4Z1SRt0Oh2t+nTkx3YjSDfSBlyr0TL/h4X8tGIqUpmUPWv3cif4Dp+N/JTgyyGcymo4teriz6Fth4ySMT8ajYbvx0xl1cZFSGVS1q7cTPCNUEZ9N4RLF68SuOsgn/fryRt+TVGr1SQmJDFs0FgAEhOTWLRwGQH716JDx4HAo+zfa7iegdeBRqNh7OgprN64GJlMyuoVm1DeuMmYsV9x8cIV9u46SJ/+PWnp1wyVWkViQhJDv9TPFtaoSX2+GtYPlVqFVqvj21GTeZDVy2eY7FpmfD+X2at+RSqVsmPtLm4Hh9FvVG+uX1JyLPAEpw6doZFfQ1YdXKL/nvz4B0kPk2j4Rn2Gjv8SHfqjSKv+WEfojdsGyw767+3S8X/x7fIJSGVSDq3bz72QCLqN6MGtyzc5v+8MVZvW4KMxn6DTwY2gqyz5YREATd5uTpVG1ShZxo6W3fQTcvw5ai53roUZ9DM89uHcIVTI2uaPOTmP/bM2IrPQN6SDVu6n9dD3sLW3453sbb6Whe98b5SseWk1fzDuTati7VCSHmfmcn7GRqRyff7rKw4YOd3z1f7jK+ybVcPSwQ7/CwsImb4hO3vEcv1U/i4dGxF/+DKa1KLPoPaqlZ83kpJNayC3L0X1038TNXN1duMofsVurCp54j1rGGi0pIdEED5mnpETP59NveqU7tqWDOVtbDfPByBu1jJSjpjGVPNPs6xVA9u32qO6GYrTMv22JemPv5G56nvsUzdvR+pgj/OSP5CUsAWtjpLd3yemR2+jD9eTVamJlX8H1HdCsftNf8512qq/kDrqz7nN3LsNiyYtsfJvr5+cIjOD5JmTjRnZuMy0Z+m1njrcWF7V1OHGUtipw01FYaYONyX/j1OHm4LCTh1uKgo7dbipeBVThxvLq5o63FhexdThxvKqpg43luKaOtxQXsXU4cbyKqYONyZznDr80ZCORdq3t5sfYJTP/FpflFYQBEEQBEEQBBNgpj1LorEkCIIgCIIgCELxMtPGknmPHRAEQRAEQRAEQSgmomdJEARBEARBEIRiZarzJLyIaCwJgiAIgiAIglC8zHQYnmgsCYIgCIIgCIJQvIq5saRQKLyA5YAr+ssVLVIqlXPyqdsQOAV0VyqVz73Al8k2lqqb72yUxMotjR2hSKSy0saOUCTptuY7dXtwSqRZT79tzm4lRxk7QpGoS2iMHaFIMi3Md+rzVLmtsSMUSZLUZHcFXihRVdLYEYqk9EPz/t7aJ5nv1Of2Cca9RlNR2Rs7QCHoir9nSQ2MVCqV5xUKhR1wTqFQBCqVymtPV1IoFDLgF2BPQV7UfLeQgiCYpP9CgowdoVBqVGpo7AiCIAiCIBSSUqmMAqKybj9SKBTXAQ/g2jNVvwI2AgX64ReNJUEQBEEQBEEQipcBz1lSKBTlgbrA6Wce9wDeBVpTwMaSmDpcEARBEARBEITipS3iXwEpFIqS6HuOhimVyqRnimcD3yiVygKPgRU9S4IgCIIgCIIgFCsDnLOEQqGwQN9QWqlUKjflUaUBsEahUAA4Ah0VCoVaqVRuye81RWNJEARBEARBEASzplAoJMDfwHWlUjkzrzpKpdLnqfpLgR3PayiBaCwJgiAIgiAIglDcir9nqTnwKfCfQqG4mPXYWKAcgFKp/KMwL/paN5YazuyHe7u6ZMQlsbvVt3nWcWpalbqTP0VqISPjwSMOvjfFwCnz1/q3fpRvU4e0+CRWt/0u33rOtSvQbetE9gyaR2jAGQMmzN/Hvw6kRut6PIpP4qcOo3KVu1R055PpX+JZ3Ycdv61h/187jJAyp0b+DRk6eTBSqZSdqwNYuWBNrjqtOvvRe0QvdDodN6+F8uOQnwAYOK4/Tds0RiqVcObIOeaOX2Do+LRq04Ifp41FJpOycvkG5s9enKP8s97d6d23JxqthpTkVEYPm0CwMpS69Woyfc4kACQSCb9NW8CuHfsMnt+ctWrTgim/jMte9vNm/ZWj/LM+3enT92M0Gg0pKamM+no8wcpQ7O3L8PfyOdSpV4M1q7YwdvSPRsnf1L8RI38cilQqZevqnSybvzJH+dsfvsnQHwYRGx0LwLolm9i6aicAQ8YNpEWbJgD8PXs5gdsOGDR7Hb969J7QF6lMxv41e9ny+8Yc5Y7ujgyZOYwSpUoilUpZ8csyLhw8xxtd/Xin/7vZ9byrlmdMp+GEXbtt0PxP++jXAVRrXY/k+CR+7TA6V7lzRXd6TB+IZ3Ufdv62lkMmsN18rMP0flRoU4fU+CSWtcv9e1WxXT2aj+qGTqtDq9FwaNIK7p0JNkLSvL1of8GpaVVaLB1BSrj+O3A34AzXZm02dMx81Zg9AKd29ciMS+K4X+51p/ygt3F/vwUAErmMkr4eHKjWD1VCiqGj5uIzczD2bRugikvkv9bDcpXL7GypOP9rLN2dkMilRP2xjbi1ht3OvAy5qyOu00Yjc7QHnY7EdQEk/LvV2LFMw0ucd1QYSqXyGCB5ifqfF6Tea91YClt3lJtLAmk8d2Ce5RalbKk/rTdHev5C6r14rMqWMnDC57ux/gj/LQ2k7ewB+daRSCU0+6474YcvGzDZi53acJjDy/bw2czBeZanJCSzfuJSardvYOBkeZNKpQyfOpQRPcYQGxXLooCFHNt7kjshd7LrePp48PGQHgzqOpTkxGTKlNVfF6ZGg2rUbFid3m37ATB/yxzqNK3NxZOXDJr/599+4MOuXxAVGcPug+vYu+sgwcrQ7DqbNuxg+ZK1ALR/qxUTp35Dz279uXE9hA7+H6DRaHB2ceLAsc3s3XUQjca8r/9hKFKplGkzxvNh1z5E3othz8H17Ak4kHPZr9/B8n/0y77DW62Y9NO39Hi/HxkZGUybOocq1XypUrWy0fKP+Wk4Qz4aQUxULMsCFnFkzzFuP7XuAwRuO8D0cbNzPNa8TROq1PTl43ZfYGFpwZ+b5nLiwClSkg1z/RKpVErfHwcw+ePxPIiOZ9q2GZzdF8TdkIjsOu9/1Z0TO46zd8UuPH29GLtkPINa9OPolsMc3XIYgHIKb75ZPM6oDSWAoA2HObZsDz3z2W6mJiSzaeJSarY3vWnur6w/woVlgbw1K+/fq/DjVwkNPA+AYxUvOi/8iiWtxxgy4nO9aH8BIO60kqOf/WbAVAV3b81hwv/eQ835ea87YQt3ELZQ37h2al+P8gM6mkRDCSBu7UFiluyi4pyheZa7fP4WacF3Ce71M3KHUtQ+Oo/4TUfQqdQGTlowOo2W2F//IuPaTSS2NnhvnEfqiQtkhoYbO5rRGeKcpeJQLLPhKRSKxgqFolTWbRuFQjFJoVBsVygUvygUCoNd8TT21A0yHibnW+79bjPuBpwh9V48ABnxz06YYVyRp5WkJ+SfH6BW7/aE7jpDmollDw26Tmpi/tmT45MIvxyKRm0aO+RV61bhXtg9osKjUKvU7N96kBYdmuWo83bPTmxeuo3krM+VEJ8AgE4HllaWyC3lWFhaIJfLeBj70KD569avxe1b4YTfuYtKpWLLxgA6dGydo07yoyc/jLa2NvrgQFpaenbDyNraEp3OPDdmxlIva9nfCcta9psCeLNTmxx1ci572+xlnJqaRtCp82SkG+/CjtXrViUi7B73stb9wK378evQokDP9alcnvMnL6HRaEhPSyfkWihNWzUu5sRPVKrjS3RYFPcjYlCr1BzffpSG7XK+v06nw7akDQC2drY8vP8g1+u0eKclx7YdMUjm57kVdIOUxPx3YJPjk4i4fMtktptPuxf0/N8rVeqTK81b2FqZ3HbmRfsLpu7hqRsFbvy4vducqM0nijlRwT06fQ31w0f5V9DpkJXQf4dlJaxRJySjM8HvwGOa2AdkXLsJgC41jczQCOQuZY2cykQYaDa8V624pg7/B3h8aHEOUBr9lXJTgSXF9J4vza6iK5alS9Bq4zja7ZlC+Q8KtoNgKkq42lPhzQZc+Xe/saOYPUdXR+5Hxmbfj42KxcnVMUcdrwqeeFXwZMGWOfy+fR6N/PVHd6+eu8aFExfZfH49my+sI+jwWe7cNOwRJDc3ZyLvRWffj4qMwc3NJVe93n17curCHn6YNIpx3/yU/Xjd+rU4fHI7B49vZcyISaJX6SW4ursQeS8q+37kvWhc81n2py/u5YfJoxg3ZqohIz6Xk6sjMZH3s+/HRMXi5OaUq17rjn6s2reEaYsm4+LuDEDItVCatW6MlY0VpR1K06BZ3ewyQ3BwLUtcVFz2/fioOBxcc+6UrJu9mjfe9efPU/8wdukE/h6/KNfrNOvcgmNbjd9Yet1V6tCA3gd+5d2lo9gz+q8XP8HElK1fiQ77fqLlyjGUquxh7DiFIrWxxLFVbWJ2nH5xZRMRvSQAG18P6l74m5oHZnFn/D/ZB/tMndzdBauqFUm/pDR2FKEIiquxJFUqlY/7RxsolcphSqXymFKpnARUKKb3fGkSmQyHWj4c+eQ3DveYRrVh71KygquxYxXYGxM+4cRPa8y2W9OUSPIY4frskU+ZXIanjwdDu41g8qCpjPltJCVLlcCjvDvevuXo1qA779fvTr3mdanduKaBkutJ8vgAOnKvF0sWr6JJ3Q5MmTiD4aOfDDe5cO4yfk0782brDxk6vB9WVpbFmvd1kte6k9cP+ZLFq2hcpz1TJsxg+Ogviz9YAeW57jyT/2jgCd5p/CE92/Ym6OhZJsweC8Dpw2c4vv8U/2xbyNSF4/nv3FWD9npI8hia/mz2Fu+05NCGAwxo0oefPp/EV7OH5/jMvnUqk5GWQUSwGCJT3G7uOcuS1mPY2ncWzUd1M3acl/LwvzB2NPyaPW3HEvL3HlosGWHsSIXi3L4+CWeUJjMEryDK+Ncl5WoYF+p+wX/tRuI9tS+yrN5iUyaxtcZ97vfETvsTbYphhiabOp1WV6Q/YymuxtIVhULRO+v2JYVC0QBAoVBUBlTF9J4vLTXqAVEHL6FJyyDzQTKxp25Qplo5Y8cqMOdaPnRYMITPTsyiYsdG+E39HJ8O9Y0dyyzFRsXh7P7kaLqTmxNxMfHP1Inl2N4TaNQaoiKiiQiNwNPHkzfebMHV89dJS00nLTWd0weCqFavmkHzR0bG4O7xpKHv5u5CdNT9fOtv2RjAmx3b5Ho8JPgWqalpVKnqWyw5X0dR92Jw93DLvu/u4Up0dP7LfvPGnbzVKfeyN5b7UbE5eoNc3JyIi47LUSfxYRKqTP2me8vKHVSt9eT8qiVz/+Xjdl8w5KORIIHw23cNExyIj47D0e1JD3BZN0cexuQcZtemeztO7DgGQPB5JZZWltg5PDk/tXnnNzi+7ahhAguAfshemXLO2NiXNHaUAlMnp6HOGkoYdeASUgsZlg7mk/8xt65NTWoIXkE4dm/Nw4BTAGSERZMRfh/rSibesyeX4T7nB5K2HyQ58Lix05gOMQwvh76An0KhCAWqAScVCsUt4K+sMpNwb885nBorkMikyGwsKVuvIo9CIo0dq8CWNx/B8mbDWd5sOKEBQRwet5Tbe84ZO5ZZunHxBp4+Hrh5uSK3kNOmSyuO7835g3J093HqNasDQGn7UnhV8CQyPIr7kfep06QWMpkUmVxGnaa1DD4M7+L5/6hQ0Zty3h5YWFjQ9f2O7N11MEcdnwre2bfbdvDj9i39CfzlvD2QyWQAeHq5U7GSDxHh9wwX3sxdeHbZv9eRPQE5Z2p6etm36+DPrVt3nn0Zo7l28QblfDxx93JDbiGnXZc2HNmb88e9rPOToW0t2zfPnvxBKpVS2l7f8KhUtQK+VSty+rDhZuS8eSkENx93nL1ckFvIad75Dc4E5hxeFBcZS83mtQDwqOSJhZUFSfGJgL5XrWmn5iZxvtLrroz3k6GpzjXKI7WUk2ZG5whZOz053dqhTgWQSsh8YD75AeR2Ntg3rcb93WeNHeWlZN6LpdQb+u+w3LE0NhXdyQiPMXKq53OdMpzMW+EkLMvrmqj/v3Taov0Zywtnw1MoFNbAx0DFp+srlcp8p7FRKpWJwOcKhcIO/bA7OXBXqVQadO1usnAwzs2qYuVgR+dz87jy2wakFvqPELp8P49CIok6eJkOB6aBVsutVYdIVBruqOiLtJ8/GI8mVbF2KMnnQXM5PWMjUgv9Tu3VFaY7bSbA53OH4tukGiXt7fjx5EICZq1HlpX92Mp92DmVZsy2n7EuaYNOp8O/T0emthtJenKaUfJqNFpmfz+P31b9glQqJWDtLsKC79Bn1OcoLyk5HniSoENnaOjXgOUH/0Gr0bDwx0UkPUzi0I4j1Gtel6X7F6PTwelDZzgReNLA+TWMHT2F1RsXI5NJWb1iE8obNxkz9isuXrjC3l0H6dO/Jy39mqFSq0hMSGLol/rpfRs1qc9Xw/qhUqvQanV8O2oyDx4kGDS/OdNoNHw36kfWbPo7a9lvzF72ly5cYc+ug3zR/2Pe8G+KWqXWL/uBT6YmPnN5P3alSmBpYcFbndrQ/d0vcsykZ4j8v46bzdxVvyGTSdm2JoBbwWEMGN2H65eUHNl7nI++eJ+W7ZujVmtISkhi0vCfAZBbyFm0eT4AKY9SGP/VFIOe76bVaFk8/k++Xz4RqUzKgXX7uBsSQfcRPQm9fJOz+4JYNuUfBk4bwttfdEGn07Fg5Jzs51drXJ34qHjuR5jGjtenc7+iUpNqlLC3Y8LJBeyetSF7u3kia7s5YttP2dtNvz5vMa3dKDKMtN18Wqd5g/FsWhUb+5L0Pz2XEzOf/F5dXnEA344NqfZ+C7QqDer0THYOnm/kxDm9aH/B8+1GVOrVFp1agyZdxcmBppW/9h9fYd+sGpYOdvhfWEDI9A1I5frlH7FcfykIl46NiD98Gc1Tk22YgooLh1OqaQ3kDnbUPfsXd2esQZKV/f6/e7k3ez0VZ39Fzf2zQCIhfOq/qB88Z0III7OuV51SXdqSobxNuU36y4jEz15KyhHTuLSLURmxwVMUkhfNSKNQKLYDlsBpIPtXMOv8o2Kz1u1jsz0RJ1Ze4CneTdINmcmMlCyUy6q4F1cyUcEp5tOzmZ//QoKMHaFQalQyvemYX0a5EoabWKE4eFuUMXaEQvOS2Bo7QpF4as33KiKeKrPdVQCgtNa8J9OxlxlvJs+isi9t3ucRVb6+2+x2NuM7+RXpC1t252GjfOaCbCErKZXKqsWeRBAEQRAEQRCE15Ixh9IVRUHOWbqVNZxOEARBEARBEATh5ZnpBA/59iwpFIpfs24mAmcVCsUeIP1x+fPOWRIEQRAEQRAEQXjMXHuWnjcM7/Ek/MqsP0EQBEEQBEEQhP8b+TaWHk/goFAoqiiVyhtPlykUiirFHUwQBEEQBEEQhNeDufYsFeScpVUFfEwQBEEQBEEQBCGX1+46SwqFwhFwBqwVCkVV4PF0faWBEsUdrLKFeV3s7WkOGdbGjlAkGisLY0coklQLe2NHKDRVCTM97JLlVnKU2U/Bba5uJ0cbO0KRqG3NdwrldEvzzQ6QKjXfqc8fWVoaO0KRlDXjadsBHDTmm9/pgXmvO5WNHaAwdGY32znw/HOWPgaGAe5AwFOPJwK/5vkMQRAEM3blpvleNLBqxfrGjiAIgiAI+TLXYXjPO2dpDjBHoVCMVSqVPxkwkyAIgiAIgiAIgtG9sP9UqVT+pFAobAHPp+srlcprxRlMEARBEARBEITXg077+g3DA0ChUAwCfgEeAo8HZuuACsWYSxAEQRAEQRCE18RrNwzvKaOAGkql8k5xhxEEQRAEQRAE4fWjew0neHgsWjSUBEEQBEEQBEEorNe5ZylQoVD8CqwB0h8/aA7nLJWb/hWl2jRAHZ/IjXZDc5XLSpeg3PShWHm7os3IJHzUPNKDw42QNG/VZg/EqV09MuOSOOk3Kle596DOuL3fAgCJXEYJXw8OVeuLOiHF0FFzaTu9Hz5t6pAan8TKdt/lW8+lVgU+3DqRXYPncTPAuDOR1fCrQ8/xvZHIpBxdu5+A37fkKC/r4UjvXwdj51CKlMRk/ho2h4fRDwDo9u0n1GpVD4Dt8zZwZscJg+dv4t+QYZOHIJPK2LZ6J/8uWJ2rTpvO/nwxohc6Hdy8FsqEIVNw9XDh58WTkcqkyOVyNizZxOZ/txs8f6s2LZjyyzhkMikrl29g3qy/cpR/1qc7ffp+jEajISUllVFfjydYGYq9fRn+Xj6HOvVqsGbVFsaO/tHg2c1d67Zv8NMv45DKZKxYtp65sxblKP9ycG8+6fUBarWa+LiHDB38HXcjIgEYP2kU7Tr4AzDj14Vs2RTw7MsXq2atGjP6x2FIZVK2rNzOkvkrcpR37t6R4eMHcT8qDoC1/2xk8yr9+n323hFuXr8FQPS9GIb1+sag2QHq+dWn/8T+SGVS9q7Zy4aF63OUO7k7MXzmCEqUKoFUJmXZtKWcPXgWuzJ2fPfHWHxr+7J//T7+GP+HwbO/yGe/fknN1vV5FJ/I5A4jjR3nubpM70fl1nVJiU9iYftvc5XX7NqMFgM7A5CZms6OcUuIuW46+wttfutH+TZ1SItPYlXb/H9znWtX4IOtE9k9aB6hRv7NfazJzH54tK1DelwSO1vnzu7ctCp+S4aTHBELQETAGa7M2pKrnrFUnz0ge1/thN/oXOXlB72Na9a+mjRrX+1gtX4msa8mFExBGkufZf37wVOPmcU5S/Hr9xO7bCfes4blWe4y+APSrt3idv+fsarogdeUAdzsMd7AKfMXueYwEX/vocb8wXmW31m4nTsL9T/6ju3r4T2gk8l8+a6tP8KlZYG0nzUg3zoSqYTm33Un/PBlAybLL4uUTyahkIMJAAAgAElEQVT3ZcYnk3kQ/YDx26ZxMfAskTfvZtf5cGwvTmw6xImNh6nStAbvj/mYxSPmUatVPbyr+zCx4yjklhZ8u3Yy/x26QHpymsHyS6VSRk79mq97jOZ+VCz/BPzB0b0nCAt50ins6ePBZ0N6MqDrVzxKTMa+bBkA4u7H07/LEFSZKmxsrVl5YAlH954gLibeoPmnzRjPh137EHkvhj0H17Mn4ADBytDsOpvW72D5P2sB6PBWKyb99C093u9HRkYG06bOoUo1X6pUNcsrTxiVVCrllxkT6NalN5H3ogk8tJHdAftzLPv/Ll+jrd97pKWl0/uLHkycPIa+vYfRroM/tWpXx795F6ysLNkWsIJ9gYdJfmSY7ZBUKuXbn0fy5YfDiIm6z8rdizm89xi3gsNy1Nuz9QC/jJ2Z6/kZ6Rl81PZzg2TNi1Qq5cspX/L9x98THxXHrO2zOB14ioiQiOw63Yd+xNEdR9m1IgAvXy8mLp3EF837kJmRyYoZ/+Kt8Ma7srfRPsPznNxwiIPLdtN75hBjR3mhi+uPErQskHdnDsyzPCEiliUf/kh6UiqV/GvT+ecvWNx1goFT5u/6+iNcXhpIu9nP/81tZiK/uU+7tfYIyiWBNJuTf/bY00oO9ZphwFQFF7nmMOF/76FmPvtqYQt3ELZwBwBO7evhPaCjyeyrGZq5TvAgfVEFpVLpk8ffcxtKCoViqEKh8Hp1MQsnJegamoT8L25r7evFo+P6jUZG6D0sPZ2RO5Y2VLwXSjh1HdVz8j/N9d3mRG8+XsyJCi4ySEn6C7LX7t2em7vOkBqfZKBU+atQpxL370QTG3EfjUrN6e3HqdM+58VV3X09uX78PwBunLxC3XYNsx9Xnr6GVqMlMy2DiOth1PSrY9D81epW4W5YJJHhUahVavZtPUDLDs1z1OnS8202LN3Co0T9/8vD+AQA1Co1qkwVABZWlkikht+Y1atfi9u3wrkTdheVSsWWTQG82alNjjpP74Db2tqi0+kASE1NI+jUeTLSMw2a+XVRr0Etbt+6w52wCFQqFZs37uStTm1z1Dl29DRpafqBBWfPXMTNwwUAhaIiJ44HodFoSE1N48qVG7Rp29Jg2WvUrUrE7bvcC49ErVKzZ8t+/Du8YbD3L6rKdSoTFRZJTHg0apWaI9uP0KR9k/+xd5fRUVwNHMaf7MYFiDsU6+Du7lIoUmhpoS2lBYpTtBQoXoNiwSlFihUvLsGlxZ2QQaLEBQiBhGTl/bAhYUkggZDdhPf+ztkDM3N3+WfYzMydK6NXRqvVYm2ne2isjZ0N8VG61uynSU/xO+dHSnKqwXPn1O2zN3nysGA8YD74rD9JrzhnhV64TXLCEwDuXbxNIXcHQ0XLkfAz2Z9zK/Vqxd2950jKB+fc50WfkUm5XzC+J1m5f9qf1BxWftw61ydim+F7nuQXWm3uXsaSbWUJQJKkcpIkDZQkaYAkSWVy8JapwBlJkk6kvcc5dzHzRtLNQIq0qQuAdeXSmHu6YObuZORUr09hZY5T0ypE7Tpj7Cg5ZuNqT8nWNbi25pCxowBQxNWB+PDY9OX7EXHYu+qfDENvBlG9re5Cplrr2ljZWWNTxJbQm8FUbFIVc0tzbO3tKFO3Ag4G/h45uzkRHR6dvhwdEYOzm34G7xJeFC3hzZJ/5vHHzgXUaZJRGXTxcGa17zK2n9vAmgV/G7RVCcDNw5XwsIj05fCwSNzcXTOV69W7O2cuH+DHKSMZN/onQ0Z8Z7m7uxJ+LzJ9OTw8EnePzPv+mR5ffswh3+MAuspRy0ZYWVni4GBPg4Z18PR0z/PMz7i4OxP13Pc+KiIaZ/fMp5vm7Rqz4fAqZiybhquHS/p6cwtz1u7/k1W7l9KkjeErWY5ujsQ8d9yJjYjF0dVRr8y62Wtp2rkpK8+sYtKqySyemP+62/2/qfZpE+4cvWLsGK/Fxs2ekm1qcH11/jjnvi6n6qX4wPcnmq4ZReH3PY0d543ortUqF6hrtbdNqzHJ1ctYcjJ1+Bfopg7fnbZqrCRJ38uyvPYVbwsAqgMtgG7AZEmSLgDrga2yLD/KXey3I2rhFrwm9UHaO5tkOZgnNwJApc7+jfmMc6vqPDgnF6hm3caTPufUL3+j1RjxVsFzTEwy/xJqX7iNsfGnv+gxpTf1uzbl1lk/4iPi0Kg13DhxheKVSjJ26088ikvgzsVbqNWG/R7lJL+pqRLv4p4M6PodLu7OLN7mQ49mvUhMeEx0eAxftOyNk6sjv/05lcO7j3E/9r6h4pNF/CxvI61Yto4Vy9bxUdf2DBvVnyH9M48tEF5PTr47z3zcrQNVqlagQ9seABw9fIqq1Sqyx3cDcbHxnD93CZValad59WT1xXkh+/EDJ9m3zZfUlFS6ftmJKT7j+barbgzrB9W7EBMVi2dRD5Zu8eHOzQDuBYcZIrlOlvtef7lxh8Yc2nSQbX9so0y1MoyYM4KBLQa89P9IyFvv1S1H1W5NWN5lirGjvJaGEz/n1M/555z7OuKvBfFPre9QPXmKR7PKNFo+jJ0NMo/jzu8K4rWaoJPTqcOrybIcCSBJkhuwH3hVZUkry7IGOAAckCTJDGgLfAb8DuSLliZNYhIhI33Sl8udWsrT0CgjJnozbp3q5asueDnhUrE4befr+rFbOtjxXtPKaFQaAg5cMEqe+5FxOHhktMTYuzvyIFq/svAg+j4L+s0AwMLakupt6pD0SNctY9eCrexasBWAvnOHEhUYgSFFR8Tg8twdcxd350ytQ9ERMVy/6IdapSYiNJKQu6F4F/fi5hU5vUxsVBwBt4KoUrsiR3YfN1j+iLAoPJ5rkfDwdCMyMvql5bdt2c1vs/LPeIGCLDw8Eg8vt/RlDw83IiMy7/tGTeoxbGR/OrTtQUpKRtev2b8vZvbvutaOJX/OJOCu4SZPjQ6P1mspcnV3ISYyVq/Mw/sZXY62rtnBkPH905djonRlw0LCOf/vJcpULG3QylJcRCzOzx13nNydiI/W/71t+WkrJn6hG0vrf9EfcwtzCjkU4mHcQ4PlFHRcy3jT4bferO05/ZVd9vIjl0rFabMg45xbrGlltGoNAfuNc859Harnxv+GH75CzV++wsLBlqfxBev/wK1T3f/rLnjwDo9ZAnhWUXrx76+gtzdkWU6VZXmHLMufAUVfL2LeURaywcRMV190/Kwlj8/6oTHgoPy3wdTOCvu65Yjed97YUV7LygbDWVF/GCvqD+POnrMcGb/SaBUlgMArd3B9zx0nLxeUZqbU/rA+l331ZwqytbdLvwvfbkBnTm48DOgmh7ApYguAV5lieJUpxo0Thu2icfOyP97FPXH3dsPUzJQWHZtx4oD+Qfn4vpNUr1cVgML2hfAu4UVYSATO7k5YWJoDYFfYlko1KxByNzTTv5GXLl28RomSxShazBMzMzM6ffQB+/cc1itTvETGIPaWrZsQECCeaPA2XLpwjRIl3qNoMS/MzMzo3KUd+/bod9WpWKksM+dO4fNP+xEbG5++XqFQYO+gmyikXHmJcuUljhw6abDsNy77U7SEFx5F3TE1M6V1p+YcPaD/7zu5ZHRra9y6AYFpk57YFbbDzNwMgCIOhalSs2KmiSHy2q0rt/Ao7omrtyumZqY0+rARZ3z1u+jEhMVQub5uDKRXKW/MLMxERckICns40m3Jd2wbtoi4wJxcBuUvf9Ufzqp6w1hVbxh395zl6LiVBaKiBGDpnDGW3LFKCUwUJgWuomRqZ4VD3XLEFLBrtbetoI5ZyknL0l1JkiYDS9DNgtcXXTe7V+n2sg2yLBusNvLevBHY1q2AqX0hyp/5k4hZ69MrR3Fr9mFRyks3U55aQ/LtUEJGzzNUtBypuHgI9vXKYeZgR8NLC7k7YxMKUyUA9/46CIDzB7WIO3YVzZOnxoyaSZt5A/GqWxZLe1u+PuPDmVlbUJjpsl9bczibdxueRq1hzYRlDP9rPAqlgpMbDxN++x6dhnUj6NpdLh88j1SnPF1H90Cr1XLrrB9rJiwDQGmm5IdNuumqkxKT+GOYDxq1YR8moFZrmDnehznrpqNQKNi1YS+Bt4LoM7IXN6/InPT9l9NHz1GrcU3WHVmBRq1h/tTFJNxPoGbD6gyZ0B8tursc6xZv5K5/oIHzq/lh5FT+3vonSqWC9Wu2IPvfYfTYwVy5dJ39e4/wTd8eNGxSF1WqiocPEhjSL6ML3rmrh7ArZIO5mRlt2zWnW+dv9GZzE15OrVYzZtQUNm37E4VSybrVm5H97zBm3BAuX7zOvr2HmTT1e2xsrPlzla4lPuxeOJ9/2h8zM1N27VsHwKNHifTvM8qgXVDVajW/jZ3NwvWzUCiVbF+/iwA5kP6je+N32Z9jB07yWe+Pady6AWqViocPHjFx6DQASpQuxrgZo9FqNJgoFKyYt8bglSWNWsPiHxcxZfVUFEoFvht8CbkVQo/hn3P72m3O+p7hz2nLGPzbEDr17ohWC3OGz05//5+nlmNtZ42pmSl1Wtflx8/H682kZ2zf+AxFqlMeW3s7fv1vMTtnb+TUxvx3/Afo4jOQ9+qWxdrejuGn53Fk9maUprrrhfNrD9F4aGes7O1oN7UXABq1mqUf/mjMyHpazx+IZ52yWDrY0uusD2dmZpxzr+fDc+7z6i8ciGvdslg42NL5vA9XZ25Jv9a5vfowRdvXovSXzdGq1KiTUznZf4GRE+uruHgwDmnXao0uLeDujM2YvHCt5vJBLWKPXUWdz67VDK2gtiyZZNfvWZIkF8AH3fgjAF9gqCzLL+8j8xZcKtqx4HWsTRP71NLYEXLFz8LM2BFy5YoiOftC+dTNVMNOrPC2BSQatvvh23b9Tv547sibKFuyurEj5Iq3db7onf1GPM2LGDtCrngqrI0d4Y25a82NHSFXHAvoxeMzDgVvmHc6Z0OOr8wDraL+LnBfnrsVWufq2r7k9f1G+ZmzbVlKqxR9aoAsgiAIgiAIgiAI+UZOuuEhSVIzoNTz5WVZXphXoQRBEARBEARBeHdoDTtC4a3JydThq4FKwBXgWYNrge0iJwiCIAiCIAiCYWm0Ba7nIJCzlqWaQHlZlgtwz1RBEARBEARBEIxF+w5Xlu4AVkDBmqdREARBEARBEIR8oaDOhpeTytIo4LgkSSeB9GnGZFkenWepALeiCdkXyqcso1KzL5SPpSQUzr5QPpZoaWHsCG8s2bRgz6qlsim4DdCBiZEFfka5giz4cZ5OsJqnUrUF93sPkGJecPMHAq4FeDa/h8qCPZvfA4XS2BHe2ENljobt51utjB3g/0hOvik+QBjwgIwxS4IgCEI+c/NuwXjIZFakEtWMHUEogApyRUkQ/t8Y88GyuZGTypKXLMtl8zyJIAiCIAiCIAjvpILaDU+RgzJXJUlyz/MkgiAIgiAIgiC8kzRak1y9jCUnLUtFgOuSJJ1Cf8zSJ3mWShAEQRAEQRAEwchyUllal/YSBEEQBEEQBEF4be/s1OGyLK8yRBBBEARBEARBEN5N7/IEDwWWwsWZIuN/QOnggFar5cmOXTzZtEWvjGXLFtj2+BQAbVISD2fOQXXnrjHiZsvUzQmPGSMwdbYHjZb7G/Zxf9V2Y8fKUqU53+LSsiopsQkcb5x5lvkSA9rj0aU+AApTJbalPfEt15fUB48NHTVL7Wf0oVSzqjyOS+CPVmMybX+/ZXUajegKGi0atZoDk1dz7/wtIyTNUKlxVb6c+A0KpYIjfx9k56KtetudPJ3pO2MQhRwKkfggkYXfzSE+Mo5i5d7j65/6YWVrhUat4Z/5mzm965TB89dtUosRU4egUCjYvn43q+av1dve/pM2DPlxADGRMQBsXLGV7et2AzBoXD8aNK8DwJ9z/sJ3x2GDZm/WoiE//zYOhVLJmlWb8Jm9VG97/4G9+Lznx6hUKuJi7zNk4A/cCw0HYMLkkbRs3QSAmdMX8s/WPQbNXtA1b9GQn6ePR6lQsvqvjcydpb/vBwzqxRc9P0GlUhEbG8/gAbp936BhbX76dVx6udLvl6B3r+/Ys+ugQfPXb1qHMdOGoVQq2LJ2B3/OW623vWO3doyYMIjotO/9+uWb2bJ2B1L50vw4fTS2tjZoNBqWzlnJvu2GzQ5Qo0l1+k/qj0KpYN/6fWxYuFFve7+JfalctzIAFlYWFHEswkcVugKwN2g3Qf5BAESHxzDx60mGjE7FxlX5YuLXKJQKjv59kF2Ltultd/R0ps+Mgdg5FOLxg0QWfTeX+5FxAKwK2ESofwgAceGxzO79i0Gzv+jT6d9Srlk1EuMSmN56VKbtLiU9+GxGP7zKF2f37xs4+scuI6TM2ocz+lA67Xy75CXn2yYjuqJ97nwbauTz7fOa/t6HYs2rkBSXwIYWP7y0nEvlEny0fRIHBswjYM85AybMP4w57ig33unKEmo1CfMXobp1GxMrK5yWLyHl3HlUQcEZRSIiiBv8HdpHiVjUqUXh0SOI6zvAiKFfQa0m+pdlJPvdRWFjxXvbfHh86iIpd0KNnSyTe38fI+jP/VSZn/W+DFi4i4CFuoO1S6tqFP/2g3xTUQK4sukE51f58uGsflluDzx1nVu+ummaXcp403nBEJY0z3yCMhQThYJeU/vyS49JxEXGMW3HdC4ePEvY7XvpZXqM+4oTW45yYssRytWrSLfvP2fRsLk8TUph0bC5RAZFUMTFnp92/87V45d4kvDEYPkVCgWjfx7GoE+HExURw6o9Szm+/ySBt4P1yvnuOMyMcXP01tVvXocyFUvTo+U3mJmbsWSrD/8ePs3jRMPkVygU/DZzIl079iI8LBLfo1vYt+cQt+SMmy7XrvrRovFHJCUl0+ubz5g0ZTS9e31Hy9ZNqFS5PE3qd8TCwpwde9Zw0PcYiY/yz+9CfqZQKJg+cxIfdfyK8LBIDh3bwr7dh5HlO+llrl7xo1mjzmn7vjuTp47mm6++4+SJMzSu3wGAIvaFuXD5IEcOnTR4/vG/jqTPJ0OIDI9mw/4VHNl/goBbQXrl9m0/yM9jZ+qtS05KZuygKYQEhuLs6sRG35WcOnKaRwmGe368QqFg0LSBjOk+ltiIWObt8uE/39OE3A5JL7N4ckblteNXHShZoWT6ckpyCv3bDDRY3ueZKBT0nNqH33pMJj4yjik7pnPx4DnCnztmdh/Xk5NbjnJyy1HK1avAJ9/3YMkwn/Ts4z8YYZTsWTm7+RgnV+2n+6ys9+eTB4lsnbSSiq1qGjhZ9q5sOsG5Vb50zOH5tsuCISwy4vn2Rf6bjnNtpS/N53z70jImChPq/NCN0GNXDZgs/ymo3fByMhtegaWJi0d16zagazVSBYWgcHLSK5N6/QbaR7qTS8oNP5TOTpk+J79Qxdwn2U93AaZ5nETK3RDMXPNn3vjT/qQ+yNlJ26NzPcK3/ZvHiV5P6Fl/kl6RP/XJ0/S/m1lbAMZtWy5VpTRRQRFEh0ahTlXx386TVG9ZS6+MZ2kvbpzSHaj9/r2Wvj0yMJzIoAgAHkTfJyH2IYUcDPtg4vJVyxIaFEZYSASqVBW+2w/RuHWDHL23+PvvcfG/K6jVapKTkrntd5e6TWvnceIM1WpUIjAgmOCgUFJTU9m2ZTdt27XQK3PyxBmSknTz45w/dxl3T1cAJKkk/546i1qt5smTJK5f96d5i0YGy17QVX9h32/dspu27ZvrlXlx33t4umX6nI6d2nDQ93h6OUOpWK0cIYH3uBccjipVxd5/fGnWJmf//8EBoYQE6m6UxUTFEh97H3tH+7yMm4lURSI8KILIkEhUqSqO7ThGvVZ1X1q+SccmHN1+1HABX6FklVJEBUUQk3bMPJ3FMdOjtBc3Tl0DwO/f65m25ycBZ/15/PDlN1kS4xIIvRqAWpX/HpcZUsDOty+KOCPzNJvrnYq9WhGw9xxJcQkGSiW8TdlWliRJ2piTdS9sN5ck6UtJklqkLXeXJGm+JEkDJUkye/O4b07p5orZ+6VI9bv50jLW7T/g6emzBkz15sw8XbAsV5KkK/7GjpIrCitznJtWJnLXGWNHeW1S6xp8e2gG3VaMYteopdm/IQ/ZuzkQFxGbvhwfEYeDm6NemeCbQdRqq7uQqdmmDtZ21tgWsdMrU7JyaUzNzYgKjsz70M9xdnMiKjw6fTkqIgZnd+dM5Zp90Jh1B1fw69IpuHq4AHDb7y71mtXGwsqCwg6FqVGvavo2Q3B3dyX8Xsb+Cg+PxN3D9aXle3z5MYd8jwPoKkctG2FlZYmDgz0NGtbB01M8qSGn3N3dCAuLSF8OD4vE3f3l+/7zL7ty8MDxTOs7d2nHls2G75bk4uZM5PPf+/BoXNwyf+9btm/K1iNrmLXsZ9yy+G5XqFoOMzMzQoPuZdqWl5zcHIkJj0lfjomIxfGF484zLp4uuHm7cfnUlfR15hbmzN/tw9zts6nX+uWVrLxg7+ZIfERc+nJ8RBz2bg56ZUJuBlGzra57b402tbGys8a2iC0AZhbmTN45nYnbfqV6q/xbiXpXSK1r0P/QDD5bMYodRj7fvi4bN3uKt6nBjdWHjB3F6LTa3L2MJSfd8Eplsa5MNu9ZkfbZ1pIk9QRsga1Ac6AW0PN1QuaWiZUl9j9NIWHuArRPsu6aY161CtbtPiB2wBBDRnsjJtaWeM4fR9RPS9EkJhk7Tq64tqrG/XNyvuqCl1Py/vPI+8/jXasMjUd8zLoexuuzbkLmpm3tC0eWtdNW8tXUvjT6uCn+Z/yIi4hFrc64y1jExZ7+s4eyeIRPpvfmNROT7POf8P2X/f8cIjUllY++6MDEOWMZ8Ml3nDl2jnKVy7B8x0Luxz3g2oUbBr17mpPsz3zcrQNVqlagQ9seABw9fIqq1Sqyx3cDcbHxnD93CZValad53yVZ7PpX7vuq1SrSvk0PvfWurs6UKy9x+OCJvIj4Sll+d15YPnrgBHu2HSA1JZVPvuzMT/Mm8E2XQenbnVwc+WX+RMYNmWLw39us/gNelqFJh8ac2HMCjUaTvq5HnS+Ij4rHragb0//+jUD/ICKCI7J8/9uWVWegF6Ovn7aKL6f2oeHHTZHP+BEfEYdarcv/Xd2+PIi+j7O3Kz+sn0yofzDRIVF5H/z/1LPzbdFaZWgy4mPWGvF8+7rqT/yc0z//jVaTv1rEjOGdG7MkSVIfoC/wviRJzze3FAbkbD63oizLlSRJMgXCAA9ZltWSJK0BrmTz3rdLqcR+2hSSDhwk+XjWJ0PTkiUoPGYk8SPHoE3I502kpkq85o8jYcdRHh3IX13X3oRHp/zXBe91hZ71x76YC1b2tiTdN9x4gefFR8bh6J7RJdPB3ZH7UfF6ZR5E32fOt78BYGFtSc22dUh6pLt5YGVrxagV49j0+zruXDL8wNnoiBi91iBXd2diI2P1yjy8n/G7+c/aXQwel9G/fYXPalb46AbGT13wIyGBhrvDHh4eiYdXRtcuDw83IiOiM5Vr1KQew0b2p0PbHqSkpKavn/37Ymb/vhiAJX/OJOBucKb3ClkLD4/Ua4nz8HQjMjLzvm/cpB4jRg2gfZvupKSk6G3r9NEH7N55AJXK8JXUqIhovZYiVw+X9AlMnnn+e795zXaG/ZgxJsXG1pqFa2cx79clXL1wI+8DvyA2IhZnj4yWMGd3J+JfOO4806RDY+aPX6C37lnZyJBIrp6+SqnyJQ1WWYqPjMPBPaMVzMHdkQdZHDN9vp0OPDtm1k0/Zj6Ivg9ATGgU/qevU6xCCVFZMoCQfHC+fV0ulYrTcoHuBoeVgx1Fm1ZGq9YQuP+CkZMZ3rs4ZukAMAoISvvz2etToHN2nytJkjlgB1ijq2ABWAAG7YZX+IfRqIKDebxhU5bbFa4u2P80hQdTf0EdatguDG/C/efvSLkbSvyKbdkXzudM7axwqFuWqH0F74BhXyyjq49bhfdQmpka9cB998pt3Iq74+ztgtLMlLofNuCCr/5sO3b2dul3sjsO7MKxjboZ45RmpgxbOoYTW45yZo9xKq5+l/0pWtwLD293TM1MadmxOccP6M/I5+iScWHTqFX99MkfFAoFhe0LAVCqbAlKly3JmWOGm2no0oVrlCjxHkWLeWFmZkbnLu3Yt0e/u0XFSmWZOXcKn3/aj9jYjAsyhUKBvUMRAMqVlyhXXjL4JAMF2cUL1yhRMmPff9SlHft2v7jvyzFr7lS6d/tWb98/0+Xj9mzZZJyZwa5fuknREt54FtV979t2asmR/fo39Zye+943bd2QgNtBAJiamTJ35W/s2LSHAzsNO/vjM/IVGc/3PHDzdsXUzJTGHRrzn+/pTOW8SnhhW9gOvwsZ3eBtC9tiZq67HChkX4jyNcoR/NzEEHkt4ModvWNmnQ8bcPGFY6btc8fMDwd+xLGNuu+WdSEbTM1N08uUrlGGsNv5b6Kld0V+O9++rjX1h7Om3jDW1BvG3T1nOT5u5f9lRQl0LUu5eeWEJEnLJUmKliTp+ku2F5YkaackSVckSbohSVKv7D7zpS1LsiwHA8GSJFWUZfl12w7/BPwBJTAO2CRJUgBQB/j7NT/rjZlVqoB1m1ak3rmL04o/AHi0ZBlKV92dvCfbd2L31ZcoChei8IjvANCq1cT1znpGFmOzql6OIp2bk+wfSPEd8wCInrmKx8fOGzlZZlUWD8axXlnMHexodmk+t2dsxsRU93UL+Us3va3bBzWJPXYV9XODN/OLTj4DKVa3LFb2dgw+PY/jszejTMt/ce0hyrStScUuDdGkqkl9msLWgfOMmlej1rBywh+M+WuibhrcjYcIux1K1+GfEXD1DhcPnqNs3Qp8OvpztFrwP3uDFT/q+n3XaV+fMrXKYVvEjkZdmwGwZKQPwX5BBsuvVquZPm4OPut+R6lUsOPvPQTcCuLbUV9z84rM8QOn+PSbLjRqVR+VSk3CgwQmD9N1wzA1M2XptvkAPH70mAmDp+l1LzRE9jGjprBp2/I/t3kAACAASURBVJ8olErWrd6M7H+HMeOGcPnidfbtPcykqd9jY2PNn6t0M2mF3Qvn80/7Y2Zmyq59umd+P3qUSP8+owyavaBTq9WMHjmZzf8sR6lQsnb1Zvz97/DDuKFcunSNfXsOM3naaGxsrVnxl+539N69cHp00x3jvYt64uHpxqmTxhmrqlar+fmH31ny91yUSgXb1u/irhzIwNF9uHHFn6P7T/B5n09o0qoharWahw8SGD9kKgBtOrSgep2qFLEvTKdu7QAYN2Qq8o3bBsuvUWuY/+NCfl7zEwqlgv0bDhB8K5gvR3zBrau3OZ1WcWrasQlHdxzVe2/RUt4M/XUIGo0WhcKEDQs26s2iZ4jsf01Yxqi/JqBQKjiedsz8aPinBF69y6W0Y+Yno3ug1YJ81o9VacdMz9Je9Pq5H1qNFhOFCbsWbdObRc8YvvAZTKk65bCxt2PifwvYN3szSjMlAP+uPYidc2GG7/gZS1srtFotjb9uy68tR/I0H3Tl75x2vrW2t2Po6Xkcm70ZxXPn27Jta1KpS0PUqWpU+eB8+6KW8wfiUacslg62fHnWh3Mzt6BI2/c31hjnRsb/uZXAfOCvl2wfCPjJsvyhJEnOgCxJ0lpZllNeUh6T7Po4S5J0EvhQluX7acsOwD+yLL9yyh5JkjwAZFkOlySpCNACCJFlOUdnpYgGTQts584HUVbGjpArAQmGnQntbbtsWXAnebyB4abrzgu3U+OyL5RPBSYadlKLvHDzbsG9WymVqGbsCG/MwzrrSQ0KCg/zIsaO8MZcFdbGjpArTibmxo6QKw5apbEjvDFHTcHsEvbMgNA1Be4HOO3xUa6u7euEb83RzyxJ0nvALlmWK2Sx7QfAG12l6T3AF3hflmXNi2WfyckED7bPKkoAsizHS5JUKLs3ybIc/tzfHwCbc/BvCYIgCIIgCILwjsknEzzMB3YA4eiGC3V7VUUJcvacJYUkSTbPFiRJsuVdf5itIAiCIAiCIAhvjVZrkqvXW9IauAx4AFWA+dk1AuWk0rMeOCBJ0qK05f7AmtykFARBEARBEARBMLBewK9p8zHckSQpEN0jkV46TCjbypIsy79IkhQOdED3aIIlsiy/bNCUIAiCIAiCIAiCnlf2dTOcEHTPfT0hSZIrIAEBr3pDjrrTybK8CliV63iCIAiCIAiCIPzf0Wb5OOi3S5Kk9UATwEmSpHvARNIeWyTL8mJgKrBSkqRr6BqBvpdlOfYlHwfkoLKU9mDZr9H167N8tl6W5a/f7McQBEEQBEEQBOH/icYA81zLsvxZNtvDgVav85k5aVlaklauKbAI6A4cf51/5E1Yly6401GaWj02doRcUd0puPseIOFptpM15ltPzAv2tPMpZgV3CmKVdcF+vlHw4+gCPf12QRb2+JU3JfM9tTafdI55A8lmqcaOkCuPTW2yL5SPPSzAU58/UpoZO8L/HY0BWpbyQk4qS7VkWa4oSdLVtPFLC4ENeR1MEARB+P8iB1w0doQ38n7xqsaOIAiCIOSRnEwd/uzxzmpJkqxlWX4IeOZhJkEQBEEQBEEQ3iFaTHL1MpactCzFS5JkD+wD9kqSFAsU/EfdC4IgCIIgCIJgEAW1w29OWpbaybJ8HxgH/AEcAbrkaSpBEARBEARBEN4Z72TLkiRJSuAf4ENZljWIh9EKgiAIgiAIgvB/4pUtS7IsqwErSZJy0gIlCIIgCIIgCIKQiSaXL2PJyZilM8BWSZLWAYnPVsqyvCfPUr0lJg7OWPf+HpPC9qDVknJsNym+27IsqywuYTPehyeLpqE6f8LASTNTODtjN3ocCgcH0GhI3rOTpG1b9MpYNGuBdbfuAGiTknjkMwt1wF1jxM3E87chFGpWE1XcQ263GZRpu6KQDV7Th2JezA3t01TujZ7L01shRkiatdqz+uDRoirJsQnsbTYm03aXumVpuGI4j0NjAAjdc44bs7P+bhnDR9P7IjWryuO4BHxaf59pe+WO9WnU70MAnj5JZsf45UTeNO7+r9K4Gr0m9kahVHLo7wP8s0j/++7k4cSgWd9hU8gWhULBmt9WcenIBRp2akyHvp3TyxUr+x6j2w0jyC/QYNnrNa3NqKnfoVAq+GftTlbM12+E/7DbBwybMIDoCN0U0xuWb2Hbup0AnA87zp2buoeHR4ZF8V3PzP9fea15i4b8PH08SoWS1X9tZO6spXrbBwzqxRc9P0GlUhEbG8/gAT9wLzScBg1r89Ov49LLlX6/BL17fceeXQcN/SMUWM1bNOKX6eNRKpWsXrWRObOW6G0fMOhrvvjqE9TP9n3/MYSGhgMQ+1DG74YMwL3QCLp3+9bg+Rs0rcPYn0agUCrYvGY7y+b9lWW5Vu2bMXf5r3Rt2ZMbV25iaqpk6uzxlKsooTRVsn3jHv7wWWXQ7LWa1GTIlIEoFAp2r9/D2gV/ZyrT9MPG9BreE61Wyx2/u0wd9DMA/cb2oU7z2gD8NXcNh3ccNWR0AKo2rsbXacfMg38fYFsWx8zBLxwzLx65gLOXCz6HFhB+NwyAW5dkloxbZPD8FRpXofuEXpgoFZzYcIg9i/7R2+7o6USv6QOxcyjE44eJ/PHdXO5HxgPQdcznVGqqe1TCznmbObfrX4Pnf+bj6d9StllVEuMSmNV6dKbtziU9+GTGt3iWL86+3zdw/I/dRkiZPxTUMUs5qSzVS/uz/3PrtEC+ryyhVpO0YTGa4DtgaYXtxEWoblxAE/7CRaGJAsuPe6O6ft44ObOiVvN4yQJUd25jYmVFkYV/kHLhPOqQ4IwikRE8GDEEbWIi5jVrY/fdSB4M6f+KDzWc+1sOEffXbrxnDstyu8vAT0j2CyCk389YlPDCY0o/Aj8fb+CULxew4QS3VvhSZ26/l5aJOSNzvOfvBkyVcxc3H+f0qgN0nZX19+F+aDR/dJtKcsJj3m9SmU6/9GZxpwkGTplBoVDQe+q3TOkxgfjIOH7dMZPzB89y73Zoepkug7vx765THFizF6/S3oxdMYEBDfpw4p9jnPjnGABFpWJ8v2ycQStKCoWCMb+MoP8n3xEVEc3afcs4duAkAbeC9Mrt336Y38bOyvT+p8lP+bTFV4YJmwWFQsH0mZP4qONXhIdFcujYFvbtPows30kvc/WKH80adSYpKZle33Rn8tTRfPPVd5w8cYbG9TsAUMS+MBcuH+TIoZPG+lEKHIVCwYxZk+jcoSfhYZEcPr6VvXsOIfs/t++v+tGsYSeSkpL5und3Jk37nm96DgUgKSmZRvU6GCs+CoWCH38bzTcfDyIqPJqNB1ZxZP8J7t7S//2ztrHmiz7duHL+Wvq61h1aYG5uRscm3bG0smDXiQ3s3naA8NAIg2Uf9tMQhn82mpiIGJbuWcjJA/8RfDvjHOtV3JMegz5jQKchJD5MpIij7jlydZrXpnTF0nzTqi9m5ub4bJnF6cNneZL4xCDZn+XvM/VbJveYQFxkHNN3zOTcC8fMrmnHzP1px8zxKybQr0EfAKKCIxnxwXcGy/siE4WCz6f0ZubnU4iPjGfCjl+57Hue8Dv30st8MrYn/249yr9bjlGmbgW6jO7BsuHzqNS0GsXKF2fSByMxNTdjzIYpXDt6ieTEpFf8i3nn/OZj/LtqP91mDchy+5MHiWyftIryrWoYOFn+Y8xxR7mRbfc6WZabZvFqlt37JEkqKUnSSEmS5kqSNFOSpH6SJBV+O7FzRvswXldRAkhOQhMRgqKIU6Zy5i06kXr+BNqEB4aM90qa+HhUd24DulYjdUgwCidnvTIqvxtoE3WNfak3b6Bwds70Ocby5OwN1A8evXS7RSlvEv+9CsDTgHuYeblg6pR/Hmgac8aflPuJ2RfMp4LO+vPk4cvzh1y8TXLC47S/36Gwm4OhomWpVJXSRAZFEB0ahSpVxamdJ6jZsrZeGa1Wi7Wt7qG91nbW3I+Oz/Q5DTo04uSOPH9mtp4KVcsSGniPsJBwVKkq9v9ziCatGxo0Q25Ur1GJwIBggoNCSU1NZeuW3bRt31yvzMkTZ0hKSgbg/LnLeHi6Zfqcjp3acND3eHo5IXvVa1Qm4Pl9v3k3H7RroVfm5PHT6fv03NnLeHpk3vfGUqlaeUIC73EvOJzUVBV7th2gWZtGmcoNHfMtf85fzdOnKenrtFotVtZWKJVKLC0tSU1V8fiR4R7oXrZqGcKCwogIiUCVquLQ9iM0aF1Pr0z77u3YtnIHiWnH0gdxumuE90oX48rpK6jVGpKTkrnrF0DtpjUNlh10x8yIoAii0o6ZJ3eeoNYLx0xeOGbGZ3HMNJYSVUoRHRxJTGg06lQVZ3aeokor/X3oUdqLm6d0FWz//65TtWXN9PXyGT80ag0pSU8JvRlExcZVDP4zPBOYzfn2cVwC964GoFEV7Aefvw0ak9y9jCXbypIkSZluE2a17oXtQ4DFgCVQE7ACvIH/JElq8kZJc8nE0RVl0VKoAvz11xdxxKxafVKO7DJGrBxRuLphWqo0Kn+/l5axbNOOlHNnDJgqd5JvBlK4dV0ArCqXxtzTBVM3RyOnej1O1UvRxvdnGq8ZTaH3C+6jx2p0a8Kto1eMmsHBzZHYtC5qAHERsTi88H3YOGc9DTs3Ycnp5YxdOZE/Jyx98WOo92EDTm43bGXJxd2ZqPDo9OWoiGic3TPfuGjerjEbDq9ixrJpuHq4pK83tzBn7f4/WbV7KU3aGL6S5e7uRlhYxt388LBI3N1dX1r+8y+7cvBA5n3cuUs7tmzOv8fR/Mjdw5Wwey/se4+X7/sven6Mr++x9GVLSwsOH9/GgcOb+aB9i5e+L6+4uDkTGRaVvhwVEY3rC9/9shXex83TlaO++pcNB3YeIulJEsev7eHQxR0sX7iGhw8SDJIbwMnNiejwmPTlmIgYnN30b6Z6l/DCu4QXC/6Zy6Kd86jVRHexftfvLrWb1sLC0oLC9oWoWq8yLs/9ThuCo5sjcdkcMzfMWU+jzk344/Ryxq+cyLLnjpku3q78vmcOUzf8TNma5QyW+5kirg7Eh2fkvx8Rh72r/k270JtBVG9bB4BqrWtjZWeNTRFbQm8GU7FJVcwtzbG1t6NM3Qo4uGe+ES4Ib0tOuuFZP7+QNkNedreh+wBVZFlWS5I0C9gjy3ITSZKWANsBwz7u3MISm0ETSVq/EJL1m8mtug8gedMy0ObTnpSWVhSaMIXERfPQPsm6id+sclUs27bjwXeZxwblVzGLN+M+oS+lds8lWQ4m6UYAqAvOXZf4a0HsqDUU1ZOnuDerTKPlw9nVYISxY7224nXLUb1bE5Z2nWzUHCZZNM1rtVq95QYdGnF082F2/vEP71eTGDxnGMNbDk4vV7rK+zxNekqooce+mWRxu+uF7McPnGTfNl9SU1Lp+mUnpviM59uuQwD4oHoXYqJi8SzqwdItPty5GcC94DBDJAdeFl+beSXwcbcOVK1WkfZteuitd3V1plx5icMHjT/esyAxyWLnv2zff9KtI1WqVqR9m+7p6yqWaURkZDTF3vNmx+7V+N24RVCg4b7/WefX3z5m6jB+GDIlU7mK1cqj1mhoXOkDChUpxJodS/nv+FnuBYfnZeTnsmVe9+K+V5oq8SruyZCuw3Fxd2betjl81ewbzh2/QJkqEgt3+PAg7iE3LvihNnirQfbHnQYdGnFk82F2pB0zh84ZxnctB3M/Op6+db8h8cEjSlQoyZg/xjK05SCSDNiNLSff/Y0//UWPKb2p37Upt876ER8Rh0at4caJKxSvVJKxW3/iUVwCdy7eQl2Arh/+n2kKaDe8l1aWJEkaBYwGCkuSFP3cJmtgbQ4/Ww1YAHYAsiyHSJJk9uZx34BSifWgSaT8dwjVhcwNYsr33se6v26AsoltYUwr1SJJrUZ1yXiDBdMplRSeOIWnhw+ScjLrixBl8RLYDR/Fw7Gj0T4y3F253NIkJhE2em76snRiGSmhUa94R/6ieu6kEnH4Cia/KDF3sCUlvuB03XMt403nX/uw6qvfSHpg3NxxkbE4PXdn0NHdiftR+l1GmndrybQvJwFw66KMuYU5dg6FSIh7CED9DxtyaofhL9ajw6P1Wopc3V2IiYzVK/Pwfsbv5tY1OxgyPmMsWUyUrmxYSDjn/71EmYqlDVpZCg+PxNPTPX3Zw9ONyMjoTOUaN6nHiFEDaN+mOykpKXrbOn30Abt3HkClUuV53ndJeFgknl4v7PuIrPf98NH9M+37Z/9PwUGhnDxxhkqVyxm0shQVEY2bZ0ZLmKu7C9GRGa01NrbWlC5Tkr+26SYPcHJxZOHq3xnwxUjaf9Sak4f/Q6VSEx97n4tnr1ChcjmDVZZiImJx8choBXN2dyY2Ku6FMjHcuHgTtUpNRGgkoXdD8Sruhf8VmdU+61jtsw6AH+eP5V7gPQwpLjIWxxeOmfFZHDOnPnfMNLMwp5BDIR7GPSQxRddNPuD6XSKDI/Eo7snda3cwlPuRcTh4ZOS3d3fkQfR9vTIPou+zoN8MACysLanepg5Jj3Q3jXct2MquBVsB6Dt3KFGBhhnrJuRO1reC8r9XdcNbiq4L3YG0P5+9vGVZzm7KnWXAOUmSlgL/AfMBJElyBgzaadaq10g04cGkHNiS5fZHo7/g0ajPeTTqc1LPHydptU/+qCgBdiO+RxUSTNKWjVluVzi7UHjiVBJ++wl1mGEP1LmlsLPBxExXV7f/tBWPz95AY6TBmW/C0jlj+J1DlRKYKEwKVEWpsIcjPRYPY/OwhcQFRho7Dneu3Ma9uAcu3q6YmplS/8OGnPPV71YaGx5DxfqVAPAs5YWZhVl6RcnExIS67eobfLwSwI3L/hQt4YVHUXdMzUxp3ak5Rw/o35hxcsnoHtO4dQMC0waR2xW2w8xcd/+oiENhqtSsmGliiLx28cI1SpR8j6LFvDAzM+OjLu3Yt/uQXpmKlcoxa+5Uunf7ltjYzIfwLh+3Z8sm0QXvdV28cJWSJYtl7Puu7di7J/O+n+0zje6ffEtsTMa+L1ykEObm5gA4ONpTu051vYkhDOHaJT+KlfDGs6gHZmamfNC5FUf2Z9ywSHz0mHplW9GiRida1OjElQvXGfDFSG5cuUlEWBS1G+gGvFtZW1K5egUC7gQZLLv/ZX+8invi7u2GqZkpzTs25dQB/XP/iX2nqFZPNxamsH0hvEt4ER4SgUKhoJB9IQBKlC1BybIlOHfMsBNEvXjMbPCSY2al546Z5hZmPIx7SCGHQigUuss/V29X3It7EBVi2PNA4JU7uL7njpOXC0ozU2p/WJ/Lvuf0ytja26W3QLUb0JmTGw8DuskhbIrYAuBVphheZYpx44Rxu5ILOfPOTR0uy/JD4CHQ/nU/VJbluZIkHQTKArNkWfZPWx8DZB79mUeUpStgXr8l6tAAbCcvBiB5y3IUDrq7wClH8+/J3bR8RSxbtkYVcBfzxcsAeLz8DxQuurt4ybt2YP1FT0wKFcZuiG7GOa1azYOBhp86Nivec0diU6cipvaFKPPvCqLmrMPEVAlA/Lp9WJbywmvmcLQaDU9vh3Dvex8jJ9ZXb+FAXOqWxcLBjo7n53Ft5mYUprpflzurD+Hdvhalv2yBRqVGnZzKv/3nGzmxvk98BlGiTlms7e0Y/d88Ds3egtJMt//Prj1EsyEfYW1vR4dpvQDQqDQs7GC82Qg1ag3LJixh/F+TUCgVHN54kHu3Q+k2vDt3r97h/MGzrJq2nH6/DqL9Nx3RarUsGJHRMlmudnniIuKINkLrpFqt5rexs1m4fhYKpZLt63cRIAfSf3Rv/C77c+zAST7r/TGNWzdArVLx8MEjJg6dBkCJ0sUYN2M0Wo0GE4WCFfPWGLyypFarGT1yMpv/WY5SoWTt6s34+9/hh3FDuXTpGvv2HGbytNHY2Fqz4q95ANy7F06PbrqZIr2LeuLh6capk2cNmvtdoFarGT1iMlv+WYFSqWTt6k3437zND+OHcvnidfbuOcSUn77HxtaalavT9n3aFOGSVJLZPtPQaDQoFArmzFpi8MqSWq1m2pgZLNvgg0KpYOu6ndyRAxj8fV+uX76pV3F60brlm/hp7gR2Hv8bTGDb37u45We4/Gq1hjnj5/H7ut9QKBTs2bCXoFvBfD3yK+QrMqd8/+Ps0XPUbFyDv44sR6NWs3DqUhLuJ2BuYcb8rXMAeJz4mGlDfkGtNuyl3LNj5oS0Y+ahjQcJvR3Kp2nHzHMHz7Jy2nIG/DqID9OOmfPSjpnlapfn0+E90KjUaDQaloxdmD6JhSHzr5mwjOF/jUehVHBy42HCb9+j07BuBF27y+WD55HqlKfr6B5otVpunfVjzQTdtZDSTMkPm6YCkJSYxB/DfNAYeP8/r7vPYErUKYuNvR1j/5uP7+zNKNNuBp9eexBb58IM2fETlrZWaLVaGnzdlpktR/G0AN0gfls0WfV/LQBMXtY/+hlJkuoB04ES6CpXJoBWluU8Hc34sFeLgtpaR8q9VGNHyJXIO4WMHSFXrj8tuPmvmxfYrz0AsrbgtK696O7TuOwL5WPBjzN33ypo5ICLxo7wRt4vbthhuG+bm7VxZ8PMDWczO2NHyBUnUxtjR8iVIibmxo7wxpww7KiQt2160PoCV/PY7N4jVxc5XSPWGuVnzskED38CU4HT6MYgCYIgCIIgCIIg5FhBvR2ck8pSkizL6/I8iSAIgiAIgiAI76R8Ou90trJ9zhKwR5KktnmeRBAEQRAEQRCEd1JBfShtTlqWvgXGSpL0CHiKgcYsCYIgCIIgCIIgGFNOKks18jyFIAiCIAiCIAjvrIL6UNpsu+HJshwMhAG2gA0QlrZOEARBEARBEAQhW9pcvowl25YlSZJqAFvI6IJnKklSF1mW83SOV9OSbnn58XlKYVWwpyB2fvrI2BFypdjtgjuVaaLKytgRcuWJqbWxI7yxZPOCPdlnqrZg5w97HFvgp+AuqMIexxo7whtLsVIZO0KuJGkL9qNGEpUF95j/WGFp7Aj/d4w57ig3ctINby7QS5blwwCSJDUF5gH18zKYIAiCIBQUtwIvGTvCGyv5XmVjRxAE4f/Auzwbns2zihKALMtH0HXHEwRBEARBEARBeGflpLL0JK01CQBJkhoDT/IukiAIgiAIgiAI75J3dswSMBTYLEnSU3RZLYAueZpKEARBEARBEIR3xjs7ZkmW5XOSJJUCJHQTPPjLslywRyQKgiAIgiAIgmAw7+yYJUmSWgDWsixfl2X5GmAjSVKzvI8mCIIgCIIgCMK7QJPLl7HkpBveDKDac8sJwO8vrMuXTAo5YNGhHya2hUGrJfXiEVTn9uuVMavTDmWFerryCgUmTp48mdUfkh8bI3I6E3snLHuOxKSQPWi0pJ7aS+qR7XpllKUrYtVvIprYSABUl/8lZe86Y8TNROHiTOGxY1E6OqDVaEjauYsnm7folbFs2QKb7p8BoE1KImHmbFR37xojbiYlZw3AoWUNUmMfcrnpsEzblXbWlJ4/FAtPJ0xMlYQv2k70hiNGSJq1Rr/3oWiLKiTFJrClxQ8vLedUuQQdd0zi8IB5BO4+Z8CEL/fp9G8p16waiXEJTG89KtN2l5IefDajH17li7P79w0c/WOXEVLqq9a4On0n9UWhVHDg7wNsXrhJb7uzhzPDZg3HppANCqWCVb+u5PyR89gVseOHxWMpXbk0hzYdZPGExUbJX79pHcZMG4ZSqWDL2h38OW+13vaO3doxYsIgoiNjAFi/fDNb1u5AKl+aH6ePxtbWBo1Gw9I5K9m3/aBBszdv0Yhfpo9HqVSyetVG5sxaord9wKCv+eKrT1CrVMTGxjO4/xhCQ8MBiH0o43dDBuBeaATdu31r0OzvghYtG/Hb9AkolQpWrdrI7Jn63+GBg7+hZ89PUKnVxMbGM7DfaEJDw/H29mDN+kUolUrMTE1Zsvgvlv9p2PNXo2b1+PHnkSgVSjas2cYSn5VZlmvzYXMWrJhBpxY9uHb5JpWqluenWeMBMDExwWf6Eg7sMe7xv26TWoyYOgSFQsH29btZNX9tpjItPmxKnxG9QKvllt8dfhw41QhJM9RoUp3+k/qjUCrYt34fGxZu1Nveb2JfKtfVzdRoYWVBEccifFShKwB7g3YT5B8EQHR4DBO/nmTI6FRuXJWvJvZGoVRw+G9fti/aqrfd0cOJgbOGYl3IBoVCwbrfVnP5yAWUZqb0/bk/JSqVQqvRsHLyn/idvm7Q7MLry0llyUSW5fRxVbIsayRJUuZhprdHoyHl4Do0kUFgbonVN1NRB15DGxueXiT19G5ST+8GQFm6Kma12xi9ogSAWs3TLX+gCb0LFlbYjPFBffMSmsgQ/WJ3rpO0aJJxMr6KWs2jhQtR3bqNiZUVjsuW8vTcedTBGc8zVkdEED94KNrERMxr16LQqBHE9xtgxNAZYjYeJXLFXkr7DMlyu1uvNiTdCsW/5y+YOhai6gkfYraeQJuaP575cWvTcW6s9KXJnJdf/JkoTKg9thv3jl01YLLsnd18jJOr9tN91sAstz95kMjWSSup2KqmgZNlTaFQ0H9af8b3GE9cRCyzd87mjO9pQm+HppfpNuRTTuw6wd41e/Au7c2klZP5pv7XpDxNYc3M1RSTilHs/WJGyz/+15H0+WQIkeHRbNi/giP7TxBwK0iv3L7tB/l57Ey9dclJyYwdNIWQwFCcXZ3Y6LuSU0dO8ygh0WDZZ8yaROcOPQkPi+Tw8a3s3XMI2f9OepmrV/1o1rATSUnJfN27O5Omfc83PYcCkJSUTKN6HQyS9V2kUCiYOWsyHT/8krCwSI6e+Ic9uw/q7/8rN2jcsCNJScl807sHU6aNoVfPIURGxtCy2cekpKRgY2PN6XP72LP7IJGR0QbLPum37+nZdQCR4VFs813DoX3HuHMrUK+cja01Pft+xqXz19LX3fK/S6cWn6NWq3F2dWL30b85tP84BGmv7QAAIABJREFUarVxnnWmUCgY/fMwBn06nKiIGFbtWcrx/ScJvJ1xvvUu7sVXg3vQu+MAHj1MxN6xiFGyPqNQKBg0bSBjuo8lNiKWebt8+M/3NCG3M65xFk9emv73jl91oGSFkunLKckp9G+T9Tkir5koFHw99Vt+6jGRuMg4ftkxg/MHzxJ2+156mY8Gf8J/u07hu2YfnqW9GLNiAoMb9KX5Zy0BGNV6KIUcC/PDqgmM/XAkWq0xpy8wHG0BHbOUk9nwHkmSVPvZQtrf80FtInvaxAe6ihJASjKa2HBM7BxeWt60fF1UN/4zTLhsaBPu6ypKAE+TUEeGYlLE0bihXoMmLh7VrduArtVIFRyM0tlJr0zq9RtoE3UXVak3/FA6Oxs858sknPZDdf8VF3xaLUpb3QNkldaWqB4kolXln4eCRp6Refrg1Res5Xu1InDPOZJjEwyUKmcCzvrz+OHLDzGJcQmEXg1AnU/29/tV3iciKJyokEhUqSqO7zxOnVZ19MpotVqs7XQPb7SxsyE+Kh6Ap0lP8TvnR0qy8YaBVqxWjpDAe9wLDkeVqmLvP740a9MoR+8NDgglJFBXKYyJiiU+9j72jvZ5GVdP9RqVCQgIJjgolNTUVLZu3s0H7VrolTl5/DRJSckAnDt7GU+PgvvA8/ymRtr+D0rb/1s276Jd+5Z6ZU48v//PXcLTU7f/U1NTSUlJAcDCwhyFIieXI29P5WoVCA68R2hwGKmpKnZt20+Ltk0ylRs2ZgBL563i6dOn6euSk5LTK0YWFuZGv9AtX7UsoUFhhIVEoEpV4bv9EI1bN9Ar06lHezat3Majh7rzwv24B8aImk6qIhEeFEFk2nHz2I5j1GtV96Xlm3RswtHtRw0X8BVKVSlNVFAE0aFRqFNV/LvzJDVb1tYvpNVilXaNYG1nw/1o3THfq7Q31/7V3aBMiHvI44THlKhUyqD5jamgdsPLydFpNPCPJEkHJUk6CGwDhudtrLfPpLATCrdiaMJe0s3L1BxlyUqobuaPrkjPM3FwQeldEnWQnGmbsnhZrMcuwGrgFBTuRY2QLntKNzfMSpcm1e/mS8tYtW/H0zNnDZgqdyKW78WqtBc1Li+jypFZBP24HArQnSFrN3vea1uDm6sPGTtKgefo5khMeGz6cmxELI6u+jc21s1eS9POTVl5ZhWTVk1m8UTjdLfLioubM5HhGXfzo8KjcXHLfOOiZfumbD2yhlnLfsbNwyXT9gpVy2FmZkZo0L1M2/KKu4crYfci0pfDwyJx93B9afkven6Mr++x9GVLSwsOH9/GgcOb+aB9i5e+T8iau4cb9/T2fwQe7i/f/19++Qm+BzL2v6enO/+e2YOffIo5s5YYrFUJwNXdmYjwyPTlyPBoXN31v9flKkq4e7py5MCJTO+vXK0Ce09uYs/xjfw48mejtSoBOLs5EfX873BEDM7u+r/DRUt4U7SEN8u2L2D5zkXUbVLL0DH1OLk5EhMek74cExGLo1vWN4RdPF1w83bj8qkr6evMLcyZv9uHudtnU6/1yytZecHBzYG4iIxjflxEHPZu+jfiN835m4adm7Dw9DLGrPyRFRP+ACDYL4iaLWuhUCpw9nahRIWSOHro30h+lxXUylJOZsP7T5KkckBddLPh/SvL8v1XvUeSpMLAD0An4NlvbDSwHfhVlmXD3tIws8Ci61BSDqyBlKQsiyjfr4o69Fb+6IL3PAtLrPqO5+nmJZCs/3grdehdEn/sCU+TUZavyf/Yu+/wpqo/juPvjO7SUkp3C7SAYe8NCggFWYIiQxBBEUFAZLvYSxkiWxGVIciWWVZZMmQjuw2l0J1uoHRn/f4Iv5bQllWatHhePH0ekvNN8ultbnLPveeeazN4EmlTPjFT0PxJbGwoPX0qKYuXoE/P//JclnXrYNupI0nDPjdxuhfn1KoOadfvcP29yVhXcKfaxkmktBmDNjX/91dx03TKB5ydtQG9ruR08IotSd5xBY/3m1u+3ZJDmw+ybcU2qtSrwpgFYxjWdqjZ90iD4ZyLxz2e6uiB4+zZdgB1tpqeH77DzMWTGNh9eE57WVdnvlsymW9HTDPp75Rv9gJev2evrtSpW5POb/XJua9mlTeIjY2nfAUfdgb8wY3rNwm7E5Hv44W88ln8BS7/Xr27UrdeTTq0fz/nvuhoFc0ad8Td3ZX1G5ezffteEuIT8338y5bfe+fRFVcikfDtjDGMHz4538dfvniNDi16ULGyL3OXTuXooZNkZ2UXVdwnepb1QCaT4ePrzeDuI3DzcOWXbYvp/eYAUk00ZDaP51h3W73dkuN7jqPT5W4u923Sj+S4ZNzLuTNnw2zuBIehClfl+/iXTUJ+7x3jm83ffp2/txxm94odVK6nYPiCkYz1H8GRTQfxquTNd7t+ICE6npsXg9EVk1ESQsGe6bi3Uqm8q1Qq9yiVyoCndZQe2gTcBVoplUpnpVLpDLR+eN/mJz7yZZPKsHrvCzTX/kGrPF9gmbxa8RmCl0Mqw2bQBNRnj6C59E/e9sx0yDIMb9BePwcyORI7BxOHfAKZjNLTp5IReJCsY3n3zAHI/fxwGD+Ou19/iz6leA0HexLX3m+StOcMAJlhsWRFxGNTycvMqZ6dSy1f3lw6nN6nfsS3UyOazxxA+fb1zR2rREpSJeLyyJ7Bsh5lSY5PMqrx792O47sN60DwxWAsrSxxKFM81tU4VbzRkSI3T1cSYhOMau7fTUGdbRgquGXtDqrVqpLTZmdvy7J181n8/XKuXLhumtAPxUTH4uXtkXPb08udWFXeoxMtWzVj9PjP6NPr05yhX0DOkYzwsEhOHD9DrdrVij70KyQmOhZvo+XvgSqfo0OtWjdn7Lhh9OppvPz/LzY2nqCgEJo1M915iLEx8Xg8MiTT3dOVuEfe93b2drxWpSJ/7ljB3xd3U7d+TZavXUDNOlWNnic05A4Z6RkoqlbEXOJVCbg9ug57uJAYm5in5tj+E2g1WmIiVUSERlLO19vUUXMkqhJx8cw9+uXiUTZnePLjWr3dMs8QvP/XxkbEcuX0FSpVN93yT4pNwtkj9zPf2cOZu49lb92rLad2nwQg5KISCysLSpVxQKfVsWb673zZcRTzBn2HrYMdqrAY/itK6kVpi2qQcAWlUjlbqVTmHONWKpWxSqVyNmDSsWKWnT9BnxiD5szegousbJCVr4L25kXTBXsG1v1GoouNRH14W77tEofccwOk5V8DiQR9WvHpcDh+OR5NeATpm/LvH0tdXSk9Yzr3Z85CG2W6oTsvQ1Z0IqVb1ATAoqwj1hU9yYyIM3OqZ7eh2Wg2NB3FhqajuBNwlpPfriJ8/wVzxyqRbl6+iaevF24+bsgt5LzR5Q3OBJ4xqkmITqB28zoAeFfywcLKgvtJ980RN49r/wZRzs8Hr3IeyC3kdOjmz5H9xjs3yrrmDo9p3f51boeEASC3kLNw1Wx2bt7DgV2HTRkbgIsXrlCxYnnKlffGwsKCd9/rxN49xkNLa9aqxo+LZtCn52ASE3I3aBxLO2BpaQlAGWcnGjepbzQxgfB0Fy5cwa9iBco/XP7d3+vMngDj2RBr1a7GwkUz6N3zUxITcncieHq6Y21tBUDp0g40aVKfkJDbJst+5d/rVPDzwbucJxYWcjq/055D+3KHCKY+SKWhog0t63WmZb3O/HvhKoM/GMnVS0F4l/NEJjPMc+Xp7YFvpQpERZjmqEZ+blwKppyvN54+hnXYv2sbjh04aVTz977j1G9mmMTYsYwj5Sr6EB1hvo105WUlXhU8cX/4udny7ZacCjydp87bzxt7x1LcuJA7jN/e0R4LSwsAHJwcqN6gGuEhpjsiHHo5BHdfD1x8XJFZyGnWpQXnA41PI0iMSaBG81oAeFXyxsLKkpSk+1haW2JlY3jf12xRG51GazQxxKtOJyncj7k8y2x4LyJcoVCMB1Yrlco4AIVC4QYMACKf9MCXSerzGha1XkcXF4H1JzMBUB/ZhMTR8MWvuWj4cpcrGqC9fRXUWQU+l6nJKlbHonFbtNF3sP16CQBZO1cjLWPYE6M+vgd53RZYvN4JdFpQZ5Px+/fmjGzEomZNbN5qjzo0FOfffgXgwYoVyFwN49kzdu7EfkB/pI4OOIx6ODW3VkvSp8Vj6t7Ky0bh2Kw68jKlqH/hFyLnbURiYfhyjFtzgMgfN1N54XBqH56PRCIhfOZaNMkPzJw6V+slw/BsWhXrMva8f24RF3/YilRuyB+01vQbtc+j36LPqdSkGnZOpZh8ain7ftyC7OGy/2fdQUq5ODJ65yys7W3Q6/W0/LgD3/uPJctMQyB1Wh0/T/yJaX9MRyqTErgxkIibEfQd/QEhV0M4G3iG32b8yuezR9Dtk67o9bBg9I85j//t5O/YlrJFbiGnSfumTPxggtFMekVNq9Uy6+t5LN+wEJlMyrb1uwlV3mHY+EFcvxzM0f3H+WBQT1q1ex2tVsv9eylMGGGYcvitt9tSv0ldSjs50q1XJwC+HTEd5fUQk2UfP2YqW7evRCaTse6PzQQHhfD1hC+4dPEae/ccYtrML7Gzt2XVH4uB3CnCFYqK/LhoBjqdDqlUyoL5y0Vn6TlptVrGjZnCth2rkcmk/LHGsPy/nTCSixevsnfPIabP/Bo7eztWrzV8j0VFxtC756coqlRi5nffoNfrDdNvL1yRM427qbJP/Wo2qzYvRSqVsuXPnYQobzPyqyFcvXSDQ/uOFfjYBo3rMviLAWjUGnR6HZPHfcfdZPNNmKDVapnz7QIW/TkPmUzKzg17uH0zjMHjPibospJjB05y6uhZGrdsyMaja9BpdSycvoz7d823c1Wn1bFk4jJmrZ2JVCZl/8YDhN8M58Mx/bh5JYTTDztOrbu24ujOo0aPLVfJhy++H4FOp0cqlbBx6SajWfRMkf33SSv4Zs1kpDIZRzcdJCokkh6j3+f2lVtcOHiOP2asZPD3w+g0sAt6Pfw0ZhEAjmVL882ayej1OpJjk1kyaoHJchcHJfWitJKiGF+uUCicgK+ArsD/jw3HATsxnLP01KF8aTM+MP9g/heki0l6elExlnatZJx3U5DbISVn1sDHXZfZmDtCodyQF4+p019EiK74dHZfRFhWyf7ciU4zzbkqReXmnX/NHeGFVaxQ29wRXpiLjXmnwC6sMpb25o5QKE4yW3NHeGFOUmtzRyiUjeHbS9xE3D+UK9y2/ZiItWb5nYvkyNLDztCXD3+MKBSKj4CVRfG6giAIgiAIgiAIL4tpL2xgMNUMrykIgiAIgiAIgpmU1AkeiuTIkkKhuFJAkwQo+CIMgiAIgiAIgiC8csw5SUNhFNUED25AewxThT9KAuQzB7YgCIIgCIIgCK+qkjrBQ1F1lnYD9kql8tLjDQqF4mgRvaYgCIIgCIIgCMVQSZ25ragmeBj4hLY+BbUJgiAIgiAIgiAUF0V1ZKnQpD7mu7J0YUksLMwdoVBs0kx3vYKi4Jacau4ILywloWS/d1KkxfYj5anSpSV3ClyAbEutuSMUilZfUgdoGKY9L8nTb5dkMWkle8r8LF22uSMUSoZFyc2fIbczd4T/HF0JPbZUcrdsBEEQBEF4KULDLps7wgspV66GuSMIgvCMSuouMdFZEgRBEARBEAShSJXM40qisyQIgiAIgiAIwitAoVD8DnQG4pVKZZ5DzwqFoi/w5cObqcBnSqXyiYfWzXFRWkEQBEEQBEEQ/kN0hfx5RquAt57QfgdoqVQqawHTgV+e9oTiyJIgCIIgCIIgCEXKFBelVSqVxxQKRYUntD96vdfTwFNnlBOdJUEQBEEQBEEQilQxnA1vILD3aUWvdGcpNiWdCTsvkJSWiUQioXudCvRtVMmoJiUjm8kBF4m6m4alXMbUTvWo5OpgpsS5JKXKYNnpEyT2jqDXo7n0N5oLgUY18kZvIa/W1HBDKkXi7EnG4hGQmWaGxMYkZVyw/fQrJI5OoNeTfSSA7MC/8q2V+Sqwm7SY9KUz0Jw/ZuKkz0bm7oLbrHHIyjqBTk/Klj3cX7vd3LEKVGPBYFz865GdmMLJluPytFcY2hnP7i0AkMhl2Ff24nC1Qajvmf+9037uIPza1CE9KYXV/l/naa/oX4/mY99Dr9Oj02o5OnUt0edumiHps/twzmfUfLM+D5LuM639GHPHyaNBq/p8NuUzpDIp+9bvY+OyTUbtQyZ/Su2mhqmxrWysKO1cmndrvAfA3rAAwoLDAIiPSWDyx1NMGR2AFq2b8M3MMUhlUras3cGvi9fkW9eu85ss/P173vPvz/XLQcjlMqb/OIFqNRXI5DJ2bNrDikWrTZq9rf8bzJ4zCZlMyurVm/jxh5+N2od9PpD+/Xui0WpJTExm2JDxREbG4OPjydr1PyGTybCQy1n+8xp+/+1Pk2Z/lfj7t2TevMnIZDJWrdrAvHk/GbWPGPEJAwb0RqPRkJiYzJAh44iIiDZTWoNWbZozddZXyGQy1v+xlaULfzNq/2BATwZ80hutVkdaWjpfjppCiPI2crmcuQunUrN2VWRyOVs27GTpgl9Nnr956yZ8NWMUMpmUret28tviP4zau/bqxJhJw4mPTQBg/e9b2LpuJ4rqlZk4Zzz29nbodDp+WbCKfTsOmjR7o1YN+WLaMKRSKbvX72Hd0g15alp3acnHo/uj1+u5dSOUacNnAeDq6cqX88bg6ukCehjX72tio+JMmt9cilNXSaFQtMbQWWrxtNpXurMkk0oZ07YmVd1Lk5al5v2VR2ji60pFl9zO0K//KFG4OfLje024k/iA7/Zf5pe+T11uRU6v05J9ZCP6uHCwtMa6/2S0YdfRJ8Xk1GjO7kNzdh8Asoq1kTdsXyw6SgBotWSs/xldeAhY22A/9Wc01y+giwk3rpNIse45CM3V8+bJ+aw0WhLn/kJ20C0ktjZ4b1pC+j8XUd8untekit7wNxG/7afmkmH5toct203Yst0AuLSrR4XBHYtFRwng2uZj/Ls6kA4/Ds63PeLkdUIDLwJQtooPXZZ9zso3x5sy4nM7teUoR1bv46P5w80dJQ+pVMrwGcP4qs83JKoSWbx7EacCTxMRkvve/nlq7pDurgPepmKNijm3szOz+eyt/N9npiCVSpk4ezwDewwnLiaeTQdWc2T/cUJv3jGqs7Wzpd+gXlw+fzXnvvZvt8XS0oKurfpgbWPF7uMbCdh2gJhIlcmy/zB/Kl27fEh0dCxHj29nT8BBlMG3cmquXL5Oy9e7kpGRycBP+jJtxld81H8EsbEJ+L/Zg+zsbOzsbDl9bh97Ag4SGxtvkuyvEqlUyoIF0+nUqS/R0bGcOLGT3bsPEhwcklNz6dJ1mjfvTEZGJoMGfcDMmV/Tr5/51mepVMqMORPo8+4gVDGxBBzayIF9RwhR3s6p2b41gLWrDDs+/N9qxeQZ4/mgxxA6d22HpZUlbVu8i7WNNUdO7WDH1j1ERcYU9HJFkn/C92MZ1HMEsTHxbNy/kiP7j3P7ZphR3b4dB5n1zQ9G92VmZPLN8GlE3InExa0smwJXcfLIaR6kmOYai1KplNEzRzDq/fEkqBJYsWcZJw+cIiwkd/vG29eLD4a/z2fdRpB6P5XSzqVz2iYs/JI1i/7k/PEL2Nhao9MVpy7Ef4NCoagF/Ap0UCqVT71Y2ys9wYOLvTVV3Q1vUDsrC/ycSxGfmmlUczvxAY0ruADgW7YUMffTSXqsxizS7hs6SgDZmeiSVEhKlS6wXFatCZqg0yYK93T6+8mGjhJAZga6mHCkTmXz1Fn6d0N9/jj6lHsmTvh8tInJZAcZNmD06Rmob0cid8v7+xQXd08HP3Pnx+Od5qi2/fP0QhOJPqsk817BX3rq9Kyc/1vYWqHXF/8vmpCzQaTfL54XS1bUURATpiI2IhaNWsPfO/+mWbumBda36tqKozuOmi7gU9SqV52IO1FEhcegVmvYs+0Ab771Rp66L74azG9L/iArK/cimnq9HhtbG2QyGdbW1qjVGtIemG6nQYMGtbl9O5ywsEjUajVbt+ymU2d/o5rjx06TkWH4Tjp37l+8vNwBUKvVZGcbfhcrK0uk0lf667xINWxYh9DQsJy/w+bNu+j82N/h2LFTOX+Hs2f/xcvLwxxRc9SpX5OwOxFEhEehVmvY8dde2nV406gm9ZH3sq2tTc5npV6vxzbnfW+FOltN6gPTfj7VrFctZ73VqDXs3R6Y73qbn/DbkUTciQQgIS6R5MS7ODk7FWVcI1XrViE6LBpVhAqNWsOhHUdo0b6ZUU2XPp3YtmonqQ8/9+8lGbZxKlQuj0wu4/zxCwBkpGeSlZnFf4WJJnh4IoVCUQ74C+inVCqfaVjKf+bTNfpeGsFx96npabxCvebmyCGlYW/K1ZhkVPfTiXuQYY6IBZI4OCN1K4cu5nb+BXJLZL410CovmDbYM5KUdUNWvhKa0CDj+53KYlG/BdmHd5kp2YuRe7phWbUimVeCzR2l0KQ2lpRtXZu43WfMHeW5VGrfgI8Oz+GdVWPZP26FueOUaGXdnUmISci5naBKxNndOd9aVy9X3H3cuXQyd5ZVSytLlgQsYuGOH2nWvuBOVlFxdXchNjp3CEucKh43Dxejmqo1XsPdy42jgSeM7j+w6xAZ6Rkcu7qHQxd38vuytdy/l2KS3AAenu5EReUexYqJVuHp4VZg/Ycf9iTwwN85t728PPjnzB5uKE+yYP5ycVTpBXk+9neIjlbldErzM2BAL/bvP2qCZAXz8HBFFR2bczs2Jg4PD9c8df0H9ubEhb18O3UMk776DoCAnYGkp2dwMegIZ68EsnzpKu6Z8H0PD9fbmNz3a1xMPK7uLnnq/Du35q8ja5n/6yzcPfP+fjXqVsPCwoLIsKgizfsoF/eyxBt9ZiZQ1t1456mPnzc+ft4s276Qn3ctplGrhjn3p6akMWPFFH7b/zNDJ3z6n9rRoUNfqJ9noVAo1gOnDP9VRCkUioEKhWKIQqEY8rBkEuAMLFMoFJcUCsVThzaZfBieQqHYq1QqO5jyNdOzNYz96yzj2tbE3srCqO3jpq8xJ/AKPX89TGVXBxTujsiK0xvXwgqrd4ajPrQesvM/4iWrVAdd9K3iMwTvUVbW2H0+hYx1yyAz3ajJps9QMjetAH3JuaazxMYa9x8nkjT7Z/Rp6U9/QDHn2q4+984pi80QvGd1a/95bu0/j1cjBc3HvseWPt+bO1LJJck7PVFBR+tavd2S43uOo9PlrrN9m/QjOS4Z93LuzNkwmzvBYajCTTOMDUCSb37j9q+mj+LrEdPy1NWsVx2tTkfLWh1xKO3A2p2/cOrYWaLCTTMcKZ/oBS77Xr27UrdeTTq0fz/nvuhoFc0ad8Td3ZX1G5ezffteEuITiyruK+t5/g69e79DvXo18ffvVcSpnuIZ19vVv21g9W8b6Na9IyPGDGbUsG+pU78mOq2W+tXexLG0A38FrOb40dNEhJuuw5HvevvY7aMHjrNn2wHU2Wp6fvgOMxdPYmD33KGPZV2d+W7JZL4dMc20Iwzym9HtsdeXyWV4+3rx+XujcfVwYcm2BfR/cyAyuYxajWrwcfshxEfHMeWniXTo2Z6ADU+dY+CVYIq/klKpfP8p7Z8AnzzPcxZJZ0mhUNQroEkC1CmK1yyIWqtjzNYzdKzuTZsqXnna7a0smNa5PmD4oOm47ABepW1NGbFgUhlW7wxHc+MU2psFHzWSVW2E5kYxPDIgk2H7+RSy/zmE5sKJvM2+r2H72QQAJKUckdduRIZOi+biSVMnfTZyGe4LJvIg4DBpB4tpxufk0a1psRqC97yizyopXc4VGyd7Mu4Wz2FuxV2iKhEXz9w9ui4eZUmOS863ttXbLVkyYanRff+vjY2I5crpK1SqXtGknaU4VTzuXrlHY9w8XHNOCAews7elcpWKrNlmOGG/rKszy/6Yx9B+Y+n8bntOHD6FRqMlOfEuF89epkbtaibrLMVEx+LtnTucy9PLA1U+R4datW7O2HHD6PDW+zlD7x4VGxtPUFAIzZo1ZMf2/8ZG18sU/djfwcvLg5iYvCfct27dnC+/HE67dj3z/TuYkiomDo9Hjn65e7oR+8j7/nE7/trLrB8mwjDo1r0jRw+dRKPRkJSYzLmzl6hVt7pJO0txqnijI0Vunq4kPJb//t3co11b1u5g1MTccyPt7G1Ztm4+i79fzpUL14s+8CMSVImGyRkecvFwITHO+LSXeFUCNy4GodVoUUXGEhkaibevN/GqBEKu3UIVYfiMPLH/JNXqVfvPdJZKzq5xY0V1COUcMA/44bGfeUDBJ968ZHq9nqkBF/EtW4p+jSvnW5OSmY1aa/jz/XUpjPo+znmOPpmLZYeP0CXFoDl34AlFNsh8FGhvXTRdsGdkM3AsupgIsvdvybf9wdgPeDC2Lw/G9kV97hgZqxcV344S4DptNNm3I7m/Jv9Z/UoaeSkbnJpWI35fMZ9c4zGly+duGLvWqIDUUi46SoWgvKzEq4In7j5uyC3ktHy7JacC857/6O3njb1jKW5cyB1Oa+9oj4Wl4fPSwcmB6g2qER5i2klPrv57g/J+PniV88TCQk7Hd9pxZP/xnPbUB2k0q9qOtg260bZBNy5fuMbQfmO5fjkIVXQcjVs0AMDG1pra9Wtw+1aYybJfuHAFv4oVKF/eGwsLC7q/15k9AcazetWqXY2Fi2bQu+enJCbkbpB5erpjbW0FQOnSDjRpUp+QkAKGagtPdP78ZSpV8qV8eR8sLCzo0aMLAQHGs8/Wrl2dJUu+4733BpKQ8NTzwYvc5YvX8PUrh085Lyws5HR9twOB+44Y1fj6lcv5f5t2b3An1LBuxkSpaPZGIwBsbG2o16BWnglRitq1f4Mo5+eDVzkP5BZyOnTzN1pvwbBj4/9at3+d2yFhAMgt5CxcNZudm/dwYNdhU8YGIPhSMN6+Xnj4uCObRFddAAAgAElEQVS3kNOma2tOHDDe6Xh830nqNjMcG3B0csDbz5uYCBXBl5SUKl2K0mUcAajXvC5hN8PzvIZQvBTVMLwgYLBSqQx5vEGhUEQW0WvmcSkqid3XIqns4kDPXw0r1OetqhGbYjgnqUc9X+4kPmDCrgvIJBL8ypZiSqeCDoqZltSrMvIazdHFRyIbMBWA7GNbkTqUAUBz6SgAstfqoQ27Dmrz7uV6nKxyDSybt0MbeRv7acsByNzyG1Jnw56k7CO7zRnvuVnXrU6pt9uSdfM23luWAZC8cCXpx8+ZOVn+av/8OU7NqmFZphSt/l1KyNwtSOUyACLXGDbG3Do2IunvK2jTi9fJpZ0WD8O7aVVsnOz59Mwi/pm/FamFIfuVtYep3LEh1bq3QKfWosnMJmDYEjMnfrqBi75A0aQ69k6l+P7Uz+z6cRMnN5n+Sz4/Oq2OJROXMWvtTKQyKfs3HiD8ZjgfjunHzSshnH7YcWrdtRVHdx41emy5Sj588f0IdDo9UqmEjUs3Gc2iZwparZYZX83l142LkMqk/PXnLm4pb/P5l59y7VJQng2wR/35+2ZmLpzErmMbQALbNuzm5o1bBdYXRfZxY6awbcdqZDIpf6zZTHBQCN9OGMnFi1fZu+cQ02d+jZ29HavXGt7nUZEx9O75KYoqlZj53Tfo9XokEgmLFq7gxnWlybK/SrRaLaNGTWLXrjXIZDJWr95EUFAIEyeO5uLFKwQEHGTWrG+ws7Nl3TrD539kZAw9ejzXSJ6Xnnni+Fms27IcqUzGxnXbuBkcytivh3H53+sE7jvKgEF9aNGyCRq1hvv3Uhg17BsAVv22nvlLZnDon+1IJBI2/bmdoBumvfyCVqtl1tfzWL5hITKZlG3rdxOqvMOw8YO4fjmYo/uP88GgnrRq9zparZb791KYMGI6AG+93Zb6TepS2smRbr06AfDtiOkor+fZ5Cyi7Dp+nLCYH/6cjVQqJWDjXsJuhjNw7ACCLys5GXiKs0fP0ahlA/448jtarZafpv9CysMjZUunLWfBxnkggZtXQ9j1Z4BJchcHxfA6S89EUhTjPBUKxXvAVaVSmeeTW6FQdFMqlU+9QE3G6q9K5hIF9LEle7589Y3iOR32s0q8UHJnxA9JMN2MPkXhulXJXfY3pcWr0/i87mgfmDtCoURm5T/0rySITiv55wmFhl1+elExVK5cDXNHKBRnm1LmjlAopS3szR3hhTnJ7cwdoVCORx/K7+ypYm1Uhd6F2rb/MWyDWX7nItmyUSqV+Y+7MijZW4OCIAiCIAiCIDwXcc7Ss5tqhtcUBEEQBEEQBEF4LkU1G96VApokQMEXkRAEQRAEQRAE4ZWjL6HnLBXVCQZuQHvg7mP3S4CSO0+xIAiCIAiCIAjPraQOwyuqztJuwF6pVF56vEGhUBwtotcUBEEQBEEQBKEYKqmz4RXVBA8Dn9DW55mexN37peUxtfyuTF2SyFNK9jVrHGLyXtSxpHB7OK19SXVfXXJnRnpgaWnuCIWSLi0mF9N+QZkWanNHeGHZNhpzRyiUmLSkEj+rXEmVmJ7y9KJiTG1Vct/7WZYl9zOnpCqZXaWiO7IkCIIgCIJQ5CIirpk7wgvz8alu7giCIDyF6CwJgiAIgiAIglCkxDA8QRAEQRAEQRCEfIgJHgRBEARBEARBEPIhpg4XBEEQBEEQBEHIR0k9siQ1dwBBEARBEARBEITi6JU+spSl1vDxwq2oNVo0Oj1t61RkaMcmRjUXbkUz96/jhMQk8n3/t/CvW8lMaY3FpqQzYed5klKzkEige11f+jYyzpaSkc3k3ReIupeGpUzG1M71qOTqaKbExiSOzli9NxyJfWnQ61GfO4jm1J48dVLfalh2+giJVIY+/QGZv042Q9q8pC4ulBr/LdIyZUCnI3PPLjK2bTWqsXqzLba9DDPh6zMyeLBoPtrboeaIm0e5uZ/j0KYBmqT7BPuPyNMuc7Sj3NwRWJV3R5eVTcTYxWTejDBD0rwazh+Ep39dshJT2Nf6qzztLk2r0mLVaNIiEgCI2nOOGz9uM3XMAnWdO4jX3qxLWlIKy9rlzV+zWzNaDOkCQHZ6Jru/XUlckHmXfc2Wdek3+WOkMilHNxxk90/Gy9PZy4VBc4dRqowDafdS+WnkQu7GJgGw+vZmIoMN+ZNiEvnxk+9Mmr1Rq4aMmDYMqVRKwPo9rFu6IU9N6y4t+Wh0f/R6PbduhDJ9+CwAhnwziCZtGgOwZuFaDu88asroALzxZjMmzhqLTCpj49ptLF+0Kt+6t7q0YenKuXRr25erl4KoVbc6M+dPAAyXq1g0ZzkH9hwxYfK8/P1bMm/eZGQyGatWbWDevJ+M2keM+IQBA3qj0WhITExmyJBxREREmyltyefv35IffpiCTCZj5coNzJu3zKi9RYtGzJ07mZo1q9Kv33C2bTN8B7ds2ZQ5cybl1CkUFenXbzi7dh0waf7WbVowY/a3yGRS1q3ZwuIfVxi1f/hxLz7+pC9arZa0tHTGfjGJm8pQ3mjdjAlTxmBpYUG2Ws20iXM4ceyMSbO//mZTJswci0wmY9Pa7fzyhPV28e9zeKftB1y7HISXjwf7Tm7hTmg4AJfOX2XSONN+ZpqTGIZXDFnKZaz4/B1srSxRa7V8tGArLapWoJave06Nu1MppvVty5rDF82YNC+ZRMKYNjWp6uFEWpaa938/QhNfVyq6OOTU/PqPEoVbaX7s0ZQ7iQ/4bv8lfun7uhlTP0KnJXvvGnQxd8DSGpths9HeuoI+ISq3xtoWq7cHkblqJvr7iWDnUPDzmZpWS9rypWhuhSCxsaH0shVkXziPNiI8tyRWxb0xI9CnpmLZsDGlRo7l3ojPzBg6V9LmQySsDqD8jyPzbXcb1oOMG7e58+l3WFX0wmfGYG69PynfWlML23ScWysDabxoSIE1iWeUHP9wnglTPbtLm49zdnUg78zPP/+9yARW9pxOZko6lVrVpst3A/m1m/l2EkikUvpPH8TsvlNJjk1i2s45XDx4jpiQ3HW1z7f9ObH1KCe2HqVasxr0/LIvy0ctAiA7M5sJHceYJbtUKmXUzBGMfn88CaoEftmzjBMHThEekrueevt60Xf4+wztNoLU+6mUdi4NQJM2jalcszID232KhaUli7bO5/Ths6Snpps0/5TZX9L/vaHExsSxLXAth/b9za2bd4zq7Oxt6f/p+/x7/mrOfTeDQ+nW9gO0Wi0ubmUJOLqBQ/uPodVqTZb/UVKplAULptOpU1+io2M5cWInu3cfJDg4JKfm0qXrNG/emYyMTAYN+oCZM7+mX7/hZslb0kmlUhYunEGnTn2JilJx8uQudu8ONFrekZExDBo0hlGjBhs99u+/T9G4cQcAnJwcuX79OAcPHjN5/u9/mETPbh8TEx3H/iOb2b/nMDeVuTsc/9q8mzW/bwSgfYfWTJ31Fe93H0Ry0l369fqMuNh4qlStzIa/fqVO1ZYmzT7l+68Y0MOw3m498AeH81tv7Wz5cFBvLj2y3gJEhEXxdutnu+Toq0YMwyuGJBIJtlaGC01qtDo0Wh2PXy/Wy9mB17zKFrsLybqUsqGqhxMAdlYW+DmXIv6B8QVLbyek0NjXBQDfsqWIuZdOUmqmybPmR//gnqGjBJCdiS4hGolDGaMaee0WaK6fMXSUANKKz8X5dMnJaG4ZvnT0GRloI8KRlnUxqtHcuI4+1XABX3XQdaQuLnmex1zSzt5Ae6/giwtbV/bhwckrAGSFRmPp7Yq8bPE4KplwOpisuyX3wsjhZ4PJeMKyj7wQQmaKYYM86mIIDh5lCqw1hYp1KhEXpiIhMg6tWsPpXSeo79/IqMazsjfXTxq+8G/8cy1Pu7lUrVuF6LBoVBEqNGoNh3YcoUX7ZkY1nft0YtuqnaTeN/xN7iXdA6BC5fJcPn0ZrVZHZkYmoTdu07h1Q5Pmr12vBuF3oogMj0at1rB7237admiVp27UV0P5ZfFqsrKycu7LzMjM6RhZWVmi15t3j23DhnUIDQ0jLCwStVrN5s276NzZ36jm2LFTZGQYvqPOnv0XLy8Pc0R9Jfx/ed+5E5GzvLt0aWdUEx4exbVrweh0BW+ivvtuJw4cOJLzdzGVevVrced2BOFhUajVarb/tYe3OrUxqkl9kJbzf1tb25z3+LUrQcTFGi4+HxwUgpW1FZaWFibLXqtedcLDInPW24DtB2iTz3o78uvPWLF4jdF6+1+n0+sL9WMur3RnCUCr09Fz9nre/OY3mih8qFnB/ekPKmai76URHHePml7GG1WvuTlyKDgGgKvRyajupxP3WIeqOJCUdkHq4YsuKsTofqmzJxIbO6wHTsF66Gzkdd4wU8Ink7q5I69UGU3wjQJrrN/qRPY50w4DKIyMoDuUfqspALa1K2Pp5YqFR1kzp3p2zvUr0f7gLN5YNx6H17zMHeeF1evdiltHL5s1g5O7M8mqpJzbyaoknNyNP2sigsJo2MEwhLnBW42xKWWLfWl7ACysLJm6aw6Tt31P/Xam7USVdS9LfExCzu0EVQIu7sbvYx8/b3z8vFm6fSE/7VpMo1aGDlHojVAat26ElbUVjk4O1G1WG1dPV5Pmd/NwQRUTm3M7NiYeNw/jDNVqKvDwcuPIgeN5Hl+7Xg32ntjMnmObmDh2ltmOKgF4eroTFaXKuR0drcLLq+Dv2wEDerF//1ETJHs1GZZ3TM7t6GgVnp5uz/08PXp0YePGnS8z2jNx93QjJjr3/RITHYu7R978H33ShzOXDjBx2li+HT8zT3vnru25duUG2dnqIs37KHcPV1TRcTm3Y2PicPMw3lmas94G5l1vvct5sePwOtbt+IUGTeoUeV6h8F7pYXgAMqmUTV++T0p6FqN/DeBWTBKVPJ3NHeuZpWdrGLv1DOP8a2FvZbzn5ONmCuYcuEzPFYeo7OqAwt0RmbR4HSHD0hqrPmPJDlgJWY915GQypJ5+ZP4+DSwssRk8E21kCPokVf7PZQ7WNjhMmkbqT4vRp+c/PMeidl2sO3Ti3siSM5wkbtlWvKcMQrH3RzKV4aRfvw0a821oPY+7V8PY3fALNOlZeLxZmxYrR7OnuXmGgRVGhabVqNurFb93n2bWHPl9Yjy+A2/9jNV8OH0Qr/dojfLMDZJVSWi1hr3VI5t+yr34u7j4uPH1+qlEBocTHxGXz7O+fPkNCHj8CItMLsPb14sR743G1cOFxdsWMODNgZw7doEqdRQs27mIe0n3uX7hBloTrwP5jmh4JL9EIuHbGWMYPzz/YZqXL16jQ4seVKzsy9ylUzl66CTZWdlFFfeJnuVv8X+9e79DvXo18ffvVcSpXl35vXee9+iiu7sr1atXITDw75cV65nlO5gnn/wrf/2Tlb/+ybvvdWbUuM8Y8VnueaCKKpWYOHUMPd8ZWIRJ8/GUZS+RSPhm+mi+/HxKnrqEuERa1u3Evbv3qV6rCj+t+YGOLXqSmpqWp/ZVVDLPWCqizpJCoXAAvga8gb1KpfLPR9qWKZXKoUXxuk/iYGtFg8penAwKLzGdJbVWx5itp+lYw4c2VfLuPbe3smBalwaAYUXtuHQ/XqXtTB2zYFIZVn3GoLl8HO2Ns3ma9feT0KalgDoL1Flow4KQepRHW1w6SzIZjpOnkXX4INkn8u4dApD5+lFq9DjufzMe/YPiM4zwaXSpGUSMXZRzu9rJX8iKNM0GbmFpUnM73arDl6n/vQzLMvZkJ5ecoXtuVXx4e/YnrOs/54lD9kwhOTaJMh65n4llPJy5F5dsVHMv/i6LBs8BwMrWmoYdmpLxID2nDSAhMo7g09coX8PPZJ2lBFUirp65e3RdPFxIjEt6rCaB6xeD0Gq0qCJjiQyNxNvXm+DLSv5Y9Cd/LDJ8PU1c8g1Rd6IwpdiYeDw8HzmH1tOVuNjcI2V29na8VqUif+4wnPju4urM8rULGPzBSK5eCsqpCw25Q0Z6BoqqFY3uN6Xo6Fi8vXOH1Xl5eRATk/d90Lp1c778cjjt2vUkO9s8HbtXQXS0Cm9vz5zbXl4eqFTxz/Uc3bt3ZufO/Wg0mpcd76lU0XF4PjIM09PLndjYgvNv2xrA7Pm5Ow08PN1YuW4Jwwd/SfidyCLN+rjYmDg8vHKPgrl7uhEfm5hz287ejspVKrF2+y+AYb39ee2PDPlgFNcuB5GdfR+A61eCiQiLokLFcly7bJ711tR0JbS7VFTD8FZi2GG5FeitUCi2KhQKq4dtTQp+2MuV/CCDlHTDWNHMbA1nlJH4ujmZ6uULRa/XMzXgIr7OpejXuHK+NSmZ2agf7t3961IY9cuVzXP0yZws3/0MfXw0mpO7823XBJ1DVqEqSKVgYYnMpxK6+OIzM1KpMV+iiQgnY+umfNulLq44Tp5OyuyZaKNNu5FVWDIHOyQWhn0lzu/7k3b2BrrU4jeEMz/WLrnnVpWp4wdSSYnqKDl6OtNr+Ui2jfqJpDuxT39AEbt9+Rbuvh64+Lgis5DTpEsLLgaeM6qxdyqVsye7y7B3+XvTIQBsHeyQW8pzaio3qEJ0iOk2XIIvBePt64WHjztyCzlturbm5IF/jGqO7ztJvWaGoS6OTg74+HkTE6FCKpXi4GSYVMavqh8Vq/px7u/zJssOcOXf61Tw88G7nCcWFnI6v9OeQ/ty9/KnPkiloaINLet1pmW9zvx74WpOR8m7nCcymQwAT28PfCtVICrCfDuazp+/TKVKvpQv74OFhQU9enQhICDQqKZ27eosWfId7703kISEpAKeSXgW/1/eFSrkLu/duwOf/sBH9Oz5Nps27SiihE/278Wr+FUsT7nyXlhYWNDt3Y7s33PYqMbXr3zO//3bt+L2bcPELQ6OpVi3aTkzp87n3Jl/TZob4Oq/N6jgm7vedurWLs9627hKG1rX70Lr+l24dOFqTkepjHNppFLDprdPeS/K+5UjMrz4bPcUNX0h/5lLUQ3Dq6hUKrs//P92hULxLXBYoVC8XUSvl6/ElDQmrg3MOTGsXZ3KvFHDl2UBp6lWzpVWNf24Fh7H6F8DSMnI4ti1MH7ae4a/vulrypj5uhSVxO6rEVR2daDnCsOGyeetqxN737A3t0d9P+4kPmDCzvPIpBL8yjowpVM9c0Y2Ii1fBYu6LdHFhmM9fC4A6gN/IiltOJ9AczYQfUI02puXsPn8B9DrUJ8/hD7etHuICiKvXhNr//Zobodi+fOvAKT9vgKpq2FvUubundj264/EwZFSI0YBoNdquTdscIHPaUoVFo/BvmkN5E4OVD/zG6r563M6R0lr92FVydswU55WR2ZIJBHjF5s5ca4my4bh2qwqVmVK0eXCYq7N24L0YfbQNYfw7tyISv3botdo0WaqOTVkiZkTG+u+aBgVmlbF1qkUo08v5siPW5DJDfnPrztEyy/ewcapFJ2mfwSATqvlly4TzZZXp9WxZtKvjFszCalMyrFNh4gOieTd0b25cyWUfw+eo2rTGvQc3xe9HpRnb7B6omGPqVdlbz6aNQS9To9EKmH3T9uMZtEralqtjgUTFjPvz9lIpVL2bNxL2M1wPh47AOVlJScDT3H26DkatmzAmiO/o9NqWTb9F1LupmBpZcGSvxYAkJaaxowR3+UMLTRdfi1Tv5rNqs1LkUqlbPlzJyHK24z8aghXL93g0L6CZyhr0Lgug78YgEatQafXMXncd9xNvmfC9Ma0Wi2jRk1i1641yGQyVq/eRFBQCBMnjubixSsEBBxk1qxvsLOzZd06wxTXkZEx9Ojxidkyl2RarZaRIyeya9cfD5f3RoKCbjJp0mguXLhKQEAg9evXYuPGFTg5OdKxY1smThxNvXptAShf3htvb0+OHTtttvxfj53Ohr9+QyaTsn7tVpTBtxj/zedc/vca+/ceYeCnfXm9VVM0ag3376UwYohhCN7AQX3x9SvH6HGfMXqcYQbaXu8MJDEx+Ukv+VKzT/16Dr9vWoJMKmPL+h3cUt7miy8N6+3h/QWvtw2b1uOLL4eg0WjR6XRMHjuL+/dKzqiUwiqps+FJimIGHYVCEQRUVyqVukfu6w+MB+yVSmX5Ah/8UMb+JSXzWB1AXMneS6BT3jJ3hEJJP/t8QxGKkyhlaXNHKJSbantzR3hhQZbmTlA4oZSMI4MFCdfcN3eEFxadddfcEQolJq1kH+WJiLhm7ggvzMenurkjFIqjla25I7wwB8tidNrCCwhJuFDMTlJ/ul7luxVq235j+Haz/M5FNQxvF/Dmo3colcrVwBhADFIWBEEQBEEQhP8QHfpC/ZhLkQzDUyqV4wu4f59CoZhVFK8pCIIgCIIgCELxZM7zjgrDHNdZmmqG1xQEQRAEQRAEwUx0hfwxl6KaOvxKAU0S4PmvmiYIgiAIgiAIQolVFPMkmEJRzYbnBrQHHj/rVQL8k7dcEARBEARBEASheCmqztJuDLPeXXq8QaFQHC2i1xQEQRAEQRAEoRgqqRelLaoJHgY+oa3PszyHxKnkjtbTm+Fq2C+TxCnh6UXFmLx0yc1va1uyJ4t0vKs1d4QX5qwrqn1HpnFfVrLnPk+Tl9xpfDP0anNHKJQsXcn93ElMTynx02+XZMkZD8wd4YWpdSX3+6qkKqnXWSrZWweCIAiCIAglWGTkdXNHeGGeXlXMHUEoQcRseIIgCIIgCIIgCK8QcWRJEARBEARBEIQiJc5ZEgRBEARBEARByIeYOlwQBEEQBEEQBCEfYoIHQRAEQRAEQRCEfJTUCR5e6c5SVraaj2b+ilqtRaPT4d+wOkO7tzGq2XToLBsPnkEmlWBjbcmkj7tR0cvVTIlzZak1fLxkB2qNIXvb2n4MfauRUc2F0Bjmbj9JiCqJ7/v541+7opnS5iUp5YRlh4FI7BxBr0Nz5Riai4eMauQN2yOv2thwQypDUsaDjGWjIDPNDImNSZxdsBv+DdLSZUCvI+vgbrL2bDWqsWjQHOveH4NeD1ot6auWoA2+aqbETyZ3L4vH7LHIyjqBTs+9TXu598cOc8fKV40Fg3Hxr0d2YgonW47L015haGc8u7cAQCKXYV/Zi8PVBqG+Z/73DUCbeYOo0KYOGUkp/Nn26wLrXGv70WPHFPYNXUzonnMmTFiw3nMGU+3NeqQmpTCnfd5l71rRk/fnDsG7ui8B8zZydMVuM6Q0VrdlPT6e/AlSmYyDGw6w7Sfj9bSsZ1k+nz8SOwd7pFIpa2ev5uKRC7h4u7Lo0FJiQqMBuPmvkuXf/mSOXyFH01aNGDN9BFKplB3rA1i9ZF2emrZdWjNozEeg13Pzxi0mDptuhqS5WrVpztRZXyGTyVj/x1aWLvzNqP2DAT0Z8ElvtFodaWnpfDlqCiHK28jlcuYunErN2lWRyeVs2bCTpQt+NWl2f/+W/PDDFGQyGStXbmDevGVG7S1aNGLu3MnUrFmVfv2Gs23bHgBatmzKnDmTcuoUior06zecXbsOmDR/SdeuXSvmz5+GTCrl95XrmTt3qVF7ixaNmf/DVGrWrErfD4by118BOW2ZGRFcuxYMQERkNO+++5FJs7dp+zqz5kxAJpXxx5pNLJz/i1H70OEf0a9/TzQaDYmJyXw+9GuiImNo8XpjZn7/bU5d5df8+OSjkezZfdCk+YXnIymu4wczz24udDC9Xk9GVja21laoNVoGTF/Bl/06UauST05NakYm9jbWABy9GMTGg2f5aXz/wr1uQnShHg8Ps2drsLWyQK3V8tHi7Yzv1pxaFdxzaqKTU0jLVLPm6CVaVq/w0jpL+qBrhX8SO0ckdo7o4yPAwgrrfhPJ2rEUfZIq33KZX23kDdqStemHQr901plbhX4OSekySJ2c0d4JAWsbHGb/QurcCeiiwnOLrG0gMwMAWTk/7EZPIWXkh4V63firNoV6fEFkLk7IXcqQdSMUiZ0NFbYuInrYdLJDI17q69y561jo53BqUgVtWiY1lwzLt7P0KJd29agwuCPnus8o9OuGWL6cfUeejRWo07LwXzC4wM6SRCqh659foc1Sc2Pj3y+ls3RbVvjru/k1qkJ2WiZ95g/Lt7Nk7+yAk1dZarZrSPr9tJfaWQrXpz/3Y6RSKUuO/sTUvpNIik1izs4fmD9iHlEhkTk1Q74bxp3rt9m/di/elX2YsHISQ1oMwsXblW9/n8jIdp8XOnuk+l6hn0MqlbL1xDqG9x5NnCqB1Xt+YcLQqdwJyf3M8fH15rvlU/isx0ge3E/Fybk0d5MK/9qqzOQXznzsXAB93h2EKiaWgEMbGTZoHCHK2zk19qXsSH1g2JHh/1Yr+g/szQc9htCte0f8O7Rm2CfjsLax5sipHfTo8hFRkTHPlSExPeWFs1+79jedOvUlKkrFyZO7+PDDzwkODsmpKV/em1Kl7Bk1ajC7dwfmdJYe5eTkyPXrx6lYsREZGZkvlOW/OHW4VCrlxvXjdOj4PlFRKk6f2sMH/YYSFGS8/B0cSjF61BB27T5g1Fm6m3wTpzKvFSp7KSvbF85+7t9A3u06gJjoWA79vZVBH41Gqczd9mjxemMunL9MRkYmHw3sQ4vXGzFwwEij5ynt5MiFSwepUeX1F3rvJD8IkbzQL2BGbX3aF2rb/mDkfrP8zq/01OESiQRbaysANFotGm3eC5D9v6MEkJGVjaSYvPUkEgm2VhYAaLQ6NFodksfCeZVx4DVP5zz3Fwtp9w0dJQB1FrpkFRJ7pwLLZVUboQk6a6JwT6e/l2zoKAFkZqCNDkdapqxx0cOOEgDW1oYjTMWUNuEuWTdCAdCnZZAVGonczdnMqfJ393TwMx8l8ninOapt/xRxoucTc0ZJ5r3UJ9bU+qgdoXvPkZH0Yht6ReX22WDS7he87FOTUoi8chutpnhczLFSncqowlTERcahUWs4ses4jfwbGxfp9djaG3ZC2JayJTn+xToGRa163apEhkUTHaFCo9YQuOMQLdu3MKrp1mAbRigAACAASURBVLczm1dt48F9w/vrZXSUCqNO/ZqE3YkgIjwKtVrDjr/20q7Dm0Y1/+8oAdja2uSc4K3X67G1tUEmk2FtbYU6W03qgyevNy9Tw4Z1CA0N486dCNRqNZs376JLl3ZGNeHhUVy7FoxOV/CZFu++24kDB468cEfpv6pRw7pGy3/jph106dLeqCY8PIqrV4OeuPzNoX6DWty5HU54WCRqtZq/tgbQobPxqKUTx8/kvCfOn7uEp5d7nufp2u0tDgYe+0+9d/R6faF+zOWVHoYHoNXpeH/iMiLikunVtrHRUaX/2xB4mj/2nUSt0bLi64/NkDJ/Wp2O9+dvITLxPr2a16BmeTdzR3ohEgdnpK7l0Klu518gt0RWoQbZh/40bbBnJHVxR+5bmbSQoDxtFo1aYNPnUySOpUn97iszpHt+ci9XrKtWJPOy0txRCkVqY0nZ1rUJ+vp3c0d5LnbuTlR8qwHbes3CrbafueOUaM7uziSpEnNuJ6kSqVxXYVSzccF6Jv0xlY4DOmNla82UPhNz2lx93Ji3ZwEZD9L5c95ags7dMFn2x7m4lyUuJj7ndpwqgRr1qhnVlPMzfH/9umMpUqmUFT+s5NRR8+1k8vBwRRUdm3M7NiaOuvVr5qnrP7A3g4b2x9LSgl5dDd+xATsDadfxTS4GHcHGxpqpE+Zw757pdh54eroTFZV7FCs6WkXDhnWe+3l69OjCwoWmHT74KvD0yrv8GzWs+8yPt7a24vSpPWg0WubMXcLOnfuLIma+PDzciY7OHSUTEx1L/Qa1C6z/4MP3OHjgWJ773+neiWVLVhZJxuJKTB1eTMmkUjbNHE5KWgajFv5JSGQclX2MOx29/ZvQ278Je/65zIodR5kx+D0zpTUmk0rZNLYnKRlZjP59H7dUSVTyKJ5HAwpkYYXV20NRH9kI2fnvPZFVrI0u5laxOFcpD2sb7MZOJX3lEsjIO0xIffYE6rMnkFethU2vgaROH2OGkM9OYmuN16IJxH+3HF3a8w97Kk5c29Xn3jllsTlX6Vm9PvkDTs7agF5XMr80ipd8jqo/tvexxdtvcGTLYXau2M5r9RR8sWAUI/0/5258Mp82HUjqvQf41ajIVyu+4Qv/4WSkZuR9ThPIb4TA43tSZTIZPr7eDO4+AjcPV37Ztpjebw4gNcV0R2SMPENmgNW/bWD1bxvo1r0jI8YMZtSwb6lTvyY6rZb61d7EsbQDfwWs5vjR00SER5ki+TMt76dxd3elevUqBAb+/bJi/WcUdvn7VWyEShWHr285DuzfxLVrwdy+Hf70B74E+Q3mKSh7j15vU7deTTq/1dfofjc3F6pVV3D44PGiiCi8ZEXSWVIoFO7AZAyzBE4CPge6A0HAF0qlMv8TV4qQg50NDav48s+VkDydpf97q0lNZq7aaeJkT+dgY0WDSp6cDI4sWZ0lqQyrtz9DE3QabcjFAstkVRqiCTpjwmDPSCbDfsxUso8fRH32yR9omqArSN09kZRyRP/gvokCPie5DK9FE0jZdYTUwOI1dO1FeHRrWuyG4D0L11q+vLV0OADWZUpRvnVt9Fodt/dfMHOykicpNhFnj9zhsc4eZUmOMx5m16aXP9M/nALAzYtKLKwscSjjwP2k+6RmPwDg9rVQYsNj8fT1IvRq4c95fBHxqgTcPHMnF3LzcCExNjFPzbWL19FqtMREqogIjaScrzc3LgebOi4Aqpg4PB4ZXuTu6UZsbEKB9Tv+2susHybCMOjWvSNHD51Eo9GQlJjMubOXqFW3usk6S9HRKry9PXNue3l5oFLFP+EReXXv3pmdO/ej0RT+fMH/muiovMs/RhX3zI9XPay9cyeCY8dOUadODZN1lmJiYvHy8si57enlTmxs3vdOy1bNGDNuKJ3f6kN2drZRW7d3OxKw68B/7r1TUmfDK6pzllYBN4BI4AiQAXQCjgM/F9Fr5pGckkZKmmEvYWa2mtPXQ6ngaXzeSfgjX0bHLt2knHvx6Iwkp2aQkpEFQGa2hjM3o/B1LW3mVM/Hsn1/dMkqNBcCn1Bkg8xbgTb0kumCPSPbz8ajjY4ga/fmfNul7l45/5f5VkYilxffjhLgPmMkWaGR3F21zdxRCk1eyganptWI33fe3FGe25rmo1ndbBSrm40idM9Zjn67SnSUXtCtyyF4+Hri6uOG3EJOiy6vcy7QeMdLYkwCtZrXAsCrkjeWVhbcT7qPQxkHpFLDV6Cbjxsevp7ERcTmeQ1TuXEpmHK+3nj6eCC3kOPftQ3HDpw0qvl733HqN6sHgGMZR8pV9CE64vkmRHiZLl+8hq9fOXzKeWFhIafrux0I3HfEqMbXr1zO/9u0e4M7DyeViYlS0ewNwwyvNrY21GtQi9Cbd0yW/fz5y1Sq5EuFCj5YWFjQo0cXdu9+wndVPnr2fJtNm4rnrKLF3bnzl4yWf6+eXdm9+9lmEyxd2hFLS0sAnJ2daNq0IUFBN//X3n3HN1X9fxx/JWkZpQUKFEpbNnjYewrKUEBFcX3Fn7jBjSIgqCgyHQgCMh0oIALKVKYsAUEU2RsOs6UTaBkFWtpm/P5IKJS20Baam+jn6aMPk9yT5J1Lm3vPved+Tn7GzWD7tj1UrlKR8hXC8PX15bHHO7F8acZqv3Xq1mT02GF0ffJV4uMzXyf5+BMPMn+u8dVE3c3ucNzSj1HyaxheGa31eACl1Bta689dj49XSnXPp/fMJP7cBQZ8Ox+73Y7d7qBDs9q0blCdifNXU6tSKG0a1uDnVf+wad9RfC1mAooUZtgrj7sr3g3FJybx0U9rnNkdDjrUq8rdtSoy6bfN1CwXRJvaldh74hR9pi4nMTmF9fvC+Wr5Fha8939GRwfAHFoVn1p3Yj8dheU5Z4nV1A2/YC5aAgDrLuewBUu1Btgi9kFaaravZQRL9ToUbN0Ra8RRAkY6x6Mnz5qMuZTzrGTqqkX4Nrubgq074LDZIDWFi2OGGhn5hgo3rEWxR+4lRR/H75cJAMSP+YFL6z2jZPW16n39FoF31qRAiQDa7JjI4ZHzMPtYAIic7iyvWuaBpiT8sRtbUoqRUbPUcUIPQpvXoFAJf17cPI5/Rs3H7OvMv3fGGoPT3diz496iavOaFAkMYNDfE1k+Zh4WV/a/Zq4mIKgYfRZ9SiF/54X6rbvdz/D2fUkxaOia3Wbnu4HfMHD6YMwWM7/PWU3k4Uj+r09Xju4+wpbVm5n28RTeGP4mD3V/GIfDwfh3xgJQs1kt/q/P09itNux2O998MImL5w0azgbYbDZGfPgl42Z9gcViZtHPyzh2KJxX+3XjwC7N+pUb+XvdZpq1bsLsddOx2+yMHTaJ82eNKxJis9n46N1PmTnvG8wWC7Nn/sKhg0fp278Hu3bsY9XydbzwcldatW6ONc3K+XOJ9O7xAQDTvv+J0RM+5ve/fsVkMjFn1q8c2O++HV6bzUavXh+xePGPWCwWfvhhNgcOHGLgwD5s27aHpUtX0ahRXWbPnkxgYDEeeOBePvqoDw0b3gs4K7WFhYWwfv0mt2X+N7HZbLzdawBLl87CYjYz7YfZ7N9/iEGD+rJt2y6WLFlF40b1mDv3ewIDi9GpU3sGDnyH+vXbUaN6NSZNGo7d7sBsNjFy5IQMVfTckf3dvkOY9+sULGYLM3+cx8GDR+j/4dvs2LGH5cvWMOTjdyni78fU6eMBiIqK4eknXwOgXPlQQkKD2fin5xS1chfvPK+UT6XDlVK7tNb1XLc/1loPuGbZHq115itAr3M7Socb5XaUDjfSbSkdbqDbUTrcKPlVOtxdbkfpcKPcrtLhRrkdpcONlJfS4Z7idpQON1JeS4d7gryWDvck/8XS4Z4gr6XDPYU3lg5vGdrulvbtN0av+VeVDl+olPIHuK6jVBXw7hJcQgghhBBCiP+EfDmUqrUemM3jR5RSS7NaJoQQQgghhPh3ckfpcKXUfcBYwAJ8p7UenkWbLsBgnCMDd2mtu97oNY2YlHaIAe8phBBCCCGEMEh+T0qrlLIAE4H7gZrAU0qpmte1qQb0B1pqrWsBvW72uvlVOnx3NotMgHfOrCqEEEIIIYTIEzecWWoKHNFaHwNQSv0MPIyzQvcVLwMTtdZnAbTWN50zIN+q4QEdgbPXPW4CvG9iFCGEEEIIIUSeuWGepVCc0xZdEQU0u67NHQBKqY04h+oN1lovv9GL5ldnaQngr7XONHmOUmpdPr2nEEIIIYQQ4r8pq2p51/fQfIBqQBsgDNiglKqttc62rGl+FXjIdi6lm11EdYWpeNmbN/JUNu8u4UtJ4yY5vB18gry3/LZ/oOfNG5QbgYmeNV9WbpSweXfp8HNmi9ERbsl5UwGjI+TZRYt3lyBO9vXev9u0gt69vT2TfMGry297s8QU752uwFvlx3RF14kCyl1zPwy4fqc2CtiktU4DjiulNM7OU7YTT3r33oEQQgghhDBMTPRBoyPkSVnppLqdG65Z2gJUU0pVAqKB/wOuP0nzK/AUME0pVQrnsLxjN3pRI6rhCSGEEEIIIf5D8rsantbaCrwJrAAOAHO01vuUUkOVUp1dzVYACUqp/cBaoJ/WOuFGrytnloQQQgghhBBeT2u9DFh23WMDr7ntAPq4fnJEOktCCCGEEEKIfOWOSWnzg3SWhBBCCCGEEPnKDaXD84V0loQQQgghhBD5yp7/1fDyxb+6s5SSmsaL739OaloaNpude1s2osfTj2TZduXGrfQd/hU/jf6IWtUqujdoFlJS03jxs6mkWW1YbXbaN6nJG4+2zdBm+vK/+GX9dixmM4EBRRjS/WFCShU3KHFGcYnJDFiynYRLlzGZTDxerwJPN6mSoU3i5VQGLd1B1LkkCviYGfJAA6oGFTUocUamwFIUer4vpqKBYHeQtvE30tYuzNDGUq0OhV8bhD0+DgDrzr9I/W2WEXEzsJQOInDg+5hLlgC7g0sLl3BpzoIMbXwqlCPww3fxVdVI/GYKF2fNMShtZpVG9yDw3sakxZ9nT7temZZbAvyoMuFtCoQEYfIxE/v1IuJnrzEgadaaj36Z0Hvrczk+kaXt+mdaXrpFDVpP7c3FyNMARC7bwt4xv7o7ZrYeGvky1do14FJCIt90eD/T8jvaN6LNO//DYXdgt9lYOeRHIrceMiCpU+3W9ek68EVMFjMbZv/Osq8yrsuSoaV4cUQPAkoU5dL5i0zuNZazcWcA+N/7z1C3bUMAFo+fx5Yl7p8zvXGbRrw++HXMFjPLf1rO7EkZ/xZfG/QK9VrUA6Bg4YIUL1mcx2r/D4DfwpcSfjAcgFMxpxnUbbA7owPQsm1z3v+4NxaLmfkzF/H9+B8zLH/4yU68M/BNTsU5f99/mjKP+TMXoWpV46MR7+LvXwS73c63X05j+cLVbs3e9p5WfPz5h1gsZmZOn8f4MZMzLH+u25N0e+lpbDYbly4l0fftgRzSR7m77Z0MGPwOBXx9SU1LY+hHI/hz/T9uzQ7QoUMbRo8eisVsZsrUnxg5cmKG5a1aNWP0qCHUqVODp595gwULlqYvu5x8gr17nVXsTkRG89hjL7o1u7freN26H3Hdur+rVTNGjRpC3To16HrNuq9XrxYTx39GQFF/bDYbnw0fz9y5i4z4CIaQM0seqICvD9990he/woVIs1p5/r3htGpUh3rVM+60X0pKZtbi1dRRlQ1KmlkBXx++e+95/AoVJM1q44VPp9CqTlXqVr1aPr56hbLMGvQKhQsWYM6aLYyZs4qRbzxhYOqrLGYT77SrRY3g4lxKSeOpaX/QvFIQVUpd7Qx999dhVJlijHm8GccTLvDZyt18+1RLA1Nfw2YjZf5k7JFHoWBhirw/DtuBHdjjTmRsdmQvyV8NNiZjNhw2G+fHfU3aocOY/ApTeurXpGzehjU8Ir2NPfEC58ZMoPDdHrK+rxE/ey0np/5GlbE9s1xe5oX7ST4UxaHnP8OnRFHqbRhPwoL1ONI8Y76VY7PXo6eu4s6xr2bb5vQ/mnXPj3JjqpzbNXcDW35YxcOjX8ty+fGNezm0ahsApauX4/GJPfnqnn7ujJjOZDbzzNCXGPXMUM7EnWHgouHsXLWVmCNR6W26fPA8fy1Yx1/z/6B6i9o8/u7TfNdnPHXbNqRCrUoMfqAvPgV8eX/2UPas28Hli8luy282m3nz4x683/UD4mPjGb9kHH+v2sSJw1e/Z74e8m367Ydf6EyV2le3X6mXU3n9vh5uy3s9s9nMgOF9eblLT+JiTjF7xVTWrtjAsUPhGdotX7iaTz/I+Pt+OfkyH7w5lBPHIwkqU4o5q6axce0mLiRedFv24aMG0uWRbsREn2TF2rmsWLaGQ/poepsFc5cwfcpsADre35Yhn77PU4+/zJmEszz75OucjDtF9RrV+HnBd9Sv0dotua/NP27sJ9z/wFNERcWy6e9lLFmykgMHDqe3iYyMpvtLvenTO/PfcnLyZRo36eDOyP8aV9b9fdes+8XXrfsT2az7pKRkXuj2NkeOHKds2TJs3vQbK1eu4/z5RHd/DJEL/+rS4SaTCb/ChQCwWm1YrTZMpsyT+06Y+SsvPnY/BX193R0xWyaTCb9CBQGw2mxYbTa4LnvTGpUoXNA5kWOdKmGcOuM5f2xB/oWoEew8y1WkoC+VSwZw6sLlDG2OJVygWYUgACqVDCDmfBIJly5nei0jOBLPOjtKACnJ2OIiMRUvaWyoHLInnCHtkPNL25GUTFr4CSxBpTK2OXuOtAMah9VmRMQbuvDPfqxnL2TfwOHAUsQ58bClSCGs5y561Oc49Y8m9ax7dvjyw4nNB0k+l33+tKSrEyf7+hUk8+To7lO5flVORcRxOvIUtjQr/yzeSP0OTTK0CakWxoGNewA4+PdeGrRvkv64/mc/dpud1OQUIg+EU6d1fbfmV/UVMeGxxJ2Iw5pm5Y9Ff3BnhxbZtm/zcBvWLVznvoA3UadhTU4cjyIqIgZrmpXffl1Fu/vuztFzI45FcuJ4JACnT8ZzJv4sgSUD8zNuBg0b1eX4sRNEhEeRlpbGrwuWcV+nezK0uXjhUvptPz+/9NLFe3cf4GTcKQAOHjhMwUIFKVDAvfsPTZs04OjRcI4fP0FaWhqz5yzkoYc6ZmgTERHFnj0HsNvtbs32b3f9up8zZyGdc7juDx8+xpEjxwGIjT3JqdMJBAV5x77F7WB3OG7pxyhu6ywppUq7672uZbPZeaLnYNo825sWDWpS97qzRweORhB3+gytm9YzIt4N2ex2unz0FW17jqR5rSrUrRKWbdtf1m+nZd2qbkyXc9Hnkjh46jx1QjJuCO8oXZTfD8UCsCfmLLHnkzl5wTM6S9cylSiNpVwVbOE60zJLpRr4fTCRwj2GYi5b3oB0N2YJLoPvHVVJ3XfA6Ci3TdzUZRSuFkqDHd9TZ80YIgZOAS8bB12qUVUeWPUJbWf0o9gdoUbHyTXVsTGv/z6Sp6b2Y1G/b2/+hHxSvEwJzsTEp98/G5tAYJkSGdpEHgin0f3NAWjYsRmFA/woUtyfyAMR1GnTgAKFCuAfGED1FrUpUTbjQYX8Viq4JKdjTqffPx0bT8ngrHecSoeWJrhcMDs37kp/rEDBAkxYOo6xC8dwZ8fsO1n5pXRwEHExp9Lvn4w5RengoEzt2j/YlgVrZzD6u08JDsm8K1C7QU18fX2JDI/KtCy/BIeUISY6Nv1+THQcwWXLZGr34ktd+WfnSj4a2pcP3/0k0/IHH+7I3t37SU1Ny9e81wsJDSYqKib9fnR0LKEhwTl+fqFCBdn09zL+3LCYzp073vwJIl1IaDCR16z7qOhYQnKx7q9o0rg+BQr4cvRo+G1M59kct/ifUfJlGJ5SqsR1D5mAzUqpBoBJa30mP943KxaLmbnjBpN4MYnen07gcEQU1So4Ox12u52R381mWK9u7oqTKxazmTnDXifxUjK9x8/mcNRJqoVl/jJf8tcu9h+PYUp/zxtznJRqpe8vm+l3T238C2Y88tateTVGrN5DlylrqRZUFFWmGJYszvwZqmAhCr8ygJR538DlpAyLbJFHufjR85ByGUutJhR+dSCXBr9kUNDMTIULUeKzIZz/chKOpKSbP8FLFG/TgEv7wjnwxCAKVgym+s+DuPDPfmxuHD51K87sCefXpr2wJqUQ0q4ed0/pzeJWfY2OlSt6xVb0iq2Ub1qdNu88wcynPzMkR1YjBa6fuHDOJ9N5euhLtPxfWw5t3s+Z2ATsNjv7NuyiUt0qfLDgEy4kJHJk+yFsNjefocxB/ivadG7NhmUbMhypfrr5s5w5eYbg8sGM+Plzjh8MJzYiNsvn54cs1/9199et3MCyX1aSlppGl+ce5ZPxA+n++Jvpy0uVLslnEwbxYc+hOZp08nbJclOTxftP/W4WU7+bxWP/e5De/V6n5+tXr+NT1avy0ZB36PJo93xMmrWc/O7fSOUqTYmNPUmlSuVZuWIOe/ce5NixiJs/UdzyugcIDi7NtGnj6Natl1t/743mrQUe8uvMUjyw7ZqfrUAosN112+2K+vvRuI5i47a96Y9dSr7MkYhoun8wgvu6v8tufZSeH49j3+FwIyJmq2iRwjSpXpG/9hzJtGzTvqN8t3gDY3s9RQFfz7oELc1m551fNvNArTDuUSGZlvsX9GVop4bM6daWjx9syNmkFEKL+xmQNBtmC4VfHkDa5rVYd2Zx4fflJEhxngmz7dsCFh9MRTyjQAUWCyU+HULyitVc/mOD0Wluq1JPtuPssk0ApITHkXLiFIWqes/ZGevFZKyuoWwxa3Zh9rVQsIS/wany5sTmgwRWKE3hQGPyn41LoETI1bNBgWVLcu7U2Qxtzp06y8TXRjKkUz8WjPwJgOQLzoMHSyYuYPAD/Rj17DBMJjh53H0dDYD42HiCQq6eiQkqW4ozJ7M+ltimc+tMQ/CutI07EcfuTbupWqtKFs/MPydjT2U4U1QmpDSn405naHP+bCJprrMu82YspGbd6unLivj7MWnmaMYP/4bd2/a5J7RLbPRJQkLLpt8PCQ0mLu5Utu1/mb+U+68Zplc2pAxTZ07gzVffI8I1nNCdoqNiCQu7ul0NDS1LTOzJHD8/1tX2+PETrF//N/Xr177tGf+toqNiKXfNug8LLZu+PnMiIMCfRQunM3DQCP7ZvD0/Inosbz2zlF+dpXcBDXTWWlfSWlcColy33VZF4cz5CyRedG4UL6eksmnnASqFXf1yDCjix/pZY1n+/QiWfz+CuqoK4wb09IhqeGcSL5F4yXmk/HJqGpv2H6PidUNEDkTEMmzaEsa+/RQli3rWzpbD4WDIsh1UKhnAs02zHh6YeDmNNJvzKOmCXRE0Klcy09knIxV6thf2uEjS1vyS5XJT0avDCs0V7gCTCcclz7huLPDDflgjTnDx53lGR7ntUqNPU/SuugD4lCpG4SohpJzI+YbKaIWCiqXfLlm/MiaziZQz3nONU2CFq2e3g2tXxOLrQ7JB12gd33WEMhXLUiqsNBZfH5o91JKdq7ZkaOMfGJB+JLjTG4/y5xxn5UST2UyR4s7vzbDqFQirXoF9G3bhTnqXJrRiCMHlyuDj60Przq35e9WmTO3CKofhXyyA/duuDqf1L+aPr+s6maKBRanVuCYRh09kem5+2rvjAOUrlyO0fFl8fH24/5H2rF2R8eBMqdJXhxW27XgXx1wHI318fRg77XMWzV3GysXur2a5Y/seKlepQPkKofj6+vLIYw+wYlnGHJUqV0i/3b5jm/QzL0WLBTBzzjd8MmQ0W/7Z4dbcV2zZupOqVStRsWI5fH19ebLLwyxZsjJHzy1evBgFCjivdy5ZMpAWLZpw4IBxFS29zfXrvkuXh1mcw3Xv6+vL/LnfM2PGPObPX5LPScXtki+nIrTWXyilfgbGKKUigUEYcBVw/JlzDPjye2x2B3a7nY6tmtC6aT0mzviVmtUq0raZey/mzY348xcYMPlX7HY7doeDDk1r0bq+YuKCNdSqFEKbBtUZM3slSSmp9JvoLDUbXLIY43p1NTi5086oMyzZF0W1oKJ0mbIWgLda1yQu0dl5faJBJY4nXGDAku1YTCYqlwpg8AOe8+9hqVIL32b3Yos+jl//CQCkLPoBcwnnUeC0DcvwadAK37s6gd0GaakkTxluZOR0BerWxu/+DqQdOUrQD87rSRK//h5LsPMIcNIvizGXCKT01K8xFfEDuwP/Jx/n5FMvesRwvSqTelO0RW18SgTQYOtkokb9jMnHAsCpH1cS/eVcqnz5FnV+HwMmEyc++RHrmRsUhHCzlpN6UKZFDQqW8OfRrePYPWo+Zlf+wz+uofyDTan23D04rDZsl9P48/WJN3lF93p0XA8qtKiBX2AAb28azx9j5mH2cW4qts/8nRr3N6Hu43dhS7NhTUllQY/xhmW12+zMGPgdfaYPwGwx8+ecNcQcjuKR3k8SvucoO1dvRTWvxf/efRqHw8GhzfuZMfA7ACy+FvrPHQZA8sVkJvceh93m3gvh7TY7Ez6axKczPsFsMbNi9koiDkXw3DvPcmj3YTa5Ok5tH27DukXrMjy3fNVyvD28J3a7A7PZxOyJczJU0XMHm83Gp/2/4Jufx2KxmPnlpyUc1cfp8e7L7Nt1kHUrNvDMy11o0+EubDYb588lMqCnc53f1/leGjVvQPHAYjzyZCcAPuw5DL3v8I3e8rZm7993GD8v+B6LxcxPM+ajDx7h3Q/eYteOvaz4bS3dX3mau9q0wJpm5fy5RHq+5hyC1/3lp6lUuTx9+r1On36vA/Dko92Jj3fbFQbYbDbe7jWApUtnYTGbmfbDbPbvP8SgQX3Ztm0XS5asonGjesyd+z2BgcXo1Kk9Awe+Q/367ahRvRqTJg1P/90ZOXJChkpu4saurPtl1637wYP6svWadT/Pte4f7NSeQQPfoV79djzxxEPcdVczSpQM5LnnugDQ/aXeJ+yuOgAAH0hJREFU7Nrl3jOrRvHWYXim/B4rqZR6CPgQqKi1zvEVcCmH/vTONQo4Etx/Sv52chw05kjZ7WLdssfoCHmWuCPl5o08WFSEZ8zzlRdH8KAhoHlwzNdrvzIBOG7y3t/9KJv3nBnMSkzqOaMj5Nnpy96bHeBMsucc6MmrmOiDRkfIk7Kh1W/eyINZU6M97CLvm6tcqsEtbaiOxe8w5DPnezU8rfVioC1wL4BSyvOqEAghhBBCCCHyjcNhv6Ufo7ilIoDWOhm4UllhCDDVHe8rhBBCCCGEEHmVX6XDd2ezyARkrn0thBBCCCGE+NeyG1jR7lbk15mlMkBH4Ox1j5uALGowCyGEEEIIIf6tvHVOqfzqLC0B/LXWO69foJRal0/vKYQQQgghhPBAcmbpGlrrbKez1lp7Rm1rIYQQQgghhFvImaXbzFwi5OaNPJTdbjM6wi1xlPaeCT6zYg6NMzpCnvmddO88Kbdb4Dnj52nKq6AzBYyOcEvOWzz26zxHLlg8Z0Lq3LpkLmR0hFuS7FPE6Ah5llIgzegItyTNy/cXElOSvL4EtxA3491bVyGEEEIIIfIg1kvniPJW3joprXSWhBBCCCGEEPnKIdcsCSGEEEIIIURmcs2SEEIIIYQQQmTBW6vhmY0OIIQQQgghhBCe6F99ZiklJZXne/QjNS0Nm9VG+7atePOlZzO1W/77eiZNmYEJE6paZUYMfs+AtBmlpKbx4gcjSU2zYrPZuPfORvTo2jnLtis3bqPviG/46YsPqFWtonuDZiMlzUq3CQtJs9qw2u3cW68yb9zXNEObbUdjGPnrRg7HJjD82fa0r1fFoLSZmQJKULDzK5j8i4PDTtqOdVi3rMzQxrf5A1hqt3C2N1kwlQohaUwPuHzJiMjpTCWDKNLzA8zFS4DDTsqqJaQsnZ+hjW+TlhR6qhvYHWCzkTR1AraDewxKfHM+waUIHt4PS6lAcDg4P2cZ535caHSsLNX68lWC2jckNT6Rv1r3y7S84hsPEvx4KwDMPhaKVAtlbc2XsZ4z9vfmirZfvEyFe+qTnJDI7Hv7Z9uudL3KPLZwMCvfGM+xZVvcmDB7T4x4lRrtGnAxIZHRHd/NtDyoSghdRr5KaK1KLP9iNusnLzUgZUb1WjfghUEvYbaYWfPzKhZ+tSDD8pIhpegx+m38ihbBbDYz6/Mf2bl2GxZfH1759HUq162Kw25n2pDv2b9pr9vzN23ThLeH9sBsNrPkp2XMnPhzpjZtH2pNtz7P43A4OLL/KEPf/BSA0iGlee+LdygdEgQO6Pdsf+Ki3FeN9a52LRjwSV8sFgtzZvzKt+OmZdnuvofuYfyUETx67zPs3XWA0HJlWb5xHsePRgCwc+seBvb7zG25r7jn3rv4dMQALGYLP06fw9jR32ZY/sabL/Ls812wWq3Ex5/hrTf6ExUZQ6u7mvHJ8A/T21W7ozIvvdiLZUtWuzV/xw5tGD16KBazmSlTf2LEyIkZlt/VqhmjRg2hbp0adH3mDRYscP691qtXi4njPyOgqD82m43Pho9n7txFbs0u8kaG4XmgAgV8mTJuOH5+hUmzWnnu9b7c1bwx9WrXSG8TERnNdz/O5sevRlGsaAAJZ88ZmPiqAr4+fDesD36FC5FmtfL8+yNo1ag29VTlDO0uJV1m1pI11LmjkkFJs1bAx8LkNzrjV9CXNJuNF8f/Sqvq5albMTi9TXCgP0Ofasf0dZnmLjaew0bq7z9hj4uAAoUo3G0otuN7ccTHpDdJ27SMtE3LALBUq49v0/sM7ygBYLORPG0StuOHoVBhio78lrRdW7FHRaQ3SduznbQtGwGwVKhMkXcGk9jzOaMS35TDZuf0iMmk7D+Cya8wFeaPJ+mvHaQe9bxS6zE//8GJ71dQZ0KPLJeHT1pC+KQlAAR1aEiFVx/wmI4SwMG569kzbRX3fPlqtm1MZhPN+z9J5B+73Zjs5rbO+4O/fljBk6PfyHJ50rmLLBz8A7U6NHZzsqyZzGa6DXuVT54eREJcAp8tGsnW1ZuJPhyV3uaxt7rw95KNrJqxnNBqYbw/dSBvtXqFe55qD0C/jm9TtGQx+v8wkA8e6uvWnRGz2UyfT3rS+6l3OR17msnLJrFx5d+EH776XRNWKZRn3nyK1x/pycXzFylesnj6sgFj32P6uFls3bCNwn6FsNvdm33w8Pd54Yk3iIs5yfyVP7Jm+R8cOXQ8Q7siRfx47uX/Y+fWjAeTToRH0bmtcdNGms1mRowazGMPv0BMdBy//zGf5UvXoPWR9Da7d+2n3d2Pkpx8mRe7d2XIsHfp/kIv/tzwD61bOg++Fg8sxradq1n7+59uzz9u7Cfc98BTREXFsunvZSxespIDBw6ntzkRGU33l3rTp/drGZ6blJTMC93e5siR45QtW4bNm35j5cp1nD+f6NbPIHLPW6vh/auH4ZlMJvz8CgNgtVqxWq2YTKYMbeYtWs7/PfYQxYoGAFAysHim1zGCyWTCr7Bz7g6rzYbVZsOURbsJsxby4mMdKVjAs+YoMZlM+BV0ZrLa7Fht9kzrPrREUe4IKZnpcU/guHje2VECSL2MPSEGU0Bgtu19arbAum+Tm9LdmOPcGWdHCeByMraoCMwlSmVsdDn56u2ChcDDv8Bsp8+Qst+5E+BISib1aCQ+ZUoanCprZzcdJC2HnZ/gR1sS+8tf+Zwod2L/0aScu3jDNnVe7MCx37aQnOBZOyfHNx8k6Xz22S8lJBK1+xh2q2fMbVO1fjVOhsdyKvIktjQrfy3+kybtm2Vs5HBQ2N+5HfMLKMLZU2cACKtWjj1/OTuriQnnuZR4icp1q7o1f40G1YkOjyb2RCzWNCu/L1xLq453ZmjzUNdO/DJtERdd/y7nEpwHJCtWq4DFx8LWDdsASE66TMrlFLdlr9uwFhHhkURGRJOWZmXpryu55/42mdr16v86k8dPJyXFfdlyolHjuhw/FkFEeCRpaWksmL+U+x+8J0ObPzf8Q3LyZQC2btlJSGhwptd5+JH7WL1qfXo7d2napAFHj4Zz/PgJ0tLSmDNnIZ0f6pihTUREFHv2HMBut2d4/PDhYxw54uzUxsae5NTpBIKCPHN7IDJyOBy39GOUf3VnCcBms/H48z24+8GnaNGkAXVrZZw8LSIymojIaJ557R26vtyLPzdtNShpZjabnSd6DaXNc31pUb8mda87q3Tg2Ani4s/QukldgxLemM1up8sXc2g3cBrN7wijToUyRkfKE1OxUpjLVMAefTTrBj4FsFSpg/WgZwxFupY5KBifStWwHj6QaZlv01YUHTcd/w+Gc2ni5wakyxufkDIUrFGFy7u00VFuiblwAUq1rcfJJf8YHSVXigQHUum+xuz78Xejo3i9EsElSIiNT7+fEJtAYHCJDG3mfvkzdz3ahkmbvuP9aR8xdeBkACL2h9OkfVPMFjNB5UpTuXYVSoZcd1AknwUFl+JUzOn0+6djT1MqOGOGcpXDKFc5jEm/juXrxeNp2qZJ+uMXEy/x8eTBfL/ia94Y8Apms/t2SYLLliY2+uqQv7iYk5QpG5ShTc06irKhZVi7akOm54eVD2XhmpnMXPgtjZvXz/e81ytbNpjo6Nj0+zHRcZQtm/029pnn/sfqleszPf7o452YP29JvmS8kZDQYCKjro7UiIqOJSQkc2fuZpo0rk+BAr4cPRp+G9MJkdG/ehgegMViYf4PE0m8cJG3+w/j8LFwqlWumL7carMRERXN1Amfc/JUPM+/0ZdffvyaogH+xoV2sVjMzP1yIIkXk+j92SQOR0RTrUIoAHa7nZHfz2FYzxeMDXkDFrOZOX27kJicQp8pyzkSm0DVsl529Me3IAUff4vUVTMhNesjb5ZqDbBFHfaMIXjXKlSYIv2GkDR1AiQnZVqctvlP0jb/iU/NuhR+qjsXh7xjQMjcMfkVImTcAE4P/wb7pcyfyZsEdWjEuS3ao4bg5UTLQc+w6dOfcbhxyNS/lSmr8QLXrdaWne/ij3lrWDJ5IdUaKt78shd92/dk7ZzVhFYN47PFozgdfYpD2w+6/4xZVoMCrjv6a/GxEFYplLf+14fSZYOY8MuXPN+uOxYfC3Wb1qZbx9c4FX2SwV99xP1dOrL059/clD1z+GuPXJtMJj4Y1of33hqcqd3pk/G0btCJc2fPU6tudb6aPooHWnXh4kX3/S1nNSAjuyPvTzzZmQYN6/DgfU9neLxMmSBq1lKsWZ25M5jfshpRktszB8HBpZk2bRzduvXy2mth/mu8tRpevnSWlFL3aa2Xu24XA0YDTYC9QG+ttfuu4HQpGuBPk4Z1+XPT1gydpTJBpahXqzq+Pj6EhQRTsXwYEVHR1Kmh3B0xW0X9/WhcR7Fx+770ztKl5MsciYim+4BRAMSfPU/PTyYy7sMeHlPk4YqihQvSuGoIGw9GeldnyWyh4OM9se79G5vO/oyjT61mHjMEL53Fgn+/IaRuWE3aPzfeEFr378ZcJgRTQDEcF867KWAe+FgIGfsRiYvXcnHVRqPT3LLgR1p43BC8nChdtxLtJ74JQOESAZRvWw+Hzc7xFdsMTuZ9EuISKFn26pmYkmVLcvbkmQxt2j55L589NxSAw9s1vgV9CShRlMSE80wfNiW93dAFw4kNj8GdTsfGO4szuASVDSL+ZEKGNqdiT7N/+wFsVhuxkXFEHo0krFIYp2JPc3jvEWJPOM+O/LliIzUb1nRbZyku5iRlQ6+eiQkOKcOpuKtn+Yr4F6Fa9arM+NVZNCGodEm+njGG157pzd5dB0hNdX5X7tt9kBPhUVSsUp69uzKfwc8vMTFxhIaWTb8fEhpMXNypTO1at7mTd/q9wYP3dSU1NTXDskcee4Cli1ditVrzPe/1oqNiKRcWkn4/LLQssbE53zUMCPBn0cLpDBw0gn82b8+PiCIfeGunNr/OeX96ze1RQCzwELAF+Caf3jOTM2fPkXjBOU76ckoKm7bsoFKFchna3HN3CzZv3wXA2XPnCY+MplxI2Uyv5W5nzl8g8aLzyPnllFQ27TpApbCrp6gDivixfsYYlk/+jOWTP6OuquxRHaUzF5NJTHaO8b6cauWfQ1FUKu0Z14PlVIFO3XEkxGDdvDz7RgULYylfHdshz9pR9HvjXWxRJ0hZPDfL5ebg0PTblkrVMPn4eHZHCQj+uDepx05w7ocFN2/s4XwCClOiRU1OL/ecYb85NaNlH2bc2ZsZd/bm6LLNrP9wmnSU8ujorsMEVypLULnSWHx9uPOhVmxdtTlDm/iY09Ru6RxqHVo1DN+CBUhMOE+BQgUoWLggAHVa1cNutWUoDOEOB3ceJKxSKGXLBePj68M9D7flz5UZDwBsWL6RBnc6h6kVCyxKWOUwYk7EcnCnJqB4AMVLFAOgYcsGhB+KyPQe+WXPjv1UrFSOsPIh+Pr60OmRDvy+/I/05RcvXKRZ9Xto2+gh2jZ6iJ3b9qR3lEqULJ4+ZLBchVAqVC5PZES027IDbN+2h8pVKlK+Qhi+vr489ngnli/NODS2Tt2ajB47jK5Pvkp8/JlMr/H4Ew8yf677h+ABbNm6k6pVK1GxYjl8fX3p0uVhFi9ZefMnAr6+vsyf+z0zZsxj/nxj8ou8sTsct/RjFHcMw2ustb4yoHeMUup5N7wnAKcTzvLhx19gs9tx2B10bHcXbVo2Y8Lk6dSqfgdt72pOy2aN+Gvzdjo//QoWs4V3enSneLGi7oqYrfiz5xnw5VRsdjt2h4OOLRvTukldJs5cSM2qFWjbzP1jpHMjPjGJj35ag92Vv0O9qtxdqyKTfttMzXJBtKldib0nTtFn6nISk1NYvy+cr5ZvYcF7/2d0dADMYXfgW7cV9pMnKPTSMADS1s7FVMx5Zsy6fS0APqoRtmN7IS0129dyN0v1OhRs0xFrxFECvvgOgORZkzGXch5FTV25CN/md1OwTQccVhukpnBx9FAjI99UoYa1KPrwvaTo45Rf4Cwvm/DlNC6t97zrxOp8/RYl7qyJb4kA7t4xkaMj52HysQAQNd1Zmrf0A02J/2M3tiTPumgcoP2EHoQ0r0GhEv48t3kcW0bNx+zrzL9vxhqD091Y13FvUbl5DYoEBvDB3xNYNWYeFl/nZm7TzNX4BxWj56JPKORfGIfDQatu9zOqfT9SLibf5JXzh91mZ8rAyXwwfRBmi4V1c1YTdTiSJ/o8xbHdR9i2egs/fjyVV4f3oFP3h3A44Kt3xgFQrFRxPpg+CIfDzpm4M0zo/aXb89tsdsYMGM+oWZ9jNptZOvs3wg9F0L3vCxzcpdm46m82r9tC09aN+XHtFGw2G18N+5bEs87CIBOHfsOXs78AExzac5jFs9xXyt1mszGk/wimzJmAxWxh3k8LOaKP8fZ7r7Fn537WrMh8fc8VTVo05O33XsNqtWG32xnU91POn3NvsRObzca7fYcw79cpWMwWZv44j4MHj9D/w7fZsWMPy5etYcjH71LE34+p08cDEBUVw9NPOivLlSsfSkhoMBv/3Hyjt8nX/G/3GsCypbOwmM1M+2E2+/cfYvCgvmzdtoslS1bRuFE95s39nsDAYjzYqT2DBr5DvfrteOKJh7jrrmaUKBnIc891AaD7S73ZtWufIZ9F5JzDS4fhmfLjlJhSKgrn0DsT0AOoorV2uJbt1lrftCJBWvwx71yjgD0+0ugIt8R+dIfREW6Jfaf3npJP3e55pbBz4/T+QkZHyLPwM9515vN6Rwp49yWo4RbPqFCXFxEOYzpbt0uM9YLREfIsLtUzpvvIq4TLnlVRMrcSU7z72tHY6INGR8izoKAAzyslfBNF/Cre0r79paRwQz5zfm1dJwMBrts/AKWA00qpYMADJ9URQgghhBBC5BdvnWcpXzpLWush2Twep5Ramx/vKYQQQgghhPBMUuAh57LsSAkhhBBCCCH+nRy3+J9R8qt0+O5sFpkA75yZVAghhBBCCJEn3npmKb+uWSoDdATOXve4CfC+iUWEEEIIIYQQ/zn51VlaAvhrrTMVc1BKrcun9xRCCCGEEEJ4IDmzdA2tdfcbLOuaH+8phBBCCCGE8Eze2VXKp3mWhBBCCCGEEMLbGVENTwghhBBCCCE8nnSWhBBCCCGEECIL0lkSQgghhBBCiCxIZ0kIIYQQQgghsiCdJSGEEEIIIYTIgnSWhBBCCCGEECIL+TUprcdSSk0BHgROaa1rG50nN5RS5YDpQDBgB77VWo81NlXOKaUKAeuBgjh/9+ZprQcZmyp3lFIWYCsQrbV+0Og8uaGUCgcuADbAqrVubGigXFJKFQe+A2rjnK6hm9b6b2NT3ZxSSgGzr3moMjBQa/2lQZFyTSnVG3gJ53rfA7yotb5sbKqcUUq9DbwMmIDJnr7es9pGKaVK4PwdqgiEA1201meNyngj2eR/AhgM1ACaaq23GpfwxrLJPxJ4CEgFjuL8/T9nXMqsZZN9GPAwzn2GU8ALWusY41Jm70b7Z0qpvsBIIEhrHW9EvhvJZt0Pxvndc9rV7AOt9TJjEopb8V88szQNuM/oEHlkBd7RWtcAmgM9lFI1Dc6UGylAO611PaA+cJ9SqrnBmXLrbeCA0SFuQVutdX1v6yi5jAWWa62rA/Xwkn8H7VRfa10faAQkAb8YHCvHlFKhQE+gsWsnwAL8n7GpckYpVRvnzkpTnL8zDyqlqhmb6qamkXkb9T7wu9a6GvC7676nmkbm/HuBx3AeLPN008icfxVQW2tdFzgE9Hd3qByaRubsI7XWdV3fP0uAgW5PlXPTyGL/zHWguD1wwt2BcmEaWe9bjrny/S8dJe/1n+ssaa3XA2eMzpEXWutYrfV21+0LOHcWQ41NlXNaa4fW+qLrrq/rx2tmRVZKhQGdcJ7dEG6klCoK3A18D6C1TvXEI7s5cA9wVGsdYXSQXPIBCiulfAA/wCOPTGehBrBJa52ktbYCfwCPGpzphrLZRj0M/OC6/QPwiFtD5UJW+bXWB7TW2qBIuZJN/pWu3x+ATUCY24PlQDbZE6+5WwQP3ubeYP9sDPAu3pld/Av85zpL/xZKqYpAA+Afg6PkilLKopTaiXM4wCqttTfl/xLnF7bd6CB55ABWKqW2KaVeMTpMLlXGOZRhqlJqh1LqO6VUEaND5cH/AT8ZHSI3tNbRwBc4j+rGAue11iuNTZVje4G7lVIllVJ+wANAOYMz5UUZrXUsOA+aAaUNzvNf1g34zegQuaGU+kQpFQk8jWefWcpEKdUZ57D3XUZnyaM3lVK7lVJTlFKBRocReSOdJS+klPIH5gO9rjtq5PG01jbXcIAwoKlrmIzHU0pdGYu8zegst6Cl1rohcD/OIZx3Gx0oF3yAhsBXWusGwCU8eyhSJkqpAkBnYK7RWXLDtYF/GKgEhABFlFLPGJsqZ7TWB4DPcQ6jWg7swjmcWYhcU0p9iPP3Z6bRWXJDa/2h1rocztxvGp0np1wHOD7Eyzp41/gKqILzsoNYYJSxcUReSWfJyyilfHF2lGZqrRcYnSevXEOo1uE914+1BDq7iiT8DLRTSs0wNFEuXbmoV2t9Cuc1M02NTZQrUUDUNWci5+HsPHmT+4HtWuuTRgfJpXuB41rr01rrNGABcKfBmXJMa/291rqh1vpunMNkDhudKQ9OKqXKArj+f8rgPP85SqnncV7A/7TW2mOHg93ELOBxo0PkQhWcB2l2uba9YcB2pVSwkaFySmt90nWA2A5Mxru2ueIa0lnyIkopE85rNg5orUcbnSe3lFJBropmKKUK49wJO2hsqpzRWvfXWodprSviHEq1RmvtFUfXAZRSRZRSAVduAx1wDlHyClrrOCDSVVkOnNf+7DcwUl48hZcNwXM5ATRXSvm5voPuwUuKawAopUq7/l8eZ5EBb/w3WAQ877r9PLDQwCz/OUqp+4D3gM5a6ySj8+TGdQVNOuMl21wArfUerXVprXVF17Y3Cmjo2h54vCsHOFwexYu2uSIjk8PhrQdI8kYp9RPQBigFnAQGaa2/NzRUDimlWgEbcJbuvXLdjNeUolRK1cV5cbIFZ0d9jtZ6qLGpck8p1Qbo602lw5VSlblagc0HmKW1/sTASLmmlKqPs7hGAeAYzvK9Hlk++Xqu4SSRQGWt9Xmj8+SWUmoI8CTOIUg7gJe01inGpsoZpdQGoCSQBvTRWv9ucKQbymobBfwKzAHK4+y8PqG19siLybPJfwYYDwQB54CdWuuORmW8kWzy98c55UWCq9kmrfVrhgS8gWyyPwAonPsMEcBrrusQPc7N9s9cZ5cae2jp8KzWfRucQ/AcOEv+v3rl2kPhXf5znSUhhBBCCCGEyAkZhieEEEIIIYQQWZDOkhBCCCGEEEJkQTpLQgghhBBCCJEF6SwJIYQQQgghRBaksySEEEIIIYQQWZDOkhBC/IsopYorpd7Nh9etqJR65Xa/bi4z9Loyb5Lr/mCl1BdGZhJCCPHvJp0lIYT4dykOZNtZUkr55PF1KwKGdpaAXkDpm7YSQgghbhOZZ0kIIQymlGoBjAQCXA/101qvVEo1AcYBRYBLQE+t9RalVEVgK/ANzkkn/YDuWus/lVJLgY44Z4tP0lrfqZRaB/wFNAMuAw8DS3FO1loY2IxzwsRUV57+QFecE1leAlrhnAy7EnAIOKK1/t91n+EF13POAXWBaOAt1+eqBmwBntFaO5RSZYCvgSqACRiptZ7uep1wYDrQHigLfKG1nqCU+hDnRI/HXJ+hK9AF54SbxYDKwFGcE7Ym5fbfQAghhMiKnFkSQggDKaVKAL8A72qt6wENgS1KqQLAfOAjrXVdYAAw3/U4ODs6f2utGwBDgc9dj/cAzmmt62ut77zmrWoDHbXWnQAb0FVr3dj1uAXo5srzPNAZaOnK85DW2u563f2u183QUbpGE6CP1ro6kAzMwtmpqQnUAe5xtRsH7HV9rg7A50qp2te8jp/WugXQBhiulPLXWn8CxAD/c2XY72rb2PUeNQBf4OkbrG4hhBAiV6SzJIQQxmqBsxPyF4DW2qa1PovzjEmq1nq16/HfgVTX4wAXtdZLXLc34TxLcyOztNZW120z0FcptRPYDbQD6ruWPQh8pbVOdL1vQi4+y0atdZTr9g7gT631edf77gKqupbdi/OsGFrrWJxnudpe8zo/u5aFA2eBsBu85wqt9TmttQP4h5uvByGEECLHpLMkhBDGMt3g8azGSV95LOWax2zAza5FunjN7a44h9bdpbWuA0wCCt0kT05cvi7T9fevzXj9Z7v2/o2ed7P3zOs1WUIIIUQm0lkSQghj/QXUdF23hFLKopQKBA4CBZVSbV2Pt8U5zOzQTV4vEfC7SSGH4kC81vqCUqoYzs7TFYuB15VSAa73LXnN6xbL3UfL1mpcxSKUUsE4r7tam4Pn3c4MQgghxE1JZ0kIIQyktT4DPAaMVkrtBrYBjVzFFh4HPnU9/inO63VSc/B6M4E9Sqm/smk2HQhQSu0D5gIbrlu2GNiklNoFLFRKmXEO19NKqb1KqXl5/bwuPYF6rs+1Cnhfa70vB88bB0xVSu1UStW8xQxCCCHETUk1PCGEEEIIIYTIgpxZEkIIIYQQQogsSGdJCCGEEEIIIbIgnSUhhBBCCCGEyIJ0loQQQgghhBAiC9JZEkIIIYQQQogsSGdJCCGEEEIIIbIgnSUhhBBCCCGEyIJ0loQQQgghhBAiC/8P+FlWHiv+U+4AAAAASUVORK5CYII=\n", 394 | "text/plain": [ 395 | "
" 396 | ] 397 | }, 398 | "metadata": {}, 399 | "output_type": "display_data" 400 | } 401 | ], 402 | "source": [ 403 | "import seaborn as sns\n", 404 | "ax = sns.heatmap(pct_spreads, annot=True)\n", 405 | "ax.set_title(\"Average dollar spread between CL contracts\")" 406 | ] 407 | }, 408 | { 409 | "cell_type": "markdown", 410 | "metadata": {}, 411 | "source": [ 412 | "***\n", 413 | "\n", 414 | "## *Next Up*\n", 415 | "\n", 416 | "Part 3: [Moonshot Strategy](Part3-Moonshot-Strategy.ipynb)" 417 | ] 418 | } 419 | ], 420 | "metadata": { 421 | "kernelspec": { 422 | "display_name": "Python 3.11", 423 | "language": "python", 424 | "name": "python3" 425 | }, 426 | "language_info": { 427 | "codemirror_mode": { 428 | "name": "ipython", 429 | "version": 3 430 | }, 431 | "file_extension": ".py", 432 | "mimetype": "text/x-python", 433 | "name": "python", 434 | "nbconvert_exporter": "python", 435 | "pygments_lexer": "ipython3", 436 | "version": "3.11.0" 437 | } 438 | }, 439 | "nbformat": 4, 440 | "nbformat_minor": 4 441 | } 442 | -------------------------------------------------------------------------------- /calspread/Part4-Realtime-Data-Collection.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "\"QuantRocket
\n", 8 | "Disclaimer" 9 | ] 10 | }, 11 | { 12 | "cell_type": "markdown", 13 | "metadata": {}, 14 | "source": [ 15 | "***\n", 16 | "[Intraday Futures Calendar Spreads](Introduction.ipynb) › Part 4: Real-Time Data Collection\n", 17 | "***" 18 | ] 19 | }, 20 | { 21 | "cell_type": "markdown", 22 | "metadata": {}, 23 | "source": [ 24 | "# Real-Time Data Collection\n", 25 | "\n", 26 | "For paper trading we will collect native combo data each day for the calendar spread that interests us. " 27 | ] 28 | }, 29 | { 30 | "cell_type": "markdown", 31 | "metadata": {}, 32 | "source": [ 33 | "## Create real-time database\n", 34 | "\n", 35 | "First, we create a tick db for collecting bid and ask prices. We associate it with the 'cl-fut' universe (because this argument is required) but in reality we will specify a particular combo each time we collect data. Importantly, we specify `primary_exchange=True` to indicate that we want to collect native combo data. (See the usage guide for more on combos.)" 36 | ] 37 | }, 38 | { 39 | "cell_type": "code", 40 | "execution_count": 1, 41 | "metadata": {}, 42 | "outputs": [ 43 | { 44 | "data": { 45 | "text/plain": [ 46 | "{'status': 'successfully created tick database cl-combo-tick'}" 47 | ] 48 | }, 49 | "execution_count": 1, 50 | "metadata": {}, 51 | "output_type": "execute_result" 52 | } 53 | ], 54 | "source": [ 55 | "from quantrocket.realtime import create_ibkr_tick_db\n", 56 | "create_ibkr_tick_db(\"cl-combo-tick\", universes=\"cl-fut\", fields=[\"BidPrice\", \"AskPrice\"], primary_exchange=True)" 57 | ] 58 | }, 59 | { 60 | "cell_type": "markdown", 61 | "metadata": {}, 62 | "source": [ 63 | "Then, we create an aggregate database of 1-minute bars from the tick database. As data is collected into the tick database, it will automatically be aggregated into 1-minute bars in the aggregate database." 64 | ] 65 | }, 66 | { 67 | "cell_type": "code", 68 | "execution_count": 2, 69 | "metadata": {}, 70 | "outputs": [ 71 | { 72 | "data": { 73 | "text/plain": [ 74 | "{'status': 'successfully created aggregate database cl-combo-tick-1min from tick database cl-combo-tick'}" 75 | ] 76 | }, 77 | "execution_count": 2, 78 | "metadata": {}, 79 | "output_type": "execute_result" 80 | } 81 | ], 82 | "source": [ 83 | "from quantrocket.realtime import create_agg_db\n", 84 | "create_agg_db(\"cl-combo-tick-1min\", tick_db_code=\"cl-combo-tick\", bar_size=\"1min\", fields={\"BidPrice\": [\"Close\"], \"AskPrice\": [\"Close\"]})" 85 | ] 86 | }, 87 | { 88 | "cell_type": "markdown", 89 | "metadata": {}, 90 | "source": [ 91 | "## Collect real-time data\n", 92 | "\n", 93 | "Each day, we want to collect native combo market data for the calendar spread of month 1 and 2 (in this example). The exact contracts which make up this combo will change over time, specifically, on each new rollover date. \n", 94 | "\n", 95 | "We create a custom script to carry out our data collection strategy. The custom code is provided in a function called `collect_combo` in the file [collect_combo.py](collect_combo.py). The function performs the following steps:\n", 96 | "\n", 97 | "* query the securities master database and identify the current month 1 and month 2 contracts\n", 98 | "* create a combo from these contracts (if it doesn't already exist)\n", 99 | "* initiate real-time data collection for this combo\n", 100 | "\n", 101 | "### Running the custom code\n", 102 | "\n", 103 | "The custom code can be run by importing the function in Python or at the command line using the satellite service. The advantage of using the satellite service is that we can schedule the command to run daily from our countdown service crontab (see the scheduling notebook). The command is shown below. It can be executed manually for testing purposes by executing the following cell:" 104 | ] 105 | }, 106 | { 107 | "cell_type": "code", 108 | "execution_count": null, 109 | "metadata": {}, 110 | "outputs": [], 111 | "source": [ 112 | "!quantrocket satellite exec 'codeload.calspread.collect_combo.collect_combo' --params 'universe:cl-fut' 'contract_months:[1,2]' 'tick_db:cl-combo-tick' 'until:16:30:00 America/New_York'" 113 | ] 114 | }, 115 | { 116 | "cell_type": "markdown", 117 | "metadata": {}, 118 | "source": [ 119 | "***\n", 120 | "\n", 121 | "## *Next Up*\n", 122 | "\n", 123 | "Part 5: [Moonshot Native Spread Strategy](Part5-Moonshot-Native-Spread-Strategy.ipynb)" 124 | ] 125 | } 126 | ], 127 | "metadata": { 128 | "kernelspec": { 129 | "display_name": "Python 3.11", 130 | "language": "python", 131 | "name": "python3" 132 | }, 133 | "language_info": { 134 | "codemirror_mode": { 135 | "name": "ipython", 136 | "version": 3 137 | }, 138 | "file_extension": ".py", 139 | "mimetype": "text/x-python", 140 | "name": "python", 141 | "nbconvert_exporter": "python", 142 | "pygments_lexer": "ipython3", 143 | "version": "3.11.0" 144 | } 145 | }, 146 | "nbformat": 4, 147 | "nbformat_minor": 4 148 | } 149 | -------------------------------------------------------------------------------- /calspread/Part5-Moonshot-Native-Spread-Strategy.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "\"QuantRocket
\n", 8 | "Disclaimer" 9 | ] 10 | }, 11 | { 12 | "cell_type": "markdown", 13 | "metadata": {}, 14 | "source": [ 15 | "***\n", 16 | "[Intraday Futures Calendar Spreads](Introduction.ipynb) › Part 5: Moonshot Native Spread Strategy\n", 17 | "***" 18 | ] 19 | }, 20 | { 21 | "cell_type": "markdown", 22 | "metadata": {}, 23 | "source": [ 24 | "# Moonshot Native Spread Strategy\n", 25 | "\n", 26 | "To run the earlier Moonshot strategy on a native calendar spread requires modified code because we are now trading a single instrument instead of multiple instruments. The modified code is provided in [calspread_native.py](calspread_native.py). " 27 | ] 28 | }, 29 | { 30 | "cell_type": "markdown", 31 | "metadata": {}, 32 | "source": [ 33 | "## Code highlights\n", 34 | "\n", 35 | "### Target weights\n", 36 | "Moonshot expects target weights to be defined as a percentage of capital: for example, a target weight of 0.10 tells Moonshot to buy a number of futures contracts equal to 10% of capital, based on the contract's price and multiplier. This presents a problem for native combos, as the combo price is often a small number (specifically, the difference in price of the two legs), which can result in Moonshot calculating a large number of contracts that should be ordered. \n", 37 | "\n", 38 | "The recommended solution is to specify the exact number of spread contracts to order, rather than relying on percentage weights. To accomplish this, we first set the percentage weights extremely high in `signals_to_target_weights`:\n", 39 | " \n", 40 | "```python\n", 41 | "def signals_to_target_weights(self, signals, prices):\n", 42 | " weights = signals * 1000\n", 43 | " return weights\n", 44 | "```\n", 45 | "\n", 46 | "Then, we reduce the weights to the exact desired quantities (in this example 1 contract) in `limit_position_sizes`:\n", 47 | "\n", 48 | "```python\n", 49 | "def limit_position_sizes(self, prices):\n", 50 | " \"\"\"\n", 51 | " Limit the position sizes to 1 spread contract.\n", 52 | "\n", 53 | " (Note that limit_position_sizes only cares about absolute values so no need\n", 54 | " to worry about signs.)\n", 55 | " \"\"\"\n", 56 | " bids = prices.loc[\"BidPriceClose\"]\n", 57 | " ones = pd.DataFrame(1, index=bids.index, columns=bids.columns)\n", 58 | " max_quantities_for_longs = max_quantities_for_shorts = ones\n", 59 | " return max_quantities_for_longs, max_quantities_for_shorts\n", 60 | "```\n", 61 | "\n", 62 | "### Orders\n", 63 | "To support live/paper trading, the native spread strategy defines an `order_stubs_to_orders` method which routes orders to NYMEX, ensuring the combo orders are executed as native orders (see the usage guide to learn more):\n", 64 | "\n", 65 | "```python\n", 66 | "def order_stubs_to_orders(self, orders, prices):\n", 67 | " orders[\"Exchange\"] = \"NYMEX\"\n", 68 | " orders[\"OrderType\"] = \"MKT\"\n", 69 | " orders[\"Tif\"] = \"DAY\"\n", 70 | " return orders\n", 71 | "```" 72 | ] 73 | }, 74 | { 75 | "cell_type": "markdown", 76 | "metadata": {}, 77 | "source": [ 78 | "### Install strategy file\n", 79 | "\n", 80 | "Install the strategy by moving it to the `/codeload/moonshot` directory:" 81 | ] 82 | }, 83 | { 84 | "cell_type": "code", 85 | "execution_count": 1, 86 | "metadata": {}, 87 | "outputs": [], 88 | "source": [ 89 | "!mv calspread_native.py /codeload/moonshot/" 90 | ] 91 | }, 92 | { 93 | "cell_type": "markdown", 94 | "metadata": {}, 95 | "source": [ 96 | "## Example Backtest\n", 97 | "\n", 98 | "After collecting an adequate amount of real-time data (at least enough to cover `BBAND_LOOKBACK_WINDOW`), it is possible to run a backtest of the modified strategy. To generate trading activity for the backtest, we use the `params` argument to reset some parameters on-the-fly to lower their thresholds:" 99 | ] 100 | }, 101 | { 102 | "cell_type": "code", 103 | "execution_count": 2, 104 | "metadata": {}, 105 | "outputs": [], 106 | "source": [ 107 | "from quantrocket.moonshot import backtest\n", 108 | "backtest(\"calspread-native-cl\", \n", 109 | " filepath_or_buffer=\"calspread_native_cl_results.csv\", \n", 110 | " params={\n", 111 | " \"BBAND_LOOKBACK_WINDOW\":10,\n", 112 | " \"BBAND_STD\": 1},\n", 113 | " nlv={\"USD\":500000},\n", 114 | " details=True)" 115 | ] 116 | }, 117 | { 118 | "cell_type": "markdown", 119 | "metadata": {}, 120 | "source": [ 121 | "Then we see if there were any trades:" 122 | ] 123 | }, 124 | { 125 | "cell_type": "code", 126 | "execution_count": 3, 127 | "metadata": {}, 128 | "outputs": [ 129 | { 130 | "data": { 131 | "text/plain": [ 132 | "" 133 | ] 134 | }, 135 | "execution_count": 3, 136 | "metadata": {}, 137 | "output_type": "execute_result" 138 | }, 139 | { 140 | "data": { 141 | "image/png": "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\n", 142 | "text/plain": [ 143 | "
" 144 | ] 145 | }, 146 | "metadata": {}, 147 | "output_type": "display_data" 148 | } 149 | ], 150 | "source": [ 151 | "from quantrocket.moonshot import read_moonshot_csv\n", 152 | "results = read_moonshot_csv(\"calspread_native_cl_results.csv\")\n", 153 | "results.loc[\"NetExposure\"].plot()" 154 | ] 155 | }, 156 | { 157 | "cell_type": "markdown", 158 | "metadata": {}, 159 | "source": [ 160 | "## Account allocation\n", 161 | "\n", 162 | "To trade the strategy, we must allocate `calspread-native-cl` to one or more accounts. Open [quantrocket.moonshot.allocations.yml](quantrocket.moonshot.allocations.yml), edit the account number to match your live or paper IB account, and edit the capital allocation percentage as desired.\n", 163 | "\n", 164 | "If you don't already have a `quantrocket.moonshot.allocations.yml` in the `/codeload` directory (i.e. top level of the Jupyter file browser), you can execute the following command to copy it over. Otherwise, append the new allocation to your existing file." 165 | ] 166 | }, 167 | { 168 | "cell_type": "code", 169 | "execution_count": 1, 170 | "metadata": {}, 171 | "outputs": [], 172 | "source": [ 173 | "# move file over unless it already exists\n", 174 | "![ -e /codeload/quantrocket.moonshot.allocations.y*ml ] && echo 'oops, the file already exists!' || mv quantrocket.moonshot.allocations.yml /codeload/" 175 | ] 176 | }, 177 | { 178 | "cell_type": "markdown", 179 | "metadata": {}, 180 | "source": [ 181 | "## Generate Moonshot orders\n", 182 | "\n", 183 | "Next we can run Moonshot's `trade` command to generate example orders. \n", 184 | "\n", 185 | "First, we check the backtest results for a time when a signal was generated: " 186 | ] 187 | }, 188 | { 189 | "cell_type": "code", 190 | "execution_count": 4, 191 | "metadata": {}, 192 | "outputs": [ 193 | { 194 | "data": { 195 | "text/html": [ 196 | "
\n", 197 | "\n", 210 | "\n", 211 | " \n", 212 | " \n", 213 | " \n", 214 | " \n", 215 | " \n", 216 | " \n", 217 | " \n", 218 | " \n", 219 | " \n", 220 | " \n", 221 | " \n", 222 | " \n", 223 | " \n", 224 | " \n", 225 | " \n", 226 | " \n", 227 | " \n", 228 | " \n", 229 | " \n", 230 | " \n", 231 | " \n", 232 | " \n", 233 | " \n", 234 | " \n", 235 | " \n", 236 | " \n", 237 | " \n", 238 | " \n", 239 | " \n", 240 | " \n", 241 | " \n", 242 | " \n", 243 | " \n", 244 | " \n", 245 | " \n", 246 | " \n", 247 | "
CL(IC1)
DateTime
2019-09-2316:03:00-1.0
16:07:00-1.0
16:17:00-1.0
16:22:00-1.0
2019-09-2408:14:001.0
\n", 248 | "
" 249 | ], 250 | "text/plain": [ 251 | " CL(IC1)\n", 252 | "Date Time \n", 253 | "2019-09-23 16:03:00 -1.0\n", 254 | " 16:07:00 -1.0\n", 255 | " 16:17:00 -1.0\n", 256 | " 16:22:00 -1.0\n", 257 | "2019-09-24 08:14:00 1.0" 258 | ] 259 | }, 260 | "execution_count": 4, 261 | "metadata": {}, 262 | "output_type": "execute_result" 263 | } 264 | ], 265 | "source": [ 266 | "signals = results.loc[\"Signal\"]\n", 267 | "signals.where(signals != 0).dropna().head()" 268 | ] 269 | }, 270 | { 271 | "cell_type": "markdown", 272 | "metadata": {}, 273 | "source": [ 274 | "For testing purposes, edit the strategy file so that the strategy parameters match those used to produce the backtest results (`BBAND_WINDOW = 10` and `BBAND_STD = 1` were the parameters we set on-the-fly in this example). \n", 275 | "\n", 276 | "Then we can use the `--review-date` parameter to tell Moonshot to generate orders as if it were one of the above example times. Moonshot returns a CSV of orders, which we format for the terminal with `csvlook`:" 277 | ] 278 | }, 279 | { 280 | "cell_type": "code", 281 | "execution_count": 5, 282 | "metadata": {}, 283 | "outputs": [ 284 | { 285 | "name": "stdout", 286 | "output_type": "stream", 287 | "text": [ 288 | "| Sid | Account | Action | OrderRef | TotalQuantity | Exchange | OrderType | Tif |\n", 289 | "| --- | ------- | ------ | ------------------- | ------------- | -------- | --------- | --- |\n", 290 | "| IC1 | DU12345 | SELL | calspread-native-cl | 1 | NYMEX | MKT | DAY |\n" 291 | ] 292 | } 293 | ], 294 | "source": [ 295 | "!quantrocket moonshot trade 'calspread-native-cl' --review-date '2019-09-23 16:17:00' | csvlook -I" 296 | ] 297 | }, 298 | { 299 | "cell_type": "markdown", 300 | "metadata": {}, 301 | "source": [ 302 | "***\n", 303 | "\n", 304 | "## *Next Up*\n", 305 | "\n", 306 | "Part 6: [Scheduling](Part6-Scheduling.ipynb)" 307 | ] 308 | } 309 | ], 310 | "metadata": { 311 | "kernelspec": { 312 | "display_name": "Python 3.11", 313 | "language": "python", 314 | "name": "python3" 315 | }, 316 | "language_info": { 317 | "codemirror_mode": { 318 | "name": "ipython", 319 | "version": 3 320 | }, 321 | "file_extension": ".py", 322 | "mimetype": "text/x-python", 323 | "name": "python", 324 | "nbconvert_exporter": "python", 325 | "pygments_lexer": "ipython3", 326 | "version": "3.11.0" 327 | } 328 | }, 329 | "nbformat": 4, 330 | "nbformat_minor": 4 331 | } 332 | -------------------------------------------------------------------------------- /calspread/Part6-Scheduling.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "\"QuantRocket
\n", 8 | "Disclaimer" 9 | ] 10 | }, 11 | { 12 | "cell_type": "markdown", 13 | "metadata": {}, 14 | "source": [ 15 | "***\n", 16 | "[Intraday Futures Calendar Spreads](Introduction.ipynb) › Part 6: Scheduling\n", 17 | "***" 18 | ] 19 | }, 20 | { 21 | "cell_type": "markdown", 22 | "metadata": {}, 23 | "source": [ 24 | "# Scheduling\n", 25 | "\n", 26 | "An example crontab for scheduling data collection and paper trading is provided in [quantrocket.countdown.crontab.sh](quantrocket.countdown.crontab.sh)." 27 | ] 28 | }, 29 | { 30 | "cell_type": "markdown", 31 | "metadata": {}, 32 | "source": [ 33 | "## Code highlights \n", 34 | "\n", 35 | "The following line executes the custom script each morning at 8 AM to initiate real-time data collection for the combo:\n", 36 | "\n", 37 | "```shell\n", 38 | "0 8 * * mon-fri quantrocket satellite exec 'codeload.calspread.collect_combo.collect_combo' --params 'universe:cl-fut' 'contract_months:[1,2]' 'tick_db:cl-combo-tick' 'until:16:30:00 America/New_York'\n", 39 | "```\n", 40 | "\n", 41 | "The trading strategy runs every minute from 9 AM to 3:59 PM, with orders simply logged to flightlog:\n", 42 | "\n", 43 | "```shell\n", 44 | "* 9-15 * * mon-fri quantrocket moonshot trade 'calspread-native-cl' | quantrocket flightlog log -n 'quantrocket.moonshot'\n", 45 | "```" 46 | ] 47 | }, 48 | { 49 | "cell_type": "markdown", 50 | "metadata": {}, 51 | "source": [ 52 | "## Install the crontab\n", 53 | "\n", 54 | "> This section assumes that you're not already using your `countdown` service for any scheduled tasks and that you haven't yet set its timezone. If you're already using `countdown`, you can edit your existing crontab, or add a new countdown service for New York tasks. See the usage guide for help. \n", 55 | "\n", 56 | "All the commands on the provided crontab are intended to be run in New York time. By default, the countdown timezone is UTC:" 57 | ] 58 | }, 59 | { 60 | "cell_type": "code", 61 | "execution_count": 1, 62 | "metadata": {}, 63 | "outputs": [ 64 | { 65 | "data": { 66 | "text/plain": [ 67 | "{'timezone': 'UTC'}" 68 | ] 69 | }, 70 | "execution_count": 1, 71 | "metadata": {}, 72 | "output_type": "execute_result" 73 | } 74 | ], 75 | "source": [ 76 | "from quantrocket.countdown import get_timezone, set_timezone\n", 77 | "get_timezone()" 78 | ] 79 | }, 80 | { 81 | "cell_type": "markdown", 82 | "metadata": {}, 83 | "source": [ 84 | "So first, set the countdown timezone to New York time:" 85 | ] 86 | }, 87 | { 88 | "cell_type": "code", 89 | "execution_count": 2, 90 | "metadata": {}, 91 | "outputs": [ 92 | { 93 | "data": { 94 | "text/plain": [ 95 | "{'status': 'successfully set timezone to America/New_York'}" 96 | ] 97 | }, 98 | "execution_count": 2, 99 | "metadata": {}, 100 | "output_type": "execute_result" 101 | } 102 | ], 103 | "source": [ 104 | "set_timezone(\"America/New_York\")" 105 | ] 106 | }, 107 | { 108 | "cell_type": "markdown", 109 | "metadata": {}, 110 | "source": [ 111 | "Install the crontab by moving it to the `/codeload` directory. (First open a flightlog terminal so you can see if it loads successfully.)" 112 | ] 113 | }, 114 | { 115 | "cell_type": "code", 116 | "execution_count": 3, 117 | "metadata": {}, 118 | "outputs": [], 119 | "source": [ 120 | "# move file over unless it already exists\n", 121 | "![ -e /codeload/quantrocket.countdown.crontab* ] && echo 'oops, the file already exists!' || mv quantrocket.countdown.crontab.sh /codeload/" 122 | ] 123 | }, 124 | { 125 | "cell_type": "markdown", 126 | "metadata": {}, 127 | "source": [ 128 | "You should see a success message in flightlog:\n", 129 | "\n", 130 | "```\n", 131 | "quantrocket.countdown: INFO Successfully loaded quantrocket.countdown.crontab.sh\n", 132 | "```" 133 | ] 134 | }, 135 | { 136 | "cell_type": "markdown", 137 | "metadata": {}, 138 | "source": [ 139 | "***\n", 140 | "\n", 141 | "[Back to Introduction](Introduction.ipynb)" 142 | ] 143 | } 144 | ], 145 | "metadata": { 146 | "kernelspec": { 147 | "display_name": "Python 3.11", 148 | "language": "python", 149 | "name": "python3" 150 | }, 151 | "language_info": { 152 | "codemirror_mode": { 153 | "name": "ipython", 154 | "version": 3 155 | }, 156 | "file_extension": ".py", 157 | "mimetype": "text/x-python", 158 | "name": "python", 159 | "nbconvert_exporter": "python", 160 | "pygments_lexer": "ipython3", 161 | "version": "3.11.0" 162 | } 163 | }, 164 | "nbformat": 4, 165 | "nbformat_minor": 4 166 | } 167 | -------------------------------------------------------------------------------- /calspread/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/quantrocket-codeload/calspread/b689f10a0003fd1a7ee62dc51d3f2d118a8a3bea/calspread/__init__.py -------------------------------------------------------------------------------- /calspread/calspread.py: -------------------------------------------------------------------------------- 1 | # Copyright 2019 QuantRocket LLC - All Rights Reserved 2 | # 3 | # Licensed under the Apache License, Version 2.0 (the "License"); 4 | # you may not use this file except in compliance with the License. 5 | # You may obtain a copy of the License at 6 | # 7 | # http://www.apache.org/licenses/LICENSE-2.0 8 | # 9 | # Unless required by applicable law or agreed to in writing, software 10 | # distributed under the License is distributed on an "AS IS" BASIS, 11 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | # See the License for the specific language governing permissions and 13 | # limitations under the License. 14 | 15 | import pandas as pd 16 | from moonshot import Moonshot 17 | from moonshot.commission import FuturesCommission 18 | from quantrocket.master import get_contract_nums_reindexed_like 19 | 20 | 21 | class NymexCommission(FuturesCommission): 22 | BROKER_COMMISSION_PER_CONTRACT = 0.85 23 | EXCHANGE_FEE_PER_CONTRACT = 1.50 + 0.02 24 | CARRYING_FEE_PER_CONTRACT = 0 # Depends on equity in excess of margin requirement 25 | 26 | 27 | class CalendarSpreadStrategy(Moonshot): 28 | """ 29 | Intraday pairs trading strategy for futures calendar spreads. 30 | """ 31 | 32 | CODE = None 33 | DB = None 34 | DB_FIELDS = ["Close", "Open"] 35 | LOOKBACK_WINDOW = 0 # explicitly set LOOKBACK_WINDOW to 0 to avoid loading too much data 36 | BBAND_LOOKBACK_WINDOW = 60 # Compute Bollinger Bands over this period (number of minutes) 37 | BBAND_STD = 2 # Set Bollinger Bands this many standard deviations away from mean 38 | CONTRACT_NUMS = 1, 2 # the contract numbers from which to form the spread (1 = front month) 39 | FILL_AT_MIDPOINT = False # True to model getting filled at the midpoint, False to pay the spread 40 | 41 | def prices_to_signals(self, prices: pd.DataFrame): 42 | """ 43 | Generates a DataFrame of signals indicating whether to long or short 44 | the spread. 45 | """ 46 | # for BID_ASK bar type, Open contains the average bid and Close contains 47 | # the avg ask 48 | bids = prices.loc["Open"] 49 | asks = prices.loc["Close"] 50 | 51 | # Get a DataFrame of contract numbers and a Boolean mask of the 52 | # contract nums constituting the spread 53 | contract_nums = get_contract_nums_reindexed_like(bids, limit=max(self.CONTRACT_NUMS)) 54 | are_month_a_contracts = contract_nums == self.CONTRACT_NUMS[0] 55 | are_month_b_contracts = contract_nums == self.CONTRACT_NUMS[1] 56 | 57 | # Get a Series of bids and asks for the respective contract months by 58 | # masking with contract num and taking the mean of each row (relying on 59 | # the fact that the mask leaves only one observation per row) 60 | month_a_bids = bids.where(are_month_a_contracts).mean(axis=1) 61 | month_a_asks = asks.where(are_month_a_contracts).mean(axis=1) 62 | 63 | month_b_bids = bids.where(are_month_b_contracts).mean(axis=1) 64 | month_b_asks = asks.where(are_month_b_contracts).mean(axis=1) 65 | 66 | # Buying the spread means buying the month A contract at the ask and 67 | # selling the month B contract at the bid 68 | spreads_for_buys = month_a_asks - month_b_bids 69 | means_for_buys = spreads_for_buys.fillna(method="ffill").rolling(self.BBAND_LOOKBACK_WINDOW).mean() 70 | stds_for_buys = spreads_for_buys.fillna(method="ffill").rolling(self.BBAND_LOOKBACK_WINDOW).std() 71 | upper_bands_for_buys = means_for_buys + self.BBAND_STD * stds_for_buys 72 | lower_bands_for_buys = means_for_buys - self.BBAND_STD * stds_for_buys 73 | 74 | # Selling the spread means selling the month A contract at the bid 75 | # and buying the month B contract at the ask 76 | spreads_for_sells = month_a_bids - month_b_asks 77 | means_for_sells = spreads_for_sells.fillna(method="ffill").rolling(self.BBAND_LOOKBACK_WINDOW).mean() 78 | stds_for_sells = spreads_for_sells.fillna(method="ffill").rolling(self.BBAND_LOOKBACK_WINDOW).std() 79 | upper_bands_for_sells = means_for_sells + self.BBAND_STD * stds_for_buys 80 | lower_bands_for_sells = means_for_sells - self.BBAND_STD * stds_for_buys 81 | 82 | # Long (short) the spread when it crosses below (above) the lower (upper) 83 | # band, then exit when it crosses the mean 84 | long_entries = spreads_for_buys < lower_bands_for_buys 85 | long_exits = spreads_for_buys >= means_for_buys 86 | short_entries = spreads_for_sells > upper_bands_for_sells 87 | short_exits = spreads_for_sells <= means_for_sells 88 | 89 | # Combine entries and exits 90 | ones = pd.Series(1, index=spreads_for_buys.index) 91 | zeros = pd.Series(0, index=spreads_for_buys.index) 92 | minus_ones = pd.Series(-1, index=spreads_for_buys.index) 93 | long_signals = ones.where(long_entries).fillna(zeros.where(long_exits)).fillna(method="ffill") 94 | short_signals = minus_ones.where(short_entries).fillna(zeros.where(short_exits)).fillna(method="ffill") 95 | signals = long_signals + short_signals 96 | 97 | # Broadcast Series to DataFrame 98 | signals = bids.apply(lambda x: signals) 99 | 100 | # Signal applies to month A contract, reverse signal applies to month 101 | # B contract 102 | signals = signals.where(are_month_a_contracts).fillna( 103 | -signals.where(are_month_b_contracts)).fillna(0) 104 | return signals 105 | 106 | def signals_to_target_weights(self, signals: pd.DataFrame, prices: pd.DataFrame): 107 | # allocate half of capital to each signal 108 | weights = signals / 2 109 | return weights 110 | 111 | def target_weights_to_positions(self, weights: pd.DataFrame, prices: pd.DataFrame): 112 | # Enter in the period after the signal 113 | positions = weights.shift() 114 | return positions 115 | 116 | def positions_to_gross_returns(self, positions: pd.DataFrame, prices: pd.DataFrame): 117 | bids = prices.loc["Open"] 118 | asks = prices.loc["Close"] 119 | midpoints = (bids + asks) / 2 120 | 121 | if self.FILL_AT_MIDPOINT: 122 | trade_prices = midpoints 123 | else: 124 | # We buy at the ask and sell at the bid 125 | are_buys = positions.diff() > 0 126 | are_sells = positions.diff() < 0 127 | 128 | trade_prices = asks.where(are_buys).fillna( 129 | bids.where(are_sells)).fillna(midpoints) 130 | 131 | gross_returns = trade_prices.pct_change() * positions.shift() 132 | return gross_returns 133 | 134 | 135 | class CLCalendarSpreadStrategy(CalendarSpreadStrategy): 136 | 137 | CODE = "calspread-cl" 138 | UNIVERSES = "cl-fut" 139 | DB = "cl-1min-bbo" 140 | CONTRACT_NUMS = (1, 2) 141 | BBAND_LOOKBACK_WINDOW = 60 142 | BBAND_STD = 2 143 | COMMISSION_CLASS = NymexCommission 144 | 145 | 146 | class FrictionlessCLCalendarSpreadStrategy(CLCalendarSpreadStrategy): 147 | 148 | CODE = "calspread-cl-frictionless" 149 | COMMISSION_CLASS = None 150 | FILL_AT_MIDPOINT = True 151 | -------------------------------------------------------------------------------- /calspread/calspread_native.py: -------------------------------------------------------------------------------- 1 | # Copyright 2019 QuantRocket LLC - All Rights Reserved 2 | # 3 | # Licensed under the Apache License, Version 2.0 (the "License"); 4 | # you may not use this file except in compliance with the License. 5 | # You may obtain a copy of the License at 6 | # 7 | # http://www.apache.org/licenses/LICENSE-2.0 8 | # 9 | # Unless required by applicable law or agreed to in writing, software 10 | # distributed under the License is distributed on an "AS IS" BASIS, 11 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | # See the License for the specific language governing permissions and 13 | # limitations under the License. 14 | 15 | import pandas as pd 16 | from moonshot import Moonshot 17 | from moonshot.commission import FuturesCommission 18 | from quantrocket.master import get_contract_nums_reindexed_like 19 | 20 | 21 | class NymexCommission(FuturesCommission): 22 | BROKER_COMMISSION_PER_CONTRACT = 0.85 23 | EXCHANGE_FEE_PER_CONTRACT = 1.50 + 0.02 24 | CARRYING_FEE_PER_CONTRACT = 0 # Depends on equity in excess of margin requirement 25 | 26 | 27 | class NativeCalendarSpreadStrategy(Moonshot): 28 | """ 29 | Intraday pairs trading strategy for native futures calendar spreads. 30 | """ 31 | 32 | CODE = None 33 | DB = None 34 | DB_FIELDS = ["BidPriceClose", "AskPriceClose"] 35 | LOOKBACK_WINDOW = 0 # explicitly set LOOKBACK_WINDOW to 0 to avoid loading too much data 36 | BBAND_LOOKBACK_WINDOW = 60 # Compute Bollinger Bands over this period (number of minutes) 37 | BBAND_STD = 2 # Set Bollinger Bands this many standard deviations away from mean 38 | 39 | def prices_to_signals(self, prices: pd.DataFrame): 40 | """ 41 | Generates a DataFrame of signals indicating whether to long or short 42 | the spread. 43 | """ 44 | bids = prices.loc["BidPriceClose"].fillna(method="ffill") 45 | asks = prices.loc["AskPriceClose"].fillna(method="ffill") 46 | midpoints = (bids + asks) / 2 47 | 48 | means = midpoints.rolling(self.BBAND_LOOKBACK_WINDOW).mean() 49 | stds = midpoints.rolling(self.BBAND_LOOKBACK_WINDOW).std() 50 | upper_bands = means + self.BBAND_STD * stds 51 | lower_bands = means - self.BBAND_STD * stds 52 | 53 | # Long (short) the spread when it crosses below (above) the lower (upper) 54 | # band, then exit when it crosses the mean 55 | long_entries = asks < lower_bands 56 | long_exits = asks >= means 57 | short_entries = bids > upper_bands 58 | short_exits = bids <= means 59 | 60 | # Combine entries and exits 61 | ones = pd.DataFrame(1, index=midpoints.index, columns=midpoints.columns) 62 | zeros = pd.DataFrame(0, index=midpoints.index, columns=midpoints.columns) 63 | minus_ones = pd.DataFrame(-1, index=midpoints.index, columns=midpoints.columns) 64 | long_signals = ones.where(long_entries).fillna( 65 | zeros.where(long_exits)).fillna(method="ffill") 66 | short_signals = minus_ones.where(short_entries).fillna(zeros.where(short_exits)).fillna(method="ffill") 67 | signals = long_signals + short_signals 68 | 69 | return signals 70 | 71 | def signals_to_target_weights(self, signals: pd.DataFrame, prices: pd.DataFrame): 72 | """ 73 | Convert signals to weights. 74 | 75 | We want to specify exact quantities but Moonshot assumes percentage weights. So, 76 | set the percentage weights very high, then we will reduce them to the exact quantities 77 | in limit_position_sizes. 78 | """ 79 | weights = signals * 1000 80 | return weights 81 | 82 | def limit_position_sizes(self, prices: pd.DataFrame): 83 | """ 84 | Limit the position sizes to 1 spread contract. 85 | 86 | (Note that limit_position_sizes only cares about absolute values so no need 87 | to worry about signs.) 88 | """ 89 | bids = prices.loc["BidPriceClose"] 90 | ones = pd.DataFrame(1, index=bids.index, columns=bids.columns) 91 | max_quantities_for_longs = max_quantities_for_shorts = ones 92 | return max_quantities_for_longs, max_quantities_for_shorts 93 | 94 | def target_weights_to_positions(self, weights: pd.DataFrame, prices: pd.DataFrame): 95 | # Enter in the period after the signal 96 | positions = weights.shift() 97 | return positions 98 | 99 | def positions_to_gross_returns(self, positions: pd.DataFrame, prices: pd.DataFrame): 100 | bids = prices.loc["BidPriceClose"] 101 | asks = prices.loc["AskPriceClose"] 102 | 103 | # We buy at the ask and sell at the bid 104 | are_buys = positions.diff() > 0 105 | are_sells = positions.diff() < 0 106 | midpoints = (bids + asks) / 2 107 | trade_prices = asks.where(are_buys).fillna( 108 | bids.where(are_sells)).fillna(midpoints) 109 | 110 | gross_returns = trade_prices.pct_change() * positions.shift() 111 | return gross_returns 112 | 113 | def order_stubs_to_orders(self, orders: pd.DataFrame, prices: pd.DataFrame): 114 | orders["Exchange"] = "NYMEX" 115 | orders["OrderType"] = "MKT" 116 | orders["Tif"] = "DAY" 117 | return orders 118 | 119 | 120 | class CLNativeCalendarSpreadStrategy(NativeCalendarSpreadStrategy): 121 | 122 | CODE = "calspread-native-cl" 123 | DB = "cl-combo-tick-1min" 124 | CONTRACT_NUMS = (1, 2) 125 | BBAND_LOOKBACK_WINDOW = 60 126 | BBAND_STD = 2 127 | COMMISSION_CLASS = NymexCommission 128 | TIMEZONE = "America/New_York" 129 | -------------------------------------------------------------------------------- /calspread/collect_combo.py: -------------------------------------------------------------------------------- 1 | # Copyright 2019 QuantRocket LLC - All Rights Reserved 2 | # 3 | # Licensed under the Apache License, Version 2.0 (the "License"); 4 | # you may not use this file except in compliance with the License. 5 | # You may obtain a copy of the License at 6 | # 7 | # http://www.apache.org/licenses/LICENSE-2.0 8 | # 9 | # Unless required by applicable law or agreed to in writing, software 10 | # distributed under the License is distributed on an "AS IS" BASIS, 11 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | # See the License for the specific language governing permissions and 13 | # limitations under the License. 14 | 15 | import pandas as pd 16 | import io 17 | from quantrocket.master import download_master_file, create_ibkr_combo 18 | from quantrocket.realtime import collect_market_data 19 | 20 | 21 | def collect_combo(universe, contract_months, tick_db, until=None): 22 | """ 23 | Creates a combo and initiates real-time data collection for it. 24 | 25 | Parameters 26 | ---------- 27 | universe : str, required 28 | the universe of futures from which to select the contract contract_months 29 | 30 | contract_months : tuple, required 31 | a tuple of contract months which should make up the legs of the spread, 32 | for example, (1, 2) for the first and second closest months to expiration 33 | 34 | tick_db : str, required 35 | the tick db code for real-time data collection 36 | 37 | until : str, optional 38 | collect real-time data until this time (for example, '16:30:00 America/New_York') 39 | """ 40 | 41 | # query non-expired futures contracts 42 | f = io.StringIO() 43 | download_master_file(f, universes=universe, fields="RolloverDate", exclude_expired=True) 44 | contracts = pd.read_csv(f, index_col="RolloverDate", parse_dates=["RolloverDate"]) 45 | 46 | # sort by RolloverDate 47 | sids = contracts.Sid.sort_index().tolist() 48 | 49 | sid_1 = sids[contract_months[0] - 1] 50 | sid_2 = sids[contract_months[1] - 1] 51 | 52 | # Create the combo if it doesn't already exist 53 | result = create_ibkr_combo([ 54 | ["BUY", 1, sid_1], 55 | ["SELL", 1, sid_2]]) 56 | 57 | combo_sid = result["sid"] 58 | 59 | # initiate data collection 60 | collect_market_data(tick_db, sids=combo_sid, until=until) 61 | -------------------------------------------------------------------------------- /calspread/quantrocket.countdown.crontab.sh: -------------------------------------------------------------------------------- 1 | # Crontab commands for calspread 2 | # Intended to be run in timezone America/New_York 3 | 4 | # Crontab syntax cheat sheet 5 | # .------------ minute (0 - 59) 6 | # | .---------- hour (0 - 23) 7 | # | | .-------- day of month (1 - 31) 8 | # | | | .------ month (1 - 12) OR jan,feb,mar,apr ... 9 | # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat 10 | # | | | | | 11 | # * * * * * command to be executed 12 | 13 | # make sure IB Gateway is running each weekday 14 | 0 7 * * mon-fri quantrocket ibg start 15 | 16 | # collect native combo data each morning 17 | 0 8 * * mon-fri quantrocket satellite exec 'codeload.calspread.collect_combo.collect_combo' --params 'universe:cl-fut' 'contract_months:[1,2]' 'tick_db:cl-combo-tick' 'until:16:30:00 America/New_York' 18 | 19 | # Trade calspread-native-cl every minute from 9 AM to 4 PM. This command "paper trades" by logging orders to flightlog; to 20 | # live or paper trade with broker, send orders to blotter instead 21 | * 9-15 * * mon-fri quantrocket moonshot trade 'calspread-native-cl' | quantrocket flightlog log -n 'quantrocket.moonshot' 22 | -------------------------------------------------------------------------------- /calspread/quantrocket.master.rollover.yml: -------------------------------------------------------------------------------- 1 | # quantrocket.master.rollover.yml 2 | # 3 | # This file instructs the QuantRocket master service how 4 | # to calculate rollover dates for futures. 5 | # 6 | # each top level key is an exchange code 7 | NYMEX: 8 | # each second-level key is an underlying symbol 9 | CL: 10 | # the rollrule key defines how to derive the rollover date 11 | # from the expiry/LastTradeDate; the arguments will be passed 12 | # to bdateutil.relativedelta. For valid args, see: 13 | # https://dateutil.readthedocs.io/en/stable/relativedelta.html 14 | # https://github.com/quantrocket-llc/python-bdateutil#documentation 15 | rollrule: 16 | # roll 10 business days before expiry 17 | bdays: -10 18 | -------------------------------------------------------------------------------- /calspread/quantrocket.moonshot.allocations.yml: -------------------------------------------------------------------------------- 1 | # quantrocket.moonshot.allocations.yml 2 | # 3 | # This file defines the percentage of total capital (Net Liquidation Value) 4 | # to allocate to Moonshot strategies. 5 | # 6 | 7 | # each top level key is an account number 8 | DU12345: 9 | # each second-level key-value is a strategy code and the percentage 10 | # of Net Liquidation Value to allocate 11 | calspread-native-cl: 1 # allocate 100% of DU12345's Net Liquidation Value to calspread-native-cl 12 | --------------------------------------------------------------------------------