Skip to content

Instantly share code, notes, and snippets.

@dcshapiro
Created June 27, 2021 07:23
Show Gist options
  • Save dcshapiro/54d649a6a2c3e6739cc0fc9919552f34 to your computer and use it in GitHub Desktop.
Save dcshapiro/54d649a6a2c3e6739cc0fc9919552f34 to your computer and use it in GitHub Desktop.
The Nuclear Mousetrap.ipynb
Display the source blob
Display the rendered blob
Raw
{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"name": "The Nuclear Mousetrap.ipynb",
"provenance": [],
"collapsed_sections": [],
"toc_visible": true,
"authorship_tag": "ABX9TyN5e0HM3diC7mvDuS6qR45i",
"include_colab_link": true
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3"
},
"language_info": {
"name": "python"
}
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "view-in-github",
"colab_type": "text"
},
"source": [
"<a href=\"https://colab.research.google.com/gist/dcshapiro/54d649a6a2c3e6739cc0fc9919552f34/the-nuclear-mousetrap.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "X9WsD3wJ4sWA"
},
"source": [
"# Recognizing 0s with lightning speed"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "WE_g8Uqd46bP"
},
"source": [
"Install dependencies"
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "c501IqTWlVtt",
"outputId": "f0114288-fc7f-420e-e821-a400c489b0ef"
},
"source": [
"import sys\n",
"!{sys.executable} -m pip install icecream"
],
"execution_count": 1,
"outputs": [
{
"output_type": "stream",
"text": [
"Requirement already satisfied: icecream in /usr/local/lib/python3.7/dist-packages (2.1.1)\n",
"Requirement already satisfied: asttokens>=2.0.1 in /usr/local/lib/python3.7/dist-packages (from icecream) (2.0.5)\n",
"Requirement already satisfied: colorama>=0.3.9 in /usr/local/lib/python3.7/dist-packages (from icecream) (0.4.4)\n",
"Requirement already satisfied: pygments>=2.2.0 in /usr/local/lib/python3.7/dist-packages (from icecream) (2.6.1)\n",
"Requirement already satisfied: executing>=0.3.1 in /usr/local/lib/python3.7/dist-packages (from icecream) (0.6.0)\n",
"Requirement already satisfied: six in /usr/local/lib/python3.7/dist-packages (from asttokens>=2.0.1->icecream) (1.15.0)\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "uK8NWDHm8ods"
},
"source": [
"Remember to restart the notebook after the installs"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "-a1tApGh7t8m"
},
"source": [
"Models with the best MNIST performance can be found here: https://paperswithcode.com/sota/image-classification-on-mnist\n",
"\n",
"Unfortunately they are expensive computationally and have an annoyingly long latency. What can we do to get a fast and cheap solution for recognizing 0s?\n",
"\n",
"First, let's recall that DIMENSIONALITY REDUCTION IS EXPENSIVE (TO COMPUTE) but DELETEING DIMENSIONS IS FREE!!\n",
"\n",
"Let's use a bunch of techniques to delete parts of the MNIST image."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "0Iuz-mFy5kJb"
},
"source": [
"# Imports and Helper Functions"
]
},
{
"cell_type": "code",
"metadata": {
"id": "UPhhTkJZuSN0"
},
"source": [
"from keras.datasets import mnist\n",
"import numpy as np\n",
"from icecream import ic\n",
"from sklearn.tree import DecisionTreeClassifier\n",
"from sklearn.metrics import classification_report\n",
"import pandas as pd\n",
"import time\n",
"\n",
"# Adapted from https://stackoverflow.com/questions/36370956/how-to-combine-dimensions-in-numpy-array/46924437\n",
"def combine_dims(a, start=0, count=2):\n",
" \"\"\" Reshapes numpy array a by combining count dimensions, \n",
" starting at dimension index start \"\"\"\n",
" s = a.shape\n",
" return np.reshape(a, s[:start] + (-1,) + s[start+count:])\n",
"\n",
"def downsample(arrayIn,skipBy=2):\n",
" skipRowsAndCols = arrayIn[:,0:arrayIn.size:skipBy]\n",
" return skipRowsAndCols[:,10:-10:1]>0\n",
"\n",
"def killRareTrainFeatures(arrayIn):\n",
" featureCount = np.sum(arrayIn,axis=0)\n",
" rareFeatures = np.where(featureCount<20)[0]\n",
" return np.delete(arrayIn, rareFeatures, axis=1),rareFeatures\n",
"\n",
"def killFeatures(arrayIn,features):\n",
" return np.delete(arrayIn, features, axis=1)\n",
"\n",
"# Fit a decision tree to the data\n",
"def fitModelToData(X_train,y_train):\n",
" # Check the final dimensions\n",
" ic(X_train.shape, y_train.shape)\n",
"\n",
" # Fit the model on the data\n",
" clf = DecisionTreeClassifier(random_state=123)\n",
" clf.fit(X_train,y_train)\n",
" return clf\n",
"\n",
"# Check the fit on the test data\n",
"def inferenceOnTestData(clf,X_test,y_true,negativeLabel,positiveLabel):\n",
" iterations=100\n",
" timeStart=time.process_time() \n",
" for _ in range(iterations):\n",
" y_pred = clf.predict(X_test)\n",
" loopTime=time.process_time()-timeStart\n",
" print(classification_report(y_true, y_pred, target_names=[negativeLabel,positiveLabel]))\n",
" # AVERAGE MILLISECONDS FOR 100 RUNS (numbers cancel nicely but I'm leaving in division for readability)\n",
" return 1000*(loopTime/iterations)\n",
"\n",
"def checkCorrWithTarget(X_train,y_train):\n",
" featuresToDelete=[]\n",
" for feature in range(X_train.shape[1]):\n",
" featureWithTarget=np.hstack((X_train[:,feature][:,np.newaxis],y_train[:,np.newaxis]))\n",
" featureCorrelationWithTarget=pd.DataFrame(featureWithTarget).corr()[0][1]\n",
" if abs(featureCorrelationWithTarget)<.01:\n",
" featuresToDelete.append(feature)\n",
" return featuresToDelete\n",
"\n",
"def checkInternalCorr(X_train):\n",
" duplicateFeatures=set()\n",
" for start in range(5):\n",
" stop=start+1\n",
" corr_mx = pd.DataFrame(X_train)[list(range(50*start,50*stop))].corr()>.8\n",
" identity = np.identity(corr_mx.shape[0])\n",
" corr_mx = corr_mx - identity\n",
" features = np.where(corr_mx > 0)\n",
" feature_start_range=50*start\n",
" firstFeature=features[0]+feature_start_range\n",
" secondFeature=features[1]+feature_start_range\n",
" for i,item in enumerate(firstFeature):\n",
" ic(sorted([firstFeature[i],secondFeature[i]]))\n",
" oneOfThePairOfFeatures=sorted([firstFeature[i],secondFeature[i]])[0]\n",
" duplicateFeatures.add(oneOfThePairOfFeatures)\n",
" return list(duplicateFeatures)"
],
"execution_count": 2,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "P_bNYd6Y6sox",
"outputId": "be94388d-6421-4a38-cd1c-183431523569"
},
"source": [
"# load MNIST dataset\n",
"(X_train_original, y_train), (X_test_original, y_test) = mnist.load_data()\n",
"\n",
"# Check initial shapes\n",
"ic(X_train_original.shape, y_train.shape, X_test_original.shape, y_test.shape)\n",
"\n",
"X_train = X_train_original\n",
"X_test = X_test_original"
],
"execution_count": 3,
"outputs": [
{
"output_type": "stream",
"text": [
"ic| X_train_original.shape: (60000, 28, 28)\n",
" y_train.shape: (60000,)\n",
" X_test_original.shape: (10000, 28, 28)\n",
" y_test.shape: (10000,)\n"
],
"name": "stderr"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Nzbu5w2aqIMu"
},
"source": [
"# Let's look at the digits"
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 778
},
"id": "9b4LLpqjpUwh",
"outputId": "752128f0-37db-44bd-e551-003d9d63b8a2"
},
"source": [
"import matplotlib.pyplot as plt\n",
"for i in range (3):\n",
" plt.imshow(X_train_original[i], cmap=plt.get_cmap('gray'))\n",
" plt.show()\n",
"print(\"ORIGINAL FEATURES (floats) {}\".format(28*28))"
],
"execution_count": 4,
"outputs": [
{
"output_type": "display_data",
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"tags": [],
"needs_background": "light"
}
},
{
"output_type": "display_data",
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"tags": [],
"needs_background": "light"
}
},
{
"output_type": "display_data",
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"tags": [],
"needs_background": "light"
}
},
{
"output_type": "stream",
"text": [
"ORIGINAL FEATURES (floats) 784\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "uGcCnANLIHmJ"
},
"source": [
"# Now Let's Fit A Model to the Data"
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "Gwzp1M3bjpDv",
"outputId": "8ef7eb9b-b6d0-4781-b996-a96a10e252dd"
},
"source": [
"# convert labels into \"0\"/\"not 0\" label\n",
"y_test = y_test == 0\n",
"y_train = y_train == 0\n",
"\n",
"#flatten X arrays\n",
"ic(X_train.shape)\n",
"X_train = combine_dims(X_train_original, start=1, count=2)\n",
"X_test = combine_dims(X_test_original, start=1, count=2)\n",
"\n",
"# Fit a decision tree to the data\n",
"clf_NO_EFFORT = fitModelToData(X_train,y_train)\n",
"inferenceOnTestData(clf_NO_EFFORT,X_test,y_test,\"Not 0\",\"Was 0\")"
],
"execution_count": 5,
"outputs": [
{
"output_type": "stream",
"text": [
"ic| X_train.shape: (60000, 28, 28)\n",
"ic| X_train.shape: (60000, 784), y_train.shape: (60000,)\n"
],
"name": "stderr"
},
{
"output_type": "stream",
"text": [
" precision recall f1-score support\n",
"\n",
" Not 0 0.99 0.99 0.99 9020\n",
" Was 0 0.92 0.94 0.93 980\n",
"\n",
" accuracy 0.99 10000\n",
" macro avg 0.96 0.97 0.96 10000\n",
"weighted avg 0.99 0.99 0.99 10000\n",
"\n"
],
"name": "stdout"
},
{
"output_type": "execute_result",
"data": {
"text/plain": [
"12.983290150000002"
]
},
"metadata": {
"tags": []
},
"execution_count": 5
}
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "1WzTW-cT8OhG",
"outputId": "268a5261-e12a-430e-e28d-c9b65c7d5c25"
},
"source": [
"# Downsample X arrays\n",
"ic(X_train.shape)\n",
"\n",
"X_train = downsample(X_train)\n",
"X_test = downsample(X_test)\n",
"\n",
"# kill array indices that have few samples in them (can only peek at training data)\n",
"ic(X_train.shape,\"before low diversity cull\")\n",
"X_train,featuresToKill = killRareTrainFeatures(X_train)\n",
"X_test = killFeatures( X_test,featuresToKill)\n",
"\n",
"# What cols have no correlation with the target? (Can I just delete them?)\n",
"ic(X_train.shape)\n",
"\n",
"featuresToDelete = checkCorrWithTarget(X_train,y_train)\n",
"\n",
"X_train = killFeatures(X_train,featuresToDelete)\n",
"X_test = killFeatures(X_test, featuresToDelete)\n",
"\n",
"# What cols have high internal correlation? (Are they redundant?)\n",
"ic(X_train.shape,\"after low correlation\")\n",
"\n",
"morefeaturesToDelete = checkInternalCorr(X_train)\n",
"\n",
"X_train = killFeatures(X_train,morefeaturesToDelete)\n",
"X_test = killFeatures(X_test, morefeaturesToDelete)\n",
"\n",
"# Check the final dimensions\n",
"ic(X_train.shape, y_train.shape, X_test.shape, y_test.shape)\n",
"\n",
"# Fit a decision tree to the data\n",
"clf_MEDIUM_EFFORT = fitModelToData(X_train,y_train)\n",
"inferenceOnTestData(clf_MEDIUM_EFFORT,X_test,y_test,\"Not 0\",\"Was 0\")"
],
"execution_count": 6,
"outputs": [
{
"output_type": "stream",
"text": [
"ic| X_train.shape: (60000, 784)\n",
"ic| X_train.shape: (60000, 372), 'before low diversity cull'\n",
"ic| X_train.shape: (60000, 314)\n",
"ic| X_train.shape: (60000, 281), 'after low correlation'\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [75, 87]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [76, 88]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [75, 87]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [76, 88]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [101, 114]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [101, 114]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [119, 129]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [120, 130]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [126, 137]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [127, 138]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [119, 129]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [129, 140]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [120, 130]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [130, 141]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [126, 137]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [137, 148]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [127, 138]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [138, 149]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [129, 140]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [130, 141]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [137, 148]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [138, 149]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [151, 162]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [157, 168]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [158, 169]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [159, 170]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [151, 162]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [162, 174]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [157, 168]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [168, 181]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [158, 169]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [169, 182]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [159, 170]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [173, 186]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [162, 174]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [174, 187]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [168, 181]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [181, 193]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [169, 182]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [182, 194]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [173, 186]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [186, 198]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [174, 187]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [187, 199]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [181, 193]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [182, 194]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [186, 198]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [187, 199]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [210, 222]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [211, 223]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [210, 222]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [211, 223]\n",
"ic| X_train.shape: (60000, 255)\n",
" y_train.shape: (60000,)\n",
" X_test.shape: (10000, 255)\n",
" y_test.shape: (10000,)\n",
"ic| X_train.shape: (60000, 255), y_train.shape: (60000,)\n"
],
"name": "stderr"
},
{
"output_type": "stream",
"text": [
" precision recall f1-score support\n",
"\n",
" Not 0 0.99 0.99 0.99 9020\n",
" Was 0 0.92 0.95 0.94 980\n",
"\n",
" accuracy 0.99 10000\n",
" macro avg 0.96 0.97 0.96 10000\n",
"weighted avg 0.99 0.99 0.99 10000\n",
"\n"
],
"name": "stdout"
},
{
"output_type": "execute_result",
"data": {
"text/plain": [
"4.563005440000012"
]
},
"metadata": {
"tags": []
},
"execution_count": 6
}
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "Y_Y4SeAuHbp1",
"outputId": "8999023e-e2a1-4783-9405-95956d14e136"
},
"source": [
"allFeatureIds = np.array(list(range(X_train.shape[1])))\n",
"randomFeatures = np.random.choice(allFeatureIds,size=int(X_train.shape[1]*.5),replace=False)\n",
"\n",
"X_train_tiny = killFeatures(X_train,randomFeatures)\n",
"X_test_tiny = killFeatures(X_test, randomFeatures)\n",
"\n",
"ic(X_train_tiny.shape)\n",
"\n",
"# Fit a decision tree to the data\n",
"clf_TINY = fitModelToData(X_train_tiny,y_train)\n",
"inferenceOnTestData(clf_TINY,X_test_tiny,y_test,\"Not 0\",\"Was 0\")"
],
"execution_count": 7,
"outputs": [
{
"output_type": "stream",
"text": [
"ic| X_train_tiny.shape: (60000, 128)\n",
"ic| X_train.shape: (60000, 128), y_train.shape: (60000,)\n"
],
"name": "stderr"
},
{
"output_type": "stream",
"text": [
" precision recall f1-score support\n",
"\n",
" Not 0 0.99 0.99 0.99 9020\n",
" Was 0 0.92 0.95 0.94 980\n",
"\n",
" accuracy 0.99 10000\n",
" macro avg 0.96 0.97 0.96 10000\n",
"weighted avg 0.99 0.99 0.99 10000\n",
"\n"
],
"name": "stdout"
},
{
"output_type": "execute_result",
"data": {
"text/plain": [
"2.4697335599999803"
]
},
"metadata": {
"tags": []
},
"execution_count": 7
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "9qDUFipW6XkJ"
},
"source": [
"# Fashion MNIST: Sandal Finder"
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "F0XYV2p96c1L",
"outputId": "87eec461-e5e2-4bb6-9246-2adee96fe704"
},
"source": [
"from keras.datasets import fashion_mnist\n",
"(X_train_original, y_train), (X_test_original, y_test) = fashion_mnist.load_data()\n",
"\n",
"# Check initial shapes\n",
"ic(X_train_original.shape, y_train.shape, X_test_original.shape, y_test.shape)\n",
"\n",
"X_train = X_train_original\n",
"X_test = X_test_original"
],
"execution_count": 8,
"outputs": [
{
"output_type": "stream",
"text": [
"ic| X_train_original.shape: (60000, 28, 28)\n",
" y_train.shape: (60000,)\n",
" X_test_original.shape: (10000, 28, 28)\n",
" y_test.shape: (10000,)\n"
],
"name": "stderr"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "nawX0s6BPDmZ"
},
"source": [
"# Let's have a look at the Fashion MNIST images"
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 1000
},
"id": "DBsLzMuB8FFV",
"outputId": "266af3b9-0fff-4222-81a1-2b9b4ef36615"
},
"source": [
"import matplotlib.pyplot as plt\n",
"for i in range (10,15):\n",
" print(y_train[i])\n",
" plt.imshow(X_train_original[i], cmap=plt.get_cmap('gray'))\n",
" plt.show()\n",
"print(\"ORIGINAL FEATURES (floats) {}\".format(28*28))"
],
"execution_count": 9,
"outputs": [
{
"output_type": "stream",
"text": [
"0\n"
],
"name": "stdout"
},
{
"output_type": "display_data",
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAPsAAAD4CAYAAAAq5pAIAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAR/ElEQVR4nO3dXWxV55UG4HcFMAFswI5/MD8TPASI0ChjRhb5IYlCmkEpN4QbVC4qqjTjRmmVNunFoMxFczNSNJqW9GJE5E6i0hGTqlKbhotkVAZVQiRSFYNoIGGGZAiEHxsDJsGGAAHWXHinchLvtczZ+5y9zXofybJ9lrf352NezvFZ+/s+UVUQ0c3vlqIHQES1wbATBcGwEwXBsBMFwbATBTG5licTkZvypf9bbrH/z5w7d65Zr6+vN+tnz54166dPnzbrE1VjY6NZb25uNuuffvppam1gYKCiMU0Eqipj3Z4p7CLyKICfA5gE4N9V9YUs32+imjZtmll/9tlnzfp9991n1rdu3WrWt2zZYtYnqkceecSsP/HEE2b9zTffTK29+OKLFY1pIqv4abyITALwbwC+CWAZgA0isiyvgRFRvrL8zb4CwIeqelhVrwD4NYC1+QyLiPKWJezzABwb9fnx5LYvEZFuEekVkd4M5yKijKr+Ap2q9gDoAW7eF+iIJoIsj+wnACwY9fn85DYiKqEsYX8HwGIR6RCROgDfArA9n2ERUd4ky6w3EVkD4EWMtN5eUdV/dr5+wj6Nf+mll1JrDz74oHnspEmTzPqpU6fM+rJldpPjzJkzqbVjx46l1gDg0KFDZv38+fNmvampyaxbbcW6ujrz2JkzZ5r1kydPmnXr+gXvfunu7jbrhw8fNutFqkqfXVXfAPBGlu9BRLXBy2WJgmDYiYJg2ImCYNiJgmDYiYJg2ImCyNRnv+GTlbjPvmrVKrO+adOm1Jo337yhocGse/PhvSm0LS0tqbXp06ebx/b395v1PXv2mPWuri6zfuutt6bWrPnmgH/9QWtrq1kfHBxMrc2ePds8dmhoyKyvW7fOrBcprc/OR3aiIBh2oiAYdqIgGHaiIBh2oiAYdqIgarqUdJmtXr3arB85ciS1NnXqVPPYq1evmvXJk+1fgzWF1fv+ImN2Yf7Cm37rTa+9dOmSWb9w4UJqzWtvzZv3tVXOvuTixYtm3Wppnjhhr7PiTa9duXKlWX/rrbfMehH4yE4UBMNOFATDThQEw04UBMNOFATDThQEw04UBPvsCW9bZWtJZa/P/vnnn5t1r9ftff/Lly+n1qw+NwBMmTLFrHt9+mvXrpl1q1/tTb/1+uhen96avu1NK/amfj/wwANmnX12IioMw04UBMNOFATDThQEw04UBMNOFATDThREmD6711f15i9byx57SyJbyymPhzff3atbvD77lStXMh1v3e/euL3fmXfuzz77zKxbrl+/btaXLFlS8fcuSqawi8gRAEMArgG4qqr2IuJEVJg8HtlXqaq9lAoRFY5/sxMFkTXsCuAPIrJHRLrH+gIR6RaRXhHpzXguIsog69P4+1X1hIi0AtghIv+jqrtGf4Gq9gDoAcq91xvRzS7TI7uqnkjeDwB4DcCKPAZFRPmrOOwiMkNEGr74GMBqAAfyGhgR5SvL0/g2AK8l850nA/hPVf2vXEZVBR0dHWY9y7bJXp/93LlzZt3rN992221m3Vo33psL781X964R8I635vJ7P7f3vb1euFX35sp7vDXty6jisKvqYQB/m+NYiKiK2HojCoJhJwqCYScKgmEnCoJhJwoizBTXOXPmmHVrOWbAbuN4LaKjR4+adW8p6eHhYbNunX/GjBnmsd520l57y1sm22qvee0v79ze76y/vz+15i1j3dDQYNbPnj1r1ltaWsz66dOnzXo18JGdKAiGnSgIhp0oCIadKAiGnSgIhp0oCIadKIgwffbm5maz3tfXZ9ZnzZqVWvO27922bZtZP3nypFlvb28369Y0Vm85Za9P7m1d7G3ZbC1F7S0F7Y1tYGDArN9zzz2pNa+Hf/DgQbPuLT2+dOlSs84+OxFVDcNOFATDThQEw04UBMNOFATDThQEw04URJg+uze/uL6+3qyvWrUqteb18Lu67M1td+3aZdbvuusus/7JJ5+k1rx+sreEttfrrqurM+vWXH1vmeqmpiaz/vHHH5t1a7783XffbR7rje3YsWNmvbOz06zv3r3brFcDH9mJgmDYiYJg2ImCYNiJgmDYiYJg2ImCYNiJghBvvnKuJxOp3clu0O23327WN2/enFp7+umnzWMff/xxs+5t/+utYX7+/PnUmtcH93h9eG/NfGtdem9N+7a2NrPuzaVfv359au2ZZ54xj50/f75Zf/LJJ826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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"tags": [],
"needs_background": "light"
}
},
{
"output_type": "stream",
"text": [
"9\n"
],
"name": "stdout"
},
{
"output_type": "display_data",
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"tags": [],
"needs_background": "light"
}
},
{
"output_type": "stream",
"text": [
"5\n"
],
"name": "stdout"
},
{
"output_type": "display_data",
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"tags": [],
"needs_background": "light"
}
},
{
"output_type": "stream",
"text": [
"5\n"
],
"name": "stdout"
},
{
"output_type": "display_data",
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"tags": [],
"needs_background": "light"
}
},
{
"output_type": "stream",
"text": [
"7\n"
],
"name": "stdout"
},
{
"output_type": "display_data",
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"tags": [],
"needs_background": "light"
}
},
{
"output_type": "stream",
"text": [
"ORIGINAL FEATURES (floats) 784\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "U60BhB1MPPsB"
},
"source": [
"# Let's Find Sandals!"
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "yErg2h_I6_sG",
"outputId": "87ee372a-19fd-4dbd-a1fe-79f8d723cf17"
},
"source": [
"# convert labels into \"Sandal\"/\"not Sandal\" label\n",
"y_test = y_test == 5\n",
"y_train = y_train == 5\n",
"\n",
"#flatten X arrays\n",
"ic(X_train.shape)\n",
"X_train = combine_dims(X_train_original, start=1, count=2)\n",
"X_test = combine_dims(X_test_original, start=1, count=2)\n",
"\n",
"# Fit a decision tree to the data\n",
"clf_NO_EFFORT_FASHION = fitModelToData(X_train,y_train)\n",
"inferenceOnTestData(clf_NO_EFFORT_FASHION,X_test,y_test,\"Not Sandal\",\"Sandal\")"
],
"execution_count": 10,
"outputs": [
{
"output_type": "stream",
"text": [
"ic| X_train.shape: (60000, 28, 28)\n",
"ic| X_train.shape: (60000, 784), y_train.shape: (60000,)\n"
],
"name": "stderr"
},
{
"output_type": "stream",
"text": [
" precision recall f1-score support\n",
"\n",
" Not Sandal 0.99 0.99 0.99 9000\n",
" Sandal 0.89 0.89 0.89 1000\n",
"\n",
" accuracy 0.98 10000\n",
" macro avg 0.94 0.94 0.94 10000\n",
"weighted avg 0.98 0.98 0.98 10000\n",
"\n"
],
"name": "stdout"
},
{
"output_type": "execute_result",
"data": {
"text/plain": [
"16.082620600000013"
]
},
"metadata": {
"tags": []
},
"execution_count": 10
}
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "7wKQM0h88T3G",
"outputId": "7152cbd0-d51c-4272-9baf-b2ca93878758"
},
"source": [
"# Downsample X arrays\n",
"ic(X_train.shape)\n",
"\n",
"X_train = downsample(X_train)\n",
"X_test = downsample(X_test)\n",
"\n",
"# kill array indices that have few samples in them (can only peek at training data)\n",
"ic(X_train.shape,\"before low diversity cull\")\n",
"X_train,featuresToKill = killRareTrainFeatures(X_train)\n",
"X_test = killFeatures( X_test,featuresToKill)\n",
"\n",
"# What cols have no correlation with the target? (Can I just delete them?)\n",
"ic(X_train.shape)\n",
"\n",
"featuresToDelete = checkCorrWithTarget(X_train,y_train)\n",
"\n",
"X_train = killFeatures(X_train,featuresToDelete)\n",
"X_test = killFeatures(X_test, featuresToDelete)\n",
"\n",
"# What cols have high internal correlation? (Are they redundant?)\n",
"ic(X_train.shape,\"after low correlation\")\n",
"morefeaturesToDelete = checkInternalCorr(X_train)\n",
"\n",
"X_train = killFeatures(X_train,morefeaturesToDelete)\n",
"X_test = killFeatures(X_test, morefeaturesToDelete)"
],
"execution_count": 11,
"outputs": [
{
"output_type": "stream",
"text": [
"ic| X_train.shape: (60000, 784)\n",
"ic| X_train.shape: (60000, 372), 'before low diversity cull'\n",
"ic| X_train.shape: (60000, 372)\n",
"ic| X_train.shape: (60000, 365), 'after low correlation'\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [10, 11]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [10, 12]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [10, 22]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [10, 23]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [10, 24]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [10, 25]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [10, 36]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [10, 37]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [10, 11]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [11, 12]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [11, 22]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [11, 23]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [11, 24]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [11, 25]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [11, 36]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [10, 12]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [11, 12]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [12, 22]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [12, 23]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [12, 24]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [12, 25]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [12, 36]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [12, 37]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [12, 38]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [10, 22]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [11, 22]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [12, 22]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [22, 23]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [22, 24]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [22, 25]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [22, 26]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [22, 36]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [22, 37]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [10, 23]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [11, 23]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [12, 23]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [22, 23]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [23, 24]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [23, 25]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [23, 36]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [23, 37]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [23, 38]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [23, 39]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [10, 24]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [11, 24]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [12, 24]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [22, 24]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [23, 24]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [24, 25]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [24, 36]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [24, 37]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [24, 38]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [24, 39]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [10, 25]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [11, 25]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [12, 25]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [22, 25]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [23, 25]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [24, 25]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [25, 36]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [25, 37]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [25, 38]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [25, 39]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [22, 26]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [26, 40]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [35, 49]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [10, 36]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [11, 36]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [12, 36]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [22, 36]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [23, 36]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [24, 36]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [25, 36]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [36, 37]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [36, 38]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [36, 40]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [10, 37]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [12, 37]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [22, 37]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [23, 37]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [24, 37]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [25, 37]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [36, 37]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [37, 38]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [37, 39]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [12, 38]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [23, 38]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [24, 38]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [25, 38]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [36, 38]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [37, 38]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [38, 39]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [23, 39]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [24, 39]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [25, 39]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [37, 39]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [38, 39]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [39, 40]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [26, 40]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [36, 40]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [39, 40]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [35, 49]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [50, 51]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [50, 64]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [50, 78]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [50, 51]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [51, 52]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [51, 53]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [51, 65]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [51, 52]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [52, 53]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [52, 66]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [51, 53]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [52, 53]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [53, 67]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [54, 68]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [55, 69]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [62, 76]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [62, 90]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [63, 77]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [63, 91]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [50, 64]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [64, 78]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [64, 92]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [51, 65]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [65, 66]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [65, 79]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [52, 66]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [65, 66]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [66, 67]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [66, 80]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [53, 67]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [66, 67]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [54, 68]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [55, 69]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [69, 83]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [75, 89]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [62, 76]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [76, 90]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [63, 77]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [77, 91]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [50, 78]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [64, 78]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [78, 92]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [65, 79]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [79, 93]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [66, 80]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [69, 83]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [83, 97]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [84, 98]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [75, 89]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [62, 90]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [76, 90]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [63, 91]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [77, 91]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [64, 92]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [78, 92]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [79, 93]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [83, 97]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [84, 98]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [103, 117]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [104, 118]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [104, 132]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [105, 119]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [103, 117]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [117, 131]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [104, 118]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [118, 132]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [105, 119]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [119, 133]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [117, 131]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [104, 132]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [118, 132]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [132, 146]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [119, 133]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [132, 146]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [155, 169]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [156, 170]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [156, 184]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [167, 181]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [168, 182]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [155, 169]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [169, 183]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [169, 197]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [156, 170]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [170, 184]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [170, 198]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [167, 181]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [181, 195]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [168, 182]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [182, 196]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [169, 183]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [183, 197]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [156, 184]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [170, 184]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [184, 198]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [181, 195]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [182, 196]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [169, 197]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [183, 197]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [170, 198]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [184, 198]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [208, 222]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [209, 223]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [209, 235]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [210, 224]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [210, 236]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [211, 225]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [211, 237]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [208, 222]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [209, 223]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [223, 235]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [223, 249]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [210, 224]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [224, 236]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [211, 225]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [225, 237]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [209, 235]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [223, 235]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [235, 249]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [210, 236]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [224, 236]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [211, 237]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [225, 237]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [223, 249]\n",
"ic| sorted([firstFeature[i],secondFeature[i]]): [235, 249]\n"
],
"name": "stderr"
}
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "eba0mIbu81F9",
"outputId": "2144802e-0d23-448b-8c66-cd9feb7063d5"
},
"source": [
"# Fit a decision tree to the data\n",
"clf_MEDIUM_EFFORT_FASHION = fitModelToData(X_train,y_train)\n",
"inferenceOnTestData(clf_MEDIUM_EFFORT_FASHION,X_test,y_test,\"Not Sandal\",\"Sandal\")"
],
"execution_count": 12,
"outputs": [
{
"output_type": "stream",
"text": [
"ic| X_train.shape: (60000, 308), y_train.shape: (60000,)\n"
],
"name": "stderr"
},
{
"output_type": "stream",
"text": [
" precision recall f1-score support\n",
"\n",
" Not Sandal 0.99 0.98 0.99 9000\n",
" Sandal 0.87 0.88 0.87 1000\n",
"\n",
" accuracy 0.97 10000\n",
" macro avg 0.93 0.93 0.93 10000\n",
"weighted avg 0.97 0.97 0.97 10000\n",
"\n"
],
"name": "stdout"
},
{
"output_type": "execute_result",
"data": {
"text/plain": [
"6.164624629999906"
]
},
"metadata": {
"tags": []
},
"execution_count": 12
}
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "Gsd6pNms81SC",
"outputId": "b75821de-0584-492d-d27d-8744939a4eac"
},
"source": [
"allFeatureIds = np.array(list(range(X_train.shape[1])))\n",
"randomFeatures = np.random.choice(allFeatureIds,size=int(X_train.shape[1]*.5),replace=False)\n",
"\n",
"X_train_tiny = killFeatures(X_train,randomFeatures)\n",
"X_test_tiny = killFeatures(X_test, randomFeatures)\n",
"\n",
"ic(X_train_tiny.shape)\n",
"\n",
"# Check the final dimensions\n",
"ic(X_train_tiny.shape, y_train.shape, X_test_tiny.shape, y_test.shape)\n",
"\n",
"# Fit a decision tree to the data\n",
"clf_TINY_FASHION = fitModelToData(X_train_tiny,y_train)\n",
"inferenceOnTestData(clf_TINY_FASHION,X_test_tiny,y_test,\"Not Sandal\",\"Sandal\")"
],
"execution_count": 13,
"outputs": [
{
"output_type": "stream",
"text": [
"ic| X_train_tiny.shape: (60000, 154)\n",
"ic| X_train_tiny.shape: (60000, 154)\n",
" y_train.shape: (60000,)\n",
" X_test_tiny.shape: (10000, 154)\n",
" y_test.shape: (10000,)\n",
"ic| X_train.shape: (60000, 154), y_train.shape: (60000,)\n"
],
"name": "stderr"
},
{
"output_type": "stream",
"text": [
" precision recall f1-score support\n",
"\n",
" Not Sandal 0.99 0.99 0.99 9000\n",
" Sandal 0.89 0.88 0.88 1000\n",
"\n",
" accuracy 0.98 10000\n",
" macro avg 0.94 0.93 0.94 10000\n",
"weighted avg 0.98 0.98 0.98 10000\n",
"\n"
],
"name": "stdout"
},
{
"output_type": "execute_result",
"data": {
"text/plain": [
"3.134688299999908"
]
},
"metadata": {
"tags": []
},
"execution_count": 13
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "mJEMAG0dT0n5"
},
"source": [
"# Plot MNIST Results"
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 356
},
"id": "vpj3qeuDGGb0",
"outputId": "3c8b9874-b979-4520-e01e-40b7e2b9bbba"
},
"source": [
"import matplotlib.pyplot as plt\n",
"fig = plt.figure()\n",
"ax = fig.add_axes([0,0,1,1])\n",
"models = ['NO EFFORT', 'MEDIUM EFFORT', 'TINY']\n",
"ms = [12.98,4.56,2.47]\n",
"ax.bar(models,ms)\n",
"ax.set_ylabel('Mean inference time on 10,000 images (milliseconds)')\n",
"ax.set_title('Average inference time for models')\n",
"plt.show()"
],
"execution_count": 22,
"outputs": [
{
"output_type": "display_data",
"data": {
"image/png": "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OS4uDpGRkVi0aFFZ5SQiIpKFYguzl5cXmjdvjvDwcFy5cgXZ2dkwMTFB06ZNsWfPHtjZ2ZVVTiIiIln4x8ulmjZtimnTppVFFiIiItn7x8J8584dHDp0CLdu3dJcx9y0aVN4e3ujSZMmZZGRiIhINoq9XCo8PBxDhgxBSkoK2rdvDy8vL3To0AGpqakICAjAkSNHyionERGRLBTbY16zZg1CQkIKPSs7KioKs2bNQt++fSULR0REJDfF9pifPn2KVq1aFTqvZcuWePr0qSShiIiI5KrYwtylSxfMnTsXCQkJWtMTEhIQGBiILl26SDtOIHMAABpxSURBVBqOiIhIbordlR0UFIRFixahb9++MDAwgKmpKbKyspCfn49evXohKCiorHISERHJQrGFuVatWlizZg1ycnLeGl3q77fpJCIiotIrdlf2a4IgvPVHREREulfuwz4SERHR/5T7sI9ERET0P+U+7CMRERH9T7E95tfDPhZGl8M+EhER0V847CMREVEFwmEfiYiIKhAO+0hERFSBiLqOuTBhYWG4d++eLrMQERHJ3j/2mIuyfv16ZGZmwtXVFd98840uMxEREcnWOxfm3377DSqVCteuXdNlHiIiIll7513ZAGBgYFDoWM1ERET0bv6xx7x3716Ehobi1q1bWmdlDxw4EIMHDy6LjERERLJRbGFevXo1IiMj8fHHH2tdxxwbG4utW7ciMTERM2bMKKusREREVV6xhfnnn3/Gf//7X9SvX19reqtWrdC9e3cMGDCAhZmIiEiHij3GzOEdiYiIylaxPWY/Pz989NFHGD16NOzt7bVuybl161b4+/uXVU4iIiJZKLYwz5o1CzY2Njhw4ABu376tOfnLzs4OI0aMQEBAQFnlJCIikoV/PCs7ICCABZiIiKiMlOo65qSkJF3lICIiIpSiMOfl5aFHjx66zEJERCR7xe7KvnTpUpHz8vLydB6GiIhI7ootzCNGjEC9evWgVJZqjzcRERGJVGxhbtCgAVavXo127dq9NS83Nxdt27bVSYjc3FwEBQXh999/h5GREdq2bYslS5bopG0iIqLKpNjC7ODggJiYmEILs0KhgJWVlU5CrFq1CkZGRjh+/DgUCgXS09N10i4REVFlU2xhLm6cZUNDQ/z222+lDpCVlYWwsDCcPn0aCoUCAFC3bt1St0tERFQZFVuYDQwM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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"tags": []
}
}
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 401
},
"id": "5OnyRWDkGJHh",
"outputId": "e64c6873-3858-4bab-be46-2665a75603a5"
},
"source": [
"import matplotlib.pyplot as plt\n",
"fig = plt.figure()\n",
"ax = fig.add_axes([0,0,1,1])\n",
"models = ['NO EFFORT', 'MEDIUM EFFORT', 'TINY']\n",
"byteCount = [784,32,16]\n",
"ax.bar(models,byteCount)\n",
"ax.set_ylabel('Storage requirement per image (bytes)')\n",
"ax.set_xlabel('Note: \\n 255 booleans => 32 bytes \\n 128 booleans => 16 bytes')\n",
"ax.set_title('Storage requirements for MNIST image by model')\n",
"plt.show()"
],
"execution_count": 37,
"outputs": [
{
"output_type": "display_data",
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"tags": []
}
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "2ATC-QS4T4EY"
},
"source": [
"# Plot Fashion MNIST Results"
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 356
},
"id": "7Z0vM1gMSjFh",
"outputId": "974c1958-fbb4-42a1-e783-f5ce23af8af2"
},
"source": [
"import matplotlib.pyplot as plt\n",
"fig = plt.figure()\n",
"ax = fig.add_axes([0,0,1,1])\n",
"models = ['NO EFFORT FASHION', 'MEDIUM EFFORT FASHION', 'TINY FASHION']\n",
"ms = [16.08,6.16,3.13]\n",
"ax.bar(models,ms)\n",
"ax.set_ylabel('Mean inference time on 10,000 images (milliseconds)')\n",
"ax.set_title('Average inference time for Fashion MNIST models')\n",
"plt.show()"
],
"execution_count": 33,
"outputs": [
{
"output_type": "display_data",
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"tags": []
}
}
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 401
},
"id": "jkvRfe20UBrl",
"outputId": "fa09233b-db48-4acd-c9d7-c9509af453be"
},
"source": [
"import matplotlib.pyplot as plt\n",
"fig = plt.figure()\n",
"ax = fig.add_axes([0,0,1,1])\n",
"models = ['NO EFFORT FASHION', 'MEDIUM EFFORT FASHION', 'TINY FASHION']\n",
"byteCount = [784,39,20]\n",
"ax.bar(models,byteCount)\n",
"ax.set_ylabel('Storage requirement per image (bytes)')\n",
"ax.set_xlabel('Note: \\n 308 booleans => 39 bytes \\n 154 booleans => 20 bytes')\n",
"ax.set_title('Storage requirements for Fashion MNIST images')\n",
"plt.show()"
],
"execution_count": 35,
"outputs": [
{
"output_type": "display_data",
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAe0AAAGACAYAAACA3jp/AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nOzdeVwU5R8H8M+yXN4IyuGdFISSgqyiKVKIoMiZGUSlZd6maGpeCXgWaKmh5lX2K03TPBA8SEvzVkTRCPMgby4FUUTdBXZ+fxCjG7AMyoLE5/16+Xq5zzMzz3dmnuW7z5wyQRAEEBER0XNPr7oDICIiImmYtImIiGoIJm0iIqIagkmbiIiohmDSJiIiqiGYtImIiGoIJm2iCggNDcXSpUurOwydW7hwIZydndG9e/fqDqWEqKgoTJw4scz6fv364fjx41UY0fNj+/btGDx4cHWHQTrEpF1LnTx5EkFBQXByckKXLl0QFBSEs2fPAgC2bNmCt99+u5ojfD7NmjULo0ePru4wyvUs+zA1NRVr1qzBzp07cfjw4UqJx9bWFg4ODnB0dISjoyMUCkWlLLc0O3bsgLOzc6Uv97333oOtrS3++usvjfLRo0fD1tZW/KEQFRUFW1tb7Ny5U5ymoKAAtra2uHHjBgBgypQpWLhwoVi/adMm9OnTB46Ojnj11VcxdOhQ3L9/H0OGDBG3Wfv27WFvby9+Dg0NLRGjr68vvv3220pfd3p+6Fd3AFT17t+/jxEjRiA8PBx9+/ZFfn4+Tp48CUNDw0pZfkFBAfT1q6dr1da2K1NqaipMTExgZmZW4Xm1bYPo6Gi0bt36WcOrVm3atMG2bdswZcoUAMCdO3eQmJgIU1NTjelMTEwQFRUFT09PyOVyrcs8ceIEFi5ciNWrV6Ndu3bIycnBvn37AACrV68Wp5syZQosLCwwfvz4Sl4rqkk40q6FLl++DADw9vaGXC6HsbExevTogZdffhkpKSkICwtDYmKixogoNzcXn3zyCbp27YrXX38dy5Ytg1qtBlA0qgsKCsK8efPg7OyMqKgoXLt2DQMHDoSzszOcnZ0xYcIE3Lt3T4zhzz//hL+/PxwdHTF27FiMGzdOY+Sxb98++Pn5QaFQICgoqMTo5km2trZYt24dPDw84OHhUe78ycnJCAgIgKOjI8aNG4fx48eLbZc2QrW1tcXVq1cBaI6Qjh8/jp49e2LlypXo3r07pk6dCrVajZUrV8Ld3R3Ozs4ICQlBTk4OAODGjRuwtbXF5s2b4erqis6dO2P9+vU4e/YsfHx8oFAoMGvWLI22f/75Z/Tt2xedO3fGhx9+iJs3b2rEtX79enh4eEChUGDmzJkQBKHMffj777/Dy8sLjo6OcHFxwTfffFNiWx45cgSDBw9GZmYmHB0dxeT066+/ol+/flAoFHjvvfeQkpIizuPm5oaVK1fCx8cHDg4OKCgoKHNfPam8PrJy5Uq4uLjA0dERnp6eOHr0qFiXn5+PTz75BI6OjujXrx/++OMPjXiOHDkCAFCpVJg7dy569OiBHj16YO7cuVCpVBr779tvv0W3bt3Qo0cPbN68WWvMPj4+2LlzJwoLCwEUjerd3d1hYGCgMV2PHj1gYGCA7du3l7sd/vjjDzg4OKBdu3YAihJ+QEAA6tevX+68//bv/vvkd8PR0RGLFi3CtWvXEBQUhE6dOiEkJETcHnfv3sXw4cPRtWtXdO7cGcOHD0d6erq4rOvXr+Odd96Bo6Mj3n//fcycOVPjNEViYiKCgoKgUCjg6+urcYpiy5Yt6NWrFxwdHeHm5iZpu1AZBKp1cnNzhS5dugiffPKJsH//fiEnJ0ejfvPmzUJQUJBG2aRJk4QRI0YIubm5wvXr1wUPDw9h48aN4vR2dnbC999/L+Tn5wsPHz4Urly5Ihw6dEhQKpVCVlaWEBwcLMyZM0cQBEFQKpXCa6+9Jnz33XeCSqUS4uLihPbt2wtffvmlIAiC8Oeffwpdu3YVEhMThYKCAmHLli3C66+/LiiVylLXx8bGRnj//feFO3fuCA8fPtQ6f3Hba9asEVQqlbBr1y6hXbt2YtulrbuNjY1w5coVQRAEYfLkyeK0x44dE+zs7ITIyEhBqVQKDx8+FL777jthwIABQlpamqBUKoUZM2YI48ePFwRBEK5fvy7Y2NgIM2bMEB49eiQcPHhQsLe3F0aOHCncvn1bSE9PF7p27SocP35cEARB2LNnj+Du7i5cunRJyM/PF5YuXSoEBgZqxDVs2DDh7t27ws2bNwVnZ2fh999/L3M9unfvLsTHxwuCIAg5OTlCUlJSqdvz2LFjgouLi/j577//Fjp27CgcOnRIUKlUwsqVKwV3d3dxf7z++uuCr6+vkJqaKjx8+LDMfVS8DYtp6yMpKSlCz549hfT0dHHbXb16VRAEQfjqq68Ee3t7Yf/+/UJBQYGwYMECYcCAAeJyX3/9deHw4cOCIAjCokWLhAEDBgi3b98WsrKyhMDAQGHhwoUa+2/RokWCSqUS9u/fL3To0KHE96HYu+++K2zcuFH44IMPhP379wuCIAj9+/cXTp06Jbi4uAjHjh0T45swYYKwd+9ewc3NTVCpVEJ+fr5gY2MjXL9+XRAEzX4UHx8vvPLKK8LixYuFkydPltnPn5ynLP/e7zY2NuL39sKFC0L79u2FgQMHCteuXRPu3bsn9O3bV9iyZYsgCIKQnZ0t7N69W3jw4IGQm5srjBkzRhg5cqS4rLfeekv4/PPPBaVSKcTHxwuOjo7ChAkTBEEQhPT0dKFLly7C/v37hcLCQuHQoUNCly5dhKysLCEvL09wdHQUUlJSBEEQhIyMDOHChQta14PKxpF2LVS/fn38+OOPkMlkmDFjBrp164YRI0bg9u3bpU5fWFiInTt3YsKECahfvz5atGiBDz74QOPXsrm5Od577z3o6+vD2NgYrVu3Rvfu3WFoaAhTU1N88MEHiI+PBwCcOXMGBQUFGDhwIAwMDODh4YFXXnlFXNZPP/2EwMBAdOzYEXK5HAEBATAwMEBiYmKZ6zRs2DCYmJjA2NhY6/xnzpxBfn4+Bg0aBAMDA/Tp00ej7YrS09PD2LFjYWhoCGNjY2zYsAHjx4+HpaUlDA0N8dFHHyEuLk5j9Dl69GgYGRmhR48eqFu3Lry9vWFmZgYLCwsoFAokJycDADZs2IBhw4bB2toa+vr6GDFiBM6dO6cx2h46dCgaNmyIZs2awdnZWesRCX19fVy6dAn3799Ho0aN0L59e0nruHPnTri6uqJ79+4wMDDAhx9+iEePHuH06dPiNO+99x6srKxgbGxc5nICAgKgUCigUCgwZ84crX1ELpdDpVIhJSUF+fn5aNGiBVq1aiUuy8nJCa6urpDL5fDz8ytzvWNiYjB69GiYmZnB1NQUo0eP1ui3+vr6GD16NAwMDODq6oq6deuKR6LK4ufnh+joaKSkpCA3NxeOjo6lTterVy+Ymppi06ZNWpenUCgQFRWF5ORkDB8+HM7Ozvjss8/E0fyzGjJkCOrXr4+XXnoJNjY26N69O1q2bIkGDRqgZ8+eYn9r3LgxPD09UadOHdSvXx8jR44U90dqair++OMPsa8rFAq4ubmJbURHR6Nnz55wdXWFnp4eunfvDnt7e/z+++8Air4nFy9exKNHj2Bubo6XXnqpUtatNqr5J+DoqVhbW+Pzzz8HAKSkpGDSpEmYN28evvzyyxLT3rlzB/n5+WjWrJlY1qxZM2RkZIifLS0tNea5ffs25s6di5MnTyIvLw+CIKBhw4YAgMzMTFhYWEAmk4nTW1lZif9PTU3Ftm3bsHbtWrEsPz8fmZmZZa6P1PllMlmJtp9cr4pq3LgxjIyMNNoePXo09PQe/x7W09NDVlaW+PnJc8VGRkYlPj948EBc1rx58xARESHWC4KAjIwMNG/eHADQtGlTsa5OnTrIy8srM9avvvoKX3/9Nb744gvY2tpiwoQJZSacJ2VmZmpsIz09PVhZWWns/ye3f1m2bt2qcU5bWx9p3bo1pk2bhqioKFy6dAk9evQQz+kCQJMmTcTlGBsbQ6lUlno+/d+xN2vWTKMfmZiYaMxTp04dcfuXxcPDAxERETAxMYGvr6/WaceNG4epU6fCz89P63Surq5wdXWFWq3G8ePHERISghdeeAFBQUFa55PiyW1lZGRU4nPxj/WHDx/is88+w8GDB3H37l0AQF5eHgoLC5GZmYlGjRqhTp064rxWVlZIS0sDUNRXd+/eLZ6LB4qub3B2dkbdunWxcOFCfPvtt5g+fTo6deqEyZMnw9ra+pnXrTZi0iZYW1vjjTfewE8//QQAGgkNKEpMBgYGSE1NxYsvvggASEtLE/+AljbPl19+CZlMhpiYGJiYmGDv3r3i+dqmTZsiIyMDgiCI86WlpaFly5YAiv4YjBgxAiNHjpS8Dv/+AVDW/CdOnCjRdmpqqth2nTp18OjRI3H6W7duSW4XKPrxMm/ePDg5OZWYtvjKYamK16O8xCAlLgDo0KEDvv76a+Tn52PdunUYN26cOBLSxtzcHBcuXBA/C4JQ7v6XQlsfAYrOH/v4+OD+/fsIDQ3FggULMH/+/Aq1YW5ujtTUVHFkl5aWBnNz8wrH+qQ6deqgZ8+eWL9+Pfbs2aN12u7du6N169b48ccfJS1bT08P3bp1Q9euXXHx4sVnirOivv32W1y+fBkbN25E06ZNce7cOfj7+0MQBDRt2hR3797Fw4cPxcRdnLCBor7q5+eHOXPmlLpsFxcXuLi44NGjR1i0aBFmzJgheZuQJh4er4VSUlLw7bffiheZpKWlITY2Fh07dgRQNBLMyMgQL1CRy+Xo06cPFi5ciPv37+PmzZtYs2aN1mSSl5eHunXrokGDBsjIyNC4CtbBwQFyuRxr165FQUEB9u7dq3Eh0YABA7BhwwacOXMGgiDgwYMH2L9/P+7fvy9p/bTN7+DgAH19fXz//ffIz8/HL7/8otH2yy+/jIsXL+LcuXNQKpWIioqSvmEBvP3221i0aJF4CDs7Oxt79+6t0DKKBQUFYeXKleIf79zcXOzatUvSvP/ehyqVCtu3b0dubi4MDAxQr149jaMB2vTt2xe///47jh49ivz8fHz77bcwNDSUNErXRlsf+fvvv3H06FGoVCoYGhrCyMhIcrxP6tevH77++mtkZ2cjOzsbS5cuhY+PzzPFDQDjx4/HDz/8gBYtWpQ77bhx4zTW7d/27t2LHTt24O7duxAEAWfPnsWJEyfE72NVycvLg5GRERo2bIicnBwsWbJErGvevDns7e0RFRUFlUqF06dPa4yqfX19sW/fPhw8eBCFhYVQKpU4fvw40tPTcfv2bezduxcPHjyAoaEh6tat+1T7kopwy9VC9evXx5kzZzBgwAA4ODjgrbfego2NjXilcNeuXfHiiy+iR48e4v2uM2bMQJ06deDu7o7g4GB4e3ujf//+Zbbx0UcfITk5GQqFAsOGDROv6gYAQ0NDREVF4eeff0bnzp2xfft2vPbaa+ItZ6+88gpmz56NWbNmoXPnzvDw8MCWLVskr5+2+Yvb3rp1K7p06YKdO3eid+/e4rwvvPACRo8ejffffx8eHh6ljpi1GThwINzc3DB48GA4OjrirbfeEu9/r6jevXtjyJAh+Pjjj9GpUyd4e3vjwIEDkuYtbR9GR0fDzc0NnTp1woYNGySPWtu2bYv58+dj9uzZ6Nq1K/bt24fly5c/8y2C2vqISqXCF198AWdnZ/To0QPZ2dn4+OOPK9zGqFGjYG9vD19fX/j6+qJ9+/YYNWrUM8UNQLz+QAonJyd06NChzPpGjRph48aN8PDwQKdOnTBp0iR8+OGHT3WE5VkMGjQISqUSXbt2RWBgIFxcXDTqFyxYgMTERDg7O2PRokXw8vIS+4CVlRWWLVuGFStWoFu3bnB1dcU333wDtVoNtVqN7777Di4uLujSpQvi4+MRHh5epev2XyITBEGo7iCIBgwYgKCgIK0/BHSF978SVdy4cePQtm1bjB07trpDqVU40qZqceLECdy6dQsFBQXYunUrzp8/X+KXPRE9P86ePYtr165BrVbjwIED+PXXX+Hu7l7dYdU6vBCNqsXly5cxbtw4PHz4EC1atMBXX331zBcIEZHu3L59G2PGjEFOTg4sLS0RHh4uPhCGqg4PjxMREdUQ/9mRtlqtRl5eHgwMDJ7qdhQiIqLqIAgC8vPzS73L4z+btPPy8jTuLSUiIqpJbGxs0KBBA42y/2zSLn6Av42NTaW9veq/LCkpCfb29tUdBtUg7DNUEewv0qlUKly4cKHEi2iA/3DSLj4kXvxgBioftxNVFPsMVQT7S8WUdmqXt3wRERHVEEzaRERENUSVJe19+/bB398ffn5+8PX1xS+//AKg6H7dwMBAeHp6IjAwEFeuXBHn0VZHRERU21RJ0hYEAZ988gkiIyMRHR2NyMhITJ48GWq1GmFhYQgODkZcXByCg4MRGhoqzqetjoiIqLapspG2np4ecnNzARS9rcjc3Bx37txBcnIyvL29AQDe3t5ITk5GdnY2srKyyqwjIiKqjark6nGZTIZFixZh1KhRqFu3LvLy8rBy5UrxnbxyuRxA0Ssgzc3NkZaWBkEQyqwzNTWV3HZSUpJO1um/KCEhobpDoBqGfYYqgv3l2VVJ0i4oKMCKFSuwbNkyODk5ISEhAePGjUNkZKTO27a3t+dtBhIkJCRU+DWUVLuxz1BFsL9Ip1QqyxxwVknSPnfuHDIzM8Ud5uTkhDp16sDIyAgZGRkoLCyEXC5HYWEhMjMzYWVlBUEQyqwjIiKqjarknLalpSXS09Px999/AwBSUlKQlZWF1q1bw87ODrGxsQCA2NhY2NnZwdTUFGZmZmXWERER1UZVMtJu2rQpwsPDERISIj7hZd68eTAxMUF4eDimTJmCZcuWoWHDhoiIiBDn01ZHRERU21TZY0x9fX3h6+tbotza2hqbNm0qdR5tdURERLUNn4gmkSq/sLpD0KnacIHIf30fEtF/33/2hSGVzdBADp8J0dUdBj2DmC/8qjsEIqJnwpE2ERFRDcGkTUREVEMwaRMREdUQTNpEREQ1BJM2ERFRDcGkTUREVEMwaRMREdUQTNpEREQ1BJM2ERFRDcGkTUREVEMwaRMREdUQTNpEREQ1BJM2ERFRDaH1LV/Z2dmIjo7G/v378ddff+H+/fuoX78+Xn75ZfTs2RMBAQEwNTWtqliJiIhqtTKT9oIFCxATEwNXV1e8+eabsLa2Rr169ZCXl4eUlBTEx8cjICAAPj4+mDhxYlXGTEREVCuVmbQtLS2xZ88eGBoalqhr164dfHx8oFQqsWnTJp0GSEREREXKTNrvvvtuuTMbGRlJmo6IiIienaQL0Y4dO4br168DADIzMzF58mRMnToVt27d0mlwRERE9JikpD1z5kzI5XIAQEREBAoKCiCTyTBjxgydBkdERESPab16vFhGRgaaNWuGgoICHDp0CL/99hsMDAzg4uKi6/iIiIjoH5KSdv369XH79m1cvHhRvIpcpVKhoKBA1/ERERHRPyQl7XfffRdvvvkm8vPzMW3aNADAqVOn0LZtW50GR0RERI9JStrDhg1D7969IZfL0apVKwCAhYUF5syZo9PgiIiI6DHJjzFt0aIFMjMzsXPnTgBFSbtly5Y6C4yIiIg0SRppnz9/HiNHjoShoSEyMjLg5eWF+Ph4bN26FYsWLSp3/hs3bmD06NHi59zcXNy/fx8nTpzA5cuXMWXKFOTk5MDExAQRERFo06YNAGitIyIiqm0kjbTDw8MxduxY7N69G/r6RXm+c+fOSEhIkNRIixYtEB0dLf7r1asXvL29AQBhYWEIDg5GXFwcgoODERoaKs6nrY6IiKi2kZS0L126BD8/PwCATCYDANStWxdKpbLCDapUKsTExKB///7IyspCcnKymMC9vb2RnJyM7OxsrXVERES1kaTD482bN0dSUhJeeeUVsezs2bPiRWkV8dtvv8HCwgLt27dHUlISLCwsxAe3yOVymJubIy0tDYIglFlXkTeLJSUlVTjG0jg5OVXKcqh6ST06RNJwe1JFsL88O0lJOyQkBMOHD0dQUBDy8/OxYsUKbNiwAbNnz65wg5s3b0b//v0rPN/Tsre3h5GRUZW1R883/viqPAkJCdyeJBn7i3RKpbLMAaekw+Ovv/46Vq9ejezsbHTu3Bk3b95EVFQUevToUaFAMjIyEB8fDx8fHwCAlZUVMjIyUFhYCAAoLCxEZmYmrKystNYRERHVRpJG2rt27ULfvn0RHh6uUb5792706dNHcmNbt26Fq6srGjduDAAwMzODnZ0dYmNj4efnh9jYWNjZ2YmHv7XVERER1TaSRtrTp08vtbyiV3Nv3bq1xKHx8PBwrF27Fp6enli7di1mzpwpqY6IiKi20TrSLn4dpyAI4v+frDM0NKxQY3FxcSXKrK2tsWnTplKn11ZHRERU22hN2r1794ZMJoMgCOjdu7dGXZMmTTBmzBidBkdERESPaU3af/31F4CiF4asXbu2SgIiIiKi0kk6p/3++++LV3ETERFR9ZCUtL/66it0794ds2bNwpkzZ3QdExEREZVCUtLevn07vvvuOxgZGWHMmDHw9PTEsmXLcOPGDV3HR0RERP+Q/GrOl19+GZMnT8bvv/+OsLAw7N69G71798Y777yD7du3Q61W6zJOIiKiWk/Sw1WKXbt2Ddu3b8f27dshk8kwduxYWFlZYd26dfjll1+wZMkSXcVJRERU60lK2uvWrUN0dDSuXr2KPn36IDIyEg4ODmK9p6cnXn31VZ0FSURERBKT9oEDB/DBBx+gV69epT5QpU6dOoiKiqr04IiIiOgxSUl7xYoVAIqejJadnY3GjRuL79UuVtGXhxAREVHFSLoQ7d69e/jkk0/wyiuv4NVXX0WHDh0wadIk5OTk6Do+IiIi+oekpD116lQ8evQI0dHROH36NLZt2waVSoVp06bpOj4iIiL6h6TD48eOHcPhw4dhbGwMoOhFHp9//jlcXFx0GhwRERE9Jmmk3bZtW9y8eVOjLDU1FS+88IJOgiIiIqKSyhxp//zzz+L/u3XrhsGDB8PPzw+WlpZIT0/H9u3b4efnVyVBEhERkZakHR0drfG5VatWOH36tPi5ZcuWGp+JiIhIt8pM2j/88ENVxkFERETlKPOctkqlkrQAqdMRERHRsykzafv5+WHVqlXIyMgotT4zMxOrVq2Cv7+/zoIjIiKix8o8PL5u3TqsWrUKfn5+aNSoEV544QXUq1cPeXl5uHz5MnJzcxEQEIC1a9dWZbxERES1VplJ29TUFJMnT8b48eNx9uxZnD9/Hrm5uWjYsCGGDh2KDh06wMDAoCpjJSIiqtXKfbiKoaEhFAoFFApFVcRDREREZZD0cBUiIiKqfkzaRERENQSTNhERUQ3BpE1ERFRDSEraKpUKCxcuRK9eveDk5AQAOHToUIVu91IqlQgLC4OHhwd8fHwwY8YMAMDly5cRGBgIT09PBAYG4sqVK+I82uqIiIhqG0lJe968ebhw4QIWLFgAmUwGAHjppZewfv16yQ3Nnz8fRkZGiIuLQ0xMDEJCQgAAYWFhCA4ORlxcHIKDgxEaGirOo62OiIiotpGUtPfu3YsvvvgCjo6O0NMrmsXCwqLMp6X9W15eHrZt24aQkBAx6Tdp0gRZWVlITk6Gt7c3AMDb2xvJycnIzs7WWkdERFQblXufNgAYGBigsLBQoyw7OxsmJiaSGrl+/TpMTEywZMkSHD9+HPXq1UNISAiMjY1hYWEBuVwOAJDL5TA3N0daWhoEQSizztTUVPIKJiUlSZ5Wm+LTAlSzJSQkVHcI/yncnlQR7C/PTlLS7tOnDyZPnoypU6cCKHru+Lx589CvXz9JjRQWFuL69eto164dJk+ejDNnzmDEiBFYvHjx00cukb29PYyMjHTeDtUM/PFVeRISErg9STL2F+mUSmWZA05Jh8fHjx+PFi1awNfXF/fu3YOnpyfMzc0xevRoSQFYWVlBX19fPNTdsWNHNG7cGMbGxsjIyBBH8YWFhcjMzISVlRWsrKzKrCMiIqqNJCVtQ0NDTJs2DadPn8aRI0dw6tQpTJs2DYaGhpIaMTU1hbOzMw4fPgyg6KrwrKwstGnTBnZ2doiNjQUAxMbGws7ODqampjAzMyuzjoiIqDaSdHj8+vXrGp/z8vIAFCXzpk2bihenaTNz5kxMmzYNERER0NfXR2RkJBo2bIjw8HBMmTIFy5YtQ8OGDRERESHOo62OiIiotpGUtHv37g2ZTAZBEMSy4qvA9fT04ObmhrCwMDRp0qTMZbRs2RI//PBDiXJra2ts2rSp1Hm01REREdU2kg6Pz549G97e3vjll19w9uxZxMXFwc/PD2FhYdi+fTsKCgowa9YsXcdKRERUq0kaaUdFRWHPnj3iVditW7dGWFgYPD09ceDAAXz++efw8PDQaaBERES1naSRtlqtxo0bNzTKUlNToVarAQB16tQpcR83ERERVS5JI+1BgwZh0KBB6N+/PywtLZGeno4tW7Zg4MCBAIADBw7AwcFBp4ESERHVdpKS9tChQ2Fra4vdu3fjzz//RNOmTTF37lz07NkTAODu7g53d3edBkpERFTbSUraANCzZ08xSRMREVHVk5y0z507h5MnT+LOnTsat34Vv62LiIiIdEvShWg//fQT3n77bRw7dgyrVq3ChQsXsGbNGly7dk3X8REREdE/JCXt1atXY/Xq1Vi6dCmMjY2xdOlSLF68GPr6kgfqRERE9IwkJe2srCwoFIqiGfT0oFar4erqin379uk0OCIiInpM0lDZ0tISN27cQIsWLdCmTRv8+uuvaNy4MQwMDHQdHxEREf1DUtIeMmQIUlJS0KJFC4waNQohISHIz8/H9OnTdR0fERER/UNS0n7jjTfE/7u6uuLEiRPIz89HvXr1dBYYERERaarQlWT3798XX8tZ/NnCwqLSgyIiIqKSJCXtI0eOYMaMGUhNTS3xes5z587pLDgiIiJ6TFLSnj59OkaNGgUvLy8YGxvrOiYiIiIqhaSkrVQq8cYbb0Aul+s6HoOPWYUAACAASURBVCIiIiqDpPu033//faxevVrj0DgRERFVLUkjbQ8PD3z44YdYsWIFGjdurFH366+/6iQwIiIi0iQpaY8dOxYKhQJ9+vThOW0iIqJqIilp37hxA9u2bYOenqSj6URERKQDkrJwr169cOzYMV3HQkRERFpIGmmrVCqMHDkSCoUCZmZmGnWRkZE6CYyIiIg0SUraL730El566SVdx0JERERaSEraH330ka7jICIionKUmbTj4+PRuXNnAMDRo0fLXEC3bt0qPyoiIiIqocykPXPmTMTGxgJAma/glMlkku/TdnNzg6GhIYyMjAAAEydOhIuLCxITExEaGgqlUonmzZtj/vz54nlzbXVERES1TZlJuzhhA8Bvv/1WKY199dVXsLGxET+r1WpMmjQJn332GRQKBZYtW4YFCxbgs88+01pHRERUG1XrjddJSUkwMjKCQqEAAAQFBWH37t3l1hEREdVGFXqf9rOaOHEiBEGAk5MTPv74Y6SlpaFZs2ZivampKdRqNXJycrTWmZiYSG4zKSmpUmJ3cnKqlOVQ9UpISKjuEP5TuD2pIthfnl2VJe1169bBysoKKpUKc+fOxaxZs9C7d2+dt2tvby+eRyfij6/Kk5CQwO1JkrG/SKdUKssccJZ7eFwQBFy/fh2FhYXPFISVlRUAwNDQEMHBwTh16hSsrKyQmpoqTpOdnQ09PT2YmJhorSMiIqqNyk3aMpkMPj4+kMlkT93IgwcPkJubC6DoR8DOnTthZ2cHe3t7PHr0CCdPngQAbNiwAX369AEArXVERES1kaTD43Z2drh8+TKsra2fqpGsrCyMGTMGhYWFUKvVsLa2RlhYGPT09BAZGYmwsDCN27oAaK0jIiKqjSQl7S5dumDo0KEICAiApaWlxqj7zTffLHf+li1bYtu2baXWderUCTExMRWuIyIiqm0kJe1Tp06hefPmOHHihEa5TCaTlLSJiIjo2UlK2j/88IOu4yAiIqJySH64yp07d7Bt2zasXr0aAJCRkYH09HSdBUZERESaJCXtEydOoE+fPoiJicHSpUsBAFevXkV4eLguYyMiIqInSEra8+bNw6JFi/DNN99AX7/oiHrHjh1x9uxZnQZHREREj0lK2jdv3hRfwVl85biBgcEzP3CFiIiIpJOUtK2trXHw4EGNsiNHjmi8sYuIiIh0S9LV41OmTMHw4cPx2muv4dGjRwgNDcVvv/2GZcuW6To+IiIi+oekkbaDgwO2b9+OF198Ef3790eLFi3w888/o0OHDrqOj4iIiP4h+S1fFhYWGDJkCO7cuYPGjRs/07PIiYiIqOIkjbTv3buHSZMmoUOHDujevTs6dOiASZMmIScnR9fxERER0T8kJe2pU6dCqVRi27ZtOHXqFLZt2waVSoVp06bpOj4iIiL6h6TD48eOHcPhw4dhbGwMoOhq8s8//xwuLi46DY6IiIgekzTSbtu2LW7evKlRlpqaihdeeEEnQREREVFJkkba3bp1w+DBg+Hn5wdLS0ukp6dj+/bt8PPzw88//yxOxzd+ERER6Y6kpH369Gm0atUKp0+fFstatmyJU6dO4dSpUwD4mk4iIiJd46s5iYiIagjJr+YkIiKi6sWkTUREVEMwaRMREdUQTNpEREQ1hKSk3aVLl1LLi9+xTURERLonKWnn5+eXWqZWqys9ICIiIiqd1lu+goODIZPJoFKp8M4772jUpaenw9HRUafBERER0WNak/aAAQMgCAL++OMPjQenyGQymJmZoWvXrjoPkIiIiIpoTdoBAQEAgI4dO8La2rpKAiIiIqLSSXoimrW1NQ4dOoRz587hwYMHGnUhISEVanDJkiWIiopCTEwMbGxskJiYiNDQUCiVSjRv3hzz58+HmZkZAGitIyIiqm0kXYg2a9YsTJo0CX/++SfS09M1/lXEn3/+icTERDRv3hwAoFarMWnSJISGhiIuLg4KhQILFiwot46IiKg2kjTSjo2NRXR0NKysrJ66IZVKhVmzZuGLL77AwIEDAQBJSUkwMjKCQqEAAAQFBaFXr1747LPPtNYRERHVRpKSduPGjdGgQYNnamjx4sXw9fVFixYtxLK0tDQ0a9ZM/Gxqagq1Wo2cnBytdSYmJpLbTUpKeqa4izk5OVXKcqh6JSQkVHcI/yncnlQR7C/PTlLS/uCDDzBx4kQMHz4cTZo00ahr2bJlufOfPn0aSUlJmDhx4tNF+Qzs7e1hZGRU5e3S84k/vipPQkICtydJxv4inVKpLHPAKSlph4eHAwD279+vUS6TyXDu3Lly54+Pj0dKSgp69eoFoOge7w8//BDvvfceUlNTxemys7Ohp6cHExMTWFlZlVlHRERUG0lK2n/99dczNTJs2DAMGzZM/Ozm5obly5fjxRdfxMaNG3Hy5EkoFAps2LABffr0AVA0Qn706FGpdURERLWRpKRdLC0tDRkZGXBwcKiUxvX09BAZGYmwsDCN27rKqyMiIqqNJCXt1NRUfPzxx/jrr78gk8lw+vRp7N69GwcPHsTcuXMr3Ohvv/0m/r9Tp06IiYkpdTptdURERLWNpPu0Q0ND8dprr+HUqVPQ1y/K8927d8eRI0d0GhwRERE9Jilp//HHHxg2bBj09PQgk8kAAA0aNEBubq5OgyMiIqLHJCVtMzMzXL16VaPs0qVLz/SwFSIiIqoYSUl78ODBGDFiBDZv3oyCggLExsZi/PjxGDp0qK7jIyIion9IuhDtzTffhImJCX766SdYWVlh69atCAkJgbu7u67jIyIion9IvuXL3d2dSZqIiKgaSU7aJ0+eRHJycolXc44YMaLSgyIiIqKSJCXt2bNnY9euXVAoFBrP8S6+kpyIiIh0T1LSjomJQUxMDCwsLHQdDxEREZVB0tXjlpaWMDQ01HUsREREpIWkkfbcuXMxY8YM9OvXr8SrOTt37qyTwIiIiEiTpKT9559/4sCBA4iPj4exsbFYLpPJSryuk4iIiHRDUtJeuHAhli9fjldffVXX8RAREVEZJJ3TrlOnDhQKha5jISIiIi0kJe2xY8di3rx5uHXrFtRqtcY/IiIiqhqSDo9PmzYNAPDTTz+JZYIgQCaT4dy5c7qJjIiIiDRIStq//vqrruMgIiKickhK2s2bNwcAqNVq3L59G+bm5joNioiIiEqSdE773r17mDBhAjp06AAPDw8ARaPvhQsX6jQ4IiIiekxS0g4LC0P9+vXx22+/wcDAAADg6OiIXbt26TQ4IiIiekzS4fGjR4/i4MGDMDAwEF8SYmpqiqysLJ0GR0RERI9JGmk3aNAAd+7c0ShLTU1F06ZNdRIUERERlSQpaQ8YMABjx47FsWPHoFarcfr0aUyePBlBQUG6jo+IiIj+Ienw+NChQ2FkZIRZs2ahoKAA06ZNQ2BgIAYNGqTr+IiIiOgf5SbtwsJCTJs2DbNnz2aSJiIiqkblHh6Xy+U4fPiweAEaERERVQ9J57QHDRqEqKgoqFSqp25o1KhR8PX1hb+/P4KDg8XHn16+fBmBgYHw9PREYGAgrly5Is6jrY6IiKi2kXROe+3atbh9+zbWrFkDU1NTjVG31PdpR0REoEGDBgCAvXv3Ytq0adi6dSvCwsIQHBwMPz8/REdHIzQ0FN9//z0AaK0jIiKqbSQl7fnz5z9zQ8UJGwDu378PmUyGrKwsJCcnY82aNQAAb29vzJ49G9nZ2RAEocw6U1PTZ46HiIioppGUtLt06VIpjU2fPh2HDx+GIAhYvXo10tLSYGFhAblcDqDo/Lm5uTnS0tIgCEKZdRVJ2klJSZUSu5OTU6Ush6pXQkJCdYfwn8LtSRXB/vLsykzaX3/9NUaOHAkAWLx4cZkLCAkJkdzY3LlzAQDbtm1DZGRkheZ9Wvb29jAyMtJ5O1Qz8MdX5UlISOD2JMnYX6RTKpVlDjjLTNrp6eml/r8y+Pv7IzQ0FJaWlsjIyEBhYSHkcjkKCwuRmZkJKysrCIJQZh0REVFtVGbSnjlzpvj/zz777JkaycvLw71798SE+9tvv6FRo0YwMzODnZ0dYmNj4efnh9jYWNjZ2YmHv7XVERER1TaSzmlfv369zLqWLVuWO//Dhw8REhKChw8fQk9PD40aNcLy5cshk8kQHh6OKVOmYNmyZWjYsCEiIiLE+bTVERER1TaSknbv3r0hk8kgCIJYVnzbV/H91to0adIEGzduLLXO2toamzZtqnAdERFRbSMpaf/1118an2/duoUlS5ZAoVDoJCgiIiIqSdIT0f6tadOmmD59Or788svKjoeIiIjK8FRJGwD+/vtvPHz4sDJjISIiIi0kHR4PDg7WeHTpw4cPcenSJYwePVpngREREZEmSUl7wIABGp/r1KmDl19+GW3atNFFTERERFQKSUk7ICBA13EQERFROSQlbW2PMX1SVTyWlIiIqLaSlLSvXr2KX375Bfb29mjevDlSU1Pxxx9/wMPDg8/1JiIiqiKSkrYgCPjiiy/g6ekplv3yyy/YvXv3Mz/ilIiIiKSRdMvXgQMH4O7urlHm5uaG33//XSdBERERUUmSknbr1q2xbt06jbL169ejVatWOgmKiIiISpJ0eHzOnDn46KOPsHr1alhYWCAjIwP6+vqIiorSdXxERET0D0lJu127doiLi8OZM2eQmZmJpk2bwsHBAQYGBrqOj4iIiP7xVI8x7dy5M/Lz8/HgwYPKjoeIiIjKIGmkff78eYwcORKGhobIyMiAl5cX4uPjsXXrVixatEjXMRIREREkjrTDw8MxduxY7N69G/r6RXm+c+fOSEhI0GlwRERE9JikpH3p0iX4+fkBgPjikLp160KpVOouMiIiItIgKWk3b94cSUlJGmVnz57lLV9ERERVSNI57ZCQEAwfPhxBQUHIz8/HihUrsGHDBsyePVvX8REREdE/JI20X3/9daxevRrZ2dno3Lkzbt68iaioKPTo0UPX8REREdE/yh1pFxYWwtPTEzt37kR4eHgVhERERESlKXekLZfLIZfLedEZERFRNZN0TnvgwIEYN24chg8fDktLS/EKcgBo2bKlzoIjIiKixyQl7eILzg4fPqxRLpPJcO7cucqPioiIiEqQlLT/+usvXcdBRERE5XiqZ48TERFR1auSpH3nzh0MHToUnp6e8PHxwUcffYTs7GwAQGJiInx9feHp6YnBgwcjKytLnE9bHRERUW1TJUlbJpNhyJAhiIuLQ0xMDFq2bIkFCxZArVZj0qRJCA0NRVxcHBQKBRYsWAAAWuuIiIhqoypJ2iYmJnB2dhY/Ozg4IDU1FUlJSTAyMoJCoQAABAUFYffu3QCgtY6IiKg2knQhGgDk5+fjzJkzyMzMhJeXl/gu7bp161aoQbVajfXr18PNzQ1paWlo1qyZWGdqagq1Wo2cnBytdSYmJpLb+/cz05+Wk5NTpSyHqhffTFe5uD2pIthfnl2Vv0979uzZqFu3Lt59913s2bPnqYKuCHt7exgZGem8HaoZ+OOr8iQkJHB7kmTsL9IplcoyB5xV+j7tiIgIXL16FYsWLYKenh6srKyQmpoq1mdnZ0NPTw8mJiZa64iIiGqjKnuf9pdffomkpCQsXboUhoaGAIpGwY8ePcLJkycBABs2bECfPn3KrSMiIqqNJB0eL36f9iuvvCKWVeR92hcvXsSKFSvQpk0bBAUFAQBatGiBpUuXIjIyEmFhYVAqlWjevDnmz58PANDT0yuzjoiIqDaqkvdpv/TSSzh//nypdZ06dUJMTEyF64iIiGobvk+biIiohpB8y1e7du34Pm0iIqJqJClpL168uNRyQ0NDWFpawsXFBU2aNKnUwIiIiEiTpMPjV65cwapVq3D8+HFcu3YNx48fx6pVq3Du3DmsX78e7u7uOHDggK5jJSIiqtUkjbTVajUWLlyI3r17i2V79+5FbGwsNm7ciK1bt+KLL75Az549dRYoERFRbSdppH3o0CG4ublplL3++uvi6NrX1xfXr1+v/OiIiIhIJClpt2rVCuvXr9co27Bhg3if9p07d1CnTp3Kj46IiIhEkg6Pz5kzB2PGjMGqVatgYWGBjIwMyOVyREVFAQAuX76MkJAQnQZKRERU20lK2u3bt0dcXBwSExNx69YtNG3aFA4ODjAwMABQ9Bzyzp076zRQIiKi2k7yfdoGBgZMzERERNVIUtK+f/8+oqKiEB8fjzt37kAQBLFu//79uoqNiIiIniD51ZzJyckYNWoUcnJy8Omnn8LKygrvv/++jsMjIiKiYpJG2ocPH8bOnTvRuHFjyOVyuLu745VXXsGIESOYuImIiKqIpJG2Wq1GgwYNABS9Rzs3NxdNmzbF1atXdRocERERPSZppP3yyy8jPj4e3bp1g0KhQHh4OOrVq4c2bdroODwiIiIqJmmkPWfOHDRv3hwAMH36dBgbG+PevXuIjIzUaXBERET0WLkj7cLCQmzZsgUjR44EAJiZmWHu3Lk6D4yIiIg0lTvSlsvl+PHHH6GvL/mWbiIiItIBSYfH/f39Szx7nIiIiKqWpOHz2bNnsXbtWnzzzTewtLSETCYT69atW6ez4IiIiOgxSUn7rbfewltvvaXrWIiIiEgLSUk7ICBA13EQERFROSRfXbZ582ZER0cjIyMDFhYW8PPzQ//+/XUZGxERET1BUtL++uuvsW3bNgwePBjNmjVDamoqVq9ejczMTPFWMCIiItItSUl706ZN+OGHH8QHrABAjx498O677zJpExERVRFJt3w9fPgQpqamGmUmJiZ49OiRToIiIiKikiQlbRcXF0ycOBF///03Hj16hJSUFEyZMgU9evSQ1EhERATc3Nxga2uLCxcuiOWXL19GYGAgPD09ERgYiCtXrkiqIyIiqo0kJe3Q0FDUq1cPvr6+cHR0hL+/P+rUqYMZM2ZIaqRXr15Yt26dxuF1AAgLC0NwcDDi4uIQHByM0NBQSXVERES1kaSkXb9+fURGRuLs2bM4dOgQzpw5g8jISDRs2FBSIwqFAlZWVhplWVlZSE5Ohre3NwDA29sbycnJyM7O1lpHRERUW0m6EK1Lly44ceIE9PT0YGZmJpZ369YNR48efaqG09LSYGFhAblcDqDoGefm5uZIS0uDIAhl1v373Hp5kpKSniq+f3NycqqU5VD1SkhIqO4Q/lO4Paki2F+enaSknZ+fX2qZWq2u9IAqm729PYyMjKo7DHpO8MdX5UlISOD2JMnYX6RTKpVlDji1Ju3g4GDIZDKoVCq88847GnXp6elwdHR86qCsrKyQkZGBwsJCyOVyFBYWIjMzE1ZWVhAEocw6IiKi2kpr0h4wYAAEQcAff/yBN998UyyXyWQwMzND165dn7phMzMz2NnZITY2Fn5+foiNjYWdnZ14+FtbHRERUW2kNWkXP3O8Y8eOsLa2fupG5syZg19++QW3b9/GBx98ABMTE+zYsQPh4eGYMmUKli1bhoYNGyIiIkKcR1sdERFRbaQ1aSclJcHQ0BA2NjYAgOzsbMydOxcXL16Eg4MDJk+ejHr16pXbyKeffopPP/20RLm1tTU2bdpU6jza6oiIiGojrbd8zZs3D7dv3xY/T58+HVeuXEFgYCAuXryI+fPn6zxAIiIiKqI1aaekpEChUAAA7t27h4MHD2LBggV455138OWXX2Lfvn1VEiQRERGVk7QLCwthYGAAAEhMTESTJk3wwgsvACi6+vvevXu6j5CIiIgAlJO0X3zxRezatQsAsHPnTnTr1k2sy8jIQIMGDXQbHREREYm0Xog2ceJEjBw5EuHh4dDT08OPP/4o1u3cuROdOnXSeYBERERURGvSVigU2LdvH65cuYI2bdqgfv36Yp2rqyu8vLx0HiAREREVKfcxpvXr14e9vX2J8rZt2+okICIiIiqdpLd8ERERUfVj0iYiIqohmLSJiIhqCCZtIiKiGoJJm4iIqIZg0iYiIqohmLSJiIhqCCZtIiKiGoJJm4iIqIZg0ibSEVV+YXWHoFNOTk7VHYJO/df3H9VM5T7GlIiejqGBHD4Toqs7DHpKMV/4VXcIRCVwpE1ERFRDMGkTERHVEEzaRERENQSTNhERUQ3BpE1E9Bz4r1+tzrsNKgevHicieg7wboOararuNuBIm4iIqIZg0iYiIqohnvukffnyZQQGBsLT0xOBgYG4cuVKdYdERERULZ77pB0WFobg4GDExcUhODgYoaGh1R0SERFRtXiuL0TLyspCcnIy1qxZAwDw9vbG7NmzkZ2dDVNTU63zCoIAAFCpVJUWj0k9eaUti6qeUqms8jbZZ2ou9heqiMrsL8V5qziPPem5TtppaWmwsLCAXF7UkeVyOczNzZGWllZu0s7PzwcAXLhwodLiGednVWnLoqqXlJRU5W2yz9Rc7C9UEbroL/n5+TA2NtYoe66T9rOoV68ebGxsYGBgAJlMVt3hEBERSSIIAvLz81GvXr0Sdc910rayskJGRgYKCwshl8tRWFiIzMxMWFmV/2tUT08PDRo0qIIoiYiIKte/R9jFnusL0czMzGBnZ4fY2FgAQGxsLOzs7Mo9NE5ERPRfJBNKO9P9HElJScGUKVNw7949NGzYEBEREWjbtm11h0VERFTlnvukTUREREWe68PjRERE9BiTNhERUQ3BpE1ERFRDMGkTERHVEEzaRERENQSTtkRubm7w9vaGWq3WKHvyMakbN25Ev3790LdvX3h6emL58uUa0z8pKioK3bp1g5+fn/jv+++/L7Pu/v37uHHjBtq1a6dRvn37dgCAWq3G8uXL4enpib59+8LLywsbN24U23tyXh8fH7zxxhs4deoUDh48KC6re/fuGu3u2bOnRNy2trbw8fERp1m9erVYN2DAAPj5ab4IXhAELF68GP369YOvry+8vLzEZ8nfuHEDzs7OGtPn5eXB1tZW/Pzee+9h37594ue9e/ciICAAffr0gbu7Oz7//HON58tL2U8V4ebmhh49eqCwsFAs27JlC2xtbbF27Vrxs0Kh0NgvCxYs0Kjz9/dH37594evriyVLluDRo0elxvfv9QWAsWPHYsuWLQCK+oatrS3279+vsc0cHR3xxhtvlLoO7Gs1o69VluJt4+XlpbEPp06dWmI7aFuHbdu2ISgoSKNu6dKlGDduXIk2S/sO/P333wCKbtu1tbXFd999pzHPzZs3MWzYMPj4+Ij9pHjbRUVFISIiQmP6tWvXYsqUKQBK7k+VSoXPP/8c7u7u6NOnD/z9/bF3716x/vjx47C1tcXKlSs1ysr6zjzPnusnoj1vHjx4gOjoaAQEBJSo27ZtG/73v/9h1apVaNasGe7evYvRo0dDrVZj1KhRpS7P398fkydPllyXk5ODBg0aIDo6usT0X3/9NY4dO4aNGzeiUaNGSEtLw5AhQ2BkZCT+cXty3h9//BHTp0/Hrl274OLiAqDoi/LgwYMyYyq2YcOGEo/Xu3jxIm7fvg0DAwMkJSXB3t4eALB7924cO3YMW7ZsgZGREVQqFa5du6Z1+WWJj4/HrFmzsGrVKtja2kKpVGLy5MmYOXMm5s6dK06nbT89DXNzcxw6dAiurq4AgK1bt6J9+/Ya07z66qv46quvSp3/ybqsrCxMnz4d48aNw/Lly58qnvbt22Pr1q147bXXABRt4xdeeEHrPOxrFVNdfa0ybNq0CUBRYuvfv7/GPrxx40aJ6ctaB39/f8TFxWHNmjX48MMPcf78eWzatAlbt24ttd2yvgM///wzunbtis2bN+P9998Xy2fOnImePXvi3XffBQBkZGRAX//pUlJ4eDgePHiAHTt2wMjICBcuXMCQIUPQqFEjdO7cGQDQtGlT/O9//0NQUBAaNmz4VO08DzjSroCPPvoIS5YsKfXNYVFRUZg8eTKaNWsGAGjUqBFmzpyJFStWVOqbxkqjVCqxcuVKhIeHo1GjRgCKHgH7ySefICoqqtR5nJ2dkZaWVmkxbN68GX5+fvD398fmzZvF8oyMDDRu3BiGhoYAAENDQ7z44otP1UZUVBRGjhwpjo6MjIwQHh6OnTt34ubNm+J02vbT0wgICBBHutevX8eDBw9gY2PzVMsyMzNDREQEjh49iosXLz7VMrp06YLz58/j7t27AIp+MFZV0mBf021fqw7a1mH27Nn43//+hwsXLmDq1Kn49NNP0bhxY8nLLigoQExMDGbNmgWlUomzZ8+Kdenp6bCwsBA/W1hYwMzMrMLx37x5E7t27UJ4eDiMjIwAADY2NhgxYgSWLFkiTmdubo4+ffpg1apVFW7jecKRdgXY29ujffv2WL9+PQYNGiSWFx9OdHBw0Jje2toa+vr6uHLlSql/5Ldt24YjR46Inz/++GNxNPdkXadOnRAWFgYAyM3N1Tgs+N133+HWrVswMDCAtbW1xvIdHBxw/fp15OXllWh7z5498PLyqugmAAAEBQVBT6/o915kZCTatm2LmJgYrF+/HgYGBvD398eUKVNgZGQELy8vrF+/Hh4eHlAoFOjatSv69esn/qL+9/qUdToBAM6fP4+pU6dqlJmYmKBly5a4cOECmjdvDqDs/fS0unTpgh9//BF3797F1q1b4e/vjz///FNjmiNHjmisx7vvvosBAwaUurxGjRqhdevWuHjxIl566aUKxyOTyeDl5YUdO3bAxcVF0o8I9rWa0deqg7Z1aNKkCaZMmYK3334bvXr1gru7e5nLefI70KJFCyxduhT79+9H69at0bp1awQEBGDz5s3o0KEDAGDIkCH45JNP0L59e3Ts2BGenp5iHVCyz965cwevvvpqiXYvXLiAVq1awcTERKPcwcEBixcv1igbOXIkfHx88N5770ncOs8fJu0KGjduHAYOHIg333xT0vTa3jBW0UOWAEo9ZJmZmak1huKH3hX/0crOzoZKpRIPo1XUvw9Z7tmzB23atEGrVq0AAO3atcOePXvg7e0Nc3Nz7NixA4mJiUhISMDyIUMd7wAAHEpJREFU5cuxfft2fPPNN6WuT15eHjp16vRUcT2povtJG5lMhr59+2LHjh3YsWMHNmzYUCJpazs8XpqKPojw3/0oICAAEydOxO3bt+Hv71/u/OxrNaOvVRdt6+Dl5YWIiAgMHjxY6zJK+w5s3rxZPArk7+8Pf39/TJs2DUZGRvD19YWLiwuOHj2KkydPYtCgQZg9eza8vb3F6Z/sl2vXri319ZcV+S41adIEb731FpYtW4a+fftKnu95wsPjFdS2bVu4urqKF7gAQP369dGiRQskJiZqTJuSkoL8/Hy0bt1apzG1adMG+fn5SElJ0ShPTExEixYtUL9+fQCP/2jt378fPj4+mDBhQoWTR2k2b96MS5cuwc3NDW5ubjh37pzGYUt9fX0oFAoMHz4cP/zwAw4dOoScnJwKt2Nra1tiG+fk5OD69eslRqyl7adnERAQgK+++go2NjYVOjxYmrt37+LatWuljo5NTU1LbJs7d+6UeElOy5YtYWhoiI0bN4p/5KoC+5ru+1p1KG8d5HK5eMRDqtu3b+PQoUNYsmQJ3Nzc8M477+Dhw4eIi4sTp2ncuDG8vLwQGhqKkSNHii+HqggbGxtcu3atxH5OTEzUuNCw2JAhQ7B3796nvt6hujFpP4UxY8bgxx9/1DgU+NFHHyEyMlI8d3f37l2Eh4dj6NCh4nkWXTEyMsLQoUMRHh4unudMS0vD/PnzMWbMmBLTy+VyTJo0Cbdu3cKvv/76TG3fuvX/9u49qsoqb+D4V4QDKGppeCctC1AURbmOKNfiLiKK2hIcMy+YmYqlZV7QdMpxCSOWLMOYzFU2jnIQwVJTvEMxaUzmlRZyFVS8cBHO4bDfP3h5Xo8CoaPjS+zPWqzFefbz7LOffc5av2fv/Zznd40ffviB77//nkOHDnHo0CGOHDnCL7/8QlFREb/88ovezS9nz56lS5cuj3QjyJtvvsnmzZu5cOECUL++unLlSnx9fenbt+8D+zf2OT0qCwsLFixY0ORNhS1VVlbG+++/j4uLS6PrrSNHjkStVlNTUwPA+fPnycnJ0Zs2bLBw4UIWLVr0H19EPAz5XXvy37Wn5XGfg1qtxsfHh/T0dOXzWrt2rXKRlZ6ernzPdTodFy5caLRvf0/fvn3x9fVl5cqVSn0XL14kPj6euXPnPrB/p06dmDZtGps3b/4Pzu7pkdPjj6Bnz54EBwfz+eefK9tCQkKorq5m+vTpCCHQ6XQEBwcTGRnZZD33r9l4enry9ttvP1Kb5syZg4GBARMmTKB9+/YARERENDl1amxszPz589m0aRNeXl7NTuM3JykpidGjRysjrIa6vb292b17N0OHDiU6OpqKigpUKhWmpqZ88sknD33VDvU3NH3wwQcsXryY6upqtFotXl5eLFy4sNH9G/uc/hMTJ05ssuz+Ne3BgwcrdxmfPHmSsWPHUl1djUql4pVXXmHGjBmN1jN+/HiKiooYP348BgYGmJiYEBMT02hgtrOzw87OrkVtl9+1h/O0v2tPw+M+h927dz+w7OLl5cWKFSsoKCggMzOTjz/+GENDQ3Q6HYMHD37k7+SKFSvYsGED/v7+GBkZYWxszNKlS3F0dGx0/ylTpig/e2xtZJYvSZIkSWol5PS4JEmSJLUSMmhLkiRJUishg7YkSZIktRIyaEuSJElSKyGDtiRJkiS1EjJoS5IkSVIrIYO2JLVBnp6euLi4UFVVpWzbuXNni5/JHB4e/siPJpUk6dHJoC1JbVRdXV2rfcCEJLVVMmhLUhs1ffp0Pv/8c+7cudNo+U8//URoaCgjRowgNDSUn376CYCYmBiysrJYtWoVdnZ2rFq1Cqh/1v60adNwdHTEx8eHtLS0/9q5SFJbIYO2JLVRgwcPxtHRUcmCda9bt24xa9YswsPDyczMZNq0acyaNYubN2+yYMEC7O3tWb58OadPn2b58uVUVVXx+uuvExgYyMmTJ4mJiSE6OprLly8DkJKSQlBQ0H/7FCXpD0cGbUlqw+bNm8f27dspKyvT296QB3ns2LEYGhoSGBjIiy++yOHDhxutJz09nT59+hAaGoqhoSGDBg3Cx8eHb7/9FoCgoCBSUlKe+PlI0h+dTBgiSW2YpaUl7u7ubNmyhQEDBijbS0tL6d27t96+vXv3pqSkpNF6CgsLyc7Oxt7eXtmm0+kYM2bMk2m4JLVRMmhLUhs3b948QkJCeP3115Vt3bt3p6ioSG+/4uJiRo0a1WgdvXr1wsHBoVXnlJak1kBOj0tSG9evXz/8/f358ssvlW1ubm7k5uaSkpJCbW0taWlpXL58GXd3dwCee+458vPzlf3d3d3Jzc1FrVaj1WrRarVkZ2eTk5Pz3z4dSfpDk0FbkiTefPNNvd9sP/vss8THx5OYmIiTkxMJCQnEx8fTtWtXoD5/9nfffYeDgwMffvghZmZmbN26lbS0NEaNGoWrqyvr169Ho9EAsGfPHgICAp7KuUnSH4nMpy1JkiRJrYQcaUuSJElSKyGDtiRJkiS1EjJoS5IkSVIrIYO2JEmSJLUSMmhL0hOWmZnJ6NGjH3u9BQUFWFlZUVtb+9jrbgusrKy4cuXK026GJD0UGbSlNis8PBxnZ2eGDx/OmDFjOHjwoF55SkoKHh4eDBs2jDlz5nDr1i2lrKCggBkzZuDg4MDIkSNZtWqVDJ5PWFlZGZMmTcLJyQl7e3smTpzIv/71L6Vco9Gwdu1aXF1dcXBwYOXKlWi12sfejid1ESZJLSGDttRmLV26lOPHj/PTTz+xevVq3nnnHUpLSwG4dOkSy5cvZ926dZw4cQJTU1Oio6OVY6Ojo+nWrRvHjx9HrVbz448/8tVXXz2tU2l1rl+//tDHdOzYkbVr13Lq1Cl+/PFHZsyYQWRkpHKxtGXLFn755Rf27t3Ld999x6+//srmzZsfd9Ml6amSQVtqs6ytrTE0rH+Sb7t27aitreXq1atA/Sjb09MTBwcHOnbsyNtvv82BAweoqKgA6kfafn5+GBsbY25ujqurq5LRqinx8fE4OTnh6enJnj17lO3l5eW8++67ODs74+HhwaeffkpdXR1Qn/P6008/xcPDAxcXF959913Ky8sbrb+8vJz3338fV1dXRo0aRUxMDDqdDoC8vDwiIiJwcnLCycmJqKgovZScnp6ebN26laCgIEaMGMH8+fOpqakB6ke4s2bNwt7eHkdHR1577TWlfY8qIiKCqVOnkpyczN27d1t0jLGxMS+++CIGBgYIITAwMOD27dvcvn0bgEOHDhEeHs4zzzxD165dCQ8PZ9euXc3WeeTIEby8vHBycuLjjz+mrq4OjUaDo6MjFy5cUPa7ceMGQ4cOpbCwkBkzZlBaWoqdnR12dnaUlJRQV1fHli1b8Pb2xsnJibfffluZmampqWHRokXKDEFoaOgjXbRIEsigLbVxs2bNYsiQIUyYMAFHR0cGDx4M1I+0rayslP2ef/55jIyMyM3NBWDq1KmkpqZy9+5dSkpKOHbsWJPP5Yb6keXNmzc5duwYH330EcuXL+e3334DYPXq1ZSXl3Pw4EG+/PJLkpOTlWCze/dukpKS2LZtGwcPHqSqqkrJX32/JUuWYGhoyP79+1Gr1Zw4cYKdO3cCIIRg1qxZHDt2jH379nH16lXi4uL0jt+3bx8JCQl8//33XLhwgd27dwOQmJhIjx49OHXqFCdOnGDhwoW0a9eu0TYEBQVhb2/f6N/KlSuV/Xbt2sW4ceNQq9WMHj2aZcuWcfr06Sb77/73sLW1JTIykgkTJtCtWzel7N5nRQkhuHr1apMXOQAHDhxg165dJCUlcejQIXbt2oVKpcLf31/vwmrv3r24uLjQp08fPvvsM7p3787p06c5ffo0PXr04Msvv+TgwYNs376dY8eO0aVLF+VzSkpKoqKigvT0dDIzM4mOjsbExKRF5ypJDxCS1MZpNBqRnp4uPv/8c2VbRESE+Oqrr/T2c3V1FRkZGUIIIS5fvixCQkLEwIEDhaWlpVi8eLGoq6trtP6MjAwxcOBAUVlZqWybN2+e2LRpk6itrRU2Njbi0qVLStnXX38tpkyZorRj+/btSllOTo4YNGiQ0Gq1Ij8/X1haWgqtViuuXbsmbGxsxN27d5V9U1JSlHrud+DAAREcHKy89vDwEGq1Wnn98ccfi2XLlgkhhIiNjRWzZ88Wubm5TfTgf6aoqEhs3rxZvPrqq8LHx0ekpqb+7jHV1dUiJSVF7N69W9m2YcMGMXHiRHHjxg1RWloqxo8fLywtLUVJSUmjdVhaWoojR44or7dv3y4iIiKEEEKcOXNGuLm5KZ9pSEiI0q6MjAwxatQovbp8fX3FyZMnldclJSXK57Rz504xceJEce7cuRb2iCQ1TWb5kto8IyMj3Nzc2LZtG88//zxeXl506NBBmQpvUFFRQceOHamrq+ONN94gLCyMHTt2UFlZyfvvv89f//pX3n333Ubfo3PnznTo0EF53bt3b0pLS7l58yZarVYvDea9KTBLS0vp06ePUtanTx9qa2u5ceOGXv1FRUXU1tbi6uqqbKurq6NXr15A/Uh/zZo1ZGVlUVlZiRCCzp0769Vhbm6u/G9qaqqs70+fPp1NmzYpWcAmTpzIzJkzf6dXW87c3BwrKyusra05evRok+k/72VsbExgYCB+fn4MHDgQa2trIiMjKS8vJzg4GJVKRVhYGOfOneO5555rsp6G/oH6vm0456FDh2JiYkJmZibm5ubk5eXh5eXVZD1FRUW8+eabGBj83+SlgYEBN27cIDg4mKtXr7Jw4ULu3LnDmDFjWLBgAUZGRi3pHknSI4O2JP0vnU6nZK56+eWXOX/+vFKWn5+PVqulf//+3Lp1i6KiIqZMmYJKpUKlUhEaGkpsbGyTQfvOnTtUVVUpgbu4uJiXX36ZZ599FiMjI4qKinjppZeUsh49egD1KTILCwuVeoqKijA0NKRbt27K+jtAz549UalUZGRkKOv099qwYQPt2rUjJSWFZ555hoMHDzY5zX4/MzMzlixZwpIlS7h48SJTp05lyJAhuLi4PLBvQEDAAyk9GwQFBem956+//oparSY1NRULCwvGjRvHmjVrMDMza1G7AGpra8nPz8fa2hoTExOWL1/O8uXLAfjmm2+wsbHRC6T3a/gcoL5vu3fvrpSFhISwZ88ezM3N8fHxwdjYGKDRpYGePXuydu1aRowY0ej7zJ07l7lz51JQUMDMmTN54YUXmDBhQovPU5IayDVtqU3KycnhyJEjVFdXo9VqSU5OJisrCwcHB6A+wBw+fJisrCyqqqr429/+xiuvvIKZmRldu3alb9++fP3119TW1nLnzh2SkpL01sAbExcXh0ajISsri/T0dHx9fWnfvj2+vr7ExMRQUVFBYWEhiYmJjBkzBoDAwEC++OIL8vPzqaysJCYmBj8/vwcCc/fu3Rk5ciQfffQRFRUV1NXVkZeXxw8//ABAZWUlHTp0oFOnTpSUlJCQkNDivjp8+DBXrlxBCEGnTp1o3759k2vaqampylrv/X/3BuyIiAhmz56NsbEx27dvZ8eOHYSFhTUbsM+cOUNWVhYajYbq6mq2bNnC9evXsbW1BaCkpISSkhKEEJw5c4ZPP/2Ut956q9lz27p1K7dv36a4uJht27bh7++vlDX8DHDPnj2MHTtW2d6tWzdu3bqlt1Y+efJkYmNjlQussrIy5SeEGRkZXLhwAZ1Oh5mZGYaGhs1eSEhSc+RIW2qzNm3axPz582nfvj39+vUjJiYGGxsboH6kHR0dzaJFi7h16xYuLi785S9/0Tt27dq1fPbZZxgYGODs7Mx7773X5Hs999xzdO7cmVGjRmFqasrKlSsZMGAAAMuWLWP16tV4e3tjbGzMhAkTCA0NBSA0NJSSkhKmTJlCTU0Nrq6uLFu2rNH3WLduHevXr8ff35/KykosLCyYMWMGUD/SW7x4Mfb29jz//PMEBwfz97//vUX9dOXKFVavXk1ZWRmdO3dm8uTJODs7t+jYpixYsIChQ4c+VPDSaDR8+OGH5OfnY2RkhKWlJVu2bFFmJfLy8li8eDE3btygZ8+eREVF6S0XNMbLy4tx48ZRUVFBSEgI48ePV8p69erFoEGDyMvLw97eXtk+YMAAAgIC8Pb2RqfTkZqaSkREBEIIXn/9dUpLS+nWrRv+/v54e3tz/fp1VqxYQUlJCR06dMDf35/g4OCH7DFJqidTc0qSJDXhvffeo3v37ixYsOBpN0WSADnSliRJalRBQQEHDhwgKSnpaTdFkhRyYUWSJOk+sbGxBAUFMX36dCwsLJ52cyRJIafHJUmSJKmVkCNtSZIkSWolZNCWpP+SuLg4Fi1a9Njr3b17N5MnT37s9bYFsu+k1kYGbanNa1i/HDRo0APP487MzMTa2lpJDmFnZ9fojUm5ubkMGTLkiQRlSV96ejqTJ0/G3t6ekSNHsnTpUr2n12k0Gt577z2GDx/OyJEjSUxMfCLtWLJkCTExMU+kbklqirx7XGrz+vXrx6JFi9ixY0ej5d27d+fo0aPN1rFq1SqGDBnyJJr3h6XRaKipqaFTp04PdVx5eTmRkZE4ODig0WiIiopi3bp1ysNb4uLiuHLlCocPH+b69etEREQwYMAAmQNb+kOQI22pzQsJCcHNzY2OHTs+0vGpqal06tSp0cd63k+j0TB//nzs7OwICQnRe1RqTk4O4eHh2NvbExAQwPfff6+UNZe+8345OTlMmzYNR0dHfHx8SEtLU8rS09MZO3Ysw4cPx83NTW9moaCgACsrK5KSknB3d8fJyUkvH3V2djbjxo1j+PDh/OlPf9J72MyjuHnzJm5ubkRFRXHy5MkWp/sMCgpi9OjRmJqa0qVLF8LCwvQyhCUlJTFnzhy6dOnCgAEDmDBhQrM/2xJCsGrVKkaMGIGvry+nTp0C6rOejRs3Tm/fxMREIiMj+eabb0hJSWHr1q3Y2dkxe/ZsoP6pbG+99RbOzs54enqybds25djH3X9SG/XUUpVI0v8zUVFRYuPGjXrbMjIyhI2NjXBxcREeHh5izZo1etm6ysvLxauvviqKi4vFxo0bRVRUVJP1b9y4UQwaNEjs27dPaDQakZCQIDw8PIRGoxEajUZ4e3uLzZs3i5qaGnHy5EkxbNgwkZOTI4QQ4p133hGzZ88W5eXlIj8/X7z66qviH//4hxBCiF27dolJkyYJIYSorKwUo0ePFv/85z+FVqsVZ8+eFY6OjkoWsYyMDHH+/Hmh0+nEuXPnhIuLizhw4IAQQihZw5YuXSru3r0rzp07J2xsbMTly5eFEEKEhYWJpKQkIYQQFRUV4vTp042eZ2FhoRgxYkSTf3v27FH2LS0tFQkJCSIwMFC4u7uL2NhYkZeX1/IPTQjx4Ycfivnz5wshhLh165awtLQU165dU8r37dsnAgMDGz12165dYuDAgSIxMVFoNBqRmpoqhg8fLm7evClqamqEg4ODcv5CCBEcHCy+/fZbIYQQixcvFhs2bFDKdDqdCAkJEXFxcaKmpkbk5eUJT09PcfTo0YfqP0lqjhxpS1IzXnzxRdRqNcePH+eLL77g7NmzfPTRR0p5bGwsoaGh9OzZs0X12djY4Ovri5GREdOmTUOj0fDzzz/z888/U1VVxcyZM1GpVLi4uODh4UFqaio6nY60tDSioqIwMzOjb9++TJs2TS/fc4P09HT69OlDaGgohoaGDBo0CB8fH7799lsAnJycsLKywsDAAGtrawICApTnkzeYO3cuJiYmWFtbY21trcwGGBoakpeXR1lZGR07dmTYsGGNnmPv3r3Jyspq8i8oKEjZ19zcnOnTp5OSkkJcXBzl5eWEhYURHh6uNwvRlBMnTqBWq5k3bx4AVVVVAHpT7p06daKysrLJOrp27crUqVMxMjLC39+fF154gfT0dFQqFX5+fko/X7p0icLCQjw8PBqt59///jdlZWXMnTsXlUqFhYUFYWFhykxHS/tPkpojg7YkNcPc3JyXXnoJAwMDLCwseOedd/juu+8AOHfuHKdOneLPf/5zi+u7N7gbGBjQo0cPSktLKS0tpWfPnnrP4m5I0fl76TvvVVhYSHZ2Nvb29spfSkoK165dA+Dnn38mPDwcZ2dnRowYwY4dO7h586ZeHfemsjQ1NVUC4Zo1a8jNzcXPz4/Q0FAOHz7c4vNuif79+2NlZUW/fv347bffuHPnTrP7nzlzhqioKDZu3MgLL7wAoGRRu/fGtIaUqk3p0aOHXgKUhrSpUL90kpKSghCC5ORk/Pz8UKlUjdZTWFhIaWmpXt/Hx8dz/fp14Mn3n9Q2yBvRJOkhtGvXDvG/zyPKzMzUG3lVVVWh0+kICQlpcg313nSadXV1lJSUKOkgr169Sl1dnRK4i4uL6d+//++m77xXr169cHBwaPKO6aioKKZMmUJCQgLGxsasWbPmgaDdlP79+7Nhwwbq6urYv38/8+bNIzMzUy9PONSnuAwICGiynujoaCWLmU6n4/jx4yQnJ3P06FGcnZ2ZOXMmo0ePbjTFaINff/2VyMhI1q5dq3cvQZcuXTA3N+f8+fOMHDkSgPPnzyv91piGzGANgbu4uBhPT08Ahg0bhpGREVlZWezdu5f169crx92f6axXr1707duX/fv3N/o+Le0/SWqOHGlLbZ5Wq6WmpgYhBLW1tdTU1KDT6YD6tIqFhYUIISguLmb9+vV4eXkBMHHiRA4cOIBarUatVjNp0iTc3d3ZunVrk+919uxZ9u/fT21tLV988QUqlYqhQ4dia2uLiYkJCQkJaLVaMjMzOXToEP7+/r+bvvNe7u7u5Obmolar0Wq1aLVasrOzycnJAepTdHbp0gVjY2Oys7PZu3dvi/spOTmZsrIyDAwM6Ny5M0CjWbp69+7dZHrO06dPK+2+ceMGbm5uxMTEMHToUPbv38+mTZvw9PRsNmBfvHiRN954g2XLlinB9V5jx45l8+bN3L59m5ycHHbu3ElISEiT9ZWVlbFt2za0Wi379u0jJycHNzc3vfpWrVqFoaGhXravbt26UVBQoLy2tbWlY8eObNmyherqanQ6HRcvXiQ7O/uh+k+SmiO/MVKbt2zZMmxtbdm7dy/x8fHY2tqSnJwM1E+BT5o0iWHDhjFp0iSsrKxYunQpUD91bG5urvx16NABlUpF165dm3wvLy8v0tLScHBwIDk5mbi4OIyMjFCpVMTHxyujzejoaNatW6eXvtPU1BRvb29ee+01AgMDlfSd9zIzM2Pr1q2kpaUxatQoXF1dWb9+PRqNBoAVK1awceNG7Ozs+OSTT/Dz82txPx07doyAgADs7OxYs2YNMTExmJiYtPj4+zVcpKjVaqZOndpsv90rMTGRsrIyli5dqvx2/t6R/bx587CwsMDDw4Pw8HCmT5/e7M+9bG1tuXLlCs7OzsTGxrJx40aeffZZpTw4OJhLly49cJE0fvx4Ll++jL29PXPmzKF9+/bEx8dz/vx5vLy8cHZ25oMPPlCm6h93/0ltk3z2uCRJUjOqq6txcXEhKSmJ/v37P+3mSG2cHGlLkiQ14+uvv2bIkCEyYEv/L8gb0SRJkprg6emJEIJPPvnkaTdFkgA5PS5JkiRJrYacHpckSZKkVkIGbUmSJElqJWTQliRJkqRWQgZtSZIkSWolZNCWJEmSpFbifwA29B2rDZTiNQAAAABJRU5ErkJggg==\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"tags": []
}
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "wbN-7BLTUoyc"
},
"source": [
""
],
"execution_count": null,
"outputs": []
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment