{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## ThinkDSP\n", "\n", "This notebook contains code examples from Chapter 8: Filtering and Convolution\n", "\n", "Copyright 2015 Allen Downey\n", "\n", "License: [Creative Commons Attribution 4.0 International](http://creativecommons.org/licenses/by/4.0/)" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "# Get thinkdsp.py\n", "\n", "import os\n", "\n", "if not os.path.exists('thinkdsp.py'):\n", " !wget https://github.com/AllenDowney/ThinkDSP/raw/master/code/thinkdsp.py" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "\n", "from thinkdsp import decorate" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "# suppress scientific notation for small numbers\n", "np.set_printoptions(precision=3, suppress=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Smoothing\n", "\n", "As the first example, I'll look at [daily closing stock prices for Facebook](https://finance.yahoo.com/quote/FB/history?period1=1337299200&period2=1585353600&interval=1d&filter=history&frequency=1d), from its IPO on 2012-05-18 to 2020-03-27 (note: the dataset includes only trading days )" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "if not os.path.exists('FB_2.csv'):\n", " !wget https://github.com/AllenDowney/ThinkDSP/raw/master/code/FB_2.csv" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
DateOpenHighLowCloseAdj CloseVolume
02012-05-1842.04999945.00000038.00000038.23000038.230000573576400
12012-05-2136.52999936.66000033.00000034.02999934.029999168192700
22012-05-2232.61000133.59000030.94000131.00000031.000000101786600
32012-05-2331.37000132.50000031.36000132.00000032.00000073600000
42012-05-2432.95000133.20999931.77000033.02999933.02999950237200
\n", "
" ], "text/plain": [ " Date Open High Low Close Adj Close Volume\n", "0 2012-05-18 42.049999 45.000000 38.000000 38.230000 38.230000 573576400\n", "1 2012-05-21 36.529999 36.660000 33.000000 34.029999 34.029999 168192700\n", "2 2012-05-22 32.610001 33.590000 30.940001 31.000000 31.000000 101786600\n", "3 2012-05-23 31.370001 32.500000 31.360001 32.000000 32.000000 73600000\n", "4 2012-05-24 32.950001 33.209999 31.770000 33.029999 33.029999 50237200" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import pandas as pd\n", "\n", "df = pd.read_csv('FB_2.csv', header=0, parse_dates=[0])\n", "df.head()" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
DateOpenHighLowCloseAdj CloseVolume
19722020-03-23149.660004152.309998142.250000148.100006148.10000629830800
19732020-03-24155.210007161.309998152.570007160.979996160.97999630440400
19742020-03-25158.919998162.990005153.059998156.210007156.21000735184300
19752020-03-26158.250000164.000000157.020004163.339996163.33999626556800
19762020-03-27158.199997160.089996154.750000156.789993156.78999324861900
\n", "
" ], "text/plain": [ " Date Open High Low Close Adj Close \\\n", "1972 2020-03-23 149.660004 152.309998 142.250000 148.100006 148.100006 \n", "1973 2020-03-24 155.210007 161.309998 152.570007 160.979996 160.979996 \n", "1974 2020-03-25 158.919998 162.990005 153.059998 156.210007 156.210007 \n", "1975 2020-03-26 158.250000 164.000000 157.020004 163.339996 163.339996 \n", "1976 2020-03-27 158.199997 160.089996 154.750000 156.789993 156.789993 \n", "\n", " Volume \n", "1972 29830800 \n", "1973 30440400 \n", "1974 35184300 \n", "1975 26556800 \n", "1976 24861900 " ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.tail()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Extract the close prices and days since start of series:" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "close = df['Close']\n", "dates = df['Date']\n", "days = (dates - dates[0]) / np.timedelta64(1,'D')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Make a window to compute a 30-day moving average and convolve the window with the data. The `valid` flag means the convolution is only computed where the window completely overlaps with the signal." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "M = 30\n", "window = np.ones(M)\n", "window /= sum(window)\n", "smoothed = np.convolve(close, window, mode='valid')\n", "smoothed_days = days[M//2: len(smoothed) + M//2]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Plot the original and smoothed signals." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEYCAYAAAAJeGK1AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjMsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+AADFEAAAgAElEQVR4nOzdeXScd33o//d39kUa7bIky7a8b5G824odZ7eTkISEhCSEFgi0JfRSDhf6Owd6Tgu0hd4ulMvlXCglN0AoS9LSNhCCg+PYjhPsxPtu2fImW7s00mgWzT7f3x8jjSVrtbXMWPq8zsmx5nmeeeYzE2s+/n6f7/P5KK01QgghRKYxpDsAIYQQYjCSoIQQQmQkSVBCCCEykiQoIYQQGUkSlBBCiIxkSncAY1FYWKgrKirSHYYQQojrHDp0qF1rXTSWc9zSCaqiooKDBw+mOwwhhBDXUUrVjfUcMsUnhBAiI0mCEkIIkZEkQQkhhMhIkqCEEEJkJElQQgghMpIkKCGEEBlJEpQQQoiMJAlKCCFERpIENcG+9rWv8c1vfnPYY77//e/zk5/8BIDnnnuOX/7yl2N6zd27d/PII4+M6RxCiKlLa83Zs2eJRCLpDmVYt3QlianiM5/5TLpDEEJME263m4sXL9Lc3EwgEGD16tXpDmlIMoKaAN/4xjdYvHgx999/P2fPnk1tf+GFF1i3bh0rVqzgySefpLu7Gxh8lPXWW2/xoQ99KPX4zTff5IknnhjwWgcOHGDjxo2sWLGC9evX4/P5+u3v6Ojg8ccfp6qqiurqao4fPw7A22+/zcqVK1m5ciWrVq1KPe+f/umfWLduHVVVVXz1q18dnw9ECJERtNbs3buX5uZmABKJRJojGt6UHkGdOnWKrq6ucT1nTk4Oy5cvH3L/oUOHePnllzly5AixWIzVq1ezZs0aAJ544gn+5E/+BIC//Mu/5MUXX+Rzn/vcoOe59957+exnP0tbWxtFRUX86Ec/4pOf/GS/YyKRCM888wyvvPIK69atw+v1Yrfb+x3z1a9+lVWrVvHqq6+yc+dOPv7xj3P06FG++c1v8t3vfpdNmzbh9/ux2Wxs376d2tpa9u/fj9aaD37wg+zZs4c777xzLB+ZECJDxGKxfo8Nhsweo2R2dLegd955hw996EM4HA5cLhcf/OAHU/tOnjzJ5s2bqays5Gc/+xmnTp0a8jxKKT72sY/x05/+FI/Hw759+3jooYf6HXP27FlKS0tZt24dAC6XC5Op/7853n33XT72sY8ByaTndrvp6upi06ZNfPGLX+Q73/kOHo8Hk8nE9u3b2b59O6tWrWL16tXU1NRQW1s7Xh+NECLNwuFwv8dKqTRFMjpTegQ13EhnIg31P/25557j1VdfZcWKFfz4xz9m9+7dw57nk5/8JI8++ig2m42nnnpqQPLRWo/4F0xrPWh8X/7yl3n44Yf57W9/S3V1NTt27EBrzV/8xV/w/PPPD/8GhRC3pOsvAWR6gpIR1Di78847+e///m+CwSA+n4/XXnsttc/n81FaWko0GuVnP/vZiOcqKyujrKyMr3/96zz33HMD9i9ZsoTGxkYOHDiQOv/1Q/g777wz9Vq7d++msLAQl8vFhQsXqKys5Etf+hJr166lpqaGBx54gB/+8If4/X4AGhoaaG1tvdmPQoiMprWmpqaGYDCY7lAmTWNjY7/HSin27dvHyZMn0xTR8Kb0CCodVq9ezTPPPMPKlSuZM2cOmzdvTu3727/9WzZs2MCcOXOorKwc8K+ZwfzBH/wBbW1tLFu2bMA+i8XCK6+8wuc+9zmCwSB2u50dO3b0O+ZrX/san/zkJ6mqqsLhcPDSSy8B8O1vf5tdu3ZhNBpZtmwZDz30EFarlTNnznD77bcDkJWVxU9/+lOKi4vH8pEIkZG6urqora2lo6ODjRs3pjucSeFyufolKaUU7e3ttLe3c9ttt6UxssGpwaaAbhVr167VU71h4Z/92Z+xatUq/uiP/ijdoQgxpbjdbvbu3Ut+fj6bNm1KdziToqamhvPnz2M2mbB7asiqWE1DW3Ih2aOPPjqur6WUOqS1XjuWc8gIKoOtWbMGp9PJP//zP6c7FCGmnN4l1pm+km08xeNxjAbFnO5j2Nv3EY3X0+C6K91hDUkSVAY7dOhQukMQYsqajgkqEuqmovMd5jt8NAJZ3fWQnQCVmZ9BZkYlhBATrDdBGY3GNEcyeazNh8gNXMIw/17q8zcRDocwxwMZ+xlIghJCTEvTcQRl8DeD1QnLHydszgHAGvVm7GeQmVEJIcQEi8fjwDRKUFpj814i5pqNUoqIyQWANeYd9H7JTDBN/s8IIcQ1WmuOHTsGgMPhSHM0kyPefgEV7iKcvxSAqNFBQpmwxLwZW5NPEtQ4C4VCrF+/nhUrVrB8+fJ+BVcvXbrEhg0bWLhwIc8888yoSt1XVFTQ3t4+kSELMe30/UK+vkLLVNV6ag8axbkuc7KChFJETNlYoskElYmjKElQ48xqtbJz506OHTvG0aNHeeONN3jvvfcA+NKXvsQXvvAFamtrycvL48UXX0xztGPTO0UixK2m79/dTPxingjes3vothYxb9G1m/7DZhfWmBfIzN9nSVDjTClFVlYWANFolGg0ilIKrTU7d+7kwx/+MACf+MQnePXVVwc83+12s3XrVlatWsXzzz/f75fn8ccfZ82aNSxfvpwf/OAHALz44ot84QtfSB3zwgsv8MUvfnHAef/0T/+UtWvX9hvVbdu2jaeffjp1zO7du1M3623fvp3bb7+d1atX89RTT6XKH1VUVPA3f/M33HHHHfzHf/zHkC1ELly4QHV1NevWreMrX/lK6jMBaekh0q+hoSHdIUwqHfZji3rw2udQXl6eqsEXMbmwxHygdUZO803tse3J/wLvOP9FdM2E2wb2ZeorHo+zZs0azp8/z2c/+1k2bNhAe3s7ubm5qemE8vLyQX9J/vqv/5o77riDr3zlK7z++uupRATwwx/+kPz8fILBIOvWrePJJ5/kIx/5CFVVVfzjP/4jZrOZH/3oR/zrv/7rgPN+4xvfID8/n3g8zn333cfx48fZsmULzz//PIFAAKfTySuvvMIzzzxDe3s7X//619mxYwdOp5N/+Id/4Fvf+hZf+cpXALDZbLz77rtAMqEO1kLk85//PJ///Od59tln+f73v5+KQ1p6iEzQd3p9Ooygjr+7jVwgaCnot6Q8Ysoiy27FlAjKCGq6MBqNHD16lPr6evbv38/JkyeHrCp+vT179vCHf/iHADz88MPk5eWl9n3nO99hxYoVVFdXc/XqVWpra3E6ndx777385je/oaamhmg0SmVl5YDz/vu//zurV69m1apVnDp1itOnT2MymXjwwQd57bXXiMVivP766zz22GO89957nD59mk2bNrFy5Upeeukl6urqUud65plnUj8P1UJk3759PPXUUwB89KMfTR0vLT1EJnC73ekOYVTq6+vxer1jLmirr7xPXJnpthb1u+YWNTqwOxxYYn4ZQU26EUY6Ey03N5e7776bN954gz//8z/H4/EQi8UwmUzU19dTVlY26PMG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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.plot(days, close, color='gray', alpha=0.6, label='daily close')\n", "plt.plot(smoothed_days, smoothed, color='C1', alpha=0.6, label='30 day average')\n", "\n", "decorate(xlabel='Time (days)', ylabel='Price ($)')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Smoothing sound signals\n", "\n", "Generate a 440 Hz sawtooth signal." ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from thinkdsp import SawtoothSignal\n", "\n", "signal = SawtoothSignal(freq=440)\n", "wave = signal.make_wave(duration=1.0, framerate=44100)\n", "wave.make_audio()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Make a moving average window." ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "window = np.ones(11)\n", "window /= sum(window)\n", "plt.plot(window)\n", "decorate(xlabel='Index')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Plot the wave." ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "segment = wave.segment(duration=0.01)\n", "segment.plot()\n", "decorate(xlabel='Time (s)')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Pad the window so it's the same length as the signal, and plot it." ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "def zero_pad(array, n):\n", " \"\"\"Extends an array with zeros.\n", "\n", " array: NumPy array\n", " n: length of result\n", "\n", " returns: new NumPy array\n", " \"\"\"\n", " res = np.zeros(n)\n", " res[:len(array)] = array\n", " return res" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "N = len(segment)\n", "padded = zero_pad(window, N)\n", "plt.plot(padded)\n", "decorate(xlabel='Index')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Apply the window to the signal (with lag=0)." ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "-0.9001814882032255" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "prod = padded * segment.ys\n", "np.sum(prod)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Compute a convolution by rolling the window to the right." ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [], "source": [ "smoothed = np.zeros(N)\n", "rolled = padded.copy()\n", "for i in range(N):\n", " smoothed[i] = sum(rolled * segment.ys)\n", " rolled = np.roll(rolled, 1)" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.plot(rolled)\n", "decorate(xlabel='Index')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Plot the result of the convolution and the original." ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEYCAYAAAAJeGK1AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjMsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+AADFEAAAgAElEQVR4nOy9eXAj153n+X1IHESC932zeBavuqSyrLZkS2pLqtJZVZ7ZXnt2Y9wT3eGNje7diJ2d3nbHTHRPeLYjenb+6J6N8Paup9sznumNcXc7BFTJJbskW6VtS7ItlQQS4Fk8ilcCIAGS4AES99s/Epk4CLBIIgEkEvmJYBQBZiKffsJ7v9/7fd97P0IphYqKioqKitzQFLoBKioqKioq6VAdlIqKioqKLFEdlIqKioqKLFEdlIqKioqKLFEdlIqKioqKLNEWugFnob6+np47d67QzVBRUVFRkYDPPvvMQyltSH2/KB3UuXPn8ODBg0I3Q0VFRUVFAgghy+neV1N8KioqKiqyRHVQKioqKiqyRHVQKioqKiqyRHVQKioqKiqyRHVQKioqKiqyRHVQKioqKiqyRBIHRQj5PiFkgxAykeHvhBDyfxJC5gkhNkLIEwl/+yYhZC72800p2qOioqKiUvxINYP6TwCuH/P3VwD0x36+BeAvAYAQUgvgTwB8EcBTAP6EEFIjUZtUVFRUVIoYSRwUpfQfAGwdc8kNAP+Z8vwKQDUhpAXANQDvUUq3KKXbAN7D8Y5OpUD88pe/hMvlKnQziopAIIBoNFroZqioFC350qDaAKwmvF6LvZfp/SMQQr5FCHlACHngdrtz1lCVo7jdbrz77ruw2+2FbkrREA6H8d3vfhcfffRRoZtSVHz88cdYXV19/IUqIn6/H5FIpNDNyAn5clAkzXv0mPePvknp9yilVymlVxsajhzZpJJDBMekVl8+OXNzc9jb24PP5yt0U4qG7e1tvPfee2ogdAoikQj+8i//Eh988EGhm5IT8uWg1gB0JLxuB+A45n0VmUApVQeMM2Cz2QCoTv00qIHQ6VlYWMDu7i4ODg4K3ZSckC8HdQfAP42t5nsawA6l1AngHoCXCSE1scURL8feU5EJq6ur8Hq9ANSB46QcHh5ibm6u0M0oKiilolNXOTlKd+qSnGZOCPmvAJ4HUE8IWQO/Mk8HAJTS/xvAOwBeBTAP4ADAP4v9bYsQ8m8AfBr7qO9QSo9bbKGSZ2w2G3Q6nSr2n4LJyUlRE1DqwCE1DocDm5ubAFSbnZRAIICZmZlCNyOnSOKgKKXfeMzfKYDfy/C37wP4vhTtUJGWcDiMyclJDA4OYnZ2Vh04Tojdbkd9fb2qP50Cm80GhmHAMEyhm1I0TE9PIxwOA1CuU1dPklDJyPz8PPx+Py5evAhC0q1nUUlle3sbKysruHjxYqGbUjREIhFMTExgYGAAOp1OsYOt1NjtdtTU1KCioqLQTckZqoNSyYjNZoPJZEJPTw8A5UZpUiJoAhcuXACg2uwkLC4u4uDgQA2ETsHe3h4WFxdx4cIFRdtMdVAqaTk8PMTDhw8xOjoKjUaj6E4gFcKKx87OTlRXV6s2OyF2ux1GoxH9/f0AVKd+EoRASOlOXXVQKmmZmppCJBJJSlWpA8fxOJ1OeDwe1WanIBAIYHp6GsPDw2AYRtGDrZTYbDa0tbWhrq4OgHK/Z6qDUgEA/PufzeF/+9G4+FoQ+ltaWgBAHTjSsOjex4Ol+KJTQegfHh4GoNrsJMzMzCAcDqtO/RSsr69jfX1dTCMrGdVBqcAfiuCvPlzELxf5Zb5erxfLy8tH8tvqwJHMH/zIhj/4Eb93JxqNikK/0WgUr1Ftlsx378/jf/ybz8TXNpsN1dXV6Ojg9+urTv0oi+59fDjnEV/b7XYQQjA6OgqAt5lSv2eqg1LB/ZkN7PnDOAjwe3dShX5AHThSWdk8wGfL29jzhwDwQr/P51NtdgyhSBR//eEjfLq0DYAX+h89eqR4oT9b/pVlAv/r348BiOucfX19MJlMBW5Z7lEdlArMVg4AcBCMiDv6Ozs7UVOjVj7JhGUsbjOAnwmUlZWJQr+AUiPbs/CLOTe2fEEcBPm9OxMTE6CUJqX3VEeVjHPnEL9c3MS+n7fZ8vIydnd3jwRCSv2eqQ6qxPEeBHF/dgN6RoPDUASOmNCfLr+t1E5wWiilsCQ4db+f39E/PDwMrTa+910dbJMxW/ljNg9DEUSjfCDU2tqK+vr6pOvU71mc22MOUAochOLBo16vx+DgYKGblhdUB1Xi3LU7EYpQXB9tBgA8sNqg0WgwMjKSdJ062Maxre1g0eNDTwOfYrFNTSMUCqXdnKsOtjx7/hDenXRBr9WAUmDV6YLL5VI3ND8GIRCiFNg/DGJqagpDQ0PQ6XTiNeoMSkWxWKwc+hvL8YVzfDrPNjVzROgXUGonOC1mKwe9VoN/9EQ7AOBz2ySqqqrQ2dmZdJ3q1OPcm1xHIBzFq7FA6HPbJAghaQMh9XvGM+3cxYxrD/2N5QAA+/QsAoFASTl11UGVMKtbB/h0aRs3r7SB1fOpqZ39w7TpPXWw5QlFonh73IEXhxrRVFkGAJhfWlX8hslsMVvX0FnL4pk+Pp1nm5xBb28vysvLC9wy+WKxctBqCH7rKr/CcWxiGuXl5Th37lzSdUp26qqDKmFux4T+G5dbwer5Qzo1eiMGBgbSXq/UTnAaPpzzYNMXxM3LbTDFbBaimoxOXbUZ4Nrx4+OFTdy80gaTgQ+EtvYO0s4EVJvxRKIUt8cceP58A9pq+GzG3NIKLly4AI2mdIbt0vkvVUmCUoq3rBye6q5Few0LnYYfFNrP9SYJ/QLq7IDHbOVQzerw/PlGGGMOqrquAWqV58zcGedAKXDrSptoMzB6nD9/vrANkzG/XtyEa9ePmwk2C0VJyTl11UGVKHZuB4tuH25daQMAeFz8bKrtXE/Ge5TaCU7KfiCMd6dceP1iC/RaDYIH+wB4p54O1anzmK0OXO6oRne9CWUMb5PWznPQ6/VHrlXyYHsazFYO5QYtXhxqAqvjHZSpqhZNTU0Fbll+UR1UiWK2ctAzGrx6gT/KaPXRAgCgvKo27fXqYAvcm3DBH4qKTn1tibdZU1tnxntKfbCdce1i2rkr2sztXAMAtHScK2Cr5M1hMIKfTLjwymgzynQMIgG+nHtrZ3fafqjkvqk6qBIkHBP6vzrUiCqjDvv7+3CtLQMADkNq5dxMWMY4dNQa8URnDSilWF54CACIanSPubN0sVgdYDQEr1/kA6GVxTkAQEVNfdrr1RkU8LPpdewHwqJTX1mcBwA0trZnvEepNpPEQRFCrhNCZgkh84SQb6f5+58TQsZiPw8JId6Ev0US/nZHivaoHM+H8x549oO4GesAExMT0II/EUE4GSGVUh841nf9+Gjeg1uX20AIwcrKCg73dwCoNstENEpxe4zDcwMNqCs34PDwEGtLiwAAf1gNhDJhsXJoqSrD0z11oJRicW6a/4PWUNiGFYCsS74TQhgA3wXwEoA1AJ8SQu5QSqeEayil/0vC9f8TgCsJH3FIKb2cbTtUTo7FyqHKqMPz53lh3263o7WpHliGeAyNSjJ3xhyIUuBGzKnbbDawOg3gV22WiV892oRzx48/enUIADA5OQkN5W3lC6S3Wak79c39AP6/h278zpe7odEQcByHfe8WgK6SDISkmEE9BWCeUrpIKQ0C+CGAG8dc/w0A/1WC56qcAV8gjHuT63jtYgsMWgYejwcOhwNPXuRPRi7FTnASzFYOl9qr0NtQjnA4jKmpKYwO8avQVJulxxIT+l8a4oV9u92OlgZe4zzMYLNS567diXCUiuk9m82GstjCx4MMTl3JSOGg2gCsJrxei713BEJIF4BuAO8nvF1GCHlACPkVIeSmBO1ROYZ3p1w4DEWSOgAhBJcuXoBeq4FPnQ0cYda1h6kEoX9ubg5+vx+XL16AntFkdFCljD8UwU/sLlwfbYZRz2B7exsrKyuizXyqU0+L2cphsLkCg82ViEQimJiYwNDgeegYgoNQ6dlMCgeVbglJJmt9HcCPKKWJlu6klF4F8E8A/AUhJO2aXULIt2KO7IHb7c6uxSXMW59zaK8x4smY0G+329HT04OKigqweiZjZKvklUKPwzLG8UL/pVYAvFM3mUzo6ekBa2BwmMGpK3ngeBw/n97AXoLQn1jCxajPbLNSZsnjg3XFK9pscXERBwcHuHDhAli9tiRnnVI4qDUAHQmv2wE4Mlz7daSk9yiljti/iwA+QLI+lXjd9yilVymlV9VNkWdjIyb037zcBo2GYHV1FV6vVzwFwaTXHjsbKMXBNhqluG3l8JX+etTHhP65uTmMjo5Co9GA1TEZZwOljNnKoanSIAr9NpsNXV1dqK6uhknPHJsWLVUsYxwIAd68HA+EjEYj+vv7weqZktTtpHBQnwLoJ4R0E0L04J3QkdV4hJDzAGoA/DLhvRpCiCH2ez2AZwBMpd6rIg13xnmh/2ZCek+n02FoiBexjXpGFfxT+GRpC44dv2izqakpRCIRcUc/a8gc2Sp54DiOLV8QH8xu4MblNjAaAqfTic3NTTEQMh7joIDSDIQopTBbOfxGTx1aqowIBPgSLiMjI2AYhrdZhhSfksnaQVFKwwB+H8A9ANMA/o5SOkkI+Q4h5M2ES78B4Ic0+ds3BOABIWQcwH0Af5a4+k9FWixjHC62V6GvkRf6JycnMTg4KO7oZx8T2ZbiwGGxcjDpGbw8zJ/CbbPZUF9fj5YWfl8Pqzr1IwhC/83L8UCIYRjx5HJWr1VtloJ11YvlzQMxEJqZmUE4HBYDIdMxKT4l982sl5kDAKX0HQDvpLz3xymv/3Wa+z4GcPSUTRXJmVvfwwS3iz9+fRgAMD8/D7/fn3TI6XEOqhTxhyK4a3fiWkzo93q9WFlZwQsvvCCmoozHpPiUPHAch/nzNZxvqsBQSwWi0SgmJiYwMDCAsjL+9Hc1EDqKxcrBoNXgldF4IFRdXY32dn5zrvGYFJ+SUU+SKBEEof+NFKG/tze+JuW4yLYUB473Zzaw5z8q9Cce2Gk6JsVXiixv+vD5ihc3r/AbmhcXF+Hz+ZJspgZCyQglXF4abkJFmQ57e3tYXFxMKuFi0jM4VFfxqSiRaJTCYnXg2b56NFQY4Pf78fDhQ1HoF3icNlBqmK0cGisM+FJvvSj0d3Z2orq6WrzGqGcyLs0vRcHfYnWAEL6ECxDbx1NWhr6+PvEaNRBK5h8eurF9EEq74lGAfcwCJqWiOqgS4NOlLXDeQ7EDpAr9AqbHLDMvpYFjWxT6W0Wh3+PxHLEZq8tsM6C0BH9KKSxjHJ7urkNrNS/0T09PY2RkJKmEy3HbGUoRs5VDDavDVwYSTnZpbUV9ffy8QqOeybhRV8l9U3VQJYBljAOrZ/DyCL+j32azoa6uThT6BVi9tiTz3Om4a3ciFKFJKx4ZhsHw8HDSdSZDaUa26Rhf28EjT7yES6rQL8DqVd1OYM8fwntT63jjUit0jAYbGxtwuVxpg0d1FZ+K4vCHIvixzYnrI81g9Vp4vV4sLy+nLVHOlmieOx0WK4eBpnIMt1SKQn9/fz+MRmPSdcctzS9Fm+m1Gly/wAv9drsd1dXV6OjoSLrOWKKbTtPxkwkXAuFoUiBECMHo6GjSdUa9FgeB0rOZ6qAUzgezvNB/85j8tgCrZxCKUARL/KTplc0DPFjePlboF2B1vM1CkdK2mSj0DzWhMkHov3DhwpFAyKRnEIxE09qsFJ36uToWVzqqxZNd+vr6YDKZkq5jYzYLl5jNVAelcMxWDg0VBnypN76jv6OjAzU1NUeuNep5nSBddKvkTpDK7TG+uvCNy3GnXlZWhv7+/iPXsgbeZunSfKVksw/nPNj0JZdwoZSmdepCCfNST406dw7xy8VNMRBaXl7G7u5uxuARQMml+VQHpWC8B0Hcn3HjzUut0DIauFyutEK/gEnsBKWrQwk7+r/YXYu2aiOCwSCmp6cxPDycJPQLiANHiW88fcvKoZrV4bljhH4Bk0ENhAC+hAulSNrQrNfrMTg4eORaNhY8pkvzKdlmqoNSMO/YXQhGokknl2s0GnFHfypCZOvL0AlKAdvaDhZThP5QKJTRqbPHzAaUPHAksucP4d1JF16/2AK9VgO32w2n05l2JgDEbVbqJ+ebrRyudFbjXL1JLOEyNDQEne5oheZSDYRUB6VgzNY19DWWY6S1MmlHf6rQL8Aek+IDSmPJtDkm9L9ygV/haLPZUFVVhc7OzrTXP85mpcC9yXUEwlHcusKfepBJ6Bcw6vjBNtMMqhSYdu5ixrUnBkIPHz5EIBB4rFMvtUBIdVAKZXXrAJ8ubeNWLL/96NEj7O/vZ+wAQEKKr8SiNAFB6H9xqBFVRh329/czCv0C4mwgzfJ8JQ8ciVisHDprWTzRGRf6e3t7UV5envZ60zG6HVAagZBljINWQ/BaQiBUXl6O7u7utNeLKb4SC4RUB6VQBKH/zYSjjQwGAwYGBjLec5x4XQqD7YfzMaH/8uOFfgFjiYrXAuu7fny04BGF/pWVFezs7BwbCBlLPMXHl3Bx4LmBBtSVG3BwcJBUwiUdxmOCRyX3TdVBKRBB6H+quxYdtexjhX6BUo3SBCwxof/5840AeKfe0tKC4+qPmUp85WNc6I8HQjqdLq3QLyDMOkvVZr9a3IRrN7mESzQaxaVLlzLeYzJktpmSUR2UApngdrHgjgv9s7Ozxwr9AscJsUofOPYDYdybdOG1CycT+gWOS/GVAmYrh0sd1ehpiJdwGRoaEku4pMNU4oGQ2cqh3KDFS8Pxk10aGhrQ1NSU8R5Wx9ss3QkcSu6bqoNSIGYrBz2jwaujyUJ/V1fXsfcdJ8QqnXsTLvhD0aQDO48T+gXE2UCaFJ+SBw4AmHXtYcq5i1ux2dPc3BwCgcBjA6FSTVcB/MkuP5lw4ZXRZpTpGGxvb2N1dTXtyS6JsOIMqrQCIdVBKYxwJIo74w785mAjqlhe6F9YWDhW6Bc4LsWn9IHDMsaho9aIJ7tqRKG/p6cHFRUVx94n2Czd0nylY7byJVxeT9A5jxP6BUo5EPrZ9Dr2A+GkrR9A+pNdEokvzS+tvqk6KIXx4bwHnv2AmN+enJx8rNAvUKbTgJDSi9LWd/34aN6DW5d5oX91dRVerzdrmyl5yXQ0SnF7jMNzAw2oLzfg8PAwbQmXdJRpGRBSooGQlUNzZRm+2FMnBkJdXV2oqqo69r4ybWk6ddVBKQyLlUNlmRYvDPLCvs1mQ3Nz87FCvwAhBGyGCrFKHjjeHncgSoEbMac+Pj7+WKFfQLBZqS2Z/vWjLTh3/EmBUDQaPZFT12gIjLrM5SOUypYviA9m3WIJF4fDgc3NzRPbjC9TUlqBkCQOihBynRAySwiZJ4R8O83ff5sQ4iaEjMV+fjfhb98khMzFfr4pRXtKFV8gjHuT63jtYisMWgYejwcOh+NEHUDAWIKF0cxWDpfaq9AbE/qnpqYwODh4rNCfiFGvzVg+QqlYrBxMegYvDfHCvt1uR319PZqbm090P5uhfISSA6G7NgfC0ceXcMnEcWVKlGqzrB0UIYQB8F0ArwAYBvANQkg6i/8tpfRy7OevYvfWAvgTAF8E8BSAPyGEHD3FVOVEvDvlwmEogq89cfzR/cdhMqQvH6HUgePh+h4mHbvioDE3Nwe/338qp35cZKtEm/lDEbxjd+L6aAuMel7oX1lZeazQnwir15bcDOotK4fB5goMtVQiEolgYmIC58+fR1lZ2YnuN5ZgoUcpZlBPAZinlC5SSoMAfgjgxgnvvQbgPUrpFqV0G8B7AK5L0KaSxGx1oL3GiCc740J/d3f3Y4X+RIzHpKuUiEUQ+i/yQr/dbofJZEJPT8+JP4PVl5bN3p/ZwF6C0H9cCZdMZLKZUp36kscH64pXDIQWFxdxcHBwKpuZ9NqSCh4BaRxUG4DVhNdrsfdS+UeEEBsh5EeEEKGC2UnvBSHkW4SQB4SQB263W4JmK4uNPT8+nHPj5uU2aDSnE/oTMRnSF5NTYp6bF/od+HJ/PRoqTif0J1Jqg+1bn3NorDDgN3qThf7q6uoTf4bxmOKYSsQyxoEQ4EbChmaj0Zi2hEsmjCUWCAHSOKh0I1dqr3wbwDlK6UUAPwPwg1Pcy79J6fcopVcppVdPIviXGm+POxGlwM0r8Q6g1WpPJPQnwue506delDbYfrK0Bc57KM4EpqamEIlETu3U2QyRrRLhhf4NUeh3Op3weDynmgkA/GygVM4vpJTCYuXwGz11aKkyIhAIYGZmBsPDw2AY5sSfU2qBECCNg1oDkFjTuR2AI/ECSukmpTQQe/kfADx50ntVTobZuoYLbVXoa6xAJBIRd/QbDIZTfY5RVzp5bkHof3k4XqK8vr4eLS0tp/qcUho47tqdCEdp0snlpxH6BUppNjC26sXS5oGY3puZmUE4HD5jIFQaNhOQwkF9CqCfENJNCNED+DqAO4kXEEISe/ybAKZjv98D8DIhpCa2OOLl2Hsqp2BufQ8T3FGh/7RRLcCn+EphsPWHIrhrd+LaaDOMegZerxfLy8sn2tCcSilpUBYrh/NNFRhqqThRCZdMmEooxWexcjBoNbg+ygdCNpsN1dXV6OjoeMydyfDfs9KYdQpkPjn0hFBKw4SQ3wfvWBgA36eUThJCvgPgAaX0DoD/mRDyJoAwgC0Avx27d4sQ8m/AOzkA+A6ldCvbNpUaljEOGgK8cYmPA+x2O1iWRW9v76k/y5ihEyiN+zMb2PNnJ/QLZFqar7SBY2XzAJ8tb+MPrw+CEIKFhQX4fL4z2yxTYUwl2SwUieJtmxMvDjehskyHvb09PHr0CM8++6waCJ2ArB0UAFBK3wHwTsp7f5zw+x8B+KMM934fwPelaEcpEo1SWKwOfLm/AY0VZfD7/ZidncWTTz55KqFfINOmU6UNHGYrh4YKA77UWw9KKWw2Gzo7O1FTc/pdDqYSceqWWAmXRKG/rKzsVEK/QKal+UrjHx66seUL4tYpSrhkgtVnXsCkpL6ZiHqSRJHzYHlbEqFfgDVocRiKIBpV5hceALwHQdyf3cCNS7zQ73K5ziT0C7CxdFXqIKGkgUMQ+p/uqUVrtRHBYBAzMzMYGRk5toRLJkyxjbpKthnAB0I1rA5fGYif7NLa2or6+vpTf5awgElJ9nkcqoMqcsxWDqyewcsj8aP76+rq0NraeqbPY/UMKAX84eRITUkDx127E6HI0R39IyMjZ/o81qDlbRaKStlMWTG+toNFT7yEy8zMzIlKuGTCqFe+zfb8Ibw3tY43LrVCr9VgY2MDLpcrC5vxfTMQTraZkvpmKqqDKmIC4Qju2hy4NtIMVq/Fzs7OmYV+gVI4adr8OYf+xnKMtFaKQn9/f/+phX6B+EnTySkrJe0ds1g56LUaXE8o4XIWoV8gU+0xJQ22P51wIRCOJgVChJAzB0Im8eR85adGBVQHVcTcn9nArj8sdgBB6D9rhAYklNwIKHMGtbJ5gAfL22KJ8kePHmF/fz8rmxl1maudKsFmoUgUb4878OJQI6qMfAmXxcVFNRB6DJYxDl11LK50VIsbmnt7e1FeXn6mzzNmsJmSAqFUVAdVxJitHOrLDXgmtqPfZrOho6PjTEK/gDhwhJQZpd2OCf2JUe1ZhX4Bk0HZFWI/nPNg0xcU9z7Z7XZQSs+s2QGZa48pJRBy7fjx8cImbsZKuCwvL2N3dzerQEiYQaVbnq8Em6VDdVBFivcgiPszbrx5qRVaRoP19XW43e6sOgBwfJRW7J2AUgrzGIcvdteiLSb0T09PY3h4+ExCv4DxmBRfsdsM4AOhalaH52JCv91uR0tLy4lKuGQiU4pPKdwZ50BpciCk0+lw/vz5M3+mmEpWU3wqcucduwvBSLxE+fj4ODQazal39KdiypDiUwJ2bgeLbumEfgH2mBRfsbMfCOPdKRdev9gCvVYDt9sNp9OZvc0UHAgB/MHNlzuq0V1vEku4DA0NnbiESzqEQCj1e6YUm6VDdVBFisXKoa+xHKNtyUI/y7JZfa6SxWuzlYOe0eCVC/ENzVVVVejs7MzqczOl+JRgs3sTLvhD0aQS5act4ZKOTCk+JTDj2sW0c1e02cOHDxEIBLJ26iYF2ywTqoMqQla3DvDJ0hZuSSj0C4hRmsKOoQnHhP6vJgj9CwsLWQn9AkYFp6ssYxw6ao14IqGESzZCv0AmmynBqZutHLQagtcvxgOh8vJydHd3Z/W5Sk8lp0N1UEXInXH+PN03L8VrGBkMBgwMDGT92fGlrMpaKfSLeQ88+0FRE8hmR38qSk1Xre/68dG8B7diQv/Kygp2dnayWhwhYDIocxVfNEpx2+rAcwMNqCs34ODg4EwlXNLBZkjxKRnVQRUZlFK89fkanjpXi45aVjKhX+C42UAxD7YWK4cqow7Pn5dO6BdQarrqzpgjVsIlWeg/bQmXdLC6zGnRYuZXjzbh2vWLNpuamkI0GpUkEMqU4iv2QOg4VAdVZExwu1hw+8QOMDs7i2AwKEkHAJQZpe0Hwrg3yQv9Bi0Dj8cDh8MhyUwASJhBBZSVejFbOVzqqEZPQ7lkQr9AXPBXXiBUbtDixaH4yS4NDQ1obm7O+rOVnErOhOqgigxB6H8tQeivrKxEV1eXJJ+vYzTQMxr4FBSlvTuZG6FfQMdooGMIDhSk28269jDl3MWt2MGw2ZRwSYdey9ss9XtWzPhDEfzE7sL1WAmX7e1trK6uSqJzArzNtBqizqBU5Ek4EsWdcQdeGGxAFcsL/fPz85J1AAGjwk6aNls5tNcY8WRXXOjv6elBRUWFZM9g9VpFzaAsYxwYDcHrl+Inl5tMJvT09Ej2jHTFMYvZZj+f3sBeQJoSLpkotZIbqoMqIj5a2IRnPyDu6J+cnJRM6E/ElKYTFOvAsSEI/bEVj6urq/B6vZIOGoCyBg5e6Ofwlf561JcbcHh4iLm5OUmE/kT44phKCoTW0FRpwNM98ZNdurq6UF1dLdkz+Kq6ygmEHofqoIoIi5VDZZkWLwzGj+5vbm5GY2OjpM9RUjnuO+O80H/jcrLQPzQ0JOlzjLHyEYkU6wVTn7kAACAASURBVMDxydIWHDvJQn8kEsGlS5ckfY5RzygmlbzlC+KDWTduXG4DoyFwOp3Y3NyUPHhUUiB0ElQHVST4AmH8dMKF1y625kToT0RJUZpljMPF9ir0NfJC/+TkJAYHByUR+hMxpUnxFSvmzzmY9AxeHo6XKK+vr5dE6E+EL1qojMH2rs2BcJQmnezCMEzWJ7ukwhqUk904CaqDKhLem1rHYSiSlN8mhOTIQR2NbIuRufU9THC7uBmbPc3Pz8Pv90se1QLKmXX6QxG8Y3fiWkzo93q9WFlZwcWLFyVfAq6kQMhs5TDYXIGhlkpEIhFMTExgYGAAZWVlkj6H1SkrLfo4JHFQhJDrhJBZQsg8IeTbaf7+zwkhU4QQGyHk54SQroS/RQghY7GfO1K0R4m8ZeXQVm3E1ZjQb7PZ0N3dLanQL5Ausi3GgcNs5YX+N3Io9AuYYlV1EylGm70/wwv9X4vpnDabDYC0Qr+AUtJVy5s+fL7iFVOii4uLODg4yFkglK5vKpWsHRQhhAHwXQCvABgG8A1CSOq81grgKqX0IoAfAfg/Ev52SCm9HPt5M9v2KJGNPT8+nHPj5pVWaDQEa2tr8Hq9OekAQPrIttiIRilujznw5f56NFTwQr9UO/rTweq1ijhl2mzl0FhhwG/ESrjY7XZ0dnZKKvQLpHNQxejULVYHCEk+2aWsrAx9fX2SP8tkSJ/dKDabnRQpeupTAOYppYuU0iCAHwK4kXgBpfQ+pfQg9vJXANoleG7J8Pa4E1GKpH08Wq1Wkh396VDCwPHp0hY476FoM0Hoz5VTzxTZFpPNtn1BfDC7gRuXW0Wh3+Px5DYQKnKnTimFZYzD0911aK02IhAIYHp6GiMjI5Kc7JKKUadVjG53EqRwUG0AVhNer8Xey8TvAPhJwusyQsgDQsivCCE3M91ECPlW7LoHbrc7uxYXGRYrhwttVehrrEAkEhGFfoPBkJPnKSH1YhnjwOoZvDTM7+i32+2oq6tDS0tLTp5nSrOKr9i4a3ciFKFJRxvlQugXYBWw8nFs1YtHnuQSLuFwOGdO3WRgFKPbnQQpHFS6BGhaaxFC/nsAVwH8u4S3OymlVwH8EwB/QQjpTXcvpfR7lNKrlNKrUpyfVizMb+zBzu2Ig8bc3BwODw9z1gEAwKg/GqUVU57bH4rgxzYnro80g9Vr4fV6sby8nBOhX8Co1x6poVVsA4fFymGgqRzDLcklXIxGY06ep4SFJRYrB4NWg+sX+BWOdrsd1dXV6OjoyMnz0i3NVzJSOKg1AIn/N9oBOFIvIoS8COBfAniTUhoQ3qeUOmL/LgL4AMAVCdqkGCxWBzQEeONS/GgjlmVzIvQLmPQMgpEoQpFo0vvFMth+MLuBPX9YdOq52NGfCpvBZsXCyuYBHixv42ZsQ/Pi4iJ8Pl9OAyGTXotgOIpwgs2KKRAKRaJ42+bEi8NNqCzTYW9vD4uLi5Kf7JIIq+NtFokm98Vi6ZunRQoH9SmAfkJINyFED+DrAJJW4xFCrgD4f8A7p42E92sIIYbY7/UAngEwJUGbFEE0yue3n+1vQGNFGfx+P2ZnZzE6OgqGYXL23Exl34uFtz7n0FBhwJd64zv6Ozs7UVNTk7Nnpiu5UUwzKMsYByC+oVkQ+vv7+3P2TNFmKWm+YrHZL+bc2PIFceuy9CVcMhEvUxJP8xWTUz8tWTsoSmkYwO8DuAdgGsDfUUonCSHfIYQIq/L+HYByAH+fspx8CMADQsg4gPsA/oxSqjqoGA+Wt7G2fYhbV/jVQbkW+gWECrGHRTjYeg+CuD+7gTcvtULLaOByueDxeHI6ewLiJTeKUcCmlMJi5fDF7lq0VRslL+GSiUwlzIsFs9WBGlaHrwzET3ZpbW1FfX19zp6ZKXgshr55FiT59lFK3wHwTsp7f5zw+4sZ7vsYQG5HjiLGbOVg1MV39AtCf2tra06fK0S2qZU7iwFB6E9c8ajRaDAyMpLT58ZnUMmRbTEMHLa1HSx6fPgfnuPTxjMzMwiFQrkPhMTimMVnsz1/CO9OuvBbVzug12qwsbEBl8uFa9eu5fS5mWbqSkU9SUKmBMIR3LU5cG2kCSaDFjs7O1haWsppflvAqDsa2RbLwGGxcuhvLMdIa1zoHxgYyJnQL5Cpqm4xYLZy0Gs1uD7K65w2mw1VVVXo7OzM6XOLOZV8b3IdgXA0SeeUsoRLJtg0Th1Q7gxKdVAy5f6MG7tphP5cR7VAPMVXbBtPV7cO8OlSXOh/9OgR9vf3c57eA9JX1S0Gpx6KRPH2uAMvDjWiysiXcMm10C8gzKBST+CQu80APhDqrGXxRGe1uKG5t7cX5eXlOX2uWFA0pM6gVAqIxcqhvtyAZ/vqRaG/o6Mjp0K/gDGNeF0Mg+1tUeiPH21kMBgwMDCQ82cXa7XTD+c92PQFxfMK8yH0Cwg2S03xyR3Xjh8fLXjEQGhlZQU7Ozt5sVmmmbrc++ZZUR2UDNk5COH9mbjQv76+DrfbnZeZAFCcZd8ppTBbOTzVXYv2GjZvQr9AfHVVcUW25s85VLM6PH+eL9lis9nQ0tKCfOw1zPQ9k/tge2ecA0052UWn0+H8+fM5f7Y4Uy8yp35WVAclQ96ZcCIYieZd6BcoRvHazu1gwR3f0T87O5sXoV+A1R1N8QHyHmz3A2G8O+XCaxdaoNdq4Ha74XQ682Yz8XtWbE7d6sDljmp015vEEi5DQ0OSl3BJRzFrnWdBdVAyxPw5h94GE0bbeKHfbrejv78fLMvm5fnGNHluuWO2ctAzGryaIvR3dXU95k5pYA3CbKB4Unz3Jlzwh6JHSrjkWugXiC8zLx7Bf8a1i2nnrmizhw8fIhAI5M2pF2v6/ayoDkpmrG4d4JOlLbFE+dLSEvb39/PWAYDi23Qajgn9Xx1qRBXLC/0LCwt5EfoF4kvzi2cGZRnj0FFrxJMJJVx6enpyLvQLFOOSaYvVAUZD8PrF+Mku5eXl6O7uzsvzTWlSfEpGdVAy4844f0pUYonyfAn9AmVaBoQUTyf4cN4Dz35QXPGYT6FfoExbXIPt+q4fH817cOty/oV+AWE7Q7E4db6EC4fnBhpQV577Ei7pEGxWTKnkbFAdlIyglOKtz9fwhXM16KhlEQqF8ir0C2g0BEYdUzQzKIuVQ5VRh+fP88K+3W5Hc3NzXoR+AY2GxAo9Fke66u1xB6IUuJEi9OeqhEs6hO/ZYZEc2/PrR1tw7vjFQGhychLRaDSvTl20mbrMXCXfTDp2Y0I/Xy5rZmYGwWAwrx1AIF0pBDniC4Rxb3Idr11sgUHLwOPxwOFwFMxmxSL4m60cLrVXobehHOFwGFNTUxgcHMyL0J9IutIucnXqZusaTHoGLw3FS7g0NDSgubk5r+1g9Yy6UVcl/whC/2sX4vntysrKvAn9iRRLMbl3p1w4DEWSVjzmU+hPJF3RQjkOHA/X9zDp2E0q4eL3+wvj1A1HZ+pyxB+K4Cd2F66PtsCoZ7C9vY2VlZW86pwCqd8zudpMClQHJRPCkSjujDvwwmADqlgdfD4f5ufnC9IBgOKJbM1WB9prjHiys0bc0d/d3Y2Kioq8t8WUUvZdrgOH2crFhP54iXKTyZTTEi6ZYHXaotjc/PPpDewFwvjaE/kr4ZIJk1575JxMOfZNKVAdlEz4aGET7r2AOBMohNCfiFEv/zz3xq4fH865cfNyGzQagtXVVXi9XtnYDJDfwBGNUty2cvhyfz0aKgoj9CeSrmih3GwG8E69qdKAp3viJVy6urpQXV2d97ak2kyOfVMqVAclEyxWDpVlWnFHvyD0NzY2FqQ9qbMBQH4Dx52Y0H8zRegfGhoqSHtSZ51yHDg+WdqCY8cvBkL5KuGSCVMRpPi2fEF8MLuBG5fbwGgInE4nNjc3CzJ7AhBbjCN/py4FqoOSAb5AGD+dcOG1iy0o0zHY3NwEx3EF6wBAcURpljEOF9ur0NdYjkgkgsnJyYII/QJsETh1i5WDSR8v4WKz2VBfX4+WlpaCtMeo08p+BnXX7kQ4SsXzCm02GxiGwfDwcEHaw+q1RbMYJ1tUByUD3ptax2EoktQBgMLktwVMMk+9zK3vYYLbFW0mCP2FtBkr87SoPxTBXbsT10abYdQz8Hq9BRP6BUwG+S8zt1g5nG+qwFBLRV5LuGSimLYzZIvqoGSA2cqhrdqIL5yrFYX+np6eggj9Aka9VtYzKMsYL/S/cSl+cjnLsujt7S1Ym9ItLJET92c2sOcPJx1tBBQ2EEpdmg/Ia7Bd3vThs+V4CZfFxUX4fL6C20zOfVNKVAdVYNx7Afxizo2bV1qh0RCsra1he3u7oB0AkHeUFo1SWKwOPNvHC/1+v7+gQr9A6tJ8uW1uNls5NFQY8KXeeAmXzs7OvJRwyYRRp5X1kmmL1QFCkku4lJWVob+/v2BtYvXyT4tKhSS9mRBynRAySwiZJ4R8O83fDYSQv439/deEkHMJf/uj2PuzhJDc1kuWIcKO/sT0nlarLZjQL2CKbdQVvvhyGjgeLG+D8x7KRugXYFNsJie2fUHcn93AjUutYDQELpcLHo+n4DYzGRj4guEkm8nFfpRSWMY4PN1dh9ZqI4LBIGZmZjAyMpLXk11S4WdQYVn2TanJ2kERQhgA3wXwCoBhAN8ghKSqh78DYJtS2gfgzwH829i9wwC+DmAEwHUA/1fs80oGs5XDaFsl+psqkoR+g8FQ0HYZ9VpQCvhDUfE9uQwcZusaWD2Dl0f4Hf02mw11dXVobW0taLuMegaUAoGw/Gx21+5EKEKTVjwWUugXSLWZnAbb8bUdPPLES7hMT0/ntYRLJox6BtGU75lSkWIG9RSAeUrpIqU0COCHAG6kXHMDwA9iv/8IwFcJ/028AeCHlNIApfQRgPnY55UE8xt7sHM74uxpfn4eh4eHBU/vAYknTfMpK7kMHP5QBD+2OXFtpBmsXoudnR0sLy/j4sWLBW9jah2tQrcnEYuVQ39jOUZaK0Whv7+/v2BCvwCb5vBTuTh1i5WDXqvB9Qv8ike73Y7q6mp0dHQUtF2mNKfAy8VmUiOFg2oDsJrwei32XtprKKVhADsA6k54LwCAEPItQsgDQsgDt9stQbMLj8XqgIYAb8pI6BdIVwpBDp3gg1n5Cf0CRpnabGXzAA+Wt3HribjQn+8SLplgDfJ06qFYCZeXhppQWabD3t4eFhcXC7riUUCsqiuz4DEXSOGg0lkntVdmuuYk9/JvUvo9SulVSunVfJ5SnSuiUT6//UxfPRory+D3+zE7O4vR0VEwTOGznPFOwA+2cukEcaE/vqO/o6OjoEK/gEmmNrs9xgGIl3Cx2+0FF/oFxLLvIXk59Q/nPNj0HS3hIqdA6FBmgVAukMJBrQFInPO2A3BkuoYQogVQBWDrhPcqks9WtrG2LT+hXyA1xScHvAdB3J9x481LrdAyGrhcLrjdblnbrNADB6UU5jEOX+yuRVtM6C9ECZdMpM7U5eLUzVYO1awOzw3ES7i0tLTktYRLJkyG5DpacrFZLpDCQX0KoJ8Q0k0I0YNf9HAn5Zo7AL4Z+/0fA3if8j33DoCvx1b5dQPoB/CJBG2SPWYrB6OOwbWReH67tra24EK/gBxTfO/YXQhGokknl2s0moIL/QKpka0cBg47t4NFd1zon5mZkYXQL8DKsELsfiCMd6dceP1iC/RaDdxuN5xOp2xsZtQlp/iAwvfNXJF1CEUpDRNCfh/APQAMgO9TSicJId8B8IBSegfAXwP4L4SQefAzp6/H7p0khPwdgCkAYQC/RymV705HiQiEI7hrc+LaSBNMBl7oX1pawvPPPy+LQQ2QZ4rPYuXQl0boZ1m20E0DkLBIQkZO/a3P+RIurySUcKmqqkJnZ2dB2yWQbgZVaJv9dMIFfygq1mUrZAmXdAgzqIOAfPpmrpBkjk8pfQfAOynv/XHC734A/02Ge/8UwJ9K0Y5i4YNZN3YOQ2J+W05Cv4BRZumq1a0DfLK0hT+4dl52Qr9Aqs0KPXAIQv9XhxpRZdRhf38fCwsLeOaZZwreNgHRQcmoOKbFyqGzlsUTndXiyS69vb0oLy8vdNMAyNNmuUI9SaIAmD/nUF+ux7N98R397e3tqK2tLXTTRMQoTSYzKEHoF1Y82u12GAwGDAwMFLJZSbAyE68/nE8v9MvJqadL8RXSZuu7fny04BGPNlpZWcHOzo7MgkfeZocpgVChZ565QHVQeWbnIIT3ZzbwRkzoX19fl5XQL8DqklN8QOE6AKUUZiuHp7pr0VHLyk7oF0hN8RXaqVtiQv8LsRIuNptNNkK/gNwWSdwZc4BS4GbC0UY6nQ6Dg4MFbVciwj4oX0CdQalIzDsTzrRC/8jISIFbloyYrpLB/pQJbhcLCUL/7OwsgsGg7Jx6fJFE4WcD+4Ew7k268NqFZKFfTjMBQH6pZLOVw6WOavQ0lCMcDmNychJDQ0MFK+GSDmPK0nx1BqUiGWYrh54GEy60VclS6BfQazXQMSQpz12oDmC28kL/q6O80G+z2VBZWYmurq6CtCcTeq0GWg2RxWzg3UlB6I/rnHIS+gX0jHxsNuvaw5RzF7dis6e5uTkEAgHZOXU9owGjIbLaApIrVAeVR9a2D/DJoy18LZbfXlpawt7enuw6gIBRxxR8yXQ4EsWdcQd+c7ARVWxc6JfDjv50yKXkhtnKob3GiCe7amRTwiUdhJC0Zd8LgdnKl3B5PeFkl/LycvT09BS4ZckQQvgyJSWwik91UHnk9hi/B/lGwsnlchP6EzEZkivEFmIG9dHCJjz7AVHon5yclJ3QnwhfCqGwNtvY9eOjeQ9uxQKh1dVVeL1e2QZCpgSbFSpdFY1S3B7j8JX+etSXG3B4eIi5ubmCl3DJRKmUfZef5RWKIPR/4VwNOmpZhEIhTE9PY2hoCDqdrtDNS4sxVj4CKFyUZrFyqCzT4oVBXti32Wxobm5GY2NjQdrzOBJnUIWy2Z1YCZfEQEin0xW8hEsm5DDr/PWjLTh3/Lj1BL/3SW4nu6TC6rXqMnMV6Zh07GJ+Y1+cCchV6E8kNUrLd4TmC4Tx0wkXXrvYCoOWgcfjgcPhkLfNDEzBVz6arRwutlehrzEu9A8ODspK6E/EqD+aSs633SxWDiY9g5eG4iVc6uvr0dzcnNd2nBRWzxxZwKTOoFTOjNnKQccQvHYhWeg/d+5cYRt2DKxeW9BTpt+dcuEwFJG90J8IqzuarsonD9f3MOnYFUu4zM3Nwe/3y9qpm/Ra+Aoo+PtDEbxjd+L6aAuMegbb29tYWVmRRQmXTMhh1pkPVAeVBwSh/4Xzjahm9fD5fJifn5et0C/A6pmkU6bzjdnqQHuNEVdjQr/NZkN3d7fshP5ECi34W2JC/xsJG5pNJpPshP5ECj2Den9mA3sBeZZwyYRRBrpdPlAdVB74eGET7r2A2AHkLvQLpOop+ewAG3t+fDjnxs3LbdBo4kK/3G1mMhzVoPJlN17od+DL/fVoqOCF/ocPH8pW6Bco9GzAbOXQWGHAb8RKuNjtdnR2dqK6urpgbXocJnUGpSIVcaE/vqO/qalJtkK/AKvXFuyU6bfHnYhS4OaV+JJfrVYrqx396TDqtEdWV+WLT5e2wHnlW8IlE/zKx8IsLNn2BfHB7AZuXG4FoyFwOp3weDyyt5kxzWIcdQalcmoOgmH8dNKF1y62oEzHYHNzExzHyb4DALHItkAbdS1WDhfaqtDXWIFIJCIK/QaDIW9tOAsmAyPqKfkeOCxjHFg9g5eGeaHfbrejrq4OLS0teXn+WeFnUMmBUL5s9mO7E6EIFRcv2Ww2MAwjmxIumTClbGdQKqqDyjHvTa3jIBgRRWubzQYAshb6BYx6piBH+s9v7MHO7YiDRjEI/QKF0qD8oQh+bHPi+kgzWL0WXq8Xy8vLshb6BQqZ4rNYOZxvqsBwS7yEy8DAAIxGY0Hac1LSbWdQZ1Aqp+atzzm0VRvxhXO1Yn67u7sblZWVhW7aYzHptQhGoghHonl9rtnKQUOANy7FaxixLIve3t68tuMssDotgmHeZvkcOO7PbGDPH5Z1CZdMsHotAuEoIlGaV5utbB7gs+Vt8eTyxcVF+Hy+orCZUc+INlMyqoPKIe69AH4x58aNy63QaAjW1tawvb1dFDMBILnuTL4GjmiUwmJ14Nn+BjRWlMHv92N2dlb2Qr+AWKYkz6sfzVYODRUGfCkm9NtsNnR2dqKmpiav7TgLbJoDY/OBJVbC5UbCyeVlZWXo7+/PazvOgkkfr6qrzqBUzsTbsR39iSeXa7Va2e7oTyV+onn+BtsHy9vgvIf4WpEJ/QKJZd/zNXB4D4K4P7uBG7ESLi6XCx6PpyhmAkDiieb5sxmlFBYrh6d7atFabUQwGMTMzIzsSrhkIvF7VkjsdjsODg5y9vmqg8ohljEOI62V6G8qLqFfoBBRmtnKC/0vj8R39NfV1aG1tTWnz5WK1PpG+eBuGqFfjiVcMpFaHDMf2NZ2sOiJl3CZmZlBKBQqmkCILYBTT2VjYwNvvfWWqKvngqwcFCGklhDyHiFkLvbvkXwCIeQyIeSXhJBJQoiNEPLfJvztPxFCHhFCxmI/l7Npj5yY39iHbW1H7ADz8/M4PDwsmqgWSI5s80EgHMFdmwPXYkL/zs4OlpeXZb+hORGhQqwvEM5bmy1WDv2N5RhpLS6hX8CoK0wgpNdqcD2hhEtVVRU6Oztz+lypEL9nBVzJl4+TXbKdQX0bwM8ppf0Afh57ncoBgH9KKR0BcB3AXxBCEnfA/QGl9HLsZyzL9siG22O80P9mwtH9xSL0C8RnUPmJ0u7PuLGbRugvlqgWSCj7nqfl+atbB/h0KS70P3r0CPv7+0UVCOV71hmKRPH2uAMvDjWiysiXcFlcXCyKFY8CbJpUcj4RFnz19vaivLw8Z8/J1kHdAPCD2O8/AHAz9QJK6UNK6VzsdweADQDyqTmdA4STy5/pq0djZVzoHxkZAcMwhW7eiUlX7TSXWKwc6ssNeCZB6O/o6CgKoV9AGDh8edrgbLEeFfrlXMIlHYkpvnwEQh/OebDpC4pbPyYmJkApLXqnns8U3/LyMnZ2dnIePGbroJoopU4AiP177NEIhJCnAOgBLCS8/aex1N+fE0IyijOEkG8RQh4QQh643e4sm51bHixvY207vqN/enq6qIR+gXRRWq46wc5BCO/PbODNmNC/vr4Ot9tdVIMGEE+95MNmlFKYxzg81V2L9hoWwWAQ09PTGBkZKQqhX0BI8R3mKRAyWzlUszo8fz5+sktLSwsaGoonbmYT9OFCIJRwOX/+fE6f81gHRQj5GSFkIs3PjdM8iBDSAuC/APhnlFJhY80fARgE8AUAtQD+MNP9lNLvUUqvUkqvyv2LZLZyMOoYXBvhj+q32Wyora1FW1tbgVt2Okxinjv3qZe7dieCkWjSisdiEvoF8pmusnM7WHTHhf7Z2dmiEvoFhBmUL5B7p74fCOPdKRdev9gCvVYDt9sNp9NZdDYr5CKJcDiMqakpDA0N5byEy2PDLErpi5n+RghZJ4S0UEqdMQe0keG6SgB3AfwrSumvEj7bGfs1QAj5jwD+xalaL0N4od+Jl0eaYDLwQv/S0hKee+65oslvC8SXsuZe8LdYOfQ1lmO0jRf67XY7+vv7wbJsTp8rNYlp0VwPHGYrBz2jwasXilPoFzDq87d37N6EC/5QciAk9xIu6RBTycFI3tdiP3z4EIFAIC9OPdv/tDsAvhn7/ZsAbqdeQAjRAzAD+M+U0r9P+VtL7F8CXr+ayLI9BeeDWTd2DkOi0D8xwf8nFVuEBuQvz726dYBPlrbEEuVLS0vY398vSpslLizJJeGY0P/VBKF/YWGhqFY8CsTTonkIhMY4dNQa8URnjSj09/T05FTozwWs4ajN8jWDstvtKC8vR3d3d86fla2D+jMALxFC5gC8FHsNQshVQshfxa75LQBfAfDbaZaT/7+EEDsAO4B6AP97lu0pOLzQr8eX++pFob+9vR21tbWFbtqpMeoSorQccmfcASB5xWOxCf0Cgs1ynXr5cN4Dz34wKRAqhhIu6RC/Z4HcBkLru358NO/Brct8ILSyspIXoT8XJH7P8km+S7hkpaRSSjcBfDXN+w8A/G7s978B8DcZ7v/NbJ4vN3YOQ/j59Ab+u6c7xR39GxsbePXVVwvdtDOh0RAYdQwfpbG5GWwppXjr8zU8da4WHbXFK/QLCDbLtXhtsXKoMurw/Hlej7Xb7Whubi4qoV+A0RCU6TQ5L455Z4w/2eVGQnpPp9PJvoRLOhgNgUGrybsGNTk5iWg0mjenrp4kISE/UYjQnwirZ3I6g5p07GLB7RNnArOzswgGg0UZ1QoIJ03nauDwBcK4N7mO1y62wKBl4PF44HA4itxm2qTNzbkYbM1WDpfaq9DbUJ5XoT9XmAy5L7nx0wknPp73iK9tNhsaGhrQ3Nyc0+cKqA5KQt6ycuhpMOFCW5W4o7+vr6/ohP5EWAOT0yXTgtD/2oX4yeWVlZXo6uqS9Dn5JLGEeS64N+nCYShS9EJ/ImyObTbr2sOUc1e0mVDCpdi2MSTCz9Rz1zf9oQj+xd/b8Bc/mwMAbG9vY3V1Na86p+qgJGJt+wCfPNoS89tLS0vY29sr6qgW4MtH5CpKC0eiuD3mwAuDDahidfD5fJifny9KoT8Rk14LXw7Fa7OVQ3uNEU+mCP0VFRWSPief5HrWaRnjwGgIXk/QOU0mE3p6eiR9Tj4xGZicHuT8s+l17AfCWN7yAShMCRfVQUnE7TFe6L9xOX5MT7EK/YkYczhwfLSwCc9+QIxqi1noTySXRQs3YkL/zctt0GgIVldX4fV6i3omAADGmFPPBdEoxW0rh6/016O+3IDDw0PMzc0VTQmXTBj12pyWwhFOKVnfDeAwGIbNZkNXVxeqq6sfc6d0FO//HRkhHG10tasGGF7FIAAAIABJREFUnXUsQqGQmN/W6XSFbl5WmAy5G2wtVg6VZVq8MMjv6BeE/sbGYw8kkT1CuioXs8A7sRIuN1OE/mIp4ZIJkz53qeRPlrbg2PGLNiu2Ei6ZYGMLmHLBli+ID2bdaK/hDxz+fHYZm5ubeQ+EVAclAZOOXcxv7CtK6Bcw6rQ5mUH5AmH8dMKF1y62ikI/x3FFPxMAYoJ/jvaOWcY4XGyvQl8jL/QLJVyKVegXyGXZd4uVg0nP4OXh+Mku9fX1aGlpycnz8oXJwCSdviEld20OhKMUv/dCHwDgo/GHYBgGw8PDkj/rOFQHJQEWKwcdQ/D6xfiO/srKSpw7d66wDZMAfuCQPkp7b2o9SegvphLlj4OfQUlvs7n1PUxwu+Ihp/Pz80Uv9AsY9dqcnL7hD0Vw1+7EtdFmGPUMvF4vVlZWil7nBHib5erUfLOVw/mmivhxbY8cBSnhojqoLIlEKW6PO/DC+UZUs3pR6B8dHS36DgDEU3xSDxxmK4e2aiOudtWIG5qLXegXEJbm58JmjIbgjSIu4ZIJU45mUO/PbGDPHz4SCCkhu8HqmJycmr+86cPnK17cvNKGGlYHVqfBpp8UxGaqg8qSj+Y9cO/Fhf7JyUlFCP0CRp1W8uW/7r0AfjHnxs0rrdBoCNbW1hQh9AuweultFo1S3B5z4Nm+ejRUGOD3+/O6oz/XGHOkQZmtHBorDPhSb/xkl87OzrwK/bkiV1tAzFYOhPAlXAghqNGF4SMs+vr6JPn801D83+wCY7FyqEgQ+m02G5qamtDU1FTglkmDycAkra6SohOIQv/luNCv1WqLXugXSE2LSmGzT5e2wHnjJVwEof/SpUtZf7YcEJbmS5mm2vYF8cHsBm5cbgWjIXC5XPB4PIoJHlk9g4NQRFKbUUphsXJ4ursOrdVGBAIB6IO78OvKC3Kyi+qgsuAgGMZPJ1147UILynQMNjc3FSP0Cxj1DCgFQtHHX3tSLFYOo22V6G+qQCQSEYV+gyFjObCiwqhnEKVAUEqbjXFg9QxeHuEDH5vNhrq6uqIX+gUEm4WpdLOBu3YnQhEqLl4aHx8viNCfK1i9FpEoldRmY6teLG0eiIHQzMwMynGI7YAGkWj+CiIKqA4qC96bWsdBMHKkRLmSHBQbO5TSL1HGan5jD3ZuB7eutPOv5+dxeHiomKgW4PUUABCyfNkOHP5QBD+2OXF9pBmsXguv14vl5eWiKlH+OIST8/1hCVc8WjkMNJVjuKVSPNmlv78/70J/rojbTLpIyGLloNdqcP0CvzjCbrejycQgFKVw7fole85JUR1UFpitHFqryvDUuVoxv93d3Y3KyspCN00yhGP9A7GBI9vB1mJ1QEOANy7FVzyyLFvUO/pTEcpHSDXYfjDLC/1KDoSEMiWBiDQ2W9k8wIPlbdyMlXBZXFyEz+dTVCDEShwIhSJRvG1z4qWhJlSW6bC3t4fFxUVc7uODyeVNX1affxZUB3VGeKHfgxtX2kShf3t7W1EdAIh3AikGjmiUwjLG4dn+BjRWlMHv92N2dhajo6NgGCbrz5cLxhSbZTtwmK0cGioM+FJvnRgIdXR0oKamJuu2ygXRZhIFQrfH+FMQEk92KSsrQ39/f1afKyeMQh0tiQKhX8y5seU7WsLlK0/wKdGVzQNJnnMaVAd1Rn5scyASpfjaFWUK/QLxNAL/OpuB47OVbaxtH+LWFX6ZtFJ29KcilDAPSDBweA+CuD/jxpuXWsUSLkoS+gWE75kUg61wsssXu2vRVm0US7gMDw8XZQmXTJgkD4QcqGZ1eG4gXsKltbUVI92t0DEEy1uqgyoaLFYOI63JQv/58+cVI/QLsBKmXsxWDkZdfEe/3W5HbW0tWltbs/5sOWHUCTbjX2czcNzNUMJFKUK/QOr3LBub2dZ2sOjxJQn9oVBIcU49ddaZDXv+EN6ddOH1iy3QazVwu91wOp24cOECGA1Bew2rzqCKhQX3PsbXdsQOoEShXyA1xXfWgSMQjuCuzYlrI00wGbTY2dnB0tKSooR+AWEGJYUGZbFy6Gssx0hrXOgfGBgo6hIu6WAlHGzNMaH/lYQSLlVVVejs7Mz6s+VEqtaZjVP/6YQLgXBUXLyUWsKls5YVTzXPJ1k5KEJILSHkPULIXOzftElxQkgkodz7nYT3uwkhv47d/7eEkKI4UMxi5WJCPx/52+12GI1GRezoT0Wq1VX3Z9zYOQwdEfpLwamfldWtA3y6tI1bMaH/0aNH2N/fV9TiCAGpUsmhSBRvjzvw4lAjqow67O/vY2FhQRFHG6ViknDlo2WMQ2ctiyc6q8USLr29vSgvLwfAO6hinEF9G8DPKaX9AH4ee52OQ0rp5djPmwnv/1sAfx67fxvA72TZnpwj5Lef6atHU6VyhX6BeOqFf33WgcNi5VBfbsCzffWKFfoFjBJFtnGhP360kRJKuKRDWC3qj2S3ZPrDeQ82fUFxE7hSSrikQ6rFOK4dPz5e2BRXPK6srGBnZycpEOqqY7HrD8N7EMy+4acgWwd1A8APYr//AMDNk95I+HDmNwH86Cz3F4rPlnmhX+gA09PTCIfDiuwAgDSpl52DEN6f2RCF/vX1dbjdbkXOBABpIlshEHqquxbtNaxihX4BYb9dIMsZlMXKoZrV4fnz8ZNdWlpa0NDQIEk75YSwNN8fym4GdWecA6XAzYRASKfTYXBwULyms5ZPKS/neRaVrYNqopQ6ASD2b6ZCPmWEkAeEkF8RQgQnVAfASykVzoRZA9CWZXtyjtnKoUynwbXR+NH9tbW1aGuTfdPPhBCl+bOI0t6ZSC/0j4yMSNdQGSFFZDvB7WLBHRf6Z2dnFSn0Cxgl2HS6HwjjXuxkl1ShX4mk9s2zYrY6cKmjGj0N8RIuQ0NDSSVcuupMAJD3lXyPDcUIIT8D0JzmT//yFM/ppJQ6CCE9AN4nhNgB7Ka5LqOlCSHfAvAtAAUTO4PhKH5sc+LaSDPKE4T+5557TnH5bQE9o4FWQxAIU5x1faLZyqG3wYTRNl7ot9vt6O/vV5zQL6BnNGA0BP4wxVnLVZqtHPSMBq+OJpdw6erqkq6hMsKg5W0WiFBocTanfm/CBX8omnRyOSFEsQ7KoNVAQ3inzuJsNptx7WLauYt//Qa/KnRubg6BQOCIzYQZ1EqeN+s+dgZFKX2RUjqa5uc2gHVCSAsAxP7dyPAZjti/iwA+AHAFgAdANSFEcJLtABzHtON7lNKrlNKrhZqufzC7kST0T0xMAFCm0C9ACIFRz5x5NrC2fYBPHm2JQv/S0pJihX4BQghYPXPmTafhSBR3xh34zcFGVLHKFvoFCCFgdUxWaVHLGIeOWiOejJVwsdvt6OnpEYV+pUEIgUmvzc5mVgcYDcHrCSVcysvLj5zsYtQzaKwwFF2K7w6Ab8Z+/yaA26kXEEJqCCGG2O/1AJ4BMEX5XnsfwD8+7n45YbZyqDPp8eW+egD8/8z29nbU1tYWuGW5xaTX4vCMee7bY3zMcSPh5HKlCv2JsHrmzKmXD+c98OwHxEBIKOGilJPLM2HUM2deWLK+68dH8x7cuswHQqurq/B6vYoOHgHeZmcNhPgSLhyeG2hAfbkBh4eHx5Zw6axlsZLnFF+2DurPALxECJkD8FLsNQghVwkhfxW7ZgjAA0LIOHiH9GeU0qnY3/4QwD8nhMyD16T+Osv25IydwxB+Pr2BNxKE/o2NDUXPBATYhBnUaRCE/i+cq0FHLYtQKCQK/TrdWZNfxQGbENmeduCwWDlUlmnxwiCfKbDZbGhublak0J+IyXD22cDbsRIuNxJ0zlShX4mwegaHZyw18KtHm3Du+JMCoWg0mtGpd9bl30FltRyIUroJ4Ktp3n8A4Hdjv38MIO0oHkv5PZVNG/LFTzLs6Bc2sikZPrLl15mfZrCddOxifmMff3qLt9Hs7CyCwaDio1ogNoMKn35Jri8Qxr3Jddy80gaDloHH44HD4cDLL7+cg1bKC6OOgT8cOtO9ZiuHS+1V6E0Q+v//9s49Nq7rvvOf37w4M3w/RIqiREoyqbdsyZGtOnJay/ErjmPJ2XSRoi1SdAsj2Lbb3SRtUwQIuovdRRctkLbIYhdBFk3a7Tbxpibt2HHsOGvHsVPYVkxphtSLpChKHFIiKfEtvnn2j3vvzB1qOBxynpw5H2Cg4Z37+N2f7j2/c873nPPbt29flNCfj/g9LmaXjHFmG6kIFXucPL7fSOESDAapqalh69ZYQw6gqaqY1vYQswtLeN2ZmVKjV5JIkNb2ELtrirl3e3lY6G9ubs5bod/ORvu5LaH/mcOR/u18FvrtbFSDeuP8DWYWlvjs/ZGKkH1Gfz5TXLSxLr7LNyfpHJgItwS6urqYnZ0tmIrQRqaAzC4s8VrwBk8dqsfncTI6Osq1a9firuzSVO1HKUNXzhQ6QCVAaGyG93tvhyey9fX1MTk5WRAvAGysn9sS+k/u20K538309DTd3d15LfTb8XlcG1r4tLV9gO2VPj7WGBH6d+3aRWlpaRqszC18G6wItbWHDKH/3sjKLsXFxXmVwmU1fLYuvvUE9Z9eGGJybjFqxCPET+HSWJ35uVA6QCWANaPfnqLc4/HkvdBvYXRXra+f+xc9txienAu/APk8oz8WxRsI6kOTs7zbNczpI0YKl0IR+i38biez6yxsDaF/gE+01LCldG2hP99IpnejtrSIh8wULsFgkMbGRioqKlY9pikLk3Xz/38wSZRStH4U4lhTJY3VhtB//vz5ghD6LTYi+FtCvzWjPxgMUldXR23tanO58wvfBoL6y2cNof/00UiXqMvlynuh38JftP5h5h9cvU1obCZcEcrXFC6rYa88Jvpu3p6e5+1LQ5w6sg2nQxgcHEwohUtVsYdijzOjAyV0gFqDzoEJuoamwv3bhST0W6x3yPSd+UV+3HmDT99bj9ft5NatW4RCocLz2XqD+tkQhxvKaa6NpHDZt29f3qVwWQ1DT1lfYWsJ/fYULjU1NdTX16fNzlzCPjQ/UV4NDrK4rKJWLnc6nWumcBERGquLdYDKJdraQ7idwqdtS/eXlpYWhNBv4fesr+vljc6b3JlfiuoSBQpC6LdYb9dL181JOkKFKfRb+Nep280uLPFqcJAnD23F53EyNjZGX19fweicYA7NX2e3aOtH/eytK2V/fWlUChefz7fmsU1V/oymftcBKg5Ly4qXzg3wyN5aKos9UUJ/IfRvW/g9LhaWYTnBsqO1PURDhY8HdlZFzegvKytLr6E5hM/jZH5JJeyztrNWCpdIRcjv9+dlCpfV8Nt8lkhh+9bFISZn1yf05xs+tzFHMdHnrO/WNB9dGwsP+Lpy5QrT09MJ+6yp2s/10RmWE71gkhROKbsBftEzEiX0rzWRLV+xVjRfxLFmwTE8OcfPu4Y5fXQbDofQ39/P6OhoQRUaEFlpOhGfLS8r2toH+ETLFmpLo1O4FFZFyHjOlhIsllrbQ2wpLeLj90RSuDQ2NuZlCpfVsJJjJuqztnZrZZeIzun1emlpaUno+MZqP/OLy9yYmN2AteuncJ7+DdDaHqK0yMWj+6KF/rq6uixblll84QC19uQ8a0a/vXvP5XKxf//+tNqYa6zHZ2f6Rgta6Lew8mgt4FwzqI/dmeetS0Ocus8Q+m/cuMHIyEjBVYQiPlu7IqSUou1siF/ZXcW2Ch/z8/NcvHhxXSlcMp12QweoVbgzv8jrHTd4+nBE6O/v7y+4FwAitbQFtfZL0HY2xKGGMlrqClPot7BaA4n4rLU9hN/j5ImDRsUnEAhQXV3Ntm3b0m5nLmHl0VpUaxdLrwYHWVhSYc3OEvrzNYXLalh5tBbV2hWhc/3j9I5EUrhcvHhx3SlcmqqMtBvXMpT+XQeoVfjJ+ZtMzy/x3P2F279t4XNHuqvi0T00RaB/PNx66u7uZmZmpiB95vck5rPZhSVeDQzw5MGt+D1GCpdCE/ot1tOV3PpRiJbaEg5uKwsL/S0tLQkJ/fmEVXlMxGdt7SE8LgdP2VK4VFRUrCt90bYKLy6HZGwknw5Qq9DaHmJbuZcHTaE/EAiwa9eughL6LcIFxxq1tJdMof9Z29L9hSb0W9h9Fq/gePvSEBOzi+GWgFURKrTuPbB1V63xnF27dYczfaNhob+3t5epqakC91n8onxhaZkfnhvgsf21lPvcTE5OcuXKlXVXhFxOBw2VPt3Fl00MoX+EU0eNGf2hUKgghX6LRGpp1srlJ5prqC2LCP0HDx7E6czMwpK5hL01EI/W9hA1JUWcMGf0BwIBduzYUVBCv0Vxgi2o8Moutu699Qj9+YTfpnXG89m7XSPcmp4Pz32yVnbZSJmWybQbOkDF4JXAAEvLKmrl8kIU+i2sLr6FOI/Lmb5R+kcjQv+FCxdYWlrK+xxGq+FPQLweuzPPWxeHedaWwmV4eLggWwIQGVgS7zlTStF6NsTxXVU0mEK/lcIlUaE/n0i0IvRie4gKv5tf22OkbAkGg9TX128ohUtTtV+3oLJJW3uIA/Vl7DGF/o6ODvbu3YvX6822aVkh3IKK013V2h7C53by5EFjRn8gEKCqqqrghH4LfwKC/4+CN5hfWg6vXH7u3DkcDseaM/rzlbBuF8dnwdA4V4aTE/rzCbvPVns3J2cXeKPzBs/cW4/H5WB4eJjBwcEN+6yxys/4zALjdzaWGmU96AC1gp7hKc71j4dfgJ6eHmZmZgr2BQD7kOnYj8vc4hKvBgZ58mAdxUWG0H/16tW4S/fnO4l0vbS1h2iOIfQXQgqXWBQn4DMrhcunbCu7lJeXr0vozyfCo0XjTGd4vfMmc4vRueySSeHSaI7k68vASD4doFbwUrsp9Nsmsvl8voIU+i38NiE2VsHx9qVhxmcW7hL6C1WzA/AXxRevr9++wwdXb/OcFvrD+GxD82OxaAr9nzSF/qmpKXp6egpyxKOFvaUeryK0o8rH/bYULrt376akpGRD12wy025kQofSAcqG1b99ormGurLoGf2FKPRb+NzxJ522tYeoKfHwcHNkRv/27dupqqrKpJk5hd1nsQqOl88ZM/qtEY/BYJCioqKCSeESC/8aq2/8vHuEkan5cEWo0FK4xGKt6Qw3J2Z5r2eE544YFaFr164xPj6elM8yOVk3qQAlIlUi8hMR6TL/vWvokYicFJGzts+siJw2f/uOiPTafjuSjD3J8su+Ua7fngnP47lw4QKLi4sF/QIAOB1CkVNiFhzjMwv89MIQn9FCfxROh+AxfbYSpRQvftTPgzur2FHlL3ih3yLis9UrQuU+N4/sTV7ozxcsn622+sbLZwdQKnrEo9vtTiqFS3GRi5qSIq7leoACvgr8VCnVAvzU/DsKpdRbSqkjSqkjwKPAHeAN2y5/bP2ulDqbpD1J0doewut28OShyNL9lZWVNDQ0ZNOsnMDrdsTsenktOMj8UnT/tsPhKLgZ/bHwuR0xBf+O0AQ9w9MFncJlNbymz1YWtlNzi7xuCv1FLicjIyMMDAwUdDeyxWrPGRhl2n07Kti9pYTFxUXOnz/P/v378Xg8SV2zscq3KTSoU8B3ze/fBU6vsf/ngNeUUplLKJIg84vLvBIY5IkDWykpcjExMUFvb29BC/12fK7YLagX20Ps3lLM4YZyLfSvwOuSmMPMLaHfnsKlrKysoFK4rIbP5Yg5zPyNzhvMLqRO6M8nvKv47NKNSc4PTvCcqadbKVxSEdSbqos3RQuqTik1CGD+u1a61M8D/7Ri238RkYCIfENEVl2wTUSeF5EzInJmeHg4Oatj8PalIcZnFgp66f54eF2Ou1aS6B+9wwe9t8P921evXmVyclL7zMSo2Ub7bHFpmZfPDXBy3xbK/YbQb6Vw0RWhSGsgVlDfXunjY03RQn9paWmWLM0dVmt1traHcDqEZ2wruxQXF7N79+6kr9lY5WdwYpa5xaWkzxWPNQOUiLwpIh0xPqfWcyERqQcOA6/bNv8ZsA94AKgC/nS145VS31JKHVNKHUtHn3Pb2RDVxR4ebqkBjADV0NBAdXV1yq+1GfG6HXe1Bl46awj99tF7hS702/G6HHe1Ot/rucXI1Fx4Rn9nZ2fBC/12DJ9FB/WhiVne6x4Jj3i8fv06Y2NjuiJk4nPf7bPlZcVLZ0P8aksNNSVFzMzM0NXVlbIULk3VfpSC67dnkj5XPNa0VCn1mFLqUIzPS8BNM/BYAWgozqn+NdCqlArP7lJKDSqDOeDvgAeTu52NMT6zwJum0O82hf6bN2/qQsOG8RJEHhdraaMHdlayo8rPwsJCuH/b7XZn0dLcwQrqdtraQ5R5XZzcZ1SyAoEAW7dupbZ2rc6HwsB6zuxB/WUzhcupI9FCf6Gu7LKSWD57v/c2g+Oz4cpjqlO4WEPNr6d5qHmyofRl4Avm9y8AL8XZ9zdY0b1nC26CoV91JGnPhvhxxyDzi8tRI1200B+N1cVnvQSdAxN0D01poT8Ofne0z6bnFvlxxw0+fe82LfSvgjEYJ7o10HY2xL3by2muNYR+K4VLskJ/vuCLMYCprT1EscfJEwciK7vU1NRQX1+fkmuGJ+umOf17sgHqL4DHRaQLeNz8GxE5JiLftnYSkZ3ADuBnK47/RxEJAkGgBvjPSdqzIV78KMTummLu224I/cFgkObmZoqLi7NhTk7idUtUa6CtPYTbKWGhPxAIUFZWxs6dO7NkYe5hdfFZvHH+BjMLS1rnjMPK1kDXzUk6QhNRKVxmZ2d1RciGz+2Mmm83u7DEj4KDPHloKz6Pk7GxMa5du5bSAV81JR78Hid9aW5BJTXpQil1C/hkjO1ngN+z/X0VuGustlLq0WSunwpCYzO833ubLz2+J0rof+KJJ7JtWk7hczvDQ1mXlhUvnRvg5N5aKvwepqen6e7u5qGHHtJCvw1raL5VcLS2D9BQ4eOYKfQHAgEt9K9g5ZBpS+j/TBqE/nzB6N2I+Oz/XRxicm6Rz5o6ZyAQAFJbERIRY1XzNI/kK/iVJMJL99v6tz0eD3v37s2mWTmH1yXhWtp73SMMT86FWwJa6I+NXbcbmpzl3a5hTh/dhsMh9Pf3MzY2pn22Ap9NtzOE/gE+0VLDltIiZmdnuXz5csqE/nzB74ludba2h6gtLeIhM4VLMBiksbGRioqKlF63scqf9hZUQf8vK6Vo/SjEx5oqaayOCP0HDhzQQv8K7F0vbe0hSr0uTu4zhP1AIEBdXR11dXVZtjK3sLpelpeX+eG5QZYVd6VwSWZGfz5ijeJbXl7mw6u3CY3NRFWEUin05wvWPCilFKPT87x9aYhTR7bhdAiDg4OMjIykxWdN1UZeqOXl+Jl8k6GgA9T5wQm6bEL/5cuXmZ+f15pADHxuJwphfHaRH5sz+r1uJ7du3SIUCulCIwZel6AQFpaMoH64oZzmWiOFiyX0FxWtOvWvILGes4VlRdvZEH6Pk8cPGBWfYDBIdXV1yoT+fMHncaJwML+keCU4yMKSihrw5XQ605LCpbG6mPnFZYYm51J+bouCDlBt7SFcDuEZm9BfWlqqhf4YeF2GtvRm1zh35pfCXaKW0K9n9N+NtdL0xeEZgqHxcKHR1dVV8ClcVsPnMYqk8ZklXgkM8tTBrfg9LsbGxujr69Mru8TA5zZ8Nru4TFt7iD11JRyoj07h4vP5Un7dyKKx6RvJV7ABasns335kby2VxRGh//Dhw7p/OwZWYfvy+VEaKnw8sLMqLPTv2rWLsrKyLFuYe3hdxnP0yoUxHAKfuS+ytJHf79dCfwz8ZmH7Tu8kk7OLOoVLAvjNlfOv3Jrjl32jnDYnNF+5coXp6em0VYSarACVRh2qYEvif+m5xdDkXDibaWdnJ8vLy7pWuwpWYds3OsepIxGhf3R0VPtsFaz8Rj/rneThli3UluoULmthpSl55eIYW0qL+Lgp9AcCARobG6msvCthQsHjNYP6a5cngMiE5mAwiNfrpaWlJS3Xbaj08fsn72H/1vRVTgs2QL3Y3k9pkYtHTaE/GAxSW1urhf5VsLoR4G6hX8/oj43ls4UlxXNHjWHSqZ7Rn29Yhe318QWeNVO43Lhxg5GREd16WgWrd+PdvimO76qiocKXkRQubqeDP35yH4e3l6fl/FCgAerO/CKvd9zg6cOG0H/79m36+/t1oREHq7Btri6ipS4i9O/du1cL/atgdb14XRKe0R8MBqmqqmLbtm3ZNC1nsXwG6BQuCWK9m4vLhHuELl68yMLCwqYv0woyQP3k/E2m55eiRrqAFvrjUWymMH+s2agtdXd3a6F/DazWwImmEoqLXIyPj3P16lUt9MfBKmwbKzwc3BYR+vfs2ZMWoT8fsLpF3Q7hqUORAV/l5eU0NjZm07SkKcgA1dYeor7cy/FdVeGJbDt37qS8PH1N1c1OS42XE+5enj1gTPazhP577rkny5blLtvKPJTKLM/uj/gM0EE9DiVeoyL06O4SRITe3l6mpqZ0914crFbn8R0+yn1GCpcrV67kRQqXggtQE7MLvNs9wqkjDTgcQigU4vbt27rQWAOnw8Ee1y08TgkL/QcPHtRCfxwq/W4+5+1gf603LPTv2LFDC/1xaKwo4tfcVzh9wKgsBgIBncJlDerKPFTIDM/uM3zW0dGRNyu7pEc9y2HKvG7e+ZOTOM2ahRb618+FCxdYXFzMixcgU9y8eZPh4WGefvrpbJuS0zgcDna7blPklLDQf+jQobQJ/flASZGL57ydHKw1yrBAIEB9fT3pyJuXaQquBQVQX+6jtszL0tISHR0d7N27F6/Xm22zchp7V0EgEKCqqoqGhrvW/9XYsHxmtZ600L8+Ll26xMLCAvfdd1+2Tdk0DA8PMzg4mDeVx4IMUBY9PT3MzMzo/u11YAn9+dC/nSmsFC4tLS34/f5sm5PTrKwI5YPQn27sFaFgMIiI5M2Ar4IOUIFAAJ/PR3Nzc7ZN2TRooT9xrIJDC/0su1J1AAAJgElEQVTrZ2pqip6eHl0RWgf2FC4lJSXZNiclFGyAmpub00L/OrAKib6+PrZv305VVVWWLdo8dHZ2UlRUpFO4rIN8EvrTjfVuXrt2jfHx8bzyWcEGKC30bxzts8SwCo47d+6kdUZ/PmEvbLdu3ZoXQn+m6OzsxO1251UKl4INUIFAgMrKSrZv355tUzYFVsGhhf6NoYP6+tE+Swzr3ZyZmWHfvn14PJ4sW5Q6kgpQIvLrItIpIssicizOfk+JyCUR6RaRr9q27xKR90WkS0S+LyIZ8ezExAS9vb16Rv8GaG5u1kJ/gljPVllZGU1NTVm2ZnNg+SyfhP5Mkm9BPdkWVAfwWeCd1XYQESfw34FPAQeA3xARK3vWfwO+oZRqAUaBf5OkPQmhl+5fP1ZQOnr0aJYt2XxooX/97Nq1i9LS0mybsSmwnq3i4uK8S+GSVIBSSl1QSl1aY7cHgW6l1BWl1DzwPeCUGF59FPiBud93gdPJ2JMowWCQhoYGqqurM3G5vKCiooIvf/nLedW/nW5qamo4fvw4x48fz7Ypmwafz4fD4eD+++/PtimbBitAHTp0KO9y2WVCtW0Artv+7geOA9XAmFJq0bZ91ZmfIvI88DyQ1LyI2dlZHA5H3jWFM0G+DF3NFE6nk6eeeirbZmwqSkpK+MpXvqIXhl0HFRUVnDhxggcffDDbpqScNQOUiLwJbI3x09eUUi8lcI1YfRsqzvaYKKW+BXwL4NixY6vutxZer5fnn38epTZ8Co1Gk0Z0cFofIsJjjz2WbTPSwpoBSimV7J33Aztsf28HBoARoEJEXGYrytqeEbQmoNFoNLlNJjosPwRazBF7HuDzwMvKaMK8BXzO3O8LQCItMo1Go9EUAMkOM39ORPqBh4BXReR1c/s2EfkRgNk6+gPgdeAC8IJSqtM8xZ8CXxKRbgxN6n8lY49Go9Fo8gfZjFrMsWPH1JkzZ7Jthkaj0WhSgIj8Uil111za/BqTqNFoNJq8QQcojUaj0eQkOkBpNBqNJifRAUqj0Wg0OYkOUBqNRqPJSTblKD4RGQb6kjxNDcZkYY2B9kc02h/RaH9E0L6IJhX+aFJK3ZX8a1MGqFQgImdiDWssVLQ/otH+iEb7I4L2RTTp9Ifu4tNoNBpNTqIDlEaj0WhykkIOUN/KtgE5hvZHNNof0Wh/RNC+iCZt/ihYDUqj0Wg0uU0ht6A0Go1Gk8PoAKXRaDSanCQvApSIPCUil0SkW0S+GuP3IhH5vvn7+yKy0/bbn5nbL4nIk4meM5dJtT9EZIeIvCUiF0SkU0T+KHN3kzzpeD7M35wi0i4ir6T/LlJHmt6XChH5gYhcNJ+ThzJzN8mTJn/8B/Nd6RCRfxIRb2buJnk26g8RqTbLiSkR+eaKYz4mIkHzmL+VRDPGKqU29QdwAj3AbsADnAMOrNjn3wL/0/z+eeD75vcD5v5FwC7zPM5EzpmrnzT5ox6439ynFLhcyP6wHfcl4P8Ar2T7PrPtD+C7wO+Z3z1ARbbvNVv+ABqAXsBn7vcC8DvZvtcM+KMYeBj4IvDNFcd8gJE3UIDXgE8lYk8+tKAeBLqVUleUUvPA94BTK/Y5hfECAfwA+KQZwU8B31NKzSmleoFu83yJnDNXSbk/lFKDSqmPAJRSkxiJJxsycC+pIB3PByKyHfg08O0M3EMqSbk/RKQM+FXMhKNKqXml1FgG7iUVpOX5AFyAT0RcgB8YSPN9pIoN+0MpNa2UeheYte8sIvVAmVLqX5QRrf4eOJ2IMfkQoBqA67a/+7m78Azvo4wMv+MYGXxXOzaRc+Yq6fBHGLM5fxR4P4U2p5N0+eOvgT8BllNvclpJhz92A8PA35ldnt8WkeL0mJ9yUu4PpVQI+CvgGjAIjCul3kiL9aknGX/EO2f/GueMST4EqFh9mSvHzq+2z3q3bwbS4Q/jIJES4J+Bf6+UmtiwhZkl5f4QkWeAIaXUL5M1Lguk4/lwAfcD/0MpdRSYBjaLbpuO56MSo5WxC9gGFIvIbyVlZeZIxh/JnDMm+RCg+oEdtr+3c3dzOryP2eQuB27HOTaRc+Yq6fAHIuLGCE7/qJR6MS2Wp4d0+OME8KyIXMXoAnlURP53OoxPA+l6X/qVUlar+gcYAWszkA5/PAb0KqWGlVILwIvAx9NifepJxh/xzrl9jXPGJtuiXApEPRdwBaO2Yol6B1fs8/tEi3ovmN8PEi1yXsEQCdc8Z65+0uQPweg3/uts318u+GPFsY+wuQZJpMUfwM+Bveb3Pwf+Mtv3mi1/AMeBTgztSTD0mj/M9r2m2x+233+HuwdJfAj8CpFBEk8nZE+2HZIipz6NMbKsB/iaue0/Ac+a373A/8UQMT8AdtuO/Zp53CVsI0tinXOzfFLtD4yROQoIAGfNT0IPWC580vF82H5/hE0UoNLlD+AIcMZ8RtqAymzfZ5b98R+Bi0AH8A9AUbbvM0P+uIrRmprCaDkdMLcfM33RA3wTcxWjtT56qSONRqPR5CT5oEFpNBqNJg/RAUqj0Wg0OYkOUBqNRqPJSXSA0mg0Gk1OogOURqPRaHISHaA0mhRiruh81vzcEJGQ7e9fpPA6p0Xk63F+Pywi30nV9TSabKCHmWs0aUJE/hyYUkr9VRrO/QuMeSkjcfZ5E/hdpdS1VF9fo8kEugWl0WQIEZky/31ERH4mIi+IyGUR+QsR+U0R+cDMmXOPud8WEflnEfnQ/Jwwt+8B5qzgJCK/buYdOici79gu+UOMmf4azaZEByiNJjvcB/wRcBj4bWCPUupBjPQdf2ju8zfAN5RSDwD/ikhqjxPAR7ZzfR14Uil1H/CsbfsZ4BNpuwONJs24sm2ARlOgfKiUGgQQkR7ASscQBE6a3x8DDtiSj5aJSClGAslh27neA74jIi9gLExqMYSxmrZGsynRAUqjyQ5ztu/Ltr+XibyXDuAhpdSM/UARmcFYQRoApdQXReQ4RgLFsyJyRCl1C2PNtKhjNZrNhO7i02hylzeAP7D+EJEj5tcLQLNt+z1KqfeVUl8HRoikS9iDsUCnRrMp0QFKo8ld/h1wTEQCInIe+KK5/R3gqET6/v7SHFzRYf52ztx+Eng1oxZrNClEDzPXaDYhIvI3wA+VUm+u8nsR8DPgYWWk5dZoNh26BaXRbE7+K0ZCvNVoBL6qg5NmM6NbUBqNRqPJSXQLSqPRaDQ5iQ5QGo1Go8lJdIDSaDQaTU6iA5RGo9FochIdoDQajUaTk/x/ULZ6vRbiujMAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "from thinkdsp import Wave\n", "\n", "segment.plot(color='gray')\n", "smooth = Wave(smoothed, framerate=wave.framerate)\n", "smooth.plot()\n", "decorate(xlabel='Time(s)')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Compute the same convolution using `numpy.convolve`." ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "segment.plot(color='gray')\n", "ys = np.convolve(segment.ys, window, mode='valid')\n", "smooth2 = Wave(ys, framerate=wave.framerate)\n", "smooth2.plot()\n", "decorate(xlabel='Time(s)')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Frequency domain\n", "\n", "Let's see what's happening in the frequency domain." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Compute the smoothed wave using `np.convolve`, which is much faster than my version above." ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "convolved = np.convolve(wave.ys, window, mode='same')\n", "smooth = Wave(convolved, framerate=wave.framerate)\n", "smooth.make_audio()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Plot spectrums of the original and smoothed waves:" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "image/png": "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nwH3Axvc/Za0WYuBZE+8KcCitPTLQ2++84H60AT4JDDJzEaEzhGTQlrB9KS5LhVq8tSNL67WVV1dnRohXUSk2BRiqKNPA98B1pnZmpD2b8ANwHwzmwpsBb4Z5i0FvghUAYeAKwDcvdbMfg6sDMtd6+61+dmF9or58e1d1bpmzpwJwLRp0/JVHBGRbst7gHL3P5F5IIULYpZ34KoM65oFzMpe6fKvJ/Und6hNDOrdmH+64UpE+hmNJFEovah0PbfLWNT0QTa829z9zfTiulVrayubNm3qcT4RkWxSgCqQZLNgT+o12w5GeaoPtuagREc8/fTT/Nd//Rfbtm07+sIiIjmiANWPJOtCiV601vWkia+urg7Qo+VFpLAUoAqtN13/epCnL13T44La9ddfz7x583q9ThGR7lKAKrAcx6de6SqoNTc3s3Hjxth56oghItmkAFUgvanXHAlQhbt3KpM1a9Zw7bXX6r4qEckaBagsKuYKRE+CTW+aBdetWwfAu+++22ne1q1bqa0tyC1qItKPKUBlQ77u000Gjjxdg+qNuED4wAMP8Ktf/Sp22UQikY9iiUg/pABVKH14THy+Kmq5rnWtWrWKn//853ociIjEUoAqsN6NCtE5bXnTmVS2ZH7aSK6DTW+2k2wWjGv+u++++3j22Wd7XQ4R6f8UoAqkL50k4mxNjGBd66md8+Spia8320nmiQtqO3bs4Pnnn++U/tZbb3HjjTfS3Nz90TREpH9SgCqwnpzYj1yCys9YfMWY55lnnqGxsZG453rNmDGD3/72t53SE4kE+/d39cgxESlGClAFluhN178cd5LoD3niglprayurV6/ulL58+XJuvfXW2Gtdb775ph7mKFKkFKD6oSLuzZ7zGlRXASqTqqoqIH7oprlz53LnnXd2Sn/zzTe5+eabaW3tPO5hTU0NjY2N3d6+iPSOAlSh9aQ2lMySpwiV644V+b4+1pP9efLJJzl48GDsjcd33XUX99xzT6f0LVu2MHv27Niu87t379bYhiI9pACVRT0JHPm6Pckdmr00b734eqI3gaNY8uzbt69T2hNPPME777wTe73r7rvv5t577+2UvnbtWq677jra2to6zXvttddiezgmEgkFOzkuKEBlQW8OYm+ewps6afYgz8vvlvDw4XPYVt/S4+0V84MRCx2gepMnLqg99dRTtLW1xTYZ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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "spectrum = wave.make_spectrum()\n", "spectrum.plot(color='gray')\n", "\n", "spectrum2 = smooth.make_spectrum()\n", "spectrum2.plot()\n", "\n", "decorate(xlabel='Frequency (Hz)', ylabel='Amplitude')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For each harmonic, compute the ratio of the amplitudes before and after smoothing." ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "amps = spectrum.amps\n", "amps2 = spectrum2.amps\n", "ratio = amps2 / amps \n", "ratio[amps<280] = 0\n", "\n", "plt.plot(ratio)\n", "decorate(xlabel='Frequency (Hz)', ylabel='Amplitude ratio')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Plot the ratios again, but also plot the FFT of the window." ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "padded = zero_pad(window, len(wave))\n", "dft_window = np.fft.rfft(padded)\n", "\n", "plt.plot(np.abs(dft_window), color='gray', label='DFT(window)')\n", "plt.plot(ratio, label='amplitude ratio')\n", "\n", "decorate(xlabel='Frequency (Hz)', ylabel='Amplitude ratio')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Gaussian window\n", "\n", "Let's compare boxcar and Gaussian windows." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Make the boxcar window." ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [], "source": [ "boxcar = np.ones(11)\n", "boxcar /= sum(boxcar)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Make the Gaussian window." ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [], "source": [ "import scipy.signal\n", "\n", "gaussian = scipy.signal.gaussian(M=11, std=2)\n", "gaussian /= sum(gaussian)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Plot the two windows." ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.plot(boxcar, label='boxcar')\n", "plt.plot(gaussian, label='Gaussian')\n", "decorate(xlabel='Index')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Convolve the square wave with the Gaussian window." ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [], "source": [ "ys = np.convolve(wave.ys, gaussian, mode='same')\n", "smooth = Wave(ys, framerate=wave.framerate)\n", "spectrum2 = smooth.make_spectrum()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Compute the ratio of the amplitudes." ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [], "source": [ "amps = spectrum.amps\n", "amps2 = spectrum2.amps\n", "ratio = amps2 / amps \n", "ratio[amps<560] = 0" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Compute the FFT of the window." ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [], "source": [ "padded = zero_pad(gaussian, len(wave))\n", "dft_gaussian = np.fft.rfft(padded)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Plot the ratios and the FFT of the window." ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEYCAYAAAAJeGK1AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjMsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+AADFEAAAgAElEQVR4nO3deXyV5Z3//9cnJwlJgLAGZAkEJIAgYYtbQUWrlqp1r1Vnqnba+ptpbWc61dbOtNU67e/bduzYcfSrY7VqO7Zq7WCxtbXuiAuCbEJYAiRhXwNhDyT5fP84J/EQTg4n5KzJ+/ngPHKf+77PfX/um5P7k+u6r/u6zN0RERFJN1mpDkBERCQSJSgREUlLSlAiIpKWlKBERCQtKUGJiEhayk51AO3Vv39/LykpSXUYIiISJx9++OFOdy9qPT/jElRJSQkLFixIdRgiIhInZlYTab6q+EREJC0pQYmISFpSghIRkbSkBCUiImlJCUpERNKSEpSIiKSlhCUoM/ulmW03s2VtLDcze8DM1pjZUjObkqhYREQk8ySyBPUkMDPK8k8DpaHXbcDDCYxFREQyTMISlLvPAWqjrHIl8CsPeh/obWaDEhVPs7Vr17J48WKWL19OVVUVu3btorGxMdG7FZFOYtu2bdx0002MHDmSqVOncs455zBr1qyE73fBggV8/etfj8u23n77bcaPH8+kSZPYtGkT1113HQBvvvkml19+ecv0u+++G5f9naxU9iQxBNgQ9n5jaN6W1iua2W0ES1kMGzasQzs9cOAAu3bt4siRIy2JKTs7mwEDBjBs2DD69euHmXVoHyLSObk7V111Fbfccgu/+c1vAKipqWH27NkJ33d5eTnl5eVx2dbTTz/NHXfcwRe+8AUAnn/++ePWefPNN+nRowef+MQnYt5uQ0MD2dlxTCvunrAXUAIsa2PZn4DpYe9fA6aeaJtTp071eGhqavJDhw75li1bfMmSJf6Xv/zFh3/7j37zgy/7jh074rIPEelcXn31VT/vvPPaXF5VVeXTp0/3yZMn++TJk/2dd95xd/c33njDL7vsspb1vvrVr/oTTzzh7u7f/va3/bTTTvMJEyb4N7/5TXd3f+6553z8+PFeVlbm55577nHbmDdvnp9zzjk+adIkP+ecc3zlypXu7v7EE0/41Vdf7Z/61Kd81KhRfueddx4X4y9+8Qvv06ePl5SU+E033eRVVVU+fvz4Y/ZRVVXlAwcO9MGDB/vEiRN9zpw5vn37dr/mmmu8vLzcy8vLfe7cue7ufvfdd/uXv/xlv/jii/3GG288qfMKLPAI1/tUlqA2AsVh74cCm5O1czMjLy+PU045hVNOOYXx48fDG3/hrQ1Hef/99xk4cCATJkwgLy8vWSGJSDssX76curq6uG6zV69ewWtBlH1OmdJ2e64BAwbwyiuvkJeXR2VlJTfeeGPUvkNra2uZNWsWK1euxMzYs2cPAPfeey8vv/wyQ4YMaZkXbuzYscyZM4fs7GxeffVV/uVf/oXf//73ACxevJhFixbRrVs3xowZw9e+9jWKiz++1H7pS19i7ty5XH755Vx33XVUV1cft/2SkhL+/u//nh49enDHHXcAcNNNN/GNb3yD6dOns379ej71qU+xYsUKAD788EPmzp1Lfn5+m8d6MlKZoGYDt5vZM8BZQJ27H1e9lyyBQKBleuzYsaxevZo5c+ZQVlbGKaeckqqwRCSNffWrX2Xu3Lnk5uYyf/58jh49yu23387ixYsJBAKsXr066ucLCwvJy8vjS1/6EpdddlnL/Z9p06Zx6623cv3113PNNdcc97m6ujpuueUWKisrMTOOHj3asuyTn/wkvXr1AmDcuHHU1NQck6BO1quvvkpFRUXL+71797Jv3z4ArrjiirgnJ0hggjKz3wIzgP5mthG4G8gBcPdHgJeAS4E1wEHgC4mKpb1GjRrFwIEDWbRoEQsWLKC0tJTRo0fr3pRIGolW0knkPptLKgAPPfQQO3fubLk3dP/99zNw4ECWLFlCU1NTSw1MdnY2TU1NLZ87fPhwy/wPPviA1157jWeeeYYHH3yQ119/nUceeYR58+bxpz/9iUmTJrF48eJj4vje977HBRdcwKxZs6iurmbGjBkty7p169YyHQgEaGhoiMuxNzU18d5770VMRN27d4/LPlpLZCu+G919kLvnuPtQd3/c3R8JJSeaq2Ld/VR3n+DuaTWGRs+ePZk2bRrFxcVUVlby3KvzqD9y9MQfFJFO68ILL+Tw4cM8/PDHT8UcPHiwZbquro5BgwaRlZXFr3/965aGWMOHD6eiooL6+nrq6up47bXXANi/fz91dXVceuml/PznP29JRGvXruWss87i3nvvpX///mzYEN6eLLifIUOGAPDkk08m5Fh79uzZUkICuOSSS3jwwQdb3rdOmomgniSiCAQClJWVkV00gm+/tou7nn5bTdJFujAz44UXXuCtt95ixIgRnHnmmdxyyy385Cc/AeArX/kKTz31FGeffTarV69uKVkUFxdz/fXXU1ZWxt/8zd8wefJkAPbt28fll19OWVkZ559/Pvfffz8Ad955JxMmTOD000/nvPPOY+LEicfE8a1vfYvvfOc7TJs2LWHXpM985jPMmjWLSZMm8fbbb/PAAw+wYMECysrKGDduHI888khC9hvOgg0oMkd5ebknasDCkrv+BED1jy87Zv7rK7fxd08uYHwf57vn9ePMM8885p6ViIicPDP70N2Pa0OvElQ7FBYWsmvXLhYuXHhMfbKIiMSfElQ75OXlcfrpp7Nt2zY++ugjMq30KSKSSVLZzDwjlZSUUF9fT2VlJfn5+YwePTrVIYmIdEpKUCdh9OjRHDx4kNWrV9OrVy8GDhyY6pBERDodVfGdBDOjrKyMXr16sWjRIvbv35/qkEREOh0lqJMUCAQoLy9n71HjW0+/yxE9IyUiEldKUB2Qn5/PC5u681LVUZ59c1GqwxGRDNajRw8ANm/e3DL8xeLFi3nppZfava177rmH++67L67xAVRXV7f04g7xHQIkEiWodojYZi8QvI23fft2tmxJWVeCItJJDB48uGX4i5NNUB0RrWuk1gmqvLycBx54IGGxKEHFwDhxH3zdu3dn6dKlHDp0KAkRiUiqXHXVVUydOpXx48fz6KOPtszv0aMH3/72t5k6dSoXXXQRH3zwATNmzGDkyJEt40U9+eSTXHnllcycOZMxY8bwgx/84LjtV1dXc/rpp3PkyBG+//3v8+yzzzJp0iSeffbZ40pGp59+ektv5D/60Y8YM2YMF110EatWrWpZZ+3atcycOZOpU6dy7rnnsnLlyuP2ec8993DbbbdxySWXcPPNN1NdXc25557LlClTmDJlSsvAhXfddRdvv/02kyZN4v777z9mgMPa2lquuuoqysrKOPvss1m6dGmHz7Va8cXJqFGjOLpxGR999BFnnHGGOpYVSbAfvLicis1747rNcYMLufsz0Tuh/eUvf0nfvn05dOgQZ5xxBtdeey39+vXjwIEDzJgxg5/85CdcffXVfPe73+WVV16hoqKCW265hSuuuAKADz74gGXLllFQUMAZZ5zBZZddFnEgwtzcXO69914WLFjQ0gfePffcEzGmDz/8kGeeeYZFixbR0NDAlClTmDp1KgC33XYbjzzyCKWlpcybN4+vfOUrvP766xG30TxkxsGDByMOG/LjH/+Y++67jz/+8Y9AcFDDZnfffTeTJ0/mhRde4PXXX+fmm2/ucH99SlBxkp+fz6ljx7J8+XI2bdrE0KFDUx2SiCTAAw880DLE+4YNG6isrKRfv37k5uYyc+ZMACZMmEC3bt3IyclhwoQJx4y5dPHFF9OvXz8ArrnmGubOndvhkXLffvttrr76agoKCgBakuH+/ft59913+exnP9uybn19fcRthA+Z0d5hQwDmzp3b0tP7hRdeyK5du6irq2sZ+uNkKEHFUUlJCZs3b2b58uUUFRUd0+29iMTXiUo6ifDmm2/y6quv8t5771FQUMCMGTNahs7IyclpqTnJyspq+f3Pyso65r5O69qV9tS2tDVsR1vbaWpqonfv3jGVZMKHzGhr2JBoIvWs09GaJN2DiqPm56MaGxtZtmxZqsMRkTirq6ujT58+FBQUsHLlSt5///12b+OVV16htraWQ4cO8cILLzBt2rQ212095EVJSQkLFy4EYOHChVRVVQFw3nnnMWvWLA4dOsS+fft48cUXgWD/oSNGjOB3v/sdEEwiS5Ysiek4Iw0b0jqecOeddx5PP/00EEzk/fv3p7Cw8IT7ikYJKs569uxJaWkpW7ZsYdu2bakOR0TiaObMmTQ0NFBWVsb3vvc9zj777HZvY/r06Xz+859n0qRJXHvttVGr9y644AIqKipaGklce+211NbWMmnSJB5++OGWrtamTJnC5z73uZZtnnvuuS3bePrpp3n88ceZOHEi48eP5w9/+MMJY2xr2JCysjKys7OZOHFiy9Agze65556W4TjuuusunnrqqXafm9Y03EaYtobbeGPldr7w5HxmjCniyS+cecyym37xPu+u3cX/fPEsppf2B4LF6jlz5tDU1MT555+voTlEBAi24gtv9CBBGm4jDiLl8khVrFlZWYwfP54tew7y1w8qEh+YiEgnpEYSsTiJ+3xFRUXc+6FR37ieiomntrSuEZGu69Zbb+XWW29NdRgZQyWoBKoPjcRcUaFSlIhIeylBJcHWrVvZuXNnqsMQEckoSlBJkJeXx4oVKzQCr4hIOyhBJcGYMWOo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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.plot(np.abs(dft_gaussian), color='0.7', label='Gaussian filter')\n", "plt.plot(ratio, label='amplitude ratio')\n", "\n", "decorate(xlabel='Frequency (Hz)', ylabel='Amplitude ratio')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Combine the preceding example into one big function so we can interact with it." ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [], "source": [ "from thinkdsp import SquareSignal\n", "\n", "def plot_filter(M=11, std=2):\n", " signal = SquareSignal(freq=440)\n", " wave = signal.make_wave(duration=1, framerate=44100)\n", " spectrum = wave.make_spectrum()\n", "\n", " gaussian = scipy.signal.gaussian(M=M, std=std)\n", " gaussian /= sum(gaussian)\n", "\n", " ys = np.convolve(wave.ys, gaussian, mode='same')\n", " smooth = Wave(ys, framerate=wave.framerate)\n", " spectrum2 = smooth.make_spectrum()\n", "\n", " # plot the ratio of the original and smoothed spectrum\n", " amps = spectrum.amps\n", " amps2 = spectrum2.amps\n", " ratio = amps2 / amps \n", " ratio[amps<560] = 0\n", "\n", " # plot the same ratio along with the FFT of the window\n", " padded = zero_pad(gaussian, len(wave))\n", " dft_gaussian = np.fft.rfft(padded)\n", "\n", " plt.plot(np.abs(dft_gaussian), color='gray', label='Gaussian filter')\n", " plt.plot(ratio, label='amplitude ratio')\n", "\n", " decorate(xlabel='Frequency (Hz)', ylabel='Amplitude ratio')\n", " plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Try out different values of `M` and `std`." ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEYCAYAAAAJeGK1AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjMsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+AADFEAAAgAElEQVR4nO3deXxV9Z3/8dcnK4SdgICAsqOEJSEJi4qAolJEcKsWp612bP11WtuZ7nZmWq2/zm/GTmfsz9Fq7Wr9WcXSYsFaERdkkSXsQtg3WRSQPWzZPr8/7k28hCTckLsm7+fjcR733HPP8jknyf3k+z3f8/2auyMiIpJoUuIdgIiISG2UoEREJCEpQYmISEJSghIRkYSkBCUiIgkpLd4BNFSnTp28V69e8Q5DREQiZMWKFR+7e+eay5MuQfXq1Yvly5fHOwwREYkQM9tV23JV8YmISEJSghIRkYSkBCUiIglJCUpERBKSEpSIiCQkJSgREUlIUUtQZvYbMztgZuvq+NzM7Akz22pma81seLRiERGR5BPNEtTvgIn1fP4poH9wegB4OoqxiIhIkolagnL3+cDhelaZCvzeA5YA7c2sW7TiqbJo0SJeeeUVXn/9dZYuXcquXbsoLy+P9mFFpInYv38/99xzD3369CE/P5/Ro0czc+bMqB93+fLlfP3rX4/IvhYsWEBOTg65ubns3buXO++8E4B58+YxefLk6vn33nsvIse7WPHsSaI7sDvk/Z7gsg9rrmhmDxAoZXHZZZc16qBHjhxh586dnD59mtLSUgAyMjIYMGAA+fn5XH755ZhZo44hIk2Tu3Prrbdy77338oc//AGAXbt2MWvWrKgfu6CggIKCgojs64UXXuDb3/42X/jCFwCYMWPGeevMmzeP1q1bc9VVV4W93/LyctLSIphW3D1qE9ALWFfHZ38Frgl5/xaQf6F95ufneyRUVlb68ePHfePGjT5r1ix/7LHH/PLvvepTfzzdt23bFpFjiEjT8uabb/q1115b5+c7duzwa665xvPy8jwvL88XLVrk7u7vvPOO33zzzdXrffWrX/Xf/va37u7+ve99z6+88kofMmSIf+tb33J395dfftlzcnJ86NChPmbMmPP2sXTpUh89erTn5ub66NGjfePGje7u/tvf/tZvu+02v+mmm7xfv37+ne9857wYf/nLX3qHDh28V69efs899/iOHTs8JyfnnGPs2LHDu3Tp4pdeeqkPGzbM58+f7wcOHPDbb7/dCwoKvKCgwBcuXOju7g8//LB/6Utf8htuuMGnTZt2UdcVWO61fN/HswS1B+gZ8r4HsC9WBzcz2rRpw8CBAxk4cCATJ07k5z94g9UnWvH8889zxRVXcPPNN9O6detYhSQiDfD666/z0UcfRXSfXbt2ZeLEum+dr1+/nuHD627PdckllzB37lxatGjBli1bmDZtWr19hx4+fJiZM2eyceNGzIyjR48C8OijjzJnzhy6d+9evSzUFVdcwfz580lLS+PNN9/kn//5n/nTn/4EwOrVq1m1ahWZmZkMHDiQr33ta/Ts+clX7Re/+EUWLlzI5MmTufPOO9m5c+d5++/Vqxdf/vKXad26Nd/+9rcBuOeee/jGN77BNddcwwcffMBNN93Ehg0bAFixYgULFy6kZcuWdZ7rxYhngpoFPGhmLwEjgWPufl71Xqykp6dXz1933XXMnz+fp59+mltuuYUrrrgiXmGJSAL76le/ysKFC8nIyKCoqIiysjIefPBBVq9eTWpqKps3b653+7Zt29KiRQu++MUvcvPNN1ff/7n66qu57777uOuuu7j99tvP2+7YsWPce++9bNmyBTOjrKys+rPrr7+edu3aATBo0CB27dp1ToK6WG+++SbFxcXV748fP86JEycAmDJlSsSTE0QxQZnZi8A4oJOZ7QEeBtIB3P0Z4DVgErAVOAV8IVqxNNSYMWO44oor+POf/8z06dMZO3YsY8eO1b0pkQRSX0knWnJycqpLKgBPPfUUH3/8cfW9occff5wuXbqwZs0aKisradGiBQBpaWlUVlZWb3fmzJnq5cuWLeOtt97ipZde4sknn+Ttt9/mmWeeYenSpfz1r38lNzeX1atXnxPHD37wA8aPH8/MmTPZuXMn48aNq/4sMzOzej41NTVijcAqKytZvHhxrYmoVatWETlGTdFsxTfN3bu5e7q793D3X7v7M8HkRFVVrLv3dfch7p5QY2h07tyZ+++/n9zcXN59911mzJih1n4izdx1113HmTNnePrpT56KOXXqVPX8sWPH6NatGykpKTz//PNUVFQAcPnll1NcXMzZs2c5duwYb731FgAlJSUcO3aMSZMm8bOf/aw6EW3bto2RI0fy6KOP0qlT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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "from ipywidgets import interact, interactive, fixed\n", "import ipywidgets as widgets\n", "\n", "slider = widgets.IntSlider(min=2, max=100, value=11)\n", "slider2 = widgets.FloatSlider(min=0, max=20, value=2)\n", "interact(plot_filter, M=slider, std=slider2);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Convolution theorem\n", "\n", "Let's use the Convolution theorem to compute convolutions using FFT. \n", "\n", "I'll use the Facebook data again, and smooth it using `np.convolve` and a 30-day Gaussian window.\n", "\n", "I ignore the dates and treat the values as if they are equally spaced in time." ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(1977, 1948)" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "window = scipy.signal.gaussian(M=30, std=6)\n", "window /= window.sum()\n", "smoothed = np.convolve(close, window, mode='valid')\n", "\n", "len(close), len(smoothed)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Plot the original and smoothed data." ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.plot(close, color='gray')\n", "plt.plot(smoothed)\n", "decorate(xlabel='Time (days)', ylabel='Price ($)')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Pad the window and compute its FFT." ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "N = len(close)\n", "padded = zero_pad(window, N)\n", "fft_window = np.fft.fft(padded)\n", "plt.plot(np.abs(fft_window))\n", "decorate(xlabel='Index')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Apply the convolution theorem." ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [], "source": [ "fft_signal = np.fft.fft(close)\n", "smoothed2 = np.fft.ifft(fft_signal * fft_window)\n", "M = len(window)\n", "smoothed2 = smoothed2[M-1:]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Plot the two signals (smoothed with numpy and FFT)." ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.plot(smoothed)\n", "plt.plot(smoothed2.real)\n", "decorate(xlabel='Time (days)', ylabel='Price ($)')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Confirm that the difference is small." ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2.089768879877275e-13" ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "diff = smoothed - smoothed2\n", "np.max(np.abs(diff))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`scipy.signal` provides `fftconvolve`, which computes convolutions using FFT." ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [], "source": [ "smoothed3 = scipy.signal.fftconvolve(close, window, mode='valid')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Confirm that it gives the same answer, at least approximately." ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "8.526512829121202e-14" ] }, "execution_count": 40, "metadata": {}, "output_type": "execute_result" } ], "source": [ "diff = smoothed - smoothed3\n", "np.max(np.abs(diff))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can encapsulate the process in a function:" ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [], "source": [ "def fft_convolve(signal, window):\n", " fft_signal = np.fft.fft(signal)\n", " fft_window = np.fft.fft(window)\n", " return np.fft.ifft(fft_signal * fft_window)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "And confirm that it gives the same answer." ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1948" ] }, "execution_count": 42, "metadata": {}, "output_type": "execute_result" } ], "source": [ "smoothed4 = fft_convolve(close, padded)[M-1:]\n", "len(smoothed4)" ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2.089768879877275e-13" ] }, "execution_count": 43, "metadata": {}, "output_type": "execute_result" } ], "source": [ "diff = smoothed - smoothed4\n", "np.max(np.abs(diff))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Autocorrelation\n", "\n", "We can also use the convolution theorem to compute autocorrelation functions.\n", "\n", "Compute autocorrelation using `numpy.correlate`:\n" ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([10515607.461, 10533254.812, 10550927.762, 10570279.165,\n", " 10589752.032, 10609151.979, 10628488.485])" ] }, "execution_count": 44, "metadata": {}, "output_type": "execute_result" } ], "source": [ "corrs = np.correlate(close, close, mode='same')\n", "corrs[:7]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Compute autocorrelation using my `fft_convolve`. The window is a reversed copy of the signal. We have to pad the window and signal with zeros and then select the middle half from the result." ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [], "source": [ "def fft_autocorr(signal):\n", " N = len(signal)\n", " signal = zero_pad(signal, 2*N)\n", " window = np.flipud(signal)\n", "\n", " corrs = fft_convolve(signal, window)\n", " corrs = np.roll(corrs, N//2+1)[:N]\n", " return corrs" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Test the function." ] }, { "cell_type": "code", "execution_count": 46, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([10515607.461-0.j, 10533254.812-0.j, 10550927.762+0.j,\n", " 10570279.165-0.j, 10589752.032+0.j, 10609151.979-0.j,\n", " 10628488.485-0.j])" ] }, "execution_count": 46, "metadata": {}, "output_type": "execute_result" } ], "source": [ "corrs2 = fft_autocorr(close)\n", "corrs2[:7]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Plot the results." ] }, { "cell_type": "code", "execution_count": 47, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(1977, 1977)" ] }, "execution_count": 47, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEYCAYAAAAJeGK1AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjMsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+AADFEAAAgAElEQVR4nO3dd3hUZd7H//d30gvpPXRFRDEUkd5FwF5WBbeAiqCiLuo+7rq7z7r6u57n+V2Pv137KuqCWFhBsay7KiK9l4ChiQgiIKQNqaSXuX9/zMATIIQEMnOmfF/Xda5MTpnzyclkvjln7nPfYoxBKaWU8jY2qwMopZRSzdECpZRSyitpgVJKKeWVtEAppZTySlqglFJKeSUtUEoppbySTxYoEZkrIoUisqsV6z4vIjmu6XsRKfVERqWUUhdGfPE+KBEZCVQA7xhjerdhu0eAfsaYe90WTimlVLvwyTMoY8xqoLjpPBG5SEQWi8hWEVkjIpc2s+ldwPseCamUUuqCBFsdoB29ATxgjNknIoOAV4GxJxaKSBegG7DconxKKaXawC8KlIhEA0OBD0XkxOyw01abDCwyxjR6MptSSqnz4xcFCuelylJjTN8W1pkMPOShPEoppS6QT34GdTpjTDnwo4jcASBOfU4sF5GeQDywwaKISiml2sgnC5SIvI+z2PQUkSMiMg34BTBNRLYDu4Gbm2xyF7DA+GKTRaWUClA+2cxcKaWU//PJMyillFL+z+caSSQlJZmuXbtaHUMppVQ72bp16zFjTPLp832uQHXt2pXs7GyrYyillGonInKoufl6iU8ppZRX0gKllFLKK2mBUkop5ZW0QCmllPJKWqCUUkp5JS1QSimlvJIWKKWUUl5JC5RSXqixrhrj0JFhVGDTAqWUl6m0H+anRX/k8Kf/RX1VudVxlGLevHk8/PDDHt+vFiilvEhl4SHsS54HY3Acz+fol3/VIqUClhYopbxETWkB9q9fALGRMvE3xA2fhqkoJHfx8zTUVFodT7WTgwcP0qtXL6ZPn87ll1/O+PHjqa6uZvTo0Tz66KMMHTqU3r17s3nz5ma3f/bZZ7niiivo06cPTz75JAA5OTkMHjyYrKwsbr31VkpKSgAYPXo0v/vd7xg4cCCXXHIJa9asAWDQoEHs3r375HOOHj2arVu3UlxczC233EJWVhaDBw9mx44dp+y7rKyMrl274nA4AKiqqqJTp07U19fzww8/MHHiRK688kpGjBjBd999d8HHyuf64lPKHzXW1ZC/9BUwjSSPf4zIxI5EJnYEh4PSdXPJW/UWHa+Zidj0f8r2sn//fioqKtr1OaOjo7n44ovPud6+fft4//33efPNN7nzzjv56KOPAKisrGT9+vWsXr2ae++9l127dp2y3Zdffsmnn37Kpk2biIyMpLi4GIApU6bw8ssvM2rUKJ566imeeeYZXnjhBQAaGhrYvHkzX3zxBc888wxLly5l8uTJfPDBBzzzzDPk5eWRm5vLlVdeySOPPEK/fv349NNPWb58OVOmTCEnJ+fk/mNjY+nTpw+rVq1izJgx/Otf/2LChAmEhIQwY8YMZs+eTY8ePdi0aRMzZ85k+fLlF3Q89dWulBfIX/cPOF5I3NB7iErufHJ+fI+BRPQaT2PuTo7tXGZhQtWeunXrRt++fQG48sorOXjwIAB33XUXACNHjqS8vJzS0tJTtlu6dCn33HMPkZGRACQkJFBWVkZpaSmjRo0CYOrUqaxevfrkNrfddtsZ+7nzzjv58MMPAfjggw+44447AFi7di2/+tWvABg7dixFRUWUlZWdkmHSpEksXLgQgAULFjBp0iQqKipYv349d9xxB3379uX+++8nLy/vgo+TnkEpZbHSA9uoP7iJ0IuGEde93xnLU6+6hZ8K91G54zM6dMkiPC7VgpT+pzVnOu4SFhZ28nFQUBDV1dUAiMgp653+vTHmjHmt3VdQUBANDQ0AZGZmkpiYyI4dO1i4cCGvv/76yec/3en7u+mmm/j9739PcXExW7duZezYsVRWVhIXF3fK2VZ70DMopSzUUFNB6cb5EJ1M2tDJza4jNhspI+7GAAWr38K4rv8r/3PizGTt2rXExsYSGxt7yvLx48czd+5cqqqqACguLiY2Npb4+PiTny+9++67J8+mWjJ58mSeffZZysrKuOKKKwDnmdv8+fMBWLlyJUlJScTExJyyXXR0NAMHDmTWrFnccMMNBAUFERMTQ7du3U6elRlj2L59+wUcCSctUEpZKH/tfKirImn4VGzBoWddLzwuleismzBFP2LfscSDCZUnxcfHM3ToUB544AHmzJkDQHZ2Nvfddx8AEydO5KabbmLAgAH07duXv/zlLwC8/fbbPPHEE2RlZZGTk8NTTz11zn3dfvvtLFiwgDvvvPPkvKeffprs7GyysrJ48sknefvtt5vddtKkSbz33ntMmjTp5Lz58+czZ84c+vTpw+WXX84///nP8z4OJ0hzp3TebMCAAUYHLFT+oOSHbMpWv0noJaPJGHbXOdc3Dgc/ff4XHKU/kXrDH4iIT/dASuUpo0eP5i9/+QsDBgywOorHichWY8wZP7ieQSllgYaaCso2L4CoJNIG/axV2zS91GdfPU8v9Sm/pwVKKQvkr1+Aqa0gcdiUFi/tnS48LoXovrfgKD6IPWexGxMqT1u5cmVAnj21RAuUUh5WdnAHDYe2EHbRcDpk9mzz9kmXj8GW3IPKXZ9TXZzrhoRKeQctUEp5UGNdNSUb50NkPKmDbj+v5xCbjdSRdyO2IAq1VZ/yY24rUCISLiKbRWS7iOwWkWeaWSdMRBaKyH4R2SQiXd2VRylvULDxQ6guJWHwLwgKDT/v5wmLSSK6762YksPYc75sx4RKeQ93nkHVAmONMX2AvsBEERl82jrTgBJjzMXA88D/ujGPUpYqO7iD2gPrCek6iJguV1zw8yVeNgpbyiVU7fyCqqIj7ZBQKe/itgJlnE50dBXimk5v034zcKKh/SLgamnrbdJK+YD6qnJKNryDRCaQNuzn7fKcYrOROuJuCArCvvotHT9K+R23fgYlIkEikgMUAl8bYzadtkom8BOAMaYBKAMSm3meGSKSLSLZdrvdnZGVanfG4SB/9TxMXSVJI+69oEt7pwuLSaRD/59hSo9QsOXCb4xU7vfSSy/Rq1cv7rrrLsaNG0ffvn1ZuHAhL7zwwskeIrzJwYMH6d27tyX7dmuBMsY0GmP6Ah2BgSJy+k/Z3NnSGXcOG2PeMMYMMMYMSE5OdkdUpdymcNu/aczbTeTl1xKd3v79vyVcOoKgjCuo3rOEsoMX3r2Mcq9XX32VL774glmzZlFfX09OTg6TJk3y2gJlJY90FmuMKRWRlcBEoGn/8UeATsAREQkGYoFiT2RSyhPKD+2keteXBKVfTkr/G9yyD7HZyBgzjZ8+/S9K1r1FWNwfCI9Lccu+/Mq+pVBR0L7PGZ0KPcaddfEDDzzAgQMHuO666/j++++Jjo6mb9++3HPPPeTm5jJmzBiSkpJYsWJFs9svXryYP/zhDzQ2NpKUlMSyZcsoLi7m3nvv5cCBA0RGRvLGG2+QlZXF008/zeHDhzlw4ACHDx/m0Ucf5de//jW/+93v6NKlCzNnzgSc3Rt16NCBxx9/nN/+9rd8+eWXiAj/+Z//eUpXRuAcR2ru3LlcfvnlgLP3i7/+9a9ceumlPPLII+zcuZOGhgaefvppbr755gs+nO5sxZcsInGuxxHAOOD0Eaw+A6a6Ht8OLDe+1veSUmdRW36M4rVzITKe9NHT3DqWU1BoBCljH8A4GilY/hqOhjq37Uudv9mzZ5ORkcGaNWtYtmwZI0aMICcnh1mzZpGRkcGKFSvOWpzsdjvTp0/no48+Yvv27Sc7Zv3zn/9Mv3792LFjB//zP//DlClTTm7z3Xff8dVXX7F582aeeeYZ6uvrmTx58slOaeH/htv4+OOPycnJYfv27SxdupQnnnjijCEzTowjBZwyjtR///d/M3bsWLZs2cKKFSt44oknqKy88EE23XkGlQ68LSJBOAvhB8aYf4vI/wNkG2M+A+YA74rIfpxnTs1356yUj3E01JG/7DVwNJA85gGCw6Pcvs/IpE7EDvw55evnkbfmXTLHTHP7Pn1aC2c63mjjxo2MHDmSbt26Ac6xoMDZ8/mJAQ9PH8Pp+uuvJywsjLCwMFJSUigoKKBfv34UFhaSm5uL3W4nPj6ezp078/zzz3PXXXcRFBREamoqo0aNYsuWLWRlZZ3McOedd3LNNdfwzDPPnDKO1JIlS/jss89Odl5bU1PD4cOH6dWr1wX9zG4rUMaYHcAZg9sYY55q8rgGuMNdGZSygnE4yF39Dqb0CDFDp54yAKG7JfQcQq39R2r3rcK+vRPJfcZ7bN/Kvc42FlRLYzidPu7UifGgbr/9dhYtWkR+fj6TJ08+6/OcrqVxpD766CN69mx7zygt0Z4klGpnhds+p+HQFkIvGU1Cz6Ee33/a0EnOrpC++YSygzs8vn91fjp06MDx48fPunzIkCGsWrWKH3/8EeDkcO+tGcPpdJMnT2bBggUsWrSI22+//eTzLFy4kMbGRux2O6tXr2bgwIHNbnv6OFITJkzg5ZdfPlnkvvnmmzb+9M3TAqVUOyrZt5mqXZ8TlH456UMmnXsDNxBbEBnjHoTIBIrXztGbeH3EjBkzuPbaaxkzZkyzy5OTk3njjTe47bbb6NOnz8kGDK0dw6mpyy+/nOPHj5OZmUl6unPYlltvvZWsrCz69OnD2LFjefbZZ0lLSztj2+bGkfrTn/5EfX09WVlZ9O7dmz/96U/ncwjOoONBKdVOKgsOYF/yPBKVRMcbfteu9zudj+qSPAq++F8IjiDzxt8TEtnyf9VKWUXHg1LKjWpKC7EvfxWCw0kb97DlxQkgIj6d+BH3YWpKyV3yMo11NVZHUqpNtEApdYHqq8rJX/IiNNaRPHYmYTFndIZimdjOvYkZ9EscpT+Ru2y2dofkIwYNGkTfvn1PmXbu3Gl1LI/zyI26Svmrxroacr96EVNdTOLomUSldrM60hkSLx1GY1UZVdv/Se6qt8kYdbdb78lSF27TptN7hQtM+ipV6jwZh4Pc5W/gKDtK7OBftUsP5e6S0v86Qi8eSf3BTRRs+cTqOEq1ihYopc5T3tr3nH3s9b7ekubkbZU+7C6CO/ah5tsl2HcuszqOUuekBUqp81C47QvqflhHSLchpPS/3uo4reLss286tqSLqNy6iPJDgfeZhvItWqCUaqOSfZuo3PEZQWm9yBj5K5/6PMcWHELGNTMhMp7itXOoKW3nzlKVake+85ellBc4fnQvpRvewRaTTsbVDyC2IKsjtVlweDQpV88E4yB/6Ss01lVbHUmpZmmBUqqVasuLKFr1OhIaTfr4X3vFvU7nKzKxI3FD78ZU2Mld/ibG4bA6klJn0AKlVCs4GurJX/YqNNaTPHYmodHxVke6YHHd+xPZ+zoa83aTv/ljq+ModQYtUEq1Qt4aZ+/kHa6aTFRKF6vjtJuU/jcQ3LEvtXu+pmSf3nujvIsWKKXOwb5jKfUHNxPWYxSJlw6zOk67EpuN9FH3ILEZlG18j8rCQ1ZHUuokLVBKteD40b1UfPMRtqSLSBtqTe/k7hYUGk7auIcgKBT78lepryq3OpJSgBYopc6qrqKEotVvImEdSL/6fp9ssddaYTFJJI6agaktJ2/Za9pnn/IKWqCUaoajoZ68pa9BXTVJo2YQEhlrdSS365DZkw5X3onj2AHy1s63Oo5SWqCUOp1xOMhdNQ9TcogOV00iOv1iqyN5TFLvMYReNIy6H9Zpd0jKclqglDqNPWcxDYezCb1kNImXjbQ6jselD/8FtqSLqNi2iPIje6yOowKYFiilmig98M3JboysGrLdamILIv3qB5DwWIpXv0lt+TGrI6kApQVKKZeqoiOUrn8LiUoifcx0n+pjr72FRMaQPHYmNNaTv/RvOhqvskTg/gUq1URDTQWFy14FsZE67iGCw6OsjmS5qOTOxA7+FY7yPHJXztHukJTHaYFSAc84GsldOhuqSkgYPo2I+HSrI3mN+B4Dieg1nsajOyjY8qnVcVSA0QKlAl7+xo9w2PcR2fdmrx4V1yqpV91CUGYWNd9+RfHeDVbHUQFEC5QKaCX7t1C7dxnBnfqTnDXe6jheSWw2MsdOR+I6Ur75H9odkvIYLVAqYFUX51K28V2ISSN95NSAbhRxLrbgUNKunglBIdhXvKbdISmP0L9IFZAa66opWP4aBiF17AM+PbaTp4TFJJIwcjqmpoy85a9rd0jK7bRAqYBjHA5yV87FVNiJHzpVG0W0QUzHXkT3vRWHfT95Gz6wOo7yc1qgVMAp3PZvGo/uIKLXeOK697c6js9J7jOe4C5XUff9Sor3rrc6jvJjWqBUQCneu4GqXV8QlH45qVfdYnUcn5Uxcoqr0cT72mhCuY0WKBUwjh/dS/nG97DFZpIxdoY2irgA/9dowjmGVF1FsdWRlB/Sv1AVEKqLcyla+RqEdyD9moe1UUQ7CItJdI4hVVdB7lcv0lBTaXUk5We0QCm/V1teRMHXLwGQMu5hQqPjLU7kPzpk9iR++DQ4XsjRJS/jaKizOpLyI1qglF+rqygmb/Ffoa6SxNEPEpnY0epIfieue3+iB0zCFP3I0aWztfm5ajdaoJTfqq8qI/fL5zA1ZSSMfpAOmT2tjuS3knqPJuKKG2jM283RZW9ox7KqXWiBUn6pvqqco18+5+wAduT9xHS6zOpIfi91wI2E9bqGhiM55K56S4uUumDBVgdQqr011FSSu/h5TEUh8SOmE9s1y+pIASNt4G3kN9RRu28VuUDGqLsRW5DVsZSP0gKl/Ep9VTm5X72IKc8nbtg9eiOuh4nNRtrQyeQDtftWcaS2isxxD2ALDrE6mvJBbrvEJyKdRGSFiOwRkd0iMquZdUaLSJmI5Limp9yVR/m/6uJcjv7r/8VRnkvMkCnE9xhodaSAJDYb6cN/TsQV19OYt4sjXz5PY1211bGUD3LnGVQD8BtjzDYR6QBsFZGvjTHfnrbeGmPMDW7MoQJA+ZE9FK96HWMMiWMf0c+cvEDqgJs4Ft6BiuwP+Omz/yFl9AwikzpZHUv5ELedQRlj8owx21yPjwN7gEx37U8FJuNwULjtc4qWvQTB4aRe+4QWJy+S1HsMcSOnQ+1xCr98lmO7VlodSfkQj3wGJSJdgX7ApmYWDxGR7UAu8B/GmN3NbD8DmAHQuXNn9wVVPqWuopj8lXNw2PcTlHIJ6WPuIyQy1upY6jRx3fsTkdSZ/OVvULHlfWry95I+cgpBoRFWR1NeTowx7t2BSDSwCvhvY8zHpy2LARzGmAoRuQ540RjTo6XnGzBggMnOznZfYOUTSvZvoWzTP6Chjsg+N5KcNV771vNyxtFI/sZF1Hy/AolMIGnEvUSnX2x1LOUFRGSrMWbA6fPd+hctIiHAR8D804sTgDGm3BhT4Xr8BRAiIknuzKR8m6OhjqMr51G25u8QFk3ytb8lpe9ELU4+QGxBpA+dRMLomdBQi33JXync9rneL6XOym2X+EREgDnAHmPMc2dZJw0oMMYYERmIs2AWuSuT8m01pQXkL30FjhcSetEw0oZOxhYcanUs1UaxXbOITHmKvJVzqNr+GT/lfUf6mOmERMZYHU15Gbdd4hOR4cAaYCdw4l+kPwCdAYwxs0XkYeBBnC3+qoHHjTEtjoCml/gCU0XePo6teA0cDcQNvVvvb/IDxuHAnrOYyp3/QsI6kHz1w0Ql62fMgehsl/jc/hlUe9MCFXhK9m+hdP08JDRK38T80PGjeyla9TrG0UjSmJnaZ2IAsuQzKKUuVGHOYkrXzsEWnULGDU9qcfJDHTJ7knrtE0hwOEXLX6Hs4HarIykvoQVKeSXjcJC7Zj5V33xCUHIPOt7wW0KjE6yOpdwkIj6d9Ot+C+GxFK+aTfHeDVZHUl5AC5TyOsbhIG/te9TtX01I14F0uvZRvWcmAITFJJJ5/W+xxWRQtuFt7DuXWR1JWUwLlPIqxuEgf/0C6n5YR0i3IWSMukd7ww4gIZExdLz+PwhK7E5l9gcUfbvK6kjKQlqglFcp3PZvavetIqTrQDJGTtH7mwJQUGgEHa99FFtCV45vXkDpgW+sjqQson/9ymsU711P9c7PCUrv7Tpz0pdnoLIFh5Ix4RGITqJ03Vwq8vZZHUlZQN8BlFc4fnQv5RvnI3EdyRg7XYuTIjg8mvTxj0JIBMeWv0pNaYHVkZSH6buAslx1SR5FK2dDWDTp1zxMUGi41ZGUlwiLSSRl3CNgGslf+oqOKxVgWlWgRCRMRH4uIn8QkadOTO4Op/xfY101BV+/gjEOUsY9TGh0vNWRlJeJTOpE3NC7MRV2ji57XfvuCyCtPYP6J3Azzi6JKptMSp0343CQu2IOpqqIhOH36mB26qziuvcnsvd1OPL3ULjtc6vjKA9pbWexHY0xE92aRAUc+44lNObuJOKyCcR27WN1HOXlUvrfwE/2A1Tv+oLy1It0YMoA0NozqPUicoVbk6iAUnXsJ6q2/wtbcg9Sr7rF6jjKB4jNRsaY+yAiluJ182io0Ys4/q61BWo4sFVE9orIDhHZKSI73BlM+S/jaMS+Zh4mKJjUkdqcXLVecHg0CcOmYmrKyV/3D6vjKDdr7SW+a92aQgWUwm2fY0qPEDPo54TFJFodR/mYmI69qLx4JLX7VlGyrw/xPQZaHUm5Sav+dTXGHALigBtdU5xrnlJtUnXsJ6p3f4UttScJl46wOo7yUamDb4cOKZRtWUB9VZnVcZSbtLaZ+SxgPpDimt4TkUfcGUz5n1Mu7Q2fqpf21HmzBYeSPOJeTH01+WvetTqOcpPWvkNMAwYZY54yxjwFDAamuy+W8kcnL+31v00v7akLFpXajfCeV9OYu5OSfZutjqPcoLUFSoDGJt83uuYp1Sp6aU+5Q+qAm12X+hbSUFNhdRzVzlpboN4CNonI0yLyNLARmOO2VMqv6KU95S624BASh/wSU1dJ/voFVsdR7ay1jSSeA+4BioES4B5jzAvuDKb8R+G2L/TSnnKbDpk9CbtoBA2HtlB2UO9+8SctFigRiXF9TQAOAu8B7wKHXPOUalGl/TDVuxfrpT3lVqmDfgaR8ZRsnK8dyvqRc51BnbgTbiuQ3WQ68b1SZ+VoqOfY6jkQHELayLv10p5ym6DQcOKH/BJTU0bemvesjqPaSYs36hpjbnB97eaZOMqfFGz8EFOeT+zwewmN1hNu5V6xnXtTpTfw+pXW3ge1rDXzlDqh7PAuavavJrjzAOJ7DLI6jgoQqYPvQGLSKNv8PnUVxVbHURfoXJ9Bhbs+a0oSkXgRSXBNXYEMTwRUvqehpoKS9e8gEXGkj/il1XFUALEFh5A04l5oqCN/xd8xjsZzb6S81rnOoO7H+XnTpa6vJ6Z/An9zbzTli4zDQe6y16HmOAnDphIUGmF1JBVgolK6ENX3FhzHfiB/8ydWx1EX4FyfQb0IvCgijxhjXvZQJuXD8jcuwlH4PZF9byGmYy+r46gAlXTF1dQW7qfmu6WUplxEXPd+VkdS56G190G9LCK9ReROEZlyYnJ3OOVbSvZtonbvMoI79Se5zwSr46gAJjYb6aPuRqKSKN3wNrXlx6yOpM5DaxtJ/Bl42TWNAZ4FbnJjLuVjKu2HKdv4HhKbQcZoHeNJWS8oNIKUMfeDo5H8Za/haKizOpJqo9a+i9wOXA3kG2PuAfoAYW5LpXxKQ00F9uWvgS2YtHEPYQsOtTqSUgBEJnUiZuBdmNIj5K74O8bhsDqSaoPWFqhqY4wDaHD1LlEIdHdfLOUrTjaKqC4lfsQ0wmKSrI6k1CkSeg4l/LLxNBzZTmH2Z1bHUW3Q2gKVLSJxwJs4W/FtA7R/e0X+5o+djSL63ERs595Wx1GqWalX3UpQxhVUfbuY0gPfWB1HtVJrG0nMNMaUGmNmA9cAU12X+lQAKz+0k5rvlhLcsY82ilBeTWw2MsZMQ6KSKFk/j5rSAqsjqVY41426/U+fgAQg2PVYBaj6qjKK17+NRMSRNkKH0FDeLyg0gpSxD4BxULB8tjaa8AEt3gcF/LWFZQYY245ZlI8wDgd5K+dg6ipJHv84weFRVkdSqlUiEzsSN/hXlK2dQ+6qt+l4tQ4M7s3OdaPuGE8FUb7Dvv0rHAV7ibziBqLTe1gdR6k2ie8xkOrCH6j7fiXFe3uT0HOI1ZHUWbT2PqhIEflPEXnD9X0PEbnBvdGUN6osOEDVjn9jS+5BSv/rrY6j1HlJG3Q7xKRRnv0BdRUlVsdRZ9GWId/rgKGu748A/+WWRMprNdZVY1/1dwgJJ230NP3cSfksW3AIySPuxTTUkL/mbb0/yku19h3mImPMs0A9gDGmGhC3pVJeKW/Ne5iqYuKHTiU0Ot7qOEpdkKiULkRcNhFH/h6Kv1tjdRzVjNYWqDoRicDZMAIRuQiodVsq5XVK9m2i4XA2YT1GEds1y+o4SrWL1CtvQOI6cnzbR9pfnxdqbYH6M7AY6CQi84FlwG9b2kBEOonIChHZIyK7RWRWM+uIiLwkIvtFZIc2XfdOdRUllG1egMSkOa/dK+UnxBZEyqhpGEcjBavf0kt9XuacBUpEBPgOuA24G3gfGGCMWXmOTRuA3xhjegGDgYdE5LLT1rkW6OGaZgCvtSW8cj/jcFCw9l1MQw1Jw+/GFhxidSSl2lVEQgZRWTfisO/n2M6lVsdRTZyzQBljDPCpMabIGPO5MebfxphzngsbY/KMMdtcj48De4DM01a7GXjHOG0E4kQkve0/hnKX4r3raczbTWSvCUSldrM6jlJukZw1HltSdyp3/Ivqkjyr4yiX1l7i2ygiV53vTlxDxPcDNp22KBP4qcn3RziziCEiM0QkW0Sy7Xb7+cZQbVRXUcLxbYuQ2AxSBtxodRyl3EZsNlJG3IMBClfppT5v0doCNQbYICI/uD4r2ikiO1qzoYhEAx8Bjxpjyk9f3Mwm5owZxrxhjBlgjBmQnJzcysjqQjkv7dWSNPxuxBZkdRyl3Co8LoUO/W7DlByicNvnVsdRnPlGdQAAABiiSURBVLuroxOuPZ8nF5EQnMVpvjHm42ZWOQJ0avJ9RyD3fPal2lfRd+tozNtNxGUTiErpYnUcpTwi8bJRVB3+hurdi6nq2pfIpE7n3ki5TWsaSdiAz40xh06fzrGdAHOAPcaY586y2mfAFFdrvsFAmTFGLwBbrK6ihONbP0RiM0i96mar4yjlMWKzkTbybkxQMPY18zCORqsjBbTWNJJwANtFpHMbn3sY8CtgrIjkuKbrROQBEXnAtc4XwAFgP86xpma2cR/KDQrWvqeX9lTACo1OIKb/bZjSIxRu+8LqOAGttZf40oHdIrIZqDwx0xhz09k2MMas5Ry9TbhaCD7UygzKA5yX9nbppT0V0BIuHUHlwa3OS33d+hGZ2NHqSAGptQXqGbemUF7BeWlvkV7aUwFPbDZSh08l77NnsK95m843/V77nrRAa0fUXYXzZt0OrmmPa57yIwXr5jtvyB02RS/tqYAXFpNIdN9bMSWHsecstjpOQGrtcBt3ApuBO4A7gU0ion3e+JHivetpzN1JxKXj9IZcpVwSLxuFLbkHlbs+p7pYGxh7WmvPWf8IXGWMmWqMmQIMBP7kvljKk+qryijP/hBi0ki58qwfKyoVcMRmI3Wks7FQ4ep5egOvh7W2QNmMMYVNvi9qw7bKy+Wvcfa1l6x97Sl1hrCYJNelvkPYc760Ok5AaW2RWSwiX4nI3SJyN/A5zibiyscV792gl/aUOofEy0ZhS7mEyl1fUFV0xOo4AaPFAiUiF4vIMGPME8DrQBbQB9gAvOGBfMqNnJf2PtBLe0qdg9hspI64G2zB2Fe/pTfwesi5zqBeAI4DGGM+NsY8box5DOfZ0wvuDqfcxzgc5K9+Wy/tKdVKYTGJxPT/Gab0CAVb/211nIBwrgLV1RhzRqewxphsoKtbEimPKP5ujQ6joVQbJVw6HFtaL2q+XUJlYYu9val2cK4CFd7Csoj2DKI8p6a0kOPbPkLiO+swGkq1gdhspI2YCsGhHFszF0dDndWR/Nq5CtQWEZl++kwRmQZsdU8k5U7G4aBwzVtgDCkj79EbcpVqo9DoeGIH/RxTnk/+hg+tjuPXztXV0aPAJyLyC/6vIA0AQoFb3RlMuUfhtn/jOHaAqCvvICIhw+o4Svmk+IuvouqnHdT+sIayTlcQ2zXL6kh+qcUzKGNMgTFmKM6++A66pmeMMUOMMfnuj6faU2XBAap2f4ktrRdJvcdaHUcpn5Y27OdIRDwlG96hvur0sVhVe2htX3wrjDEvu6bl7g6l2l9jXQ32VXOQkEjSR92jHV8qdYGCQiNIHH431FY6W8RqLxPtTt+lAkT+un9A5THih04hJDLW6jhK+YUOmT2JuGwCjXm7KPpW+89ub1qgAkDJ/i3UH9xE6MUjiO3ax+o4SvmVlAE3YkvoSsU3H2uHsu1MC5Sfq6sopmzTP5CYNNKG3Gl1HKX8jtiCSBk1DUQoXDUHR0O91ZH8hhYoP2YcDvJXzoGGOpJGTsMWHGp1JKX8UnhcCh0GTHL2MrH5Y6vj+A0tUH7MnrMYh30/kX1uJCq5s9VxlPJriZcOI7hTf2q+X0HZ4V1Wx/ELWqD8VGXBj1Tt/BxbyiUkZ423Oo5SASFt+C+R8FhK1r1NQ02F1XF8nhYoP+RoqMO+eg6EhJE26l5tUq6UhwSHR5E44l6orSBv9dtWx/F5+s7lh/LXL4AKO7GDfk5odLzVcZQKKB0yexJ26dU0Ht2hTc8vkBYoP1N6YBt1P6wjpNsQ4i8aYHUcpQJS2sBbkfjOlG9dRHVJntVxfJYWKD9SV1FM6YZ3ITqZtKGTrY6jVMASWxCpo+8DoHDl37Xp+XnSAuUnnE3K50JDHcmjphMU2tJIKUopdwuPSyXG1fQ8f9Miq+P4JC1QfsLZpHwfkVk3EJXSxeo4SikgsddwgrtcRd33Kyk9sM3qOD5HC5QfqMjb939NyvtMsDqOUqqJ9OG/hOhkSje8S215kdVxfIoWKB9XV1HCsZVvQGgk6WPu0yblSnmZoNBwkkfPwDTWkb/yTYyj0epIPkPfzXyYcTSSv2w21FWRNPp+7aVcKS8VldyZDv1vxxT9SN6GD6yO4zO0QPmwvLXzcRQfJPrKO4hOv9jqOEqpFiReNorgzgOo+34lRXvWWh3HJ2iB8lFF3646eb9TUu/RVsdRSp2D2GxkjJrqvD9qy/tU5O23OpLX0wLlgyry9lOe/QES34X04b+wOo5SqpVswaGkj5uJhERybOVs6iqKrY7k1bRA+Zj6qjKOrXoDCYkgfdwD2IJDrI6klGqD0Oh4ksc+iKmvJu/rv+FoqLM6ktfSAuVDjKORvGWzobaSxJHTCY1OsDqSUuo8RKV2J3bQLzClR8hd+RbG4bA6klfSAuVD8tYtwHHsAFH9b6NDZk+r4yilLkBCz6GEXzqOhp+2Ubjtc6vjeCUtUD6iaM9a6vavJqTrIJKvuNrqOEqpdpA66GfY0npRtetz7WmiGVqgfEBF3n7Kt7yPxHcmfcSvrI6jlGonYrORefX9SHQypevnUVV0xOpIXkULlJerLS/i2MrZSEgk6eMe1EYRSvmZoNAI0sY9DGKjcOnfdCTeJrRAeTFHQx35y17F1FeTPPZBbRShlJ8Kj0slfsR9UF1K7tLXtDskF7cVKBGZKyKFIrLrLMtHi0iZiOS4pqfclcUXGYeD3BV/x5QeIXbQL4lK7W51JKWUG8V27k1Uv9tw2PeTt+59q+N4hWA3Pvc84BXgnRbWWWOMucGNGXxWYfZnNBzZTvhl40noOcTqOEopD0jucw11JUeo27+GY/GZJPUeY3UkS7ntDMoYsxrQ26TPQ8m+TVR9u5igzCxSr7rV6jhKKQ9KH/5LJLEbx7d+QPmRPVbHsZTVn0ENEZHtIvKliFx+tpVEZIaIZItItt1u92Q+j6ss+JGyje9hi0knY/Q0HT5DqQBjCw4hY9yDSHgsxavfpLb8mNWRLGPlu982oIsxpg/wMvDp2VY0xrxhjBlgjBmQnJzssYCeVldRgn3FaxAcRtq4h3XYdqUCVEhkLMljHsQ01pO/9G801tVYHckSlhUoY0y5MabC9fgLIEREkqzKY7XGumrylryEqaskafT9hMUkWh1JKWWhqJQuxA2ZgqM8z9lgKgC7Q7KsQIlImoiI6/FAV5aAHA/Z0VDP0SV/w1GeR9yQqUSn97A6klLKC8RffBWRl02kMXcnBVs+sTqOx7mtFZ+IvA+MBpJE5AjwZyAEwBgzG7gdeFBEGoBqYLIxxrgrj7cyDge5K+fisO8juv/txPcYaHUkpZQXSRlwE0fLcqn5dgn2iFiSs8ZZHclj3FagjDF3nWP5KziboQe0/I0f0vDTNsIvHUdyn2usjqOU8jJis5ExZjpHFr9AxbZFBIVFBcytJ9pEzEKFOYup3buc4C5XkTroZ1bHUUp5KVtwCJnjH8YWm0n5xvcoP7TT6kgeoQXKIsd2raQy51NsqT3JHH2PNidXSrUoKDSCjAmzICKOotVvUJG3z+pIbqfvihYo+m4dx7MXEJTYjY7jH0ZsQVZHUkr5gJDIGNInPoaERGBf9goVefutjuRWWqA8rGTfJo5vfA9bXGcyJ/waW3Co1ZGUUj4kLCaJtIm/QYJCsS972a+LlBYoDyrZv4XS9fOQ2AwyJ84iKDTC6khKKR8UHpdK6sTHTxapyoIDVkdyCy1QHlK0Zy1la+di65BG5rWPERweZXUkpZQPi4hPJ3XCY0hQCPalL/llkdIC5QH27V9Tvuk9JK4Tmdf9B8Hh0VZHUkr5gYiEDFInPA62YOxfv+B3nctqgXKzguzPqNy2iKCki+l43eN65qSUalcRCRmkXfsEhERSvOJVyg7usDpSu9EC5SbG4SBv/UKqd35OUHpvOk6cpZ2/KqXcIjwulfRrn4DwWEpWvU7J/i1WR2oXWqDcwDgc5K37h/Mm3M4D6Dh+JrbgEKtjKaX8WFhMIpnXP4F0SKFs7VyKvltndaQLpgWqnRmHg9zV71C3fw0h3QaTOWaa3ueklPKIkMhYMq/7DRLXkfKN71L07SqrI10QLVDtyDgc5K6aR/2PGwi9aBgZI6dqDxFKKY8KDo+m43W/wZbQlfLN71O0Z63Vkc6bvnu2o7wNC6k/uInQi0c6h23W4qSUskBQaDgdJ87CFteZ45vmU7x3vdWRzou+g7aTwm2fU/f9SoK7XEX6sLu0OCmlLBUUGkHmxFlIbAblG96l5IdsqyO1mb6LtoOiPWup2v4ZtrRe2vGrUsprBIdHkXntY9AhhdJ1b3H86F6rI7WJvpNeoNID31C+eT4S34WO18zUBhFKKa8SHB5NxoRZSFgHjq14lUr7YasjtZoWqAtQkbeP0nVzkagkMidqx69KKe8UGp1A6vhZiC0I+9KXqCkttDpSq2iBOk9VRUc4tvxVCIkgffyj2n2RUsqrRcSnk3z1w5iGWvKXvEh9VZnVkc5JC9R5qC0vovDrlwBDyjW/Jiwm0epISil1TlGp3UkcOQOqS8n96iUa66qtjtQiLVBt1FBTQd6SF6C+mqSxDxGZ2NHqSEop1WoxXa4gZvAvcZQd5eiSv+FoqLc60llpgWqDxroaji5+CVN5jLhh9xKd3sPqSEop1WYJPYcQ3e9nOOz7yF3xd4zDYXWkZmmBaiXjaCR32WxMySFiBv6CuO79rI6klFLnLbnPNYRfNp6GIznkrfuH1XGapQWqFYzDwdGVb9GYv4fIPjeT2Gu41ZGUUuqCpV51KyHdBlO3fw35W/5pdZwzaIFqhfyNi2g4tIXQS0aT0v86q+MopVS7EJuNjJFTCcq4gppdX3Bs1wqrI51CC9Q5FGR/Ru3eZQR3HkD6kElWx1FKqXYlNhuZV8/AltSdiuwPvGosKS1QLSjMWXxywMHMMfdqF0ZKKb9kCw4l45qHkZg0StfPo/ynb62OBGiBOqtju1ZQ9c0n2FIuIXPcA9qFkVLKrwWHR5E+/tdIWAzFq2ZTkbff6khaoJpT9N06jmcvxJbUnY4THtHRcJVSASE0Op60CY9BUBjHlr9CZeEhS/NogTpNyf4tHN/4Hra4TmRO0P71lFKBJTwuhdQJj4EEYV/6IlVFRyzLogWqibKDOyhbNw+JSSNz4qMEhUZYHUkppTwuIiGD5GtmgXFQuORFakoLLMmhBcql/MgeSta8CZHxZEx8lODwKKsjKaWUZaKSO5M87tfQWEv+4ueoLT/m8QxaoIDKggMUr3wNQqNIn/AYIZGxVkdSSinLRaV2J3HMQ1BfRd7i56irKPHo/gO+QFUd+wn70pchKJS0CY9pz+RKKdVEh8yexI+6H1NTRt5XL1BfVe6xfQd0gaopLaDw6xcBSBn/KOFxqRYnUkop7xPbuTfxw+/DUVFI7uLnaaip9Mh+A7ZA1ZYXkb/4OWisI3ncr3XYDKWUakFc937EDb0bU57P0SUv42ioc/s+A7JA1VeVkffV81BfReKYh4hK7WZ1JKWU8nrxPQbRYeBkTNGPHP36VYyj0a37C7gC1VBTSe7iF6CqhPgR0+mQ2dPqSEop5TMSLxtFZJ+baczfw9Hl7h1LKuAKVP6adzDl+cQOnUJs1yyr4yillM9J6X8dYb2uoeGnbdhzFrttP8Fue2YvlXTVz6jq3If4HoOsjqKUUj4rbeBtHIuIJcGN4+O57QxKROaKSKGI7DrLchGRl0Rkv4jsEJH+7srSVHhcCgk9h3piV0op5bfEZiO5zzVu7XHHnZf45gETW1h+LdDDNc0AXnNjFqWUUj7GbQXKGLMaKG5hlZuBd4zTRiBORNLdlUcppZRvsbKRRCbwU5Pvj7jmKaWUUpYWKGlmnml2RZEZIpItItl2u93NsZRSSnkDKwvUEaBTk+87ArnNrWiMecMYM8AYMyA5Odkj4ZRSSlnLygL1GTDF1ZpvMFBmjMmzMI9SSikv4rb7oETkfWA0kCQiR4A/AyEAxpjZwBfAdcB+oAq4x11ZlFJK+R63FShjzF3nWG6Ah9y1f6WUUr5NnHXCd4iIHTh0npsnAZ4fFvL8aFb30KzuoVndI1CydjHGnNHAwOcK1IUQkWxjzACrc7SGZnUPzeoemtU9Aj1rwHUWq5RSyjdogVJKKeWVAq1AvWF1gDbQrO6hWd1Ds7pHQGcNqM+glFJK+Y5AO4NSSinlI7RAKaWU8kp+U6BE5A4R2S0iDhEZcNqy37sGRtwrIhOazJ/omrdfRJ5sMr+biGwSkX0islBEQt2Ye6GI5LimgyKS45rfVUSqmyyb3WSbK0Vkpyv3SyLSXMe77sj6tIgcbZLpuibL2nSMPZD1/xOR71yDYX4iInGu+V53XJvJbskxayFPJxFZISJ7XH9js1zz2/x68FDeg67fY46IZLvmJYjI166/6a9FJN4135KBU1377tnk2OWISLmIPOotx1WaGXT2fI6jiEx1rb9PRKa2KYQxxi8moBfQE1gJDGgy/zJgOxAGdAN+AIJc0w9AdyDUtc5lrm0+ACa7Hs8GHvTQz/BX4CnX467ArrOstxkYgrNH+C+Baz2U72ngP5qZ3+Zj7IGs44Fg1+P/Bf7XW4/raRksO2YtZEoH+rsedwC+d/3O2/R68GDeg0DSafOeBZ50PX6yyevhOtfvWoDBwCaLjnEQkA908ZbjCowE+jf9e2nrcQQSgAOur/Gux/GtzeA3Z1DGmD3GmL3NLLoZWGCMqTXG/Iiz77+Brmm/MeaAMaYOWADc7PqveSywyLX928At7s7v2u+dwPvnWC8diDHGbDDOV8A7nsh3Dm06xp4IZIxZYoxpcH27EWdv+WflRcfVsmN2NsaYPGPMNtfj48AeWh677WyvByvdjPNvGU79m/aWgVOvBn4wxrTUS45Hj6tpftDZth7HCcDXxphiY0wJ8DUtj7R+Cr8pUC0428CIZ5ufCJQ2eXPz1ECKI4ACY8y+JvO6icg3IrJKREa45mW6Mp3g6YEeH3adws89cXpP24+xp92L87+7E7zxuJ7gLcesWSLSFegHbHLNasvrwVMMsEREtorIDNe8VOMaLcH1NcU13+qsJ0zm1H9OvfG4QtuP4wVl9qkCJSJLRWRXM1NL/2GebWDEts4/b63MfRenvkDzgM7GmH7A48A/RCTGHfnakPU14CKgryvfX09sdpZMVmY9sc4fgQZgvmuWJce1DbwlxxlEJBr4CHjUGFNO218PnjLMGNMfuBZ4SERGtrCu1VkR52fcNwEfumZ563FtiVveA9zWm7k7GGPGncdmLQ2M2Nz8YzhPT4NdZ1FnHUixtc6VW0SCgduAK5tsUwvUuh5vFZEfgEtcP0/Ty1UXnK8tWZtkfhP4t+vbth7jdtGK4zoVuAG42nXZzrLj2gatHsjTk0QkBGdxmm+M+RjAGFPQZHlrXw9uZ4zJdX0tFJFPcF4GKxCRdGNMnuvSU6E3ZHW5Fth24nh663F1aetxPIJz2KWm81e2dmc+dQZ1nj4DJotImIh0A3rg/DB8C9BDnC32QnGeYn/meiNbAdzu2n4q8E83ZxwHfGeMOXmJSUSSRSTI9bi7K/cB12n1cREZ7PrcaooH8p3I1PTa/K3AidY9bTrGHso6EfgdcJMxpqrJfK87rqex7Jidjet4zAH2GGOeazK/ra8HT2SNEpEOJx7jbCyzy5XpRAuypn/T3jBw6ilXT7zxuDbR1uP4FTBeROJdlyrHu+a1jrtagHh6wvmLPILzv+MC4Ksmy/6Is8XLXpq0zMLZ8uR717I/NpnfHecvfj/O0+4wN2efBzxw2ryfAbtxttrZBtzYZNkAnC/aH4BXcPUI4oFj/C6wE9jhekGmn+8x9kDW/Tivfee4ptneelybyW7JMWshz3Ccl2V2NDme153P68EDWbu7frfbXb/nP7rmJwLLgH2urwmu+QL8zZV1J01aAHsobyRQBMQ2mecVxxVn0cwD6nG+t047n+OI8zPg/a7pnrZk0K6OlFJKeaVAuMSnlFLKB2mBUkop5ZW0QCmllPJKWqCUUkp5JS1QSimlvJIWKKUsIiIVVmdQyptpgVJKKeWVtEAp5UVE5EZxjkX2jauvwVTX/GRxjr+zTUReF5FDIpJkdV6l3EkLlFLeZS0w2Dg7s10A/NY1/8/AcuPsBPUToLNF+ZTyGJ/qLFapANARWOjqjy0U+NE1fzjO7rwwxiwWkRKL8inlMXoGpZR3eRl4xRhzBXA/EO6ab8nw80pZSQuUUt4lFjjqejy1yfy1OEdcRkTG4xw+Wym/pp3FKmUREXFw6ng+z+HsDfp5nEVqI3CVMWa0iKTg7F06HlgFTAK6Gef4Vkr5JS1QSvkAEQkDGo0xDSIyBHjNGNPX6lxKuZM2klDKN3QGPhARG1AHTLc4j1Jup2dQSimlvJI2klBKKeWVtEAppZTySlqglFJKeSUtUEoppbySFiillFJe6f8HB6ZVarlMJKUAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "lags = np.arange(N) - N//2\n", "plt.plot(lags, corrs, color='gray', alpha=0.5, label='np.convolve')\n", "plt.plot(lags, corrs2.real, color='C1', alpha=0.5, label='fft_convolve')\n", "decorate(xlabel='Lag', ylabel='Correlation')\n", "len(corrs), len(corrs2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Confirm that the difference is small." ] }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2.60770320892334e-08" ] }, "execution_count": 48, "metadata": {}, "output_type": "execute_result" } ], "source": [ "diff = corrs - corrs2.real\n", "np.max(np.abs(diff))" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true, "jupyter": { "outputs_hidden": true } }, "outputs": [], "source": [] } ], "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.6.10" } }, "nbformat": 4, "nbformat_minor": 4 }