Skip to content

Instantly share code, notes, and snippets.

@tillahoffmann
Last active March 17, 2018 19:19
Show Gist options
  • Save tillahoffmann/53f902212c1c511e6c3d45abb5f37b9b to your computer and use it in GitHub Desktop.
Save tillahoffmann/53f902212c1c511e6c3d45abb5f37b9b to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'1.5.0-dev20171031'"
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import tensorflow as tf\n",
"import numpy as np\n",
"import time\n",
"from tqdm import tqdm\n",
"import threading\n",
"from matplotlib import pyplot as plt\n",
"from tensorflow.contrib.data.python.ops.batching import map_and_batch\n",
"from tensorflow.contrib import data as tfdata\n",
"%matplotlib inline\n",
"tf.__version__"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"BATCH_SIZE = 128\n",
"FEATURE_SHAPE = (16, 16)\n",
"NUM_BATCHES = 1024\n",
"PREFETCH_FACTOR = 4\n",
"\n",
"weights = np.random.normal(0, 1, FEATURE_SHAPE)\n",
"\n",
"\n",
"def data_generator():\n",
" for i in range(BATCH_SIZE * NUM_BATCHES):\n",
" features = np.random.normal(0, 1, FEATURE_SHAPE)\n",
" y = np.sum(features * weights) + np.random.normal(0, 1)\n",
" yield features.astype(np.float32), y.astype(np.float32) \n",
" \n",
" \n",
"def build_graph(batch_X, batch_y):\n",
" weights_tensor = tf.get_variable('weights', FEATURE_SHAPE, tf.float32)\n",
" predictions = tf.reduce_sum(weights_tensor * batch_X, axis=(1, 2))\n",
" loss_tensor = tf.losses.mean_squared_error(batch_y, predictions)\n",
" \n",
" optimizer = tf.train.AdamOptimizer()\n",
" train_op = optimizer.minimize(loss_tensor)\n",
" return loss_tensor, train_op\n",
"\n",
"\n",
"def train(sess, train_op, loss_tensor):\n",
" times = []\n",
" losses = []\n",
" for i in tqdm(range(NUM_BATCHES)):\n",
" start = time.time()\n",
" _, loss = sess.run([train_op, loss_tensor])\n",
" times.append(time.time() - start)\n",
" losses.append(loss)\n",
" return np.asarray(times), np.asarray(losses)\n",
"\n",
"times = {}\n",
"losses = {}"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Training with the datasets API"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"WARNING:tensorflow:From <ipython-input-3-fe442a903f1d>:5: Dataset.from_generator (from tensorflow.contrib.data.python.ops.dataset_ops) is deprecated and will be removed in a future version.\n",
"Instructions for updating:\n",
"Use `tf.data.Dataset.from_generator()`.\n"
]
}
],
"source": [
"with tf.Graph().as_default():\n",
" dataset = tfdata.Dataset.from_generator(\n",
" data_generator, \n",
" (tf.float32, tf.float32), \n",
" (FEATURE_SHAPE, ()))\n",
" batches = dataset.batch(BATCH_SIZE).prefetch(PREFETCH_FACTOR * BATCH_SIZE)\n",
" iterator = batches.make_one_shot_iterator()\n",
" batch_X, batch_y = iterator.get_next()\n",
" \n",
" loss_tensor, train_op = build_graph(batch_X, batch_y)\n",
" \n",
" sess = tf.Session()\n",
" sess.run(tf.global_variables_initializer())"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"100%|██████████| 1024/1024 [00:25<00:00, 40.59it/s]\n"
]
}
],
"source": [
"times['datasets1'], losses['datasets1'] = train(sess, train_op, loss_tensor)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Training with the datasets API (2)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"with tf.Graph().as_default():\n",
" dataset = tfdata.Dataset.from_generator(\n",
" data_generator, \n",
" (tf.float32, tf.float32), \n",
" (FEATURE_SHAPE, ()))\n",
" batches = dataset.apply(map_and_batch(lambda a, b: (a, b), BATCH_SIZE)).prefetch(PREFETCH_FACTOR * BATCH_SIZE)\n",
" iterator = batches.make_one_shot_iterator()\n",
" batch_X, batch_y = iterator.get_next()\n",
" \n",
" loss_tensor, train_op = build_graph(batch_X, batch_y)\n",
" \n",
" sess = tf.Session()\n",
" sess.run(tf.global_variables_initializer())"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"100%|██████████| 1024/1024 [00:26<00:00, 38.46it/s]\n"
]
}
],
"source": [
"times['datasets2'], losses['datasets2'] = train(sess, train_op, loss_tensor)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Training with queues"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"with tf.Graph().as_default():\n",
" queue = tf.FIFOQueue(\n",
" PREFETCH_FACTOR * BATCH_SIZE,\n",
" (tf.float32, tf.float32),\n",
" (FEATURE_SHAPE, ())\n",
" )\n",
" placeholder_X = tf.placeholder(tf.float32, FEATURE_SHAPE)\n",
" placeholder_y = tf.placeholder(tf.float32, ())\n",
" enqueue = queue.enqueue((placeholder_X, placeholder_y))\n",
" \n",
" batch_X, batch_y = queue.dequeue_many(BATCH_SIZE)\n",
" loss_tensor, train_op = build_graph(batch_X, batch_y)\n",
" \n",
" sess = tf.Session()\n",
" sess.run(tf.global_variables_initializer())\n",
" tf.train.start_queue_runners(sess)"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"100%|██████████| 1024/1024 [00:45<00:00, 22.31it/s]\n"
]
}
],
"source": [
"def fill_queue():\n",
" for X, y in data_generator():\n",
" sess.run(enqueue, {placeholder_X: X, placeholder_y: y})\n",
"\n",
"thread = threading.Thread(target=fill_queue) \n",
"thread.start()\n",
"times['queues'], losses['queues'] = train(sess, train_op, loss_tensor)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Training with feed dicts"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [],
"source": [
"with tf.Graph().as_default():\n",
" batch_X = tf.placeholder(tf.float32, (BATCH_SIZE, ) + FEATURE_SHAPE)\n",
" batch_y = tf.placeholder(tf.float32, (BATCH_SIZE, ))\n",
" \n",
" loss_tensor, train_op = build_graph(batch_X, batch_y)\n",
" \n",
" sess = tf.Session()\n",
" sess.run(tf.global_variables_initializer())\n",
" tf.train.start_queue_runners(sess)"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"100%|██████████| 1024/1024 [00:05<00:00, 178.47it/s]\n"
]
}
],
"source": [
"data = data_generator()\n",
"_times = []\n",
"_losses = []\n",
"\n",
"for i in tqdm(range(NUM_BATCHES)):\n",
" X = []\n",
" y = []\n",
" \n",
" for i in range(BATCH_SIZE):\n",
" _X, _y = next(data)\n",
" X.append(_X)\n",
" y.append(_y)\n",
" \n",
" start = time.time()\n",
" _, loss = sess.run([train_op, loss_tensor], {batch_X: X, batch_y: y})\n",
" _times.append(time.time() - start)\n",
" _losses.append(loss)\n",
" \n",
"times['placeholder'] = np.asarray(_times)\n",
"losses['placeholder'] = np.asarray(_losses)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Summary"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEYCAYAAAAJeGK1AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4wLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvpW3flQAAIABJREFUeJzsnXd4U9X7wD+nixZomWUJCA72HrJU\nUJyI4sSFggpuBbeIA5Al4leGCD9cyBAZKiIqiiICIpsypGwKtJRV6KJ0pHl/f9y0TdokTdukSdrz\neZ48yT33nHPf3OTe977nvOd9lYig0Wg0Go2vEeBtATQajUajsYdWUBqNRqPxSbSC0mg0Go1PohWU\nRqPRaHwSraA0Go1G45NoBaXRaDQan0QrKI1Go9H4JFpBaTQajcYn0QpKo9FoND5JkLcFKAk1a9aU\nRo0aeVsMTTll69atZ0Uk0ttyFBd9/Wi8havXjl8rqEaNGrFlyxZvi6EppyiljnpbhpKgrx+Nt3D1\n2tFDfBqNRqPxSbSC0mg0Go1PohWURqPRaHwSv56DKm9kZWURGxtLenq6t0UpV4SGhlK/fn2Cg4O9\nLYpGU67QCsqPiI2NJTw8nEaNGqGU8rY45QIRISEhgdjYWBo3buxtcTSacoUe4vMj0tPTqVGjhlZO\npYhSiho1amirVaPxAlpB+RlaOZU++pxrNN6h3CmozNhYslNTvS2GRqPRlFnWxK7hTNqZEvdT7hTU\noRtuJOa+/t4Wo0wwcuRIJk2a5HD/0qVL2bNnj1uPGRMTwzfffFNovccff5xatWrRqlUrtx5fo9E4\n52jyUV5Z/QoTN08scV/lTkEBZB454m0RygXeVFCDBg1ixYoVbj22RqNxjsls4q21bxESGMKrnV4t\ncX/ai89PGfXTf+w5kezWPlvUi+C921s6rTN27Fi+/vpratWqRYMGDejYsSOfffYZs2bNIjMzkyuu\nuIK5c+cSFRXFsmXL+PvvvxkzZgzfffcdq1atKlCvYsWKLF68mFGjRhEYGEiVKlVYs2YN2dnZvPnm\nm6xevZqMjAyee+45nnrqKd58802io6Np164dAwcO5KabbuKxxx4jMzMTs9nMd999x5VXXsm1115L\nTEyMW8+PRqNxzhe7vmDn2Z1MvHYitSvVLnF/5dKC0hSPrVu38u233xIVFcUvv/zC5s2bAbj77rvZ\nvHkzO3bsoHnz5nzxxRd0796dO+64gw8//JCoqCguv/xyu/UARo8ezW+//caOHTtYtmwZAF988QVV\nqlRh8+bNbN68mc8++4wjR44wYcIErrnmGqKionjppZeYOXMmQ4cOJSoqii1btlC/fn2vnR+Npjyz\n68wuZuyYwa2Nb+XWxre6pU9tQfkphVk6nmDt2rXcddddVKxYEYA77rgDgN27d/P222+TmJhIamoq\nN998s932jur16NGDQYMG0b9/f+6++24Afv/9d3bu3MmSJUsASEpK4sCBA4SEhNj02a1bN8aOHUts\nbCx33303V155pUe+u0ajccyFrAu8sfYNIitG8nbXt93Wr7agNCVm0KBBfPLJJ+zatYv33nvP4Zoh\nR/VmzpzJmDFjOH78OB07diQhIQERYdq0aURFRREVFcWRI0e46aabCvT50EMPsWzZMsLCwujTpw+r\nVq3y6HfVaDQFGb9xPHGpcYy/ejwRIRFu61crKI3LXHvttSxdupSLFy+SkpLCTz/9BEBKSgp169Yl\nKyuL+fPn59YPDw8nJSUld9tRvUOHDtGlSxdGjx5NZGQkx48f5+abb2bGjBlkZWUBsH//fi5cuFCg\nz8OHD3PZZZfx4osv0q9fP3bu3Onp06DRaKxYEbOCHw/9yBOtnqBTnU5u7dvjQ3xKqUBgCxAnIn2V\nUrOBnkCSpcogEYlSxmrIKUAfIM1Svs3T8mlcp0OHDtx///20bduWWrVq0blzZwDef/99unTpQmRk\nJF26dMlVIA888ABDhgxh6tSpLFmyxGG91157jQMHDiAi9O7dm7Zt29KmTRtiYmLo0KEDIkJkZCRL\nly6lTZs2BAYG0rZtWwYNGkRGRgZz584lODiYOnXq8NZbbwHw4IMPsnr1as6ePUv9+vUZNWoUTzzx\nhHdOnEZTRjmReoLR60fTpmYbnmn3jNv7VyLi9k5tDqDUy0AnIMJKQS0XkSX56vUBXsBQUF2AKSLS\nxVnfnTp1kqImXItu1hyA5nuji9TOF4iOjqZ58+beFqNcYu/cK6W2ioh7HxlLkeJcPxpNDtnmbB7/\n7XH2ntvLktuX0CCigcttXb12PDrEp5SqD9wGfO5C9X7AHDHYAFRVStX1pHwajUajKR5f7P6Cbae3\nMaLriCIpp6Lg6TmoycDrgDlf+Vil1E6l1MdKqQqWskuA41Z1Yi1lNiilnlRKbVFKbTlzpuShNDQa\njUZTNPad28eMqBnc0ugWbr/sdo8dx2MKSinVFzgtIlvz7RoONAM6A9WBN4rSr4jMEpFOItIpMjLS\nPcJqNBqNxiUyszN5a91bVKlQhRFdRng0mLInLagewB1KqRjgW+B6pdQ8EYm3DONlAF8BV1nqxwHW\ndmJ9S5lGo9FofISp26ay//x+RnUfRdXQqh49lscUlIgMF5H6ItIIeABYJSIDcuaVLF57dwK7LU2W\nAY8qg65AkojEe0o+jUaj0RSNzSc3M2fPHPo36U/PBj09fjxvRJKYr5SKBBQQBTxtKf8Fw4PvIIab\n+WNekE2j0Wg0dkjJTGHEuhE0jGjIK51eKZVjlspCXRFZLSJ9LZ+vF5HWItJKRAaISKqlXETkORG5\n3LJf+7/6OL6abuP48eNcd911tGjRgpYtWzJlyhS3yqDRlEcmbJrA6bTTjLt6HBWDK5bKMXUkCY3H\n8JaCCgoK4qOPPmLPnj1s2LCB6dOnu10OjaY88XvM7yw7tIwhbYbQJrJNqR1XB4v1V359E07ucm+f\ndVrDrROcVvGXdBt16xpL6MLDw2nevDlxcXG0aNHCvedLoykHnEk7w+gNo2lZoyVPtnmyVI+tLSiN\ny/hjuo2YmBi2b99Oly5Og5JoNBo7iAjvrn+XDFMG468ZT3BAcKkeX1tQ/kohlo4n8Ld0G6mpqdxz\nzz1MnjyZiAj3RVjWaMoLi/cvZl3cOoZfNZzGVRqX+vG1BaUpMb6YbiMrK4t77rmHhx9+OFfpaTQa\n1zmafJRJWybRvV53Hmj2gFdk0ApK4zL+km5DRHjiiSdo3rw5L7/8sqdPi0ZT5jCZTby19i2CA4IZ\n3X00Aco7qkIP8Wlcxl/Sbfzzzz/MnTuX1q1b065dOwDGjRtHnz59vHPiPICdNDaNMSK21AC2Ao+I\nSKY3ZdT4L5/v+pydZ3fyYc8PqV2pttfk8Hi6DU+i021oSgtfS7dhJ43NIuB7EflWKTUT2CEiM5z1\nodNtaOyx++xuBvwygJsb3cwH137gkWP4RLoNjUbjfvKnsbGEDbseyMmx9jVGGDGNpkhcNF1k+Nrh\n1AyryVtd3vK2OHqIT6PxQ3LS2IRbtmsAiSJismzbTVUDRroa4EmAhg0belhMjT8hIoz6dxRHk48y\n66ZZVKlQxdsilV0LakvMOeb+G+NtMTQat+IkjY1L6HQ1Gkcs2LuAnw//zHPtnqNr3a7eFgcowxbU\nvTP/BeCRbo28K4hG415y0tj0AUKBCGAKRgbqIIsVpVPVaIrEzjM7+XDzh/Sq34shbYZ4W5xcyqwF\npdGURRyksXkY+Au411JtIPCjl0TU+BnJmcm8vuZ1aleqzZirx3jNpdweviOJRqMpCW8ALyulDmLM\nSX3hZXk0fsLYDWM5deEUE6+d6BPzTtaU2SE+jaasIyKrgdWWz4fJy06t0bjEbzG/8cuRX3i23bOl\nGqXcVbQFpdFoNOWQo8lHeW/9e7Sp2YbBrQZ7Wxy7aAvKT/lg0wfsPbfXrX02q96MN656w2kde+k2\nli9fzqRJk+jUqRNnz56lU6dOxMTEOEyZsXr1aiZNmsTy5csBeP755+nUqRODBg1i69atvPzyy6Sm\nplKzZk1mz55N3bp1mTp1KjNnziQoKIgWLVrw7bffuvW7azTliWxzNiPWjSBQBTKp5ySCA0s3Srmr\nlF8FdWYf/P4O9J8DwaHelsYvsE63YTKZ6NChAx07dnRY3zplRkZGBj169LAb8DWHrKwsXnjhBX78\n8UciIyNZuHAhI0aM4Msvv2TChAkcOXKEChUqkJiY6Imvp9GUG+ZHz2fHmR2Mu3ocdSvX9bY4DvG4\ngnI1ZphSqgIwB+gIJAD3i0iMxwT7+RWIWQvHN8JlPT12GE9RmKXjCRyl23CEqykzcti3bx+7d+/m\nxhtvBCA7Ozs38WCbNm14+OGHufPOO7nzTh0kQaMpLkeTjzJ1+1R61e9F38v6elscp5SGBTUUiMZY\nrwHwAfCxVcywJ4AZlvfzInKFUuoBS737S0E+TQkJCgrCbDYD2KTayEmZkT8/1Lp163LrW7cREVq2\nbMm///5b4Bg///wza9as4aeffmLs2LHs2rWLoKDyOwCg0RQHEWH0v6MJCQzhnW7vYETJ8l086iRR\nxJhh/SzbWPb3Vr5+9soZjtJtNGrUiK1bjcAGOdYS4DBlxqWXXsqePXvIyMggMTGRP//8E4CmTZty\n5syZXAWVlZXFf//9h9ls5vjx41x33XV88MEHJCUlkZqaWppfXaMpE6w6topNJzcxtP1QalWs5W1x\nCsXTj6BFiRl2CXAcQERMSqkkS/2z1h3qWGLew1G6jVdffZX+/fsza9Ysbrvtttz6gwcPtpsyo0GD\nBvTv359WrVrRuHFj2rdvD0BISAhLlizhxRdfJCkpCZPJxLBhw2jSpAkDBgwgKSkJEeHFF1+katWq\nXjkHGo2/kpWdxfQd07k04lLubXJv4Q18AI8pKOuYYUqpXu7qV0RmAbPASBfgrn41rjFixAhGjBgB\nwMiRIwFo1qwZO3fuzK0zZswYAAICAhg3bhzjxo0r0M/EiROZOHFigfJ27dqxZs2aAuXr1q1zh/ga\nTbll5s6ZHDh/gMnXTSYwINDb4riEJy2oosYMiwMaALFKqSCgCoazhEcwixjjm3oUUaPRlHF2ntnJ\n57s+p9/l/ejdsLe3xXEZjykoERkODAewWFCvisjDSqnFGDHDvsU2Ztgyy/a/lv2rxIPZFI+cvcDl\nhqCeOkSZJ8eC0mg0vs1HWz6iZmhNr3j/lgRvRJJwFDPsC6CGpfxl4M2SHCQgNI6A0OMO9yelmxzu\n02g0mrLCmtg1bDu9jcdbP054SHjhDXyIUvHTdSVmmIikA/e565iVGk+zfHra7v4O2bvcdSiNRqPx\nScxiZvK2yTQMb0j/Jv29LU6R0bH4Eo/C8pfAnO1tSTQajcatzN0zlwPnD/Bcu+d8NpyRM/RKx2Uv\nGO9tHoCGXbwri0aj0biJw4mHmbxtMr0b9ubWxrd6W5xioS2oXLSzREno1asXW7ZscVt/q1evpm/f\nooVhcSTD7Nmzef75590lmkbj84gIYzeOpWJQRd7t9q7PR4xwRLlSUE6dAp3s2xi/kdZftyY2JdYD\nUml8DZNJO9Bo/JvVx1ez6eQmXmz/ItVDq3tbnGJT9of4RlaBG0bC1S8VUtGxglp6cCkA209vp354\nfbeJVhJOjhtHRrR7021UaN6MOm+95bROTEwMt9xyCx07dmTbtm20bNmSOXPm2NR55pln2Lx5Mxcv\nXuTee+9l1KhRAGzevJmhQ4dy4cIFKlSowJ9//knFihXtpuQASE1N5d5772X37t107NiRefPmoZTi\nzz//5NVXX8VkMtG5c2dmzJhBhQoVbGT46quvGD9+PFWrVqVt27a5+8+cOcPTTz/NsWPHAJg8eTI9\nevRg5MiRHDp0iMOHD9OwYUMWLFjglnOq0ZQ2JrOJydsm0yiiEfc0ucfb4pSI8mFBrfu48DourIcS\nPQwIGFHHn332WaKjo4mIiODTTz+12T927Fi2bNnCzp07+fvvv9m5cyeZmZncf//9TJkyhR07dvDH\nH38QFhZmk5Jj8+bNfPbZZxw5cgSA7du3M3nyZPbs2cPhw4f5559/SE9PZ9CgQSxcuJBdu3ZhMpmY\nMWOGzfHj4+N57733+Oeff1i3bh179uzJ3Td06FBeeuklNm/ezHfffcfgwXmJ2vbs2cMff/yhlZPG\nr/lu/3ccTjrMsA7DCArwbxvEv6V3QocDZt5cYibj1iAq5KR7cqqELPvO7IdTu6DVPWA2Q0AACt8b\nvy3M0vEkDRo0oEePHgAMGDCAqVOn2uxftGgRs2bNwmQyER8fz549e1BKUbdu3dz4fRERRnB7Zyk5\nrrrqKurXNyzWdu3aERMTQ3h4OI0bN6ZJkyYADBw4kOnTpzNs2LDc42/cuJFevXoRGRkJwP3338/+\n/fsB+OOPP2wUVnJycm7g2TvuuIOwsDD3niyNphQ5nnyc/239H53rdOb6htd7W5wSU2YVVNd9hsJJ\nOxvC4d8qUrfpUqr0c5K/SCzpH6YbN1DqdYCp7eDuzzwsqf+Rf8LVevvIkSNMmjSJzZs3U61aNQYN\nGmSTgiM/jlJyrF692mbYLjAw0C1zQ2azmQ0bNhAaWjBJZaVKlUrcv0bjLcxi5p317xCoAhl39Ti/\ndYywpswO8SmLQWTOUmBWxA8fzhGrBHu/VwzjSLCVfs5vXZ22PGXv/t7Dkvofx44dy02J8c0333D1\n1Vfn7ktOTqZSpUpUqVKFU6dO8euvvwJGKo34+Hg2b94MQEpKCiaTyWFKDkc0bdqUmJgYDh48CMDc\nuXPp2dM24WSXLl34+++/SUhIICsri8WLF+fuu+mmm5g2bVrudlRUVElOhUbjMyzYu4Ctp7byWufX\nqFOpjrfFcQtlVkHZI+PgodzPr9SO5I769az25h/+8/+nD0/RtGlTpk+fTvPmzTl//jzPPPNM7r62\nbdvSvn17mjVrxkMPPZQ7FBgSEsLChQt54YUXaNu2LTfeeCPp6ekMHjyYFi1a0KFDB1q1asVTTz3l\n1FIKDQ3lq6++4r777qN169YEBATw9NO20ULq1q3LyJEj6datGz169KB58+a5+6ZOncqWLVto06YN\nLVq0YObMmW4+OxpN6XM8+ThTtk3hmkuu4c4ryk7G6TI7xBdQVH8Gh/NT2jEiP0FBQcybN8+mbPXq\n1bmfZ8+ebbdd586d2bBhQ4Fyeyk5evXqRa9evXK3P/nkk9zPvXv3Zvv27QX6sZbhscce47HHHitQ\np2bNmixcuLBAuQ58q/FXTGYTI/4ZQZAK4r1u75WJob0cyq4FZdEr6S7/WPkUUU47He1co9H4MLN2\nzmL76e281fUtaleq7W1x3EqZVVA5aulASGHxp/IUUdbp0yTsq2TRSYUrtqxTpzk5bhySXX7i+DVq\n1Ijdu3d7WwyNRgNsPrmZ/9v5f9xx+R30vaxokVf8gbKroHIMHwd6ZtF4E4NXZJOuFHddUoftyYc4\n8cqrnN5ehcxk65FPxxZU/Dtvc37OXC7YGbbyFB5MkaVxgD7nGl8kMT2RN9e8ScPwhozoMsLb4niE\nsqugXKhz03Zhf0gIB0NC+PDIj2Rb1sOYs5XdTLsFblQmi+VUSvev0NBQEhIS9A2zFBEREhIS7Lql\nazTeQkQYvWE05zLOMfHaiVQMruhtkTxCmXWSUK7ew60UkQqw6GsBjq43PptNqHgHrsilPE9Vv359\nYmNjOXPmTKkcT2MQGhqau2BYo/EFfjr8EyuPrmRoh6E0r9G88AZ+SplVUC4jefNHZot+ygTC/pls\nbBxaBTWrQ3jlgm1zlVvpKKjg4GAaN25cKsfSaDS+yeHEw4zZMIaOtTvyWMuCnqplibI7xGfRGeKi\nE1/jA2lk7voPgD/DKvFEnVpMqValkINoTz+NRlN6ZGZn8tqa1wgLCmPitRMJDAj0tkgexWMKSikV\nqpTapJTaoZT6Tyk1ylI+Wyl1RCkVZXm1s5QrpdRUpdRBpdROpVSHEh3f8l4x3jUjccDsk7mfxQyb\nwkL5vGphCiqngVZQGo3G80yPms7+8/sZ3X00tSrW8rY4HseTQ3wZwPUikqqUCgbWKaV+tex7TUSW\n5Kt/K3Cl5dUFmGF5Lx4WnRERU/Q0x0Wdv9JOCxqNxtP8d/Y/Zv83m3uuvIeeDXoW3qAM4DELSgxS\nLZvBlpezO3k/YI6l3QagqlKqbnGPXyO5+ErDVQWl0EN8Go3G86Sb0hm+bjiRYZG83Ollb4tTanh0\nDkopFaiUigJOAytFZKNl11jLMN7HSqmckNWXAMetmsdayvL3+aRSaotSaoszb7YrTjrcVbjcRfUA\nLIJ+EhEyLPmONBqNxhU+3fEpR5KO8H6P94kIifC2OKWGRxWUiGSLSDugPnCVUqoVMBxoBnQGqgNv\nFLHPWSLSSUQ65eT7cTeO4vgVSFhYDC++83PncvjWPlzcsaN4wmk0mnLFxviNzN5tDO11q9fN2+KU\nKqXixSciicBfwC0iEm8ZxssAvgKuslSLAxpYNatvKfM4nfeZHe7LzlTUPWacpgJzTcXw4rsYZSim\nzGPHC6mpKQ8opcrmCkuNWziXfo7ha4fTqEojXu/8urfFKXU86cUXqZSqavkcBtwI7M2ZV1JGyN07\ngZzAbsuARy3efF2BJBGJ95R81rz2va2CsvZMj11Xnd7LQqicZkcJaTdzTTFRSnVXSu0B9lq22yql\nPvWyWBofQkR45593SMpI4sNrPyyz0SKc4UkvvrrA10qpQAxFuEhEliulVimlIjH0QBSQk8znF6AP\ncBBIA7y3As1K3+TE5QvOht/+O0nvBllEhNp6BhbLi68MhcTXFIuPgZsxHswQkR1KqWu9K5LGl1h6\ncClrYtfwRuc3aFq9qbfF8QoeU1AishNob6f8egf1BXjOU/IUBUdOEn9En2aC7GXcXa0tFS07rBWU\n2QzRy6BFP+dKSFtd5R4ROZ4vd0+hYfGVUqHAGqACxvW7RETeU0o1Br4FagBbgUdEJNP9UmtKg9iU\nWD7c/CEda3fkoeYPeVscr1E2I0kU4eYfsDusQJkz2yY9K+8eoux58W3+DBYPhKj59jvQlpPG4LhS\nqjsgSqlgpdSrQLQL7XLWF7YF2gG3WIbEPwA+FpErgPPAE54SXONZMrMzeXn1y6BgTI8xBKiyeZt2\nhbL5zY+scblq4NZKBcpsLChlpyz/TmuFmHzCeE89XciRtQVVznkaY8TgEgxnoHa4MILgZH3h9UDO\n4vevMeZ3NX7IJ1GfEH0umrE9xlI/vHwHKS5UQSmlhiqlIizOC18opbYppW4qDeGKTdZFt3dp1+6x\n62Yu+fZpNAURkbMi8rCI1BaRWiIyQEQSXGmbf30hcAhIFBGTpYrdNYSWti6tI9R4h62ntjJ792zu\nbXIv1zW8ztvieB1XLKjHRSQZuAmoBjwCTPCoVCUlKKREzR2plgcD/yQsJZGT749BsrLse/FdOFtI\nLxoNKKUaK6X+p5T6Xim1LOflStv86wsx1hW6RGmsI9QUj9TMVEasG8EllS/htU6veVscn8AVJ4mc\nO20fYK6I/KeUj5sHgSVUUPZG3wQ6BBwk5OevOL9nE5W6dbWvoHLmnhydIh8/dZpSYynwBfAT4Hgh\nnhNEJFEp9RfQDSM0WJDFiiq1NYQa9/Hx1o+JvxDP17d8XS5dyu3higW1VSn1O4aC+k0pFU4xL6hS\no4QKygaLtqqdaLwrs/HVk3/5hZQVKwDDzfzAro1cWPd/ee1STsHXt0PaOffJoilLpIvIVBH5S0T+\nznkV1sjB+sJojIXw91qqDQR+9JTgGvfz74l/WbR/EQ83f5h2tdp5WxyfwRUL6gmMCdzDIpKmlKqO\nN9couUJg0SOYW6MQ2h42E2zKKxv5jZm9g/O2k3/5NW9D4Mrv8k3LbZhuvO9YAN18wnte41tMUUq9\nB/yO4ZkHgIhsK6Sdo/WFe4BvlVJjgO0Y1pnGD0jKSOLtdW/TuEpjXmj/grfF8SlcUVDdgCgRuaCU\nGgB0AKZ4VqwS4oY1RiMWWoxEVyxtZ8fT65009mmNMZ97PXkjEjneeA5xsr7wMHlhwzR+gogw6t9R\nnEs/x7Te0wgLKrjspTzjioKaAbRVSrUFXgE+B+YAvpuQpIRKIfR8XpZKU1rhpygt8wL5Uxse+7s6\n1S5PI9yRO7kTGcVsxnT2LMG1yn5CsnLMfcBlejFt+Wbx/sWsPLqSVzq+QosaLbwtjs/hyhyUyRLl\noR/wiYhMB8I9K1ZJKZmCqrU1tEj141LjOLGxKilxFXLLLsSHEruuekFF5IKTxNlPpnPw2p5knSxB\nzhCNr7MbqOptITTeY//5/Xyw6QN61OvBoy0f9bY4PokrCipFKTUcYzjiZ6VUAMbiQN9FSteHQxKO\nkXSkIrFra7hQ2aKwUk7CyCp2FxWn/m3MlZv0OpWyTFWM4Mm/FdXNXOP/pJvSeWPNG4SHhDPm6vId\nLcIZrgzx3Q88hLEe6qRSqiHwoWfFKhkXovZ4pN/Kh4PIslMe+v3PODuVF3fsILBGDULqW60KP7PP\neN+1BBrrGKHlkPe8LYDGe3y89WMOJh5k5g0zqRlW09vi+CyFKiiLUpoPdFZK9QU2icgcz4tWfMxp\n7o8kAVB/VSUONis4ZRCYEGiznXwsb4hw2wv/R1jaDACa740m8/Bhyx69Hqo844pLuaZssiZ2Dd/s\n/YYBzQfQ45Ie3hbHp3El1FF/YBPGpG5/YKNS6l7nrbyLCvScuXzOvKvQOmd2503RhaXZDjem78lv\n3TmbL9NKrKyhlFpneU9RSiVbvVKUUsnelk/jWc6kneGdf96hSbUmDOs4zNvi+DyuDPGNADqLyGkw\nFgoCf5AXmNLnUEGlO56rpASKRLuhlytE5GrLu487GmncjVnMvP3P26RlpTHx5olUCKxQeKNyjit3\n8oAc5WQhwcV2XsOTFpT78Ix1ZDp7lsxjxzzSt8Z9KKXmulKmKTt8E/0N60+s57XOr3F51cu9LY5f\n4IoFtUIp9RuwwLJ9P0b2W59FBXpuaOzyeBcsHleMolwR7VQugVV14OprAGO+S+PTtLTeUEoFAR29\nJIvGw+w/v5+Pt35Mr/q9uK/Jfd4Wx29wxUniNaXUPUDObN4sEfnBs2KVkIDAwusUkxoprtRyRUEW\nTHZ4cedOTAkuZVzQ+CmWJRspp5FTAAAgAElEQVRvAWFWc04KyARmeU0wjcfIMmcxYt0IKodUZmT3\nkXmJTjWF4lLKdxH5DviuKB0XNTW1UqoCRoSKjhjDiPeLSExRjpl7bA9aUCUiOy+4nz0jKab//QCE\nttAryssqIjIeGK+UGi8iw70tj8bz/G/L/9h7bi+Tr5tMjTAX1kr6OxcT4Y/3oEEXaFeydPUOJ2vs\neBkV1duoqKmpnwDOW8o/ttQrFlFpR4vb1C04HKFLtRcZwslwXiFPWsmZ2unLX9HKqXywImYF86Ln\nMaD5AHo37O1tcTxP7FaYeQ1smwNJsSXuzqGCEpFwEYmw8woXkYjCOi5Gaup+lm0s+3sXN++UKcB7\nnnGnT4RyPqBwJ42tacc5HRiYp83+nV6k4/x48Ed6LOjBvnP7iiOmRqPxMIcTD/PuP+/SLrIdL3d8\n2dvieBYR2DADvrzZ2H78d+j5eom79ai7WxFTU18CHAew7E/CGAbM32ehKauDAl0aufQIW1Iqc8GB\ngoqOT8r9/P25nTxfO5IcC2r76pFFOs66uHUAHEo8VCw5NRqN57iQdYFhq4cRFhTGpJ6TCC5hCiCf\nJiMFFg+CFW/ClTfCU39Dg85u6dqjCqokqamd9Fl4ymoXLBhP0Xh7iP2MvMDaf9bZbCdYucM/Wq9O\n7mcpYbBbjX+glLpaKfWY5XOkZX5W4+eICCPXj+Ro8lE+vPZDaleq7W2RPMeJKPi/ayF6GdwwCh74\nBipWd1v3pWJquJiaOg5oAMRaXG6rYDhLFP14ProALjTpfawDwYdkQvTwv6mTtajIfSkdZcKvsSQr\n7AQ0Bb7CGAKfR563rMZP+eXIL6yIWcHQDkO5qm4ZTtG1fT4sHwYVa8LA5dDI/X9dj5kaxUhNvcyy\njWX/KkuajyKTWadDccV2C44sqA9rVMv9HJQN9S0jlAmzPivyMbSV5ffcBdwBXAAQkRP4fBobTWGc\nTz/PB5s+oE3NNjzW0rcTjxcbczb8/g78+Cw07AZPr/OIcgIXLCil1N0YHnW1MNZrKAwfiMIcJYqa\nmvoLYK5S6iBwDnigOF8IIFu8NwcFEOmCc93Tv1rF6DM7SA/igpGk11T4LZkiIkoZjzNKqUreFkhT\nciZtmURKZgrvdX+PQA+ux/QaGSnw/ZOw7xfo9ATc+gHkm18TEWavj6FlvSpc1bhkw32u3MknAreL\nSJFCExQ1NbWIpGMEpC0xWT6erio/Bawhl4JVaAvKz1mklPo/jCHvIcDjQNFNaY3PsC5uHcsOLWNI\n6yE0qdbE2+K4n8RjsOBBOL0Hbv0QujxZoMqFDBNvfLeT5TvjefCqhiVWUK4M8Z0qqnLyNqbgUP5q\n7XuWRY//HFhKVgt47bLsRYhZZ3eXq3NRWadOE92sOckrVrhUX+NZRGQSxnKK7zDmod4VkWnelUpT\nXJIyknhv/XtcXuVynmr7lLfFcT/HN8Fn10PicXh4iV3ldPB0Kv2m/8Mvu+J545ZmjL2zVYkP69CC\nsgztAWxRSi0ElmIsvgVARL4v8dE9RKZJsb6F4rpdvmVlDF1mX0GZTp3B7k/xfz3hrdWw7WvY9jUn\nhp2kXtUwmyquWlIZ+431UomLlxBxyy0FK5zZDykn4LJeLvWnKRlKqZeBhSKy0tuyaErOuI3jOHfx\nHFOvm1r2opTvXAQ/Pg8R9WDQQohsWqDKzzvjeX3JDkKDA5n3RBe6X+GeJIzOLKjbLa8IIA24yaqs\nr1uO7iGyTMq1gK0+jlICB37L3e4+YZU7OrVfPr0zzOlnd1dGdgaDfx/M3nN7S358TQ7hwO9KqbVK\nqeeVUmXYF7lssyJmBb8c+YUn2z5Jy5otC2/gL5jN8Of78P0QqN8ZhqwqoJyyss28v3wPz32zjaZ1\nwvn5xWvcppzAiQUlIn7rgnJd07r85G0hioiycliUTCNr75HfatHktkxsplrNZpA8S8xld/MSREjf\nk7CHjfEbGbNhDPP6zCt2P5o8RGQUMEop1QYjQ8DfSqlYEbnBy6JpisDptNOM2TCG1jVbM6T1EG+L\n4z7Sk+D7p2D/r9DhUejzEQSF2FQ5nZzOc99sY3PMeQZ1b8RbfZoT4uZcfK5k1P06x13csl1NKfWl\nW6VwMxWCgh26evsq1j9E5qG86BBZp5P4LySEq+o1oEPiOlhwP7xfgyJ74OfUL4bXX44S1I4ZHuE0\ncBJjzV8tL8uiKQJmMTNi3QgyTBmMvXosQQHe9R52G2f2w2e94eBK6DMJbp9aQDltPJxAn6nr2B2X\nzJQH2jHyjpZuV07gmhdfGxFJzNkQkfNKqQLeeb5EkPK/P4oztfHAJXV4c2E2HQ4vxVT1JEGhLja0\nIlehlcR3ROsnt6GUehboD0QCi4EhIrLHu1JpisKifYvYEL+Bd7u9S+MqZSQIyN6fDcspOBQeXVZg\nfZOI8PnaI0xYsZdLq1fkmyFdaFLbc8v3XLmTByilqonIeQClVHUX23mNCoEV/M6CcpgI0WLxNDhr\n7Deb8mmYon7P4lhQeq2VJ2gADBORKG8Loik6qZmpfBL1CV3qduHeK+8tvIGvYzbD3x/A3xOgXge4\nfy5UqW9TJSU9i9eX7OTX3Se5pWUdPryvDeGhnl3S44qi+Qj4Vym12LJ9HzDOcyKVHOsFcqerQK0k\nJ5V9hPe/tu/h9/ueU9AExKIj0s8FE1jBqu6FM2DKLGCCF6AEc1C5XWgTqsQopSJEJBn40LJts1BE\nRM55RTBNkViwdwFJGUkM6zDM/x/g0pPgh6eNxbftHobb/mdYUFbsP5XC0/O2cjQhjRF9mjP4msal\n8r1dyag7Rym1BSNNBsDd/jAUkXPqjkcqaiX57431ROJFm+249dWpWCvDCBwF8OvrcHADH9RrSJe6\nXXDoCpY7wmf/T5USG0pGUhD2/G9y56DcoOQ0fIPhBbsV41ex/kEEuMwbQmlcJ+FiAl/u/pKe9XvS\nqmbJ1/p4lTP74duH4PwRY/HtVUMKjLL8GBXHm9/tolKFIOYP7kLXy0ov6aIroY7misgjwB47ZT5P\nWbmlitV/5mJCsK01c3Al85IqMC96HkUPO2sQu854kHeqoMrM2fQeItLX8l5GJi3KH9O2TyPdlM7L\nnfw8x1P0csNyCqpgd74p02Rm3C/RzF4fQ+dG1fjkoQ7Ujgh10JlncGWIz8ax3xJbr6NnxHEf/jYH\n5RB7ZnT+Ig9bNn4/hOGDKKX+FJHehZVpfIvohGi+P/A9A1oM4LIqfmrsmrPhr7Gw9iOH803xSRd5\nbv42th1L5ImrG/Pmrc0IDiz9NEbOIkkMB94Cwiwp3nPuUpnArFKQrUTkCCt+fm/t+cd2fmxkG3RS\nTPn/KK4oKPe5maf+/TcVu3YloEIZWzFfCiilQoGKQE2lVDXy/qoR5CXv1PggIsKETROoFlqNp9s+\n7W1xikfaOfhuMBz601jfdOuHBeab1h88ywsLtpOelc30hzpwW5u6XhLWecr38SISDnxoleo9XERq\niMjwUpSxeJQVCwpof6iQwTUxE54mBGc5qVWCdVA5t1AR4eKuXRx/6mlOf/BB0fvRADyFMf/UzPKe\n8/oR+MSLcmkKYU3sGrad3sbz7Z8nIqSwZA4+yOloI57ekTXQdzLcMc1GOYkIM1YfYsAXG6lWKYQf\nn+/hVeUErjlJDLc86V0JhFqVr/GkYO7C3y0ocL50SYmACF9MyWavK8/fJbCgALITDZfIzKPHityP\nBkRkCjBFKfWCDg7rP4gIs/+bTWRYJHddcZe3xSk6B/6AJY9BcBgM+hkadrHZnZyexSuLdrByzyn6\ntqnLB/e0oVIF768mcsVJYjAwFCP7bRTQFfiXPK8+nyR3iM/B/qm3B/DiTw6ii/sBLf46SlygmeU1\nK3FzshENvVmckwYlmKey6yShPfpKhIhMU0q1Alpg++A3x3tSaRyxeP9itpzawjtd3/GviBEi8O8n\nsPJdqNUSHvq2wHxTdHwyz8zbSuz5i7zbtwWP9WjkM/POrsx6DQU6A0dF5DqMHE+Jzpt4n1wnCQfn\n+d/mvvEDuEp+S7DHwj2M/MbM6koVcWU8U4oyxJd2Do5ttN+Hj/xx/R1Lyvdpltd1GHnX7vCqUBq7\nxKbEMmnLJLrW7cp9TdySsq50uJgICwfA729Ds77w+IoCyun7bbHc9ek/pGVms+DJrjx+demsb3IV\nVx4F0kUkXSmFUqqCiOxVShWMt+5nPJicgjFX7d80jhcXfSRcDHV07ghMbWd8HmkM5+X8YW1nwrQF\nVULuBdoC20XkMUs0cx2J18cwi5mR60cSoAIY3X20T928nRK/AxY9CkmxcPM46PqszcNlhimb0T/t\nYf7GY3RpXJ1pD7WnVnjpupC7gisWVKwlWOxSYKVS6kfgqGfFKjk5FpTD26iCr1t3Ly1xPMYlCWIT\n3bwwCr3APrMaud23AkZWQWWkABYF5SfXpx9wUUTMgEkpFYERNLaBl2XS5GPWzllsPLmR1zq9Rt3K\n3nUYcAkR2PIVfH6jEWFm0C/Q7Tkb5RSXeJH+/7eB+RuP8dS1lzF/cBefVE7ggoISkbtEJFFERgLv\nAF8AdxbWTinVQCn1l1Jqj1LqP6XUUEv5SKVUnFIqyvLqY9VmuFLqoFJqn1Lq5uJ/LSv5891QM8Py\nbuYXA/3DglLieF2XAshMKVCenZKvzInBk5Gdkbdx0SrSzrr/Ge/nff55xB/ZYnnw+wzDi28bxtyu\nU5xcV9WVUiuVUgcs79U8K37ZZ/2J9Xwa9Sl9L+vL3VfeXXgDb5N5AX54CpYPMxbdPr22gDPE2gNn\n6Dt1LYdOpzJzQAeG92lOkBfWN7mKS5IppToopV4E2gCxIpLpQjMT8IqItMBwrHhOKdXCsu9jEWln\nef1iOUYL4AGMhcG3AJ9aFgUXC2U21uiEZ9taF8d7ZPDg64GgYHnDG5l7fQCH/SBVXIAjBeWg/OjD\nA2wLxPGk3JRtU+x3ks8RQoc6ch8i8qzlwW8mRuCqgS7mYHN0Xb0J/CkiVwJ/WrY1xSQuNY7X17zO\n5VUv552u7/j+0N6Zfcbox85F0OstIy17pby4MGaz8MmqAzz65SZqhYey7Pke3NLK9y1CV7z43sUI\nEJuT4v0rpdRiERnjrJ2IxAPxls8pSqlonC9E7Ad8KyIZwBGl1EHgKlx4qrRHRpDxh0qzzZCOKMgO\nNPZlBwTyU5cAukb7tjffw6vNJDiIaO9IQWXs3+9y/ycvnHSwx+jcxy9Nv0Ip1cHZPhHZ5qy9k+uq\nH9DLUu1rYDXwhhtELpd8tOUjTGYTU66bQsVgHx9p2bUElr1ouJA/8j1cbutgnZSWxcuLovhz72n6\ntavH+LtbUzHEPzwRXZHyYaCtiKQDKKUmYLibO1VQ1iilGmF4/20EegDPK6UeBbZgPA2ex7jINlg1\ni8WOQlNKPQk8CdCwYUOHx9x2eRBf3hjA8WYmLpoD6Lnb9k5+TPJyw/nDDbhGwVE8wLnsZyaO5uyX\nC6hQrwo1Xx9V9INKjoLKO0quw4S2porLR072CUVYvpHvuqptUV5gJEC0Oy7g6vVTnolJiuGPo38w\nuPVgGkb48DkyZcCK4bDlC2jQFe77CiLq2VTZHZfEM/O3cjIpndH9WvJI10t93xq0wpUhvhNYrdMA\nKgDOVtzYoJSqDHyHkfsmGZgBXA60w3gSdHbBFkBEZolIJxHpFBkZ6eTAAazoFEBmCEy/PZBNTWx/\nlL/M7YpyWJ9FCXxexf6q9rNfLgAg40QSOdZQdlISGQcO2NRLuJhQoG0WYMawLHP+zzZu5lo/FQsR\nuc7JqyjKKf91ZX0MwcEv5PL1U475NOpTQoNCeaj5Q94WxTHnj8KXNxvKqfsLMGh5AeW0aMtx7pmx\nniyTsPCpbjzazXfWN7mKs1h80zD+5EnAf0qplZbtG4FNrnSulArGuIjmi8j3ACJyymr/Z8Byy2Yc\ntl5M9SmCInREdcscVKiYsbY3xNr2cMPNdsodAQxdVvpDhUpgSvWq9MDkvKLF4knbtInDt99B8x2b\noILjTJgdGjfkpuxkm6cHHc3cfVhGEArgykJde9cVcEopVVdE4pVSdTG8AjVFZO+5vfwa8ytDWg+h\nZpi92P4+wL4VhjOECNw/H5r3tdmdnpXNqJ/+Y8Gm43S/vAZTH2xPzcr+GTfT2RDfFsv7VuAHq/LV\nrnSsDFX9BRAtIv+zKq9rNRRxF7Db8nkZ8I1S6n9APYzQSi4pQntUCgnkQjaMSDjHD5Ur0y1NcYEw\nuxEmpt0RyN3rzQWGAYvCyWreeTJ5fKWZtOL898bXh37Tof0Ah1V+D7T4wuS67GsF5UY6W30OBXpj\nePI5VVCOriuM62cgMMHy/qNbpS0nTN02lYiQCAa1GuRtUQqSbYK/xsC6j6FOG+j/NVS3jah+/Fwa\nz87fxq64JJ7tdTmv3NSUwAD/spqscaigROTrEvbdA3gE2KWUyklr/RbwoFKqHcZtLwYjeCYi8p9S\nahFG3ikT8JyIZBf34BWCDQUVnm3m5fOJJERW4kJcGBnhhpVjfauNr6GYfnsgPXfnWSEnqkM9P8ht\nGmKCl5e6YLnZmzPavwLaDyBAOR/pNc37nWYVhfQIraDchYi8YL1tcTn/1oWmjq6rCcAipdQTGOsU\n+7tR3HLBtlPbWBu3lmEdhvleMNiUU7DkcTi6DjoMhFsnFohC/te+0wz7NgqzCLMe6chNLet4SVj3\n4WyIb5GI9FdK7cLOIJiItHHWsYisw/4c/i9O2owFxjrrt7hUb3qB8Prp/FSlKZCKmKo4rb+yfQAD\n/7R/4z9XTah+Pu+r9R8exOUnfPvmLQf/slOq4JfXUYmHnbf9fg2jgdfHe0Q0jcEFoNAkhk6uKzCs\nME0xEBGmbJtCZFik7809xawzlFN6Mtw5E9o9aLPbbBam/HmAqasO0LR2ODMHdKRRzUpeEta9OBvi\nG2p57+ukjs/zVtbjzAr8HKUgpHI2Z+tNIPDYSjJTrnLaLsvJCqwc1+6x9wcQXMjUj8+wfQ5QPXcz\n+VgoaTHHqNNoGdSphSsOnTHJMVA312PCI2KWF5RSP5H34BeAETS2uAmRNSVkXdw6tp3exttd3iYs\nKKzwBqWB2Qz/TIZV7xtDeY/8ALVt8sdy/kImwxZG8ff+M9zd4RLG3tmasJBiLx/1OZwN8eWstfDL\nMAI5rtErzZ0h8PPccnNgCIkp3Qptn+Xkfp0zIHY2QhFX01/Gd23ljFtfHThNnUa2ezIU/BPm7ALV\nCspNTLL6bMIIxhzrLWHKM1nmLD7e9jGXVL7EdyJGXDxvpGPfvwJa3mXkbsrn1LQzNpFn5m3jTEoG\nY+9qxUNXNfQ7L73CcGWh7t3AB0AtjLuTwvBk9bFBWgcUWMlq/wd8M+EcRlJTg0wnZ0aJOOzHVznx\nr2uRbyZWr8bmtMp88KWJdweUnScxX0NE/gawxOELsnyuLiJ+MPNZtvj6v685cP4Ak6+bTHBgsLfF\ngbhtsHggJMcbGW+vGmITS09E+Hbzcd778T9qVg5h8dPdaNugqhcF9hyuLNSdCNwuItGeFsadhIeE\nk5CeUCAYX43KIXbrN8nMstnOdPI/jTAbSq91ZjpxGNaGo4gO/oC16LFBQQxYZabxKbjSybxa5rFj\nnF65ioyOXWlQvSLmixdRFSqgAnw3rpcvYVkwOxpIB3LWQAhwmbN2GvcSnRDN9Kjp3NDwBno39PIU\nnoixrmnFcKhUy0iPUb+TTZX0rGzeWbqbxVtjuebKmkx5oD3VK9m/p5UFXLmbnPI35QQw88aZNA1+\nCMnOM4vfzxrAze0a8+nDBaPNtE/PsNneeoVieWf7VlKQZd5pzPkEBiQl263jL7xTszqbw2y9gVyx\nDU0nT5LwwnM0mFoXc0YG+9p34PTEDz0jZNnkNaCViDQSkctEpLGIaOVUimRlZzF87XCqV6jOu93e\n9a4wGanw/RD4+RVofK0R6DWfcjqWkMbdn65n8dZYXrz+CmY/dlWZVk7gmoLaopRaqJR6UCl1d87L\n45KVkEsqX0Kj4D42ZV9k90FE6NO6YJDE/KakOUAx5wb7Q1zmbOMWHhQoPJbkIAaRn7A0vDI3bsvz\nVrQ2OF01CuXiRQASf/ihkJoaKw4Bad4Wojzz1X9fcSjpEO92e5dqoV4M/p4T6HX3d3D92/DQYqhY\n3abKX3tP03faWmLPp/HloE687Ofrm1zFlSG+CIwL6SarMiEveKzPYm8e3x1z+0Gh2WRmBqCCBGW5\njedP6+FPDPktT0GZUc41k71J2Jwys28H3fUxhgPrlVIbgVzzXURe9J5I5Yd95/YxY8cMbrz0Rno2\n6Ok9QWwCvf4Al/Wy2S0ifLr6EJN+30fzOhHMHNCRhjV8PHitGylUQbmYAsAnsRf5IH9J2rHHUYGp\n2DpVOadhrwSejH+JrwI/ItNyc/bnOShrNoaFcktO2CQFj9euxWvWFY5tKNhIac++YvB/wCpgF6A1\neymSkZ3Bm2vfpGqFqrzT9R3vCGHKNFKxb/o/aNAF7ptdIJZecnoWryzawco9p7i9bT0m3tOmTLmQ\nu4Kzhbqvi8hEq5h8NvjFk56d+6XZbFuYfaGJ8aEICSWDK5r565KOANQzFTvYhc/S2BItUYDNoRUA\nq++49cuCDQpTUKsnQKVI6PyEO8X0d4JF5GVvC1EembptKgcTDzLjhhneGdpLOWWkYz++wUjFfuNo\nyOc9uP9UCk/P28rRhDTe6duCx3v4X6BXd+DMgspxjNjipI5P06ROwWCo9m6hW9++oSgGlA1l7S9T\nNVWoaOUvUuD7JccB+YJoZlqmUiwKypyRwf5u3ak3bhwRt9wMqy0hKLSCsuZXiyffT9gO8Wk3cw+y\nMX4jc/bM4f6m93P1JVeXvgCxW2DhAEhPgnu+gNb3FqiydHscw7/fRaUKQcwf3IWul9UofTl9BGcL\ndX+yvJc0Jp/XePKayzh/IRM2wbkA40c223nKr2GJ9BtaPZP0cyFkF0Pr+PMclDWV0vM+i1JEXHCh\n0Zx+Rn3LpunUKSQtjdOTJhkKSmOPnHg1w63KtJu5B0nOTObtf96mUUQjXu7oBeN1+zxY/pIxlDf4\njwJRITJM2YxZHs3cDUe5qlF1PnmoPbUiijC0UwZxNsS3zFlDEbnD/eK4l4AAxfA+zaHrdt5YfAiO\nZDqeJun5Bo3bxfHGytXsauxY21x6w5ncz9khEQRmGm7mZWUOyppqqcKo+bbTI4eCgyiwROzMXqBu\nnpOEq3NSu5ZARgp08ttpzmIjIoXG3dO4l/Ebx3Mm7Qxzb51bullys9Lh19dg2xzDCeLerwp46cUl\nXuTZ+dvYcTyRJ6+9jNdubkpwoF5T6GyIrxtwHFiAkbHTf22E6peRFngaSLBrQQFw3VsALNy8iPDI\n9+1WiQ+vTPOaJ3K3Y/vM5dKl/Rwedn6vAO5dZ6aCD8fru2+t7RyataKtmlqw/uLwyhQIpZnTJufc\nWqKjixQy9/+dZcivHCqokuSD0hSdXw7/wvLDy3m27bO0jmxdegc+d8SYbzq5E655Ba4bAQG2jg5r\n9p9h6LfbycoWZg7owC2tCi6DKa84U1B1MJITPgg8BPwMLBCR/0pDMHcTkJuqvJCK2fajAO9+OIWP\nE99gfW4MXcgOz/sjVc0u6CyRGla8ob9jkdDwTOH13MF962xPSN1zeds1k233TfrMxK5OBb9Qbi0R\nYu5/AFPi+Xw7IPrbelQLGE2dd728INJ3KFY+KE3ROZJ0hFH/jqJ9rfYMbjO49A6871cjsSDAgwuh\n6S02u81mYdqqg0z+cz9NaoUzY0AHLousXHry+QEObUgRyRaRFSIyEOgKHARWK6WeLzXpPIBDC6oQ\nsisKF4NtMwNmV64Hj/9Oq7SJTD5tq1Gmt7mLVW2ca6fo+vbLS0s52eO17/Osnr6bbc9Vw7Nwy++2\nfxkR+K1ixdyNizt2kHX0mLGdkUpqZioHgo1BwfPfLPCc4H6GiLxg9RoCdAD03cnNXDRd5NW/XyUk\nMISJ104kOKAUYu1lm+CPkbDgAajWCJ5aU0A5nb+QyeNfb+bjP/ZzZ7tL+OG57lo52cHpIKdSqoIl\nasQ84DlgKrbZdf2GXAvKsr3ypWtdaje5XwDDBwYSQL408VimWhp2waSqkD/gyM+NuyEBCrMTHZXt\nhyvBA/KN2u1dWI99e41AlabsfGOZGSk8tfIp7q6vhyxcwKV8UJqiMX7jeA6cP8C4q8dRp1IpJPC7\ncBbm3WVkve34GDz+u6GkrNhxPJG+09ax/mACY+5sxf/6t6ViiCsxE8ofzpwk5gCtMBIMjhKR3Y7q\n+gN58/aGirqydkEX9Byy0xpSP9JE/IUTrG9h6HB11p7lladggkJt79yiAnj6SCNEHXQilGuy+xKS\nm8gkj1u35uSEtz1Hkg07z+503Fc2xG+pSuSJEwTXq+ewXllE54PyPH8f/5sfDv7A4NaDuab+NZ4/\n4Ikow4U89TTcOQPa2c7WigjfbDrGqGV7iAyvUKajkLsLZxbUAOBKjMSF65VSyZZXilLK7yKkujwH\nBaQdfZZl/WwT/waIAwvKQnClbJ551nbys4op2OkcVLwXw395gvxfNTvHZd3BSU89VYGkIxWJHzXK\no3L5KJOAjyyv8cC1IvKmd0UqOyRlJDHy35E0qdaEZ9s+6/kD7lgIX95s/Nef+K2AcrqYmc0ri3Yw\n4ofddLu8BstfuForJxdwtg6qRD6OSqkGGBO+tTGeFGeJyBSlVHVgIdAIiAH6i8h5ZSyTngL0wYj9\nN0hEtpVEBmtyRtPMhSioG5rX4mRyeoHynJPxuelWrgnYBUCIxQ20Rd0IOAkJVRSnqkLtRKNuXqQ+\nWHBtAI9Ep2M6E8LiHiGcrWJibUtFbE3hsT/8J9KNsz9FgINz66jc5Wi0dshOSeHCP/8QccsthVf2\nIZRSVwC1c/JBWZX3UEpVEJFDXhKtTDF+03gS0xOZccMMz+Z4yjbByndhw3S49GojZFHlSJsqR85e\n4Jl5W9l3KoWXbmjCC2Pt8iEAACAASURBVNdfQYAfDu97A0862puAV0SkBYaTxXNKqRbAm8CfInIl\n8KdlG+BWDIvtSuBJYIY7hckJE1KYk8TnAzuz/AXb4YAHL2RyW6qxYnWM6RFuzpwIQEiQcfpG3NYi\nt+7wgYG88VieJZVjQa1qpwisbHj6nY1Q/NU2AFOQYmB40TwiVrbzvz92YWvECg4aFs6J198gbthL\nZBw5UkypvMZkwN4IRLJln6aE/HXsL34+/DNPtnmSZtWbee5A2Vnw3eOGcrrqKXh0aQHltGJ3PHdM\nW8fJ5HRmP3YVQ2+4UiunIuAxBSUi8TkWkIikYIROugToB+REp/gauNPyuR8wRww2AFWVUm6bXb+l\npTFB2sTJ3FN+zJk1yDrfhbeS0ws4QQBUsCioHEUFkFpRcaROjkOGylVQbS/mxQ+yvl9XLqLxNO96\n/1q8p8zCS0vzvmSzV79n/823cjEqyqpS0S/YrLg4ACQjo5CaPkdtEdmVv9BS1qj0xSlbJGcm8/6G\n92laralnXcpNGbBoIOz5EW4aC30m2sTTy8o2M/bnPTw9bxuX1arMzy9eQ88mkU461NijVFxHlFKN\ngPYYC35ri0i8ZddJjCFAMJTXcatmsZayeKuynEykTwI0bNjQZRnu6Vif29rUJTTYtWjASsGFQ68Z\n984qK42yfGNS1orJHgKEiRkI4P2z50gU12IDOiPbv/QTVdLgqv153/KBfX+SfTSGk6Pfp2Z1i2LK\nr6AyL8D5o1C7BWUQZxMPYaUmRRnloy0fcS79HJ/0/sRzLuWZacbi24MrjZTsXZ602X06OZ3nv9nO\npphzPNL1Ut7u25wKQeUrCrm78PjtTilVGfgOGCYiNkMbYrjUFekeLSKzRKSTiHSKjCzaE4mryska\nBQ6f8EMKCUVySqoRZhlSfO7i6/xlbmfZU/zJF3+L+Zd/eO/+A6sAyIyJsaqU70stGggzuhlPqQ47\n9rMTkccWpdSQ/IVKqcHAVi/IU2bYEL+B7w98z6CWg2hRw0MPN+lJMO8eOPgH3D6lgHLacDiBPlPX\nsSsuicn3t+P9O1tp5VQCPGpBKaWCMZTTfBHJSXB4SilVV0TiLUN4py3lcUADq+b1LWVewdG8yIS7\nWxMWEsjlkZUJKkRB/V/27dygthBGOvulAVdj+HzYKJki6ipn66r8ifSsi2wODcF6DDfr5ElOTfiA\nelXXGU9OZhNQwX4H/ssw4Ael1MPkKaROQAhwl9ek8nPSstIYuX4kjSIa8XTbpz1zkAtnYd7dcOo/\nuPcLaHVP7i4RYdaaw0z8bR+XVq/I/MFdaGonm4KmaHjMgrJ45X0BRIvI/6x2LQMGWj4PBH60Kn9U\nGXQFkqyGAksdu4ljEW5pVYd+7S6h1SVVbHda8kMBZJ43othkE0i6Cs1tm4PZ6rQn2Bn2c4a1goqr\nDlk+/nDmyIMvJEtYEhZhU3b6w0mkrFhBynFjxu+P6FOeFq/UEZFTItIdGIXhxRqDsc6wm4ic9KZs\n/sy07dOIS41jZPeRhAZ5IAJ4Uhx8dauRnv2BBTbKKeliFk/P28r4X/dyc8va/Ph8D62c3IQnh/h6\nAI8A1yuloiyvPsAE4Eal1AHgBss2GAuCD2OEVPoM8PjihQFdG/LyjU2c1jH0rAtmy5BVuR8zTlo9\nWeVm3BXEbBismee783Gvj8k405s3sozRnpNV4YRtgGO7WFtfLz0VxIKe9n/Ci/a8OryBEwtxyArD\neeL3PafYe/I0e84aa8FNlkYvLNjucfG8hYj8JSLTLK9VhbfQOCLqdBTzo+fzQNMH6Fi7Y+ENisq5\nI/DVLZAcDwO+hyY35e7aGZvIbVPX8mf0ad6+rTnTH+pAeGgphFMqJ3hsiE9E1uH4zt7bTn3BCKdU\naoy503FUY0eCu+IS3b5hVbYfMxZD5SzuVSIcqNaA3rHbOBHUnBsuvYHMsxmkq32AYRklh0E9ILr2\npTQ/ddSBAHnHn3D6LGuVfa22qYmi527v5wBxdrZCs4z37if/477fejMsOZv6QKbFDbeMjGZqPEhm\ndibvrX+POpXqMKzjMPcf4Mw+mHMnZKXBwB9zR0rsRYVo37CMrbz3AfzMJ8y7KEBcmDT64dkeuZ+P\n1zSm1TIDg/nxsqt56vpX2VPDKuSa1bqsU9WMW/Le2q55J952Ic3hPl/x9mt72HUlmetQIZkABImJ\n9H37bCtdSICRVSDtvJsk1Pgzn0R9wuGkw7zb7V0qBdvPRFBs9v0Kn/UGcxYMWp6rnC5mZvPKYtuo\nEFo5eQYfuY35Hja31Xs+ZztNSSxGsOnZPQfyyjXPkRgaDkpxLMI2YGVqsOFZvLuR4vObA5h0dwD/\nXt6aZv1PkN2s8AkmR7d/X1FQT634//bOOzyqKn38n3cmnUxCQieUUEKVKr0IKAKigoqAiIgCgojo\noqg0V9xdf+q6uBZW9ouI4IrYUde1YaEo0kWqCCpKCS0J6aTMnN8f904yk8ykl5lwPs8zz9w599xz\n37kz5773Pec971vyhV5Nz7l/m5t/2sBvo2/g/NcuuTOTzIW5mWZm9IIBajWXDN+f+p5X97/K2DZj\nKzZ9u1Kw6RlYOwHqtITpG6ChMdry2/l0bnzpO9b9cJI5Q9vw6h09iarlK+PpNQ8dQtcLVnMobcYV\nLaF1OybzVxyU/Ga48aHBhAUFcPO/t/C7q8VUgOTQMGbPsHI+EuxWYXtbodVPDsQCuZcFML3D9aTY\nMhlwZhvn66ay7kQ8OeS713tzO3f4iIIqKYE5iiYJxrbzO12TvA2AzLen87ewvTzccTaBublknA4i\n67z5WywfBM8nVIPEmuok8WIiC79dSIvIFjzU86GKazgnEz6YCQfWQaexMOpFMB8iP9t/mofe+RGr\nVVh1Zy+98LYK0ArKCxaLcOypa/M+X9u5MWu3/1HitVTN6xQeboiuFURienah8jPR7lrGgmF1OCxW\nTuUOgGTY1GEf1uA05ETJhsx8xYIqKXULBP/JOBtEvdwLZBLMa5ERvHX4LcbcsQbV7TLkh7rVI6TG\nJ1BK8dh3j3Eh6wIvDX2J0IAKWt98Mdmwmn7fAkMfh/73gwi5dgd///wwyzf9SpemtXlpYndiaus1\n1VWBn93Gqo+/ju7I7kevLvViX9fQf9/MHVyiY8ZeO5wEZeMfueNcWzLexrzq3r4XC8rfFNTzy/Mz\nEjsuWvj967pknjfWQLmqZPmh+KwvKicH5SHDsaZmsObQGjac2MCcy+dUXKy9tHOw6jo4vg3GrIAB\nfwIRzqZc5NYV21i+6Vcm9WnO2zP6aOVUhfjZbaz6CLBaiC7nWHNkqLv76bePDOGv1/csVG/CgA7s\nn/gDWxyXFdonDd3LfH0OqizYM9wfAoq1GZWChPwg4D916swfU6swtbemythzdg9Ldi1hcNPB3Nb+\ntopp9MJxw438/BGY8CZ0uhmAbc6oECd0VIjqwo9vY/6B0+tv40ODC+1rEhXGlXEtyUnuklcWG2TU\ncx3fXnWnixIraDF5saB+bhDheYcfUDDgfM9dxTic/7gWXuwOv+ZnsMjYutVj1cy9e/OSVmr8izPp\nZ5izYQ6NajXib/3/lpehoFykxMOrIw0L6vYPIO5qMyrEL9y6YhsRIQF8MKs/N3SLKf+5NKVGK6hq\npnHtUBw5hotq1tnh9LLNLFRncNv6hQLVAvS+uNSrdbEjtvQeh75K8xPe/6bKLnDSTBt27qdC+zN+\n+IHD3S8nNymJlPXrOTZuPMnvv1+onsa3yXHk8MDGB0jPSeeFIS8QGRxZ/EHFkZEIa242PEInfwjN\n+pCelcu9b/zA//tER4XwBbSTRCVTcGHv7X2b062Ze0DrJlEhnDNrl6a9M0R79+Lz32CqHsf0nl7p\n2YPy2Jf1aD/S/K4eLKOEl1fgyMggc/ducn43Fj9n/fprhYmqqRqW7VnG3nN7eWbQM7SOal3+BjMS\n4bVRkHDUGNZr3I2TFzKZtnonh0+nMP+adky/omXFWGmaMqMVVCVTcGHvX0YXnldyre21O5irWAsq\nPK/u5OK/xnHmocLWX4uiwvKlnzc33K+1Uoq0r3UUIX9n84nNvLzvZW5sfSMjYisgg3Lir7BmHFz4\nHSashVZD2P1HEtNf20VWjp2Vd/RkcNv65T+Pptz4713MzygqRJI4nxPE+6LW+jYz6GyBJ7pNl3lu\nNzI0iFkzrTx98yXwEx8wh+w+mwc5F/OKk7OS8+uc3os6vr2KBdOUl7MZZ1nw7QLaRLVhfu/55W/w\n+HZYMRQyzsOkD6D1UL44cJpblm8lLMjKuln9tHLyIS6Bu1f1UpL5eMn7Gexe0xyFBnn+qXIChG1t\n8g+yBhvu1bHR4ZyrLQyxp5dGXL8k96KFpF/CjA9p+aaWm/W64Uk49D8A5LvnjSEeFy4ePMiJOXNQ\nub4dmUJEVorIWRHZ71IWLSLrReSI+V4j4u7YHXYWfLuALHsW/xj0j/Kvd/ptM7w2GkIiYdpXENuf\nLw+eYdYbu2nfKIIPZ/WndX093+RLaAVVRRQ1lC2Yrqvi8Drm7fQ8E4Rmr66k5aefuBxvEFonm7jR\nZ2izYzuL+y0mN60tN6bUfAV19Ls6nN5Rm0NvNuZQ3/whIJV4yvMBApw96FZ08sG5pH76Gdl//FGJ\nklYIq4CC41zzgK+UUnHAV+Znv2fpnqVsi9/GvF7zaBHpPRpLiTh3GN6cCLWbwZQvoE4rvjp0hplr\ndtGhcST/mdpLhyzyQbSCqmQCi0lqCGDB2TGKj5UuCLX69iW4hdFhHbm18oKs1mmfhljAarPRNrot\nmcfv5KmciV7b+q59/tmO+3Fwhvgcz+kNzlx5s/eDCpq2zgcDR8ljB1YHSqlNQGKB4tHAanN7NXBD\nlQpVCXxx7AtW7FvBmLgx3BR3U/kaSz0Da8ZCQBBMfAfC6/HNT2eZ+bphOb02pRcROkWGT6IVVCWz\n8o6e3DO4FU2ivA9PPHX1dLITBpCdMNhrHW9R1NOPLEJMV771ju5GvhoXNgZ1dfu85EbPP3l8dNGq\n8cM+wic9fNOjqeGF4utkng/CkVuE/BbvnoB+QAOX5J6ngQbeKorIdBHZKSI7z507VzXSlZIjSUdY\n9N0iOtfrzILeC8rXWFYqvDEW0s/BhLegdjO+/ukMM17fRZuG4fxnSu9CC+g1voNWUJVMi7q1eHhE\nuyLdVbs1rc/jA+aDI7j4aBWFmhEiVQcA3rIPgdb5qbYWX9+Bk+H1mHHl3LyynXFlUzI74iwcjvFN\nBVUSEg7ZSDjoOr/groicv49y+KWCysPMq+b1SyilliuleiiletSr53vBTpOzkrn/m/upFViLfw7+\nJ0HWcgy7pZ+H1aPg9H4YuxoV050Vm39l2uqdtGkQzutTexMZppWTL6PdzCuQPo360DyieZmOHdej\nKRYRbupe9Ip1T4OAmRPu4sySxeyv09Kt/I7+LUjMyOGFr8okkhsK73H/agSmW37OyZNYQkMIalay\nnFw+whkRaaSUiheRRsDZ6haoLNgddh7Z/Ajx6fG8OvxV6oeVw5su6Rj85yZIOQnjXye12RAeeWM3\nn+w7zYiODVkyrgu1gvXtz9fRv1AF8vKwl8t8rMUijOvZ1Ov+osLzjJt4NS3255T6OOwhQKZb0aEm\n0P6Ekd03IhNO1IEmCZAWCtFpRX4Fv+Lrw+9xPvs049qaAXlNC+rEPfcA0HrTRjK+/57I0aOrS8TS\n8BEwGXjKfP+wesUpG0v3LOW7k9/xaJ9H6Vq/a/EHeOP0Pnh9DORmwe0fcjioI3cv/Y4/EjNYMLId\ndw3UC3D9hUob4vPiDrtYRE6KyB7zNdJl33wROSoih0VkeGXJ5a8456A8dayiOpujgIJyuFQVVfjn\n/18vC3fNtnLcHP1ZPdTCwtutxNepQR1aYNN7X9LxhseMzxeTweGeBuX43Xdz6pF55Cb5VuZeEVkL\nfA+0FZETIjIVQzFdLSJHgKHmZ7/imz++yXOKyHtoKAtHvzJi61kCYMpnbMhsyc3LtpCWlcsb03oz\n/YpWWjn5EZU5B7WKwu6wAP9USnU1X58AiEgH4Bago3nMSyKiwwa7sLjvYtpGtS31sEdBA0pZhANT\n7zO27WGkhRTYDySHS55nYI4VjphzT44a1K/Hb3ZgUfDcrudwvHoNnHdPLZ9rOhCoHM+WaXWhlJqg\nlGqklApUSjVRSr2ilEpQSl2llIpTSg1VShX08vNpTqWdYtF3i2gf3b58i3F3rDC89Wo3w3Hn5zy3\n18qdq3YQExXKh7P607tlnYoTWlMlVJqC8uIO643RwJtKqSyl1G/AUaBXZcnmj/SL6ce7o94l0FK6\nSd2xPZpiC8kfyZ125HKsAcaiVsfFhgSvfJ4/TS/hs0ARCurLrvk7Z8/Iby/bBx8zjgbmX8NX9r/C\n/gtHPASJ92uvPr8hx57DQxsfwqEcLBm0hGBrcOkbcdjhs/nwvweh9VDSJ37MtA9P89yXR7ixawzr\n7ulPY53DyS+pDi++e0VkrzkE6FzxHgMcd6lzwiwrhD+4yVYUN3WL4aHhbcvVRou6tdi3eDhBDSOJ\nbJFBv1b1iK5l3AQEaBQ3iFMehu88OUS4WlAvD8//6/y3l7D8mnxN5Joh+KQPrq/aEph/s7p2u4Pn\nomp7SGOiFVRV8Pzu59l7fi+L+y2maYT3OViv5GTCO5Nh60vQeybnr1/FhNcOsOHwWf46uiNLxnUh\nNMgHn5I0JaKqFdQyoBXQFYgHlpS2AV93k61Inh3flVlDKiByM9Dqz9fRuPcFerZ0uWYKggM9/wVU\nVn695fFnuP2X/EnrXa3EzV197aDCbazrK85T+BzX7syXavJXDnaFeHhqt5tzUlpBVRrf/PENqw+u\n5pa2tzA8tgzTzk438kMfw/AnOdbzUcb83zZ+PpPKy7f3YFLfWD3f5OdUqRefUiovUJqIvAx8bH48\nCbg+PjUxyzQVhTIjJIiQHdsKgJ/bdCciJJDshIEo+xYgi6zT15PqGEjLOi/DmXMoEUKV4tucHkQG\nGHmXwnJCUZIFQHow5AYYN4EHp1rzLJFfGgmgSpJBpNpxiBSSMzfBXP3r45El/JWTaSdZ+N1C2ke3\nZ27PucUfUJDzR41cTqnxMG41P9oGMWXZFhxKsfauPnRrViPCEV7yVKkFZa7RcHIj4PTw+wi4RUSC\nRaQFEAfo0NMVSZ6CspDbqAnXj3qK1AFXA5B19lrsGXEAdGhgrP8J698dgEQbMHU9P6p8Sy4oKzJv\nCND1vn68vnC8nrvlVFb7462BvrGGXBtQFU+2PZu5G+aCgiWDyzDv9PsWeGWoESVi8sd8HzyACS9v\nJTTIynsz+2nlVIOoNAvKdIcdDNQVkRPAY8BgEemKcd86BswAUEodEJG3gYNALjBLKWWvLNkuSRzm\n5TQXpOZa3H/6bxt3pl/8fu6bdg2TajcgXbXg7qC3SYzIV0F5SknB1AvJQLhXDeSs2zE7m6z6wqZ6\nQcQkKFqeNspn323lxX97/4kv1Cr1Nywz3Y46yL7oRSEqbUFVNM/uepb9Cft5bvBzNLWVct5p/3uw\n7m4j6OvEd9iSGMGU1dtpGhXGmmm9qR8RUnwbGr+h0hSUUmqCh+JXiqj/BPBEZclzyZNnQXmeMP6m\naXdWrp6PBARgA35KtLgpJ8DNavJkQbkSbHpnX0wMwjLpHC82aURolmL1s4ZSOhPlO2N/899x4PDW\nFez6Oaki2Xh8I2sOreG29rdxVfOrij/AiVKw5QVY/2do1hdueYOPjlzkoXd2EFunFmvu6k3d8DJ4\nAGp8Gt8YR9FUPmHmGpCwaDo3NVLOj+3RxK2KBOTfpAuGVBoYVzfPWBIUrmt8HTmRZCf2c6sf4rLu\n1W42FSOe1xR5CmDrK+pLpfvWQl1/xqEc/GPnP2gV2Yo5l88p+YH2XPhkrqGcOt6E47Z1/H3TWe5b\n+wOdm0TyhlZONRYd6qiG8OUDV3A+Ldt7hX6zoVY96HIrMRYLx566tsj2XKOnKxQrJvfgldVXAl+S\nJYE4B74CJID0o/MJiPghr/7dScmMT8jhHIYibJWTQ9usbBYkJJFrrUeA3X3Y7FiDwurodDHTCN+3\nE/r+VPkTRMqhLaiKYuPxjRxLOcbTA58ueRDY7HR4dyr8/Cn0v5/UAQuZs3YvXx46y4RezXh8VEeC\nAvRzdk1FKyg/ZvoVLdlw2IgL2rq+jdZFBZmwBkL3SSVuO0Dy/xq2QBvBAVZm3vEc55L+SULcID49\n+BQDOJhngit7/qTRrAvJJGEsBv6+eUfaq1O8e8qYfHrp6q5suhgNbMirf7HAveqPerA/1sKiScLf\n/uNZQQRVUYCH1Isp6FmN8pOSncIzO58hJjyGYbHDSnhQPKwdb8TWu3YJexrezH0vbuHkhUz+Oroj\nt/Vprt3IazhaQfkxC0a2Z8HI9uVu57nxXbFY3Dt6q9qtuLfrvcTYYmgdZXjwidVK/blzmaIUP1u6\nAwfBodi1aCjz3m/AVrWyUNuqwGDdxVoh7KjbnDBg2n1WGiZBci3JC04LsGCyMU/2a0PvMgdXkYKy\nhmj1VF4cysHCzQuJT4tn5YiVBFhKcNs5vR/eGGfESZzwJm+ndGDhv7dQ3xbCW9P70CM2uvIF11Q7\nWkFpuKFb4aAdIsKMLjM81hcRmtc3LCYB6oQHExpoBdcRxrwJK/dhOIs48jwsUmoJKR689bIDzdh/\nRYzcBOdUjf+3NaYcKR80ALz505tsOLGBeb3m0a1+t+IP+PkLePdOCI4g6/ZPeHyHhTe27WVA67os\nvbUbtcN0avZLBa2gNGWiYIZfb+piYJx7tI99jhZ4coEoLrRSQba3tRAXX/ku4Ha7bwWL9TfOZZzj\nxR9epG+jvtza7tbiD9j2f/DZPGjYiePDVzLjvXgOxqdw96BWzB3WhgCrnm+6lNAKSlMmnMoju3ZY\nXln6r/dx15WR8NtdeRrLFmE4SpzutYCbNjXkFHWxcrhgc57xMr8w7T4r6SEwcUNZpS85DodWUOXh\nqe1PkW3PZkHvBUXPF9lz4fP5sH05tB3Jxs5PMnvVYUSElXf04Mp2XrPYa2owWkFpyoQjwMLS6yz0\numYc3TASIzqyGtMh0ojZl2dRBYXAwnM0tAZyatMnZqH3G9UrVxf/hJweAnYP1VZfZWHyVxVrVTm0\nF1+ZWf/7er74/Qvu7XovsZGx3iteTIH3psKRL1B9ZrEsaDLPvH6Adg0jWD7pcppGh3k/VlOj0fay\npkwopdjUyUJ2vUgA6tsMZ4KIUDOVhamhRCwQEFTAGiqsoA42M8o2dRIa5eYCMOVCsudzCx6tq//1\nspDhshxmb2z5Pby0BVU2Tqad5LHvHqNT3U5M6TTFe8Wk32HlcDj6FVkjlnDP+TH8/YujXN+5Me/P\n7KeV0yWOVlCaMlEww+/DI9ryj7FdGNzGOedkKgdL4b+YyrUVKlt6nYUHplnJDBbaZBtKoWtWvtfF\nE+Py23EOL46bH8DHPY0P521OuQzuucfK3yaUP82C3ZFb7jYuNXIcOTyy6REUiqeveNp7DrM/tsHL\nV0LKSU6PWsP138fx+YHTLBzZnudv6arTZGi0gtKUjYJOEiGBVm6+vImhsAbNI7BVBwCCW7fKq9Mo\n0rCyHFmF/cdzAoWlWfH8+NsfiBmh1aufngj1k54g7cg83utv4ZtOwhwz6aLT2cKT00VZcOiQkKXm\npT0v8eO5H3ms72PeY+3tfRtWXwchEWy96m2GfWjhbGoWr03pzV1XtNTrmzSAnoPSlBVTe1jEwzPO\nkPnYhswndsweQrp0ySv+6N4BHEtIJzw4gCU7b2Bb4gduh9XPtbs9MRVUUJlBEGoaVQFEoHKtpIcK\ny64r/KRdUenpHXZtQZWGLae28Mq+VxgTN4YRLUYUruBwwIYnYdPfUc3780rMX3ji/TN6vknjEa2g\nNGXCYQafLRizz5XQrl3dPtezBVPPZkwStWloY1uiUa6UkH5kAbbAGWabnnn4Titxp5xDi0Ub/04L\natp9Vla8UHYryK7noErM+czzLNi8gJaRLXmk1yOFK+Rkwgcz4cA6cjpPZE767Xz89RlGdWnM02M6\n6yE9TSH0EJ+mTOTNQZUxrKtyS7QkKLsNYgdCs35IyyHmOeBo7cZ5tc5EC99eZvxlpw1o6UUu890U\nK6VWYfmyS3Ef1FlfSoZDOVj47ULSctJ4ZtAzhAaEuldIPQ2rroUDH5DQdxHXHhvHJwcT9HyTpki0\ngtKUiYJOEuVBgKiwQLjjY5jyKUGhUXnlaUGeh3xu8hD9wpraGpuZAdfTEN+x+nDrQ1YWTi76Zjhu\nfv7AQmpAZMm+xCXOqgOr2HJqCw/3fJi4qDj3nfF7DWeIs4fY3W8pg7Z05nx6Dv+ZquebNEWjFZSm\nTDgtoLJaUE5CA0J587o32P3o1Xll83vP57bUDAZlZOI6E3VT3E15257uaVlp7bEWkcP36bFWcgOE\n3xsI1902zWOd1AKh91KlCjMn+ik7Tu/ghd0vcHXzqxnbZqz7zmPfwcoRKGBVu39z09dRtKpXi//O\nHkD/1nWrRV6N/6DnoDRlwjkH5dFJohTM7jabjnU7upVFh0TzyIV085OhiRqENeDxfo/z/pH3jVIP\nGioXa94EVpBDUXA2K8ElAaM9rV2h42fcayXL9IjeeJmQEQwDRKcPL4oTqSd4YMMDNI9ozl/6/cX9\ndzl7CN6cgN3WmLlhf2PdDjsTejVj8agOBAfoIT1N8WgLSlMmyjvEV9BN3VMNgBRziO+RgY96rJVx\n7G63zw7zL/3l8VNcPD26VDIl2YSMEOP7/Ot6K68OsxJbWweL9UZGTgb3f3M/dmXnhStfIDwoPH/n\n+SPw+hhyLcFMyHyI//7q4K83XMaTN3XSyklTYipNQYnIShE5KyL7XcqiRWS9iBwx36PMchGRF0Tk\nqIjsFZHulSWXpmJwd3IoO16HCM32/93lBnZcfyf1+g0GYGDMwLwqi65tjz0zNv8QRygpymXOqhSL\nofY391y3foROizWXvwAADzBJREFUt+GNJ7c/yZGkIzxzxTM0j2iev+P4DnhlGBezLjIm9UGO5dbh\nrRl9mNSnuffGNBoPVKYFtQoouBBiHvCVUioO+Mr8DHANEGe+pgPLKlEuTQVQXi++kS1GAtAvpl+R\n9TICQ/i5/zV5ltpzQ55j0/hNAHQxU9c7yU3pzIqO1wNwuNdCSpM4PjEcHNk6x1BJWf/7ej44+gHT\nOk2jf0z//B0/f4FafT2JjlCGpSwiOKYLH983gMub62urKT2VNgellNokIrEFikcDg83t1RhpVR8x\ny19TxmP5VhGpLSKNlFLxlSWfpmIo6xxU53qd2Td5XxE1PFtoQdagvHThTvXT+OK9DLs8jUk3DeVs\nykDaxzwOwNzda1i6D+bcZXXz6stO6uPW5rq+wrq+FjJPTMQaehLlCCA05u0yfa9LgbMZZ3n8+8fp\nWKcjM7vOzN+x923UBzP5zdKccclzGdW/K/NHtiNQp8jQlJGqdpJo4KJ0TgPOGPoxwHGXeifMskIK\nSkSmY1hZNGvWrPIk1RTJdS2v463Db9G3cd9KPY9CsHqZ53I4U3o4OvFgD8MScwatBZh42Wj2Jm1h\nE5vcjss6fYPb57WDzTkRFUDOhV5IQEoFSV/zcCgHi75dRFZuFk8OfDI/zt6OFfC/B9ktHZmRNZdH\nb+nN6K6FlwJoNKWh2h5tTGup1BMZSqnlSqkeSqke9erVK/4ATaXQtX5X9k3e5z73UJGMeQVHwy6M\n7dWCB65u67GKw5ynKpiu3kl4UDj/uupfxZ6qcVise0FFBfKrgbxx6A2+j/+eh3o+RIvIFgCo7YZy\n+trRnfmhf+b1WUO1crrEUTk5ODIzy91OVVtQZ5xDdyLSCDhrlp8EXKNKNjHLNJcqHUZh6TCKJ4qo\n4shbi1U0nep2Yt959+HEib2bEffgJhxZ2XT55XlOHTuGcjhTiWsF5YkjSUf4565/MqjJoLz1The3\nriDkswf50t6Nd1v/P94Z14PIUC/RyzV+g3I4cKSmYk9JwZ6cgiMlGXtKKvbUFBxu76k4UlKM91Sj\nrj01FZWZSe0Jt9DoscfKJUdVK6iPgMnAU+b7hy7l94rIm0BvIFnPP2mKo4HpYde7RdET8MuGLuO3\n5N+Y9OkkAKYNaMGi6zrk7V/cYDFj245l7CHjeUlpBVWIbHs28zbPIzwonMf7PY4A5z9+nLo7n+Ub\nR1eOXbWMZYPa6agQPkaeoklKwn7hArlJSdiTLmC/cMEoS042XinJOJJTDIWUkoIjNTXPk9YjVitW\nmw1LRIT5biOobkssETastgisETZCLutUbvkrTUGJyFoMh4i6InICeAxDMb0tIlOB34FxZvVPgJHA\nUSADuLOy5NLUHFrVC+fLBwbRom7R0R4igyPpWj8/cG1AgUn7sMAwejbsSUztrzl5IZPxPZrziZ6G\ncuPFH17k56SfWXrlUuoE1OLYiknEnvwv/5XBNJj0b6bFNapuES8JVE5OntWSm5SEPTGR3IQE7IlJ\n5CYa7/bEBHITEo19SUmQ6yUif0AA1shI4xURgbVeXYJatTK2IyOwRkZiiYg0tm02YzvChjUiAgkL\nq5KHkcr04pvgZddVHuoqYFZlyaKpubSuH158JZMn+j/NN3utzBrSyuN+Z3+7s28LPvm8IqSrGWyN\n38rqA6sZ33Y8vUNjOf7sIGIzf+Jt22QG3/U09SNCi29EA4AjOxtHaqph1eS9p+FIS8We4lLuHFJL\nSTGG0MxhNJWR4bVtS3g41uhoAqKjCWzShNDOnbBG1yEgOgprVBTW2rXd3i21avm8xatDHWkuGUa1\nHsmo1t73hwcb3cHiIQvwpUrixUTmb55PbGQsd4R2I+tfA6jtyGFdu2cYM/4urF4cVGoqeUNmqanY\nk5ON7eQUl/kXp0JJNYbNCszTqIsXiz2HJTwca0SEMXwWEUFg82aEREQaVkxkBFanJRMVhTUqmoA6\n0Vijo7EEB1fBFahatILSaExWTO7Bh3tOEVNbWwRgRAtZ9O0iUrJS+HNATxqtu41jqhGnRqzgxr5F\nL7D2ZRxZWYWVi3PuJcWTosm3YhxpaSWfm4mIwGILJ7hBA6wRNiy2CKy2cA/vNizhNqNOrVqIVYeC\ncqIVlEZj0iQqjFlDWpOR430Y5VJizaE1bD65mRmZUQz55f/YFNCXmDtWMbBJw2qTSSmFyspyHyJL\nSc0fIktzsVhcrZgUU+kkp6Cys4s8h4SGGvMwphUT2LAh1jZxxhyMzYY1MsJQLpERWGw2Yw7HnKOx\n1KqauZlLBa2gNJoCOCNV+BsiMgJ4HrACK5RST5W1rUMJh3h25xL6ZdiZdvoAb9abzbVT/4wttPzX\nxpGVlT+vklJwSCwl3505Nc20blw/p6JyislybLG4DZFZI2wENGzoWbmYw2V5dW02JMg/f/+aiFZQ\nGk0BAiz+1y1ExAr8C7gaIxLLDhH5SCl1sLRtpVy8wOz/TaF2Thazz+awacDrjB86Is8yUA4HjrQ0\n9wn8QorG3Wqxp+aXq6ysor9LSIipYGxYw425lqDmzbHYwg1LxdtQWUQE1vDwKvMw01Q+/tcTNRqN\nJ3oBR5VSvwKYawpHA6VSUBnpybz24CCGZebQ50IoQfUH0HbN2/y27OU8pVPsGhmLxZzQzx8SC2jQ\nIF/pFLRaIvKtGm3BaFzRCkqj8UDvhr3JdhQ9V+FjeIpn2btgpWJjWQYE0mNXDuEZEBQVhjX3FCoi\ngsB69bG0bu2uXPKGykzlYg6r+YP7ssY/0ApKo/HAiuErqluESkEptRxYDtCjR49CZlBYcBjdN+4i\nMDREKxlNtaMVlEZTM6iweJZBYdrNXuMb6BWJGk3NYAcQJyItRCQIuAUjxqVG47doC0qjqQEopXJF\n5F7gcww385VKqQPVLJZGUy60gtJoaghKqU8wAi9rNDUCPcSn0Wg0Gp9EKyiNRqPR+CRaQWk0Go3G\nJ9EKSqPRaDQ+iVZQGo1Go/FJRBUVU8vHEZFzGKnjPVEXOF+F4hSHL8njS7KAb8lTGlmaK6XqVaYw\nlYkf9R9fkgV8Sx5fkgVKLk+J+o5fK6iiEJGdSqke1S2HE1+Sx5dkAd+Sx5dkqU586Tr4kizgW/L4\nkixQ8fLoIT6NRqPR+CRaQWk0Go3GJ6nJCmp5dQtQAF+Sx5dkAd+Sx5dkqU586Tr4kizgW/L4kixQ\nwfLU2DkojUaj0fg3NdmC0mg0Go0foxWURqPRaHySGqmgRGSEiBwWkaMiMq8KztdURL4RkYMickBE\n7jfLF4vISRHZY75Guhwz35TvsIgMrwSZjonIPvO8O82yaBFZLyJHzPcos1xE5AVTnr0i0r0C5Wjr\n8v33iEiKiPypKq+NiKwUkbMist+lrNTXQkQmm/WPiMjk8srli1R13zHP6VP9R/cdNxmqt+8opWrU\nCyMXzi9ASyAI+BHoUMnnbAR0N7dtwM9AB2AxMNdD/Q6mXMFAC1NeawXLdAyoW6Ds78A8c3se8LS5\nPRL4FBCgD7CtEn+b00Dzqrw2wBVAd2B/Wa8FEA38ar5HmdtR1flfr6Tfp0r7jnlen+o/uu+4tVmt\nfacmWlC9gKNKqV+VUtnAm8DoyjyhUipeKbXb3E4FDgExRRwyGnhTKZWllPoNOGrKXdmMBlab26uB\nG1zKX1MGW4HaItKoEs5/FfCLUspb9AKnLBV6bZRSm4BED+cpzbUYDqxXSiUqpZKA9cCI8sjlg1R5\n3wG/6T+677ifp0r6Tk1UUDHAcZfPJyj6z16hiEgs0A3YZhbda5q7K52mcBXJqIAvRGSXiEw3yxoo\npeLN7dNAgyqUB4w05GtdPlfXtYHSX4tq/V9VEdX+HX2k/+i+UzRV1ndqooKqNkQkHHgP+JNSKgVY\nBrQCugLxwJIqFGeAUqo7cA0wS0SucN2pDNu7ytYYiEgQMAp4xyyqzmvjRlVfC41nfKj/6L5TQir7\nWtREBXUSaOryuYlZVqmISCBG51qjlHofQCl1RillV0o5gJfJN7crXUal1Enz/Sywzjz3Gefwg/l+\ntqrkwejsu5VSZ0y5qu3amJT2WlTL/6qKqbbv6Ev9R/edYqmyvlMTFdQOIE5EWphPHrcAH1XmCUVE\ngFeAQ0qpZ13KXceibwScnjAfAbeISLCItADigO0VKE8tEbE5t4Fh5rk/ApweNJOBD13kud30wukD\nJLuY8BXFBFyGKKrr2rhQ2mvxOTBMRKLMIZVhZllNosr7DvhW/9F9p0RUXd8pj4eHr74wvEl+xvBi\nWVgF5xuAYebuBfaYr5HAf4B9ZvlHQCOXYxaa8h0GrqlgeVpiePP8CBxwXgOgDvAVcAT4Eog2ywX4\nlynPPqBHBctTC0gAIl3KquzaYHTueCAHY/x7almuBTAFY+L5KHBndf/PK+m/XKV9xzynz/Qf3XcK\nnb9a+44OdaTRaDQan6QmDvFpNBqNpgagFZRGo9FofBKtoDQajUbjk2gFpdFoNBqfRCsojUaj0fgk\nWkH5ESKSZr7HisitFdz2ggKft1Rk+xpNdaL7jn+iFZR/EguUqpOJSEAxVdw6mVKqXyll0mj8gVh0\n3/EbtILyT54CBpq5YOaIiFVEnhGRHWYAyRkAIjJYRDaLyEfAQbPsAzMI5gFnIEwReQoINdtbY5Y5\nnzjFbHu/GDlyxru0vUFE3hWRn0RkjRkRQKPxZXTf8SeqaoW6fpX/BaSZ74OBj13KpwOLzO1gYCdG\nPpjBQDrQwqWuc9V3KEaIlDqubXs41xiM8PhWjKjFf2Dk7xkMJGPE1bIA32ME2az266Rf+lXwpfuO\nf760BVUzGIYRA2sPRpqCOhhxuAC2KyM3jJP7RORHYCtGAMc4imYAsFYZwSnPABuBni5tn1BG0Mo9\nGMMnGo0/ofuOD1Pc2KrGPxBgtlLKLQCjiAzGeAp0/TwU6KuUyhCRDUBIOc6b5bJtR/+fNP6H7js+\njLag/JNUjNTYTj4HZoqRsgARaWNGYi5IJJBkdrB2GGmZneQ4jy/AZmC8OVZfDyMFdGVESNZoqgLd\nd/wIrbX9k72A3RxuWAU8jzFEsNucbD1HfhpmVz4D7haRQxjRjre67FsO7BWR3UqpiS7l64C+GNGd\nFfCwUuq02Uk1Gn9D9x0/Qkcz12g0Go1Poof4NBqNRuOTaAWl0Wg0Gp9EKyiNRqPR+CRaQWk0Go3G\nJ9EKSqPRaDQ+iVZQGo1Go/FJtILSaDQajU/y/wG9oBjdjgfE0wAAAABJRU5ErkJggg==\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f161dfb7470>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"fig, (ax1, ax2) = plt.subplots(1, 2, True)\n",
"\n",
"for key, value in losses.items():\n",
" ax1.plot(value, label=key)\n",
"ax1.set_ylabel('Minibatch loss')\n",
"ax1.set_xlabel('Iteration')\n",
"ax1.legend()\n",
"\n",
"for key, value in times.items():\n",
" ax2.plot(np.cumsum(value), label=key)\n",
"ax2.set_ylabel('Cumulative time')\n",
"ax2.set_xlabel('Iteration')\n",
"\n",
"fig.tight_layout()"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.5.4"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment