{ "cells": [ { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "# Predict steel plate faults\n", "\n", "Before proceeding, review the [API quickstart guide](https://docs.datarobot.com/en/docs/api/api-quickstart/index.html) to ensure that your client and API credentials have been properly configured.\n", "\n", "To run this notebook on your own, click the download icon in the top right of the page.\n", "\n", "* [Download training data](https://s3.amazonaws.com/datarobot-use-case-datasets/steel_plates_fault_training.csv)\n", "* [Download prediction data](https://s3.amazonaws.com/datarobot-use-case-datasets/steel_plates_fault_testing.csv)" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## Setup\n", "\n", "### Import libraries" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "autoscroll": "auto" }, "outputs": [], "source": [ "!pip install datarobot umap-learn nbformat hdbscan" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "autoscroll": "auto" }, "outputs": [], "source": [ "%matplotlib inline\n", "\n", "import datarobot as dr\n", "import matplotlib.pyplot as plt\n", "import matplotlib.ticker as mtick\n", "import numpy as np\n", "import pandas as pd\n", "\n", "light_blue = \"#598fd6\"\n", "grey_blue = \"#5f728b\"\n", "orange = \"#dd6b3d\"" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "### Connect to DataRobot\n", "\n", "Read more about different options for [connecting to DataRobot from the client](https://docs.datarobot.com/en/docs/api/api-quickstart/api-qs.html)." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# If the config file is not in the default location described in the API Quickstart guide, '~/.config/datarobot/drconfig.yaml', then you will need to call\n", "# dr.Client(config_path='path-to-drconfig.yaml')" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "### Import data\n", "\n", "DataRobot hosts the dataset used in this notebook via the URL used in the snippet below. Read in the data directly from the URL into a [pandas DataFrame](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.html) and display the results to verify all of the data looks correct." ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "autoscroll": "auto" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
X_MinimumX_MaximumY_MinimumY_MaximumPixels_AreasX_PerimeterY_PerimeterSum_of_LuminosityMinimum_of_LuminosityMaximum_of_Luminosity...Edges_X_IndexEdges_Y_IndexOutside_Global_IndexLogOfAreasLog_X_IndexLog_Y_IndexOrientation_IndexLuminosity_IndexSigmoidOfAreasFault
0425027090027094426717442422076108...0.47061.00001.02.42650.90311.64350.8182-0.29130.58220
16456512538079253810810810301139784123...0.60000.96671.02.03340.77821.46240.7931-0.17560.29840
285386036937036941517613451899699126...0.53851.00001.02.24550.84511.65320.8444-0.15680.52120
31289130649807849833524096026024693037126...0.28330.98851.03.38181.23052.40990.9338-0.19921.00000
443044110025010033763020876235764127...0.55001.00001.02.79931.04141.93950.8736-0.22670.98740
..................................................................
95155415643375744337576513413211335689111...0.76921.00001.02.12711.00001.32220.5238-0.22130.35090
96980992333332333435970571039751466133...0.21051.00001.02.98681.07922.01280.8835-0.21460.99800
971579159256257656263351532574162246108...0.40631.00001.02.71181.11391.75590.7719-0.36860.94910
9822523571900971902411617151165671127...0.58821.00001.02.06451.00001.17610.3333-0.21500.26600
991465148618372631837460249014619728303819141...0.14381.00001.03.39621.32222.29450.8934-0.11201.00000
\n", "

100 rows × 28 columns

\n", "
" ], "text/plain": [ " X_Minimum X_Maximum Y_Minimum Y_Maximum Pixels_Areas X_Perimeter \\\n", "0 42 50 270900 270944 267 17 \n", "1 645 651 2538079 2538108 108 10 \n", "2 853 860 369370 369415 176 13 \n", "3 1289 1306 498078 498335 2409 60 \n", "4 430 441 100250 100337 630 20 \n", ".. ... ... ... ... ... ... \n", "95 1554 1564 3375744 3375765 134 13 \n", "96 980 992 333332 333435 970 57 \n", "97 1579 1592 562576 562633 515 32 \n", "98 225 235 719009 719024 116 17 \n", "99 1465 1486 1837263 1837460 2490 146 \n", "\n", " Y_Perimeter Sum_of_Luminosity Minimum_of_Luminosity \\\n", "0 44 24220 76 \n", "1 30 11397 84 \n", "2 45 18996 99 \n", "3 260 246930 37 \n", "4 87 62357 64 \n", ".. ... ... ... \n", "95 21 13356 89 \n", "96 103 97514 66 \n", "97 57 41622 46 \n", "98 15 11656 71 \n", "99 197 283038 19 \n", "\n", " Maximum_of_Luminosity ... Edges_X_Index Edges_Y_Index \\\n", "0 108 ... 0.4706 1.0000 \n", "1 123 ... 0.6000 0.9667 \n", "2 126 ... 0.5385 1.0000 \n", "3 126 ... 0.2833 0.9885 \n", "4 127 ... 0.5500 1.0000 \n", ".. ... ... ... ... \n", "95 111 ... 0.7692 1.0000 \n", "96 133 ... 0.2105 1.0000 \n", "97 108 ... 0.4063 1.0000 \n", "98 127 ... 0.5882 1.0000 \n", "99 141 ... 0.1438 1.0000 \n", "\n", " Outside_Global_Index LogOfAreas Log_X_Index Log_Y_Index \\\n", "0 1.0 2.4265 0.9031 1.6435 \n", "1 1.0 2.0334 0.7782 1.4624 \n", "2 1.0 2.2455 0.8451 1.6532 \n", "3 1.0 3.3818 1.2305 2.4099 \n", "4 1.0 2.7993 1.0414 1.9395 \n", ".. ... ... ... ... \n", "95 1.0 2.1271 1.0000 1.3222 \n", "96 1.0 2.9868 1.0792 2.0128 \n", "97 1.0 2.7118 1.1139 1.7559 \n", "98 1.0 2.0645 1.0000 1.1761 \n", "99 1.0 3.3962 1.3222 2.2945 \n", "\n", " Orientation_Index Luminosity_Index SigmoidOfAreas Fault \n", "0 0.8182 -0.2913 0.5822 0 \n", "1 0.7931 -0.1756 0.2984 0 \n", "2 0.8444 -0.1568 0.5212 0 \n", "3 0.9338 -0.1992 1.0000 0 \n", "4 0.8736 -0.2267 0.9874 0 \n", ".. ... ... ... ... \n", "95 0.5238 -0.2213 0.3509 0 \n", "96 0.8835 -0.2146 0.9980 0 \n", "97 0.7719 -0.3686 0.9491 0 \n", "98 0.3333 -0.2150 0.2660 0 \n", "99 0.8934 -0.1120 1.0000 0 \n", "\n", "[100 rows x 28 columns]" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data_path = \"https://s3.amazonaws.com/datarobot-use-case-datasets/steel_plates_fault_training.csv\"\n", "\n", "pathfinder_df = pd.read_csv(data_path, encoding=\"ISO-8859-1\")\n", "\n", "pathfinder_df.head(100)" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "### Visualize data\n", "\n", "Below, view several examples of charts that visualize the dataset in different ways, such as grouping by plate thickness." ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "autoscroll": "auto" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
FaultX_MinimumX_MaximumY_MinimumY_MaximumPixels_AreasX_PerimeterY_PerimeterSum_of_LuminosityMinimum_of_Luminosity...Outside_X_IndexEdges_X_IndexEdges_Y_IndexOutside_Global_IndexLogOfAreasLog_X_IndexLog_Y_IndexOrientation_IndexLuminosity_IndexSigmoidOfAreas
00115311531153115311531153115311531153...1153115311531153115311531153115311531153
11615615615615615615615615615...615615615615615615615615615615
\n", "

2 rows × 28 columns

\n", "
" ], "text/plain": [ " Fault X_Minimum X_Maximum Y_Minimum Y_Maximum Pixels_Areas \\\n", "0 0 1153 1153 1153 1153 1153 \n", "1 1 615 615 615 615 615 \n", "\n", " X_Perimeter Y_Perimeter Sum_of_Luminosity Minimum_of_Luminosity ... \\\n", "0 1153 1153 1153 1153 ... \n", "1 615 615 615 615 ... \n", "\n", " Outside_X_Index Edges_X_Index Edges_Y_Index Outside_Global_Index \\\n", "0 1153 1153 1153 1153 \n", "1 615 615 615 615 \n", "\n", " LogOfAreas Log_X_Index Log_Y_Index Orientation_Index Luminosity_Index \\\n", "0 1153 1153 1153 1153 1153 \n", "1 615 615 615 615 615 \n", "\n", " SigmoidOfAreas \n", "0 1153 \n", "1 615 \n", "\n", "[2 rows x 28 columns]" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "total_count_df = pathfinder_df.groupby(\"Fault\").count()\n", "total_count_df = total_count_df.reset_index()\n", "\n", "total_count_df" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "autoscroll": "auto" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
X_MinimumX_MaximumY_MinimumY_MaximumPixels_AreasX_PerimeterY_PerimeterSum_of_LuminosityMinimum_of_LuminosityMaximum_of_Luminosity...Edges_X_IndexEdges_Y_IndexOutside_Global_IndexLogOfAreasLog_X_IndexLog_Y_IndexOrientation_IndexLuminosity_IndexSigmoidOfAreasFault
0425027090027094426717442422076108...0.47061.00001.02.42650.90311.64350.8182-0.29130.58220
16456512538079253810810810301139784123...0.60000.96671.02.03340.77821.46240.7931-0.17560.29840
285386036937036941517613451899699126...0.53851.00001.02.24550.84511.65320.8444-0.15680.52120
31289130649807849833524096026024693037126...0.28330.98851.03.38181.23052.40990.9338-0.19921.00000
443044110025010033763020876235764127...0.55001.00001.02.79931.04141.93950.8736-0.22670.98740
..................................................................
1763249277325780325796273542235033119141...0.51850.72730.02.43621.44721.2041-0.42860.00260.72541
1764144175340581340598287442434599112133...0.70460.70830.02.45791.49141.2305-0.4516-0.05820.81731
1765145174386779386794292402237572120140...0.72500.68180.02.46541.46241.1761-0.48280.00520.70791
1766137170422497422528419974752715117140...0.34020.65960.02.62221.51851.4914-0.0606-0.01710.99191
1767126112818795187967103262211682101133...0.76920.72730.02.01281.30101.2041-0.2000-0.11390.52961
\n", "

1768 rows × 28 columns

\n", "
" ], "text/plain": [ " X_Minimum X_Maximum Y_Minimum Y_Maximum Pixels_Areas X_Perimeter \\\n", "0 42 50 270900 270944 267 17 \n", "1 645 651 2538079 2538108 108 10 \n", "2 853 860 369370 369415 176 13 \n", "3 1289 1306 498078 498335 2409 60 \n", "4 430 441 100250 100337 630 20 \n", "... ... ... ... ... ... ... \n", "1763 249 277 325780 325796 273 54 \n", "1764 144 175 340581 340598 287 44 \n", "1765 145 174 386779 386794 292 40 \n", "1766 137 170 422497 422528 419 97 \n", "1767 1261 1281 87951 87967 103 26 \n", "\n", " Y_Perimeter Sum_of_Luminosity Minimum_of_Luminosity \\\n", "0 44 24220 76 \n", "1 30 11397 84 \n", "2 45 18996 99 \n", "3 260 246930 37 \n", "4 87 62357 64 \n", "... ... ... ... \n", "1763 22 35033 119 \n", "1764 24 34599 112 \n", "1765 22 37572 120 \n", "1766 47 52715 117 \n", "1767 22 11682 101 \n", "\n", " Maximum_of_Luminosity ... Edges_X_Index Edges_Y_Index \\\n", "0 108 ... 0.4706 1.0000 \n", "1 123 ... 0.6000 0.9667 \n", "2 126 ... 0.5385 1.0000 \n", "3 126 ... 0.2833 0.9885 \n", "4 127 ... 0.5500 1.0000 \n", "... ... ... ... ... \n", "1763 141 ... 0.5185 0.7273 \n", "1764 133 ... 0.7046 0.7083 \n", "1765 140 ... 0.7250 0.6818 \n", "1766 140 ... 0.3402 0.6596 \n", "1767 133 ... 0.7692 0.7273 \n", "\n", " Outside_Global_Index LogOfAreas Log_X_Index Log_Y_Index \\\n", "0 1.0 2.4265 0.9031 1.6435 \n", "1 1.0 2.0334 0.7782 1.4624 \n", "2 1.0 2.2455 0.8451 1.6532 \n", "3 1.0 3.3818 1.2305 2.4099 \n", "4 1.0 2.7993 1.0414 1.9395 \n", "... ... ... ... ... \n", "1763 0.0 2.4362 1.4472 1.2041 \n", "1764 0.0 2.4579 1.4914 1.2305 \n", "1765 0.0 2.4654 1.4624 1.1761 \n", "1766 0.0 2.6222 1.5185 1.4914 \n", "1767 0.0 2.0128 1.3010 1.2041 \n", "\n", " Orientation_Index Luminosity_Index SigmoidOfAreas Fault \n", "0 0.8182 -0.2913 0.5822 0 \n", "1 0.7931 -0.1756 0.2984 0 \n", "2 0.8444 -0.1568 0.5212 0 \n", "3 0.9338 -0.1992 1.0000 0 \n", "4 0.8736 -0.2267 0.9874 0 \n", "... ... ... ... ... \n", "1763 -0.4286 0.0026 0.7254 1 \n", "1764 -0.4516 -0.0582 0.8173 1 \n", "1765 -0.4828 0.0052 0.7079 1 \n", "1766 -0.0606 -0.0171 0.9919 1 \n", "1767 -0.2000 -0.1139 0.5296 1 \n", "\n", "[1768 rows x 28 columns]" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pathfinder_df" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "autoscroll": "auto" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Steel_Plate_ThicknessX_MinimumX_MaximumY_MinimumY_MaximumPixels_AreasX_PerimeterY_PerimeterSum_of_LuminosityMinimum_of_Luminosity...Edges_X_IndexEdges_Y_IndexOutside_Global_IndexLogOfAreasLog_X_IndexLog_Y_IndexOrientation_IndexLuminosity_IndexSigmoidOfAreasFault
040653653653653653653653653653...653653653653653653653653653653
150104104104104104104104104104...104104104104104104104104104104
260828282828282828282...82828282828282828282
369363636363636363636...36363636363636363636
470342342342342342342342342342...342342342342342342342342342342
580132132132132132132132132132...132132132132132132132132132132
685444444444...4444444444
790191919191919191919...19191919191919191919
8100137137137137137137137137137...137137137137137137137137137137
9120212121212121212121...21212121212121212121
10125555555555...5555555555
11130888888888...8888888888
12140111111111...1111111111
13143171717171717171717...17171717171717171717
14150252525252525252525...25252525252525252525
15175313131313131313131...31313131313131313131
16180222222222...2222222222
17185141414141414141414...14141414141414141414
18200727272727272727272...72727272727272727272
19211555555555...5555555555
20220151515151515151515...15151515151515151515
21250111111111...1111111111
22290222222222...2222222222
23300404040404040404040...40404040404040404040
\n", "

24 rows × 28 columns

\n", "
" ], "text/plain": [ " Steel_Plate_Thickness X_Minimum X_Maximum Y_Minimum Y_Maximum \\\n", "0 40 653 653 653 653 \n", "1 50 104 104 104 104 \n", "2 60 82 82 82 82 \n", "3 69 36 36 36 36 \n", "4 70 342 342 342 342 \n", "5 80 132 132 132 132 \n", "6 85 4 4 4 4 \n", "7 90 19 19 19 19 \n", "8 100 137 137 137 137 \n", "9 120 21 21 21 21 \n", "10 125 5 5 5 5 \n", "11 130 8 8 8 8 \n", "12 140 1 1 1 1 \n", "13 143 17 17 17 17 \n", "14 150 25 25 25 25 \n", "15 175 31 31 31 31 \n", "16 180 2 2 2 2 \n", "17 185 14 14 14 14 \n", "18 200 72 72 72 72 \n", "19 211 5 5 5 5 \n", "20 220 15 15 15 15 \n", "21 250 1 1 1 1 \n", "22 290 2 2 2 2 \n", "23 300 40 40 40 40 \n", "\n", " Pixels_Areas X_Perimeter Y_Perimeter Sum_of_Luminosity \\\n", "0 653 653 653 653 \n", "1 104 104 104 104 \n", "2 82 82 82 82 \n", "3 36 36 36 36 \n", "4 342 342 342 342 \n", "5 132 132 132 132 \n", "6 4 4 4 4 \n", "7 19 19 19 19 \n", "8 137 137 137 137 \n", "9 21 21 21 21 \n", "10 5 5 5 5 \n", "11 8 8 8 8 \n", "12 1 1 1 1 \n", "13 17 17 17 17 \n", "14 25 25 25 25 \n", "15 31 31 31 31 \n", "16 2 2 2 2 \n", "17 14 14 14 14 \n", "18 72 72 72 72 \n", "19 5 5 5 5 \n", "20 15 15 15 15 \n", "21 1 1 1 1 \n", "22 2 2 2 2 \n", "23 40 40 40 40 \n", "\n", " Minimum_of_Luminosity ... Edges_X_Index Edges_Y_Index \\\n", "0 653 ... 653 653 \n", "1 104 ... 104 104 \n", "2 82 ... 82 82 \n", "3 36 ... 36 36 \n", "4 342 ... 342 342 \n", "5 132 ... 132 132 \n", "6 4 ... 4 4 \n", "7 19 ... 19 19 \n", "8 137 ... 137 137 \n", "9 21 ... 21 21 \n", "10 5 ... 5 5 \n", "11 8 ... 8 8 \n", "12 1 ... 1 1 \n", "13 17 ... 17 17 \n", "14 25 ... 25 25 \n", "15 31 ... 31 31 \n", "16 2 ... 2 2 \n", "17 14 ... 14 14 \n", "18 72 ... 72 72 \n", "19 5 ... 5 5 \n", "20 15 ... 15 15 \n", "21 1 ... 1 1 \n", "22 2 ... 2 2 \n", "23 40 ... 40 40 \n", "\n", " Outside_Global_Index LogOfAreas Log_X_Index Log_Y_Index \\\n", "0 653 653 653 653 \n", "1 104 104 104 104 \n", "2 82 82 82 82 \n", "3 36 36 36 36 \n", "4 342 342 342 342 \n", "5 132 132 132 132 \n", "6 4 4 4 4 \n", "7 19 19 19 19 \n", "8 137 137 137 137 \n", "9 21 21 21 21 \n", "10 5 5 5 5 \n", "11 8 8 8 8 \n", "12 1 1 1 1 \n", "13 17 17 17 17 \n", "14 25 25 25 25 \n", "15 31 31 31 31 \n", "16 2 2 2 2 \n", "17 14 14 14 14 \n", "18 72 72 72 72 \n", "19 5 5 5 5 \n", "20 15 15 15 15 \n", "21 1 1 1 1 \n", "22 2 2 2 2 \n", "23 40 40 40 40 \n", "\n", " Orientation_Index Luminosity_Index SigmoidOfAreas Fault \n", "0 653 653 653 653 \n", "1 104 104 104 104 \n", "2 82 82 82 82 \n", "3 36 36 36 36 \n", "4 342 342 342 342 \n", "5 132 132 132 132 \n", "6 4 4 4 4 \n", "7 19 19 19 19 \n", "8 137 137 137 137 \n", "9 21 21 21 21 \n", "10 5 5 5 5 \n", "11 8 8 8 8 \n", "12 1 1 1 1 \n", "13 17 17 17 17 \n", "14 25 25 25 25 \n", "15 31 31 31 31 \n", "16 2 2 2 2 \n", "17 14 14 14 14 \n", "18 72 72 72 72 \n", "19 5 5 5 5 \n", "20 15 15 15 15 \n", "21 1 1 1 1 \n", "22 2 2 2 2 \n", "23 40 40 40 40 \n", "\n", "[24 rows x 28 columns]" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = pathfinder_df.groupby(\"Steel_Plate_Thickness\").count()\n", "df = df.reset_index()\n", "df" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## Modeling\n", " \n", "For this use case, create a DataRobot project and initiate modeling by running Autopilot in Quick mode." ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "autoscroll": "auto" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "In progress: 9, queued: 0 (waited: 0s)\n", "In progress: 9, queued: 0 (waited: 0s)\n", "In progress: 9, queued: 0 (waited: 1s)\n", "In progress: 9, queued: 0 (waited: 2s)\n", "In progress: 9, queued: 0 (waited: 3s)\n", "In progress: 9, queued: 0 (waited: 5s)\n", "In progress: 9, queued: 0 (waited: 9s)\n", "In progress: 9, queued: 0 (waited: 16s)\n", "In progress: 9, queued: 0 (waited: 29s)\n", "In progress: 0, queued: 0 (waited: 55s)\n", "In progress: 7, queued: 0 (waited: 85s)\n", "In progress: 1, queued: 0 (waited: 116s)\n", "In progress: 0, queued: 0 (waited: 146s)\n", "In progress: 0, queued: 0 (waited: 176s)\n", "In progress: 5, queued: 0 (waited: 207s)\n", "In progress: 1, queued: 0 (waited: 237s)\n", "In progress: 1, queued: 0 (waited: 268s)\n", "In progress: 1, queued: 0 (waited: 298s)\n", "In progress: 1, queued: 0 (waited: 328s)\n", "In progress: 1, queued: 0 (waited: 359s)\n", "In progress: 1, queued: 0 (waited: 389s)\n", "In progress: 1, queued: 0 (waited: 419s)\n", "In progress: 0, queued: 0 (waited: 450s)\n", "In progress: 0, queued: 0 (waited: 480s)\n" ] } ], "source": [ "EXISTING_PROJECT_ID = None # If you've already created a project, replace None with the ID here\n", "if EXISTING_PROJECT_ID is None:\n", " # Create project and pass in data\n", " project = dr.Project.create(sourcedata=pathfinder_df, project_name=\"Predict steel plate fault\")\n", "\n", " # Set the project target to the appropriate feature. Use the LogLoss metric to measure performance\n", " project.set_target(target=\"Fault\", mode=dr.AUTOPILOT_MODE.QUICK, worker_count=\"-1\")\n", "else:\n", " # Fetch the existing project\n", " project = dr.Project.get(EXISTING_PROJECT_ID)\n", "\n", "project.wait_for_autopilot(check_interval=30)\n", "# Get the project metric (i.e LogLoss, RMSE, etc.)\n", "metric = project.metric\n", "\n", "# Get the project ID\n", "# project_id = project.id\n", "# project_id" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "### View the project in the UI\n", "\n", "If you want to view the project in the DataRobot UI, use the following snippet to retrieve the project's URL and use it to navigate to the application." ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "autoscroll": "auto" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "https://app.datarobot.com/projects/62fe52e5a983f84bf4b101ae/models\n" ] } ], "source": [ "# Get project URL\n", "project_url = project.get_leaderboard_ui_permalink()\n", "print(project_url)" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## Evaluate model performance \n", "\n", "In order to measure model performance, first select the top-performing model based on a specific performance metric (i.e., `LogLoss`) and then evaluate several different types of charts, such as Lift Chart, ROC Curve, and Feature Importance. There are two helper functions that you need to build in order simplify producing these model insights.\n", "\n", "You can reference more information about model evaluation tools [here](https://docs.datarobot.com/en/docs/modeling/analyze-models/evaluate/index.html)." ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "autoscroll": "auto" }, "outputs": [], "source": [ "def sorted_by_metric(models, test_set, metric):\n", " models_with_score = [model for model in models if model.metrics[metric][test_set] is not None]\n", "\n", " return sorted(models_with_score, key=lambda model: model.metrics[metric][test_set])" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "autoscroll": "auto" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The top performing model is Model('AVG Blender') using metric, LogLoss\n" ] } ], "source": [ "models = project.get_models()\n", "\n", "# Uncomment if this is not set above in the create project paragraph\n", "metric = project.metric\n", "\n", "# Get top performing model\n", "model_top = sorted_by_metric(models, \"crossValidation\", metric)[0]\n", "\n", "print(\n", " \"\"\"The top performing model is {model} using metric, {metric}\"\"\".format(\n", " model=str(model_top), metric=metric\n", " )\n", ")" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "autoscroll": "auto" }, "outputs": [], "source": [ "# Set styling\n", "dr_dark_blue = \"#08233F\"\n", "dr_blue = \"#1F77B4\"\n", "dr_orange = \"#FF7F0E\"\n", "dr_red = \"#BE3C28\"\n", "\n", "# Create function to build Historgrams\n", "\n", "\n", "def rebin_df(raw_df, number_of_bins):\n", " cols = [\"bin\", \"actual_mean\", \"predicted_mean\", \"bin_weight\"]\n", " new_df = pd.DataFrame(columns=cols)\n", " current_prediction_total = 0\n", " current_actual_total = 0\n", " current_row_total = 0\n", " x_index = 1\n", " bin_size = 60 / number_of_bins\n", " for rowId, data in raw_df.iterrows():\n", " current_prediction_total += data[\"predicted\"] * data[\"bin_weight\"]\n", " current_actual_total += data[\"actual\"] * data[\"bin_weight\"]\n", " current_row_total += data[\"bin_weight\"]\n", "\n", " if (rowId + 1) % bin_size == 0:\n", " x_index += 1\n", " bin_properties = {\n", " \"bin\": ((round(rowId + 1) / 60) * number_of_bins),\n", " \"actual_mean\": current_actual_total / current_row_total,\n", " \"predicted_mean\": current_prediction_total / current_row_total,\n", " \"bin_weight\": current_row_total,\n", " }\n", "\n", " new_df = new_df.append(bin_properties, ignore_index=True)\n", " current_prediction_total = 0\n", " current_actual_total = 0\n", " current_row_total = 0\n", " return new_df" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "### Lift chart\n", "\n", "A [lift chart](https://docs.datarobot.com/en/docs/modeling/analyze-models/evaluate/lift-chart.html#lift-chart) shows you how close model predictions are to the actual values of the target in the training data. The lift chart data includes the average predicted value and the average actual values." ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [], "source": [ "# Create function to build lift charts\n", "\n", "\n", "def matplotlib_lift(bins_df, bin_count, ax):\n", " grouped = rebin_df(bins_df, bin_count)\n", " ax.plot(\n", " range(1, len(grouped) + 1),\n", " grouped[\"predicted_mean\"],\n", " marker=\"+\",\n", " lw=1,\n", " color=dr_blue,\n", " label=\"predicted\",\n", " )\n", " ax.plot(\n", " range(1, len(grouped) + 1),\n", " grouped[\"actual_mean\"],\n", " marker=\"*\",\n", " lw=1,\n", " color=dr_orange,\n", " label=\"actual\",\n", " )\n", " ax.set_xlim([0, len(grouped) + 1])\n", " ax.set_facecolor(dr_dark_blue)\n", " ax.legend(loc=\"best\")\n", " ax.set_title(\"Lift chart {} bins\".format(bin_count))\n", " ax.set_xlabel(\"Sorted Prediction\")\n", " ax.set_ylabel(\"Value\")\n", " return grouped" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjgAAAI4CAYAAABndZP2AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAACP/ElEQVR4nOzdd3iUVf7+8feZyaR3QhJICAmdAAKCIk3Birquva/b3J+7+1VXXXV1m1tct7m9uK7u2taCvTcsgAoqTRAJPQkhkALpfWYy5/dHRoxISUJmJpncr+viIjPzPM+5Z8Tkk3POc46x1iIiIiISThyhDiAiIiLS21TgiIiISNhRgSMiIiJhRwWOiIiIhB0VOCIiIhJ2VOCIiIhI2FGBIzKAGWPmGmM2d3o81hjzkTGmwRjzvSO89hJjzLeOPGVoGGOKjTEnH+S1z31uItL3qMARGQAO9sPaWvuutXZsp6d+ACyx1iZYa/92qB/ywWaMecAY86vDHHO7MWa9McZrjPn5AV6/zBizwxjTZIx5zhiT2pMsB/jcRKSPUYEjIp0NBzaEOsT+jDHOLh66jY4i7eUDXGMC8G/gCiADaAbu6q2MItK3qMARGcCMMfOMMaX+r98G5gP/MMY0GmMeA3KAF/2Pf3CQa5xtjFlrjKk3xmw3xizo9PJwY8wy/5DXImNMWqfznjTGlBtj6owx7/gLkE9fe8AY8y9jzCvGmCbgSuBy4Af+LC8eKIu19kFr7atAwwFevhx40Vr7jrW2EfgpcJ4xJuEQH9ExxpgCY0yNMeZ+Y0z0/p+b/3GxMeYmY8zH/vfzeKdj04wxLxljao0x1caYd40x+t4rEmD6n0xEALDWngi8C1xjrY231l4KlABn+R//fv9zjDHHAg8BNwPJwPFAcadDLgO+AaQDkcBNnV57FRjtf20N8Mh+l78MuANI8LfxCPB7f5azevAWJwDrOr3f7YAbGHOIcy4HTgNG+o/7ySGOvQhYAOQBRwFf9z9/I1AKDKaj5+hHgPbIEQkwFTgiciSuBO6z1r5hrfVZa3dZazd1ev1+a+0Wa20L8AQw5dMXrLX3WWsbrLVtwM+BycaYpE7nPm+tXea/bmsvZI0H6vZ7ro6OAupg/mGt3Wmtraaj2Lr0EMf+zVq723/si3z2Xj3AEGC4tdbjn7+jAkckwFTgiMiRGAZsP8Tr5Z2+bqajyMAY4zTG/NY/pFXPZ70+aZ2O39mbQYFGIHG/5xI58HDWgTLsAIYe4tgDvlfgTjrmBi0yxhQaY27tWlwRORIqcETkUA7X07CTjuGb7roMOBs4GUgCcv3Pm0O0faS9HhuAyZ8+MMaMAKKALYc4Z1inr3OA3d1t1N9LdaO1dgRwFvB9Y8xJ3b2OiHSPChyRgcNljInu9CeiC+dUACMO8fp/gW8YY04yxjiMMVnGmHFduG4C0AZUAbHAr3shC8YYl39yrwOI8L/PT+/AegQ4y7+GTRzwS+AZa+2henCuNsZk+28n/xHweBdy7p/pS8aYUcYYA9QD7f4/IhJAKnBEBo5XgJZOf37ehXN+A/zEfwfQTfu/aK1dQcck4j/TMZ9lKR23mh/OQ3QM+ewCCoAPunDOf4F8f5bnDnLMvXS8t0uBH/u/vsKfdQPwHToKnUo6iqz/O0ybjwKLgEL/n0Ouw3MQo4E36Rgiex+4y1q7pAfXEZFuMJrrJiIiIuFGPTgiIiISdlTgiIiISNhRgSMiIiJhRwWOiIiIhJ2u3CbapxinyxpXdKhjiIiISJDYtsa91trB3Tmn/xU4rmiisqeFOoaIiIgESev2pTu6e46GqERERCTsqMARERGRsKMCR0RERMJOv5uDcyDJifH8+OpLGZkzBIcxhz9BDshnLdtLyrjjn49RW98Y6jgiIiI9FhYFzo+vvpRjpkwkwhUFKnB6zlpSUwfx46sv5ebf3BvqNCIiIj0WFkNUI3OGqLjpDcYQ4YpiZM6QUCcRERE5ImFR4DiMUXHTW4zRMJ+ISBjKjPGw6JQtZER7Qh0lKMKiwBEREZFDu3ViGbPSm/jhpLJQRwkKFTh90KqVH3L9Nd8GYOnit3ngv/cc9NiG+nqeXPhot9v4911/538P/LfHGUVEpH+ovmQtLV/5iG+PrcJp4Ntjq2j5ykdUX7I21NECakAXOI9/XBXU9trb27t9zgnzT+TrV1510NcbGup58vHHjiSWiIiEqRMyGiioi6bW7aCtvWP6QbPX8FhhCuOfmxDidIEVFndR9dQT62u4+KhBvXKt3btKufa7/4+Jk45i86aN5AzP5Zd3/I4Lzz2TL59zPh+8v4yLLrmcpKQk/n3X33G7PWQPG8bPbv81sbFxLH/vXf74+1+TnJLCuPH5+6774vPPULDhE2750W1UVe3lN7f/nF2lOwG49Sc/Y+GjD7OrtITLLjyHGcfN4robf8BD9/+XNxe9itvtZv6JJ/Ptq78HwH/vuZuXX3yOzMwhJKekMD4/vP9xi4gMVMemNfHzybvJiXfzq3VDmJXeyDdHV9HqcxLlbKfe46Ci1RXqmAE1oAuc3rajuIif/uIOpkw9ml/c9iOefLxj6CgyMor/PvgotTU13HzDtdx1z/3ExMbywH338shDD/DVb3yLO37xU/71nwcYljOcH958wwGv/4ff3sHR047hD3/5B+3t7bQ0N3Ptdd9n+9atPPrkcwB8sPw9dpYU8+CjT2Kt5fvf+y5rVq0kJjaGRa+9zKNPPIu3vZ2vXHyeChwRkTAzOaWZ2yaXMSmlhV+vz+Th7YPwWsPZObXcuyWN53Nv5OziP5AZ4w111IALywLn/Ee29fqxT18+6rDHZGQOYcrUowE448wvs/DR/wFw6oLTAVj/8VoKC7dx5dcuA8Dj8TBp8hSKiwoZmpVNzvBcAE4/88s8+/TjX7j+yhUf8Is7fgeA0+kkPiGB+vq6zx3zwfJlfPD+Mi6/6FwAmpubKSnZQXNTE/NPOoXomBgAjp83v0vvW0RE+r6xia3cNrmMmYMbuXNDJpe+k4fb99kslMuWjSXlhItx2SEsWZkTwqTBE5YFTleKEegobrp6bFeY/W6v/vRxTEwsANZaZhw3i1///k+fO27zpo29dpe7xfL1K6/i/Asv+dzzj/7vQXTzt4hIeMmNb+PHk8o5Nauevxak863lw2lp//z02rj82cTnz9r3OOOCmwFoLFhGU8HyoOYNpgE9ybi3lZft5uN1HwHw+qsv7+vN+dSko6awbu1H7Czp2PW9taWFHcVF5OaNYNeuXZTuLPGf+9IBr3/MjJk85Z9Q3N7eTmNjI7FxcTQ3N+07ZuasObzw7DP7nqusqKC6qoqjp01n8dtv0traSlNTI+8uXdKr711ERIInK9bN344t4d0FmylqjGTS8/n8qSDjC8UNgDMuibbd26h4+g8AVDx1JxVP3RnWxQ2EaQ9OV100KaVXr5c3YiQvvfAcv/7lzxiWM5wLLrqUxx97eN/rKamp/Pz23/DjW27E7XYD8N1rrmd4bh4/vu2XXHf1t0lOSWHK1Gls37blC9e/6ZYfcccvbuP5Z5/C6XRy609+xlGTpzJ5ylQuOvcsZs+Zy3U3/oCiwkK+8ZWOHpzY2Fhu/82djMufwCmnncFlF57DkKFDmXL0tF597yIiEnjp0R5umlDBZSOquX/rICa/kE+1++A/yuMnHo8zPpmad54Aa4OYNPSM7Wdv2BGdYKOyP//D+bm7f0ZaxtAQJeqwe1cp11/zXZ549sWQ5ugNeyt2c853fhHqGCIi4pcc6eWG/EquHL2XhUWp3PlJxmHvgooZdTSxI6ZQveRRrLsVgLj8Wf2y56Z1+9LV1trp3TlnQPfgiIiI9GXxEe1cM34PV4+t5Pmdycx8eRw7myMPe15U9ljixhz7ueIG6JfFTU+pwOklQ7Oyw6L3RkREQi/a6eM7Y/ZwfX4lb5cncMJrYylsjOrSua7Bw0icchI17z6Jr7k+wEn7LhU4IiIifYTL4eObo6r4wcQKVuyN5fQ3R7GxLqbL50ckDSZ5xlnUfvgi3ro9AUza96nAERERCTGnsVyWV82PjypnY100FywZwUfVsd26hiM2keTZ51G/9i08e3YGKGn/oQJHREQkRAyWC4bX8pPJZZQ1u/jGsuG8vye++9eJjCZlzgU0bVlJW+nmACTtf1TgiIiIBJ3lS9l13Da5jBavg+tWDGNJeTz0ZElWRwTJs86jrWw7LdvW9HrS/koFTgisWvkhLpeLyVOOPvzBBzF3xtG8+6H+IYuI9C+Wk4Y08PPJZbgclp+vHcoruxLpUWEDYAxJx32J9qZaGtcv7dWk/d2ALXAiWvYyYsWPKZxxB97otKC2vXrlCmJjY4+owBERkf5l9uBGfjaljPRoD7evG8IzJcnYI9xEJ2HqKRhHBHWrXuillOFjwBY4Qzb+l/i9axlS8F92Hn1Lr1zzxuuupqK8DLfbzSWXX8F5F1zM8vfe5Z9/+zM+XzvJySn89Be/4pknH8fhdPDqyy9y860/4flnn2LO8fM4+dQFwGe9M83NTdz4vaupr6/H6/Xw3WuvZ978k3olq4iIBMe0QU3cNrmM0Qlt3LE+k4VFqbTbI98dMG78TFwpGdQsXQjW1wtJw8uAK3CmPjsHh8+973F60dOkFz2NzxHJR+e+d0TXvu2Xd5CUlExraytfvfRCTph/Enf84qfcc//DZGVnU1dXS1JSMuddeDGxsbFc8fUrAXj+2acOeL3IyCju/Ms/iI+Pp7amhq9/5WJOmHfiFzb1FBGRvic/qYWfTS5j2qBmfvtJJg9uT8Xj650tIGPyjiJ6+ERqFj+C9Xp65ZrhJiwLnGlPH9vtcxw+9yHPW33+isNeY+Ej/2PJ228CUFFRxrNPPcHUadPJys4GICkpuXuhrOWff/sTH61ehcPhYE9lBVVVe0lLG9y964iISNCMTGjlp0eVc0JmA3/akMHXluXSeoBNMHsqcshI4vJnU7P0MXxtzb123XATlgXO4YqRnDW/Ja3oWazDhfF52JN33hEPU61a+SErPnyf+/+3kOiYGK765hWMHjOOHcVFhz3X6Yzg0z3BrLV4PB3V+KuvvEhtTQ0PL3yaCJeLsxaciLut7YhyiohIYOTEubl1Ujlfyq7j7xsHc/WHw2jyOnu1DVfqUJKmnUbNsmdob6zt1WuHm94rKfuRiLZq9ow4j03z72PPiPNwtVUd8TUbGxtJTEgkOiaG4qJCPvl4HR6PmzWrVrKrtBSAurpaAOLi4mhuatp37pCsLDYWbABg6eK38Pq7GxsbGklJTSXC5WLVig8o2737iHOKiEjvyozx8KfpO1l+xibKWyKY9Px47tyQ2evFjTMhlaRZ51C36lW8NeW9eu1wFJY9OIdTOPP3+77eObV3JhjPmj2XZ55YyCXnf5nhuXlMPGoyySkp/Oi2X3Lz96/F+nykpA7irnvuY+4J87nlxutYuuRtbr71J5x7/oXc+L2r+eplF3LsjOOIielYvfL0M8/ihmu/wxWXnM+YsePJzRvRK1lFRKRnMmM8PDSniCvezcPjM9w4oYKvjari4e2pTHlhPHvbDr3Dd085ouNImXM+jeuX4i4//MiAgPl0aKS/cEQn2KjsaZ977rm7f0ZaxtAQJQo/eyt2c853fhHqGCIifc5fjinhW2Oq+Kgqhtx4N0/vSOH3n2Swu+XwO3z3lImIJGXepbTu3ETz5g8D1k5f1rp96Wpr7fTunDMge3BERES6o/qStcREfNYhMD2tBYCvjqzi+pXDAteww0nyrHPw7C0dsMVNTw3IOTgiIiLdkf98Ph9VxeDz1zjNXsNjhSmMf25CQNtNOuZ0fO5WGta+HdB2wlFACxxjzAJjzGZjzDZjzK0HeD3JGPOiMWadMWaDMeYbPWnHZy30s6G2Psvajs9TREQAcDl83Da5nGFxHWuotXgNUU5LvcdBRWtg5twAxE+ejyM6nroVLwP6vtxdARuiMsY4gX8CpwClwEpjzAvW2oJOh10NFFhrzzLGDAY2G2Mesda6D3DJg9peUkZq6iAiXFGgRfB6zlq8nja2l5SFOomISJ+QEunlseOLqPc4+WBPHKXNLu7bmsY3R+8lM8YbsHZjxxxDVPpwqpc8Br72gLUTzgI5B+dYYJu1thDAGLMQOBvoXOBYIMF0LM0bD1QD3f4Xc8c/H+PHV1/KyJwhOFTg9JjPWraXlHHHPx8LdRQRkZAbldDKM/MLeak0iZ98NBRfp+0VbliZE7B2o3PyiR05leolj2I9WvuspwJZ4GQBOzs9LgVm7HfMP4AXgN1AAnCxtV/cUMMYcxVwFQARUV9oqLa+kZt/c2+vhBYRETkho4EH5xTzs7VDeXD7oKC1G5mRS/xR86h553F8LY1BazccBXIOzoG6UvYfRDwNWAsMBaYA/zDGJH7hJGvvsdZOt9ZON87AjXeKiIh8fdReHpxTzFffyw1qcRORnE7SMWdQ9/7ztNcf+QK0A10ge3BKgc73zmXT0VPT2TeA39qOxXi2GWOKgHHA4Td+EhER6UUOY7lj6m7OzK7j5EWj2dYQHbS2nXFJJM8+j/o1b+Cp2hW0dsNZIHtwVgKjjTF5xphI4BI6hqM6KwFOAjDGZABjgcIAZhIREfmCuIh2Hj+hkCmpzZzw2pigFjcmKpbkORfStPED2nZvDVq74S5gPTjWWq8x5hrgdcAJ3Get3WCM+Y7/9buB24EHjDHr6RjSusVauzdQmURERPY3LNbNk/MKWV0Vy2Urs/H4grdEnHG6SJl9Hq2lG2kpXBu0dgeCsNiqQUREpCemD2ri8ROK+NvGwfx1YzoHnj4aIMZB8qxz8bU2Ur/69eC12w9pqwYREZEuOj+nhj8fW8p3P8jh5dKkoLefOO00wFK/ZlHQ2x4IVOCIiMgAY7llYgVXjt7Ll94aycc1sUFPEDdhDhGJqVQvfUIr8QeIChwRERkwohw+/jWzhNEJbRz/2ljKW4K/9EjMyKlEZ4+levGj0O4JevsDhTbbFBGRAWFwlIdXT95GlMNy6hujQ1LcRGWNIW7cDGrefQrrbgl6+wOJChwREQl7+UktvHP6FpZUxPOVd3NpaQ/+jz9XWjaJU0+mdtkz+Jrrgt7+QKMhKhERCWunDKnnP7N3cMvqLBYWpYYkgzMxjaTjvkzdipfx1laGJMNAowJHRETC1nfG7OEHk8q5ZGke7++JD0kGR0wCKXPOp3Hd27grd4Qkw0CkAkdERMKO01j+ML2U4zMamf/aGHY0fXGj5mAwrihS5lxA89bVtO7cFJIMA5UKHBERCSuJrnYenluEBea/PoZ6jzM0QRwRJM8+j7aKIpq3rgpNhgFMk4xFRCRs5Ma3seS0LWyrj+K8xSNDV9xgSJpxJu3N9TR+vCREGQY2FTgiIhIWZg1u5O3TtnDPljS+v2oY7TaI2y7sJ2HqSZiIKOpXvRayDAOdhqhERKTfuzSvmt9O28W3lg3njbLEkGaJG3ccrtSh1CxdCL72kGYZyFTgiIhIv2Ww3Da5jItza1jwxig21sWENE/08IlE506iZsmjWK87pFkGOhU4IiLSL8U4ffxn1g6GxHg4/rUx7G0L/srEnUVmjiB+4lxqli7E19oU0iyiOTgiItIPZcZ4eOPUrbS2G05/c1TIi5uI1CEkTV9A7fvP0d5YE9Is0kEFjoiI9CtHpTTzzoLNvLAziSuXD6fNF9ofZc74FJJnnkPd6tfwVpeFNIt8RkNUIiLSb3wpu5a7jtvJ9SuyeaYkJdRxcETFkTznAho3vIu7rDDUcaQTFTgiItIPWK4fX8m14/dw3uIRrKqKC3UgTEQkyXPOp7V4Pa3Fn4Q6juxHQ1QiItKnuRw+7jpuJ5fk1XDCa2NCXtzE5c8C4yBp5jl4qsto2vRBSPPIgakHR0RE+qyUSC+PHV9EvcfJSYtG0+QN1crEn4nPn40zPgXrddPw0ZuhjiMHoR4cERHpk0YltLJ0wRbWVMdyyTt5faK4+ZQzNpG6D18CbKijyEGoB0dERPqcEzIaeHBOMT9fN4QHtqWFOg5x+bOIz5+973FkWjYZ591AY8EymgqWhzCZHIwKHBER6VO+PmovP59cxlffy+WdioRQxwGgqWA5jsgYXIOycKVkUPHUnaGOJIehISoREekTHMbym6N38f38Sk5eNLrPFDcYQ+L004lITu/YX0r6BfXgiIhIyMVFtPPAnGLiI3yc8NoYatx95MeTw0nSjC9hnBHUvPsktHtpLFgW6lTSBerBERGRkMqOdfPWqVvZ0+riy2+P7DvFjdNF8uzzwFpqlz0L7V4AzbnpJ1TgiIhI0GXGeFh0yhZOHVLH0gVbeKwohf/7YBieEG+78CnjiiJl7oX4mhuo+/BFsL5QR5Ju6iNlsoiIDCS3TixjdnoT008o4or38ni5NCnUkfYxUbGkzLkA996dNK5bHOo40kMqcEREJGiqL1lLTMRna8fERFiemldIi9eQunBK6IL5OWISSJl7Ia2lm2nSXJt+rW/0BYqIyICQ//wE3iqLx+evcZq9hscKUxj/3ITQBgOc8cmkzruUlqKPVdyEAfXgiIhI0Hh9MCOtCYAWryHKaan3OKhodYU0V0TSYJLnnE/ThmW0FK8PaRbpHSpwREQkKAyW/8zawe5mF2+XJ3Df1jS+OXovmTHekOZypQ4hada5NKx9i7bSzSHNIr1HBY6IiATF9fmVJEX6mPZSPl5rALhhZU5IM7kG55A840vUrXoVd3lRSLNI71KBIyIiAXdsWhPXja/k+NfG7ituQi1qyEgSp51G7Qcv4NlbGuo40stU4IiISEAlR3p5aE4x1344jJKmyFDHASB62HjiJ8+nZtnTeGsqQh1HAiCgd1EZYxYYYzYbY7YZY249yDHzjDFrjTEbjDFLA5lHRESCzXL3cSW8XJrEi6XJoQ4DQMyIycRPOoGadx5XcRPGAtaDY4xxAv8ETgFKgZXGmBestQWdjkkG7gIWWGtLjDHpgcojIiLB950xexkW5+ar7+WGOgoAsWOPJSZvMjVLH6O9qS7UcSSAAtmDcyywzVpbaK11AwuBs/c75jLgGWttCYC1tjKAeUREJIgmpzTzo6PKueLdPNx9YAuG+IlziRk+gZolKm4GgkD+i8sCdnZ6XOp/rrMxQIoxZokxZrUx5qsHupAx5ipjzCpjzCrb7glQXBER6S3xEe08PLeYm1ZlUdgYFeo4JEw5mcj0XKqXLMTX2hjqOBIEgZxkfKBp8na/xxHANOAkIAZ43xjzgbV2y+dOsvYe4B4AR3TC/tcQEZE+xfL3GTt5pyKeJ4pTQxvFGBKnn44zNpGadx7Het2hzSNBE8gCpxQY1ulxNrD7AMfstdY2AU3GmHeAycAWRESkX/rqyGompbQw99WxoQ3icJI04yyMw0nNe09Be2gXFJTgCuQQ1UpgtDEmzxgTCVwCvLDfMc8Dc40xEcaYWGAGsDGAmUREJIDGJ7Vwx9RdfOXdXFraQzfvxjhdJM8+H3zt1C5/VsXNABSwHhxrrdcYcw3wOuAE7rPWbjDGfMf/+t3W2o3GmNeAjwEf8B9r7SeByiQiIoET4/Tx8NxifvxRFpvqYkKWw7iiSJ5zPu31VdSvXsQXZ0fIQGCs7V//4R3RCTYqe1qoY4iIyH7+OaOEmAgf31w2nANPwww8R1QsyXMvxF1ZQuPHi0OSQXpf6/alq62107tzjlYyFhGRI3ZRbjVzMxqZ9cpYQlbcxCSQcvxFtJZspGnj8pBkkL5DBY6IiByRkQmt/GH6Ls56aySNXmdIMjjjU0iZeyHNW1fTvG11SDJI36ICR0REeizS4eN/c4v59ceZrKuJDUmGiKTBJM+5gMYN79JarGmc0kEFjoiI9Nhvjt5NSWMkd29JC0n7rtShJM06h4aP3qRtl1YYkc+owBERkR45K7uWM7LrmBmieTeR6cNJOvZM6la+gruiOOjtS9+mAkdERLotJ87NP47byYVLRlDrDv6Pkqgho0icdiq1HzyPZ++uoLcvfZ8KHBER6ZYIY3loThF/KUhnxd64oLcfnZNP/KQTqHnvaby1FUFvX/oHFTgiItItP5u8mxp3BH8pSA962zEjphA3bgY17zxBe0NV0NuX/kMFjoiIdNkpQ+q5NK+G414Ziw3yvJvYsTOIyTuqY0fw5rqgti39jwocERHpkiExHv49awdffTeXvW2uoLYdP/F4ooaMpGbJo/ham4LatvRPKnBEROSwHMZy/+xi7t2SxnuVCUFtO2HqKbhSMqheuhDrbglq29J/qcAREZHDunViORb43SeZwWvUOEg85nScMfHUvPME1usOXtvS73W5wDHGxFlr1S8oIjLAzM1o4Ftj9jL7lXH4bJDm3TicJB13FsY4qHn3afB5g9OuhA3H4Q4wxswyxhQAG/2PJxtj7gp4MhERCbm0KA/3z9rBt5cPp6wlOPNujNNF8pzzod1L7fLnVNxIjxy2wAH+DJwGVAFYa9cBxwcylIiIhJ7B8p9ZO3isKIU3yhKD06YrmuTjL6K9sZa6D18G6wtKuxJ+ujREZa3dacznuiXbAxNHRET6iuvzK0mK9PGLdUOD0p4jKo7kuRfiriym8eMlQWlTwldXCpydxphZgDXGRALfwz9cJSIi4WlGWhPXja/k+NfG4g3CvBtHbCIpcy+ktaSApo3vB7w9CX9dGaL6DnA1kAWUAlP8j0VEJAwlR3p5cE4x1344jJKmyIC354xPIXXepTRv/0jFjfSaw/bgWGv3ApcHIYuIiISc5e7jSnipNIkXS5MD2lJc/izadm0jec75NH7yDq07NgS0PRlYDlvgGGPuB+z+z1trvxmQRCIiEjLfGbOXYXFuvvpebsDbis+fTcyIKTR89CZtu7YEvD0ZWLoyB+elTl9HA+cCuwMTR0REQmVKajM/Oqqcea+Nwe3rygyGnovMzAOgfuUruCuKA9qWDExdGaJ6uvNjY8xjwJsBSyQiIkEXH9HO/+YUc9OqLAobowLXzqQTiBt77L7HKXMvBKCxYBlNBcsD1q4MPD3ZqmE0kNPbQUREJFQs/5ixk3cq4nmiODVgrcTkHUXM8Ak0bV5BY8FyMs69noqn7gxYezKwdWUOTgMdc3CM/+9y4JYA5xIRkSD52shqJqa0MPfVsQG5fkRiGglHnwrGUPPuk3jr9gSkHZHOujJEFdxtY0VEJGjGJ7Xwq6m7OOWN0bS09/K8G6eL+PyZxAyfSOOGZbQUrfvcy40Fy3q3PZFODlrgGGOOPtSJ1to1vR9HRESCJcbp4+G5xfz4oyw21cX06rUjh4wgccrJuPfuouqNB/C1NX/hGM25kUA6VA/OHw/xmgVO7OUsIiISRH+YXsq6mhge2t57824cMfEkTD6JiKQ06le/jrtyR69dW6Q7DlrgWGvnBzOIiIgEz8W51czNaGTWK2PpmGJ5hIwhZuRU4sfPpHn7WupWvAQ+bVsoodOlu6iMMROBfDrWwQHAWvtQoEKJiEjgjExo5c7puzjrrZE0ep1HfL2IlEwSjz4F62mjevGjtDfW9EJKkSPTlbuofgbMo6PAeQU4HXgPUIEjItLPRDp8/G9uMXd8nMm6mtgjupaJiCR+4lyissbQuH4prSUFvZRS5Mh1Zcr8BcBJQLm19hvAZCBwq0CJiEjA/Obo3ZQ0RvLvLWlHdJ2o7LEMOu2b4HBSteh+FTfS53RliKrVWuszxniNMYlAJTAiwLlERKSXfXlYLWdk1zHzCObdOOOSSJh6Mo6YBOo+eBFP1a7eDSnSSw51m/g/gMeAFcaYZOBeYDXQCKwISjoREekVOXFu/j5jJxcuGUGtuweL2BsHsWOOIW7MdJq2rKR5yyqwvt4PKtJLDvWvfCvwB2AoHUXNY8ApQKK19uMgZBMRkV4QYSwPzSniLwXprNgb1+3zXWlZJE49lfbmOqreehhfc10AUor0rkPdJv5X4K/GmOHAJcD9dNxF9ZgxpsVauzVIGUVE5Aj8fMpuatwR/KUgvVvnmchoEiadQGRGLg3rFtO2a0uAEor0vsNOMrbW7rDW/s5aOxW4DDgX2NSVixtjFhhjNhtjthljbj3EcccYY9qNMRd0ObmIiBzWKUPquSS3hv+3PAfbjXk30cMnMOjUb+LzuqladL+KG+l3unKbuAtYQEcvzknAUuAXXTjPCfyTjmGtUmClMeYFa23BAY77HfB6t9OLiMhBDYnx8O9ZO/jqu7nsbXN16RxnQiqJR5+CcUZS+97TeGsrApxSJDAONcn4FOBS4Ew6JhUvBK6y1jZ18drHAtustYX+6y0Ezgb2v5fwWuBp4JjuRRcRkYNxGMv9s4u5d0sa71V2Yc9kRwRx42cQO2IKjQXLadm+lo5deUT6p0P14PwIeBS4yVpb3YNrZwE7Oz0uBWZ0PsAYk0XHkNeJHKLAMcZcBVzVkVhL8IiIHM6tE8uxwO8+yTzssZEZuSRMPRlvTQVVbzyIr7Ux8AFFAiyQe1EdaLB3/18H/gLcYq1tN+bgY8PW2nuAewAc0Qn6lUJE5BDmZjTwrTF7mf3KOHz24N9bHVFxJEyeT0TqEBrWvom7vCiIKUUCqweLIXRZKTCs0+NsYPd+x0wHFvqLmzTgDGOM11r7XABziYiErbQoD/fP2sFVy4dT1nLweTcxI6YQP2E2LUUfU7f6NWj3BjGlSOAFssBZCYw2xuQBu+iYpHxZ5wOstXmffm2MeQB4ScWNiEjPGCz/mbWDx4pSeLMs8YDHRCSlk3D0KWB9VC99nPb6vUFOKRIcAStwrLVeY8w1dNwd5QTus9ZuMMZ8x//63YFqW0RkILohv5KkSB+/WDf0C68Zp4u4CbOJzsmn8ZN3aS1eH4KEIsFjrO1fU1oc0Qk2KntaqGOIiPQpM9KaePyEQo5/bSwlTZGfey1q6CgSppyEu7KEho+XYN0tIUop0jOt25euttZO7845gRyiEhGRIEiO9PLgnGKu/XDY54obR0wCCVNPIiI+lbqVr+DZs/MQVxEJLypwRET6qcwYDw/NKaLZ4+Cl0iReLE3ueMEYYkdNI27cDJq3raHugxfB1x7SrCLBpgJHRKSfunViGbPTm6hqc3LROyMAcKUOIeHoU/G1NVO9+BHaG2tDG1IkRFTgiIj0M9WXrCUm4rP5k4Oj26m7bB2tPiej675L48eLad3ZpS0DRcLWYTfbFBGRviX/+QmsrorB569xmtudPNN2LNO3XkXVovtU3IigHhwRkX7FYLl+fAUj4tsAaLUuohxeqsvL2b7ygxCnE+k7VOCIiPQT0U4f9x2/i8xBCayOyGZ3+yAeaz+JS51vkZ1dR1z+sTQVLA91TJE+QQWOiEhf53AydPgwFk5bzS7HCC7cOou6oo14ayvJuGA4315Y5T9QxY3Ip1TgiIj0URHJ6cTkTmLs8BQejP4Tz+7O4KfL2rG+paGOJtLnqcAREelDjCua6JzxxOROwhEZzYQ9b/Kg66/8cnUm922LAnyfO76xYFlogor0cSpwRET6gMj04cTkTSIyIw93eRGN65dyRtQ6/jpjJ/9veQ6Ldicd8DzNuRE5MBU4IiIh4ohNJCZ3IjHDJ+Jzt9JSvJ76NW9iPS1cO24P142v5Oy3R7K2OjbUUUX6HRU4IiLB5HASnTWa6NyjcCUPpnXnJmrffw5vbWXHy8byh+m7OCGzgfmvj2Fnc+RhLigiB6ICR0QkCD6dMBw9bDye2gpaitZRu3vb5/aIinH6eHBOMQmudk56fTR1Hn2LFukp/d8jIhIgJjKa6GGfThiOoqX4E6reeghfc/0Xjh0c5eHp+YVsqY/i8ndz8fi00LzIkVCBIyLSqwyRGcOJyZ1IZEYebeWFNK5fgruy5KBnjE5s5bn521lYlMrtH2cCJmhpRcKVChwR6RWZMR4emlPEFe/mUdHqCnWcoHPEJvknDE/A526hpWg99WvewHraDnne7MGNPHx8ET9bO5SHtg8KUlqR8KcCR0R6xa0Ty5iV3sQPJ5Vx/cqcUMcJDkeEf8LwpI4JwyUbqV3+HN66yi6dfsHwGv54TCnfXDact8oSAxxWZGAx1tpQZ+gWR3SCjcqeFuoYIuJXfclaYiK++H2kxWtIXTgl+IGCICI5wz9heByemnJaitfTtt+E4UOzfD+/ku+M3cP5i0ewvla3gYscSuv2pauttdO7c456cESkW5IjveQntTI+uZX8pFY+qo5hamoL0U6LMdBu4e2yBP7f8uGhjtqrTGQ00Tn5HROGXZEdE4bffBBfS0O3ruM0lj8dU8pxgxuZ//oYduk2cJGAUIEjIgeU4Gr3FzItHX8ntTIhuYV4l49NddEU1EZTUBfDq7sSuSSvmkvyanB7DVFOy3GDG/n7jJ3ctnYIm+piQv1WjsCnE4YnEZmRS1t5IQ3rFuPZc/AJw4cSF9HOQ3OKiXRYTl40hgaPs5fzisinVOCIDHBxEe2M9xcw+cmtjE9qIT+5ldSodjbVRbGxNoaNddG8VZbAxroYdja5sPvd5XPl6L3cu2UQ921N45uj95IV62VZZRyvn7KNV0sT+dXHQyjt4z0Vcfmz9m17sG/CcO5EfK3N/hWGFx12wvChZER7eGb+dtbXxHDNhzl4re6UEgkkzcERGSBinD7GJrWS7y9gPi1o0qM9bKmPZqO/V2ZjXQwbaqPZ0Rj5hUKmu5JcXm7Ir+RbY/byv+2DuPOTDKrdffP3qowLbqbuw5eIzpuEK6ljwnBL8Xq8dXuO+Nrjklp4dn4hD24fxG/XZ6DbwEW6pydzcFTgiISZKIePMYkdxctnhUwLQ2M8bGuI8hcyMfsKmsLGKHwB7k0YEuPhh5PKODenlr9uTOefm9Jpae8DC9kZQ+TgHKKyxxI7YjJt5UW0FH1MW9n2bkwYPrS5GQ38b04xP1ozlEeLdBu4SE+owBEJA11dT8bl8DE6oW1fETMhuYXxya3kxLkpaoiiYF+PTEdBs70hKuTDIqMSWvn5lDJmDm7i1+szeXDboOBnMobIwcOIyh5HTM54TMQXh84aC5b1yi7dl+RW87vpu/jae7ksKU844uuJDFQqcETCwF+OKeFbY6r4z5ZBXL8yhwhjGZnQRn5yy75hpfykVvIS2ihpimRjbTQbOvXIbG2I6vPL/B+d2sztU3cxLM7Dz9cO4ZmSZAI6bGMMrrRhRGePJSprNL7melpLt9Bauhlfcx3QMURV8dSdvdSg5eYJFXxr9F7OXTySgn490Vok9FTgiPRjB1tPxloobIz83LBSQW00W+qjaevjhczhnJhZz+1Td2Mx/OSjob3cy2FwDc4mOnucv6hpoLV0M227NtPeVPeFo3urwIkwlr8eu5Opg5o5f/FIyloG3qrOIr1NBY5IP5YZ4+HPx+zky8PqcBhoazcsLo/n+hXD2NEUFep4AWOwnD+8lp9NLqO4MZKfrh3K2uqeLnz3aVEzlqisMfha/EVN6Rbam2oPeWbnu6h6Kj6inUeOL8Ja+Mq7eTR6dRu4SG/QQn8i/Vit28nMwY1AxyrAkU7LjsbIsC5uACyGp3ak8FxJMt8YtZdn5m3nvcp4fr52KIWNXXnv/qImayxR2WPwtTTSWrqJmsWPHrao6exIi5shMR23ga+qiuX6FcNo123gIiGlAkekT7DcM3MHHp/hnk7ryWTGeEMdLGi81nDv1sE8UpjKNeP3sHTBZp7ekcJv1mceYLK1wZWW9VlPTWsTraWbu13U9JYJyS08M287925N4w8bdBu4SF+gISqRPuAnR5Vx8pB6TntjdL+fV9NbBkV5uXlCOV8ZWc29W9L4c0EmLUk5nxU1bc20lm6irXQz7Y21Ics5L7OBB+cU84NVWTxenBqyHCLhTENUIv3QJbnVXD6imhNeG6PippOqtghuXZPNvyuP4qeTy/lkQiF3NeZyz9Y6apYupL2xJtQRuXxEFXdM3c3l7+TyXqVuAxfpS1TgiITQzMGN/G76Lk5/YxSVh1jzZqBxDfIPP2WPoa6thWu3byavbjW3jVnC+2Obub1tCI82pQZ8gcKDs/xoUjlXjKzmtDdGs7k+OkQ5RORgNEQlEiLD49pYvGAL314+nDfKEkMdJ+Q6FzW+tlbadm2mtXQz7Q3Vnztu5uBGbp+6m+TIdn62digvlyYSzDkvLoePf8zYyYTkFs5fPPKQizGKSO/QbeIi/USiq53Fp23h3i1p3L1lcKjjhIxr0FCisscSnTUWn6eVttIDFzVfZDkjq55fTt1NndvJTz8ayvI98QHPm+hq59Hji2hpN3zt3Vya23UbuEgw9Lk5OMaYBcBfASfwH2vtb/d7/XLgFv/DRuC71tp1gcwkEmpOY3l4bhFLy+MHZHHTuaixnlZaS7dQ8+6TtDdUdeMqhld2JfHa7kQuzavm/tnFrK+N4baPhgZs1eDsWDfPzN/Ossp4blyVHcLhMRHpioD14BhjnMAW4BSgFFgJXGqtLeh0zCxgo7W2xhhzOvBza+2MQ11XPTjSv1n+ckwpufFtnL9kZNitlXKwxfJcqf6iJnsM1uumdeenPTXdKWoOLsrh46oxe7lxQgVv7E7k9o+HUNL0xT2meuqolGaenlfIPzcN5i8b09Ft4CLB1dd6cI4FtllrCwGMMQuBs4F9BY61tvN3wg+A7ADmEQm5/xu7hzkZjZz4+piwK24A4vNn7ytwXKlD/EXNWKzX07FOzXtP0V7fO0VNZ20+B3/flM6D2wdxfX4Fy8/YxKOFqfzuk0yq2o7s29zJQ+r57+wdfH9FNk+XpPRSYhEJtEAWOFnAzk6PS4FD9c5cCbx6oBeMMVcBVwEQEd6rukr4WpBVx00TKpj3+hjqPeE7dyP+qHlEZ43Btnv9Rc3TtNfvDUrb9R4nv1w3lH9vHsytk8pZe1YB/9yczt83DqapB9smfG1kFT+fsptLlubxfhDm+IhI7wlkgXOgX08POB5mjJlPR4Ez50CvW2vvAe6BjiGq3gooEiwTk1u4Z2YJFy4ZQUkYbb1gImNInHYq0Vlj9j0XN+YYABoLlh3x9gc9VdHq4oaVw/j7xnR+NmU3688u4HfrM7lv26Au7rRu+dnkMi7KreGURaPZ1qDbwEX6m0AWOKXAsE6Ps4Hd+x9kjDkK+A9wurW29/uuRUIsI9rDU/MKuWlVFh/ujQt1nCNjDK7UIURm5hGVkYczIRV3ZQn1qxfRVlHE4DO+3Ss7cveWwsYovvZeHlNSm/nllN18b3wlv1g3hCeLU7AHmUfjcvi4+7gSRiW0Me+1Mexp023gIv1RIAuclcBoY0wesAu4BLis8wHGmBzgGeAKa+2WAGYRCYlop48nTijkoe2pPNFPl/F3RMftK2giM4bT3tyAu7yIhvVL8ezdBdYX6oiHtbY6li+/PYoTMhr41dTdXJ9fyW0fDeXNsgTAkBnj4aE5RfzfB8P4+4xS6t1OFrw5mpZ2rSwt0l8FrMCx1nqNMdcAr9Nxm/h91toNxpjv+F+/G7gNGATcZYwB8HZ3lrRIX2Ww3DtzB0WNUfx6fWao43SdceBKyyIqM4/IjDycsQm4K3bQVl5Ew7q38bU2HfTUxoJlQQzafUsrEpj72hjOzanlj8eUsqvJxU/XDuWKEVXMTm9i6YKtPFqYyi1rsnQbuEg/p4X+RALkp0eVceKQBha8MarP7zHliE3s6KHJzCMyPYf2hmrayotwVxThqS6DfvZ9oisijKX60rW4DvCfpsVrSF04JeiZROTA+tpt4iID1iV51Vya14c30HQ4iRw8bN/QkyMymraKYtpKN1O/+nWsuyXUCQPOaw1jnp3I76eVcvawWiKd0Ow1PF+SzA/XZIU6nogcIRU4Ir1s1uBGfjdtFwveGNWnJqg645OJzMgjKnMErrQsvHV7cJcXUbfyZbw1FaGOFxLlLS5q3E6cjo5emyinpd7j0P5SImFABY5IL8qNb+Ph44u4ctlwNgZoy4Auc7qITB+2b+jJOCNwlxfRUryeuhUvYT1toc3XR6RHe7l3yyDu25rGN0fvJTPGG+pIItILNAdHpJckubwsPm0r/96Sxr9DtMeUM3HQvoLGlToUb00ZbeXFuCuK8NbtCUkmEZEjpTk4IiESYSwPzy1mcXlCUIsbExFJZPrwjrk0mXlgLW3lRbRs+4i6Pc9hvZ6gZRER6UtU4IgcMcsfjynFaw0/WN07k1MPtmklQERS+r6CJiI5A0/VLtzlRdRsXUV7Q3WvtC8i0t+pwBE5QteM28OswY2cuKj3NtDsvGmlcUUTmZHrX5cmF+t14y4vomnzh7j37IR2zRkREdmfChyRI3B6Vh3fz69g3utjaei1DTQ7iqS48bOIzMwjInEQnj07aSsvomnj+7Q31fZSOyIi4UsFjkgPTUxu4e59G2hGHtG1nAmDSDhqHlFDRux7Ln7CbAAaN75P04b3juj6IiIDjQockR7IjPHw9Lzt3LgymxU92EDTEZvYMTk4PYfIwTnga8dduYO6D1/CvaeEwV/6vz61aaWISH+jAkekm6KdPp48oZAHtg/iqR0pXTrHERVHZPowItOH4xqcg4lw4a7cgaeyhMZP3sPXXBfg1CIiA4sKHJFuMFj+M2sHWxui+M0hNtA0rqiOrRDShxM5OAdHTDzuPTtxV+6gacsq2huqDtlOX9+0UkSkr1OBI9INt00uY2iMh9PfHMWnk4GBjlWD07L8Q07DcSak4KnajbuyhLpVr+CtqQS6vqjmwW4RFxGRrlGBI9JFl+VVcXFuTccGmjYCV9rQfXNoIlIy8NZU4K4soeHjt/FUlYH1hTqyiMiApQJHpAtmD27it9PLOXvLOXiOmczgQVm0N1ThriyhadMHuPfugnatGiwi0leowBE5CGfiICLThzN6SDyPDnuA6+quZBuxuLevpe7DF7VZpYhIH6YCR8TPGZe0b1KwKz0H6/UQvXczD6Xdzx0fDebZjR+EOqKIiHSRChwJa4fa08kRHUfk4Jx969HgcOKuLKGtspiGT97B0VLHQydu482dMdyzMTHIyUVE5EiowJGw9oU9nQYP65gYnD4cR1Rsx63be0po2rJiv40qLX+dsZM2n6PXNtAUEZHgUYEjYcs4XQDETzqByPThOOOT8ezdhXtPCXUrXsJbu4eD3bp97bg9zEhr4sTXx+DrpQ00RUQkeFTgSFiJSBpM/FHziMrI3fdc3NhjAWgsWE5TFxbQOyOrjhv8G2g2entrA00REQkmFTjSr5nIaCLTc4nKzCMyIxfrdeMuL6Jm62rce3aSce713drTaVJyM3fPLOH8xUe+gaaIiISOChzpZwyu1EwiM/OIzMgjInEQnj07aSsvomnj+7Q31fb4ypkxHp6aV8gNK7JZWdX9DTRFRKTvUIEjfZ4jOo7IjDyiMnOJTM+lvaURd0URjZ+8i6dqF/jaD3puV/d0inH6eGpeIfdtS+Ppkq5toCkiIn2XChzpe4wDV1qWf9gpD2dsAu6KHbSVF9Gwbgm+1sYuX6orezoZLP+dtYPNdVH87pOMI0kuIiJ9hAoc6ROccUlEZuQRmZlL5OAc2huqaCsvpmHNG3hqysB2faPK7vrZ5DIyDrSBpoiI9FsqcCQ0nBFEDh5GVEYekZl5GFcU7vIi2nZuon7V61h3S1BiXD6iigv9G2i6fY6gtCkiIoGnAidIMmM8PDSniCvezaOi1RXqOCHhTBy0r6BxpQ7FW1tOW3kRdR+8iLeuMuh5Zqc38uujd3PqotHsbRuY/01ERMKVCpwguXViGbPSm/jhpDKuX5kT6jhBYVxRHdsgZHTcxo21tJUX0bL9I+refx7rdYcs24j4Nh6eW8Q33hvO5vrokOUQEZHAMDaAcxsCwRGdYKOyp4U6RpdVX7KWmIgvfsYtXkPqwinBDxRgEckZHZODM/OISErHU1VKW3kR7vIi2htrQh0PgORIL0tO28I/NqXzn61poY4jIiKH0bp96Wpr7fTunKMenADLf34Cvzl6Fxfm1uA00G6hpNHFE8UpnJldx6a6KIoao/rtdgAmKpaojNyO27gzhuNzt9JW0bEmjXtPKfi8oY74ORHG8ujcIhbtTlRxIyISxlTgBFh5i4t6T8fk1dZ2Q6TDsqMxikgnXDl6L+OTWkmP9rCtIYrNddFsrItmk//PtoYoPH1g4uvnduQ2BlfqUCIz84jKyMMZn4x7Twnu8mIaN7yLr7k+tGEPyfKXY3fS0u7g1jXaQFNEJJypwAmC9Ggv924ZxH1b0/jm6L1kxnj5UacfsLHOdsYktTEuqZVxia1cklvDuORWcuLcFDdG7it4NvkLoC310bS2B6/wic+fja+lseM27vQc2pvqcFcU0fDxYjxVu8H6gpblSHxv/B6OSWviJG2gKSIS9jQHpw+LdPgYldDG+KRWxiV3FD/jkloZmdBGWYvrc709n/7p0uaQjggcUTE4omI7/f3Z1+bT5yL9z0VG01JSgLu8GHdFMb62psC/+V52ZnYdfzt2J/NeG8POZu0xJSLSn/RkDo4KnCD63FDPEXAay4iEtn0Fz/gUN+OS2hiT0EKNN5LNLclsaRvEVk8GW31D2MYw6l2DMJGxOKJjMcaBr60FX1szPrf/77Zm7KfPtbUQNWQkMXmTvtB2Y8GyXnkPwXRUSjMvnbSd8xaPYJX2mBIR6Xf63CRjY8wC4K+AE/iPtfa3+71u/K+fATQDX7fWrglkplCKz5/dta0DXFGf9az4e1HMfr0sVVExvB8Vy4dRMWDpKFAqmxjq281oShnlKGNadCmXRq1jbGwtre0ONtXHsrEsko01nw17VbRGcKDVe9t2b6V+9WtkxnhYeK6Xi5+J6Hfr92TGeFh4fCHZcW6uX5Gt4kZEZAAJWIFjjHEC/wROAUqBlcaYF6y1BZ0OOx0Y7f8zA/iX/++w44xLBiBq6OgDDwd9+lxkDNbXvq+Hxfp7VHzuZnytjXjrKvf1snz6N+2efe1UAev3PYr1/8lmaIyno7cnqZUJyS1cMLyG8cmtGPjC5OZNddHsbHYBhlsnlnGMqeaHk1L73fo9PzmqjGPTmllZFcsz2kBTRGRACdgQlTFmJvBza+1p/sc/BLDW/qbTMf8GllhrH/M/3gzMs9aWHey6/W2IKi5/FvH5s7/wvHvPTtp2bf3CMJGvreWQu2P3LsvgKC9j/YXP+KSOIa9xSa1kxngxB5iH6/XBHzf07Q0pb5xQQcQB5mCH69pDIiLhrq8NUWUBOzs9LuWLvTMHOiYL+FyBY4y5CrgKgIio3s4ZUE0Fy/cNS2VccDMVT90Z4kSdGfa0udhT6eK9yoTPvTImsYU/TC/l+IwmopwWtw821kazaHcizUG8g6sn/lyQzmlD6xmX1EqkE5q9hudLkvmhbg0XERkwAlngHOg+3P27i7pyDNbae4B7oKMH58ijyeFsqY+hqDGKE4c00uI1RDotH+yJ47a1/aNISIpsZ0JKKy1eQ5TTUu9x9Ls5RCIi0nOBLHBKgWGdHmcDu3twTNhoLFgW6gjdcqD1e/qL/pxdRESOXCDn4EQAW4CTgF3ASuAya+2GTsecCVxDx11UM4C/WWuPPdR1+9scHBERETkyfWoOjrXWa4y5BnidjtvE77PWbjDGfMf/+t3AK3QUN9vouE38G4HKIyIiIgOHFvoTERGRPq0nPTh9+3YYERERkR5QgSMiIiJhRwWOiIiIhB0VOCIiIhJ2+t0kY2NMA7A51DkGmDRgb6hDDDD6zINPn3nw6TMPvv76mQ+31g7uzgkB3U08QDZ3dya1HBljzCp95sGlzzz49JkHnz7z4BtIn7mGqERERCTsqMARERGRsNMfC5x7Qh1gANJnHnz6zINPn3nw6TMPvgHzmfe7ScYiIiIih9Mfe3BEREREDkkFjoiIiISdflXgGGMWGGM2G2O2GWNuDXWecGeMGWaMWWyM2WiM2WCMuS7UmQYCY4zTGPORMealUGcZKIwxycaYp4wxm/z/3meGOlM4M8bc4P+e8okx5jFjTHSoM4UjY8x9xphKY8wnnZ5LNca8YYzZ6v87JZQZA6nfFDjGGCfwT+B0IB+41BiTH9pUYc8L3GitHQ8cB1ytzzworgM2hjrEAPNX4DVr7ThgMvr8A8YYkwV8D5hurZ0IOIFLQpsqbD0ALNjvuVuBt6y1o4G3/I/DUr8pcIBjgW3W2kJrrRtYCJwd4kxhzVpbZq1d4/+6gY5v+lmhTRXejDHZwJnAf0KdZaAwxiQCxwP/BbDWuq21tSENFf4igBhjTAQQC+wOcZ6wZK19B6je7+mzgQf9Xz8InBPMTMHUnwqcLGBnp8el6Idt0BhjcoGpwIchjhLu/gL8APCFOMdAMgLYA9zvHxr8jzEmLtShwpW1dhfwB6AEKAPqrLWLQptqQMmw1pZBxy+xQHqI8wRMfypwzAGe0z3uQWCMiQeeBq631taHOk+4MsZ8Cai01q4OdZYBJgI4GviXtXYq0EQYd9uHmn/Ox9lAHjAUiDPGfCW0qSQc9acCpxQY1ulxNurWDDhjjIuO4uYRa+0zoc4T5mYDXzbGFNMxBHuiMebh0EYaEEqBUmvtp72TT9FR8EhgnAwUWWv3WGs9wDPArBBnGkgqjDFDAPx/V4Y4T8D0pwJnJTDaGJNnjImkY1LaCyHOFNaMMYaOeQkbrbV/CnWecGet/aG1Nttam0vHv++3rbX6zTbArLXlwE5jzFj/UycBBSGMFO5KgOOMMbH+7zEnoUndwfQC8DX/118Dng9hloDqN7uJW2u9xphrgNfpmHV/n7V2Q4hjhbvZwBXAemPMWv9zP7LWvhK6SCIBcS3wiP+Xp0LgGyHOE7astR8aY54C1tBxp+ZHDKDtA4LJGPMYMA9IM8aUAj8Dfgs8YYy5ko5i88LQJQwsbdUgIiIiYac/DVGJiIiIdIkKHBEREQk7KnBEREQk7KjAERERkbCjAkdERETCjgocEcEY82P/7s4fG2PWGmNmdPP8rxtjhnbznNzOuxzv93yLP0eBMeZuY0yPv1cZY5YYY6b7v37FGJN8iGPP6byhrDHml8aYk3vatoiETr9ZB0dEAsMYMxP4EnC0tbbNGJMGRHbjfCfwdeATem918e3W2in+zRjfpmNDwH0raRtjIqy13u5e1Fp7xmEOOQd4Cf9Cf9ba27rbhoj0DerBEZEhwF5rbRuAtXavtXY3gDHmJP8GlOuNMfcZY6L8zxcbY24zxrwHXApMp2OhvLXGmBhjzDRjzFJjzGpjzOudloafZoxZZ4x5H7j6cMH8RcxyYJS/l+hJY8yLwCJjTJw/00p/xrP9bcQYYxb6e6MeB2I+vZ4/d5r/66/6j1lnjPmfMWYW8GXgTv/7GGmMecAYc0EXPotfGGPW+F8b1wv/TUTkCKnAEZFFwDBjzBZjzF3GmBMAjDHRwAPAxdbaSXT0+H6303mt1to51tqHgVXA5dbaKXSsTvt34AJr7TTgPuAO/zn3A9+z1s7sSjBjTCwdS/mv9z81E/iatfZE4Md0bGdxDDCfjsIkzp+x2Vp7lL/daQe47gT/+SdaaycD11lrl9OxjP3N1top1trtnY4/3Gex11p7NPAv4KauvDcRCSwVOCIDnLW2kY4i4CpgD/C4MebrwFg6NkXc4j/0QeD4Tqc+fpBLjgUmAm/4t/j4CZBtjEkCkq21S/3H/e8QsUb6z10GvGytfdX//BvW2mr/16cCt/qPWwJEAzn+jA/739vHwMcHuP6JwFPW2r3+46oPcMz+7+lQn8Wnw2ergdzDXEtEgkBzcEQEa207HUXCEmPMejo24Vt7mNOaDvK8ATbs30vjn9zb1b1htvt7gw7VpgHOt9Zu3q8dutCO6UaWT48/lDb/3+3o+6pIn6AeHJEBzhgz1hgzutNTU4AdwCYg1xgzyv/8FcBSDqwBSPB/vRkY7J+8jDHGZYyZYK2tBeqMMXP8x11+hNFfB67170iNMWaq//l3Pr22MWYicNQBzn0LuMgYM8h/XOoB3kdn3fksRKQPUIEjIvHAg/5bsj8G8oGfW2tb6dhV+0l/r44PuPsg13gAuNs/XOQELgB+Z4xZR0dP0Cz/cd8A/umfZNxyhLlvB1zAx/7bzW/3P/8vIN7/Xn4ArNj/RGvtBjrm5yz1Z/yT/6WFwM3+ycQjOx3fnc9CRPoA7SYuIiIiYUc9OCIiIhJ2VOCIiIhI2FGBIyIiImFHBY6IiIiEHRU4IiIiEnZU4IiIiEjYUYEjIiIiYUcFjoiIiIQdFTgiIiISdlTgiIiISNhRgSMiIiJhRwWOiIiIhB0VOCIDmDFmrjFmc6fHY/07aTcYY753hNdeYoz51pGnDA1jTLEx5uSDvPa5z01E+h4VOCIDwMF+WFtr37XWju301A+AJdbaBGvt3w71Qz7YjDEPGGN+dZhjbjfGrDfGeI0xP9/vtXnGGJ8xprHTn6/1JMsBPjcR6WMiQh1ARPqU4cDCUIfYnzHG2cVDt9FRpH3nIK/vttZm904qEenL1IMjMoD5ezVK/V+/DcwH/uHv3XgMyAFe9D/+wUGucbYxZq0xpt4Ys90Ys6DTy8ONMcv8Q16LjDFpnc570hhTboypM8a8Y4yZ0Om1B4wx/zLGvGKMaQKuBC4HfuDP8uKBslhrH7TWvgo0HOFH86ljjDEFxpgaY8z9xphof759n5v/cbEx5iZjzMf+9/N4p2PTjDEvGWNqjTHVxph3jTH63isSYPqfTEQAsNaeCLwLXGOtjbfWXgqUAGf5H/9+/3OMMccCDwE3A8nA8UBxp0MuA74BpAORwE2dXnsVGO1/bQ3wyH6Xvwy4A0jwt/EI8Ht/lrN6+DbTjTEVxpgiY8yfjTFxhzn+cuA0YCQwBvjJIY69CFgA5AFHAV/3P38jUAoMBjKAHwG2h/lFpItU4IjIkbgSuM9a+4a11met3WWt3dTp9futtVustS3AE8CUT1+w1t5nrW2w1rYBPwcmG2OSOp37vLV2mf+6rb2QdZO//SHAicA04E+HOecf1tqd1tpqOoqtSw9x7N+stbv9x77IZ+/V429zuLXW45+/owJHJMBU4IjIkRgGbD/E6+Wdvm4G4qFjTo0x5rf+Ia16Puv1Set0/M7eDGqtLbfWFvgLpiI65upccJjTOmfYAQw9xLEHfK/AnXTMDVpkjCk0xtzazegi0gMqcETkUA7X07CTjuGb7roMOBs4GUgCcv3Pm0O03du9Hna/9g5kWKevc4Dd3W6ko5fqRmvtCOAs4PvGmJO6ex0R6R4VOCIDh8sYE93pT1fuoqwARhzi9f8C3zDGnGSMcRhjsowx47pw3QSgDagCYoFf90IWjDEu/+ReBxDhf59O/2vzjDE5psMw4LfA84dp82pjTLYxJpWOuTOPdyHn/pm+ZIwZZYwxQD3Q7v8jIgGkAkdk4HgFaOn05+ddOOc3wE/8dwDdtP+L1toVdEwi/jNQByyl41bzw3mIjiGfXUAB8EEXzvkvkO/P8txBjrmXjvd2KfBj/9dX+F87GngfaAKWA58Ah1vM8FFgEVDo/3PIdXgOYjTwJtDob/8ua+2SHlxHRLrBaK6biIiIhBv14IiIiEjYUYEjIiIiYUcFjoiIiIQdFTgiIiISdvrdZpvG6bLGFR3qGCIiIhIktq1xr7V2cHfO6X8FjiuaqOxpoY4hIiIiQdK6femO7p6jISoREREJOypwREREJOyowBEREZGw0+/m4BxIcmI8P776UkbmDMFhDrd3nhyMz1q2l5Rxxz8fo7a+MdRxREREeiwsCpwfX30px0yZSIQrClTg9Jy1pKYO4sdXX8rNv7k31GlERER6LCyGqEbmDFFx0xuMIcIVxcicIaFOIiIifURmjIdFp2whI9oT6ijdEhYFjsMYFTe9xRgN84mIyD63TixjVnoTP5xUFuoo3RIWQ1QiIiLSu6ovWUtMhN33+Ntjq/j22CpavIbUhVNCF6yLwqIHJ9ysWvkh11/zbQCWLn6bB/57z0GPbaiv58mFj3a7jX/f9Xf+98B/e5xRRETCW/7zE3ilNAGfv8Zp9hoeK0xh/HMTQhusiwZ0gfP4x1VBba+9vb3b55ww/0S+fuVVB329oaGeJx9/7EhiiYiI7Mdy0bEpnJjVAkCrdRHtBG/ONBpHnBDibF0zoIeonlhfw8VHDeqVa+3eVcq13/1/TJx0FJs3bSRneC6/vON3XHjumXz5nPP54P1lXHTJ5SQlJfHvu/6O2+0he9gwfnb7r4mNjWP5e+/yx9//muSUFMaNz9933Reff4aCDZ9wy49uo6pqL7+5/efsKt0JwK0/+RkLH32YXaUlXHbhOcw4bhbX3fgDHrr/v7y56FXcbjfzTzyZb1/9PQD+e8/dvPzic2RmDiE5JYXx+f2jChcRkeBJj/Zw98wS0mN8fNg2gu0t8TwZeyFnF/+BzJiVNBUEt3OgpwZ0gdPbdhQX8dNf3MGUqUfzi9t+xJOPdwwdRUZG8d8HH6W2poabb7iWu+65n5jYWB64714eeegBvvqNb3HHL37Kv/7zAMNyhvPDm2844PX/8Ns7OHraMfzhL/+gvb2dluZmrr3u+2zfupVHn3wOgA+Wv8fOkmIefPRJrLV8/3vfZc2qlcTExrDotZd59Iln8ba385WLz1OBIyIin7Mgq467jivh4dIc7oq5kfr162ne/CEZFwxnycqcUMfrlrAscM5/ZFuvH/v05aMOe0xG5hCmTD0agDPO/DILH/0fAKcuOB2A9R+vpbBwG1d+7TIAPB4PkyZPobiokKFZ2eQMzwXg9DO/zLNPP/6F669c8QG/uON3ADidTuITEqivr/vcMR8sX8YH7y/j8ovOBaC5uZmSkh00NzUx/6RTiI6JAeD4efO79L5FRCT8RTt9/OboXZyRVceVBbP5ZNQV1K95g7ZdWwBoLFgW4oTdF5YFTleKEegobrp6bFeY/W6v/vRxTEwsANZaZhw3i1///k+fO27zpo29dpe7xfL1K6/i/Asv+dzzj/7vQXTzt4iI7G9ScjMPzNnBhtpo5m28BM+oOdQuewZv9We3hTcVLA9hwp4Z0JOMe1t52W4+XvcRAK+/+vK+3pxPTTpqCuvWfsTOko5d31tbWthRXERu3gh27dpF6c4S/7kvHfD6x8yYyVP+CcXt7e00NjYSGxdHc3PTvmNmzprDC88+s++5yooKqquqOHradBa//Satra00NTXy7tIlvfreRUSkfzFYvje+kpdP3s4fCjK4uulbtOVMp3rxo58rbvqrsOzB6aqLJqX06vXyRozkpRee49e//BnDcoZzwUWX8vhjD+97PSU1lZ/f/ht+fMuNuN1uAL57zfUMz83jx7f9kuuu/jbJKSlMmTqN7du2fOH6N93yI+74xW08/+xTOJ1Obv3Jzzhq8lQmT5nKReeexew5c7nuxh9QVFjIN77S0YMTGxvL7b+5k3H5EzjltDO47MJzGDJ0KFOOntar711ERPqPITEe7pm5g3iXjxPemEDNpItwYqlZ/CjW6w51vF5hrLWHP6oPcUQn2Kjsz/9wfu7un5GWMTREiTrs3lXK9dd8lyeefTGkOXrD3ordnPOdX4Q6hoiIBMBZ2bX8bcZO/rM1jd9vH0PirAtw7ymhYd3b0EdrgtbtS1dba6d355wB3YMjIiIyUMQ62/nd9F2clNnApUvzWO0bTdK8c2ja9AEt2z8Kdbxepzk4vWRoVnZY9N6IiEj4mZrazPtnbibaYZnxyjg+ip5G8qxzqV/9elgWN6AeHBERkbDlMJYbxlfyvfxKblqZzZM7UogbdxwJeUdR8+6TeOv2hDpiwKjAERERCUPZsW7+M2sHDgNzXhnLztYYEo85jYiEVKoXP4KvtenwF+nHNEQlIiISZs7LqWHZGZt5syyBBW+OotSbRMrcCzFOF9VLF4Z9cQPqwREREQkb8RHt/PGYUmYObuK8xSNYXRWHMz6FlDnn01a6hcZP3gl1xKBRD04IrFr5IevWrjmia8ydcfThDxIRkQHj2LQmPjhzE16fYeYrY1ldFYdr8DBS5l1K06YPB1RxAwO4wIlo2cuYpd8monVv0NtevXIFH68Nz1nrIiISXE5juXVSOU+cUMiP12Rx9Yc5NHmdRA+fSNKMs6j78CVai9eHOmbQDdghqiEb/0v83rUMKfgvO4++pVeueeN1V1NRXobb7eaSy6/gvAsuZvl77/LPv/0Zn6+d5OQUfvqLX/HMk4/jcDp49eUXufnWn/D8s08x5/h5nHzqAqCjd+bdD9fQ3NzEjd+7mvr6erxeD9+99nrmzT+pV7KKiEj/lxPXxv2zd9Dabpj1ylh2t0QCED9xLlHZY6lZupD2huoQpwyNAVfgTH12Dg7fZ8tQpxc9TXrR0/gckXx07ntHdO3bfnkHSUnJtLa28tVLL+SE+Sdxxy9+yj33P0xWdjZ1dbUkJSVz3oUXExsbyxVfvxKA55996oDXi4yM4s6//IP4+Hhqa2r4+lcu5oR5J35hU08RERl4Lsmt5nfTd/GnDen8bWM6FgPOCJKOOQNHdBzVbz+CdbeEOmbIhGWBM+3pY7t9jsPnPuR5q89fcdhrLHzkfyx5+00AKirKePapJ5g6bTpZ2dkAJCUldy+Utfzzb3/io9WrcDgc7KmsoKpqL2lpg7t3HRERCRuJrnb+euxOJqe0cNZbI/m4JhYAR3QcybPOxdtQTc07T4CvPcRJQyssC5zDFSM5a35LWtGzWIcL4/OwJ++8Ix6mWrXyQ1Z8+D73/28h0TExXPXNKxg9Zhw7iosOe67TGcGne4JZa/F4PAC8+sqL1NbU8PDCp4lwuThrwYm429qOKKeIiHRPZoyHh+YUccW7eVS0ukLa/siENu6bvYNXdyUy+9WxtLR3TKWNSBpM8qxzaSleT9PG94OesS8akJOMI9qq2TPiPDbNv489I87D1VZ1xNdsbGwkMSGR6JgYiosK+eTjdXg8btasWsmu0lIA6upqAYiLi6O56bM1CIZkZbGxYAMASxe/hdfbUeA0NjSSkppKhMvFqhUfULZ79xHnFBGR7rl1Yhmz0pv44aSykLb/9PztPHx8ETeszOaGlcP2FTeRmXmkzL2QhvXvqLjpRLuJ9xK3281N111NZWUFw3PzqKmp5qrvXkNbaxv//PufsT4fKamDuOue+9hRXMQtN16Hw+Hg5lt/Qk5uLjd+72p81sexM47j8Ucf4d0P11BbU8MN134Hr9fLmLHjWbd2DX+76x6GZmXvm4gcCNpNXEQEqi9ZS0zEF39Gen1w75a0gLf//8bsJeIA3RAtXkPqwikAxIycSty446h7/3k81eH7S3BPdhNXgSNfoAJHRKRjaOjhOYXMSm/GGHC3w8c1Mby4M5kGrzPg7Se42vnysFomJbcQ6YRmr+H5kmR+uCaLirZIEiafSOTgHGqWPYOvuS7geUKpJwVOWM7BERERORLxEe38cspuJiS3YoFWryHSaVldFcvvN2QGLUdWrJspqS20eA1RTku9x0GlN47kWWeBw0H14kewXvfhLzQAqcARERHp5Ni0Ju6fXcyS8gTeq4yntNnFfVvT+ObovWTGeIOaJT3ay71bBvGY72QudbzJkHhImXcZnqpdNKx9C6wvqHn6k7AocHzWgrWg9WGOnLUdn6eIyADjNJYfTCzn22P2ct2KYTy/M/lzr9+wMifomS59ZwQAGReczc1v1ZM86xxat6ykeevqoGfpb8KiwNleUkZq6iAiXFEqco6EtXg9bWwvCc2dAiIioTLcvyJwc7vjcysC9yUpc86nftVrtJVtD3WUfiEsJhknJ8bz46svZWTOEBwqcHrMZy3bS8q445+PUVvfGOo4IiJBcUleNb+ftos/bMjg7xsHd6wI3AfE5c8iPn/2F55vLFhGU8HyECQKnT53F5UxZgHwV8AJ/Mda+9v9Xk8CHgZy6OhN+oO19v5DXfNABY6IiEh3Jbm8/OXYUiantPD1ZcP3rQjcl0QkppFywsU4omKpeOrOUMcJmZ4UOAFb6M8Y4wT+CZwO5AOXGmPy9zvsaqDAWjsZmAf80RjT9/oFRUQkrMwe3MiHZ26m1u1k9qtj+2RxY1zRJM06l4Z1i0MdpV8K5BycY4Ft1tpCAGPMQuBsoKDTMRZIMB27R8YD1UBwp6iLiMiAEWEsPzqqjK+PquLqD3J4dVdSqCMdmDEkHXcWbbu30lpSgDM+OdSJ+p1AFjhZwM5Oj0uBGfsd8w/gBWA3kABcbO0X73kzxlwFXAVARFQgsoqISJgbEd/GA3OKqWqL4LiXx1EZgn2luip+4vGAoXH9UoABN+emNwRyL6oDzdLaf8LPacBaYCgwBfiHMSbxCydZe4+1drq1drpx9t1/kCIi0hdZrhhRxZIFW3i0MJVzF4/o08VN9LBxRGWNoe7DFzqWQJEeCWQPTikwrNPjbDp6ajr7BvBb2zHTeZsxpggYBxx6O3AREZEuSIn08o8ZOxmd2MqCN0ZRUBcT6kiHFJGUTsKUk6h55wmsuzXUcfq1QPbgrARGG2Py/BOHL6FjOKqzEuAkAGNMBjAWKAxgJhERGSCOz2jgwzM3UdrsYu6rY/t8cWMiY0iedTb1H72Jt25PqOP0ewHrwbHWeo0x1wCv03Gb+H3W2g3GmO/4X78buB14wBizno4hrVustXsDlUlERMKfy+HjZ5PLuDSvhm+/n8ObZV+Y+dD3GEPycWfRunMzbaWbQ50mLAR0JWNr7SvAK/s9d3enr3cDpwYyg4iIDBxjElu5f3Yxu5ojmfHyWPa29d25Np3FHzUP6/PR+Mm7oY4SNgI5RCUiIhIklm+N3subp27lvm1pXLQ0r98UN9E5E4gaMpK6D1/ki/fiSE+FxV5UIiIycKVFefjXzBKyYj2cvGg0W+qjQx2pyyJSMkiYPI/qpQuxnrZQxwkr6sEREZF+6+Qh9Xx45mY210Vzwmtj+lVx44iKJXnmOdSvXkR7fVWo44Qd9eCIiEi/E+XwcfvU3ZyTU8s3lg3nnYqEUEfqHuMgaebZtBR/QtvuraFOE5ZU4IiISL+Sn9TCA3OK2VofzYyXx1Hj7n8/yhImn4h1t9JUsCzUUcKWhqhERKRPy4zxsOiULWREu/nu2D28dso2/rYxncvfze2XxU107iQi03OoW/FyqKOEtf73L0NERAaUWyeWMTu9iXcWbKGi1cW818ZQ2Ng/9yV0pQ4hYeLcjknFXneo44Q1FTgiItInVV+ylpiIz26bzon3kBPvYdWXNpK6cErogvWQIzqOpOPOpm7167Q3VIc6TtjTEJWIiPRJ+c9PYGFRCm3tHXs3N3sNjxWmMP65CSFO1gMOZ8ek4qJ1uMu2hzrNgKACR0RE+qTyFhf1HgeRDou73RDltNR7HFT04Z3ADyZhykn4Wpto2vh+qKMMGCpwRESkz8qNc9PaDvNfH829WwaREeMNdaRuixkxmchBWdSvfOXwB0uv0RwcERHps5bviaewMYo11XGsqY4LdZxuc6VlEZ8/m+rFj2K9nlDHGVDUgyMiIn2U5fIR1TxamBrqID3iiIknacaXqVv5Cu1NtaGOM+CowBERkT7p2LRmLLCyKjbUUbrP4SR55jk0b1uNu6I41GkGJBU4IiLSJ12WV80jhamACXWUbks8+lTam+po3rwi1FEGLBU4IiLS50Q6fJw/vIaFRf1veCpm5FQikjOoW/VaqKMMaCpwRESkzzk9q54NtTGUNEWGOkq3uAYPI278TOrefxbaNak4lFTgiIhIn3P5iE+Hp/oPR2wiScd+ifoVL9PeVBfqOAOeChwREelTBkV5mZvRyHM7k0MdpeucER2TiresxF25I9RpBBU4IiLSx1wwvIbXdiXS4HGGOkqXJU47DW99Fc1bV4U6ivipwBERkT6lv619Ezt6OhEJqdSvfj3UUaQTFTgiItJnjElsJTvOzdvlCaGO0iWR6cOJHXMMtcufA1//20YinKnAERGRPuOyvGoeL0ql3fb9tW+ccUkkHnsmdStewtfSEOo4sh8VOCIi0icYLJf1l7unnC6SZp5L08b38ezZGeo0cgAqcEREpE+Ym9FIdVsEn9TGhDrKYSVNX4C3tpyW7R+FOoochAocERHpEy4fUc2j/WDl4tixx+KMS6J+zRuhjiKHoAJHRERCLtbZzlnZdTxelBLqKIcUmZlH7KijqX3/OfC1hzqOHIIKHBERCbkvD6vjw71xVLS6Qh3lgOLyZ+GMTyZp+unUffAivpbGUEeSw4gIdQAREZHLRlTzv+2DQh3joOLzZxOdPZbGDcvwVO0KdRzpAvXgiIhISA2NcTNtUDMvliaFOspBdNyy7t67i5aidSHOIl2lHhwREQmpi/NqeH5nMq3tfet37rj8WcTnz973OHbEZGJHTKaxYBlNBctDmEy6QgWOiIiEkOXyEdVct2JYqIN8QfO2NUSm5+Jrric6ZzwVT90Z6kjSDX2rXBYRkQFlckoLcRE+llfGhTrK5zhik0idfzmeqlLqVrwU6jjSA+rBERGRkPl0Y01L39maISI5g+TZ59G06YN9C/k1FiwLcSrproD24BhjFhhjNhtjthljbj3IMfOMMWuNMRuMMUsDmUdERPqOCGO5KLeGR/vQ2jeRmXmkzL2Aho/e/NwqxZpz0/8ErAfHGOME/gmcApQCK40xL1hrCzodkwzcBSyw1pYYY9IDlUdERPqWk4fWU9QYxfaG6FBHASA6dxLxE+dSu+xZPNW7Qx1HjlAgh6iOBbZZawsBjDELgbOBgk7HXAY8Y60tAbDWVgYwj4iI9CGX5VXzaGHf6L2Jy59NdE4+NUseo72xJtRxpBcEcogqC+i8xWqp/7nOxgApxpglxpjVxpivHuhCxpirjDGrjDGrbLsnQHFFRCRYklxeTh1az1M7QlzgGAeJ0xYQlZlHzeJHVNyEkUD24Bxoxpg9QPvTgJOAGOB9Y8wH1totnzvJ2nuAewAc0Qn7X0NERPqZc4fXsrg8gRp36O51MREuko47G6yP6qWPg36BDiuB/JdVCnRe2CAb2H9QsxTYa61tApqMMe8Ak4EtiIhI2Lo8r5q/bgzdtEtHdBzJs8/HU1NOw0dvgNXvzuEmkENUK4HRxpg8Y0wkcAnwwn7HPA/MNcZEGGNigRnAxgBmEhGREMuNb2NsUhuv704MSfvOhFRS519O264tNKxZpOImTAWsB8da6zXGXAO8DjiB+6y1G4wx3/G/fre1dqMx5jXgY8AH/Mda+0mgMomISOhdmlfNU8XJeHzBX2vWlZZF0nFn07h+Ka07NgS9fQkeY/tZ5eqITrBR2dNCHUNERHrE8snZBXztvVxWVwV39eKorDEkHn0KdStexl1RHNS25ci0bl+62lo7vTvnaCVjEREJmuPSmvD4DKurYoPabuyoacSOOYaad57EW6cVSQYCFTgiIhI0l42o5pHCVA58o21gxB81n6jMXKqXPIqvuT5o7UpoqcAREZGgiHL4OG94LTNfHhecBh1Oko45A0d0HNWLH8V62oLTrvQJ2k1cRESC4ozsOj6ujmFnc2TA2zKuaFKOvwiAmnefVHEzAKkHR0REguKyEdU8UpQa8HYcsYmkzLmAtvJCGj9eEvD2pG9SD46IiATc4CgPc9KbeL4kOaDtRCSnkzr/MpoL16q4GeDUgyMiIgF3YW4Nr5Qm0uh1BqyNyIxcko49k/o1b9C2SwviD3TqwRERkYD77O6pwIgePpHEY86gdvlzKm4EUA+OiIgE2PikFobEeFlSkRCQ68eNn0lM7kRqli6kvaE6IG1I/6MCR0REAuqyvGoWFqXgs7289o0xJEw9BVdKBtVvP4qvral3ry/9WpeHqIwxwV1TW0RE+j2HsVySV9Prw1PG6SJ51rk4YxOoWbpQxY18wWELHGPMLGNMAf5dvo0xk40xdwU8mYiI9HvHZzSypy2CgrqYXrumIyqWlBMuwdfaRO2yZ7FeT69dW8JHV3pw/gycBlQBWGvXAccHMpSIiISHy/OqebQXem/i8mcB4IxPIWX+5bSVbad+9etgfUd8bQlPXRqistbu3O+p9gBkERGRMBIX0c6XhtXxRHHKEV8rPn82rkFDSZl3KU2b3qdp4/JeSCjhrCuTjHcaY2YB1hgTCXwP/3CViIjIwXx5WB3LK+OobHX1yvWSZ51L3YqXcVcU98r1JLx1pcD5DvBXIAsoBRYBVwcylIiI9H+Xj6jm/q2Denx+XP4s4vNn73vsiIolZe6FNBYso6lAPThyaIctcKy1e4HLg5BFRETCRFasm6mpzVywa0SPr+HZu4v2plrce3YSkzuJiqfu7MWEEu4OW+AYY+4H7P7PW2u/GZBEIiLS712SW8OzJcm0tnd/wXwTEUn8UfOIysyjfvXruCuKicmdFICUEs66MkT1Uqevo4Fzgd2BiSMiIv2f5bIR1Vz74bBunxmZOYLEo0+hrayQqkX3Y71uABoLlvV2SAlzXRmierrzY2PMY8CbAUskIiL92tTUFmKcPpbv6fr6sMYVTcKUE3ENyqJu5at49pR87nXNuZHu6slWDaOBnN4OIiIi4eHyEdU8UpQKdG1rhqiho0mYejKtpZuoeuMBaNfCfXLkujIHp4GOOTjG/3c5cEuAc4mISD8UYSwX5tYw77Uxhz3WRMWSOOUkIpLTqfvgBTxVu4KQUAaKrgxRBWb7VxERCTunDq1nW30URY1Rhzwuetg44iefSOuOT6hb+Sr4vEFKKAPFQQscY8zRhzrRWrum9+OIiEh/dvmI6kNurOmIjiPh6FOIiEumdtkzeGvKg5hOBpJD9eD88RCvWeDEXs4iIiL9WHKkl5OG1HP1Qe6eih4+kYRJx9NcuI66D14En3b9kcA5aIFjrZ0fzCAiItK/nT+8lrfKEql1f/5HiyMmgcRpp+GIiqXm3afw1lWGKKEMJF26i8oYMxHIp2MdHACstQ8FKpSIiPQ/l+VV88cNGZ97LmbEZOInzKFp6yqaN6/U7t8SNF25i+pnwDw6CpxXgNOB9wAVOCIiAkBefBujEttYtDsRAGdcMonTTgNnBNVLFtLeUBXihDLQdKUH5wJgMvCRtfYbxpgM4D+BjSUiIv3JZSOqebI4Ba91EDNqKvHjZ9K06UOat67mALv9iARcVwqcVmutzxjjNcYkApVAz3dPExGRMGO5PK+aK1ZPJmXeRWB9VC9+hPbG2lAHkwHsoLugGWP+YYyZDawwxiQD9wKrgTXAiuDEExERgMwYD4tO2UJGdN9b5XdWejNtEXGUTL2K1p0bqVm6UMWNhNyhenC2An8AhgKNwGPAKUCitfbjIGQTERG/WyeWMSu9iR9OKuP6lX1nt5yIxDS+MTuKp1rzqFr8ML7m+lBHEgHAWHvosVFjzHDgEv+faDoKncestVsDH++LHNEJNip7WiiaFhEJuupL1hIT8cXv0y1eQ+rCKcEP9CnjIG7ccaSMmsCK2Os55sXR7GqODF0eCWut25euttZO7845Bx2i+pS1doe19nfW2qnAZcC5wKYeZhQRkW44+sXxVLY68frvrvb64MWdiYx/bkLQs8TlzwIgIjmD1JOuwJWayXEb/8aavVEqbqTPOWyBY4xxGWPOMsY8ArwKbAHO78rFjTELjDGbjTHbjDG3HuK4Y4wx7caYC7qcXEQkzLkcPv5y7E5q25wY09Fr4zBw8pB6vj12DzHO4K4pE58/m/iJc0mecz7NW1ZSu+wZLs3efcitGURC5VCTjE8xxtwHlAJX0bEGzkhr7cXW2ucOd2FjjBP4Jx3r5uQDlxpj8g9y3O+A13v0DkREwpDDWO6fvYO2dgcb62K4d8sgTnhtDPdsGcTSigRGxLtZe1YB5+bUEIzbsF2pQwBwxqdS/caDtJYUkB7tYVZ6Ey/sTAp4+yLddahJxj8CHgVustZW9+DaxwLbrLWFAMaYhcDZQMF+x10LPA0c04M2RETCkOUfM3aSHNnOeYtH4PZ99rvoDZ0mGM9Jb+DPx5TyrdF7uXFVNpvqYno9ScLUU4gdOWXf4+jsMURnj6GxYBkX+Z7jpZ1JNHmdvd6uyJEK5F5UWcDOTo9LgRmdDzDGZNExp+dEDlHgGGOuoqMXCSKijjCWiEhfZvnt0bvIT2rhzLdGfa642d97lQkc98o4rhqzl0WnbOORwlR+vT6TBs+RFxwRSYOJGz8T16AsGta9TXPhOjLOvYGKp+7cd8xlZ1TzozVZR9yWSCAcdg7OETAHeG7/ftS/ALdYaw+5pay19h5r7XRr7XTjdPVWPhGRPueWiRWcOKSBcxaP7FLPSLs1/GvzYKa9OI7kSC/rzirg0rxqejpsFZE0mKTjvkzynAvwVO1m72v3dqxG3O793HETklsYHOXlnYr4HrUjEmhd2myzh0qBYZ0eZwO79ztmOrDQGAOQBpxhjPF2ZY6PiEi4+e7YPXxlRDUnLxr9hR25D2dPm4vvfjCcYwY18edjO4atvr8ym3U1sV06PyIxjbj8WbgGZdG8ZSV1K1/5QlHTWLBs39eX5VXzWFEqPnug32VFQi+QBc5KYLQxJg/YRcc6Opd1PsBam/fp18aYB4CXVNyIyEB0WV4VN+RXcPKiMVS09rynemVVHHNfHcPXRlXx3Inbeb4kmV+sG0LNQQqmfYVNWjbNm1dQt/JVaD/waslNBcuBjgnQl+ZVc8Zbo3qcUyTQAjZEZa31AtfQcXfURuAJa+0GY8x3jDHfCVS7IiL9zZeH1fKro3fzpbdGUdJ05OvJWAwPbEtj6ovj8Vn46KyNXDl6Lw7z2bCVMzGNpBlnkXz8RR1DUa/eS/PWVQctbjqbn9nA7hZXQCY1i/SWw65k3NdoJWMRCScnZtZz/5wdnP32SNZWd204qbsmJTfz52NLiXH6uKlgIgWZp+MaPIzmLStp3r62S0VNZ/fNLmbV3lju2pwekLwi++vJSsaBHKISEZFDmJHWxANzdnDp0ryAFTcA62tjOe2DmVxxbAKPzF7M4qo6frg4juam7l8rPqKd07PquWWV7p6Svi2Qd1GJiMhBTEpu5vETCrly2XCW7QncnUjOxEEkzTiLlOMv5omSwRz19EjKK2tZdfp6rhlXSYTpXi/+2Tm1vFcZx5423dEqfZt6cEREgmxkQivPn7id76/M5o2yxIC04UwcRPz4WfuGoupXvYb1D0X9+KMsHtw+iD9OL+Xro6r4/sps3qlI6NJ1L8+r5t6taQHJLNKbVOCIiARRdqybl0/azi/WDeWZkpRev35HYTMT1+Acmres+lxh09mW+mjOenskXx5Wx79nlrBqbyw/XJNF6SE2zRwW6+ao1BZeKdXWDNL3qcAREQmSwVEeXjppG3dtHsyD2wf16rW/WNi8fsDC5vMML+xMZtHuRG6cUMH7Z2zibxvT+evG9AOuoHxxXjXP7Eim7RCrK4v0FfpXKiISBEkuLy+ctJ2nd6Twt429d/eRM2EQSTO+ROrxF+OpraTq1Xtp3rKiC8XNZ1rbHdzx8RDmvDqW6YOaWf2lTSzIqtvvKMvlI6p5VDuHSz+hHhwRkQCLcfp4Zn4hyyvjuf3jzB5fJy5/1r7F9pwJHT02kek5NG3tao/Noe1oiuLid0Zw8pB6/ujfxPPmVdkUNUZx6tB6hse5KWo88nV6RIJBBY6ISAC5HD4WnlBIYUMUN63K4sDb9HVNfP5sWndu/nxhs+Z1rPfICpv9vVmWyPSXxnHtuD28s2Az/9maxjk5tUQ5LT+cVM71nXY0F+mrtNCfiEiAOIzlf3OKiTCWy97No/0I9m1yJgwi7bRv4mttomnrKlq2f9Trhc2B1Fy6lmjnF39OtHgNqQunBLx9EdBCfyIifYjlnzNKSIps57zFI3pU3Dii40icvoCozBGfey5h0gkYZ8S+4apAGv/cBH5z9C6+PKyW2AhLs9fwfEkyP1yjhf6kb1OBIyLS6yy/m7aL8UmtnPnWqAPekXQwxhVFVNZooofl40rJoG33NmrefRJ35Q4yzr+JiqfuDGDuLypvcVHvcRDltLR4DVFOS73HcUQbgooEgwocEZFeduukCuZlNnDaG6Np8joPf4IjgqghI4jOGU9k+nDclTtoKVxLbVkh+LyBD3wY6dFe7t0yiPu2pvHN0XvJjAl9JpHDUYEjItKL/m9sJZflVXPyotHUug/xLdYYItOHEz1sPFFDR+GpKae1ZGPHwnyetgOe0liwLECpD+3Sdz4bIrtBE4yln1CBIyLSSy4fUcX1+ZWcvGgMlQcZwnENGtpR1GSPpb2pjtadG2n85B18rYff+TIYc25EwoUKHBGRXnD2sFpun7qbBW+MpqTp82vFRCSmEZ0znuhh47HtHlpLNlKz+FHam2pDE1ZkAFCBIyJyhE7MrOdvM3by5bdGsqU+GgBHbBLROeOIGTYe44qidedGapc/i7duT4jTigwMKnBERI7AjLQm7p+zg0uX5rG+OY2YkWOJzsknIj6Z1tLN1K95A0/VrlDHFBlwVOCIiPTQpORmHp9XyP9tO56CsScxKHUIbWXbadq4HHfFDrC+UEcUGbC02aZIP5EZ42HRKVvIiA786rVyYHH5szq+cDgZP2oIzy/Yzc/tVbwXcwItxevZ8/K/qF/5Cu7yIhU3IiGmHhyRfuLWiWXMSm/ih5PKtBdQKBhDfP5snLGJ5GYN4qmYX3FH0UQeXLPmoLd1i0joqMAR6eOqL1lLTMRnewF9e2wV3x5bhccH13yYQ3lLBOUtLsqaXexti8AewWaOsj+DKy2L6OxxRGWPASC5sYSH7F/4+9pU/rupNcT5RORgVOCI9HH5z0/g1ZO2MjqpDaeBtnbD+ppoPtwbx+z0RobEeMiM8ZAZ4yXJ1c6e1gjKW13sbnbtK37KW1yU+f8ub3FR2RrR7b2RMmM8PDSniCvezQv7Zfpdg4b6i5qxYAzO6DgGU8O/In9PwtEtvOY7nfscQwCtSyPSV6nAEenjzsquJSOmY95Ni9cQ6bSsrorlplXDvnCsy+EjM9rrL3g8DInt+Ht6WnPHY//zqZHtVLmdnxU/zZ8WPxFfKIa8/kIo3IfIIlIyiR42jujssViPm9bSTdS88zjtDdUA/HRGCdNGVfFJbTS3vlwIFIU2sIgckrHWHv6oPsQRnWCjsqeFOoZIUJw6tI67Z5bwSU0M2xsiP7cXUOfl87vLaSzp0d5OvT+fL4iGxHS8lhblxeWwmAN09rR4DakLp/T8zfUBEcnpnxU1Ph+tpZto3bmZ9vq9+47Zf4jwU+Hw/kX6i9btS1dba6d35xwVOCJ91MTkFl4+eRuXLM3j/T3xIcngMJb8pBZun7qb+ZmNRDktHh88uyOZH6zO7pdDVRGJaUQNG0d09jgwhjZ/UeOtqzzg8RcOr+bumSW4HBaXA5q9hudLkvnhmqx++f5F+qOeFDgaohLpg4bEeHh63nZuWpkdsuIGwGcNn9TGUtIUSYTD0tpuiHJYThrawOAN3n7zA96ZkLqvp8Y4XbSWbqZuxYt4ayoOek6Uw8ftU3dzbk4tb5clcHp2PS1eQ5TTUu9x9Jv3LjJQqcAR6WNine08NW87/92WxpM7UkIdB4D0aC/3bhm0b4jsmEHNvHLyNu78JIN/bBrcJ+/ccsYn+ycKj8MRFd2xqvCq1/FU7z7suROSW7h/djFb66M59uVx3HVcyefef2aMNwjvQESOhIaoRPoQh7EsPL6IGreTb7+fA32wcPhUbnwb98/eQaPHwVXvD6esJfQ9Go7YJKKHjSU6exyOmHjaSjfTWroJz96ubpVg+b+xe7h1UgU/WjOUhwtT6cv/DUQGCg1RifRzvzl6Fwmudi5/N5e+/oO1uDGKkxeN5paJ5Sw/YxPf+3AYL5YmB7TNuPxZNBV8/tZsR0wC0dljiR42DmdcEq2lW2j4eAmePTuBrv8ClxHt4d8zd5Aa1c6818ZQ2BjVy+lFJJhU4Ij0Ed8es4dTh9Yz//UxeHz9YxeVdmv49fohvF2WwH2zd3BqVj23rMqiud0ZkPbi82fTVLAcR3QcUf6iJiI+lbbdW2nc8B7uypIebZFwRlYd/ziuhPu3pvGb9Zn7bo0Xkf5LBY5IH3Da0DpumVTOia+Podbd//63/GBvPDNeGcefppfy/pmb+fp7uXxUHdurbTiiOq6XcsIlRCQNpm33Npo2vn9Em1rGOH385uhdnJZVz1feyWN5CCd0i0jv6n/fSUXCzKTkZu6ZVcJFS0ZQ3I+HRRo8Tv7f+8O5cHgNz524nb8VpPPnjen4jqA3JCIlg4RJ84hM/2xhwcjBHQsctjfXdWxq2UOTU5p5YE4xa6tjmfHyOOo9gel1EpHQUIEjEkJDY9w8Pb+Q76/I5sO9caGO0yue3JHCB3vi+O/sHZwytJ5vLR9OaXNkl841EZFEZuQSlTmCyCEjsO5W2soLadr0Pu49pWScfyMVT915RPkMluvGV/L9CZX8YFUWC4tTj+h6ItI3qcARCZG4iHaeml/IPVvSeLqkb9wO3lt2Nkey4M1RfD+/gvdO38z3V2bzzEHeozMhlajMEUQNGUFEyhA8Vbv8Rc0HtDfV9mquoTFu7p21g2inZe6rY9jR1H97zETk0AJa4BhjFgB/BZzAf6y1v93v9cuBW/wPG4HvWmvXBTKTSF/gMJYH5hSzrjqGP2zICHWcgPBZwx82ZLK4PIH7Z+/g1KH13LQqm0ZfJJGDhxE1ZCSRmSMwDgdt5UU0b11NW2UJtHsOes3GgmU9znPOsFr+cuxO7t4ymDs/yej2ZqMi0r8EbB0cY4wT2AKcApQCK4FLrbUFnY6ZBWy01tYYY04Hfm6tnXGo62odHAkHd04rJT+5hbPfHjUg7thJiI/lD8dVMndQFde5/49VNYm0lRXiLi/EW7cnoG3HRbRz5/RdnJDRwDeW5bIiTIYCRQaSvrYOzrHANmttIYAxZiFwNrCvwLHWdl7Q4gMgO4B5RPqE747dw0lDGpj/+ujwLW6MwZU6lKghI4jMHIkzJo6by4s5tWoJ9478Hf/am8adWzKOaAJyV0wb1MQDs3ewfE8cM14eR6NXE4lFBopAFjhZwM5Oj0uBQ/XOXAm8eqAXjDFXAVcBEKExc+m/FmTVcfOEcua/PoY6T3hNgTORMURl5nVMEM7Ipb25nrbyQho+WoSnqgywPAUs3zSGe2d1DFl9Y9lwSgIwD8ZhLDfmV3DN+D18f0V22M1xEpHDC+R32AP9anbA8TBjzHw6Cpw5B3rdWnsPcA90DFH1VkCRYDoqpZl/zyzhwiUj+u3k1v1XEo5ITt93x1NEYhruyhLc5YU0fLwEX2vjAa+xuyWSL701iu+Nr+S907f0+p1MOXFu/jurGB+G2a+M7fIdXCISXgJZ4JQCwzo9zga+sMudMeYo4D/A6dbaqgDmEQmZrFg3T88r5PoV2f16Dkh8/my8tZVE+u96sl4vbeXbadqwDPfeUvC1d+k6FsNfN2awpDyBB+YUc1pWPdetGHbEa9FcOLyGPxxT2itr8IhI/xbIAmclMNoYkwfsAi4BLut8gDEmB3gGuMJauyWAWURCJj6inafmFfKvzYN5th8OlUQkpxOZnktkRi4AMSOn4i4rpGbLCtoba4/o2utqYpn1yjh+c/QuVpy5iW8uG96j1YQTXO38+ZidHJPWzDlvj+z1VZRFpP8JWIFjrfUaY64BXqfjNvH7rLUbjDHf8b9+N3AbMAi4yxgD4O3uLGmRvsxpLA/OKWZNVSx/KkgPdZwuccTE+wua4USlDwfjwBEVs+/1qIxcojJyMQVRX9j4sida2h1cv3IYZ+yu45Hji7h/2yB+/fGQLk/Anjm4kftm7+DNsgRmvjw2YPtgiUj/ErDbxANFt4lLf/LH6aWMTWrlnLdH9tk7pozThSt9GFH+osYRFYu7soS2imLcFcX4Whr2HZtxwc1HvJLwoWREe7hn1g5SItv5+nu5h9zR22ksP5xUzrdG7+XaIOxkLiKh09duExcZ0P5vbCXzMhuY//qYPlbcGCJSMojK6Bh2ikjOwFtTRlvFDupWvIK3tiJkySpaXZzz9ki+O3YPSxZs4cdrhvK/wlT2v2chN76NB2YX0+BxMvOVcZS1uEITWET6LBU4IgFwRlYdN02oYN7rY/rEJo6O2CR/QTOcyPQc2lsacVfsoGnTB7j37jrk6sGdHclKwl1lMdy1OZ2lFQk8MLtjAvK1Hw4jyml5aE4Rz+xI5kdHVXDnJxn8Y9Ng7AFv2BSRgU5DVCK9bEpqMy+cuJ3zFo9gVVVo7pgyrigiB+cQ6S9qTEQk7opi3BU7cFcW42ttCkmu7opy+PjV1N2cnVPLhtpoThvaQI3byYI3RrG+VhOJRQYKDVGJhFh2rJunTijkex8OC0hxs/86NPsYB67UIf6CJpeIxEF4qnbjriimrnBtwLdDCJQ2n4MrR+8lJsIyLK6jlyk1qp0VX9pMi9eQunBKaAOKSJ+lAkekl8RHtPP0/O38Y9NgntuZHJg28mfvK3Cc8Sn7emgi04bR3lTbMey04d2OYacurknT1+U/P4HfHL2LLw+rJTbC0uw1PF+SzA/XZIU6moj0YSpwRHqB01gemlvMir1x/GVjYG4HN5Edt2onTjuNyPThYAzuimJaSzZRv+p1rLslIO2GWnmLi3qPgyinpcVriHJa6j0OKlo1sVhEDk4FjsgRs/xheikRxnLDimEceJeS7jMRkbgGZxM3biaRg4buez4m7yigY8Jvb6xD0x+kR3u5d8sg7tuaxjdH7yUzxhvqSCLSx2mSscgRumZcJV8bWcVJi47wjilnBJGDsohMz8E1OIeIxDQ81WW49+zAU1mCp6aCjPNvDOg6NCIifZEmGYsE2Zeya7khv5L5Pbkd3DhwDRpC5OCOW7cjUjLw1lbiriyhcf1SPNVlYTOPRkQk2FTgiPTQ1NRm7jpuJ+cuHkFJUxd2rDaGiOQMItNziBycg2tQFu0NVbj3lNC06QM8e3dhD7MeTTDWoRERCQcqcER6YFismydPKOSaD4ex+hC3g0ckDe5YjyY9B1daNu0tDXgqS2jZvpa6D1/Eetq61e5AmXMjInKkVOCIdFOCq+N28L9tSueF/W4Hd8an7OuhiUzPweduxb1nJy0lBdSvfh1fW3NoQouIDDAqcES6KDPGwyOnVtHWWM/7e+L528bBOGIT9xUzkek5YG3HRpX/v717j66rLPM4/n3OJWmapM2Ntun9SplSsJRLaYu6BC/VcSgqMxQVAZnlZbwxS9CycDmKozLiKM7owELAorgMgigolctUgeFeQFpsgdI2bcmllzRJm6a5neSZP/ZuiWnSpCU5Oznn91krK/vs8+79Pu9JcvKcd7/7fWu30rT+0b9ZqFJERNJHCY7IAK2cX8vigr1UJUfz0YbLKV02g1giSfueHbTv3kHzxqfobG6MOkwREUEJjshRxfOLqDv/cUbF37ybacqog9TOu4GWzhglv3pbhNGJiEhflOCIHGIxEkXjyCmbRLJ0MsmySdDVxQWNp/OL4lsosSbi5rR4Dg92nsm1G+cA66KOWkREeqEER7KWJXJIlk4kWTaJnNLJJIon0Nm8j469VbRVb6Jp/Z9ZXradH55ZReXeHErKnFZPkkM7u7e8SuV6DRgWERmulOBI1ojlFf5N70y8oIhUw07a66pp3vQcHXtrDt+2XZDo5MYzqlg6rpkLH53Jl0/exYubSrlv+lUs3/Z9LRUgIjLMKcGRDGUkxpaRLJ0U9NCUTcZicdr3VtNRV03Ljg2kGnaBdx1x5JmlzfzsnG08vquQs1fPpTkV5+LHZwKQ31zFoxunprsxIiJyjJTgyIiSP29J75PdxRMkS8rJKZ1EsmwyyZJyulqb6dhbTfuu7TRvfJLOA41HPXfMnKtP3sVn5+7hyuem8Lsec9yAJtoTERkplODIiFIwbynNG58ilju6W+/MpGBhyn11dNRV0bL1JfY99wDe3jLg807Nb+P2pdtp6zSWrJ5LTcsAll4QEZFhSwmOjAiWM4rcCcFlotL3XUEsd3TQO7O3mqb1j9FRvxO6jm9czEXT6/neGdX8YMM4/uuVcTg2mKGLiEgElODIsBUvKCZ34mxGzzqNeP7Yw/sThSUAdDTs5OCrzx73+cckO7nxrDc4reQg56+ZxbqG0W85ZhERGR6U4ByDCXkd/PycSi75vxnsak1GHU7mMSNZOpHc8tnkls/Ckjm01Wxh/18eoX33DujqZPyFV7PrnhveclVLTjjAbUu381D1GJasPomWztggNEBERIYLJTjHYOX8WpaMa+aaU2q5cq3upBkMlkiSM34GueWzyC2fSefBJtpqt7DvuQdINe4a9PoS5lxzyk4un1PH55+Zyurqsf0fJCIiI44SnAGoX/ESeQk//PjTc/fy6bl7aUkZJRULogtshIrlFQYJzcTZJEsn0rG3hraazRzY8ES/i1Me2Pjkcdc7o6CNVUu30dgRZ/EDJ6kXTkQkgynBGYB5953MdxdWc8HURkbFnS6H9Q15/MvTU6IObcRIFI0nd2Jw6Sk+upC22q20VK5n3zP34amOAZ/n+G7Tdj4+s57vLKzh+pfHc9NrJ2ggsYhIhlOCMwA7W5Ls74iRjDktKSM37uTEurj/vC28si+PispifrujiIZ2vZyHxeLkjJt6eDyNp9ppq91C07o1dOytAff+zzEIinJS/HjRG8wd08r7/3c2Gxrz0lKviIhES/+RB2jcqBQ/3VTK7a+X8ck5dUzIS7F49XTeO3E/K2Y08J2F1Ty+q5CKymJWV4+lNQsHrVpOHrnlM8mdOJuccdNINe6mrXYLDY/fReeBhrTH8/bxTdy2ZDv37Sjiiien0daVfT8TEZFsZZ6mT9KDJTaq0HMnnx51GEcoTHayfEojK2Y0sLDkIL+vGktFZTGP7SqkyzPnckjPmYTjhSXhpafZJMaU0r57O201m2nbuRVvb40kxmSsi6+fWstHZzbwmaen8kjtmEjiEBGRwdG65bEX3P2MYzlGPTiDpKkjzp1bS7lzaykT8jr4x2kNfOu0GibmdXD39mIqKkv4S30ejPCxHwXzltK+5403b+WOx2mr2UzzK0/RvucN6OqMNL45Y1pZtXQbNS1JFj0wl7o2DSQWEclG6sEZYieOaeWi6Q2smFFPR5dRsa2EuyqLqTyQG3Vo/YqNyideWEKioIR4YTGJwhJyy2fRUb+TttrNtNVsIbVvd9RhhpxPzt7LNxbUct26cm59vZSRnkyKiEjgeHpwlOCkjbOo7CArZtTz4WmNVDblUFFZwm+2F7Enyl6GeJJEQfHhBKZ7QkNnitSBBiyeJFk8/ohDD2x8clgsPlmam+Kms3cwJb+dy56Yzmv7R0UdkoiIDCIlOCNEwpzzyoPBycsm7eeZPfncVVnM76vG0pyKD0GNRmz0GBKFxd0SmBIShcXEcvJINTfS2VRPqqmezqYGOg8E297RdsSZBmsm4cFyXvl+blm8g4rKYr65rpx2DSQWEck4w24MjpktA34ExIFb3f36Hs9b+PwHgIPAZe7+4lDG9Fb1HGR7PFJuPFQzlodqxpKf6OQfJu/johkN/PCsKh6sHkNFZTFraseQ6mVw8tHqt2Tum70whSXED11ayi+iq72FVFNDkMgcqKetdjOppnq6DjYBIyvJBciNdXHdaTV8eGojVzw1jUd3FkYdkoiIDCNDluCYWRz4CfAeoApYa2b3u/vGbsXeD8wJvxYBN4Xfh62CeUsH9bJMcypOxbYSKraVcEJuBx+Z1sg1p+zkliU7uHd7ERWVJTxbNxowJuR1ULFgDRfvLqM+p5x4QcmbvTKFJRCLhz0xQS9Ma9WrdDY1kDrQAJ0Dn0yvLxPyOriz4yo+NqokklmAD60Fdt26cv7zzCq27B/FogdOol7zD4mISA9D+Z/hLGCzu28FMLMKYDnQPcFZDvzcg+tkz5hZkZmVu3vtEMZ13BJjyoCgFwWLYRYDM4h12z7q/mDf4W2LhWWC7U6LcbcZd3uMaQf38qEpz3Pr7LUkqed3HYuYFtvDmbaWf3tnGSt3nkqqqZ6O+lpatm+g80ADXa3NQ9r+lfNrObtgL9ec0hbJWlwr59eydFwz95+7hSvXTuHnW0rQQGIREenNkI3BMbMLgWXu/s/h40uARe7++W5l/gBc7+5PhI/XAF919+f7Om8UY3Dy5y2hYN7SI/a37dpO+65K8C7cHbq63tz2LnDHw32449519P1d3ct04V0O3kn9h54kN9Z1RP3uUNc29L0XZbkprJc8Iur6tRaYiEh2GG5jcHr7aN0zmxpIGczsU8CnAEik//bq5o1PHb4sFcUg25N+O4/vLqzm/CmNjE44B1PGg9Vj+Pd1E9JyB9a4UR187dSdvG/S/mFT/307irjmxUlDXreIiIxMQ5ngVAHdV6OcDNQcRxnc/RbgFgh6cAY3zOHv0FpYuXGn1ZPkxjvY05rglf2j01J/XVuSPW0JcuNvrsUVdf37O2JaDVxERPo0lPfUrgXmmNkMM8sBVgD39yhzP/AJC5wN7Buu428OObDxyUjqPbQW1vte/TA/3VTK+LxUJPW/88ETs7J+EREZWYZ0Hhwz+wBwI8Ft4re7+7fN7DMA7n5zeJv4j4FlBLeJX3608TeQGfPgiIiIyMBpoj8RERHJOMeT4GjaVxEREck4SnBEREQk4yjBERERkYyjBEdEREQyjhIcERERyTgj7i4qM2sCXos6jgiVAXVRBxEhtV/tV/uzUza3HdT+ue5eeCwHjMRlmF871lvFMomZPa/2q/1RxxEVtT9725/NbQe138yOOkdeb3SJSkRERDKOEhwRERHJOCMxwbkl6gAipvZnN7U/u2Vz+7O57aD2H3P7R9wgYxEREZH+jMQeHBEREZGjUoIjIiIiGWdEJThmtszMXjOzzWa2Mup40snMppjZn83sFTPbYGZfijqmdDOzuJn9xcz+EHUs6WZmRWZ2j5m9Gv4OLI46pnQys38Nf+//ama/MrNRUcc0lMzsdjPbbWZ/7bavxMweMbPXw+/FUcY4lPpo/w3h7/96M/utmRVFGOKQ6q393Z67yszczMqiiC0d+mq/mX0hzAE2mNn3+jvPiElwzCwO/AR4PzAPuNjM5kUbVVqlgC+7+98BZwOfy7L2A3wJeCXqICLyI+BBdz8JeBtZ9DqY2STgi8AZ7j4fiAMroo1qyK0ClvXYtxJY4+5zgDXh40y1iiPb/wgw391PBTYB16Q7qDRaxZHtx8ymAO8BdqQ7oDRbRY/2m9m7gOXAqe5+MvD9/k4yYhIc4Cxgs7tvdfd2oIKgsVnB3Wvd/cVwu4ngH9ykaKNKHzObDPw9cGvUsaSbmY0B3gHcBuDu7e7eGGlQ6ZcA8swsAYwGaiKOZ0i5++NAfY/dy4E7wu07gAvSGVM69dZ+d3/Y3VPhw2eAyWkPLE36+PkD/BD4CpDRdwf10f7PAte7e1tYZnd/5xlJCc4k4I1uj6vIon/w3ZnZdOA04NmIQ0mnGwn+sLsijiMKM4E9wM/CS3S3mll+1EGli7tXE3xa2wHUAvvc/eFoo4rEeHevheADDzAu4nii9Engj1EHkU5mdj5Q7e7roo4lIicCbzezZ83sMTM7s78DRlKCY73sy+gstjdmVgD8BrjS3fdHHU86mNkHgd3u/kLUsUQkASwEbnL304BmMvvyxN8Ix5osB2YAE4F8M/t4tFFJVMzsWoJL9r+MOpZ0MbPRwLXA16OOJUIJoJhgiMbVwK/NrLe84LCRlOBUAVO6PZ5MhndT92RmSYLk5pfufm/U8aTRUuB8M9tGcGnyXDO7M9qQ0qoKqHL3Qz129xAkPNni3UClu+9x9w7gXmBJxDFFYZeZlQOE3/vtos80ZnYp8EHgY55dk7jNIkjw14Xvg5OBF81sQqRRpVcVcK8HniPozT/qQOuRlOCsBeaY2QwzyyEYZHh/xDGlTZip3ga84u4/iDqedHL3a9x9srtPJ/i5/8nds+YTvLvvBN4ws7nhrvOAjRGGlG47gLPNbHT4d3AeWTTIupv7gUvD7UuB+yKMJe3MbBnwVeB8dz8YdTzp5O4vu/s4d58evg9WAQvD94Zs8TvgXAAzOxHIoZ/V1UdMghMOLvs88BDBm9uv3X1DtFGl1VLgEoLei5fCrw9EHZSkzReAX5rZemAB8J1ow0mfsOfqHuBF4GWC962MnrbezH4FPA3MNbMqM7sCuB54j5m9TnAnzfVRxjiU+mj/j4FC4JHw/e/mSIMcQn20P2v00f7bgZnhreMVwKX99eJpqQYRERHJOCOmB0dERERkoJTgiIiISMZRgiMiIiIZRwmOiIiIZBwlOCIiIpJxlOCICGZ2bbhC7/rwFtxFx3j8ZWY28RiPmd7HasnTzawljGOjmd1sZsf9XmVmj5rZGeH26qOtQm1mF3RfxNbMrjOzdx9v3SISnUTUAYhItMxsMcHssAvdvc3Myggm0Rro8XHgMuCvDN7s4lvcfUG4uOafCBaWPDx7t5klui28OGDu3t/cURcAfyCcSNHds3lqfJERTT04IlIO1HVbpbfO3WsAzOy8cIHPl83sdjPLDfdvM7Ovm9kTwMXAGQQTEb5kZnlmdnq4IN4LZvZQtyUGTjezdWb2NPC5/gILk5ingNlhL9HdZvZ74GEzyw9jWhvGuDysI8/MKsLeqLuAvEPnC+MuC7c/EZZZZ2a/MLMlwPnADWE7ZpnZKjO7cACvxTfN7MXwuZMG4WciIm+REhwReRiYYmabzOx/zOydAGY2ClgFXOTupxD0+H6223Gt7n6Ou98JPE+wPtACgoUQ/xu40N1PJ5iB9NvhMT8DvujuiwcSmAWLDJ5HMIMxwGKCGUzPJVh88E/ufibwLoLEJD+M8aC7nxrWe3ov5z05PP5cd38b8CV3f4pgOYSr3X2Bu2/pVr6/16LO3RcCNwFXDaRtIjK0lOCIZDl3P0CQBHwK2APcZWaXAXMJFrncFBa9A3hHt0Pv6uOUc4H5hFPqA18DJpvZWKDI3R8Ly/3iKGHNCo99EnjA3f8Y7n/E3evD7fcCK8NyjwKjgKlhjHeGbVsPrO/l/OcC97h7XViuvpcyPdt0tNfi0OWzF4Dp/ZxLRNJAY3BEBHfvJEgSHjWzlwkWc3ypn8Oa+9hvwIaevTTh4N6Brg2zJewNOlqdBnzE3V/rUQ8DqMeOIZZD5Y+mLfzeid5XRYYF9eCIZDkzm2tmc7rtWgBsB14FppvZ7HD/JcBj9K6JYCFEgNeAE8LBy5hZ0sxOdvdGYJ+ZnROW+9hbDP0h4AsWZjRmdlq4//FD5zaz+cCpvRy7BvgnMysNy5X00o7ujuW1EJFhQAmOiBQAd4S3ZK8H5gHfcPdW4HLg7rBXpwvoawXnVcDN4eWiOHAh8B9mto6gJ2hJWO5y4CfhIOOWtxj3t4AksD683fxb4f6bgIKwLV8Bnut5oLtvIBif81gY4w/CpyqAq8PBxLO6lT+W10JEhgGtJi4iIiIZRz04IiIiknGU4IiIiEjGUYIjIiIiGUcJjoiIiGQcJTgiIiKScZTgiIiISMZRgiMiIiIZ5/8BOHM7K15G9soAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "lift_chart = model_top.get_lift_chart(\"validation\")\n", "\n", "# Save the result into a pandas dataframe\n", "lift_df = pd.DataFrame(lift_chart.bins)\n", "\n", "bin_counts = [10, 15]\n", "f, axarr = plt.subplots(len(bin_counts))\n", "f.set_size_inches((8, 4 * len(bin_counts)))\n", "\n", "rebinned_dfs = []\n", "for i in range(len(bin_counts)):\n", " rebinned_dfs.append(matplotlib_lift(lift_df, bin_counts[i], axarr[i]))\n", "\n", "plt.tight_layout()\n", "# plt.show()" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "### ROC curve\n", "\n", "The receiver operating characteristic curve, or [ROC curve](https://docs.datarobot.com/en/docs/modeling/analyze-models/evaluate/roc-curve-tab/roc-curve.html), is a graphical plot that illustrates the performance of a binary classifier system as its discrimination threshold is varied. The curve is created by plotting the true positive rate (TPR) against the false positive rate (FPR) at various threshold settings." ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "autoscroll": "auto" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
accuracyf1_scorefalse_negative_scoretrue_negative_scoretrue_positive_scorefalse_positive_scoretrue_negative_ratefalse_positive_ratetrue_positive_ratematthews_correlation_coefficientpositive_predictive_valuenegative_predictive_valuethresholdfraction_predicted_as_positivefraction_predicted_as_negativelift_positivelift_negative
00.6501770.00000099184001.0000000.0000000.0000000.0000000.0000000.6501771.0000000.0000001.0000000.0000001.000000
10.6537100.02000098184101.0000000.0000000.0101010.0811831.0000000.6524820.9855560.0035340.9964662.8585861.003546
20.6607770.05882496184301.0000000.0000000.0303030.1411151.0000000.6571430.9830750.0106010.9893992.8585861.010714
30.6713780.11428693184601.0000000.0000000.0606060.2006441.0000000.6642600.9596060.0212010.9787992.8585861.021661
40.6749120.14814891183810.9945650.0054350.0808080.2048550.8888890.6678830.9533660.0318020.9681982.5409651.027233
......................................................
1070.3886930.533693011991730.0597830.9402171.0000000.1475100.3639711.0000000.0027110.9611310.0388691.0404411.538043
1080.3816250.53083109991750.0489130.9510871.0000000.1329400.3613141.0000000.0026900.9681980.0318021.0328471.538043
1090.3710250.52659606991780.0326090.9673911.0000000.1079550.3574011.0000000.0025460.9787990.0212011.0216611.538043
1100.3604240.52242703991810.0163040.9836961.0000000.0759260.3535711.0000000.0023770.9893990.0106011.0107141.538043
1110.3498230.51832500991840.0000001.0000001.0000000.0000000.3498230.0000000.0020221.0000000.0000001.0000000.000000
\n", "

112 rows × 17 columns

\n", "
" ], "text/plain": [ " accuracy f1_score false_negative_score true_negative_score \\\n", "0 0.650177 0.000000 99 184 \n", "1 0.653710 0.020000 98 184 \n", "2 0.660777 0.058824 96 184 \n", "3 0.671378 0.114286 93 184 \n", "4 0.674912 0.148148 91 183 \n", ".. ... ... ... ... \n", "107 0.388693 0.533693 0 11 \n", "108 0.381625 0.530831 0 9 \n", "109 0.371025 0.526596 0 6 \n", "110 0.360424 0.522427 0 3 \n", "111 0.349823 0.518325 0 0 \n", "\n", " true_positive_score false_positive_score true_negative_rate \\\n", "0 0 0 1.000000 \n", "1 1 0 1.000000 \n", "2 3 0 1.000000 \n", "3 6 0 1.000000 \n", "4 8 1 0.994565 \n", ".. ... ... ... \n", "107 99 173 0.059783 \n", "108 99 175 0.048913 \n", "109 99 178 0.032609 \n", "110 99 181 0.016304 \n", "111 99 184 0.000000 \n", "\n", " false_positive_rate true_positive_rate \\\n", "0 0.000000 0.000000 \n", "1 0.000000 0.010101 \n", "2 0.000000 0.030303 \n", "3 0.000000 0.060606 \n", "4 0.005435 0.080808 \n", ".. ... ... \n", "107 0.940217 1.000000 \n", "108 0.951087 1.000000 \n", "109 0.967391 1.000000 \n", "110 0.983696 1.000000 \n", "111 1.000000 1.000000 \n", "\n", " matthews_correlation_coefficient positive_predictive_value \\\n", "0 0.000000 0.000000 \n", "1 0.081183 1.000000 \n", "2 0.141115 1.000000 \n", "3 0.200644 1.000000 \n", "4 0.204855 0.888889 \n", ".. ... ... \n", "107 0.147510 0.363971 \n", "108 0.132940 0.361314 \n", "109 0.107955 0.357401 \n", "110 0.075926 0.353571 \n", "111 0.000000 0.349823 \n", "\n", " negative_predictive_value threshold fraction_predicted_as_positive \\\n", "0 0.650177 1.000000 0.000000 \n", "1 0.652482 0.985556 0.003534 \n", "2 0.657143 0.983075 0.010601 \n", "3 0.664260 0.959606 0.021201 \n", "4 0.667883 0.953366 0.031802 \n", ".. ... ... ... \n", "107 1.000000 0.002711 0.961131 \n", "108 1.000000 0.002690 0.968198 \n", "109 1.000000 0.002546 0.978799 \n", "110 1.000000 0.002377 0.989399 \n", "111 0.000000 0.002022 1.000000 \n", "\n", " fraction_predicted_as_negative lift_positive lift_negative \n", "0 1.000000 0.000000 1.000000 \n", "1 0.996466 2.858586 1.003546 \n", "2 0.989399 2.858586 1.010714 \n", "3 0.978799 2.858586 1.021661 \n", "4 0.968198 2.540965 1.027233 \n", ".. ... ... ... \n", "107 0.038869 1.040441 1.538043 \n", "108 0.031802 1.032847 1.538043 \n", "109 0.021201 1.021661 1.538043 \n", "110 0.010601 1.010714 1.538043 \n", "111 0.000000 1.000000 0.000000 \n", "\n", "[112 rows x 17 columns]" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "roc = model_top.get_roc_curve(\"validation\")\n", "\n", "# Save the result into a pandas dataframe\n", "roc_df = pd.DataFrame(roc.roc_points)\n", "\n", "roc_df" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "dr_roc_green = \"#03c75f\"\n", "white = \"#ffffff\"\n", "dr_purple = \"#65147D\"\n", "dr_dense_green = \"#018f4f\"\n", "\n", "threshold = roc.get_best_f1_threshold()\n", "fig = plt.figure(figsize=(8, 8))\n", "axes = fig.add_subplot(1, 1, 1, facecolor=dr_dark_blue)\n", "\n", "plt.scatter(roc_df.false_positive_rate, roc_df.true_positive_rate, color=dr_roc_green)\n", "plt.plot(roc_df.false_positive_rate, roc_df.true_positive_rate, color=dr_roc_green)\n", "plt.plot([0, 1], [0, 1], color=white, alpha=0.25)\n", "plt.title(\"ROC curve\")\n", "plt.xlabel(\"False Positive Rate\")\n", "plt.xlim([0, 1])\n", "plt.ylabel(\"True Positive Rate\")\n", "plt.ylim([0, 1])" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "### Feature Impact\n", "\n", "[Feature Impact](https://docs.datarobot.com/en/docs/modeling/analyze-models/understand/feature-impact.html) measures how important a feature is in the context of a model. It measures how much the accuracy of a model would decrease if that feature was removed.\n", "\n", "Feature Impact is available for all model types and works by altering input data and observing the effect on a model’s score. It is an on-demand feature, meaning that you must initiate a calculation to see the results. Once DataRobot computes the feature impact for a model, that information is saved with the project." ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "autoscroll": "auto" }, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "feature_impacts = model_top.get_or_request_feature_impact()\n", "\n", "# Limit size to make chart look good. Display top 25 values\n", "if len(feature_impacts) > 25:\n", " feature_impacts = feature_impacts[0:24]\n", "\n", "# Formats the ticks from a float into a percent\n", "percent_tick_fmt = mtick.PercentFormatter(xmax=1.0)\n", "\n", "impact_df = pd.DataFrame(feature_impacts)\n", "impact_df.sort_values(by=\"impactNormalized\", ascending=True, inplace=True)\n", "\n", "# Positive values are blue, negative are red\n", "bar_colors = impact_df.impactNormalized.apply(lambda x: dr_red if x < 0 else dr_blue)\n", "\n", "ax = impact_df.plot.barh(\n", " x=\"featureName\", y=\"impactNormalized\", legend=False, color=bar_colors, figsize=(10, 8)\n", ")\n", "ax.xaxis.set_major_formatter(percent_tick_fmt)\n", "ax.xaxis.set_tick_params(labeltop=True)\n", "ax.xaxis.grid(True, alpha=0.2)\n", "ax.set_facecolor(dr_dark_blue)\n", "\n", "plt.ylabel(\"\")\n", "plt.xlabel(\"Effect\")\n", "plt.xlim((None, 1)) # Allow for negative impact\n", "plt.title(\"Feature Impact\", y=1.04);" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": { "tags": [] }, "source": [ "## Make predictions\n", "\n", "### Test predictions\n", "\n", "After determining the top-performing model from the Leaderboard, upload the prediction test dataset to verify that the model generates predictions successfully before deploying the model to a production environment. The predictions are returned as a Pandas dataframe. " ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
X_MinimumX_MaximumY_MinimumY_MaximumPixels_AreasX_PerimeterY_PerimeterSum_of_LuminosityMinimum_of_LuminosityMaximum_of_Luminosity...Log_Y_IndexOrientation_IndexLuminosity_IndexSigmoidOfAreasrow_idpredictionpositive_probabilityprediction_thresholdclass_0.0class_1.0
08298351553913155393171819797299125...1.25530.6667-0.12280.215000.00.1860250.50.8139750.186025
14658179258179312480155461966102158...1.73240.77780.00860.909310.00.1303020.50.8696980.130302
21617162918368818371120122232099379126...1.36170.4783-0.18400.456421.00.7494620.50.2505380.749462
3125912711918092191812832430363026965124...1.55630.6667-0.27010.703730.00.4139060.50.5860940.413906
411202845229284525618220271633772109...1.43140.6667-0.29870.402540.00.1916960.50.8083040.191696
..................................................................
1681673168718916201891638862318644228101...1.25530.2222-0.41480.41701681.00.6172010.50.3827990.617201
16918402133912213391554223647987158...0.4771-0.8636-0.06260.17151691.00.9665800.50.0334200.966580
1709831005895625895642102422212942114141...1.2305-0.2273-0.00870.61731701.00.8600900.50.1399100.860090
1711962091570351570446020147508117135...0.9542-0.3077-0.02240.22531711.00.5288070.50.4711930.528807
17227129114888661488885204382223155105126...1.2787-0.0500-0.11320.62681721.00.6828840.50.3171160.682884
\n", "

173 rows × 33 columns

\n", "
" ], "text/plain": [ " X_Minimum X_Maximum Y_Minimum Y_Maximum Pixels_Areas X_Perimeter \\\n", "0 829 835 1553913 1553931 71 8 \n", "1 46 58 179258 179312 480 15 \n", "2 1617 1629 183688 183711 201 22 \n", "3 1259 1271 1918092 1918128 324 30 \n", "4 11 20 2845229 2845256 182 20 \n", ".. ... ... ... ... ... ... \n", "168 1673 1687 1891620 1891638 86 23 \n", "169 18 40 2133912 2133915 54 22 \n", "170 983 1005 895625 895642 102 42 \n", "171 196 209 157035 157044 60 20 \n", "172 271 291 1488866 1488885 204 38 \n", "\n", " Y_Perimeter Sum_of_Luminosity Minimum_of_Luminosity \\\n", "0 19 7972 99 \n", "1 54 61966 102 \n", "2 23 20993 79 \n", "3 36 30269 65 \n", "4 27 16337 72 \n", ".. ... ... ... \n", "168 18 6442 28 \n", "169 3 6479 87 \n", "170 22 12942 114 \n", "171 14 7508 117 \n", "172 22 23155 105 \n", "\n", " Maximum_of_Luminosity ... Log_Y_Index Orientation_Index \\\n", "0 125 ... 1.2553 0.6667 \n", "1 158 ... 1.7324 0.7778 \n", "2 126 ... 1.3617 0.4783 \n", "3 124 ... 1.5563 0.6667 \n", "4 109 ... 1.4314 0.6667 \n", ".. ... ... ... ... \n", "168 101 ... 1.2553 0.2222 \n", "169 158 ... 0.4771 -0.8636 \n", "170 141 ... 1.2305 -0.2273 \n", "171 135 ... 0.9542 -0.3077 \n", "172 126 ... 1.2787 -0.0500 \n", "\n", " Luminosity_Index SigmoidOfAreas row_id prediction \\\n", "0 -0.1228 0.2150 0 0.0 \n", "1 0.0086 0.9093 1 0.0 \n", "2 -0.1840 0.4564 2 1.0 \n", "3 -0.2701 0.7037 3 0.0 \n", "4 -0.2987 0.4025 4 0.0 \n", ".. ... ... ... ... \n", "168 -0.4148 0.4170 168 1.0 \n", "169 -0.0626 0.1715 169 1.0 \n", "170 -0.0087 0.6173 170 1.0 \n", "171 -0.0224 0.2253 171 1.0 \n", "172 -0.1132 0.6268 172 1.0 \n", "\n", " positive_probability prediction_threshold class_0.0 class_1.0 \n", "0 0.186025 0.5 0.813975 0.186025 \n", "1 0.130302 0.5 0.869698 0.130302 \n", "2 0.749462 0.5 0.250538 0.749462 \n", "3 0.413906 0.5 0.586094 0.413906 \n", "4 0.191696 0.5 0.808304 0.191696 \n", ".. ... ... ... ... \n", "168 0.617201 0.5 0.382799 0.617201 \n", "169 0.966580 0.5 0.033420 0.966580 \n", "170 0.860090 0.5 0.139910 0.860090 \n", "171 0.528807 0.5 0.471193 0.528807 \n", "172 0.682884 0.5 0.317116 0.682884 \n", "\n", "[173 rows x 33 columns]" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data_path_scoring = (\n", " \"https://s3.amazonaws.com/datarobot-use-case-datasets/steel_plates_fault_testing.csv\"\n", ")\n", "scoring_df = pd.read_csv(data_path_scoring, encoding=\"ISO-8859-1\")\n", "scoring_df = scoring_df.drop(columns=[\"Fault\"])\n", "\n", "prediction_dataset = project.upload_dataset(scoring_df)\n", "predict_job = model_top.request_predictions(prediction_dataset.id)\n", "prediction_dataset.id\n", "\n", "predictions = predict_job.get_result_when_complete()\n", "pd.concat([scoring_df, predictions], axis=1)\n", "predictions.positive_probability.plot(kind=\"hist\", title=\"Predicted Probabilities\")" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "### Deploy a model to production\n", "\n", "\n", "If you are happy with the model's performance, you can deploy it to a production environment with [MLOps](https://docs.datarobot.com/en/mlops/index.html). Deploying the model will free up workers, as data scored through the deployment doesn't use any modeling workers. Furthermore, you are no longer restricted on the amount of data to score. Deployments also offer many model management benefits: monitoring service, data drift, model comparison, retraining, and more." ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "autoscroll": "auto" }, "outputs": [ { "data": { "text/plain": [ "Deployment(Steel Plate Fault Predictions)" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Create a prediction server\n", "prediction_server = dr.PredictionServer.list()[0]\n", "\n", "# Get top performing model. Uncomment if this did not execute in the previous section\n", "# model_top = sorted_by_metric(models, 'crossValidation', metric)[0]\n", "\n", "deployment = dr.Deployment.create_from_learning_model(\n", " model_top.id,\n", " label=\"Steel Plate Fault Predictions\",\n", " description=\"Predict Steel Plate Fault\",\n", " default_prediction_server_id=prediction_server.id,\n", ")\n", "deployment.id" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "### Configure batch predictions\n", "\n", "After the model has been deployed, DataRobot creates an endpoint for real-time scoring. The deployment allows you to use DataRobot's batch prediction API to score large datasets with a deployed DataRobot model. \n", "\n", "The batch prediction API provides flexible intake and output options when scoring large datasets using prediction servers. The API is exposed through the DataRobot Public API and can be consumed using a REST-enabled client or Public API bindings for DataRobot's Python client." ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "#### Set the deployment ID" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "Before proceeding, provide the deployed model's deployment ID (retrieved from the deployment's [Overview tab](https://docs.datarobot.com/en/docs/mlops/monitor/dep-overview.html))." ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [], "source": [ "deployment_id = \"YOUR_DEPLOYMENT_ID\"" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "#### Determine input and output options\n", "\n", "DataRobot's batch prediction API allows you to score data from and to multiple sources. You can take advantage of the credentials and data sources you have already established through the UI for easy scoring. Credentials are usernames and passwords, and data sources are any databases with which you have previously established a connection (e.g., Snowflake). View the example code below outlining how to query credentials and data sources.\n", "\n", "You can reference the full list of DataRobot's supported [input](https://docs.datarobot.com/en/docs/predictions/batch/batch-prediction-api/intake-options.html) and [output options](https://docs.datarobot.com/en/docs/predictions/batch/batch-prediction-api/output-options.html).\n", "\n", "Reference the DataRobot documentation for more information about [data connections](https://docs.datarobot.com/en/docs/data/connect-data/data-conn.html)." ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "The snippet below shows how you can query all credentials tied to a DataRobot account." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "dr.Credential.list()" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "The output above returns multiple sets of credentials. The alphanumeric string included in each item of the list is the credentials ID. You can use that ID to access credentials through the API." ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "The snippet below shows how you can query all data sources tied to a DataRobot account. The second line lists each datastore with an alphanumeric string; that is the datastore ID." ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "5e14e08b47047100148aad36\n" ] } ], "source": [ "dr.DataStore.list()\n", "print(dr.DataStore.list()[0].id)" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "### Scoring examples" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "The snippets below demonstrate how to score data with the Batch Prediction API. Edit the `intake_settings` and `output_settings` to suit your needs. You can mix and match until you get the outcome you prefer." ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "#### Score from CSV to CSV" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Scoring without Prediction Explanations\n", "if False:\n", " dr.BatchPredictionJob.score(\n", " deployment_id,\n", " intake_settings={\n", " \"type\": \"localFile\",\n", " \"file\": \"inputfile.csv\", # Provide the filepath, Pandas dataframe, or file-like object here\n", " },\n", " output_settings={\"type\": \"localFile\", \"path\": \"outputfile.csv\"},\n", " )\n", "\n", "# Scoring with Prediction Explanations\n", "if False:\n", " dr.BatchPredictionJob.score(\n", " deployment_id,\n", " intake_settings={\n", " \"type\": \"localFile\",\n", " \"file\": \"inputfile.csv\", # Provide the filepath, Pandas dataframe, or file-like object here\n", " },\n", " output_settings={\"type\": \"localFile\", \"path\": \"outputfile.csv\"},\n", " max_explanations=3, # Compute Prediction Explanations for the amount of features indicated here\n", " )" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "#### Score from S3 to S3" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "if False:\n", " dr.BatchPredictionJob.score(\n", " deployment_id,\n", " intake_settings={\n", " \"type\": \"s3\",\n", " \"url\": \"s3://theos-test-bucket/lending_club_scoring.csv\", # Provide the URL of your datastore here\n", " \"credential_id\": \"YOUR_CREDENTIAL_ID_FROM_ABOVE\", # Provide your credentials here\n", " },\n", " output_settings={\n", " \"type\": \"s3\",\n", " \"url\": \"s3://theos-test-bucket/lending_club_scored2.csv\",\n", " \"credential_id\": \"YOUR_CREDENTIAL_ID_FROM_ABOVE\",\n", " },\n", " )" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "#### Score from JDBC to JDBC" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "if False:\n", " dr.BatchPredictionJob.score(\n", " deployment_id,\n", " intake_settings={\n", " \"type\": \"jdbc\",\n", " \"table\": \"table_name\",\n", " \"schema\": \"public\",\n", " \"dataStoreId\": data_store.id, # Provide the ID of your datastore here\n", " \"credentialId\": cred.credential_id, # Provide your credentials here\n", " },\n", " output_settings={\n", " \"type\": \"jdbc\",\n", " \"table\": \"table_name\",\n", " \"schema\": \"public\",\n", " \"statementType\": \"insert\",\n", " \"dataStoreId\": data_store.id,\n", " \"credentialId\": cred.credential_id,\n", " },\n", " )" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.8" } }, "nbformat": 4, "nbformat_minor": 4 }