{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# MNIST-Neural Network-Single Hidden Layer with Tensorflow" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1.0.1\n" ] } ], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "from tensorflow.examples.tutorials.mnist import input_data\n", "import math\n", "import tensorflow as tf\n", "print(tf.__version__)\n", "\n", "%matplotlib inline" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 1. MNIST handwritten digits image set\n", "- Note1: http://yann.lecun.com/exdb/mnist/\n", "- Note2: https://www.tensorflow.org/versions/r0.11/tutorials/mnist/beginners/index.html" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Extracting /Users/yhhan/git/deeplink/0.Common/data/MNIST_data/train-images-idx3-ubyte.gz\n", "Extracting /Users/yhhan/git/deeplink/0.Common/data/MNIST_data/train-labels-idx1-ubyte.gz\n", "Extracting /Users/yhhan/git/deeplink/0.Common/data/MNIST_data/t10k-images-idx3-ubyte.gz\n", "Extracting /Users/yhhan/git/deeplink/0.Common/data/MNIST_data/t10k-labels-idx1-ubyte.gz\n" ] } ], "source": [ "mnist = input_data.read_data_sets(\"/Users/yhhan/git/deeplink/0.Common/data/MNIST_data/\", one_hot=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- Each image is 28 pixels by 28 pixels. We can interpret this as a big array of numbers:\n", "\n", "\n", "- flatten 1-D tensor of size 28x28 = 784.\n", " - Each entry in the tensor is a pixel intensity between 0 and 1, for a particular pixel in a particular image.\n", "$$[0, 0, 0, ..., 0.6, 0.7, 0.7, 0.5, ... 0.8, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.9, 0.3, ..., 0.4, 0.4, 0.4, ... 0, 0, 0]$$ " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1) Training Data" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " (55000, 784)\n", " (55000, 10)\n" ] } ], "source": [ "print(type(mnist.train.images), mnist.train.images.shape)\n", "print(type(mnist.train.labels), mnist.train.labels.shape)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- Number of train images is 55000.\n", "- **mnist.train.images** is a tensor with a shape of [55000, 784]. \n", "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- A one-hot vector is a vector which is 0 in most entries, and 1 in a single entry.\n", "- In this case, the $n$th digit will be represented as a vector which is 1 in the nth entry. \n", " - For example, 3 would be $[0,0,0,1,0,0,0,0,0,0]$. \n", "- **mnist.train.labels** is a tensor with a shape of [55000, 10]. \n", "" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\nRx9dzA455JBidsstt3Q9vmnTpknP9GzTtI39VVddVcxuvPHGYvayl72smDVtH9+0Jf2SJUuKWdvU\n0M1ns6bt4/tt/fr1xey+++4rZhs3bixmp556ajFr2po7pVTMNmzY0FPWNro5MYcddlhP5910003F\n7N///d97esydd9656/Fdd921p8dr8pKXvKSY/fEf/3FPj/m5z32umK1du7anx3w20s3B+r3f+72e\nzrv88suL2YMPPtjrOEwhujn1/MVf/MWoR2ASxl0EyjkvLETllRlg4HQT6qSbUCfdhDrpJgxXry8H\nAwAAAGAKsQgEAAAA0AIWgQAAAABawCIQAAAAQAtYBAIAAABogXF3B6vB9773vZ4y+uMHP/hBMTvn\nnHOK2b/+67/2dL2m7attEU8N5s2bV8wOPvjgYlbaCn716tXFc+bMmVPMli9fXsz23XffYpZzLmZN\n29XPnz+/mMGw7Lbbbj2dd/jhhxezc889t+vxV7/61T1daxDWrVtXzM4777whTkKb/dmf/Vkxe+EL\nX1jMrr322mJ24403TmomYPhmzJgx6hGYBHcCAQAAALSARSAAAACAFrAIBAAAANACFoEAAAAAWsAi\nEAAAAEALWAQCAAAAaIEpsUU8QE3e/OY3F7MTTjihmKWUuh5v2rK9dE5E8zbwTedt2LChmF1yySXF\nbOXKlcUMdtSHP/zhYrZs2bJidtRRRxWzr371q8Vs3rx5xWynner/f2KXX355Mfvud787xElosz//\n8z/v6bymLeKbvgdOBU1/f4yNjQ1xEoCJqf+nHgAAAAAmzSIQAAAAQAtYBAIAAABoAYtAAAAAAC1g\nEQgAAACgBewOxrhOPPHEYvbyl7+879d7znOeU8wOO+ywYrZixYq+zwI7qpddTnrdGaXpvNtvv72Y\nnXbaacXMDmAMy8yZM3s6b9q08o8ur3rVq3p6zOXLl3c9fv311xfP2X///YvZySef3NMcTe66666+\nPybsqL333run8zZu3NjnSfrviCOOKGZNPws3/V1w3HHHFbNHHnlkYoPBiOy6667FbPbs2Tv8eGvW\nrJnENPSTO4EAAAAAWsAiEAAAAEALWAQCAAAAaAGLQAAAAAAtYBEIAAAAoAUsAgEAAAC0wLhbxKeU\nlkXE6yPi4Zzz73aOvT8iToiI9Z1POzPn/OVBDdlWM2bMKGZvectbitkpp5wytDlSSn29VkTEHnvs\n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\nAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig = plt.figure(figsize=(20, 5))\n", "for i in range(5):\n", " img = np.array(mnist.train.images[i])\n", " img.shape = (28, 28)\n", " plt.subplot(150 + (i+1))\n", " plt.imshow(img, cmap='gray')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2) Validation Data" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " (5000, 784)\n", " (5000, 10)\n" ] } ], "source": [ "print(type(mnist.validation.images), mnist.validation.images.shape)\n", "print(type(mnist.validation.labels), mnist.validation.labels.shape)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 3) Test Data" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " (10000, 784)\n", " (10000, 10)\n" ] } ], "source": [ "print(type(mnist.test.images), mnist.test.images.shape)\n", "print(type(mnist.test.labels), mnist.test.labels.shape)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 2. Simple Neural Network Model (No Hidden Layer)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1) Tensor Operation and Shape" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- Input Layer to Output Layer\n", " - $i=1...784$\n", " - $j=1...10$\n", "$$ u_j = \\sum_i W_{ji} x_i + b_j $$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- Presentation of Matrix and Vector\n", " - Shape of ${\\bf W}: (10, 784)$\n", " - Shape of ${\\bf x}: (784, 1)$\n", " - Shape of ${\\bf b}: (10,)$\n", " - Shape of ${\\bf u}: (10,)$\n", "$$ {\\bf u} = {\\bf Wx + b} $$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- **Transposed Matrix** Operation in Tensorflow\n", " - Shape of ${\\bf W}: (784, 10)$\n", " - Shape of ${\\bf x}: (1, 784)$\n", " - Shape of ${\\bf b}: (10,)$\n", " - Shape of ${\\bf u}: (10,)$\n", "$$ {\\bf u} = {\\bf xW + b} $$ " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- Small Sized Example" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(2, 3) (1, 2) (1, 3)\n", "[[ 9 12 15]]\n", "\n", "(3,) (1, 3)\n", "[[19 32 45]]\n" ] } ], "source": [ "W_ = np.array([[1, 2, 3], [4, 5, 6]]) #shape of W: (2, 3)\n", "x_ = np.array([[1, 2]]) #shape of x: (1, 2)\n", "xW_ = np.dot(x_, W_) #shape of xW: (1, 3)\n", "print(W_.shape, x_.shape, xW_.shape)\n", "print(xW_)\n", "\n", "print()\n", "\n", "b_ = np.array([10, 20, 30]) #shape of b: (3,)\n", "u_ = xW_ + b_ #shape of u: (1, 3) \n", "print(b_.shape, u_.shape)\n", "print(u_)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2) Mini Batch" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(100, 784)\n", "(100, 10)\n" ] } ], "source": [ "batch_images, batch_labels = mnist.train.next_batch(100)\n", "print(batch_images.shape)\n", "#print batch_images\n", "print\n", "\n", "print(batch_labels.shape)\n", "#print batch_labels" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- Mini Batch (ex. batch size = 100) \n", " - Shape of ${\\bf W}: (784, 10)$\n", " - Shape of ${\\bf x}: (100, 784)$\n", " - Shape of ${\\bf b}: (10,)$\n", " - Shape of ${\\bf u}: (100, 10)$\n", "$$ {\\bf U} = {\\bf XW + B} $$ " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- Small Sized Example" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(2, 3) (5, 2) (5, 3)\n", "[[ 9 12 15]\n", " [ 9 12 15]\n", " [ 9 12 15]\n", " [ 9 12 15]\n", " [ 9 12 15]]\n", "\n", "(3,) (5, 3)\n", "[[19 32 45]\n", " [19 32 45]\n", " [19 32 45]\n", " [19 32 45]\n", " [19 32 45]]\n" ] } ], "source": [ "W_ = np.array([[1, 2, 3], [4, 5, 6]]) #shape of W: (2, 3)\n", "x_ = np.array([[1, 2], [1, 2], [1, 2], [1, 2], [1, 2]]) #shape of x: (5, 2)\n", "xW_ = np.dot(x_, W_) #shape of xW: (5, 3)\n", "print(W_.shape, x_.shape, xW_.shape)\n", "print(xW_)\n", "\n", "print()\n", "\n", "b_ = np.array([10, 20, 30]) #shape of b: (3,)\n", "u_ = xW_ + b_ #shape of u: (1, 3) \n", "print(b_.shape, u_.shape)\n", "print(u_)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 3) Model Construction" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- The placeholder to store the training data:" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "x - (?, 784)\n" ] } ], "source": [ "x = tf.placeholder(tf.float32, [None, 784])\n", "print(\"x -\", x.get_shape())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- The placeholder to store the correct answers (ground truth):" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": true }, "outputs": [], "source": [ "y_target = tf.placeholder(tf.float32, [None, 10])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- A single (output) layer neural network model" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "W - (784, 10)\n", "b - (10,)\n" ] } ], "source": [ "weight_init_std = 0.01\n", "W = tf.Variable(weight_init_std * tf.random_normal([784, 10]))\n", "b = tf.Variable(tf.zeros([10]))\n", "print(\"W -\", W.get_shape())\n", "print(\"b -\", b.get_shape())" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "u - (?, 10)\n" ] } ], "source": [ "u = tf.matmul(x, W) + b\n", "print(\"u -\", u.get_shape())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 4) Target Setup" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- softmax\n", "\n", "$$ {\\bf z} = softmax({\\bf u}) $$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- Error functions: Cross entropy" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- Suppose you have two tensors, where $u$ contains computed scores for each class (for example, from $u = W*x + b$) and $y_target$ contains one-hot encoded true labels.\n", "\n", "
\n",
    "u  = ... # Predicted label, e.g. $u = tf.matmul(X, W) + b\n",
    "y_target  = ... # True label, one-hot encoded\n",
    "
\n", "\n", "- We call $u$ **logits** (if you interpret the scores in u as unnormalized log probabilities).\n", "\n", "- Additionally, the total cross-entropy loss computed in this manner:\n", "\n", "
\n",
    "z = tf.nn.softmax(u)\n",
    "total_loss = tf.reduce_mean(-tf.reduce_sum(y_target * tf.log(z), [1]))\n",
    "
\n", "\n", "- is essentially equivalent to the total cross-entropy loss computed with the function softmax_cross_entropy_with_logits():\n", "\n", "
\n",
    "total_loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=u, labels=y_target))\n",
    "
" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "collapsed": false }, "outputs": [], "source": [ "learning_rate = 0.1\n", "error = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=u, labels=y_target))\n", "optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(error)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 4. Learning (Training) & Evaluation" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Total batch: 550\n", "Epoch: 0, Train Error: 2.30572, Validation Error: 2.30698, Test Accuracy: 0.12840\n", "Epoch: 1, Train Error: 0.39198, Validation Error: 0.37061, Test Accuracy: 0.90180\n", "Epoch: 2, Train Error: 0.34676, Validation Error: 0.32587, Test Accuracy: 0.90890\n", "Epoch: 3, Train Error: 0.32534, Validation Error: 0.30698, Test Accuracy: 0.91660\n", "Epoch: 4, Train Error: 0.31445, Validation Error: 0.29831, Test Accuracy: 0.91660\n", "Epoch: 5, Train Error: 0.30418, Validation Error: 0.28912, Test Accuracy: 0.91790\n", "Epoch: 6, Train Error: 0.29866, Validation Error: 0.28601, Test Accuracy: 0.91850\n", "Epoch: 7, Train Error: 0.29390, Validation Error: 0.28150, Test Accuracy: 0.91900\n", "Epoch: 8, Train Error: 0.29029, Validation Error: 0.27967, Test Accuracy: 0.91980\n", "Epoch: 9, Train Error: 0.28661, Validation Error: 0.27622, Test Accuracy: 0.92200\n", "Epoch: 10, Train Error: 0.28457, Validation Error: 0.27407, Test Accuracy: 0.92190\n", "Epoch: 11, Train Error: 0.28074, Validation Error: 0.27155, Test Accuracy: 0.92230\n", "Epoch: 12, Train Error: 0.27949, Validation Error: 0.27210, Test Accuracy: 0.92440\n", "Epoch: 13, Train Error: 0.27634, Validation Error: 0.26903, Test Accuracy: 0.92230\n", "Epoch: 14, Train Error: 0.27572, Validation Error: 0.26896, Test Accuracy: 0.92290\n", "Epoch: 15, Train Error: 0.27364, Validation Error: 0.26740, Test Accuracy: 0.92340\n", "Epoch: 16, Train Error: 0.27223, Validation Error: 0.26725, Test Accuracy: 0.92270\n", "Epoch: 17, Train Error: 0.27102, Validation Error: 0.26595, Test Accuracy: 0.92290\n", "Epoch: 18, Train Error: 0.27071, Validation Error: 0.26719, Test Accuracy: 0.92330\n", "Epoch: 19, Train Error: 0.26938, Validation Error: 0.26507, Test Accuracy: 0.92190\n", "Epoch: 20, Train Error: 0.26838, Validation Error: 0.26431, Test Accuracy: 0.92210\n", "Epoch: 21, Train Error: 0.26776, Validation Error: 0.26610, Test Accuracy: 0.92200\n", "Epoch: 22, Train Error: 0.26633, Validation Error: 0.26555, Test Accuracy: 0.92400\n", "Epoch: 23, Train Error: 0.26622, Validation Error: 0.26398, Test Accuracy: 0.92470\n", "Epoch: 24, Train Error: 0.26345, Validation Error: 0.26242, Test Accuracy: 0.92270\n", "Epoch: 25, Train Error: 0.26297, Validation Error: 0.26230, Test Accuracy: 0.92380\n", "Epoch: 26, Train Error: 0.26315, Validation Error: 0.26254, Test Accuracy: 0.92380\n", "Epoch: 27, Train Error: 0.26165, Validation Error: 0.26105, Test Accuracy: 0.92450\n", "Epoch: 28, Train Error: 0.26111, Validation Error: 0.26239, Test Accuracy: 0.92470\n", "Epoch: 29, Train Error: 0.25995, Validation Error: 0.26142, Test Accuracy: 0.92350\n", "Epoch: 30, Train Error: 0.25970, Validation Error: 0.26080, Test Accuracy: 0.92450\n", "Epoch: 31, Train Error: 0.25900, Validation Error: 0.26151, Test Accuracy: 0.92420\n", "Epoch: 32, Train Error: 0.26040, Validation Error: 0.26189, Test Accuracy: 0.92400\n", "Epoch: 33, Train Error: 0.25777, Validation Error: 0.25990, Test Accuracy: 0.92350\n", "Epoch: 34, Train Error: 0.25738, Validation Error: 0.26107, Test Accuracy: 0.92430\n", "Epoch: 35, Train Error: 0.25743, Validation Error: 0.26133, Test Accuracy: 0.92400\n", "Epoch: 36, Train Error: 0.25644, Validation Error: 0.26034, Test Accuracy: 0.92460\n", "Epoch: 37, Train Error: 0.25596, Validation Error: 0.26001, Test Accuracy: 0.92440\n", "Epoch: 38, Train Error: 0.25591, Validation Error: 0.26088, Test Accuracy: 0.92520\n", "Epoch: 39, Train Error: 0.25558, Validation Error: 0.26054, Test Accuracy: 0.92540\n", "Epoch: 40, Train Error: 0.25539, Validation Error: 0.26121, Test Accuracy: 0.92550\n", "Epoch: 41, Train Error: 0.25400, Validation Error: 0.25911, Test Accuracy: 0.92520\n", "Epoch: 42, Train Error: 0.25396, Validation Error: 0.25937, Test Accuracy: 0.92360\n", "Epoch: 43, Train Error: 0.25311, Validation Error: 0.25945, Test Accuracy: 0.92460\n", "Epoch: 44, Train Error: 0.25310, Validation Error: 0.25960, Test Accuracy: 0.92520\n", "Epoch: 45, Train Error: 0.25337, Validation Error: 0.26013, Test Accuracy: 0.92450\n", "Epoch: 46, Train Error: 0.25380, Validation Error: 0.26053, Test Accuracy: 0.92570\n", "Epoch: 47, Train Error: 0.25286, Validation Error: 0.25917, Test Accuracy: 0.92560\n", "Epoch: 48, Train Error: 0.25228, Validation Error: 0.26081, Test Accuracy: 0.92410\n", "Epoch: 49, Train Error: 0.25221, Validation Error: 0.26051, Test Accuracy: 0.92410\n" ] } ], "source": [ "prediction_and_ground_truth = tf.equal(tf.argmax(u, 1), tf.argmax(y_target, 1))\n", "accuracy = tf.reduce_mean(tf.cast(prediction_and_ground_truth, tf.float32))\n", "with tf.Session() as sess:\n", " init = tf.global_variables_initializer()\n", " sess.run(init)\n", " \n", " batch_size = 100\n", " total_batch = int(math.ceil(mnist.train.num_examples/float(batch_size)))\n", " print(\"Total batch: %d\" % total_batch) \n", "\n", " training_epochs = 50\n", " epoch_list = []\n", " train_error_list = []\n", " validation_error_list = []\n", " test_accuracy_list = []\n", " for epoch in range(training_epochs):\n", " epoch_list.append(epoch)\n", " # Train Error Value\n", " train_error_value = sess.run(error, feed_dict={x: mnist.train.images, y_target: mnist.train.labels})\n", " train_error_list.append(train_error_value)\n", " \n", " validation_error_value = sess.run(error, feed_dict={x: mnist.validation.images, y_target: mnist.validation.labels})\n", " validation_error_list.append(validation_error_value)\n", " \n", " test_accuracy_value = sess.run(accuracy, feed_dict={x: mnist.test.images, y_target: mnist.test.labels})\n", " test_accuracy_list.append(test_accuracy_value) \n", " print(\"Epoch: {0:2d}, Train Error: {1:0.5f}, Validation Error: {2:0.5f}, Test Accuracy: {3:0.5f}\".format(epoch, train_error_value, validation_error_value, test_accuracy_value))\n", " \n", " for i in range(total_batch):\n", " batch_images, batch_labels = mnist.train.next_batch(batch_size)\n", " sess.run(optimizer, feed_dict={x: batch_images, y_target: batch_labels})" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 5. Analysis with Graph" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\nwBQzG5rW7SvASncfDlQCPzazosj5se5+rrtXtETMIiIi0j6oyJStAQOCV90yJyIirUyvXr0YPXo0\n8+fPB4JZTFdeeSVdunRhzpw5vPzyyyxatIivfe1reAMzcn/605/StWtXVq1axe23386yZcsOn/vB\nD37A0qVLefXVV/nDH/7Aq6++yo033sgpp5zCokWLWLRoUZ1rLVu2jIceeogXX3yRP//5z/znf/4n\nr7zyCgBvvfUWX/7yl1mxYgWlpaU88cQTecjKcW00UOXua9z9ADAbmJTWx4HuZmZAN+B9oKZlwxQR\nEZH2pkPcAbQZiUTwum4djB4dbywiItIq3bTgJpa/u7xZr3nuSecyY/yMRvulbpmbNGkSs2fP5oEH\nHsDdufXWW1m8eDEFBQVs3LiRv/71r5x00kkZr7F48WJuvPFGAM455xzOOeecw+ceffRRZs2aRU1N\nDZs3b2blypV1zqd7/vnnufzyyykuLgbgU5/6FM899xyXXXYZAwcOPDx21KhRrF27Ntt0SHb6Ausj\nxxuA89L63AvMBTYB3YGr3P1QeM6B35lZLfAzd5+V53hFRESknVCRKVupIpNmMomISCs0adIkbr75\nZl5++WX27NnDqFGjePjhh3nvvfdYtmwZHTt2pLy8nH379uV87bfffpu7776bJUuW0LNnT66++uom\nXSelU6dOh/cLCwt1u1w8/gZYDnwMOA14xsyec/edwBh332hmfcL21e6+ODrYzKYCUwHKyspIJpM5\nB1BdXd2kcdI8lP94Kf/xUv7jpfzHK9/5z2uRyczGA/cAhcD97n5n2vlJwB3AIYIp2je5+/PhuZuB\nawl+m/Ya8EV3b/pPtMeqtBS6d1eRSURE6pXNjKN86datG2PHjuWaa645vOD3jh076NOnDx07dmTR\nokW808j/wy688EIeeeQRPvaxj/H666/z6quvArBz506Ki4spKSnhr3/9K/Pnz6eyshKA7t27s2vX\nLnr37l3nWhdccAFXX30106dPx92ZM2cOv/zlL5v/g0smG4H+keN+YVvUF4E7Pbh/ssrM3gaGAC+5\n+0YAd99iZnMIbr+rU2QKZzfNAqioqPDUfw+5SCaTNGWcNA/lP17Kf7yU/3gp//HKd/7ztiZTlotO\nPgsMd/dzgWuA+8OxfYEbgQp3P5ugSDU5X7FmxSxYl0lFJhERaaWmTJnCX/7yl8NFps997nMsXbqU\nYcOG8Ytf/IIhQ4Y0OP66666jurqaM888k9tuu41Ro0YBMHz4cEaMGMGQIUP47Gc/y/nnn394zNSp\nUxk/fvzhhb9TRo4cydVXX83o0aM577zzuPbaaxkxYkQzf2KpxxJgsJkNDBfznkxwa1zUOmAcgJmV\nAWcAa8ys2My6h+3FwCXA6y0WuYiIiLRp+ZzJdHjRSQAzSy06uTLVwd2rI/2LCWYtRWPrYmYHga4E\nawbEK5EI1mQSERFphf72b/+2zsLevXv35k9/+lPGvtXVwf+Cy8vLef31oIbQpUsXZs+enbH/ww8/\nnLH9hhtu4IYbbjh8HF1f6ZZbbuGWW26p0z/1frt27QLg61//esMfSnLm7jVmdj2wkOAXdQ+6+woz\nmxaen0kwk/xhM3sNMOBb7r7VzE4F5gTrgdMBeMTdF8TyQURERKTNyWeRKZtFJzGzy4F/AfoAnwAI\n1wG4m+C3bHuBp9396TzGmp1EAur5YV1ERESktXD3ecC8tLaZkf1NBLOU0setAYbnPUARERFpl2Jf\n+Nvd5xD8xuxCgt+qfdzMehLMehoIbAceM7PPu/t/pY8/1oUnc1n0qn9tLad98AHPzZtHbdeuOb2P\nZKZF3+Kl/MdL+Y9Xc+W/pKTk8KwcyV5tbW2jedu3b5/+joiIiIi0IfksMmWz6ORh7r7YzE41s97A\nWOBtd38PwMx+DXwUOKrIdKwLT+a06NW778KsWVwwYACcfXZO7yOZadG3eCn/8VL+49Vc+V+1ahXd\nu3c/9oCOM7t27Wo0b507d9Y6TiIiIiJtSN4W/iaLRSfNbJCFN/2b2UigE7CN4Da5D5tZ1/D8OGBV\nHmPNzoABwavWZRIRkYjoOkjSPJRTERERkbYnbzOZslx08tPAF8LFvfcCV4WP0n3RzB4HXgZqgFcI\nZyvFKpEIXvWEORERCXXu3Jlt27ZxwgknEP7eRI6Ru7Nt2zY6d+4cdygiIiIikoO8rsmUxaKTdwF3\n1TP2u8B38xlfzk4+GTp2VJFJREQO69evHxs2bOC9996LO5Q2Zd++fQ0WkTp37ky/fv1aMCIRERER\nOVaxL/zdphQUQP/+KjKJiMhhHTt2ZODAgXGH0eYkk0mtt5RHZjYeuIdgNvn97n5n2vkSgrUuBxD8\nPHi3uz+UzVgRERGR+uRzTab2acAArckkIiIirZaZFQL3AROAocAUMxua1u0rwEp3Hw5UAj82s6Is\nx4qIiIhkpCJTrhIJzWQSERGR1mw0UOXua9z9ADAbmJTWx4Hu4QNWugHvE6yDmc1YERERkYxUZMpV\nIgGbNsGBA3FHIiIiIpJJX2B95HhD2BZ1L3AmsAl4Dfiqux/KcqyIiIhIRlqTKVeJBLjDhg1w6qlx\nRyMiIiLSFH8DLAc+BpwGPGNmz2U72MymAlMBysrKSCaTOQdQXV3dpHHSPJT/eCn/8VL+46X8xyvf\n+VeRKVcDBgSv77yjIpOIiIi0RhuB/pHjfmFb1BeBO93dgSozexsYkuVY3H0WMAugoqLCKysrcw4y\nmUzSlHHSPJT/eCn/8VL+46X8xyvf+dftcrlKJIJXLf4tIiIirdMSYLCZDTSzImAyMDetzzpgHICZ\nlQFnAGuyHCsiIiKSkWYy5ap/+Ms9Lf4tIiIirZC715jZ9cBCoBB40N1XmNm08PxM4A7gYTN7DTDg\nW+6+FSDT2Dg+h4iIiLQ9KjLlqnNnOOkkFZlERESk1XL3ecC8tLaZkf1NwCXZjhURERHJhm6Xa4pE\nQkUmEREREREREZEIFZka8W71u1zz5DW8sP6FI40DBmhNJhERERERERGRCBWZGlFohTy0/CGWblp6\npDGRCIpMhw7FF5iIiIiIiIiISCuiIlMjenftTZcOXVi7fe2RxkQC9u+HLVtii0tEREREREREpDVR\nkakRZkaiNME7OyJrMCUSwavWZRIRERERERERAVRkykqiJME72yMFpQEDgletyyQiIiKtkJmNN7M3\nzKzKzKZnOP8NM1sebq+bWa2Z9QrPrTWz18JzS4++uoiIiEhmKjJlIVGimUwiIiLSNphZIXAfMAEY\nCkwxs6HRPu7+I3c/193PBb4N/MHd3490GRuer2ixwEVERKTNU5EpC4nSBFv3bGX3gd1BQ2kp9Oih\nIpOIiIi0RqOBKndf4+4HgNnApAb6TwF+1SKRiYiISLumIlMWykvLAVi3I3J7XCKhIpOIiIi0Rn2B\n9ZHjDWHbUcysKzAeeCLS7MDvzGyZmU3NW5QiIiLS7nSIO4C2IFES3B73zo53OPPEM4PGAQO0JpOI\niIi0dZ8E/ph2q9wYd99oZn2AZ8xstbsvjg4Ki09TAcrKykgmkzm/cXV1dZPGSfNQ/uOl/MdL+Y+X\n8h+vfOdfRaYsJErDItP2tHWZ/vjHmCISERERqddGoH/kuF/Ylslk0m6Vc/eN4esWM5tDcPvd4rQ+\ns4BZABUVFV5ZWZlzkMlkkqaMk+ah/MdL+Y+X8h8v5T9e+c6/bpfLwsndTqZDQYejF//evh127owv\nMBEREZGjLQEGm9lAMysiKCTNTe9kZiXARcCTkbZiM+ue2gcuAV5vkahFRESkzVORKQuFBYX079Ff\nT5gTERGRVs/da4DrgYXAKuBRd19hZtPMbFqk6+XA0+6+O9JWBjxvZn8BXgKecvcFLRW7iIiItG26\nXS5LidIEa7evjTREikzDhsUSk4iIiEgm7j4PmJfWNjPt+GHg4bS2NcDwPIcnIiIi7ZRmMmUpUZKo\nuybTgAHBqxb/FhERERERERFRkSlbiZIEm3Zt4kDtgaDhpJOgqEi3y4mIiIiIiIiIoCJT1hKlCRxn\nw84NQUNBAfTvryKTiIiIiIiIiAh5LjKZ2Xgze8PMqsxseobzk8zsVTNbbmZLzWxM5FypmT1uZqvN\nbJWZfSSfsTYmURKswVTnlrlEQkUmERERERERERHyWGQys0LgPmACMBSYYmZD07o9Cwx393OBa4D7\nI+fuARa4+xCCBShX5SvWbJSXlgPUfcLcgAFak0lEREREREREhPzOZBoNVLn7Gnc/AMwGJkU7uHu1\nu3t4WAw4gJmVABcCD4T9Drj79jzG2qj+Jf0x7OiZTJs3w4ED8QUmIiIiIiIiItIK5LPI1BdYHzne\nELbVYWaXm9lq4CmC2UwAA4H3gIfM7BUzu9/MivMYa6OKCos4ufvJdWcyJRLgDuvX1z9QREREpIVl\nsWTBN8LlCpab2etmVmtmvbIZKyIiIlKfDnEH4O5zgDlmdiFwB/BxgrhGAje4+4tmdg8wHfhO+ngz\nmwpMBSgrKyOZTOb0/tXV1VmP6Wk9Wb52+eH+pR98wLnA8iefZPvIkTm9rwRyyb80P+U/Xsp/vJT/\neCn/+RNZsuBigl/yLTGzue6+MtXH3X8E/Cjs/0ngZnd/P5uxIiIiIvXJZ5FpI9A/ctwvbMvI3Reb\n2alm1pvgh5oN7v5iePpxgiJTpnGzgFkAFRUVXllZmVOQyWSSbMcM2zaMJRuXHOnfvz987Wuc26sX\n5Pi+Esgl/9L8lP94Kf/xUv7jpfzn1eElCwDMLLVkQX2FoinAr5o4VkREROSwfN4utwQYbGYDzawI\nmAzMjXYws0FmZuH+SKATsM3d3wXWm9kZYddxtIIfbhIlCdbtWMchPxQ09OsXvOoJcyIiItJ6ZLVk\nAYCZdQXGA0/kOlZEREQkXd5mMrl7jZldDywECoEH3X2FmU0Lz88EPg18wcwOAnuBqyILgd8A/HdY\noFoDfDFfsWYrUZLg4KGDbN61mb49+kKnTnDyySoyiYiISFv1SeCP7v5+LoOOdbkC0C2TcVP+46X8\nx0v5j5fyH6985z+vazK5+zxgXlrbzMj+XcBd9YxdDlTkM75cJUoTALyz452gyATB4t8qMomIiEjr\nkcuSBZM5cqtc1mOPdbkC0C2TcVP+46X8x0v5j5fyH6985z+ft8u1O4mSsMi0Pe0Jc+vWxRSRiIiI\nyFEaXbIAwMxKgIuAJ3MdKyIiIpKJikw5iM5kOmzAgKDIdOhQTFGJiIiIHOHuNUBqyYJVwKOpJQtS\nyxaELgeedvfdjY1tuehFRESkLcvr7XLtTbeibvTq0uvomUwHDsBf/xqszyQiIiISs8aWLAiPHwYe\nzmasiIiISDY0kylH5aXldWcyJYLZTVqXSURERERERESOZyoy5ShRklCRSUREREREREQkjYpMOUqU\nJHhn+zu4e9AwYEDwqsW/RUREREREROQ4piJTjhKlCXYf3M37e98PGkpKgk0zmURERERERETkOKYi\nU44SJRmeMJdIqMgkIiIiIiIiIsc1FZlylCgNi0zpT5hTkUlERERaCTMbb2ZvmFmVmU2vp0+lmS03\nsxVm9odI+1ozey08t7TlohYREZG2rkPcAbQ1qZlMa7evjTQmYPHieAISERERiTCzQuA+4GJgA7DE\nzOa6+8pIn1LgJ8B4d19nZn3SLjPW3be2WNAiIiLSLmgmU456delFccfiurfLDRgAO3YEm4iIiEi8\nRgNV7r7G3Q8As4FJaX0+C/za3dcBuPuWFo5RRERE2iEVmXJkZiRKE0evyQS6ZU5ERERag77A+sjx\nhrAt6nSgp5klzWyZmX0hcs6B34XtU/Mcq4iIiLQjul2uCRIliaPXZIKgyHTOOfEEJSIiIpK9DsAo\nYBzQBfiTmf3Z3d8Exrj7xvAWumfMbLW711kXICw+TQUoKysjmUzmHEB1dXWTxknzUP7jpfzHS/mP\nl/Ifr3znX0WmJigvLefFjS8eaUgVmdatiycgERERkSM2Av0jx/3CtqgNwDZ33w3sNrPFwHDgTXff\nCMEtdGY2h+D2uzpFJnefBcwCqKio8MrKypyDTCaTNGWcNA/lP17Kf7yU/3gp//HKd/51u1wTJEoS\nvL/3faoPVAcNffpAUZFulxMREZHWYAkw2MwGmlkRMBmYm9bnSWCMmXUws67AecAqMys2s+4AZlYM\nXAK83oJKJ7LBAAAgAElEQVSxi4iISBummUxNkCgNZi69s/0dzupzFhQUBIt/q8gkIiIiMXP3GjO7\nHlgIFAIPuvsKM5sWnp/p7qvMbAHwKnAIuN/dXzezU4E5ZgbBz4mPuPuCeD6JiIiItDUqMjVBoiQs\nMu0Ii0wQ3DKnIpOIiIi0Au4+D5iX1jYz7fhHwI/S2tYQ3DYnIiIikjPdLtcE0ZlMRxoTWpNJRERE\nRERERI5bKjI1wUndTqKosIh3dkSKTIMGwebNsG1bfIGJiIiIiIiIiMRERaYmKLAC+vfoX7fIdMEF\nwesf/hBPUCIiIiIiIiIiMVKRqYkSpQnWbl97pGH0aOjaFRYtii0mEREREREREZG4qMjURImSRN01\nmYqK4PzzVWQSERERERERkeOSikxNlChJsLl6M/tr9h9pHDsWVqyALVviC0xERESOe2Y23szeMLMq\nM5teT59KM1tuZivM7A+5jBURERHJREWmJko9YW79zvVHGseODV6TyZYPSERERAQws0LgPmACMBSY\nYmZD0/qUAj8BLnP3s4DPZDtWREREpD4qMjVReWk5QN1b5kaNgm7dVGQSERGROI0Gqtx9jbsfAGYD\nk9L6fBb4tbuvA3D3LTmMFREREclIRaYmSpQEM5nqPGGuY8fgKXNal0lERETi0xeITLVmQ9gWdTrQ\n08ySZrbMzL6Qw1gRERGRjDrk8+JmNh64BygE7nf3O9POTwLuAA4BNcBN7v585HwhsBTY6O6X5jPW\nXPXr0Y8CK6g7kwmCW+bmz4fNm+Hkk+MJTkRERKRhHYBRwDigC/AnM/tztoPNbCowFaCsrIxkE2Zx\nV1dXN2mcNA/lP17Kf7yU/3gp//HKd/7zVmSK3NN/McFvwZaY2Vx3Xxnp9iww193dzM4BHgWGRM5/\nFVgF9MhXnE3VsbAjp3Q/pe5MJqi7LtOUKS0el4iIiBz3NgL9I8f9wraoDcA2d98N7DazxcDwsL2x\nsbj7LGAWQEVFhVdWVuYcZDKZpCnjpHko//FS/uOl/MdL+Y9XvvOfz9vlGr2n392r3d3Dw2IgtY+Z\n9QM+AdyfxxiPSaIkcXSRacQIKCnRLXMiIiISlyXAYDMbaGZFwGRgblqfJ4ExZtbBzLoC5xH8Yi+b\nsSIiIiIZ5bPIlNU9/WZ2uZmtBp4CromcmgF8k+BWulYpUZo4+na5wkK48EIVmURERCQW7l4DXA8s\nJCgcPeruK8xsmplNC/usAhYArwIvESxr8Hp9Y+P4HCIiItL25HVNpmy4+xxgjpldSLA+08fN7FJg\ni7svM7PKhsYf65oAx3Q/4nZYt2Mdzy56lkIrPNzcr39/Bv32t/zpscfYf+KJTbv2cUL348ZL+Y+X\n8h8v5T9eyn9+ufs8YF5a28y04x8BP8pmrIiIiEg28llkymY9gMPcfbGZnWpmvYHzgcvMbCLQGehh\nZv/l7p/PMO6Y1gQ4lvsR3+j2Bo+sf4TTR55O/5LIRy0thZ/8hI/s2we617RBuh83Xsp/vJT/eCn/\n8VL+RURERNqffN4u1+g9/WY2yMws3B8JdCJYhPLb7t7P3cvDcb/PVGCKW6I0AXD0ukznnAO9eumW\nORERERERERE5buStyJTNegDAp4HXzWw5wZPoroosBN7qJUrCIlP6ukwFBXDRRSoyiYiIiIiIiMhx\nI69rMjW2HoC73wXc1cg1kkAyD+Eds3pnMgGMHQtz5sDatVBe3qJxiYiIiIiIiIi0tHzeLtfude3Y\nlRO7nnj0TCYIikyg2UwiIiIiIiIiclxosMhkZoVmdmdLBdMWJUoTmWcynXUW9O6tIpOIiIiIiIiI\nHBcaLDK5ey0wtoViaZMSJfUUmcyCJ8stWgRtZ5kpERERaQfMbLyZvWFmVWY2PcP5SjPbYWbLw+22\nyLm1ZvZa2L60ZSMXERGRtiybNZmWmdmvgceA3alGd59b/5DjR6Ikwby35uHuhA/KO2LsWHj8cfi/\n/4NBg+IJUERERI4rZlZI8ECVi4ENwBIzm+vuK9O6Puful9ZzmbHuvjWfcYqIiEj7k02RqTtBcWli\npM0BFZkIbpfbW7OXrXu2cmLxiXVPRtdlUpFJREREWsZooMrd1wCY2WxgEpBeZBIRERFpVo0Wmdz9\n71oikLYqUXLkCXNHFZmGDIGTTgqKTF/+cgzRiYiIyHGoL7A+crwBOC9Dv4+a2avARuDr7r4ibHfg\nd2ZWC/zM3WelDzSzqcBUgLKyMpLJZM5BVldXN2mcNA/lP17Kf7yU/3gp//HKd/4bLTKZ2SnAPcCY\nsGkxcLO7b8pbVG1IojQoMq3dvpaKUyrqnkxflyn9djoRERGRepjZDcB/ufsHebj8y8AAd682s4nA\nb4DB4bkx7r7RzPoAz5jZandfHB0cFp5mAVRUVHhlZWXOASSTSZoyTpqH8h8v5T9eyn+8lP945Tv/\nDS78HXoIeBooD7dnwjYhMpNpe4bFvyG4Ze7dd+GNN1owKhEREWkHygjWU3o0XMg7299WbQT6R477\nhW2HuftOd68O9+cBHc2sd3i8MXzdAswhuP1OREREpFHZFJnK3P0/3X1/uN1P8EOPAKWdS+le1D3z\nE+bgyLpMmg4oIiIiOXD3fySYXfQAcDXwlpn9s5md1sjQJcBgMxtoZkXAZNLW0jSzk1JFKzMbTfAz\n4TYzKzaz7mF7MXAJ8HozfiwRERFpx7IpMr1vZpPtiKuA9/MdWFthZiRKE/UXmQYNgr59g1vmRERE\nRHLg7g68G241QE/gcTP7YQNjaoDrgYXAKuBRd19hZtPMbFrY7QrgdTP7C/DvwOTwvcqA58P2l4Cn\n3H1Bnj6eiIiItDPZPF3uGuAnBI/CdeDPYZuEykvL679dziyYzfT001qXSURERLJmZl8FvgBsBe4H\nvuHuB82sAHgL+GZ9Y8Nb4Oaltc2M7N8L3Jth3BpgeLN8ABERETnuNDiTycwKgcvcfaK7n+Duvd39\nUndf2zLhtQ2JkgZmMkFQZNqyBVbqycEiIiKStV7Ap9z9b9z9MXc/CODuh4BL4w1NRERE5GgNFpnc\nvRb4fAvF0mYlShJs37ednft3Zu6QWpdJt8yJiIhI9uYTWaLAzHqY2XkA7r4qtqhERERE6pHNmkzP\nm9kMM/uImZ2T2vIeWRuSKG3kCXMDB0IioSKTiIiI5OKnQHXkuDpsExEREWmVslmT6UPh66hImwMX\nNn84bVOiJCwy7XiHYWXDMncaOxbmzoVDh6Agm9qeiIiIHOcsXIwbCG6TM7NsfnYTERERiUU2azLN\ncPcL0jYVmCIanckEQZHp/ffhtddaKCoRERFp49aY2Y1m1jHcvgqsiTsoERERkfpksybTrS0US5vV\np7gPnQo7Nb74N+iWOREREcnWNOCjwEZgA3AeMDWbgWY23szeMLMqM5ue4Xylme0ws+Xhdlu2Y0VE\nRETqk82U66fN7Cbgf4DdqUZ3r2eV6+NPgRUwoGQAa7evrb9T//5w2mlBkemmm1osNhEREWmb3H0L\nMDnXceFM9PuAiwmKU0vMbK67pz/m9jl3v7SJY0VERESOkk2RKfV0ua8RrMVk4euAfAXVFiVKEw3P\nZIJgNtNjj0FtLRQWtkxgIiIi0iaZWWfgS8BZQOdUu7tf08jQ0UCVu68JrzMbmARkUyg6lrEiIiJy\nnGt0BWp37x/ZBqReWyK4tiRRkmh4TSYIikw7dsDy5S0TlIiIiLRlvwROAv4G+APQD9iVxbi+wPrI\n8YawLd1HzexVM5tvZmflOFZERETkKPXOZDKzr7n7j8P9T7n7ryPn7nD377REgG3FkN5DeOCVB9i0\naxOndD8lc6foukyjRmXuIyIiIhIY5O6fMbNJ7v5zM3sEeK6Zrv0yMMDdq81sIvAbYHC2g81sKuH6\nUGVlZSSTyZwDqK6ubtI4aR7Kf7yU/3gp//FS/uOV7/w3dLvc54Afh/v/CPw6cu4TgIpMEZecdgnf\neOYbLKhawDUj6pnFfvLJMGIE3H8/3HyzbpkTERGRhhwMX7eb2dnAu0CfLMZtBPpHjvuFbYdF19Z0\n93lm9hMz653N2HDMLGAWQEVFhVdWVmYRVl3JZJKmjJPmofzHS/mPl/IfL+U/XvnOf0O3y1k9+5mO\nj3vD+gyjb/e+zK+a33DHW2+FN96A//mflglMRERE2qpZZtaT4Jd9cwnWRbori3FLgMFmNtDMiggW\nD58b7WBmJ5mZhfujCX4m3JbNWBEREZH6NDSTyevZz3R83DMzJg6eyP+s+B8O1h6kY2HHzB0/9Sk4\n+2y44w646irNZhIREZGjmFkBsNPdPwAWA6dmO9bda8zsemAhUAg86O4rzGxaeH4mcAVwnZnVAHuB\nye7uQMaxzfnZREREpP1qaCbTcDN738w+AM4J91PHw1oovjZlwqAJ7Ny/kxfWv1B/p4IC+O53YfVq\nePTRlgtORERE2gx3PwR88xjGz3P30939NHf/Qdg2Myww4e73uvtZ7j7c3T/s7i80NFZEREQkGw0V\nmYqAE4HeQKdwP3XcuYFxx61xp46jY0HHxm+ZS81m+v73oba2ZYITERGRtuZ3ZvZ1M+tvZr1SW9xB\niYiIiNSn3iKTu9c2tLVkkG1Fj049uCBxAfPemtdwx4ICuO02zWYSERGRhlwFfIXgdrll4bY01ohE\nREREGtDQTKZjZmbjzewNM6sys+kZzk8ys1fNbLmZLTWzMWF7fzNbZGYrzWyFmX01n3E2pwmDJvDa\nltdYv2N9wx0//Wk466xgbSbNZhIREZE07j4ww5b12kwiIiIiLS1vRSYzKwTuAyYAQ4EpZjY0rduz\nwHB3Pxe4Brg/bK8BvubuQ4EPA1/JMLZVmjh4IgALqhY03DG1NtOqVfDYYy0QmYiIiLQlZvaFTFvc\ncYmIiIjUJ58zmUYDVe6+xt0PALOBSdEO7l4dPskEoJjwqXXuvtndXw73dwGrgL55jLXZnNn7TBIl\nCeZVNXLLHByZzaS1mURERORoH4psFwDfAy6LMyARERGRhtRbZDKzDyJPlItuH5jZ+1lcuy8QvWds\nAxkKRWZ2uZmtBp4imM2Ufr4cGAG8mMV7xs7MmDBoAr9b8zsO1B5ouHNqbaZVq+Dxx1smQBEREWkT\n3P2GyPZlYCTQLZuxjS1ZEOn3ITOrMbMrIm1rzey11HIGx/5JRERE5HjRoYFzvVsiAHefA8wxswuB\nO4CPp86ZWTfgCeAmd9+ZabyZTQWmApSVlZFMJnN6/+rq6pzHNKb/vv5UH6jm3rn3MrLnyIY79+7N\nhxIJ+Na3WNK7NxQWNmssrV0+8i/ZU/7jpfzHS/mPl/LfJLuBgY11iixZcDHBL/mWmNlcd1+Zod9d\nwNMZLjPW3bcee8giIiJyPKm3yJT+BLnwkbmdI02bGrn2RqB/5Lhf2Fbf+y02s1PNrLe7bzWzjgQF\npv929183MG4WMAugoqLCKysrGwmrrmQySa5jGvOhAx/i9tW3s6l4E7dU3tL4gB/+EK66isqtW+Gq\nq5o1ltYuH/mX7Cn/8VL+46X8x0v5b5yZ/ZZwKQGC2edDgWweS3t4yYLwOqklC1am9buB4GetDzVL\nwCIiInLca3RNJjP7hJm9SfCbsBfD199nce0lwGAzG2hmRcBkYG7atQeZmYX7I4FOwLaw7QFglbv/\nay4fqDUoLirmosRFzHsri3WZAK64AoYODdZmOnQov8GJiIhIW3E38ONw+xfgQnev99a3iEaXLDCz\nvsDlwE8zjHfgd2a2LJwxLiIiIpKVhm6XS/kBcD7wtLuPMLOLgSsbG+TuNWZ2PbAQKAQedPcVZjYt\nPD8T+DTwBTM7COwFrnJ3N7MxwN8Br5nZ8vCSt7p7llWb+E0cPJGbF97M2u1rKS8tb7hzam2myZOD\ntZmubDS9IiIi0v6tAza7+z4AM+tiZuXuvrYZrj0D+Ja7Hwp/3xc1xt03mlkf4BkzW+3ui6MdjnW5\nAtAtk3FT/uOl/MdL+Y+X8h+vfOc/myJTjbu/Z2YFZmbu/oyZ3Z3NxcOi0Ly0tpmR/bsI1gJIH/c8\ncNRPPG1Jqsg0/635XPeh6xofkJrNdPvtwX5BPh/8JyIiIm3AY8BHI8e1YVtjt7dls2RBBTA7LDD1\nBiaaWY27/8bdNwK4+xYzm0Nw+12dItOxLlcAumUybsp/vJT/eCn/8VL+45Xv/GdTydgRLsD9PPAL\nM/sxwawjacDgXoM5teepzKvKcvJVYSF85zuwcqWeNCciIiIAHdz98KNqw/2iLMY1umSBuw9093J3\nLwceB/7B3X9jZsVm1h3AzIqBS4DXm+fjiIiISHuXTZHpbwmKSjcBSYLfhF2ax5jaBTNj4qCJ/P7t\n37OvZl92gz7zGTjzTK3NJCIiIgDvmdllqQMzmwQ0+sQ3d68BUksWrAIeTS1ZkFq2oAFlwPNm9hfg\nJeApd1/Q5E8gIiIix5Vsikzfdvdadz/o7g+EC3Fn8cg0mTh4InsO7mHxO4sb7wzBbKbbboMVK+CJ\nJ/IbnIiIiLR204BbzWydma0DvgX8fTYD3X2eu5/u7qe5+w/CtpnRZQsifa9298fD/TXuPjzczkqN\nFREREclGNkWm8RnaPtHcgbRHleWVdO7QOfunzMGR2Uy3367ZTCIiIscxd/8/d/8wMBQY6u4fdfeq\nuOMSERERqU+9RSYz+3szewU4w8xejmxvEUy9lkZ06diFseVjmV81P/tB0dlMjz6av+BERESkVTOz\nfzazUnevdvdqM+tpZv8Ud1wiIiIi9WloJtOjwGcIng73mch2vrtPboHY2oWJgyfy5rY3qXo/h188\nXnklnHNOsBD4wYP5C05ERERaswnuvj114O4fABNjjEdERESkQfUWmdz9A3evcvfPAJ2Bi8PtxJYK\nrj2YMGgCAPPfymE2U0EB/OAHUFUFDz6Yp8hERESklSs0s06pAzPrAnRqoL+IiIhIrBpdk8nMvgI8\nBgwIt0fN7B/yHVh7cVqv0zj9hNNzu2UO4BOfgPPPD9Zm2rMnP8GJiIhIa/bfwLNm9iUzuxZ4Bvh5\nzDGJiIiI1Cubhb//Hhjt7re6+63AeQRPO5EsTRw0kUVrF7HnYA7FIjP4l3+BzZvh3nvzF5yIiIi0\nSu5+F/BPwJnAGcBCIBFrUCIiIiINyKbIZMCByPHBsE2yNGHwBPbV7CO5NpnbwAsugIkT4c47Yfv2\nxvuLiIhIe/NXwAnWxfwYWT58xczGm9kbZlZlZtMb6PchM6sxsytyHSsiIiKSrqGny3UId38JvGhm\n/2hm/wi8gKZq5+TCxIV07dg1t3WZUn7wA/jgA/jRj5o/MBEREWl1zOx0M/uuma0G/gNYB5i7j3X3\nRqc3m1khcB8wARgKTDGzofX0uwt4OtexIiIiIpk0NJPpJQB3/yHBLXN7wm2au9/dArG1G507dGbc\nwHHMq5qHu+c2+NxzYcoUmDED3n03PwGKiIhIa7KaYNbSpe4+xt3/A6jNYfxooMrd17j7AWA2MClD\nvxuAJ4AtTRgrIiIicpQODZw7fEucu79EWHSSppkwaAK/ffO3vLntTc7ofUZug7//fXjsMfinf9L6\nTCIiIu3fp4DJwCIzW0BQ6MllqYK+wPrI8QaCNTUPM7O+wOXAWOBDuYwNx08FpgKUlZWRTCZzCC9Q\nXV3dpHHSPJT/eCn/8VL+46X8xyvf+W+oyHSimd1S30l3/9c8xNNuTRg8AYD5VfNzLzINGgTXXgs/\n+xnccgucemoeIhQREZHWwN1/A/zGzIoJZhHdBPQxs58Cc9z96QYvkJ0ZwLfc/ZBZ7kttuvssYBZA\nRUWFV1ZW5nyNZDJJU8ZJ81D+46X8x0v5j5fyH69857+h2+UKgW5A93o2yUF5aTlDTxzKvLfmNe0C\n3/kOdOwI3/1u8wYmIiIirZK773b3R9z9k0A/4BXgW1kM3Qj0jxz3C9uiKoDZZrYWuAL4iZn9bZZj\nRURERDJqaCbTZnf/fotFchyYMGgC//HSf1B9oJpuRd1yG3zKKXDjjfDDH8I3vwnDhuUnSBEREWl1\n3P0DgplDs7LovgQYbGYDCQpEk4HPpl1vYGrfzB4G/tfdfxM++KXBsSIiIiL1aWgmU+5zp6VBEwdP\n5EDtARa9vahpF/jWt6BHD/h//695AxMREZF2w91rgOuBhcAq4FF3X2Fm08xsWlPG5jtmERERaR8a\nmsk0rsWiOE6MGTCG7kXd+flffs4nz/hk7hfo2TMoNN16K/zxj3D++c0fpIiIiLR57j4PmJfWNrOe\nvlc3NlZEREQkG/XOZHL391sykONBUWERX/vI13hi1RMsqFrQtIvceCOUlcG3vw3uzRugiIiIiIiI\niEgTNXS7nOTB9DHTOeOEM/iHp/6BPQf35H6B4mK47TZ47jlY0MRClYiIiIiIiIhIM1ORqYV16tCJ\nn136M97e/jbf/0MT11W/9loYODC4be7QoeYNUERERERERESkCVRkisFF5RdxzbnXcPcLd/PqX1/N\n/QJFRXDHHbB8OTz6aPMHKCIiIiIiIiKSIxWZYvLDi39Izy49mfrbqRzyJsxGmjIFhg2Dm2+GN99s\n/gBFRERERERERHKgIlNMTuh6Av/2N//GixtfZObSjA97aVhBAcyeDbW1MHYsVFU1f5AiIiLSJpnZ\neDN7w8yqzGx6hvOTzOxVM1tuZkvNbEzk3Fozey11rmUjFxERkbZMRaYYfW7Y5xg3cBzffvbbbNq1\nKfcLDB0Kzz4L+/cHhaY1a5o/SBEREWlTzKwQuA+YAAwFppjZ0LRuzwLD3f1c4Brg/rTzY939XHev\nyHvAIiIi0m6oyBQjM2PmpTPZX7Ofry74atMuMmxYUGjasycoNK1d26wxioiISJszGqhy9zXufgCY\nDUyKdnD3anf38LAYcERERESOUV6LTMc4VbvBse3FoF6D+M6F3+HxlY/zv2/+b9MuMnw4PPMM7NwJ\nH/sYrFvXvEGKiIhIW9IXWB853hC21WFml5vZauApgtlMKQ78zsyWmdnUvEYqIiIi7UqHfF04MlX7\nYoIfbpaY2Vx3Xxnp9iww193dzM4BHgWGZDm23fjG+d/gkdcf4SvzvkJleSXdirrlfpGRI4NC08c/\nHhSakkno16/ZYxUREZH2wd3nAHPM7ELgDuDj4akx7r7RzPoAz5jZandfHB0bFp+mApSVlZFMJnN+\n/+rq6iaNk+ah/MdL+Y+X8h8v5T9e+c5/3opMRKZqA5hZaqr24UKRu1dH+kenajc6tj0pKiziZ5f+\njAseuoDvJb/H3Zfc3bQLVVTAwoVw8cVHCk2nnNKssYqIiEirtxHoHznuF7Zl5O6LzexUM+vt7lvd\nfWPYvsXM5hD8XLY4bcwsYBZARUWFV1ZW5hxkMpmkKeOkeSj/8VL+46X8x0v5j1e+85/P2+WOZap2\nVmPbkzEDxjB15FRm/HkGr2x+pekXOu88WLAANm8OCk3vvtt8QYqIiEhbsAQYbGYDzawImAzMjXYw\ns0FmZuH+SKATsM3Mis2se9heDFwCvN6i0YuIiEiblc+ZTFlpYKp2Vo51unZrmqp3aedLeazDY0z5\n1RTuG3EfhVbY5GuV/PM/c843v8m+D3+Y5f/2bxzs2bMZI20+rSn/xyPlP17Kf7yU/3gp//nj7jVm\ndj2wECgEHnT3FWY2LTw/E/g08AUzOwjsBa4Kly8oI/i5DIKfEx9x9wX/v707j8+iOvs//rlyZwVC\ngABhCTtBWQMYQVAhKMpifah1RdFHFHm0jxTrUttfrdZ9r+KDFnFBrVarWK1aqKgYUVFBJBAWUQSU\nfTUhgSwkOb8/5s4CBE1I7kxIvu/X67xm5sycmXNfd9DJlTNnfPkgIiIicswJZZLpqIdqV6VtdYdr\n17Whek+0fYLxr49nZaOV/Gbwb47+RKmp0K8fjceM4eRbb/XeQNe6dY31s6bUtfg3NIq/vxR/fyn+\n/lL8Q8s5NweYc0jdjHLr9wP3V9BuHZAc8g6KiIhIvRTKx+WOeqh2ZdrWVxf2vpBR3Ubxx/l/ZPPe\nI+bkKmf4cHjnHfjuOxg6FL79tmY6KSIiIiIiIiJyiJAlmZxzhUDJUO3VwKslQ7VLhmvjDdVeYWbp\neG+Tu9B5Kmwbqr7WJWbGE2c9wYGiA9z03k3VP+Fpp8H8+ZCVBUOGwMKF1T+niIiIiIiIiMghQjmS\nCefcHOdcD+dcN+fc3cG6GSXDtZ1z9zvnejvn+jvnhjjnPvmptg1F1+Zdufnkm3l5xct8tOGj6p/w\npJPgs8+geXM4/XR4/fXqn1NEREREREREpJyQJpnk6N18ys10jOvIlLlTKCwurP4Ju3f3Ek0DBsD5\n58Ojj1b/nCIiIiIiIiIiQUoy1VGNIhrxyKhHyNiRwYwvZ/x8g8po2dKbAPycc+C3v4XrroOiopo5\nt4iIiIiIiIg0aEoy1WHnHH8OI7uO5E8f/omd+3bWzEljYuDVV70k07Rp3qim/ftr5twiIiJSJ5jZ\naDNbY2Zrzez3FewfZ2bLzSzdzL40s1Mq21ZERETkSJRkqsPMjMdGP0ZOQQ7/74P/V3MnDgTgL3/x\nHpl7801vcvCdNZTEEhEREV+ZWQDvhSpjgF7AeDPrdchhHwDJzrn+wBXA01VoKyIiIlIhJZnquJ6t\nejJ18FSeWfoMizcvrtmTT53qTQK+bJn35rlvv63Z84uIiIgfBgFrnXPrnHMFwCvAuPIHOOdynHMu\nuNkYcJVtKyIiInIkSjIdA24dfisJTRK4du61FLvimj35OefAhx9CVhYMHgx//zuU3nOKiIjIMag9\nsLHc9qZg3UHM7Bwz+xr4N95opkq3FREREalIuN8dkJ/XNKopD4x8gMvevIzn059n4oCJNXuBk06C\nzz+HCRPgkkvgtdfgr3+FNm1q9joiIiJSZzjn3gDeMLNhwJ3AyMq2NbPJwGSAhIQE0tLSqnz9nJyc\no2onNUPx95fi7y/F31+Kv79CHX8lmY4RE/pNYMaSGdz8/s2c0/McmkU3q9kLdOsGn3wCjzwCt9wC\nvcEgDqAAACAASURBVHvD//0fjB8PZjV7LREREQmlzUCHctuJwboKOecWmFlXM2tZ2bbOuZnATICU\nlBSXmppa5U6mpaVxNO2kZij+/lL8/aX4+0vx91eo46/H5Y4RZsb0MdPZtX8Xf077c2guEgjAjTdC\nejr06OGNajrnHNi2LTTXExERkVBYDCSZWRcziwQuAt4qf4CZdTfz/opkZgOBKGB3ZdqKiIiIHImS\nTMeQAW0H8D8n/A/TF01nxY4VobvQ8cd7o5oeegjefRd69YKXXtJcTSIiIscA51whcC3wLrAaeNU5\nt9LMrjazq4OHnQusMLN0vLfJXeg8Fbat/U8hIiIixyIlmY4xd512F3HRcUyZOwUXyqRPIAA33OCN\najr+eG++pnPOga1bQ3dNERERqRHOuTnOuR7OuW7OubuDdTOcczOC6/c753o75/o754Y45z75qbYi\nIiIilaEk0zEmvlE8d592N2kb0nht1Wuhv+Bxx8HHH5eNaurdW6OaREREREREROQwSjIdg64aeBUD\n2gzghnk3sK9gX+gvWNGopnPPhR07Qn9tERERERERETkmKMl0DAqEBZg+djqb9m7i5vdvprC4sHYu\nXDKq6YEHYM4cb1TT7Nm1c20RERERERERqdOUZDpGDe0wlGtSruHxxY+TPCOZed/Nq50LBwJw003w\n1VfQuTOcfz6MHw+7d9fO9UVERERERESkTlKS6Rj2+NjHefPCN8kvzGfUi6M4++WzWbNrTe1cvFcv\n+OwzuPNOeP116NMH3n67dq4tIiIiIiIiInWOkkzHMDNj3PHjWPnrlTww8gE+2vARff7ah+vfvZ4f\nc38MfQfCw+GWW2DxYkhIgP/6L7j8csjMDP21RURE5IjMbLSZrTGztWb2+wr2X2Jmy80sw8wWmlly\nuX0bgvXpZvZl7fZcREREjmVKMtUDUeFR3HTyTXw75Vsm9p/Io58/StL/JfHXxX+tnfmakpNh0SL4\n05/gxRe9UU3/+U/orysiIiKHMbMA8DgwBugFjDezXoccth4Y7pzrC9wJzDxk/wjnXH/nXErIOywi\nIiL1hpJM9UhCkwRmnj2Tr/7nK/om9OXXc37NgCcH8P6690N/8chIuOMO+PxziIuDMWMgJQWmT4c9\ne0J/fRERESkxCFjrnFvnnCsAXgHGlT/AObfQOVcy7PlzILGW+ygiIiL1kJJM9VD/Nv2Zf9l8Xr/g\ndfYV7OOMv53BNe9cw4GiA6G/eEoKLFkCjz0GxcUwZQq0betNEP7vf0NhLb0JT0REpOFqD2wst70p\nWHckVwJzy2074H0zW2Jmk0PQPxEREamnwv3ugISGmfGrnr9ibNJYbv3wVh5c+CBrdq/htfNfI75R\nfGgvHh3tJZemTIFly+C557zH6GbPhjZt4NJLvbmbeh06cl9ERERqk5mNwEsynVKu+hTn3GYzaw28\nZ2ZfO+cWHNJuMjAZICEhgbS0tCpfOycn56jaSc1Q/P2l+PtL8feX4u+vUMdfSaZ6Ljo8mgfOeIC+\nrfsy6e1JDH56MG+Pf5uerXrWTgeSk+GRR+D++2HuXJg1y9t+8EE48UQSzjgDhg8Hs9rpj4iISP23\nGehQbjsxWHcQM+sHPA2Mcc7tLql3zm0OLneY2Rt4j98dlGRyzs0kOI9TSkqKS01NrXIn09LSOJp2\nUjMUf38p/v5S/P2l+Psr1PHX43INxKXJl5L232lkF2Rz0jMnMffbuT/fqCZFRsK4cfDmm7B5s5do\nysuj5z33wDnnwM6dtdsfERGR+msxkGRmXcwsErgIeKv8AWbWEfgncKlz7pty9Y3NLLZkHTgTWFFr\nPRcREZFjmpJMDciQDkNYfNViujbvyi9e/gWPfPYIzrna70jr1nDddZCeztpf/9ob4dSvn95IJyIi\nUgOcc4XAtcC7wGrgVefcSjO72syuDh52KxAPPGFm6Wb2ZbA+AfjEzJYBi4B/O+f0P2gRERGpFCWZ\nGpiOcR35ZOInjDtuHNfPu56r3r6KgqICfzoTFsam88+HL7+Eli29N9JNmQK5uf70R0REpJ5wzs1x\nzvVwznVzzt0drJvhnJsRXJ/knGvunOsfLCnB+nXOueRg6V3SVkRERKQylGRqgBpHNmb2BbP507A/\n8czSZxj5wkh27vPxcbW+fWHxYm900/TpcMIJkJ7uX39EREREREREpMqUZGqgwiyMO0bcwcvnvszi\nLYs58akTydie4V+HoqO9eZrmzYPMTBg0yJscvLjYvz6JiIiIiIiISKWFNMlkZqPNbI2ZrTWz31ew\n/xIzW25mGWa20MySy+37rZmtNLMVZvaymUWHsq8N1UV9LmLB5QsoKCpg4MyBjHlpDLOWzuLH3B/9\n6dAZZ0BGBpx9Nvzud3D66bBxoz99EREREREREZFKC1mSycwCwOPAGKAXMN7Meh1y2HpguHOuL3An\nwVfhmll74DdAinOuDxDAezOKhMCJ7U9kyeQlXH/S9Xy962uueOsKEh5K4Ky/n8Xz6c+TmZdZux2K\nj4fZs+GZZ7zH6Pr18+ZqeuUV+OGH2u2LiIiIiIiIiFRKKEcyDQLWBieQLABeAcaVP8A5t9A5VzJk\n5nMgsdzucCDGzMKBRsCWEPa1wWsb25b7z7ifdb9Zx6JJi5g6eCordqzg8n9dTusHW3P2y2fz4vIX\n2Zu/t3Y6ZAZXXAHLlsEpp8CsWTB+PHTqBB06wIUXwmOPeZOGHzhQO30SERERERERkSMKD+G52wPl\nn3PaBAz+ieOvBOYCOOc2m9lDwA9ALjDPOTevokZmNhmYDJCQkEBaWlqVOpmTk1PlNg3BWZFnMTZ5\nLKuzV5O2M42079N455t3iLAIRrcZzVVdriI2Irba16lU/G+4AbvuOhp/9x1xK1bQdOVK4tLSiH71\nVQCKoqPZe/zxZA4cyKZzzqGoSZNq96uh0M+/vxR/fyn+/lL8RUREROqfUCaZKs3MRuAlmU4JbjfH\nG/XUBcgEXjOzCc65Fw9t65ybSfAxu5SUFJeamlqla6elpVHVNg3JCEbwa35NsSvmi01f8MKyF5j5\n1UwWZy/msdGPcV6v8zCzoz5/leJ/+ukHb2/cCAsXEli4kOYLF9J81iy6vPMO3HMPTJwIYZrX/ufo\n599fir+/FH9/Kf6hZWajgWl4Uw487Zy775D9lwA3AwZkA9c455ZVpq2IiIjIkYTyt/DNQIdy24nB\nuoOYWT/gaWCcc253sHoksN45t9M5dwD4JzA0hH2VnxFmYQzpMIS//uKvLL5qMW2btOWC2Rcw7pVx\nbMzyaWLuksfmpk3z5m5avBi6d4dJk7y30y1c6E+/REREfFTNeTEr01ZERESkQqFMMi0Gksysi5lF\n4k3c/Vb5A8ysI14C6VLn3Dfldv0AnGRmjcwbJnM6sDqEfZUqGNh2IIuuWsSDZzzI++vep9cTvZi+\naDpFxUX+duyEE+CTT+Cll2DbNjj5ZJgwATYfltsUERGpz6ozL+bPthURERE5kpAlmZxzhcC1wLt4\nCaJXnXMrzexqM7s6eNitQDzwhJmlm9mXwbZfALOBr4CMYD9nhqqvUnXhYeHcOPRGVvx6BUMShzBl\n7hROmXUKGdsz/O2YGVx8MaxZA7fc4r2lrkcPuPtuyMvzt28iIiK1o6J5Mdv/xPGl82IeRVsRERGR\nUiGdk8k5NweYc0jdjHLrk4BJR2h7G3BbKPsn1de1eVfenfAuL2W8xG/f/S0DZw7k5pNv5pZhtxAd\nHu1fxxo3hjvv9N5Qd+ONXsLpmWfg4Yfhl7/0klEiIiIN3KHzYlahXbVevAKa/N1vir+/FH9/Kf7+\nUvz9Fer414mJv+XYZmZM6DeB0d1Hc/2713P3x3fz6spXuX7I9Vzc92KaRjX1r3NdusDrr8P8+TB1\nKvzqV9C2LXTs6M3pVFFJSIBAwL8+i4iIVE9V58UcU25ezEq1re6LV0CTv/tN8feX4u8vxd9fir+/\nQh1/vX5LakzLRi154ZwXmDdhHjERMVzz72to+3BbrvjXFXy28TOcc/517rTTYOlSeOopGD0aYmMh\nIwOefBKuvx7OPx9OOgnat4foaOjWzRsBtWqVf30WERE5OtWZF/Nn24qIiIgciUYySY07o9sZpHdN\nZ/GWxTy15CleXvEys9Jn0ad1H64aeBUT+k2gRUyL2u9YeLj35rlJ5Z7QdA5+/BE2bjy4rFjhvbXu\n4Ye95NMVV3hvsmvq46gsERGRSnDOFZpZybyYAeDZknkxg/tncPC8mACFzrmUI7X15YOIiIjIMUdJ\nJgkJM2NQ+0EMaj+Iv4z6C6+seIWnvnqKqf+Zyu/e+x3n9TqPqwZe5e/oJq+j0KKFV5KTD963Ywe8\n+KI3l9Pkyd7jduef7yWchg3TvE4iIlJnVXNezMPaioiIiFSGHpeTkIuNiuWqE65i0VWLSP+fdCYN\nnMQ737xD6vOpTPxyIrOWzqKgqMDvbh6udWvvUboVK+CLL+Cyy+DNNyE1FZKSvDfWff+9370UERER\nERERqROUZJJaldwmmeljp7Plhi08N+45wi2cK966gq7TuvLwwofJzs/2u4uHM4NBg2DGDNi6Ff72\nN2/i8Ftugc6dvYTT1VfDq696o59EREREREREGiAlmcQXjSIa8d/9/5unTniK/1zyH3rE9+DG926k\n46Md+eMHf2R7zna/u1ixRo1gwgTvbXVr18Ijj0DPnvDyy96cTQkJ0K8fXHcdvP02ZGX53WMRERER\nERGRWqE5mcRXZsao7qMY1X0Uizcv5v5P7+feT+7l4c8e5vL+l3Pj0Bvp3qL7Ye2cc+zO3c2W7C2l\nJczCuKjPRUSHR9dO57t185JJ110HhYXw1Vde8umDD7y31k2bBmFhkJICp5wCQ4Z4pX372umfiIiI\niIiISC1SkknqjBPbn8jsC2bzze5veGjhQ8xKn8VTXz3FOcefQ9smbdmSs4Wt2VvZkr2FrTlbK5zH\n6faPbuf+kfdzfq/zsdqcmDs83HukbtAg+P3vIT8fPv/cSzrNnw+PPw5/+Yt3bIcOXrLppJO85YAB\nEBVVe30VERERERERCQElmaTO6RHfg5lnz+T21NuZ9sU0nlzyJM452sW2o11sO4Z1Gla6Xr6s3bOW\nG+bdwIWzL2Rah2k8MuoRBrUf5M+HiIqC4cO9cvvtUFAA6enw2Wdl5dVXy44dOBBOOAHi46FpU4iL\nKyuHbsfE6M12IiLyk8xsNDANCABPO+fuO2T/8cAsYCDwR+fcQ+X2bQCygSKg0DmXUlv9FhERkWOb\nkkxSZ7WNbct9I+/j3tPvrdSopM7NOvPV5K94Lv05/jj/jwx+ejAX972Ye0+/l45xHWuhxz8hMrJs\npNPUqV7dli0HJ52efx6yKzHxedu2MGyYl8AaNgx69VLSSURESplZAHgcOAPYBCw2s7ecc6vKHbYH\n+A3wyyOcZoRzbldoeyoiIiL1jZJMUudV5bG3QFiAKwdeyQW9L+D+T+/n4c8e5p+r/8mNQ27k5lNu\npklkkxD2tIratYNzz/VKiaIiL9GUlVVW9u4tW8/MhIwM+Ogj+Mc/vDYtW8Kpp5Ylnfr1g0DAn88k\nIiJ1wSBgrXNuHYCZvQKMA0qTTM65HcAOMzvLny6KiIhIfaQkk9RLsVGx3HXaXUw+YTJ/+OAP3PXx\nXTy99GnuGnEXF/e9mIhABAEL1O68TZURCECzZl75Kc7BunWwYIGXcFqwAN54w9sXF+dNNH7CCdC/\nPyQnQ5cuGu0kItJwtAc2ltveBAyuQnsHvG9mRcCTzrmZNdk5ERERqb+UZJJ6rWNcR1761Uv8ZtBv\nuH7e9Ux6exKT3p5Uut8wwsPCCYQFCFiAQFiA8LBwosOjGdphKGO6j2F099G0i23n46eogJn3drtu\n3WDiRK9u48aypNMnn8DcuVBc7O1r2tQb4VSSdOrfH3r39q//IiJSl53inNtsZq2B98zsa+fcgvIH\nmNlkYDJAQkICaWlpVb5ITk7OUbWTmqH4+0vx95fi7y/F31+hjr+STNIgDE4czCcTP+GtNW+xaucq\nilwRhcWFFBUXVbielZ/FB+s+YPaq2QD0b9OfMd3HMKb7GIZ0GEJ4WB38p9OhA1xyiVcA9u+HFSu8\nCceXLfPKc89BTo63PyyMQe3aQY8eXtvERG9ZUhITvRFVGgElInKs2Qx0KLedGKyrFOfc5uByh5m9\ngff43YJDjpkJzARISUlxqampVe5kWloaR9NOaobi7y/F31+Kv78Uf3+FOv518DdlkdAwM8YdP45x\nx4+r1PHOOZZvX86cb+cwd+1cHvj0Ae795F6aRTfjjK5nMKb7GAYnDiYmPIao8Ciiw6OJCkQRFR5V\nN5JQjRqVTTZeorgY1q8vTTzlLFhAo9xc+OADbyLykpFPJRo39hJOKSkwciScfrqXfBIRkbpsMZBk\nZl3wkksXARdXpqGZNQbCnHPZwfUzgTtC1lMRERGpV+rAb8IidZOZkdwmmeQ2yfzh1D+QmZfJ++ve\nZ+63c5m7di6vrXrtiG3DLKw06RQdHk2vVr04teOpnNrpVE5KPIlGEY0q3Y/cA7l8ueVLFm5cyGeb\nPqNFTAuuGHAFJ3c4uepzSoWFlT1md+65rEpLo3VJFruwELZu9R6727TJW27cCBs2wLvvwosvescd\nd5yXbBo5ElJToXnzqvVBRERCyjlXaGbXAu8CAeBZ59xKM7s6uH+GmbUBvgSaAsVmdh3QC2gJvBH8\n/0s48Hfn3H/8+BwiIiJy7FGSSaSSmkU347xe53Fer/NwzrFs+zJW71xNflE++YX55Bflk1eYV7qe\nX+ht7zuwj6XblnL7R7fjcISHhZPSLsVLOnU8lVM6nkLzmLJEzZbsLXz6w6cs3LiQhZsW8tXWrygs\nLgQgqUUSW3O2Mit9FsfFH8ekgZO4LPkyWjduXf0PGB5e9qjcoYqLvUfv3n/fG/X0/PPwxBNe0uqE\nE7yk0ymnQGwsRER4JTKy4vXmzfX2OxGREHPOzQHmHFI3o9z6NrzH6A61F0gObe9ERESkvlKSSeQo\nmBn92/Snf5v+lW6TmZfJwo0L+fj7j1nwwwIe/fxRHlz4IIbRp3Ufurfozldbv+L7rO8BiA6PZlD7\nQdw45EaGdhjKkA5DaNmoJTkFOby28jWeXvo0N713E3/44A+MO24cVw64kjO7nUkgrGYSOGt2rWH2\nqtm89c1bFLti2sW2o22PtrQ7YTDtbjubtlv20i79O9p9nE6rhx4k7L77Knfijh3hllvg8su9pJOI\niIiIiIjUC0oyidSSZtHNGJs0lrFJYwHvMbhFmxfx8Q8fs+D7BSzfvpxB7Qfx25N+y9AOQ0luk0xk\nIPKw8zSJbMLEAROZOGAiq3au4pmvnuGF5S/w+urXSWyayBX9r2DigIl0bta5yn1cvXM1r616jdmr\nZpOxIwOAkxJPokVMCzZkbmDhxoXs2r+rrIEBwyA8NZwOUe04Pa4/ZzVN4fSYXsQWR0BBARw44JWC\nAsjLg5dfhsmT4d574dZbYcIEbxSViIiIiIiIHNP0m52IT2IiYhjeeTjDOw8/6nP0atWLh0c9zL0j\n7+WtNW/x9FdPc+eCO7ljwR20btya7i26e6V5d7q16Fa63SKmRek5Vu5YWZpYWrlzJYZxcseTeXTU\no5zb61wSmx78NEVBUQHbcraxJXtLadmavZWvd3/Nq+ve5+ltc4gIi2BYp2GMTRrLWUln0SO+R9n8\nUVOnwpw5XoJp4kS45x647Ta46CI9RiciIiIiInIMU5JJpB6IDESWzhf1feb3zF41m693fc3aH9cy\nf/18Xlj2wkHHN49uTvcW3dmeuZ0fPvoBwzi106k8Nvoxzu11Lu1i2/3ktTrGdaRjXMfD9h0oOsCn\nGz9lzrdzmPPtHG6YdwM3zLuBrs27Mra7N4ortXMqMWedBWPHwr/+5SWYJkyAu++GP/8ZzjvPm+tJ\nREREREREjilKMonUM52adeKGoTccVJd7IJf1metZu2ftQaU4spjfDf8dv+r5K9rGtq32tSMCEaR2\nTiW1cyoPnPEAGzI3MPfbucxZO4dnlj7D9MXTiQmPIbVzKmOTxjJm2Bi6LV0Kr7/uJZguvBD69PES\nTyefDC1bat4mERERERGRY4SSTCINQExEDL1a9aJXq14H1aelpZE6KDVk1+3crDPXnHgN15x4DXmF\neaRtSGPut3OZu3YuU+ZOAbw35o1NGsuYNx5k+OKdRN9xD5x/ftlJ4uOhdWtISDh8GRsL+fmQm+vN\n91TRMj8fkpJg1CjvTXh6JE9EGgAzGw1MAwLA0865+w7ZfzwwCxgI/NE591Bl24qIiIgciZJMIlIr\nosOjGd19NKO7j2Ya01i7Z23pKKcnlzzJtC+mERMew2m3jmBUwWkkZB4gYm8OET/uJTIzm4g9u4jc\n9B0R6XuI3LuPiCJv3vF9EZATCfsivfV9kbCvUTj7YsLJaRTO/kgj6e1sRj1yK12tBZxxhpdwOvNM\naN++0v0vdsVkbM9g/4H99Gndh9io2NAFS0SkGswsADwOnAFsAhab2VvOuVXlDtsD/Ab45VG0FRER\nEamQkkwi4ovuLbozZfAUpgyeQu6BXNI2pDHn2znMXTuXf/84p+zA5sHSpSpnLwQKMYzo8Ghy+3i1\n3Q4cYNSatznz/n8w4hpo2r23l3AaNQpOPRViYkrPUFRcRPq2dNI2pPHR9x/x8Q8fk5mXWbq/S7Mu\n9EvoR7+EfvRt3Zd+Cf3o3qI7gbDQjpQqKi4iKz+LPbl7+DH3R/bk7mFP7h4Kigo4s9uZNfLYo4gc\n8wYBa51z6wDM7BVgHFCaKHLO7QB2mNlZVW0rIiIiciQhTTJVYqj2JcDNeAMSsoFrnHPLgvuaAU8D\nfQAHXOGc+yyU/RURf8RExDAmaQxjksYAsDFrI3vz93Kg+AAFRQUcKDpw0HpBUQEHig/gnKNxZGMa\nRzSmSWST0vWSZXR4NADf7vmWed/NY95383i+0Xye6APhhDEkazNnLp3GqFf+Qr/dAdJ7teCjHlF8\n1O4An8T+yN6wAgCSotpxXkIqw7udTtNWiWTsXMnyHcvJ2J7B29+8TbErBrzRWr1b9aZvQl+6NutK\nh7gOdGjagY5xHUlsmkhMREzFAQjam7+X9T+uZ33metb9uI51P65jfeZ6duzbUZpMysrLwuEqbB9m\nYZzZ7Uwu63cZ444fR6OIRkf9nRQWF7KvYB85BTlHLGZG71a96dO6D40jGx/1tWpbUXERW7K3sDl3\ns99dEQmV9sDGctubgMG10FZEREQauJAlmSo53Ho9MNw596OZjQFmUnYjMw34j3PuPDOLBI7+tyUR\nOaZ0iOtQo+frEd+DHvE9uHbQtRQUFfDZxs9497t3mffdPP4Ut4Q/DQdzRTjbCUDPvVFcvNIYvgaG\nfQ/tsrcAb3olNpb/SkmBQYNg8EXk/qIvqyP3snz7cpZvX07GjgzmfjuX7fu2H9aPlo1a0qFph9Lk\n055te5ixa0ZpMmnX/l0HHR8XFUeX5l1o26Qtx8UfR4uYFjSPbu4tY7xlSV1BUQGvrnyVvy3/Gxf/\n82JiI2M5r9d5XJZ8GcM6DSPMjvzGvh37dvDFpi/4YvMXfL7pc5ZsXXLQqK2fYxjdW3QnuU0yyQnJ\n9EvoR3JCMh3jOmJmlT5PRX7M/ZHVu1azeudqVu1cRWZeJs2imx2xxEXH0TSqKbv27+L7zO/5Put7\nNmRu4Pus70u3N+3dRGFxIQAP/fAQVw64kkv6XkLzmObV6mtd5JyXkKzu97A3fy/vrn2XNbvXEBsZ\nS9OopkcsjSMb/+TPm9QPZjYZmAyQkJBAWlpalc+Rk5NzVO2kZij+/lL8/aX4+0vx91eo4x/KkUyV\nGaq9sNzxnwOJwWPjgGHA5cHjCoCCEPZVRBqIyEAkwzsPZ3jn4dxz+j3s3LeT99e9T8aODAa2Hciw\nTsNo3bi1d3B+PmzfDlu2wNat3nL1avjiC/jLX+DAAWKAge3bM3Dw4GDi6b/glyeQFxPBpr2b2Ji1\nkY17N7IxayM/ZP3Axr0bWffjOj7a8BE5BTl0btaZrs27cm7Pc+nSrAtdm3ctLT+b9MjKgo8/hvmz\nYc0akseP585r17Jg80JeWPYCr616jVnps+gY15EJfSdwafKldG7WmaVbl5YmlL7Y/AUbMjcAELAA\nyW2Suaj3RbSNbUuTyCaHldjI2NL1gqICMnZksHz7cpZtX8bSrUuZvWp2affiouLol9CPTs060Syq\nLAnULLoZcVFxByWGogJRfPfjd6zeuZrVu7yE0updq9mWs630fNHh0bSIaUFWXhb7Duyr9HduGO2b\ntqdTXCeGdhhKp7hOdIrrRMbXGSzct5Apc6dw47wb+VXPX3HlgCsZ0WVEnU2S5B7IZWvOVrZmb2X7\nvu3s2r+LPbl72L1/N7tzg2X/bq8u11vGx8SXvvVxROcR9IjvUamk0/of1/P2N2/z9jdv89GGjzhQ\nfKBSfTSM3538O+4bqbmifbQZKJ+tTwzW1Vhb59xMvD8OkpKS4lJTU6vcybS0NI6mndQMxd9fir+/\nFH9/Kf7+CnX8Q5lkqupw6yuBucH1LsBOYJaZJQNLgKnOucr/ViEiUgmtGrdifN/xjGf84TujoqBj\nR68cKi8P0tNh0SIv6bRoEfzzn6W7oxs3pnuTJnRv0gRKSuPGwfWB0GQYG7Iy6Tw8Fdp2gS5dvOtE\nRBy5s/v2waefwocfwvz58OWXUFzs9TMhAS69lLDbbiP1D38g9bIZTB87nTe/fpO/Lf8b9316H/d8\ncg/hYeGlo3g6NO3A4MTBXHvitQxOHMzAtgOr/Ihdtxbd+OXxZfMG5xTkkLE9g2Xbl5Umnz794VMy\n8zLJys8qfbTwpzSNakrPlj0Z030MPVv2pGernvRs2ZPOzTqXznl1oOgAWflZZOZlHlay8rKIbxTv\nJZOadSKxaSKRgcjDrpOWk8b01Oks3bqUZ5Y+w0sZL/Hyipfp0qwLE/tP5PL+lx/VqDrnHEWupPJR\n3wAAFMpJREFUiMLiQgqLCzlQdKB0vaCogPyifPIL84+4zCvMY+f+nWzN3uollHK2si1nG1uzt5KV\nn1XhNaPDo4mPiSe+UTzxMfH0bt2b+Jh4WsS04IesH/hww4f8Y+U/AGjTpI2XdOrkJZ5Kkk5FxUUs\n2ryoNLG0YscKAI5veTzXnXQdZ/c4mxPbn8j+A/vJzs9mb/7eI5YhHYZUOW5SoxYDSWbWBS9BdBFw\ncS20FRERkQbOSobS1/iJzc4DRjvnJgW3LwUGO+eureDYEcATwCnOud1mloI3sulk59wXZjYN2Ouc\n+1MFbcsP1z7hlVdeqVI/c3JyaNKkSRU/ndQUxd9fin/NCs/KoumaNTT55hsisrMJ5OYesYTl5RGe\nnU1YcVnSxYWFkd+qFXkJCeS1bUtu27bkJyQQvXUrzZYupenq1YQVFlIcCLC3Vy8y+/cnc+BA9vbq\nRXF4OPELF9LpxRdpumYNea1asXH8eLaOHUtxVBS783czf+d8MgsyOb7p8fSM7UnLqJa1Gh/nHLlF\nueQU5pBTmMO+on2l6/nF+bSNbkunRp2Ij4yv9uNdlXHoz39+UT4f7/qYOdvmsDRzKWGEkdI8haTY\nJHKLctlftJ/colzyivIO2i4phcWFFLkiivn5RFplRIVFER8ZT4vIFt4yqgUtIloQHxVfWt80vClN\nI5oSHYj+yXM559iSt4WlmUtJz0xnWeYydhV4j2fGR8aT1CSJr7O/JvNAJmGEkdwsmSHxQxgaP5T2\nMZV/C2NVHO1/f0aMGLHEOZcSgi7VK2Y2FngUb17MZ51zd5vZ1QDOuRlm1gb4EmgKFAM5QC/n3N6K\n2v7UtVJSUtyXX35Z5T7qL9n+Uvz9pfj7S/H3l+Lvr6ONv5lV6h4slCOZKjXc2sz64U3wPcY5tztY\nvQnY5Jz7Irg9G/h9RRep7nBt/YD7S/H3l+Lvr48++IDh3bvD+vWwfj22YQPR69cTvX49rFgB8+aB\ncxAWBiecADfcACNGEHbyyTRr0oRmh57wtNPgj3+E994j+s47SXrsMZL+8Q+v3dVXc27suX58zDqr\nop//UYziLu5i3Y/reC79OZ5Lf44lG5cQG1X2mGBsdCzxkfF0iuxUWtc4ojGRgUjCw8KJCEQQHhZ+\nWIkI8+qjw6OJCo8iKhB10DI6PLp0PT4mnqZRTWs82XYJlwBe0mntnrWkbUgj7fs0lmxZwpjjxnB2\nj7MZ3X10rcxPpf/+hJZzbg4w55C6GeXWtxGcpqAybUVEREQqI5RJpp8dbm1mHYF/Apc6574pqXfO\nbTOzjWZ2nHNuDXA6enWuiNQzLhCATp28UtEv2/n58MMP0KoVNDsspVQxMzjzTK8sWAB33QW/+x3c\ndx9MnQqXXw6tW0P0T498aei6Nu/KHSPu4PbU24HqT5xd15gZSfFJJMUncdUJV/ndHRERERGpJ0KW\nZHLOFZrZtcC7lA23Xll+qDZwKxAPPBG8gS8sN/xqCvBS8M1y64CJoeqriEidFBUFSUlH337YMG80\n1KJFcPfdcNttXgGIiYH4eGjR4vBlixbe6KniYq8UFR28LFmPjobevSE5Gbp29drUM/UtuSQiIiIi\nR+/AgQNs2rSJvLw8v7ty1OLi4li9evUR90dHR5OYmEjET80V+xNCOZKpMkO1JwGTjtA2HdCcCyIi\n1TVoEPzrX5CRAQsXwp49sHv3wcvVq7313buhsPCnzxcWBoGAd1zJvH6NG0Pfvl7CKTkZ+vXztps2\nDf3nExERERGpBZs2bSI2NpbOnTsfs3+MzM7OJjY2tsJ9zjl2797Npk2b6NKly1GdP6RJJhERqUP6\n9vXKT3HOe4tdcbGXSCpJKIWFlZUS+/fDypWwfDksW+aVf/wDnnyy7JguXaBbN+8RvYSEipd6fE9E\nREREjgF5eXnHdILp55gZ8fHx7Ny586jPoSSTiIiUMYPKvvGrUSM48USvlHAONm70Ek4lyaeNG2Hd\nOti+3UtgVaRJE4iMLEtqHZrgKqmLioK4OG+Oqp9aNm7sJa5iYspKyXZkpPc5RURERESqqL4mmEpU\n9/MpySQiIjXHDDp29MrZZx++f98+2LHDSziVX+7a5T1+V1R0+BxQ5etycyEry0tcZWR461lZ3r6q\n9DEmhpMaN4aRI2HECO/NfF27KvkkIiIiInXW7t27Of300wHYtm0bgUCAVq1aAbBo0SIiIyMrdZ5n\nn32WsWPH0qZNmxrvo5JMIiJSexo39h6hO8pnvCvkHOTkQGaml3DKzPQe5cvNhbw8b1lSym1nLV1K\ndFoavPyyd56OHb1k02mneYmnxArf7i5yTDCz0cA0vJevPO2cu++Q/RbcPxbYD1zunPsquG8DkA0U\ncfBLWURERMRH8fHxpKenA/DnP/+ZJk2acOONN1b5PM8++ywDBw5UkklEROQwZhAb65UOHSrdbHVa\nGgnDh8OaNTB/vlfeeguee847ICnJSzh16+Y9smdW8TIsDMLDvcRZz57Qtm3dGBFVVORN6t6okZfc\nkwbDzALA48AZwCZgsZm95ZxbVe6wMUBSsAwG/hpclhjhnNtVS10WERGRanr++ed5/PHHKSgoYOjQ\noUyfPp3i4mImTpxIeno6zjkmT55M06ZNSU9P58ILLyQmJqZKI6AqQ0kmERFpuMzg+OO98utfe4/d\nZWSUJZ3+/nfIzq7aOWNjy87Zs2fZerdu3nxQVVFU5I3Sys4uW5aUvXu9xwx37qx4uWdP2dv/unaF\nPn28id9Llj16wFG+mlbqvEHAWufcOgAzewUYB5RPMo0DXnDOOeBzM2tmZm2dc1trv7siIiLHnuuu\ng+CgohrTvz88+mjV261YsYI33niDhQsXEh4ezuTJk3nllVfo1q0bu3btIiMjA4DMzEwCgQBPP/00\n06dPp3///jX7AVCSSUREpExYGCQne+W3v/WSPLm5XrKmuPjwZcl6fj6sXQtff11WPvwQ/va3snMH\nAt4b9czKRjodul6y3L/fSyrt3//zfQ4Ph5YtvdKqldf3kvWWLb3HB1es8JJn//6395nASzAdd5yX\ncOrdGzp3hvbty0qjRjUWVql17YGN5bY3cfAopSMd0x7YCjjgfTMrAp50zs089AJmNhmYDJCQkEBa\nWlqVO5mTk3NU7aRmKP7+Uvz9pfj761iOf1xcHNnBP0AWFERRVBT2My2qpqCgmOzs/Eodm5+fT0RE\nBNnZ2bzzzjssWrSIgQMHApCbm0vr1q0ZOnQoX3/9NVdffTWjRo3i9NNPp6ioiKKiIvbt21f6WQ6V\nl5d31N+RkkwiIiJHEghU/m17nTpBcCLGUtnZ8M03ZYmnrVvLRhc5d/B6+bqYmLJHAGNjvT6U3y4p\nrVp5b9Or7ON5+fne44ElSacVK2DhwrJ5qcpr3txLNiUmliWeWrb0klolb/srX8rXJyV5iSs5Vp3i\nnNtsZq2B98zsa+fcgvIHBBNPMwFSUlJcampqlS+SlpbG0bSTmqH4+0vx95fi769jOf6rV68mNjYW\ngCeeCNVVKjfyPSoqiqioKGJjY4mKiuLKK6/kzjvvPOy4jIwM5s6dy6xZs5g7dy4PP/wwgUCAxo0b\nl36WQ0VHRzNgwICj6r2STCIiIqESGwsnnOCVuiAqCvr180p5+/bBpk2weXPFy/R0702AJcmwn3PT\nTfDAAzXff6mszUD5CcoSg3WVOsY5V7LcYWZv4D1+twARERGpk0aOHMl5553H1KlTadmyJbt372bf\nvn3ExMQQHR3N+eefT1JSEpMmTQIgNjb2iKOYqktJJhERkYaucWPv0bnjjjvyMQcOeI/eFRUdXgoL\nD94OvkpXfLMYSDKzLniJo4uAiw855i3g2uB8TYOBLOfcVjNrDIQ557KD62cCd9Ri30VERKSK+vbt\ny2233cbIkSMpLi4mIiKCGTNmEAgEuPLKK3HOYWbcf//9AEycOJFJkyZp4m8RERHxSUSEkkfHCOdc\noZldC7wLBIBnnXMrzezq4P4ZwBxgLLAW2A9MDDZPAN4w7xHMcODvzrn/1PJHEBERkZ/x5z//+aDt\niy++mIsvPvRvSrB06dKDtrOzs7ngggu44IILQtIvJZlERERE6hnn3By8RFL5uhnl1h3wvxW0Wwck\nh7yDIiIiUi/V7FToIiIiIiIiIiLSICnJJCIiIiIiIiIi1aYkk4iIiIiIiIhIJbjKvm33GFXdz6ck\nk4iIiIiIiIjIz4iOjmb37t31NtHknGP37t1ER0cf9Tk08beIiIiIiIiIyM9ITExk06ZN7Ny50++u\nHLW8vLyfTCJFR0eTmJh41OdXkklERESknjGz0cA0IAA87Zy775D9Ftw/FtgPXO6c+6oybUVERBqq\niIgIunTp4nc3qiUtLY0BAwaE7Px6XE5ERESkHjGzAPA4MAboBYw3s16HHDYGSAqWycBfq9BWRERE\npEJKMomIiIjUL4OAtc65dc65AuAVYNwhx4wDXnCez4FmZta2km1FREREKqQkk4iIiEj90h7YWG57\nU7CuMsdUpq2IiIhIherVnExLlizZZWbfV7FZS2BXKPojlaL4+0vx95fi7y/F319HG/9ONd0RqToz\nm4z3mB1AjpmtOYrT6N+gvxR/fyn+/lL8/aX4+yuk92D1KsnknGtV1TZm9qVzLiUU/ZGfp/j7S/H3\nl+LvL8XfX4p/SG0GOpTbTgzWVeaYiEq0xTk3E5hZnU7qZ8Bfir+/FH9/Kf7+Uvz9Fer463E5ERER\nkfplMZBkZl3MLBK4CHjrkGPeAi4zz0lAlnNuayXbioiIiFSoXo1kEhEREWnonHOFZnYt8C4QAJ51\nzq00s6uD+2cAc4CxwFpgPzDxp9r68DFERETkGKQkUzWHeku1Kf7+Uvz9pfj7S/H3l+IfQs65OXiJ\npPJ1M8qtO+B/K9s2RPQz4C/F31+Kv78Uf38p/v4KafzNu8cQERERERERERE5epqTSURERERERERE\nqq3BJpnMbLSZrTGztWb2e7/70xCY2bNmtsPMVpSra2Fm75nZt8Flcz/7WJ+ZWQcz+9DMVpnZSjOb\nGqzXd1ALzCzazBaZ2bJg/G8P1iv+tcTMAma21MzeCW4r9rXIzDaYWYaZpZvZl8E6fQcNkO7Bap/u\nwfyj+y9/6f6rbtA9mL9q+x6sQSaZzCwAPA6MAXoB482sl7+9ahCeA0YfUvd74APnXBLwQXBbQqMQ\nuME51ws4Cfjf4M+9voPakQ+c5pxLBvoDo4NvdFL8a89UYHW5bcW+9o1wzvUv99pcfQcNjO7BfPMc\nugfzi+6//KX7r7pB92D+q7V7sAaZZAIGAWudc+uccwXAK8A4n/tU7znnFgB7DqkeBzwfXH8e+GWt\ndqoBcc5tdc59FVzPxvsPfXv0HdQK58kJbkYEi0PxrxVmlgicBTxdrlqx95++g4ZH92A+0D2Yf3T/\n5S/df/lP92B1Vsi+g4aaZGoPbCy3vSlYJ7UvwTm3Nbi+DUjwszMNhZl1BgYAX6DvoNYEhwqnAzuA\n95xzin/teRT4HVBcrk6xr10OeN/MlpjZ5GCdvoOGR/dgdYf+/dUy3X/5Q/dfvtM9mP9q9R4svKZO\nJFJdzjlnZnrdYYiZWRPgdeA659xeMyvdp+8gtJxzRUB/M2sGvGFmfQ7Zr/iHgJn9AtjhnFtiZqkV\nHaPY14pTnHObzaw18J6ZfV1+p74DEf/o31/o6f7LP7r/8o/uweqMWr0Ha6gjmTYDHcptJwbrpPZt\nN7O2AMHlDp/7U6+ZWQTeDc5Lzrl/Bqv1HdQy51wm8CHe/BiKf+idDPyXmW3AezTnNDN7EcW+Vjnn\nNgeXO4A38B6b0nfQ8OgerO7Qv79aovuvukH3X77QPVgdUNv3YA01ybQYSDKzLmYWCVwEvOVznxqq\nt4D/Dq7/N/AvH/tSr5n3J7NngNXOub+U26XvoBaYWavgX9AwsxjgDOBrFP+Qc879wTmX6JzrjPff\n+/nOuQko9rXGzBqbWWzJOnAmsAJ9Bw2R7sHqDv37qwW6//KX7r/8pXsw//lxD2bONcyRaWY2Fu/5\n0ADwrHPubp+7VO+Z2ctAKtAS2A7cBrwJvAp0BL4HLnDOHToxpdQAMzsF+BjIoOyZ6P+HNy+AvoMQ\nM7N+eJPqBfAS/K865+4ws3gU/1oTHKp9o3PuF4p97TGzrnh/OQPvUf2/O+fu1nfQMOkerPbpHsw/\nuv/yl+6/6g7dg/nDj3uwBptkEhERERERERGRmtNQH5cTEREREREREZEapCSTiIiIiIiIiIhUm5JM\nIiIiIiIiIiJSbUoyiYiIiIiIiIhItSnJJCIiIiIiIiIi1aYkk4j4wsyKzCy9XPl9DZ67s5mtqKnz\niYiIiNQXugcTkVAK97sDItJg5Trn+vvdCREREZEGRvdgIhIyGskkInWKmW0wswfMLMPMFplZ92B9\nZzObb2bLzewDM+sYrE8wszfMbFmwDA2eKmBmT5nZSjObZ2YxweN/Y2argud5xaePKSIiIlKn6B5M\nRGqCkkwi4peYQ4ZqX1huX5Zzri8wHXg0WPd/wPPOuX7AS8BjwfrHgI+cc8nAQGBlsD4JeNw51xvI\nBM4N1v8eGBA8z9Wh+nAiIiIidZTuwUQkZMw553cfRKQBMrMc51yTCuo3AKc559aZWQSwzTkXb2a7\ngLbOuQPB+q3OuZZmthNIdM7llztHZ+A951xScPtmIMI5d5eZ/QfIAd4E3nTO5YT4o4qIiIjUGboH\nE5FQ0kgmEamL3BHWqyK/3HoRZXPQnQU8jvcXt8VmprnpRERERDy6BxORalGSSUTqogvLLT8Lri8E\nLgquXwJ8HFz/ALgGwMwCZhZ3pJOaWRjQwTn3IXAzEAcc9pc8ERERkQZK92AiUi3KHouIX2LMLL3c\n9n+ccyWv0G1uZsvx/hI2Plg3BZhlZjcBO4GJwfqpwEwzuxLvr2XXAFuPcM0A8GLwJsiAx5xzmTX2\niURERETqPt2DiUjIaE4mEalTgvMBpDjndvndFxEREZGGQvdgIlIT9LiciIiIiIiIiIhUm0YyiYiI\niIiIiIhItWkkk4iIiIiIiIiIVJuSTCIiIiIiIiIiUm1KMomIiIiIiIiISLUpySQiIiIiIiIiItWm\nJJOIiIiIiIiIiFSbkkwiIiIiIiIiIlJt/x+1YLTo76g/SAAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "[3 8 5 ..., 8 8 8]\n", "[7 2 1 ..., 4 5 6]\n", "Number of False Prediction: 8971\n", "False Prediction Index: 0, Prediction: 3, Ground Truth: 7\n", "False Prediction Index: 1, Prediction: 8, Ground Truth: 2\n", "False Prediction Index: 2, Prediction: 5, Ground Truth: 1\n", "False Prediction Index: 3, Prediction: 8, Ground Truth: 0\n", "False Prediction Index: 4, Prediction: 0, Ground Truth: 4\n" ] }, { "data": { "image/png": "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\nO79O858i4v9ExIbYeWTf5jHu1fnJGLfDDjusmK1du3bC9zvxxBOL2Y033jjh+9Fezrm7Mw7b0M3x\nuf7664tZp9/37O65554rZt0eu7tixYq211etWtXV/b75zW8WszvvvLOY6eae4eMf/3gx+9M//dNi\n9t3vfrft9QULFhQfs3379vEPRtd0czAOPvjgYnbHHXcUs1mzZhWzKVPK/215EEezdzPHY489VszW\nrFlTzJYsKX+7mY0bNxazrVu3FrPJTjfpp4svvriYXXTRRV3dc+rUCX374z3GeLo55iuTc749Iko3\nestEhwL6QzehTroJddJNqJNuwnCN+xtDAwAAADB5WQIBAAAANIAlEAAAAEADWAIBAAAANIAlEAAA\nAEADNPPctEmi0/GdX/va1yZ8v/PPP7+YffnLX57w/WAyeOc731nMPvCBDxSzadOm9X2WX/qlX2p7\n/dRTT+37c11xxRXFbP369V3d87rrritma9eu7eqeMFH77LNPMVu4cGFX97z22mvbXncMPHuqDRs2\nFLPFixcXs5NOOqmYnXPOOT3NNAwf/ehHi9lnPvOZIU4C7OqlL31pV4975pln+jxJM3gnEAAAAEAD\nWAIBAAAANIAlEAAAAEADWAIBAAAANIAlEAAAAEADWAIBAAAANEDKOQ/vyVIa3pPtATodY/nhD394\nwvdbsGBBMVu1atWE78fE5ZzTqGdoRzdpOt2cPKZNm1bMbr311mK2adOmYva7v/u7ba9v3bp1/IMx\nELo5eRx//PHFbMmSJcVs0aJFxWzFihVtry9btqz4mJTKv2Xuv//+YvbQQw8VM3anm/TTo48+Wsym\nTp1azP7iL/6imH3yk5/saabJajzd9E4gAAAAgAawBAIAAABoAEsgAAAAgAawBAIAAABoAEsgAAAA\ngAZwOtiIHXvsscXspptuKmYvf/nLJ/xcTgcbPScpQJ10E+qkm1An3aSfbrzxxmJ2+eWXF7Nbbrll\nEONMak4HAwAAACAiLIEAAAAAGsESCAAAAKABLIEAAAAAGsASCAAAAKABLIEAAAAAGmDqWJ+QUjoo\nIj4fEQdERI6IZTnnT6aULomIMyLi8danXpBzLp9pTltveMMbilk3x8BHRKxbt67t9S1btnR1P+qk\nm1An3YQ66SbUSTdZtGjRqEdolDGXQBHxXEScl3P+TkrpZyJidUrp663sEznnvx3ceEAHugl10k2o\nk25CnXQThmjMJVDOeWNEbGx9/FRKaU1EHDjowYDOdBPqpJtQJ92EOukmDNeEvidQSmlORBwZEd9q\nXfqjlNI9KaUrUkrT+zwbME66CXXSTaiTbkKddBMGb9xLoJTSyyPiuoj4k5zzjyNiaUQcGhHzYufm\n9uOFxy1JKa1KKa3qw7zAi+gm1Ek3oU66CXXSTRiOcS2BUkrTYmchv5Bzvj4iIuf8WM55e855R0T8\nQ0QsaPfYnPOynPP8nPP8fg0N7KSbUCfdhDrpJtRJN2F4xlwCpZRSRHwuItbknC/f5frsXT7tHRFx\nX//HA0p0E+qkm1An3YQ66SYM13hOB3t9RLw3Iu5NKd3VunZBRLwnpTQvdh7jtz4izhzIhLR19913\nF7O3vOUtba9v3rx5UOMwGroJddJNqJNuQp10E4ZoPKeD3R4RqU10U//HAcZLN6FOugl10k2ok27C\ncE3odDAAAAAAJidLIAAAAIAGsAQCAAAAaABLIAAAAIAGsAQCAAAAaICUcx7ek6U0vCeDCuWc2518\nMHK6SdPpJtRJN6FOugl1Gk83vRMIAAAAoAEsgQAAAAAawBIIAAAAoAEsgQAAAAAawBIIAAAAoAEs\ngQAAAAAaYOqQn++JiNjQ+ni/1s9rUMss5thdLbP0Y46D+zHIgOhmZ+bYXS2z6OZo1DKLOXZXyyy6\nOXy1zBFRzyy1zBFRzyy6OXy1zBFRzyzm2N3Quplyzj0+T3dSSqtyzvNH8uQvUsss5thdLbPUMscw\n1PRrrWUWc+yulllqmWMYavq11jKLOXZXyyy1zDEMtfxaa5kjop5Zapkjop5ZapljGGr5tdYyR0Q9\ns5hjd8OcxZeDAQAAADSAJRAAAABAA4xyCbRshM/9YrXMYo7d1TJLLXMMQ02/1lpmMcfuapmlljmG\noaZfay2zmGN3tcxSyxzDUMuvtZY5IuqZpZY5IuqZpZY5hqGWX2stc0TUM4s5dje0WUb2PYEAAAAA\nGB5fDgYAAADQACNZAqWUjk8pPZBSejCl9KFRzNCaY31K6d6U0l0ppVVDfu4rUkqbUkr37XJtRkrp\n6yml/2z9c/qI5rgkpfTD1utyV0pp4RDmOCildEtK6f6U0vdSSue0ro/iNSnNMvTXZdh0UzfbzFFF\nN5vcywjdbD23bv70HLpZAd3UzTZz6OaI1dLL1iwj6WYtvewwi26OsJtD/3KwlNJeEfH9iPitiHgk\nIr4dEe/JOd8/1EF2zrI+IubnnJ8YwXO/MSK2RMTnc85zW9cui4jNOee/bv2BNT3n/MERzHFJRGzJ\nOf/tIJ/7RXPMjojZOefvpJR+JiJWR8RJEfG+GP5rUprllBjy6zJMuvm/z62bPz1HFd1sai8jdHOX\n59bNn55DN0dMN//3uXXzp+fQzRGqqZetedbHCLpZSy87zHJJ6ObIujmKdwItiIgHc84/yDn/JCK+\nGBEnjmCOkco53xYRm190+cSIuLL18ZWx8zfDKOYYupzzxpzzd1ofPxURayLiwBjNa1KaZU+nm6Gb\nbeaoopsN7mWEbkaEbraZQzdHTzdDN9vMoZujpZdRTy87zDJ0uvmCUSyBDoyIh3f5+SMxuj+QckT8\nW0ppdUppyYhm2NUBOeeNrY8fjYgDRjjLH6WU7mm9fW8obxV8XkppTkQcGRHfihG/Ji+aJWKEr8sQ\n6GaZbkY93WxYLyN0sxPdDN0cId0s083QzRGpqZcRdXWzpl5G6ObIutn0bwx9bM55XkS8LSLOar1V\nrQp559fpjerotqURcWhEzIuIjRHx8WE9cUrp5RFxXUT8Sc75x7tmw35N2swystelgXSzvcZ3Uy9H\nTjfb003dHDXdbE83dXPUquzmiHsZoZsj7eYolkA/jIiDdvn5z7euDV3O+Yetf26KiBti59sHR+mx\n1tcIPv+1gptGMUTO+bGc8/ac846I+IcY0uuSUpoWO4vwhZzz9a3LI3lN2s0yqtdliHSzTDcr6GZD\nexmhm53opm6Okm6W6aZujko1vYyorptV9DJCN0fdzVEsgb4dEa9JKR2SUto7IhZHxIphD5FS2rf1\njZgipbRvRBwXEfd1ftTArYiI01sfnx4R/zKKIZ4vQcs7YgivS0opRcTnImJNzvnyXaKhvyalWUbx\nugyZbpbp5oi72eBeRuhmJ7qpm6Okm2W6qZujUkUvI6rsZhW9jNDNdnMM9TXJOQ/9R0QsjJ3ftX1d\nRFw4ohkOjYi7Wz++N+w5IuLq2Pk2r22x82tVfz8iZkbEzRHxnxHxbxExY0RzXBUR90bEPbGzFLOH\nMMexsfOtd/dExF2tHwtH9JqUZhn66zLsH7qpm23mqKKbTe5l69evm7r54jl0s4IfuqmbbebQzRH/\nqKGXrTlG1s1aetlhFt0cYTeHfkQ8AAAAAMPX9G8MDQAAANAIlkAAAAAADWAJBAAAANAAlkAAAAAA\nDWAJBAAAANAAlkAAAAAADWAJBAAAANAAlkAAAAAADfD/AW6I4n5HtlR+AAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Draw Graph about Error Values & Accuracy Values\n", "def draw_error_values_and_accuracy(epoch_list, train_error_list, validation_error_list, test_accuracy_list):\n", " # Draw Error Values and Accuracy\n", " fig = plt.figure(figsize=(20, 5))\n", " plt.subplot(121)\n", " plt.plot(epoch_list[1:], train_error_list[1:], 'r', label='Train')\n", " plt.plot(epoch_list[1:], validation_error_list[1:], 'g', label='Validation')\n", " plt.ylabel('Total Error')\n", " plt.xlabel('Epochs')\n", " plt.grid(True)\n", " plt.legend(loc='upper right')\n", "\n", " plt.subplot(122)\n", " plt.plot(epoch_list[1:], test_accuracy_list[1:], 'b', label='Test')\n", " plt.ylabel('Accuracy')\n", " plt.xlabel('Epochs')\n", " plt.yticks(np.arange(0.0, 1.0, 0.05))\n", " plt.grid(True)\n", " plt.legend(loc='lower right')\n", " plt.show()\n", "\n", "draw_error_values_and_accuracy(epoch_list, train_error_list, validation_error_list, test_accuracy_list)\n", " \n", "def draw_false_prediction(diff_index_list):\n", " fig = plt.figure(figsize=(20, 5))\n", " for i in range(5):\n", " j = diff_index_list[i]\n", " print(\"False Prediction Index: %s, Prediction: %s, Ground Truth: %s\" % (j, prediction[j], ground_truth[j]))\n", " img = np.array(mnist.test.images[j])\n", " img.shape = (28, 28)\n", " plt.subplot(150 + (i+1))\n", " plt.imshow(img, cmap='gray')\n", " \n", "with tf.Session() as sess: \n", " init = tf.global_variables_initializer()\n", " sess.run(init)\n", " # False Prediction Profile\n", " prediction = sess.run(tf.argmax(u, 1), feed_dict={x:mnist.test.images})\n", " ground_truth = sess.run(tf.argmax(y_target, 1), feed_dict={y_target:mnist.test.labels})\n", "\n", " print(prediction)\n", " print(ground_truth)\n", "\n", " diff_index_list = []\n", " for i in range(mnist.test.num_examples):\n", " if (prediction[i] != ground_truth[i]):\n", " diff_index_list.append(i)\n", " \n", " print(\"Number of False Prediction:\", len(diff_index_list))\n", " draw_false_prediction(diff_index_list)" ] } ], "metadata": { "anaconda-cloud": {}, "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.6.0" } }, "nbformat": 4, "nbformat_minor": 0 }