Python Neural Networks diabetes

profileCjvanaarde
Backprop_Task.ipynb

{ "cells": [ { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "ShegQlg-otj6" }, "source": [ "## Backpropagation Exercise\n", "In this exercise we will use backpropagation to train a multi-layer perceptron (MLP). Multilayer perceptrons can be called the 'basic' variety of neural networks. They have an input layer, a number of hidden layers, and an output layer. First, let's create our input." ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "8x7zgidCnxNk" }, "source": [ "This code below generates two input values (x) and an output value (y) according to different patterns that are not linear.\n", "It also adds a bias term (a vector of 1s) to the input. Adding a bias term to the input like this and initialising it to 1 is a trick that often improves performance. This bias term is not directly updated, but the weight matrix will include a row that, when multiplied with our x_mat_full, does with the bias term what the algorithm deems right for the task." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "colab": {}, "colab_type": "code", "id": "cyrVwgpootj_" }, "outputs": [], "source": [ "#Preliminaries\n", "from __future__ import division, print_function\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "from sklearn.metrics import accuracy_score\n", "%matplotlib inline" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "colab": {}, "colab_type": "code", "id": "WE_ChNcsc7dt" }, "outputs": [], "source": [ "## create input\n", "num_obs = 500\n", "x = np.random.uniform(-1,1,size = (num_obs,2))\n", "bias = np.ones((num_obs,1))\n", "x_mat_full = np.concatenate( (x,bias), axis=1)" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "s98ssG2YnvCA" }, "source": [ "We will see how this architecture can model non-linear patterns in data. We will experiment with different non-linear patterns and see how quickly or slowly the weights converge. We start of by picking just one kind of non-linear categorisation." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 371 }, "colab_type": "code", "id": "Bm8pPPADotkV", "outputId": "5ac4ca55-6e3c-4911-842b-5daafb2af4e9" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "shape of x_mat_full is (500, 3)\n", "shape of y is (500,)\n" ] }, { "data": { "text/plain": [ "<matplotlib.legend.Legend at 0x2a2c71f3e80>" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "<Figure size 360x360 with 1 Axes>" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# PICK ONE PATTERN BELOW and comment out the rest.\n", "# # Circle pattern\n", "y = (np.sqrt(x_mat_full[:,0]**2 + x_mat_full[:,1]**2)<.75).astype(int)\n", "# # Diamond Pattern\n", "# y = ((np.abs(x_mat_full[:,0]) + np.abs(x_mat_full[:,1]))<1).astype(int)\n", "# # Centered square\n", "# y = ((np.maximum(np.abs(x_mat_full[:,0]), np.abs(x_mat_full[:,1])))<.5).astype(int)\n", "# # Thick Right Angle pattern\n", "# y = (((np.maximum((x_mat_full[:,0]), (x_mat_full[:,1])))<.5) & ((np.maximum((x_mat_full[:,0]), (x_mat_full[:,1])))>-.5)).astype(int)\n", "# # Thin right angle pattern\n", "# y = (((np.maximum((x_mat_full[:,0]), (x_mat_full[:,1])))<.5) & ((np.maximum((x_mat_full[:,0]), (x_mat_full[:,1])))>0)).astype(int)\n", "print('shape of x_mat_full is {}'.format(x_mat_full.shape))\n", "print('shape of y is {}'.format(y.shape))\n", "fig, ax = plt.subplots(figsize=(5, 5))\n", "ax.plot(x_mat_full[y==1, 0],x_mat_full[y==1, 1], 'ro', label='class 1', color='darkslateblue')\n", "ax.plot(x_mat_full[y==0, 0],x_mat_full[y==0, 1], 'bx', label='class 0', color='chocolate')\n", "ax.legend(loc='best')" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "kkxEzuUYoa5G" }, "source": [ "The code below gives you the building blocks of the MLP up to the backward pass, which you will write yourself." ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "colab": {}, "colab_type": "code", "id": "ncDNpfVPotkq" }, "outputs": [], "source": [ "def activate(x, deriv=False):\n", " \"\"\" \n", " Based on the presence of the second argument, either apply the sigmoid activation \n", " function or its derivative\n", " \"\"\"\n", " if (deriv == True):\n", " return (x * (1 - x))\n", " return 1 / (1 + np.exp(-x))\n", "\n", "def loss_fn(y_true, y_pred, eps=1e-16):\n", " \"\"\"\n", " Loss function we would like to optimize (minimize)\n", " We are using Logarithmic Loss\n", " http://scikit-learn.org/stable/modules/model_evaluation.html#log-loss\n", " \"\"\"\n", " y_pred = np.maximum(y_pred,eps)\n", " y_pred = np.minimum(y_pred,(1-eps))\n", " return -(np.sum(y_true * np.log(y_pred)) + np.sum((1-y_true)*np.log(1-y_pred)))/len(y_true)\n", "\n", "def forward_pass(x_mat_full, W_1, W_2):\n", " \"\"\"\n", " Does a forward computation of the neural network\n", " Takes the input `x` and produces the output `y_pred`\n", " Also produces the gradient of the log loss function\n", " \"\"\"\n", " # Forward computation and error\n", " layer1 = activate(np.dot(x_mat_full, W_1))\n", " y_pred = activate(np.dot(layer1, W_2)) \n", " l2_error = y - y_pred\n", "\n", " # Computing gradients using backpropagation \n", " l2_delta = l2_error * activate(y_pred, deriv=True)\n", " l1_error = l2_delta.dot(W_2.T)\n", " l1_delta = l1_error * activate(layer1, deriv=True)\n", " \n", " gradient2 = layer1.T.dot(l2_delta)\n", " gradient1 = x_mat_full.T.dot(l1_delta) \n", " \n", " return y_pred, (gradient1, gradient2)\n", "\n", "def plot_loss_accuracy(loss_vals, accuracies):\n", " fig = plt.figure(figsize=(16, 8))\n", " fig.suptitle('Log Loss and Accuracy over iterations')\n", " \n", " ax = fig.add_subplot(1, 2, 1)\n", " ax.plot(loss_vals)\n", " ax.grid(True)\n", " ax.set(xlabel='iterations', title='Log Loss')\n", " \n", " ax = fig.add_subplot(1, 2, 2)\n", " ax.plot(accuracies)\n", " ax.grid(True)\n", " ax.set(xlabel='iterations', title='Accuracy');" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "G6GZ0OoMotkS" }, "source": [ "Fill out the code below so that it creates a multi-layer perceptron with a single hidden layer (with 4 nodes) and trains it via back-propagation. Specifically your code should:\n", "\n", "1. Initialize the weights to random values between -1 and 1\n", "1. Perform the feed-forward computation\n", "1. Compute the loss function\n", "1. Calculate the gradients for all the weights via back-propagation\n", "1. Update the weight matrices (using a learning_rate parameter)\n", "1. Execute steps 2-5 for a fixed number of iterations\n", "1. Plot the accuracies and log loss and observe how they change over time" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "collapsed": true, "id": "Sgy71Tkiotkw" }, "source": [ "First, initialise the parameters. This means determining the following:\n", "\n", "#### Size of the network\n", "\n", "Hidden layers (or a single hidden layer in this example) can be any size. Layers with more neurons are more powerful, but also more likely to overfit, and take longer to train.\n", "The output layer size corresponds to the number of classes.\n", "\n", "#### Number of iterations\n", "\n", "This parameter determines how many times the network will be updated. \n", "\n", "#### Learning rate\n", "\n", "Each time we update the weights, we do so by taking a step into the direction that we calculated will improve the accuracy of the network. The size of that step is determined by the learning rate. Taking small steps will slow the process down, but taking steps that are too large can cause results to vary wildly and not reach a stable optimum. " ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "L79qV7hgoowP" }, "source": [ "Next, fill in the code below to train a multi-layer perceptron and see if it correctly classies the input." ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "colab": {}, "colab_type": "code", "id": "d3NuckBhZYjG" }, "outputs": [ { "ename": "SyntaxError", "evalue": "invalid syntax (<ipython-input-5-24d854da2ed9>, line 2)", "output_type": "error", "traceback": [ "\u001b[1;36m File \u001b[1;32m\"<ipython-input-5-24d854da2ed9>\"\u001b[1;36m, line \u001b[1;32m2\u001b[0m\n\u001b[1;33m y =\u001b[0m\n\u001b[1;37m ^\u001b[0m\n\u001b[1;31mSyntaxError\u001b[0m\u001b[1;31m:\u001b[0m invalid syntax\n" ] } ], "source": [ "# Reshape y\n", "y = \n", "\n", "# Initializing weights\n", "\n", "W_1 =\n", "W_2 = \n", "\n", "# Definining number of iterations and learning rate('lr')\n", "num_iter =\n", "\n", "learning rate = " ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "colab": {}, "colab_type": "code", "id": "Y6AHLQxYRBXl" }, "outputs": [ { "ename": "SyntaxError", "evalue": "unexpected EOF while parsing (<ipython-input-6-dc47892c6fbb>, line 9)", "output_type": "error", "traceback": [ "\u001b[1;36m File \u001b[1;32m\"<ipython-input-6-dc47892c6fbb>\"\u001b[1;36m, line \u001b[1;32m9\u001b[0m\n\u001b[1;33m # Update the weights\u001b[0m\n\u001b[1;37m ^\u001b[0m\n\u001b[1;31mSyntaxError\u001b[0m\u001b[1;31m:\u001b[0m unexpected EOF while parsing\n" ] } ], "source": [ "# Creating empty lists for loss values(error) and accuracy\n", "loss_vals, accuracies = [], []\n", "\n", "for j in range(num_iter):\n", " # Do a forward pass through the dataset and compute the loss\n", " \n", " # Decide on intervals and add on the current loss and accuracy to the respective list\n", "\n", " # Update the weights\n" ] }, { "cell_type": "code", "execution_count": 100, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 554 }, "colab_type": "code", "id": "ps5lVICiUrVa", "outputId": "7c2f4ba2-ee1b-445e-e9b8-c8597e6163f5" }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA6IAAAIZCAYAAAC8goKFAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjAsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+17YcXAAAgAElEQVR4nOzdeXhkZ3Xn8d9RSaqqbklVdrdbqpJtzOIQHBYTmsUEkh4gYUkwTJgQHLM4G5MZSCAxwzYMwzAJJCRANsiEEAbCZpZkMoY4wy6GfTDGJhhiMDw23a0qtbvbqpLUulrP/HFvqcuyllKrVLfq3u/nefS4a1HdU6/VffWr99z3NXcXAAAAAACd0hd3AQAAAACAdCGIAgAAAAA6iiAKAAAAAOgogigAAAAAoKMIogAAAACAjiKIAgAAAAA6iiAKAOg6ZvZuM/v9uOtIMzO71cyOxHj8i81s1swycdUAANg7BFEA6BAzu8PMnrTHx3idmb1vL4/RLczsiJm5mb087lqSyN1/wt0npM78XK3/++HuP3L3IXdf2cvjAgDiQRAFAPSqF0g6Hf23o8ysv9PH3CsW2tPfB5I0XgCA9iCIAkAXMLPfNLPbzey0mV1vZuWmx37OzG4zs5qZvd3MPm9mv3EOx3iQmU2Y2XTUdnll02NPM7PvmNmMmR03s5dF9x80s49H33PazL6wWWgxsz8zs6NmVjezb5jZ45see52ZfdjM/i46xq1mdrjp8Yeb2U3RYx+SlNvmveyT9O8kvUjSpc2vFT3+ODP7clT3UTO7Jro/b2ZvNrM7o/H8YnTfETM7tu411mboovo/ambvM7O6pGvM7FFm9pXoGBUz+0szG2z6/p8ws09F4zZlZq82szEzO2NmB5qe9wgzu8vMBjZ4n1kz+1Mzm4y+/tTMstFj3zWzX2h6br+ZnTSzn4xuP6ZpDG5pbrONfg7+wMy+JOmMpPttcOw7zOxJZvYUSa+W9MtRq+wt0eMFM/vb6L0fN7Pft6iN1syuMbMvmdlbzey0pNeZ2f3N7LNmdiqq8/1mVoye/15JF0v6WHSMl5vZJRbOePdHzylHfzdOW/h35Tebat3u5+sVUY0zFv5deuK9fqgAAB1FEAWAmJnZEyS9UdKzJZUk3Snpuuixg5I+KulVkg5Iuk3SY8/hGAOSPibpk5IOSfptSe83swdGT/lbSf/e3YclPVjSZ6P7r5V0TNIFkkYVBhLf5DBfl3S5pPMlfUDSR8ysOVBeGb2voqTrJf1lVNugpH+U9N7oez8i6VnbvKVnSZqNnvsJSc9veq8XS/pnSX8R1X25pJujh/9E0iMUjuH5kl4uaXWbYzU8Q+H/i6Kk90takfS7kg5KukLSEyX9x6iGYUmflvR/JJUlPUDSZ9y9KmlC4f/rhudKus7dlzY45n+W9JjoPTxM0qMkvSZ67IOSrmp67pMlnXT3m8xsXNI/Sfr96H2+TNLfm9kFTc9/nqQXShpW+DO3IXf/P5LeIOlDUavsw6KH3iNpOXpvD5f0c5KaPyB5tKQfKvx5+wNJpvDnvCzpQZIukvS66BjPk/QjSU+PjvGmDUr5oMKfxbLCDyHesC5Qbvbz9UBJL5b0yOjn+8mS7tjs/QIAOoMgCgDxu1rSu9z9JndfUBg6rzCzSyQ9TdKt7v4P7r4s6c8lVc/hGI+RNCTpD9190d0/K+njOhtkliRdZmYj7n63u9/UdH9J0n3cfcndv+DuGwZRd3+fu59y92V3f7OkrKQHNj3li+5+Q3TN33sVBqtGbQOS/jQ6xkcVhtqtvEBhMFpRGHqvappRvFrSp939g9HrnXL3my2cyf01SS9x9+PuvuLuX47GvBVfcfd/dPdVd59392+4+1ej93uHpL+W9DPRc39BUtXd3+zugbvPuPvXosfeozB8KppBvCoaj41cLen17n7C3e+S9N8UBkhF7/vKaHZYkn4luk/R698Qjfequ39K0o0Kf54a3u3ut0b1bxSCN2Vmo5KeKuml7j7n7ickvVXSc5qeNunufxG9/ry73+7un3L3hei9vKVpvLY73kWSHifpFdF43izpnU1jIW3+87Wi8GfxMjMbcPc73P0HO3m/AID2I4gCQPzKapqRcvdZSackjUePHW16zBXOCp3LMY66e/Ps353RMaRwhvFpku60sPX3iuj+P5Z0u6RPmtkPzeyVmx3AzK6N2kVrZjYtqaBwtrChOUCfkZSL2i7Lko6vC7ibztBFoeTfKJyVlKT/rbCV9+ej2xdJ2ihoHIyed64h5GjzDTP7MQvblqtRu+4bdPb9blZDo97LzOx+kn5WUs3d/98mz73Hz0b057Ikufvtkr4r6elRGL1SZ4PofST9UtSWOx39/3icwg8VNnw/O3QfhR8eVJpe/68Vzn5u+PpmdsjMrotaZOuS3qd7/nxspSzptLvPNN3X/PMrbfLzFY3TSxXOvp6IaigLABArgigAxG9S4S/2kiQz26+wDfe4pIqkC5ses+bbOzzGRXbP6zsvjo4hd/+6uz9DYZD4R0kfju6fcfdr3f1+kp4u6fc2ur7OwutBX6Gw5fQ8dy9Kqilsx9xORdJ49N6aa9vM8xSevz5mZlWF7Z85nW3PPSrp/ht830lJwSaPzUlqzCw2ZiovWPec9TPBfyXpXyVd6u4jCtuWG+9hsxrk7oHC8b06ei+bzYZK6342FI7LZNPtRnvuMyR9JwpdjeO/192LTV/73f0Pt3g/W1n/3KOSFiQdbHr9EXf/iS2+543RfQ+Nxuu5uufPx1b1TEo6P2p5blj7+d22ePcPuPvjFI6lS/qjVr4PALB3CKIA0FkDZpZr+upXOIv1q2Z2ebQQzRskfS1q9/wnSQ8xs2dGz32RpLFtjtG37hhZSV9TGLZebmYD0cI1T5d0nZkNmtnVZlaIWjTrCtsZZWa/YGYPiEJi4/6NttMYVni94F2S+s3stZJGWhyTr0Tf+zsWLrjziwqvhdzM8xW2qF7e9PUsST9v4SJA75f0JDN7dvR6B8zs8mg2+F2S3hItfJMxsyui8fmewhm0n49afF+jsJ1zK8MKx2TWzH5c0n9oeuzjksbM7KUWLjg0bGaPbnr87yRdo3AWc6ttUT4o6TVmdkF0vfBr1z3/OoXXZv4HnZ0NVfScp5vZk6P3mbNwQaZz+RBDkqYkXdL4IMPdKwqvN36zmY2YWZ+FixFt1Wo7rPC63unoGtb/tMEx7rVoUnS8o5K+LOmN0Xt5qKRf19lZ8U2Z2QPN7AnR/+dA0rw2/hkGAHQQQRQAOusGhb8IN75e5+6fkfRfJP29wtnB+yu61s7dT0r6JUlvUtiue5nCa/22uq7xqnXH+IG7LyoMPU9VODP4dknPd/d/jb7neZLuiFomf0vRNYySLlW46M6swsD49sbekut8QuECQd9T2DIZqMXWz6i2X1QYzO6W9MuS/mGj55rZYyRdIult7l5t+rpeYQvxVe7+I4Vtxtcq3N7lZp29XvBlkv5F4TWopxXOjPW5e03hQkPvVDjLNqftW6BfpvC6zBlJfyPpQ03vaUZh2+3TFbaMfl9hO3Hj8S8pXCTppugDh838vsL/39+K6r4puq/xOhWF/18eu+74RxXOkr5a4YcDRxUGv3M9738k+u8pM2tcP/x8SYOSvqPw/9tHdc/W3/X+m6SfVDhT/k+69//jNyoM3dMWrdq8zlUK/99PSvpfkv5rdO3rdrKS/lDhz31V4az/q1v4PgDAHrJN1pwAAHShaEbqmKSr3f1zcdeDc2dmn5X0AXd/Z9y1AADQacyIAkCXi9ori1FrYeM6xK/GXBZ2wcweqXB28EPbPRcAgCQiiAJA97tC4QqsJxW2ej7T3efjLQnnyszeo7Dd+aXrVoEFACA1aM0FAAAAAHQUM6IAAAAAgI4iiAIAAAAAOoogCgAAAADoKIIoAAAAAKCjCKIAAAAAgI4iiAIAAAAAOoogCgAAAADoKIIoAAAAAKCjCKIAAAAAgI4iiAIAAAAAOoogCgAAAADoKIIoAAAAAKCjCKIAAAAAgI4iiAIAAAAAOoogCgAAAADoKIIoAAAAAKCjCKIAAAAAgI4iiAIAAAAAOoogCgAAAADoKIIoAAAAAKCjCKIAAAAAgI4iiAIAAAAAOoogCgAAAADoKIIoAAAAAKCjCKIAAAAAgI4iiAIAAAAAOoogCgAAAADoKIIoAAAAAKCjCKIAAAAAgI4iiAK7YGZ3mNmT9vgYrzOz9+3lMQAASBIzmzCzu80sG3ctADZGEAUAAEBimNklkh4vySVd2cHj9nfqWEASEESBPWJmv2lmt5vZaTO73szKTY/9nJndZmY1M3u7mX3ezH7jHI7xoOhT32kzu9XMrmx67Glm9h0zmzGz42b2suj+g2b28eh7TpvZF8yMfwsAAEnxfElflfRuSS9o3GlmeTN7s5ndGZ1/v2hm+eixx5nZl6Nz41Ezuya6f6L5/Gxm15jZF5tuu5m9yMy+L+n70X1/Fr1G3cy+YWaPb3p+xsxebWY/iM7P3zCzi8zsbWb25uY3YWYfM7OX7sUAAd2AXz6BPWBmT5D0RknPllSSdKek66LHDkr6qKRXSTog6TZJjz2HYwxI+pikT0o6JOm3Jb3fzB4YPeVvJf17dx+W9GBJn43uv1bSMUkXSBqV9GqFnxoDAJAEz5f0/ujryWY2Gt3/J5IeofCce76kl0taNbOLJf2zpL9QeG68XNLNOzjeMyU9WtJl0e2vR69xvqQPSPqImeWix35P0lWSniZpRNKvSToj6T2Srmp8MBz9rvBESR/cyRsHeglBFNgbV0t6l7vf5O4LCkPnFVG70NMk3eru/+Duy5L+XFL1HI7xGElDkv7Q3Rfd/bOSPq7wBCdJS5IuM7MRd7/b3W9qur8k6T7uvuTuX3B3gigAoOeZ2eMk3UfSh939G5J+IOlXooD3a5Je4u7H3X3F3b8cnaOvlvRpd/9gdF485e47CaJvdPfT7j4vSe7+vug1lt39zZKykhofEv+GpNe4+20euiV67v+TVFMYPiXpOZIm3H1ql0MCdC2CKLA3ygpnQSVJ7j4r6ZSk8eixo02PucIZynM5xlF3X226787oGJL0LIWh986o9feK6P4/lnS7pE+a2Q/N7JXncGwAALrRCyR90t1PRrc/EN13UFJOYTBd76JN7m/V0eYbZnatmX03av+dllSIjr/dsd4j6bnRn58r6b27qAnoelxUDeyNSYWfyEqSzGy/wjbc45Iqki5sesyab+/wGBeZWV9TGL1Y0vckyd2/LukZUQvviyV9WNJF7j6jsD33WjP7CUmfM7Ovu/tnzqEGAAC6QnS957MlZcys0WmUlVRU2AkUSLq/pFvWfetRSY/a5GXnJO1ruj22wXPWuoqi60FfoXBm81Z3XzWzuyVZ07HuL+nbG7zO+yR928weJulBkv5xk5qARGBGFNi9ATPLNX31K/wE9lfN7PJo6fg3SPqau98h6Z8kPcTMnhk990Xa+MTWrG/dMbKSvqbwBPlyMxswsyOSni7pOjMbNLOrzazg7kuS6pJWJMnMfsHMHhAF4Mb9K20eEwAAOu2ZCs9nlym8RvNyhYHuCwqvG32XpLeYWTlaNOiK6Hz6fklPMrNnm1m/mR0ws8uj17xZ0i+a2T4ze4CkX9+mhmFJy5LuktRvZq9VeC1owzsl/Xczu9RCDzWzA5Lk7scUXl/6Xkl/32j1BZKKIArs3g2S5pu+XhfNLv4XSX+vcAb0/gqv91DULvRLkt6ksF33Mkk3SlrY4hhXrTvGD9x9UeGy9E+VdFLS2yU9393/Nfqe50m6w8zqkn5LZ9t9LpX0aUmzkr4i6e3uPrGrEQAAIH4vkPQ/3f1H7l5tfEn6S4XXgb5S0r8oDHunJf2RpD53/5HCS1muje6/WdLDotd8q6RFSVMKW2ffv00Nn1C48NH3FF4uE+ierbtvUdih9EmFHwb/raR80+PvkfQQ0ZaLFDDWKAHiFS2gcEzS1e7+ubjrAQAA8TCzn1bYonvJujUggMRhRhSIgZk92cyKUUvQqxVeO/LVmMsCAAAxidZ0eImkdxJCkQYEUSAeVyhcNe+kwus6n8m1IAAApJOZPUjStMJFlf405nKAjqA1FwAAAADQUcyIAgAAAAA6KrZ9RA8ePOiXXHJJW15rbm5O+/fvb8trpRnjuHuMYXswju2RtnH8xje+cdLdL4i7jl7Gubm7MIbtwTi2B+PYHmkbx63OzbEF0UsuuUQ33nhjW15rYmJCR44cactrpRnjuHuMYXswju2RtnE0szvjrqHXcW7uLoxhezCO7cE4tkfaxnGrczOtuQAAAACAjiKIAgAAAAA6iiAKAAAAAOgogigAAAAAoKMIogAAAACAjiKIAgAAAAA6iiAKAAAAAOgogigAAAAAoKMIogAAAACAjmopiJrZU8zsNjO73cxeucHj15jZXWZ2c/T1G+0vFQAASJKZvcvMTpjZtzd53Mzsz6Pz9rfM7Cc7XSMAAFvZNoiaWUbS2yQ9VdJlkq4ys8s2eOqH3P3y6Oudba4TAACc9W5JT9ni8adKujT6eqGkv+pATQAAtKyVGdFHSbrd3X/o7ouSrpP0jL0tCwAAbMbd/6+k01s85RmS/s5DX5VUNLNSZ6oDAGB7/S08Z1zS0abbxyQ9eoPnPcvMflrS9yT9rrsf3eA5AABg72107h6XVFn/RDN7ocJZU42OjmpiYqItBczOzrbttdKKMWwPxrE9GMf2YBzPaiWI2gb3+brbH5P0QXdfMLPfkvQeSU+41wtxsutqjOPuMYbtwTi2B+OYaq2cu8M73d8h6R2SdPjwYT9y5EhbCpiYmFC7XiutGMP2YBzbg3FsD8bxrFaC6DFJFzXdvlDSZPMT3P1U082/kfRHG70QJ7vuxjjuHmPYHoxjezCOqbbtuRsAgDi1co3o1yVdamb3NbNBSc+RdH3zE9Zdd3KlpO+2r0QAALBD10t6frR67mMk1dz9Xm25AADEZdsZUXdfNrMXS/qEpIykd7n7rWb2ekk3uvv1kn7HzK6UtKxw8YRr9rDm5tpUm1/S0uqG3UYAACSSmX1Q0hFJB83smKT/KmlAktz9f0i6QdLTJN0u6YykX42nUiBeq6uuM0vh74vdzEzK9Wc02N/SzopAIrTSmit3v0HhSa35vtc2/flVkl7V3tK295UfntKv/M3X9IpH5vSznT44AAAxcfertnncJb2oQ+UAHXVmcVmnZhd1am5Rp2YXdGp2USfnwv+eml3QqblFnYz+fHpuUcurLn3mk3GX3ZL+PlN+MKN9gxntG+xXfiD88z3uG8xo39r9/esezyg/0H/2z9H37BvMKNvfJ7ONLh8H4tFSEO1W5UJeknQ6WI25EgAAAJyLpZVV3d0Ij1GgPBkFyrNB8+yf55dWNnyd/YMZHRjK6sDQoMaLeT10vKADQ4M6VTmqH7v0AR1+Vzvj7ppfXNGZpZXwv4vLml9a1fziss4srmgmWNaJ+oLOLC1Hj4dfO2Em7Rs4G16bA2xzeM0NNIXapufePrWspe9M7dEIpMe3T/TGOD76fudrJDewp8fo6SA6VshJkk4FtOYCAAB0g8alU2GQDANkc5A8NbewNmN5am5R02c2bpvt7zMdGBrUgf1huLzfwf06sH9wLWwebHrswP6s8oOZDV9nYqKqI4+7716+5Vi4u4KlVZ2Jwur8UiOgng2rjVB7NuA27r/n95yemz97XxSIVza69O2bN3b+jSbRTd0/jv/8ksdrpEQQ3VRuIKODQ4M6Pc+MKAAA6H3urjtOndHNR+/Wp25b1JfmvhN3SVtaXnXdPbe4cTvsBs7bNxAGyf2D+vGxER0YGtT5Ubg82Bwy92c1ku+nlXQLZmEbb34wowNtfm131+LK6j3C65e++jU94hGH23yk9Lnxxht1+HD3j+N9D+7f82P0dBCVpFIhr1PBbNxlAAAA7Njdc4u6+di0bv7RtG4+Oq1bjk2vzRBmTMoe/1HMFW6tz0zn7R/Qgf1ZjRdza+2wB4ay95yxHBrUefsGNZBhMZ5eYGbK9meU7c+ouC+879hIRg8eL8RbWAKc/D7j2NDzQbRczOnbd9bjLgMAAGBLC8sr+s5kXTcfnV77uvPUGUnh9Xs/dmhYT75sTJdfXNTlFxU1+d1v6IlP+DcxVw0Ae6Png2ipkNfn57lGFAAAdI/mFttbjtb0zaPT+u5kXYsr4eVEoyNZXX5RUc955MV62EUFPfTCooay9/y1bOo22lIBJFfPB9FyMadgRaoHS3u+shMAAMBGtmqxzQ9k9JALC/rVn7pEl19U1OUXF1WKVv4HgLRKQBAN/yGfnJ7XyBhBFAAA7K31Lba3HJ3WHVu02F56aEj9XBsJAPfQ80G08YliZTrQj4+NxFwNAABIkkaL7S1R6NysxfaXH3mxLr+oqIdcWLhXiy0A4N56/l/K8caMaG0+5koAAECv26rFdt9gRg8Zp8UWANqh54PoBcNZZSxszQUAAGgVLbYAEJ+eD6KZPlMxa6pMB3GXAgAAesCJmUD/8X036VvHarTYAkBMEvEv7IG86TgzogAAoAU33TmtG++8W1c96iL99KUX0GILADFIRBA9P2earDEjCgAAtjdVD39nuPbnHqiDQ9mYqwGAdErEhQ7n5/pUqc1rddXjLgUAAHS5Si3QQMZ0/r7BuEsBgNRKRBA9kDctrbhOzi3EXQoAAOhyU/VAh4Zz6uuzuEsBgNRKRBA9PxeeSCZZsAgAAGyjUptXqZCLuwwASLVEBNEDURCtsGARAADYxlR9QaMEUQCIVSKC6Pm58G2wci4AANiKu6taC1QaIYgCQJwSEUT3D0j7BjOqsHIuAADYQn1+WfNLKxpjRhQAYpWIIGpmKhVymmRGFAAAbKEabd0yyowoAMQqEUFUksrFPHuJAgCALVVq4YfWLFYEAPFKThAt5JkRBQAAW5piRhQAukJygmgxr7tmFrSwvBJ3KQAAoEtVa+Ge4wRRAIhXYoJoqRieUKaiEwwAAMB61fq8Dg4NarA/Mb8CAUBPSsy/wuVCXpI0WaM9FwAAbKxaC5gNBYAukJwgGs2Icp0oAADYTKUWsFARAHSBxATRUjQjyl6iAABgM1N1ZkQBoBskJojmBzM6f/8gM6IAAGBDwdKK7j6zxIwoAHSBxARRKdwTjCAKAAA2wtYtANA9EhVEy8U8rbkAAGBD1eh3hDFmRAEgdskKooWcjjMjCgAANlCNZkRpzQWA+CUriBbzmgmWNRMsxV0KAADoMo0ZUVpzASB+iQqipSIr5wIAgI1V64GGsv0azg3EXQoApF6igug4e4kCAIBNVGuBRkeycZcBAFDCgmhjL9HJaWZEAQDAPVXrAQsVAUCXSFQQPTScVabPVKkxIwoAAO6pWgs0NpKPuwwAgBIWRPszfRodzrJyLgAAuIeVVdeJmQWNFWjNBYBukKggKkV7idKaCwAAmpyaXdDKqmuswIwoAHSDxAXRUjGvSVpzAQBAk8aK+mNs3QIAXSFxQbRczKlSC7S66nGXAgAAukS1ThAFgG6SvCBayGtxeVWn5hbjLgUAAHSJamNGlFVzAaArJC+IFsNrP1g5FwAANFTrgQYypgP7B+MuBQCgBAbRUvRJ5yQr5wIAgMhULdCh4Zz6+izuUgAASmAQbcyITrJyLgAAiFRqAW25ANBFEhdEz9s3oNxAHzOiAABgzVQ9YKEiAOgiiQuiZqZyIb+2TDsAAEg3d2dGFAC6TOKCqBS257KXKAAAkKR6sKz5pRVmRAGgiyQyiJYKOVpzAQCApLAtV2LrFgDoJokMouViXidmFrS0shp3KQAAIGYV9hAFgK6T0CCak/vZzasBAEB6TTWCKK25ANA1EhpEwy1cWLAIAAA0fh84NJKNuRIAQEMig2ip0NhLlOtEAQBIu2o90IH9g8r2Z+IuBQAQSWQQLRfD1htWzgUAAFN1tm4BgG6TyCC6b7BfxX0DzIgCAIBwD1GuDwWArpLIICpJ5UJelWmuEQUAIO2m6oFGmREFgK6S3CBazOk4M6IAAKRasLSi03OLKjEjCgBdJcFBNM+quQAApNyJ+oIkMSMKAF0msUG0VMirNr+kuYXluEsBAAAxqdbDD6VLBFEA6CqJDaKNlXMrrJwLAEBqNX4PYLEiAOguCQ6i4V6ix1mwCACA1JqKZkRpzQWA7pL4IFphwSIAAFKrUgu0fzCj4Wx/3KUAAJokNoiODmfVZ2IvUQAAUqyxdYuZxV0KAKBJYoNof6ZPh4ZzmmTlXAAAUqtaC1ioCAC6UGKDqBQuWMRiRQAApFe1FmiUhYoAoOskOoiWinlNslgRAACptLLqOjGzwIq5ANCFEh1Ex4t5TU7Py93jLgUAAHTYqdkFLa86rbkA0IUSHURLhZwWlld1em4x7lIAAECHVRtbtzAjCgBdJ9FBdG0LFxYsAgAgdarR+b9UyMdcCQBgvWQH0ejEc5wtXAAASJ21GdFCNuZKAADrJTuIFsNWnApBFACA1KnWAvX3mQ7uJ4gCQLdJdBA9f/+gsv197CUKAEAKNbZu6euzuEsBAKyT6CBqZipHK+cCAIB0qdYDjY4wGwoA3SjRQVQKV84liAIAkD7VesBCRQDQpRIfRMvFPKvmAgCQMu6+1poLAOg+yQ+ihZym6oGWV1bjLgUAAHTIzMKyziyuaIwVcwGgKyU/iBbzWnVpamYh7lIAAECHNPYQHaM1FwC6UuKDaKkYnoC4ThQAgPRYC6K05gJAV0p8EB2P9hIliAIAkB7VehhESwWCKAB0o5aCqJk9xcxuM7PbzeyVWzzv35mZm9nh9pW4O43V8ianWbAIAJAc252bzew+ZvYZM/uWmU2Y2YVx1BmXxozoIbZvAYCutG0QNbOMpLdJeqqkyyRdZWaXbfC8YUm/I+lr7S5yN/Zn+1XID6hSY0YUAJAMLZ6b/0TS37n7QyW9XtIbO1tlvKr1QOfvH1S2PxN3KQCADbQyI/ooSbe7+w/dfVHSdZKescHz/rukN0nquqlH9hIFACRMK+fmyyR9Jvrz5zZ4PNGqtYDrQwGgi/W38JxxSUebbh+T9OjmJ5jZwyVd5O4fN7OXtbG+tigX87TmAgCSZNtzs6RbJD1L0p9J+reShs3sgD/xg4EAACAASURBVLufan6Smb1Q0gslaXR0VBMTE20pcHZ2tm2vdS5uPz6v83IWaw27FfcYJgXj2B6MY3swjme1EkRtg/t87UGzPklvlXTNti8U18lubkE/OrnM//Rt8Bdj9xjD9mAc24NxTLQtz82Rl0n6SzO7RtL/lXRc0vK9vsn9HZLeIUmHDx/2I0eOtKXAiYkJteu1zsXcFz6ln7rvmI4ceUhsNexW3GOYFIxjezCO7cE4ntVKED0m6aKm2xdKmmy6PSzpwZImzEySxiRdb2ZXuvuNzS8U18nuVr9dnz16mx792McrP8i1IpvhL8buMYbtwTi2B+OYaNudm+Xuk5J+UZLMbEjSs9y91rEKY7SwvKJTc4usmAsAXayVa0S/LulSM7uvmQ1Keo6k6xsPunvN3Q+6+yXufomkr0q6VwiN03hjL1EWLAIAJMOW52ZJMrODUdeSJL1K0rs6XGNsTtQXJLGHKAB0s22DqLsvS3qxpE9I+q6kD7v7rWb2ejO7cq8LbIfGJ6IsWAQASIIWz81HJN1mZt+TNCrpD2IpNgaNPUTHmBEFgK7VSmuu3P0GSTesu++1mzz3yO7Laq9yNCNaYcEiAEBCbHdudvePSvpop+vqBpUaQRQAul0rrbk9b6yQk5l0nBlRAAASbyoKoqO05gJA10pFEB3I9OnQcFYVrhEFACDxKrVA+wYzGsm11PgFAIhBKoKoJJUK7CUKAEAaTNUDjY3kFK3mDwDoQqkJouPFPKvmAgCQAtV6wPWhANDlUhNES4WcJqfn5b5+v28AAJAk1VrA1i0A0OVSE0TLxbyCpVVNn1mKuxQAALBHVlddU/VAo8yIAkBXS1EQDU9IrJwLAEBynZxb0PKqr+0hDgDoTikKotFeojUWLAIAIKmmaguS2LoFALpdaoJoqRAG0UlmRAEASKxqPfzAmRlRAOhuqQmiB/YParC/j5VzAQBIsGp0nmexIgDobqkJon19Fq2cS2suAABJVa0HyvSZDgxl4y4FALCF1ARRSSoX8qrQmgsAQGJVaoFGh7PK9FncpQAAtpCqIFoq5rhGFACABGPrFgDoDakKouVCXlMzC1pZ9bhLAQAAe6BaC1ioCAB6QLqCaDGvlVXXiRmuEwUAIImqtYCtWwCgB6QqiJaK4YmJ9lwAAJJnJljS3OIKK+YCQA9IVRAdLzb2EmVGFACApKnWwvP7GK25AND1UhVEG9eMMCMKAEDyVOtREGVGFAC6XqqC6HBuQMO5flVqzIgCAJA0jRnRUiEfcyUAgO2kKohK4cq5x5kRBQAgcRpB9NBINuZKAADbSV8QLeZUqRFEAQBImmo90Hn7BpQbyMRdCgBgG6kLoqVinsWKAABIoGot0BhtuQDQE1IXRMeLeZ2eW1SwtBJ3KQAAoI2q9UBjtOUCQE9IXRBl5VwAAJJpqs6MKAD0itQF0XK0lygr5wIAkBwLyys6ObvI1i0A0CPSF0SjT0pZORcAgOQ4UV+QJI0VaM0FgF6QuiA6WsjKTKqwYBEAAIlRrYfndVpzAaA3pC6IZvszOjiU5RpRAAASpLGHKK25ANAbUhdEpfA60Un2EgUAIDGm1mZECaIA0AvSGUQLOWZEAQBIkEotUH4go5Fcf9ylAABakM4gWsyrUgvk7nGXAgAA2qBaDzRWyMnM4i4FANCCVAbRUiGnM4srqs8vx10KAABog2ot4PpQAOghqQyijb1E2cIFAIBkqNYCrg8FgB6S6iBaYcEiAAB63uqq68QMQRQAekk6g2h0omLBIgAAet+puUUtrTituQDQQ1IZRA8OZTWQMU1Ge44BAIDe1di6ZZQgCgA9I5VBtK/PNMYWLgAAJEIl+mC5RGsuAPSMVAZRSSoX8qpMMyMKAECvq0YzolwjCgC9I71BtJhn1VwAABJgqhYo02c6OJSNuxQAQItSHERzmqoHWln1uEsBAAC7UKkFOjScVabP4i4FANCi1AbRUiGv5VXXXTMLcZcCAAB2YaoesFARAPSY1AbR8Wgv0Un2EgUAoKdVavMsVAQAPSa1QbRUZC9RAACSYKq+wIwoAPSY1AbRcjQjysq5AAD0rplgSbMLy8yIAkCPSW0QHckNaCjbz8q5AAD0sCm2bgGAnpTaICqFK+dWuEYUAICeVa2Fiw7SmgsAvSXVQbRUyGuS1lwAAHpW4wNlWnMBoLekOoiWi3lmRAEA6GGN1lxmRAGgt6Q7iBZyOjm7qGBpJe5SAADAOajWA523b0C5gUzcpQAAdiDdQTRaObdaoz0XAIBeVK0FzIYCQA9KdRBd20uU9lwAAHpStR6wYi4A9KBUB9FyIZwRZcEiAAB6U7UWsFARAPSgVAfRxieoFfYSBQCg5ywur+rk7CKtuQDQg1IdRHMDGR0cGqQ1FwCAHnRiJuxoYkYUAHpPqoOoFC5YRGsuAAC9p7HYIDOiANB7Uh9ES4WcJmnNBQCg51SjPURZrAgAek/qg2g4Izovd4+7FAAAsAONGdHSSD7mSgAAO0UQLeQ1t7iierAcdykAAGAHqrVAuYE+jeT74y4FALBDBNFi+ClqhQWLAADoKdV6oFIhLzOLuxQAwA6lPoiWiuF1JVwnCgBAb6nWAo2OZOMuAwBwDlIfRMejGVFWzgUAoLdU64HGWDEXAHpS6oPowaGs+vuMGVEAAHrI6qprqh5orMBCRQDQi1IfRDN9prFCTpUaM6IAAPSK02cWtbTiGqM1FwB6UuqDqBSunHucGVEAAHpGY+sW9hAFgN5EEJVULuZYNRcAgB5yNojSmgsAvYggKqlUzKtaC7S66nGXAgAAWlCtR0GUxYoAoCcRRBXuJbq04jo5uxB3KQAAoAXVWqBMn+mCYa4RBYBeRBCVVI6uL+E6UQAAekO1HuiCoawyfRZ3KQCAc0AQVTgjKomVcwEA6BFT9UCjLFQEAD2LIKpw1VxJ7CUKAECPqNQClbg+FAB6FkFU0ki+X/sGM5qcZkYUAIBeMFUL2LoFAHoYQVSSmalczLOFCwAAPWB2YVkzC8sEUQDoYQTRSKmQozUXAIAesLaHKK25ANCzCKKR8WJekyxWBABA15uK9hAdJYgCQM8iiEZKhbzumlnQwvJK3KUAAIAtNFa5L9GaCwA9iyAaKRfDk9lUbSHmSgAAwFYaM6JcIwoAvYsgGmnsJXqc60QBAOhqldq8ivsGlBvIxF0KAOAcEUQjjSDKyrkAAHS3am2BhYoAoMcRRCON60xYORcAgO42VQ9YqAgAelxLQdTMnmJmt5nZ7Wb2yg0e/y0z+xczu9nMvmhml7W/1L2VG8jowP5BVs4FAPSEFs7NF5vZ58zsm2b2LTN7Whx17oVKLWChIgDocdsGUTPLSHqbpKdKukzSVRsEzQ+4+0Pc/XJJb5L0lrZX2gGlInuJAgC6X4vn5tdI+rC7P1zScyS9vbNV7o2llVWdmltgRhQAelwrM6KPknS7u//Q3RclXSfpGc1PcPd60839krx9JXZOuZBXZZoZUQBA19v23KzwXDwS/bkgabKD9e2ZEzMLcmfrFgDodf0tPGdc0tGm28ckPXr9k8zsRZJ+T9KgpCe0pboOKxfz+soPTsVdBgAA22nl3Pw6SZ80s99W+CHxkzZ6ITN7oaQXStLo6KgmJibaUuDs7GzbXqvZ9+8O9/s+cef3NHHmh21//W6yV2OYNoxjezCO7cE4ntVKELUN7rvXjKe7v03S28zsVxS2A73gXi/U5Se7+VNLmllY1g2f+pz2DWz0tpONvxi7xxi2B+PYHoxjorVybr5K0rvd/c1mdoWk95rZg9199R7f5P4OSe+QpMOHD/uRI0faUuDExITa9VrN5r5Vkb52k372cY/Sg0oj239DD9urMUwbxrE9GMf2YBzPaiWIHpN0UdPtC7V1e891kv5qowe6/WQ3c96kPnTbN3X/hxzWA8eGd19Yj+Evxu4xhu3BOLYH45horZybf13SUyTJ3b9iZjlJByWd6EiFe6SxzRqtuQDQ21q5RvTrki41s/ua2aDCBQ+ub36CmV3adPPnJX2/fSV2TmMv0Un2EgUAdLdtz82SfiTpiZJkZg+SlJN0V0er3ANT9UDZ/j4V8gNxlwIA2IVtZ0TdfdnMXizpE5Iykt7l7rea2esl3eju10t6sZk9SdKSpLu1QVtuLygXw09XWbAIANDNWjw3Xyvpb8zsdxW27V7j7j25mGCzan1BpUJOZum7hAYAkqSV1ly5+w2Sblh332ub/vySNtcVi0PDOWX6jC1cAABdr4Vz83ck/VSn69pr1do8W7cAQAK00pqbGpk+09hIjtZcAAC6VLUeaIzrQwGg5xFE1ykVcsyIAgDQhdxdU7UFgigAJABBdJ1yMa9KjWtEAQDoNqfnFrW4sqoxWnMBoOcRRNcpFXOqTAdaXe359RwAAEiUaj38oJitWwCg9xFE1xkv5rW4sqpTc4txlwIAAJpUo44lFisCgN5HEF2nVIj2EuU6UQAAukpjRpRrRAGg9xFE11nbS5SVcwEA6CrVWqA+ky4YysZdCgBglwii65SjGdHj0yxYBABAN6nWAl0wnFV/hl9fAKDX8S/5OsV9A8oPZFShNRcAgK4S7iGaj7sMAEAbEETXMTOVijlN0poLAEBXqdYCjY3QlgsASUAQ3cB4Ma9JWnMBAOgq1XrAHqIAkBAE0Q2UCjlWzQUAoIvMLSxrJlimNRcAEoIguoFyMa+7Zhe0uLwadykAAEDNW7fQmgsASUAQ3UC5kJe7NFWnPRcAgG4wVYuC6AgzogCQBATRDZSL4UmO9lwAALpDpRFEC1wjCgBJQBDdQKkYnuRYORcAgO6w1prLYkUAkAgE0Q2UC40ZUVpzAQDoBtVaoEJ+QPnBTNylAADagCC6gfxgRuftG1CFGVEAALoCW7cAQLIQRDdRZi9RAAC6xlQ94PpQAEgQgugmSoU8ixUBANAlKjVmRAEgSQiimygXcwRRAAC6wNLKqk7OLmiUGVEASAyC6CbKxbzqwbJmF5bjLgUAgFQ7MbMgd6lEEAWAxCCIbqJxsqswKwoAQKyqNbZuAYCkIYhuYrwYbeFSY8EiAADiNNXYQ5QZUQBIDILoJkqNIMqMKAAAsaowIwoAiUMQ3cTocFZ9RmsuAABxm6oHGuzvU3HfQNylAADahCC6if5Mn0ZHcjrOXqIAAMSqUgtUKuRkZnGXAgBoE4LoFsrFvCo1ZkQBAIjTVC3QKG25AJAoBNEtlArsJQoAQNyq9YCtWwAgYQiiWxgv5jVZC+TucZcCAEAqubuq9YCFigAgYQiiWygVclpcXtWpucW4SwEAIJXuPrOkxeVVWnMBIGEIolsoR1u4VFiwCACAWDTWaqA1FwCShSC6hUYQPc51ogAAxGKqHn4YPEoQBYBEIYhuYW1GlJVzAQCIRbW2IIkZUQBIGoLoFs7bN6Bsfx8r5wIAEJNqbV59Jl0wlI27FABAGxFEt2BmayvnAgCAzqvWAx0cyqo/w68sAJAk/Ku+jVIxpwozogAAxKJSYw9RAEgigug2yoW8Jlk1FwCAWEzVA7ZuAYAEIohuo1TM68RMoKWV1bhLAQAgdaq1QGPMiAJA4hBEt1Eu5LTqZ5ePBwAAnXFmcVn1YJkgCgAJRBDdxtktXAiiAAB0UjU6947RmgsAiUMQ3Ua5GJ782MIFAIDOWguizIgCQOIQRLdRKoQzoixYBABAZ1XrzIgCQFIRRLexP9uvQn6AGVEAADpsLYgyIwoAiUMQbUG5mFelRhAFAKCTqrVAI7l+7Rvsj7sUAECbEURbUC7kdJzWXAAAOoqtWwAguQiiLWBGFACAzqvWA41FazUAAJKFINqCUjGn6TNLOrO4HHcpAACkRrUWaGwkG3cZAIA9QBBtwXiRlXMBAOikpZVV3TW7wIq5AJBQBNEWnN3ChfZcAAA64a6ZBbmL1lwASCiCaAvKxfDTWK4TBQCgM85u3UJrLgAkEUG0BaMjOZmJlXMBAOiQai0KoiPMiAJAEhFEWzCQ6dPocE4VWnMBAOiItSDK9i0AkEgE0RaVijlVasyIAgDQCVP1QIP9fTpv30DcpQAA9gBBtEXlYp7FigAA6JBKLdDYSE5mFncpAIA9QBBtUbmQ02RtXu4edykAACRetR6wdQsAJBhBtEXlYl7B0qruPrMUdykAACRetRZwfSgAJBhBtEXsJQoAQGe4ezgjShAFgMQiiLaosZcoQRQAgL01fWZJi8urGqU1FwASiyDaonIxnBFl5VwAAPZW41xbYkYUABKLINqiA/sHNdjfx4woAAB7bKoeBlFmRAEguQiiLTKzaOVcZkQBANhLzIgCQPIRRHegVGAvUQAA9lq1HshMumA4G3cpAIA9QhDdgXIxrwpBFACAPTVVC3RwKKuBDL+mAEBS8S/8DpSLOVXrgZZXVuMuBQCAxKrUA9pyASDhCKI7UC7mterSiZmFuEsBACCxpmoBCxUBQMIRRHeg8eks14kCALB3KrV5ZkQBIOEIojswHu0lysq5AADsjfnFFdWDZWZEASDhCKI7UGoEUWZEAQDYE9VoD9ExgigAJBpBdAeGsv0ayfWzci4AAHukUgvPsbTmAkCyEUR3qFzM6/g0rbkAAOyFqWhGdJQgCgCJRhDdoXIxv/ZpLQAAaK9KjdZcAEgDgugOlQq5tZMkAABor6laoOFcv/Zn++MuBQCwhwiiO1Qu5nV6blHziytxlwIAQOJU6wGzoQCQAgTRHSoXw5Mj7bkAALRftRZojOtDASDxCKI7VC40tnChPRcAgHZjRhQA0oEgukPlxl6izIgCANBWyyurumtmga1bACAFCKI7NDqSk5k0yV6iAAC01V2zC1p1tm4BgDQgiO7QYH+fLhjKqkJrLgAAbVVl6xYASI2WgqiZPcXMbjOz283slRs8/ntm9h0z+5aZfcbM7tP+UrtHqZinNRcAEKsWzs1vNbObo6/vmdl0HHXuxFoQZUYUABJv2yBqZhlJb5P0VEmXSbrKzC5b97RvSjrs7g+V9FFJb2p3od1kvJijNRcAEJtWzs3u/rvufrm7Xy7pLyT9Q+cr3ZlqnRlRAEiLVmZEHyXpdnf/obsvSrpO0jOan+Dun3P3M9HNr0q6sL1ldpdSIa/J6UDuHncpAIB02vbcvM5Vkj7Ykcp2oVoPNJjp0/n7B+MuBQCwx/pbeM64pKNNt49JevQWz/91Sf+8m6K6XbmY1/zSimrzSyru42QJAOi4ls/N0eUy95X02U0ef6GkF0rS6OioJiYm2lLg7Ozsjl/rlu8FKgy6Pv/5z7elhl53LmOIe2Mc24NxbA/G8axWgqhtcN+GU4Fm9lxJhyX9zCaPd83JbjdOV5clSf/701/QfUYyHTvuXuMvxu4xhu3BOLYH45hoLZ+bJT1H0kfdfWWjB939HZLeIUmHDx/2I0eOtKXAiYkJ7fS1/uq2r+iSUdeRI49tSw297lzGEPfGOLYH49gejONZrQTRY5Iuarp9oaTJ9U8ysydJ+s+SfsbdFzZ6oW462e3GeUen9babv6TxBzxYRy4b7dhx9xp/MXaPMWwPxrE9GMdEa+ncHHmOpBfteUVtUK0HeuiFxbjLAAB0QCvXiH5d0qVmdl8zG1R4Qru++Qlm9nBJfy3pSnc/0f4yu0upGC6iwMq5AICYbHtuliQze6Ck8yR9pcP17Zi7q1oLNDaSjbsUAEAHbBtE3X1Z0oslfULSdyV92N1vNbPXm9mV0dP+WNKQpI9Ey8Tf62SYJAf3ZzWY6dMke4kCAGLQ4rlZChcpus57YHW92vySFpZXNVbIx10KAKADWmnNlbvfIOmGdfe9tunPT2pzXV2tr880VmALFwBAfLY7N0e3X9fJmnajUmPrFgBIk1Zac7GBcjGnCq25AAC0xdoeogVacwEgDQii56gc7SUKAAB2r9qYEaU1FwBSgSB6jsrFvKr1QCurXX/ZDQAAXa9aC2QmHRpmRhQA0oAgeo5KxZxWVl13zWy4Uw0AANiBqXqgg0NZDWT41QQA0oB/7c9RuRi2Dh1nwSIAAHatUgtYqAgAUoQgeo7K0TUsLFgEAMDuTdUDjRJEASA1CKLnqFwMT5Zs4QIAwO5VaoFKBYIoAKQFQfQcDecGNJztZ+VcAAB2KVhaUW1+SWMEUQBIDYLoLpSKOWZEAQDYpbWtW2jNBYDUIIjuQrmYV6XGjCgAALtRWdtDlCAKAGlBEN2FUiHPjCgAALs0VQ+DKIsVAUB6EER3YbyY06m5RQVLK3GXAgBAz2JGFADShyC6C6W1LVxozwUA4FxN1QMNZ/s1lO2PuxQAQIcQRHehXIyCKO25AACcs2otYDYUAFKGILoLjb1EjxNEAQA4Z5U6QRQA0oYguguNkyatuQAAnLupWsBCRQCQMgTRXcj2Z3RwKMvKuQAAnKPllVWdmAlUYkYUAFKFILpL48WcJpkRBQDgnJycXdSqs3ULAKQNQXSX2EsUAIBzV432EB0jiAJAqhBEd6lczKsyPS93j7sUAAB6TrUWfpjLYkUAkC4E0V0qF3OaW1xRPViOuxQAAHpONbq8hSAKAOlCEN2lxl6itOcCALBzlXqgwUyfzt83GHcpAIAOIojuUmltCxeCKAAAOzVVC3RoJKu+Pou7FABABxFEd2k8mhE9Ps3KuQAA7FS1HrBQEQCkEEF0lw4OZTWQMVVozQUAYMeqtYDrQwEghQiiu9TXZxor5LhGFACAHXJ3ZkQBIKUIom1QKuQ1WaM1FwCAnajNLylYWmVGFABSiCDaBmVmRAEA2LFqna1bACCtCKJtUC7mNVUPtLLqcZcCAEDPWNtDlNZcAEgdgmgblIp5La24Ts4uxF0KAAA9Yy2IMiMKAKlDEG2D8WJ4AqU9FwCA1jVacw8NE0QBIG0Iom1QKoR7iU6ylygAAC2r1gIdHMpqsJ9fRwAgbfiXvw3KxTCIVmrMiAIA0KpqPdBYIRt3GQCAGBBE22Ak16/9gxkdpzUXAICWVWvsIQoAaUUQbQMzU7mYV4XWXAAAWhbOiBJEASCNCKJtUirmNUlrLgAALQmWVjR9ZokZUQBIKYJom4wXcyxWBABAi85u3ZKPuRIAQBwIom1SKuR1cnZBC8srcZcCAEDXa2zdwowoAKQTQbRNGivnNj7hBQAAm5tqBFFWzQWAVCKItkk5WmyB9lwAALZXoTUXAFKNINomjRnRSbZwAQBgW9VaoKFsv4ay/XGXAgCIAUG0TRrLz1dYORcAgG1Va2zdAgBpRhBtk9xARgeHBnWc1lwAALZVrQcsVAQAKUYQbaNSIc+MKAAALZiqBxoliAJAahFE26hczHGNKAAA21hZdZ2YWVCJ1lwASC2CaBuVCnlVaM0FAGBLJ2cXtLLqGiWIAkBqEUTbqFzMaWZhWfVgKe5SAADoWo2tW0q05gJAahFE26ixhQuzogAAbK66tocoQRQA0oog2kalAnuJAgCwnal6GERZrAgA0osg2kbj0YzoJCvnAgCwqUot0EDGdGD/YNylAABiQhBtowuGs+rvM2ZEAQDYwlQ90KHhnPr6LO5SAAAxIYi2UabPNDqS4xpRAAC2UKnNs3ULAKQcQbTNysWcjjMjCgDApqbqC2zdAgApRxBts3Ixv7YsPQAAuCd3V7UWaIyFigAg1QiibVYq5FWpzWt11eMuBQCArlOfX9b80gqtuQCQcgTRNhsv5rS04jo5txB3KQAAdJ0qW7cAAEQQbbuze4nSngsAwHqVaIszZkQBIN0Iom1WjvYSrbBgEQAA9zLFjCgAQATRtisXwxPrJAsWAQBwL9VaeOkKQRQA0o0g2maF/ID2DWY0yYwoAAD3Uq3P6+DQoAb7+RUEANKMs0CbmZlKhdzaNTAAAOCsai1gNhQAQBD9/+3de3Scd33n8c937qOLZ2TLlqxLfQkOxnZih4TEToDaBDhhoRRYKAW2SbsXtt3SAl02m3B2WXa7C/TA6aF/5OzZLKWENkC7SQqlJ5A2adxAnBsxsZM4F0Jix7Il+SaNbp77b/94HkljWUpkazTPjPR+naMz8zzzzKOvfpHz02d+v+f3LIaudFLHWKwIAIDz9GeyLFQEACCILoauVJLFigAAmMXgCCOiAACC6KLoSid1ciynfLEcdCkAANSNbKGkoYmCOgmiALDsEUQXwdp0Qs5NL1EPAACm+8VOpuYCwLJHEF0EXSnvXqLHmJ4LAMCUgQxBFADgIYgugsl7ibJyLgAA0wb8EVEWKwIAEEQXwVp/RPQ4K+cCADBlckSUxYoAAATRRZCMhbWyOabjTM0FAGDKwEhWzbGwWhPRoEsBAASMILpI1qYSBFEAACoMZLJcHwoAkEQQXTRd6aT6M0zNBQBg0sAIQRQA4CGILpKuVIJVcwEAqDCYyapzRTLoMgAAdYAguki60kmNZosazRaCLgUAgMCVyk6Dozl1puJBlwIAqAME0UWyNu194sv0XAAApNNjOZXKTp2smAsAEEF00XT79xJlwSIAAKY/mO1MMTUXAEAQXTST9xJlRBQAAG+hIkmMiAIAJBFEF82a1rjCIWNEFAAASYOTQZRVcwEAIogumkg4pI7WuI4PMyIKAEB/Jqto2LSqORZ0KQCAOkAQXURd6SQjogAAyLt1y5rWhEIhC7oUAEAdmFcQNbMbzOwFM3vJzG6Z5fW3m9l+Myua2YerX2ZjWptOqj9DEAUAVN/r9c3+Mb9hZofM7Fkz+06ta6zUn8kyLRcAMOV1g6iZhSXdJuk9krZI+piZbZlx2KuSfltSoJ1cvelKJ3Q8k5VzLuhSAABLyHz6ZjPbJOlWSdc557ZK+kzNC60wOJJloSIAwJT5jIheLekl59zLzrm8pO9J+vXKA5xzh51zByWVF6HGhtWVSipfLOv0eD7oUgAAS8vr9s2S/p2k25xzQ5LknDtR4xqnOOc0MMKIKABgWmQex3RLOlqx3SfpmsUpZ2npSnu3cDk+fFbtLfGAqwEALCHz6ZsvlSQze1hSAYauUAAAFZ5JREFUWNIXnXM/nnkiM/ukpE9KUkdHh/bu3VuVAsfGxqbONV5wmsiXNHbymPbuDSwPN5zKNsTFox2rg3asDtpx2nyC6GyrClzUXNNadHb15PhISZL0jw//TGc65tPUwarXdmwktGF10I7VQTsuafPpmyOSNknaLalH0k/MbJtzbvicNzl3u6TbJemqq65yu3fvrkqBe/fu1eS5XhwclR54SNe9eat2b++qyvmXg8o2xMWjHauDdqwO2nHafNJRn6Teiu0eSccv5pvVorOrJ2fG8/pv+/5Rbd2XaPdbNwRdzuuq13ZsJLRhddCO1UE7Lmnz6Zv7JD3qnCtIesXMXpAXTJ+oTYnT+jPerczWMjUXAOCbzzWiT0jaZGYbzCwm6Tcl/d3ilrU0tDVFlYiGWDkXAFBt8+mbvy9pjySZWbu8qbov17RK36AfRFmsCAAw6XWDqHOuKOlTku6T9Jykv3HOPWtm/8PM3i9JZvYWM+uT9BFJ/8fMnl3MohuFmakrldTx4WzQpQAAlpD59M3+a6fN7JCkByX9J+fc6SDqHRjx+sE1K1gvAQDgmdeFi865eyXdO2PfFyqePyFvWhBm6EondZwRUQBAlc2jb3aS/sj/ClR/JqtVzTHFI+GgSwEA1In5TM3FAqxNJXR8mCAKAFi+Bkey6mBaLgCgAkF0kXWlkzoxmlOhxC1WAQDLU38my0JFAIBzEEQXWVc6IeekgQzXiQIAlqfBkaw6CKIAgAoE0UXW09YkSfrvPzykJw6fkXfJDgAAy0O2UNKZ8Twr5gIAzjGvxYpw8XZtXKX/sPsS/dWjR3T/c4PasnaFfvva9Xr/ji4loizaAABY2k6M5CRJnYyIAgAqMCK6yEIh0803bNajn79eX/rgZSqVnW6++6B2ffkBfeVHz6tvaCLoEgEAWDSTt25hRBQAUIkR0RppikX08Wt+RR+7ulePvXJGd+w7rNsf+qVuf+iXeteWDt20a712XbJKZhZ0qQAAVE2/fwszFisCAFQiiNaYmWnnxlXauXGVjg2f1Z2PHtF3H39V9z07qEs7WnTjrvX60Ju71RTjPw0AoPEN+iOiLFYEAKjE1NwAdaeTuvmGzXrk1uv11Q9frlgkpP/y/Wd0zZce0B///SEdOT0edIkAACzIQCanplhYrXE+YAUATKNXqAOJaFgfuapXH76yR/tfHdK39h3RHfsO65sPv6I9b1yjm65dr7e9oV2hENN2AQCNZWDkrDpTCS49AQCcgyBaR8xMV65bqSvXrdTge9+kOx97Vd957FXd9M3HtbG9WTfuWqd/eWWPWhPRoEsFAGBeBjJZFioCAJyHqbl1qmNFQn/0rku175Z36Osf3aFUU1Rf/OEh7fzSA/rCD57RSyfGgi4RAIDXNZDJcusWAMB5GBGtc7FISB+4olsfuKJbB/uG9a19h/W9x4/q248c0ds2teumXeu1Z/MahZm2CwCoM+Wy04nRHCOiAIDzMCLaQC7vSetPf2OH9t36Dn3u3ZfqF4Nj+rff/pl2f+1B/d+HXlZmohB0iQAATDk1nlOx7BgRBQCchyDagNpb4vrUOzbpJ/95j277+Ju1dkVS/+ve53TNl+/Xrfc8recHRoIuEQAADWS8W7cwIgoAmImpuQ0sGg7pvZev1XsvX6tDx0d0x77Dumd/n777+KvauXGlbtq1Xu/a0qFImM8bAAC1NxVEGREFAMxAEF0itnSt0J98+HLd8p7N+uufHdVfPnJEv3fnfnWlEvrEznX62NW/opXNsaDLBAAsIwMjBFEAwOwYKlti2ppj+t1fvUQP3bxHt//Wldqwullfve8F7fzyA/rc/zugZ45lgi4RALBMDGSyioRM7c3xoEsBANQZRkSXqHDI9O6tnXr31k79YnBUdzxyWPfsP6a7nuzTlevadOOudXrPtrWKRfgsAgCwOAZGslrTGleIld0BADOQQpaBTR2t+p8fuEyP3Hq9/uv7tujUWE6f/t5Teuuf/JO+fv+LOjGaDbpEAMASxD1EAQBzYUR0GUklo/o3b92g37l2vf75xZP61r7D+vr9v9BtD76kG7atVXupoM6BEW1a08p9SQEACzYwktXmztagywAA1CGC6DIUCpn2bF6jPZvX6OWTY/r2I0f0tz8/pszZgv7imZ8oGQ3rsu6UtvemdHlPWjt60+ppS8qMcAoAmB/nnAYyOe2+dE3QpQAA6hBBdJnbuLpFX3z/Vn3hfVv0Nz96UPGuS3XgaEYH+oZ1xyNHlC++Iklqa4pqe2/aD6ZeQG1vYfEJAMDszhaliXxJnSn6CgDA+QiikOSNknY2h7T7ih598IoeSVKhVNYLA6M60DesA0eHdbAvo4de/IXKzntPdzqp7b0pbe/xAuplPSm1xPmVAgBIQzmvs+hYwTWiAIDzkRowp2g4pG3dKW3rTukT16yTJI3ninr2+IgOHB32AmrfsO59ekCSZCa9YXWLtvemtb0npe29aW3uXMHKvACwDA1ly5KktalkwJUAAOoRQRQXpDke0dUbVurqDSun9p0Zz+tA37AO+lN6975wQnc92SdJioVDelPXCi+Y9qS1vTelje0tLOUPAEvcUNYbEe1kRBQAMAuCKBZsZXNMe964Rnve6C1I4ZzTseGzOtiXmRo5vfvJPn37kSOSpNZ4RNu6U+eMnK5NJVgMCQCWkDN+EF2zgmtEAQDnI4ii6sxMPW1N6mlr0r+4bK0kqVR2evnkmJ7yrzU90DesP//pyyqUvD9U2lviU4sgbe9N6/LulNqaY0H+GACABRjKOa1sjikRDQddCgCgDhFEURPhkGlTR6s2dbTqI1f1SpJyxZKe6x/Vwb7hqYD6wPMn5PzFkNatavKCqT9quq0rpWSMP2gAoBEMZR0LFQEA5kQQRWDikbB29Hr3Kb1xl7dvNFvQ08cyOnA0o4N9w3ry8Bn98MDxqfekm6Jqb4lrVXPMe2yZflzVHFd7xXZLPMJ0XwAIyFDW6Q3dBFEAwOwIoqgrrYmorr2kXdde0j6178RoVgePZnSof0QnR3M6NZbT6bG8nhsY0emxvDJnC7OeKxYJqb05pvZWL7iu8gPq6orgOrnd1hxTNMzqvgBQLUO5MiOiAIA5EURR99a0JvTOLQm9c0vHrK/ni2WdGc97AXU8r1OjOZ0e98LqqTFv/8mxnJ4fGNXpsbzypfKs50k3RadGWs8ZZW2dHm1d1eI9MtoKAHPLFUsazUtrUwRRAMDsCKJoeLFISJ2phDrn8QePc04j2aJO+6H19FhOJ8e8x9NjeZ0ez+nU6PxHWyeD6eRo6/BAQSdbjirdFFNbU1TppqjSTTGlklFGXAEsGydGcpK4dQsAYG4EUSwrZqZUMqpUMqqNq1//+JmjrafHpqcGn/KD68zR1r9+4eCs52qNR5Tyw2mbH07bmmJTYTWdjKqtOapUcjLExrQiEVGEAAugwQyMZCVJHYyIAgDmQBAFXsOFjrb+6P69uuzKazQ0kdfwREFDE96o6tB4QcNnvX3DE3kNTRTUN3R26vXJlYJnsyIRmRphTU2OtCb98Fox6pquCLYrElGFQkwdBhCM/owXRJmaCwCYC0EUqBIzU1PU1LuySb0rm+b9vnLZaSRb8ELqWT+8+iF2Mrh6+wvKTOR1+NS4hifyGskWX6MWTY24ppLnjsKmm6JqTUTVGo+oJRFRi//YGo+oNRFVSyKipmiYIAvgog36QZTFigAAcyGIAgELhcwf3Yxd0PuKpbJGssWpEdbM2bw/8uqH14oR2VNjOb10YkzDEwWN5eYOsJPMpJbYuUG1JR5R6+R2PDoVXmeG2eljo2qJRxQm0ALLTn8mq3jYm9EBAMBs6CGABhUJh7SyOaaVzRceYMdyRY1mixrL+V/Zokb9x7FcYcZ2cer4/kz2nH3z0RQLzxpUW+LR6WA7I+i+dKakVX0ZJWNhNcfDaopGlIyFFYtwvSzQCAZHsmqLG6uLAwDmRBAFlplIOHRRI7AzlctO4/npIDuSnX4+litMB13/sTLYnhqd8MOtN0Jbnu0a2cd/en7tIfPCaSyiplhYyVjYf4youWK7KRZRMuqF2GTMm2o8eXxz3Htt6jj/PaxqDFTPwEhWbQlCKABgbgRRABclFDLvWtNEVEpd/HmcczpbKJ0zCvvTx57Upjdt1dlCSRN5/ytX1EShpLP5kibyxen9+aIyE3n1D09vT+RLyhVnv1/sXGLhUEWw9cLudLANKxmN+MHWG6FtioWViIaUiIYrvkJKVjyPR7znyVhYiUiIFZCxbAxkslrXxO87AGBuBFEAgTIzNcUiaopFtMbfN/TLsHZv7VzQeUtl5wfZoiZyXkg9Wzg3wE7kJ4PtbPu856fH8jqaL3r7/GCcv8CQOykSsnNC69RjxAurXnD19iej5wbdeCTkB9pzQ298xnHJinMCQSiXnQZHstrRxp8YAIC50UsAWJLCIfOvRY1IrdU9d7FU1kShpGyhpFyhrGyhpGyhrLP+vmyhpGyxPP3cfz1bKPnHlJUrlJQt+u/Ll7wpy2N55aaO8d9TLL3m7X1eS8Sk5IP3Ke6PzsYjIcUiIcUj/nZ0+vn0/pDifvCdPt7f9s8TC4fOOWc8GvL3Tb8vHgkrGuYaweXo1HhOxbJjai4A4DURRAHgAkXCIa0Ih7QiEV307+WcU75UVjZf9oPrLKG3UFau6I3kVobgF395WB1d3coVy8oVysqXvACcK3rHj+WKOjNentrOFbzn+eLCAvAkM2/K8/nhNnxO6P3ir23RxtUt1WkwBG4wk5MkgigA4DURRAGgjpmZP/IYVkoXFnz3Ro5r9+6tF/V9nXMqlp0fYktTAXUqtE6F2+kAO7l/6rip0Hv++yafj5wtXFR9qF9l57S9N63VyWzQpQAA6hhBFABwHjNTNGyKhkPe9GZgnrb3pvWD379Oe/fuDboUAEAdY0k7AAAAAEBNEUQBAAAAADVFEAUAAAAA1BRBFAAAAABQUwRRAAAAAEBNEUQBAAAAADVFEAUAAAAA1BRBFAAAAABQUwRRAAAAAEBNEUQBAAAAADVFEAUAAAAA1BRBFAAAAABQUwRRAAAAAEBNEUQBAAAAADVFEAUAAAAA1BRBFAAAAABQUwRRAAAAAEBNEUQBAAAAADVlzrlgvrHZSUlHqnS6dkmnqnSu5Yx2XDjasDpox+pYbu24zjm3OugiGhl9c92hDauDdqwO2rE6lls7ztk3BxZEq8nMfuacuyroOhod7bhwtGF10I7VQTsiSPz+LRxtWB20Y3XQjtVBO05jai4AAAAAoKYIogAAAACAmloqQfT2oAtYImjHhaMNq4N2rA7aEUHi92/haMPqoB2rg3asDtrRtySuEQUAAAAANI6lMiIKAAAAAGgQBFEAAAAAQE01dBA1sxvM7AUze8nMbgm6nkZkZr1m9qCZPWdmz5rZp4OuqZGZWdjMfm5mfx90LY3KzNJmdpeZPe//Xu4KuqZGZGaf9f9NP2Nm3zWzRNA1YXmgb144+ubqom9eOPrm6qBvPlfDBlEzC0u6TdJ7JG2R9DEz2xJsVQ2pKOk/OufeJGmnpN+nHRfk05KeC7qIBvdnkn7snNssabtozwtmZt2S/lDSVc65bZLCkn4z2KqwHNA3Vw19c3XRNy8cffMC0Tefr2GDqKSrJb3knHvZOZeX9D1Jvx5wTQ3HOdfvnNvvPx+V9z+W7mCrakxm1iPpvZK+EXQtjcrMVkh6u6Q/lyTnXN45NxxsVQ0rIilpZhFJTZKOB1wPlgf65iqgb64e+uaFo2+uKvrmCo0cRLslHa3Y7hP/k14QM1sv6QpJjwVbScP6uqSbJZWDLqSBbZR0UtJf+NOovmFmzUEX1Wicc8ckfU3Sq5L6JWWcc/8QbFVYJuibq4y+ecHomxeOvrkK6JvP18hB1GbZx71oLpKZtUi6W9JnnHMjQdfTaMzsfZJOOOeeDLqWBheR9GZJ/9s5d4WkcUlcY3aBzKxN3ijUBkldkprN7F8FWxWWCfrmKqJvXhj65qqhb64C+ubzNXIQ7ZPUW7Hdo2U+vH2xzCwqr6O70zl3T9D1NKjrJL3fzA7Lm4r2DjP7q2BLakh9kvqcc5Of/N8lr/PDhXmnpFeccyedcwVJ90i6NuCasDzQN1cJfXNV0DdXB31zddA3z9DIQfQJSZvMbIOZxeRd7Pt3AdfUcMzM5M35f84596dB19OonHO3Oud6nHPr5f0u/pNzbll/ynUxnHMDko6a2Rv9XddLOhRgSY3qVUk7zazJ/zd+vVhYArVB31wF9M3VQd9cHfTNVUPfPEMk6AIulnOuaGafknSfvFWnvumcezbgshrRdZJ+S9LTZvaUv+/zzrl7A6wJy9sfSLrT/yP2ZUm/E3A9Dcc595iZ3SVpv7zVN38u6fZgq8JyQN9cNfTNqDf0zQtE33w+c45LNwAAAAAAtdPIU3MBAAAAAA2IIAoAAAAAqCmCKAAAAACgpgiiAAAAAICaIogCAAAAAGqKIApUgZnt8x/Xm9nHq3zuz8/2vQAAwNzom4H6xu1bgCoys92SPuece98FvCfsnCu9xutjzrmWatQHAMByQ98M1CdGRIEqMLMx/+lXJL3NzJ4ys8+aWdjMvmpmT5jZQTP79/7xu83sQTP7jqSn/X3fN7MnzexZM/ukv+8rkpL++e6s/F7m+aqZPWNmT5vZRyvOvdfM7jKz583sTjOzyfOZ2SG/lq/Vso0AAKgl+magvkWCLgBYYm5RxaeufqeVcc69xczikh42s3/wj71a0jbn3Cv+9r92zp0xs6SkJ8zsbufcLWb2Kefcjlm+14ck7ZC0XVK7/56H/NeukLRV0nFJD0u6zswOSfqgpM3OOWdm6ar/9AAA1B/6ZqAOMSIKLK53S7rRzJ6S9JikVZI2+a89XtHRSdIfmtkBSY9K6q04bi5vlfRd51zJOTco6Z8lvaXi3H3OubKkpyStlzQiKSvpG2b2IUkTC/7pAABoPPTNQB0giAKLyyT9gXNuh/+1wTk3+anr+NRB3vUr75S0yzm3XdLPJSXmce655CqelyRFnHNFeZ/03i3pA5J+fEE/CQAASwN9M1AHCKJAdY1Kaq3Yvk/S75lZVJLM7FIza57lfSlJQ865CTPbLGlnxWuFyffP8JCkj/rXuqyW9HZJj89VmJm1SEo55+6V9Bl5U4cAAFjq6JuBOsQ1okB1HZRU9KfxfEvSn8mberPfX5TgpLxPPGf6saTfNbODkl6QNwVo0u2SDprZfufcJyr2/62kXZIOSHKSbnbODfid5WxaJf3AzBLyPrH97MX9iAAANBT6ZqAOcfsWAAAAAEBNMTUXAAAAAFBTBFEAAAAAQE0RRAEAAAAANUUQBQAAAADUFEEUAAAAAFBTBFEAAAAAQE0RRAEAAAAANfX/AW7g0rreYriCAAAAAElFTkSuQmCC\n", "text/plain": [ "<Figure size 1152x576 with 2 Axes>" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Plot the loss values and accuracy\n" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "lZrhOVE3-LDM" }, "source": [ "**Higher number of iterations and lower learning rate seems to improve accuracy**\n" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "#import plugins and modlues\n", "import pandas as pd\n", "import numpy as np\n", "from sklearn.neighbors import KNeighborsClassifier\n", "from sklearn.tree import DecisionTreeClassifier\n", "from sklearn.model_selection import train_test_split\n", "from sklearn import metrics\n" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "#loading the dataset\n", "data = pd.read_csv('diabetes.csv')" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "#separating features and target\n", "features = data[['Pregnancies', 'Glucose', 'BloodPressure', 'SkinThickness', 'Insulin', 'BMI', 'DiabetesPedigreeFunction', 'Age']]\n", "target = data['Outcome']\n" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "#splitting training and testing data in the ratio 70 : 30 respectively\n", "x_train, x_test, y_train, y_test = train_test_split(features, target, random_state=0, test_size=0.3)" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "#KNN model\n", "modelKNN = KNeighborsClassifier()" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "KNeighborsClassifier()" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#train the model\n", "modelKNN.fit(x_train, y_train)" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "#predict test set\n", "y_pred_knn = modelKNN.predict(x_test)" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.7489177489177489\n" ] } ], "source": [ "#print accuracy of the KNN model\n", "print(modelKNN.score(x_test,y_test))" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[134 23]\n", " [ 35 39]]\n" ] } ], "source": [ "#print Confusion matrix\n", "print(metrics.confusion_matrix(y_test, y_pred_knn))" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " precision recall f1-score support\n", "\n", " 0 0.79 0.85 0.82 157\n", " 1 0.63 0.53 0.57 74\n", "\n", " accuracy 0.75 231\n", " macro avg 0.71 0.69 0.70 231\n", "weighted avg 0.74 0.75 0.74 231\n", "\n" ] } ], "source": [ "#print Classification Report for determining precision, recall, f1-score and support of the model\n", "print(metrics.classification_report(y_test, y_pred_knn))" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [], "source": [ "#decision Tree model\n", "modelDT = DecisionTreeClassifier()" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "DecisionTreeClassifier()" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#train the model\n", "modelDT.fit(x_train, y_train)" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [], "source": [ "#predict test set\n", "y_pred_dt = modelDT.predict(x_test)" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.7316017316017316\n" ] } ], "source": [ "#print accuracy of the Decision Tree model\n", "print(modelDT.score(x_test,y_test))" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[123 34]\n", " [ 28 46]]\n" ] } ], "source": [ "#print Confusion matrix\n", "print(metrics.confusion_matrix(y_test, y_pred_dt))" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " precision recall f1-score support\n", "\n", " 0 0.81 0.78 0.80 157\n", " 1 0.57 0.62 0.60 74\n", "\n", " accuracy 0.73 231\n", " macro avg 0.69 0.70 0.70 231\n", "weighted avg 0.74 0.73 0.73 231\n", "\n" ] } ], "source": [ "#print Classification Report for determining precision, recall, f1-score and support of the model\n", "print(metrics.classification_report(y_test, y_pred_dt))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [] } ], "metadata": { "colab": { "collapsed_sections": [], "name": "Backprop_Test.ipynb", "provenance": [] }, "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.5" } }, "nbformat": 4, "nbformat_minor": 1 }