{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# An Introduction to the Scientific Python Ecosystem" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "While the Python language is an excellent tool for general-purpose programming, with a highly readable syntax, rich and powerful data types (strings, lists, sets, dictionaries, arbitrary length integers, etc) and a very comprehensive standard library, it was not designed specifically for mathematical and scientific computing. Neither the language nor its standard library have facilities for the efficient representation of multidimensional datasets, tools for linear algebra and general matrix manipulations (an essential building block of virtually all technical computing), nor any data visualization facilities.\n", "\n", "In particular, Python lists are very flexible containers that can be nested arbitrarily deep and which can hold any Python object in them, but they are poorly suited to represent efficiently common mathematical constructs like vectors and matrices. In contrast, much of our modern heritage of scientific computing has been built on top of libraries written in the Fortran language, which has native support for vectors and matrices as well as a library of mathematical functions that can efficiently operate on entire arrays at once.\n", "\n", "**Resources**\n", "\n", "For Numpy, Matplotlib, SciPy and related tools, these two resources will be particularly useful:\n", "\n", "* [Elegant SciPy](http://proquest.safaribooksonline.com/9781491922927), a collection of example-oriented lessons on how to best use the scientific Python toolkit, by the creator of Scikit-Image and BIDS researcher [Stéfan van der Walt](https://bids.berkeley.edu/people/st%C3%A9fan-van-der-walt). In addition to the previous O'Reilly reader, the [full book](https://github.com/elegant-scipy/elegant-scipy) as well as all the [notebooks](https://github.com/elegant-scipy/notebooks) are available. \n", "\n", "* Stéfan has also written a [very useful notebook](https://github.com/stefanv/teaching/blob/master/2016_aspp_reading_numpy/numpy_advanced.ipynb) about semi-advanced aspects of Numpy, with a [companion problem set](https://github.com/stefanv/teaching/blob/master/2016_aspp_reading_numpy/numpy_advanced_problems.ipynb).\n", "\n", "* Nicolas Rougier has a great [introductory Numpy tutorial](http://www.labri.fr/perso/nrougier/teaching/numpy/numpy.html), an [advanced Numpy book](http://www.labri.fr/perso/nrougier/from-python-to-numpy) and a collection of (often subtle!) [Numpy exercises](http://www.labri.fr/perso/nrougier/teaching/numpy.100/index.html).\n", "\n", "* The [online SciPy Lectures](http://www.scipy-lectures.org), and specifically for this topic, the [NumPy chapter](http://www.scipy-lectures.org/intro/numpy/index.html).\n", "\n", "* The [official Numpy documentation](https://docs.scipy.org/doc/numpy-1.13.0/index.html)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Scientific Python: a collaboration of projects built by scientists" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The scientific community has developed a set of related Python libraries that provide powerful array facilities, linear algebra, numerical algorithms, data visualization and more. In this appendix, we will briefly outline the tools most frequently used for this purpose, that make \"Scientific Python\" something far more powerful than the Python language alone.\n", "\n", "For reasons of space, we can only briefly describe the central Numpy library, but below we provide links to the websites of each project where you can read their full documentation in more detail.\n", "\n", "First, let's look at an overview of the basic tools that most scientists use in daily research with Python. The core of this ecosystem is composed of:\n", "\n", "* **Numpy:** the basic library that most others depend on, it provides a powerful array type that can represent multidimensional datasets of many different kinds and that supports arithmetic operations. Numpy also provides a library of common mathematical functions, basic linear algebra, random number generation and Fast Fourier Transforms. Numpy can be found at [numpy.scipy.org](http://numpy.scipy.org)\n", "\n", "* **Scipy:** a large collection of numerical algorithms that operate on numpy arrays and provide facilities for many common tasks in scientific computing, including dense and sparse linear algebra, optimization, special functions, statistics, n-dimensional image processing, signal processing and more. Scipy can be found at [scipy.org](http://scipy.org).\n", "\n", "* **Matplotlib:** a data visualization library with a strong focus on producing high-quality output, it supports a variety of common scientific plot types in two and three dimensions, with precise control over the final output for publication-quality results. Matplotlib can also be controlled interactively allowing graphical manipulation of your data (zooming, panning). It can be found at [matplotlib.org](http://matplotlib.org).\n", "\n", "* **IPython:** while not restricted to scientific uses, IPython is the interactive environment in which many scientists spend their time when working with the Python language. IPython provides a powerful Python shell that integrates tightly with Matplotlib and with easy access to the files and operating system, as well as components for high-level parallel computing. It can execute either in a terminal or in a graphical Qt console. IPython also has a web-based notebook interface that can combine code with text, mathematical expressions, figures and multimedia. It can be found at [ipython.org](http://ipython.org).\n", "\n", "While each of these tools can be installed separately, in our experience the most convenient way of accessing them today (especially on Windows and Mac computers) is to install the [Free Edition of the Enthought's Canopy Distribution](http://www.enthought.com/products/epd_free.php)or [Continuum Analytics' Anaconda](http://continuum.io/downloads), both of which contain all the above. Other free alternatives on Windows (but not on Macs) are [Python(x,y)](http://code.google.com/p/pythonxy) and [ Christoph Gohlke's packages page](http://www.lfd.uci.edu/~gohlke/pythonlibs).\n", "\n", "The four 'core' libraries above are in practice complemented by a number of other tools for more specialized work. We will briefly list here the ones that we think are the most commonly needed:\n", "\n", "* **Sympy:** a symbolic manipulation tool that turns a Python session into a computer algebra system. It integrates with the IPython notebook, rendering results in properly typeset mathematical notation. [sympy.org](http://sympy.org).\n", "\n", "* **Mayavi:** sophisticated 3d data visualization; [code.enthought.com/projects/mayavi](http://code.enthought.com/projects/mayavi).\n", "\n", "* **Cython:** a bridge language between Python and C, useful both to optimize performance bottlenecks in Python and to access C libraries directly; [cython.org](http://cython.org).\n", "\n", "* **Pandas:** high-performance data structures and data analysis tools, with powerful data alignment and structural manipulation capabilities; [pandas.pydata.org](http://pandas.pydata.org).\n", "\n", "* **Statsmodels:** statistical data exploration and model estimation; [statsmodels.sourceforge.net](http://statsmodels.sourceforge.net).\n", "\n", "* **Scikit-learn:** general purpose machine learning algorithms with a common interface; [scikit-learn.org](http://scikit-learn.org).\n", "\n", "* **Scikits-image:** image processing toolbox; [scikits-image.org](http://scikits-image.org).\n", "\n", "* **NetworkX:** analysis of complex networks (in the graph theoretical sense); [networkx.lanl.gov](http://networkx.lanl.gov).\n", "\n", "* **PyTables:** management of hierarchical datasets using the industry-standard HDF5 format; [www.pytables.org](http://www.pytables.org).\n", "\n", "Beyond these, for any specific problem you should look on the internet first, before starting to write code from scratch. There's a good chance that someone, somewhere, has written an open source library that you can use for part or all of your problem." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Motivation: the trapezoidal rule" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In subsequent sections we'll provide a basic introduction to the nuts and bolts of the basic scientific python tools; but we'll first motivate it with a brief example that illustrates what you can do in a few lines with these tools. For this, we will use the simple problem of approximating a definite integral with the trapezoid rule:\n", "\n", "$$\n", "\\int_{a}^{b} f(x)\\, dx \\approx \\frac{1}{2} \\sum_{k=1}^{N} \\left( x_{k} - x_{k-1} \\right) \\left( f(x_{k}) + f(x_{k-1}) \\right).\n", "$$\n", "\n", "Our task will be to compute this formula for a function such as:\n", "\n", "$$\n", "f(x) = (x-3)(x-5)(x-7)+85\n", "$$\n", "\n", "integrated between $a=1$ and $b=9$.\n", "\n", "First, we define the function and sample it evenly between 0 and 10 at 200 points:" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def f(x):\n", " return (x-3)*(x-5)*(x-7)+85\n", "\n", "import numpy as np\n", "x = np.linspace(0, 10, 200)\n", "y = f(x)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We select $a$ and $b$, our integration limits, and we take only a few points in that region to illustrate the error behavior of the trapezoid approximation:" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": true }, "outputs": [], "source": [ "a, b = 1, 9\n", "sampling = 10\n", "xint = x[np.logical_and(x>=a, x<=b)][::sampling]\n", "yint = y[np.logical_and(x>=a, x<=b)][::sampling]\n", "# Fix end points of the interval\n", "xint[0], xint[-1] = a, b\n", "yint[0], yint[-1] = f(a), f(b)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's plot both the function and the area below it in the trapezoid approximation:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%matplotlib inline\n", "import matplotlib.pyplot as plt\n", "plt.style.use('seaborn-dark')\n", "\n", "plt.plot(x, y, lw=2)\n", "plt.plot([a, a], [0, f(a)], color='black')\n", "plt.plot([b, b], [0, f(b)], color='black')\n", "plt.axis([a-1, b+1, 0, 140])\n", "plt.fill_between(xint, 0, yint, facecolor='gray', edgecolor='red', alpha=.4)\n", "plt.text(0.5 * (a + b), 30,r\"$\\int_a^b f(x)dx$\", horizontalalignment='center', fontsize=20);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Compute the integral both at high accuracy and with the trapezoid approximation" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The integral is: 680 +/- 7.5e-12\n", "The trapezoid approximation with 16 points is: 681.124797875\n", "The absolute error is: 1.1247978745\n" ] } ], "source": [ "from scipy.integrate import quad, trapz\n", "\n", "integral, error = quad(f, a, b)\n", "trap_integral = trapz(yint, xint)\n", "print(\"The integral is: %g +/- %.1e\" % (integral, error))\n", "print(\"The trapezoid approximation with\", len(xint), \"points is:\", trap_integral)\n", "print(\"The absolute error is:\", abs(integral - trap_integral))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This simple example showed us how, combining the numpy, scipy and matplotlib libraries we can provide an illustration of a standard method in elementary calculus with just a few lines of code. We will now discuss with more detail the basic usage of these tools.\n", "\n", "A note on visual styles: matplotlib has a rich system for controlling the visual style of all plot elements. [This page](https://tonysyu.github.io/raw_content/matplotlib-style-gallery/gallery.html) is a gallery that illustrates how each style choice affects different plot types, which you can use to select the most appropriate to your needs." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# NumPy arrays: the right data structure for scientific computing" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Basics of Numpy arrays" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We now turn our attention to the Numpy library, which forms the base layer for the entire 'scipy ecosystem'. Once you have installed numpy, you can import it as" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import numpy" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "though in this book we will use the common shorthand" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import numpy as np" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As mentioned above, the main object provided by numpy is a powerful array. We'll start by exploring how the numpy array differs from Python lists. We start by creating a simple list and an array with the same contents of the list:" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": true }, "outputs": [], "source": [ "lst = [10, 20, 30, 40]\n", "arr = np.array([10, 20, 30, 40])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Elements of a one-dimensional array are accessed with the same syntax as a list:" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "10" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "lst[0]" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "10" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr[0]" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "40" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr[-1]" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([30, 40])" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr[2:]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The first difference to note between lists and arrays is that arrays are *homogeneous*; i.e. all elements of an array must be of the same type. In contrast, lists can contain elements of arbitrary type. For example, we can change the last element in our list above to be a string:" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[10, 20, 30, 'a string inside a list']" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "lst[-1] = 'a string inside a list'\n", "lst" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "but the same can not be done with an array, as we get an error message:" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "ename": "ValueError", "evalue": "invalid literal for int() with base 10: 'a string inside an array'", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0marr\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'a string inside an array'\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mValueError\u001b[0m: invalid literal for int() with base 10: 'a string inside an array'" ] } ], "source": [ "arr[-1] = 'a string inside an array'" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The information about the type of an array is contained in its *dtype* attribute:" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "dtype('int64')" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr.dtype" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Once an array has been created, its dtype is fixed and it can only store elements of the same type. For this example where the dtype is integer, if we store a floating point number it will be automatically converted into an integer:" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([10, 20, 30, -2])" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr[-1] = round(-1.99999)\n", "arr" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Above we created an array from an existing list; now let us now see other ways in which we can create arrays, which we'll illustrate next. A common need is to have an array initialized with a constant value, and very often this value is 0 or 1 (suitable as starting value for additive and multiplicative loops respectively); `zeros` creates arrays of all zeros, with any desired dtype:" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([ 0., 0., 0., 0., 0.])" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.zeros(5, float)" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([0, 0, 0])" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.zeros(3, int)" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([ 0.+0.j, 0.+0.j, 0.+0.j])" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.zeros(3, complex)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "and similarly for `ones`:" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "5 ones: [ 1. 1. 1. 1. 1.]\n" ] } ], "source": [ "print('5 ones:', np.ones(5))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If we want an array initialized with an arbitrary value, we can create an empty array and then use the fill method to put the value we want into the array:" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([ 5.5, 5.5, 5.5, 5.5])" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a = np.empty(4)\n", "a.fill(5.5)\n", "a" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This illustrates the internal structure of a Numpy array (taken from the [official Numpy docs](https://docs.scipy.org/doc/numpy-1.13.0/reference/arrays.html):\n", "\n", "\n", "\n", "Numpy also offers the `arange` function, which works like the builtin `range` but returns an array instead of a list:" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([ 1, 6, 11, 16, 21, 26, 31, 36, 41, 46, 51, 56, 61, 66, 71, 76, 81,\n", " 86, 91, 96])" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.arange(1, 100, 5)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "and the `linspace` and `logspace` functions to create linearly and logarithmically-spaced grids respectively, with a fixed number of points and including both ends of the specified interval:" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "A linear grid between 0 and 1: [ 0. 0.25 0.5 0.75 1. ]\n", "A logarithmic grid between 10**1 and 10**4: [ 10. 100. 1000. 10000.]\n" ] } ], "source": [ "print(\"A linear grid between 0 and 1:\", np.linspace(0, 1, 5))\n", "print(\"A logarithmic grid between 10**1 and 10**4: \", np.logspace(1, 4, 4))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Finally, it is often useful to create arrays with random numbers that follow a specific distribution. The `np.random` module contains a number of functions that can be used to this effect, for example this will produce an array of 5 random samples taken from a standard normal distribution (0 mean and variance 1):" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([ 0.91350034, 0.63161325, -0.3609416 , 0.75557583, -1.80078849])" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.random.randn(5)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "whereas this will also give 5 samples, but from a normal distribution with a mean of 10 and a variance of 3:" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([ 9.38384542, 9.93356931, 12.20141612, 8.71316476, 8.43669464])" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "norm10 = np.random.normal(10, 3, 5)\n", "norm10" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Indexing with other arrays" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Above we saw how to index arrays with single numbers and slices, just like Python lists. But arrays allow for a more sophisticated kind of indexing which is very powerful: you can index an array with another array, and in particular with an array of boolean values. This is particluarly useful to extract information from an array that matches a certain condition.\n", "\n", "Consider for example that in the array `norm10` we want to replace all values above 9 with the value 0. We can do so by first finding the *mask* that indicates where this condition is true or false:" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([ True, True, True, False, False], dtype=bool)" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "mask = norm10 > 9\n", "mask" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now that we have this mask, we can use it to either read those values or to reset them to 0:" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Values above 9: [ 9.38384542 9.93356931 12.20141612]\n" ] } ], "source": [ "print('Values above 9:', norm10[mask])" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Resetting all values above 9 to 0...\n", "[ 9. 9. 9. 8.71316476 8.43669464]\n" ] } ], "source": [ "print('Resetting all values above 9 to 0...')\n", "norm10[mask] = 9\n", "print(norm10)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Arrays with more than one dimension" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Up until now all our examples have used one-dimensional arrays. But Numpy can create arrays of aribtrary dimensions, and all the methods illustrated in the previous section work with more than one dimension. For example, a list of lists can be used to initialize a two dimensional array:" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[1, 2],\n", " [3, 4]])" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "lst2 = [[1, 2], [3, 4]]\n", "arr2 = np.array([[1, 2], [3, 4]])\n", "arr2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "With two-dimensional arrays we start seeing the power of numpy: while a nested list can be indexed using repeatedly the `[ ]` operator, multidimensional arrays support a much more natural indexing syntax with a single `[ ]` and a set of indices separated by commas:" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2\n", "2\n" ] } ], "source": [ "print(lst2[0][1])\n", "print(arr2[0,1])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Most of the array creation functions listed above can be used with more than one dimension, for example:" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[1, 2, 3],\n", " [4, 5, 6]])" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.array([[1,2,3],[4,5,6]], order='F')" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 0., 0., 0.],\n", " [ 0., 0., 0.]])" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.zeros((2,3))" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 10.41562345, 6.46572124, 9.50561014, 8.89613454],\n", " [ 8.64172688, 11.99132109, 8.53578837, 12.92544428]])" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.random.normal(10, 3, (2, 4))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In fact, the shape of an array can be changed at any time, as long as the total number of elements is unchanged. For example, if we want a 2x4 array with numbers increasing from 0, the easiest way to create it is:" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[0 1 2 3]\n", " [4 5 6 7]]\n" ] } ], "source": [ "arr = np.arange(8).reshape(2,4)\n", "print(arr)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "With multidimensional arrays, you can also use slices, and you can mix and match slices and single indices in the different dimensions (using the same array as above):" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Slicing in the second row: [6 7]\n", "All rows, third column : [2 6]\n" ] } ], "source": [ "print('Slicing in the second row:', arr[1, 2:4])\n", "print('All rows, third column :', arr[:, 2])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If you only provide one index, then you will get an array with one less dimension containing that row:" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "First row: [0 1 2 3]\n", "Second row: [4 5 6 7]\n" ] } ], "source": [ "print('First row: ', arr[0])\n", "print('Second row: ', arr[1])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The following provides a visual overview of indexing in Numpy:\n", "\n", "\n", "\n", "Now that we have seen how to create arrays with more than one dimension, it's a good idea to look at some of the most useful properties and methods that arrays have. The following provide basic information about the size, shape and data in the array:" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Data type : int64\n", "Total number of elements : 8\n", "Number of dimensions : 2\n", "Shape (dimensionality) : (2, 4)\n", "Memory used (in bytes) : 64\n" ] } ], "source": [ "print('Data type :', arr.dtype)\n", "print('Total number of elements :', arr.size)\n", "print('Number of dimensions :', arr.ndim)\n", "print('Shape (dimensionality) :', arr.shape)\n", "print('Memory used (in bytes) :', arr.nbytes)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Arrays also have many useful methods, some especially useful ones are:" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Minimum and maximum : 0 7\n", "Sum and product of all elements : 28 0\n", "Mean and standard deviation : 3.5 2.29128784748\n" ] } ], "source": [ "print('Minimum and maximum :', arr.min(), arr.max())\n", "print('Sum and product of all elements :', arr.sum(), arr.prod())\n", "print('Mean and standard deviation :', arr.mean(), arr.std())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For these methods, the above operations area all computed on all the elements of the array. But for a multidimensional array, it's possible to do the computation along a single dimension, by passing the `axis` parameter; for example:" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "For the following array:\n", " [[0 1 2 3]\n", " [4 5 6 7]]\n", "The sum of elements along the rows is : [ 6 22]\n", "The sum of elements along the columns is : [ 4 6 8 10]\n" ] } ], "source": [ "print('For the following array:\\n', arr)\n", "print('The sum of elements along the rows is :', arr.sum(axis=1))\n", "print('The sum of elements along the columns is :', arr.sum(axis=0))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As you can see in this example, the value of the `axis` parameter is the dimension which will be *consumed* once the operation has been carried out. This is why to sum along the rows we use `axis=0`. \n", "\n", "This can be easily illustrated with an example that has more dimensions; we create an array with 4 dimensions and shape `(3,4,5,6)` and sum along the axis number 2 (i.e. the *third* axis, since in Python all counts are 0-based). That consumes the dimension whose length was 5, leaving us with a new array that has shape `(3,4,6)`:" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(3, 4, 6)" ] }, "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.zeros((3,4,5,6)).sum(2).shape" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Another widely used property of arrays is the `.T` attribute, which allows you to access the transpose of the array:" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Array:\n", " [[0 1 2 3]\n", " [4 5 6 7]]\n", "Transpose:\n", " [[0 4]\n", " [1 5]\n", " [2 6]\n", " [3 7]]\n" ] } ], "source": [ "print('Array:\\n', arr)\n", "print('Transpose:\\n', arr.T)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We don't have time here to look at all the methods and properties of arrays, here's a complete list. Simply try exploring some of these IPython to learn more, or read their description in the full Numpy documentation:\n", "\n", " arr.T arr.copy arr.getfield arr.put arr.squeeze\n", " arr.all arr.ctypes arr.imag arr.ravel arr.std\n", " arr.any arr.cumprod arr.item arr.real arr.strides\n", " arr.argmax arr.cumsum arr.itemset arr.repeat arr.sum\n", " arr.argmin arr.data arr.itemsize arr.reshape arr.swapaxes\n", " arr.argsort arr.diagonal arr.max arr.resize arr.take\n", " arr.astype arr.dot arr.mean arr.round arr.tofile\n", " arr.base arr.dtype arr.min arr.searchsorted arr.tolist\n", " arr.byteswap arr.dump arr.nbytes arr.setasflat arr.tostring\n", " arr.choose arr.dumps arr.ndim arr.setfield arr.trace\n", " arr.clip arr.fill arr.newbyteorder arr.setflags arr.transpose\n", " arr.compress arr.flags arr.nonzero arr.shape arr.var\n", " arr.conj arr.flat arr.prod arr.size arr.view\n", " arr.conjugate arr.flatten arr.ptp arr.sort " ] }, { "cell_type": "code", "execution_count": 41, "metadata": { "collapsed": true }, "outputs": [], "source": [ "np.argmax?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Excercise: the Trapezoidal rule\n", "\n", "**Illustrates**: basic array slicing, functions as first class objects.\n", "\n", "In this exercise, you are tasked with implementing the simple trapezoid\n", "rule formula for numerical integration that we illustrated above.\n", "\n", "\n", "If we denote by $x_{i}$ ($i=0,\\ldots,n,$ with $x_{0}=a$ and $x_{n}=b$) the abscissas\n", "where the function is sampled, then\n", "\n", "$$\\int_{a}^{b}f(x)dx\\approx\\frac{1}{2}\\sum_{i=1}^{n}\\left(x_{i}-x_{i-1}\\right)\\left(f(x_{i})+f(x_{i-1})\\right).$$\n", "\n", "The common case of using equally spaced abscissas with spacing $h=(b-a)/n$ reads:\n", "\n", "$$\\int_{a}^{b}f(x)dx\\approx\\frac{h}{2}\\sum_{i=1}^{n}\\left(f(x_{i})+f(x_{i-1})\\right).$$\n", "\n", "One frequently receives the function values already precomputed, $y_{i}=f(x_{i}),$ so the formula becomes\n", "\n", "$$\\int_{a}^{b}f(x)dx\\approx\\frac{1}{2}\\sum_{i=1}^{n}\\left(x_{i}-x_{i-1}\\right)\\left(y_{i}+y_{i-1}\\right).$$\n", "\n", "In this exercise, you'll need to write two functions, `trapz` and `trapzf`. `trapz` applies the trapezoid formula to pre-computed values, implementing equation trapz, while `trapzf` takes a function $f$ as input, as well as the total number of samples to evaluate, and computes the equation above.\n", "\n", "Test it and show that it produces correct values for some simple integrals you can compute analytically or compare your answers against `scipy.integrate.trapz` as above, using our test function $f(x)$." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Operating with arrays" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Arrays support all regular arithmetic operators, and the numpy library also contains a complete collection of basic mathematical functions that operate on arrays. It is important to remember that in general, all operations with arrays are applied *element-wise*, i.e., are applied to all the elements of the array at the same time. Consider for example:" ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0 1 2 3] + [10 11 12 13] = [10 12 14 16]\n" ] } ], "source": [ "arr1 = np.arange(4)\n", "arr2 = np.arange(10, 14)\n", "print(arr1, '+', arr2, '=', arr1+arr2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Importantly, you must remember that even the multiplication operator is by default applied element-wise, it is *not* the matrix multiplication from linear algebra (as is the case in Matlab, for example):" ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0 1 2 3] * [10 11 12 13] = [ 0 11 24 39]\n" ] } ], "source": [ "print(arr1, '*', arr2, '=', arr1*arr2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "While this means that in principle arrays must always match in their dimensionality in order for an operation to be valid, numpy will *broadcast* dimensions when possible. For example, suppose that you want to add the number 1.5 to `arr1`; the following would be a valid way to do it:" ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([ 1.5, 2.5, 3.5, 4.5])" ] }, "execution_count": 44, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr1 + 1.5*np.ones(4)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "But thanks to numpy's broadcasting rules, the following is equally valid:" ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([ 1.5, 2.5, 3.5, 4.5])" ] }, "execution_count": 45, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr1 + 1.5" ] }, { "cell_type": "code", "execution_count": 46, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(4,)" ] }, "execution_count": 46, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr1.shape" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In this case, numpy looked at both operands and saw that the first (`arr1`) was a one-dimensional array of length 4 and the second was a scalar, considered a zero-dimensional object. The broadcasting rules allow numpy to:\n", "\n", "* *create* new dimensions of length 1 (since this doesn't change the size of the array)\n", "* 'stretch' a dimension of length 1 that needs to be matched to a dimension of a different size.\n", "\n", "So in the above example, the scalar 1.5 is effectively:\n", "\n", "* first 'promoted' to a 1-dimensional array of length 1\n", "* then, this array is 'stretched' to length 4 to match the dimension of `arr1`.\n", "\n", "After these two operations are complete, the addition can proceed as now both operands are one-dimensional arrays of length 4.\n", "\n", "This broadcasting behavior is in practice enormously powerful, especially because when numpy broadcasts to create new dimensions or to 'stretch' existing ones, it doesn't actually replicate the data. In the example above the operation is carried *as if* the 1.5 was a 1-d array with 1.5 in all of its entries, but no actual array was ever created. This can save lots of memory in cases when the arrays in question are large and can have significant performance implications.\n", "\n", "The general rule is: when operating on two arrays, NumPy compares their shapes element-wise. It starts with the trailing dimensions, and works its way forward, creating dimensions of length 1 as needed. Two dimensions are considered compatible when\n", "\n", "* they are equal to begin with, or\n", "* one of them is 1; in this case numpy will do the 'stretching' to make them equal.\n", "\n", "If these conditions are not met, a `ValueError: operands could not be broadcast together with shapes ...` exception is thrown, indicating that the arrays have incompatible shapes. The size of the resulting array is the maximum size along each dimension of the input arrays." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This shows how the broadcasting rules work in several dimensions:" ] }, { "cell_type": "code", "execution_count": 47, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[0 1 2 3]\n", " [4 5 6 7]] \n", "\n", "+ [2 3 4 5] \n", "----------------\n", " [[ 2 4 6 8]\n", " [ 6 8 10 12]]\n" ] } ], "source": [ "b = np.array([2, 3, 4, 5])\n", "print(arr, '\\n\\n+', b , '\\n----------------\\n', arr + b)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now, how could you use broadcasting to say add `[4, 6]` along the rows to `arr` above? Simply performing the direct addition will produce the error we previously mentioned:" ] }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [ { "ename": "ValueError", "evalue": "operands could not be broadcast together with shapes (2,4) (2,) ", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mc\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0marray\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m4\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m6\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0marr\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mc\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mValueError\u001b[0m: operands could not be broadcast together with shapes (2,4) (2,) " ] } ], "source": [ "c = np.array([4, 6])\n", "arr + c" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "According to the rules above, the array `c` would need to have a *trailing* dimension of 1 for the broadcasting to work. It turns out that numpy allows you to 'inject' new dimensions anywhere into an array on the fly, by indexing it with the special object `np.newaxis`:" ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[4],\n", " [6]])" ] }, "execution_count": 49, "metadata": {}, "output_type": "execute_result" } ], "source": [ "c[:, np.newaxis]" ] }, { "cell_type": "code", "execution_count": 50, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(2,)\n", "(2, 1)\n" ] } ], "source": [ "print(c.shape)\n", "print((c[:, np.newaxis]).shape)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This is exactly what we need, and indeed it works:" ] }, { "cell_type": "code", "execution_count": 51, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 4, 5, 6, 7],\n", " [10, 11, 12, 13]])" ] }, "execution_count": 51, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr + c[:, np.newaxis]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For the full broadcasting rules, please see the official Numpy docs, which describe them in detail and with more complex examples." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As we mentioned before, Numpy ships with a full complement of mathematical functions that work on entire arrays, including logarithms, exponentials, trigonometric and hyperbolic trigonometric functions, etc. Furthermore, scipy ships a rich special function library in the `scipy.special` module that includes Bessel, Airy, Fresnel, Laguerre and other classical special functions. For example, sampling the sine function at 100 points between $0$ and $2\\pi$ is as simple as:" ] }, { "cell_type": "code", "execution_count": 52, "metadata": { "collapsed": true }, "outputs": [], "source": [ "x = np.linspace(0, 2*np.pi, 100)\n", "y = np.sin(x)" ] }, { "cell_type": "code", "execution_count": 53, "metadata": {}, "outputs": [ { "ename": "TypeError", "evalue": "only length-1 arrays can be converted to Python scalars", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mmath\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mmath\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msin\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mTypeError\u001b[0m: only length-1 arrays can be converted to Python scalars" ] } ], "source": [ "import math\n", "math.sin(x)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Linear algebra in numpy" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Numpy ships with a basic linear algebra library, and all arrays have a `dot` method whose behavior is that of the scalar dot product when its arguments are vectors (one-dimensional arrays) and the traditional matrix multiplication when one or both of its arguments are two-dimensional arrays:" ] }, { "cell_type": "code", "execution_count": 54, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[2 3 4] . [1 0 1] = 6\n" ] } ], "source": [ "v1 = np.array([2, 3, 4])\n", "v2 = np.array([1, 0, 1])\n", "print(v1, '.', v2, '=', v1.dot(v2))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In Python 3.5, the new `@` operator was introduced to represent [matrix multiplication](http://legacy.python.org/dev/peps/pep-0465), at the request of the scientific community. While `np.dot` and the `.dot` method of arrays continue to exist, using `@` tends to produce much more readable code. We will use `@` henceforth in this tutorial. The above line would now read:" ] }, { "cell_type": "code", "execution_count": 55, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[2 3 4] . [1 0 1] = 6\n" ] } ], "source": [ "print(v1, '.', v2, '=', v1 @ v2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here is a regular matrix-vector multiplication, note that the array `v1` should be viewed as a *column* vector in traditional linear algebra notation; numpy makes no distinction between row and column vectors and simply verifies that the dimensions match the required rules of matrix multiplication, in this case we have a $2 \\times 3$ matrix multiplied by a 3-vector, which produces a 2-vector:" ] }, { "cell_type": "code", "execution_count": 56, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[0 1 2]\n", " [3 4 5]] x [2 3 4] = [11 38]\n" ] } ], "source": [ "A = np.arange(6).reshape(2, 3)\n", "print(A, 'x', v1, '=', A @ v1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For matrix-matrix multiplication, the same dimension-matching rules must be satisfied, e.g. consider the difference between $A \\times A^T$:" ] }, { "cell_type": "code", "execution_count": 57, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[ 5 14]\n", " [14 50]]\n" ] } ], "source": [ "print(A @ A.T)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "and $A^T \\times A$:" ] }, { "cell_type": "code", "execution_count": 58, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[ 9 12 15]\n", " [12 17 22]\n", " [15 22 29]]\n" ] } ], "source": [ "print(A.T @ A)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Furthermore, the `numpy.linalg` module includes additional functionality such as determinants, matrix norms, Cholesky, eigenvalue and singular value decompositions, etc. For even more linear algebra tools, `scipy.linalg` contains the majority of the tools in the classic LAPACK libraries as well as functions to operate on sparse matrices. We refer the reader to the Numpy and Scipy documentations for additional details on these." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Reading and writing arrays to disk" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Numpy lets you read and write arrays into files in a number of ways. In order to use these tools well, it is critical to understand the difference between a *text* and a *binary* file containing numerical data. In a text file, the number $\\pi$ could be written as \"3.141592653589793\", for example: a string of digits that a human can read, with in this case 15 decimal digits. In contrast, that same number written to a binary file would be encoded as 8 characters (bytes) that are not readable by a human but which contain the exact same data that the variable `pi` had in the computer's memory. \n", "\n", "The tradeoffs between the two modes are thus:\n", "\n", "* Text mode: occupies more space, precision can be lost (if not all digits are written to disk), but is readable and editable by hand with a text editor. Can *only* be used for one- and two-dimensional arrays.\n", "\n", "* Binary mode: compact and exact representation of the data in memory, can't be read or edited by hand. Arrays of any size and dimensionality can be saved and read without loss of information.\n", "\n", "First, let's see how to read and write arrays in text mode. The `np.savetxt` function saves an array to a text file, with options to control the precision, separators and even adding a header:" ] }, { "cell_type": "code", "execution_count": 59, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "# My dataset\r\n", "0.00e+00 1.00e+00 2.00e+00 3.00e+00 4.00e+00\r\n", "5.00e+00 6.00e+00 7.00e+00 8.00e+00 9.00e+00\r\n" ] } ], "source": [ "arr = np.arange(10).reshape(2, 5)\n", "np.savetxt('test.out', arr, fmt='%.2e', header=\"My dataset\")\n", "!cat test.out" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "And this same type of file can then be read with the matching `np.loadtxt` function:" ] }, { "cell_type": "code", "execution_count": 60, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[ 0. 1. 2. 3. 4.]\n", " [ 5. 6. 7. 8. 9.]]\n" ] } ], "source": [ "arr2 = np.loadtxt('test.out')\n", "print(arr2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For binary data, Numpy provides the `np.save` and `np.savez` routines. The first saves a single array to a file with `.npy` extension, while the latter can be used to save a *group* of arrays into a single file with `.npz` extension. The files created with these routines can then be read with the `np.load` function.\n", "\n", "Let us first see how to use the simpler `np.save` function to save a single array:" ] }, { "cell_type": "code", "execution_count": 61, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Any differences? False\n" ] } ], "source": [ "np.save('test.npy', arr2)\n", "# Now we read this back\n", "arr2n = np.load('test.npy')\n", "# Let's see if any element is non-zero in the difference.\n", "# A value of True would be a problem.\n", "print('Any differences?', np.any(arr2-arr2n))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now let us see how the `np.savez` function works. You give it a filename and either a sequence of arrays or a set of keywords. In the first mode, the function will auotmatically name the saved arrays in the archive as `arr_0`, `arr_1`, etc:" ] }, { "cell_type": "code", "execution_count": 62, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['arr_0', 'arr_1']" ] }, "execution_count": 62, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.savez('test.npz', arr, arr2)\n", "arrays = np.load('test.npz')\n", "arrays.files" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Alternatively, we can explicitly choose how to name the arrays we save:" ] }, { "cell_type": "code", "execution_count": 63, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['array1', 'array2']" ] }, "execution_count": 63, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.savez('test.npz', array1=arr, array2=arr2)\n", "arrays = np.load('test.npz')\n", "arrays.files" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The object returned by `np.load` from an `.npz` file works like a dictionary, though you can also access its constituent files by attribute using its special `.f` field; this is best illustrated with an example with the `arrays` object from above:" ] }, { "cell_type": "code", "execution_count": 64, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "First row of first array: [0 1 2 3 4]\n", "First row of first array: [0 1 2 3 4]\n" ] } ], "source": [ "print('First row of first array:', arrays['array1'][0])\n", "# This is an equivalent way to get the same field\n", "print('First row of first array:', arrays.f.array1[0])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This `.npz` format is a very convenient way to package compactly and without loss of information, into a single file, a group of related arrays that pertain to a specific problem. At some point, however, the complexity of your dataset may be such that the optimal approach is to use one of the standard formats in scientific data processing that have been designed to handle complex datasets, such as NetCDF or HDF5. \n", "\n", "Fortunately, there are tools for manipulating these formats in Python, and for storing data in other ways such as databases. A complete discussion of the possibilities is beyond the scope of this discussion, but of particular interest for scientific users we at least mention the following:\n", "\n", "* The `scipy.io` module contains routines to read and write Matlab files in `.mat` format and files in the NetCDF format that is widely used in certain scientific disciplines.\n", "\n", "* For manipulating files in the HDF5 format, there are two excellent options in Python: The PyTables project offers a high-level, object oriented approach to manipulating HDF5 datasets, while the h5py project offers a more direct mapping to the standard HDF5 library interface. Both are excellent tools; if you need to work with HDF5 datasets you should read some of their documentation and examples and decide which approach is a better match for your needs." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# High quality data visualization with Matplotlib" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The [matplotlib](http://matplotlib.sf.net) library is a powerful tool capable of producing complex publication-quality figures with fine layout control in two and three dimensions; here we will only provide a minimal self-contained introduction to its usage that covers the functionality needed for the rest of the book. We encourage the reader to read the tutorials included with the matplotlib documentation as well as to browse its extensive gallery of examples that include source code.\n", "\n", "Just as we typically use the shorthand `np` for Numpy, we will use `plt` for the `matplotlib.pyplot` module where the easy-to-use plotting functions reside (the library contains a rich object-oriented architecture that we don't have the space to discuss here):" ] }, { "cell_type": "code", "execution_count": 65, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import matplotlib.pyplot as plt" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The most frequently used function is simply called `plot`, here is how you can make a simple plot of $\\sin(x)$ for $x \\in [0, 2\\pi]$ with labels and a grid (we use the semicolon in the last line to suppress the display of some information that is unnecessary right now):" ] }, { "cell_type": "code", "execution_count": 66, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "x = np.linspace(0, 2*np.pi)\n", "y = np.sin(x)\n", "plt.figure()\n", "plt.plot(x,y, label='sin(x)')\n", "plt.legend()\n", "plt.grid()\n", "plt.title('Harmonic')\n", "plt.xlabel('x')\n", "plt.ylabel('y');" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can control the style, color and other properties of the markers, for example:" ] }, { "cell_type": "code", "execution_count": 67, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.plot(x, y, linewidth=2);" ] }, { "cell_type": "code", "execution_count": 68, "metadata": {}, "outputs": [ { "data": { "image/png": "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\nAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.plot(x, y, 'o', markersize=5, color='r');" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We will now see how to create a few other common plot types, such as a simple error plot:" ] }, { "cell_type": "code", "execution_count": 69, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# example data\n", "x = np.arange(0.1, 4, 0.5)\n", "y = np.exp(-x)\n", "\n", "# example variable error bar values\n", "yerr = 0.1 + 0.2*np.sqrt(x)\n", "xerr = 0.1 + yerr\n", "\n", "# First illustrate basic pyplot interface, using defaults where possible.\n", "plt.figure()\n", "plt.errorbar(x, y, xerr=0.2, yerr=0.4)\n", "plt.title(\"Simplest errorbars, 0.2 in x, 0.4 in y\");" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A simple log plot" ] }, { "cell_type": "code", "execution_count": 70, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "x = np.linspace(-5, 5)\n", "y = np.exp(-x**2)\n", "plt.semilogy(x, y);\n", "#plt.plot(x, y);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A histogram annotated with text inside the plot, using the `text` function:" ] }, { "cell_type": "code", "execution_count": 71, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n516zJXbripMAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "mu, sigma = 100, 15\n", "x = mu + sigma * np.random.randn(10000)\n", "\n", "# the histogram of the data\n", "n, bins, patches = plt.hist(x, 50, normed=1, facecolor='g', alpha=0.75)\n", "\n", "plt.xlabel('Smarts')\n", "plt.ylabel('Probability')\n", "plt.title('Histogram of IQ')\n", "# This will put a text fragment at the position given:\n", "plt.text(55, .027, r'$\\mu=100,\\ \\sigma=15$', fontsize=14)\n", "plt.axis([40, 160, 0, 0.03])\n", "plt.grid()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Image display" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The `imshow` command can display single or multi-channel images. A simple array of random numbers, plotted in grayscale:" ] }, { "cell_type": "code", "execution_count": 72, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from matplotlib import cm\n", "\n", "plt.imshow(np.random.rand(5, 10), cmap=cm.gray, interpolation='nearest');" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A real photograph is a multichannel image, `imshow` interprets it correctly:" ] }, { "cell_type": "code", "execution_count": 73, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Dimensions of the array img: (375, 500, 3)\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAUwAAAD3CAYAAAB2FG1dAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4wLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvpW3flQAAIABJREFUeJzsfXmwZVV1/nfufN+7b+x+PdF0I3QD\nQtNoi2IQNbFELAQxKVLggCaYmNI4YIJD0B9OiDgRFSVYRlPGiCMaTEU0gHEAEZWZbmVooJue3zzc\nefr90bUP661ea+1973vpp1W9ql69c8/Zw9p7r/Wtb+9zzj5Ru91u44gckSNyRI6IVxJLrcAROSJH\n5Ij8scgRwDwiR+SIHJFAOQKYR+SIHJEjEihHAPOIHJEjckQC5QhgHpEjckSOSKAcAcwjckSOyBEJ\nlNRiFtZqtfDBD34QDz/8MDKZDK688kqsX79+Mas4IkfkiByRJZNFZZi33norarUavvWtb+Ef//Ef\ncfXVVy9m8UfkiByRI7KksqiAeffdd+OFL3whAOBZz3oWHnroocUs/ogckSNyRJZUFnVKPjc3h0Kh\nEP9OJpNoNBpIpQ5W89a3vhXtdhtRFCGKIgCIj935RCIRn6f/AcTXaD5+TH/T64lEIq5HKp/qoL38\nxM/TOrnQ8nzC9dfK0vSwdHTnrHa5umnfUN15OyxdrbS+cnhaOt7uN9UxiiK0Wi3RVvg4h+jD2+w7\nz69bY9Rut1V74P3Mx0HSXROpDk1nqwxJH16H1W7+3x3T8/S3lNZ3bNVj1f3Zz35WbbtPFhUwC4UC\nisVi/LvVasVg6YQCIgc8DnRSWveb56OGwsuR6qBCy6DlO5Eci+siiXaNGxsFBilvCPBaaXhQ8OnI\n+5T2meQkoSCoBQZLBycOLKWxkgBTOuer19d/VjlcNwuILeDU+lJLL42nFJgkgNQCIwccLXDSYMX1\npO3ktiLZjgX0rh6rX2l6Dsq03oW+Cb6ogLllyxb87//+L8455xzcd999OP744+dddyyPO6Fk9BQ0\nORjSPL7ftG4nFgBLooGMBSLuui+vVS/XVQN0qidPy+t3/RDiVFYf+UCElsmNmo+FlZ8aOmWYdMZg\nBQSpDt5HXFcJKNxvDhJWkJXaYQGIpCe3f3691WodoqsPjC2WrPUPTePq5LNBqV0aO3dl8DJpOp8+\nvCzLBzVi0qksKmCeddZZuOOOO3DRRReh3W7jqquuOiSNZBSS40qGxBss5dUAkxqt5rDa4HJj1KIk\n11lyBM2wQ8FLipiag1ii6Sz1hXRNO0dBjQu/prVZcm4+25DYjdZurS80IOV94xtLrj+9Jk09fTpq\nellt0IJTSHm0jVZd1P55HbxcH8vW/FbS3ReUQmx9oczSyaICZiKRwIc//GH1uusY2kGOKdA03Dk0\ndqOBonWe55ecVLrmxAIGKUrT8mgaiSFJfaUxFU1nV4dk3FysNBbIaHo54SzWAhmpbP5bqi+ZTJrl\nWY4WIpTZWeyLt5vqSceaTyu70c3K5xtDqpcUuCiDdwHJ/easnhMXam9WoHfXaZnS7IHrnUwmD+lX\nSW/uS61Wa9GA0smiAqZPksmk6hTumP+nRsbT0mOLfUppQwBFcg5XjzMofp3mtaa4/JwFUD69+LGv\nXSF1WAyTnrNYSWjbQtoupfWBhKYfd2IqIWPJf2sgSMtwTm+1QwICzqQtoLTGkTM8DkK8/ZTIUHDj\n9UhM0mKXtH28bH6OppWAV2u/u0bbKJXdjRxWwKRigSP9DRw6HZOiPv8tTbu18p34or6PzUgOKhm4\n5VhcpKmJTzdfnpAgoR372C1P46ublyMx+NB+1drTaTDi+muga80oaFusfJo+IcFEYnXSOLn/li1K\n5foCYkg/abo79qeNrRWgLNGY7mLJYQVMftMH0NkfX1Dmx9INJD5Y0o0eKzLx/9R5uUjTca08Kry9\nNK8FUBZT4jpoxhcKEFIarW2W4/ucRwp4vrpCQNh3nl632IxVjhb0KNBrDI62Q7Ibmpbf9JHAxQId\n6T9/XMtdk9okzWIkoKQiLVfRJQk+BXdlaDMmjSXTfDzoWuvlC5HDCphRFMU0mRoCByQJWF1+l5Yb\nklSGy8OZAAdeJyHTUFqmZpA8Hc/LRWLDmkNyw9L05Wtmln6+pQVLOjFEHrQ4i9TWsSSdfMGPt0dj\nHdTO+DOdPubG66fLNVY+95vbuGYr9Lp2w9LqD277tB7rBii97gMfzR+c8CUJCSA5OZDa026343Gi\naWhZ9C6+dPd9IbJka5j8DziUSUiASTuKrrNI65IamErOqDmIJtKAShG4E/bjznGDCAVyDj4hbZIA\not0+dI2LOzo/7qR9VsDiNwEt/aX+1fpJA0Jet68N/LrUB9JNEassLTjy69qNRpeHkoRms6m+rMGP\npbZL4G3NqiS9LTLBAZKn5+Vz8HUiPVIkEQTqSwuRw84w3X/rWLompdVu9EgADPinzVJHa/kkJ/AZ\nvtQf0qBS0OADbdUvOYdPB0lvrXyeRgKsEHAPBTnpmsZAqT58vDQn4X0cktcKEJZuTnz6ayxYOpaA\nzon23DEnFVo9lvjaafWFNiuzmDv3EcoatScTaLtDxiVUlgQw+fokjRjuvAao9JwPUN1/beovORh/\nnISW5UQDE9qOkEjG9Q8BKeucBL4+cU7nY8VS0JH0sB4OthyM1u0DlU6uWQGU5+VgIvWnBKpW+3y2\nRM9JzF4qz6rPpdHW3Xn7gDCbd+c0MqHZh5Tf1anll5gsZaN8nZiDqWuju7HEZzELkSW56QPIhiyd\n94GndnOIdqxbCqD0naYPeSDeiWQwdKB4OT52w/V1ZVKxmARNL0Vb6c0eCfQko5IcQ1tnDGEbNB03\nfHpNA21eLm+P1P/SdepUVEfe/9oUnQOHxgqpzUnTT55Xq08DB63uZDJ5yBtAUh5uG9pLBxKhoPm0\n8ZXaS8fA/ZbskdfBAVWzedombtM+PwqRw/5YkRTtJcCkHSUxEMkQLLCVypP0snR15UiG5ZgBj5CW\n40vt4ecko6Tt4XVYgYCn0diC9NC2BJS0Ty0g4GmobtqYumsWGGpgK7VXq1tiND7g9entxJoxaA4f\nYocaGNF6KXBw0KG6ceCXgr9FGHh7aDrePgl4pfIk1kjztVqtef7G28r7ymLNncphZ5icEWog55gh\nT8vTSQDLy3WiGYGURmIQDjjoeR8roaI5Bj/WAFSqhzNKrV0SyPv6R+p3LX3IDZPQ+ngaa6w08A6t\nP8T5O2mTVIY0niFPMfhEe7Cd25lko/x9cAqg/C00jQFq9TrfpYAoMT5NXwpyEiDygM79k4oUEBci\nS/YcphMJ/DSA5Ofo/5BX5ahoUVsCBw3EXD5fBNfqtIBAAzcJIOhvrTwnUmS3jJef1/rRiuIaG+bt\n1RxQ0ssHftKYWSKBv+RoWnul8ZKu8YAn9W2IrlKApuXwMjjwOH/hTJA/rsf1kXTk48QDAU3TKduj\noGgFFslnLKbarSwpYEr/pbt7vjw+MOXHmm6APM30lWGBSCeO6jtvGaNkrJpTS/1kAbAUubloIKOB\nsNRerR9p+dp1Xo7m/FrdvvM+0NYARMpLherZiUjjbLWF3kzS7JP7klS2BEq+2Ytml7xci3xIQQeA\nuFYr9RFgz/5CZckeK5L+a8caOGpRh//XBlNjIFqk52mk98l5emt6ZzmyFUWlPrD0lPJY65vcaC09\nNTDW0mnXeTt8jNOqW7MHixVa57Tfmmjj7utHChwSAPvq5HXwWYQ7pje9nB1Tm5B8SquH37zh/ehj\n4lo7eFraN1p6y7YWS5YEMOmxFNU04LMeR9LeWJDKpXl4Z1qPY7iyJHDolKVoEdHVJ63TaFGf68iv\nac4ogaOks09v6bwWjKS2hayvAjpDkM5rT0/wNNr0U2tzCGPV9Kd1htiUryzef7w9mm1Yd5Z5fdK4\naml9IrVXao+kc6fCWe1iyWGfkjuhnccjmwSi/LpUjsUINKMMuZPMz1tTB16XVGYo6Eh9JBmAZRTc\nADXw4iItUfjq8rXHndPGltfvm2pK5zrVz0rL1wep/VmsRbqu2aKWRhOtTzQ/4GMs5XHXuH+GTvnp\nDSTLBzQQk877+lgTnk+7S9+tLMluRdZAa9fo/5Apo3RNS29F+FBw0+ry6aUxvBDG5fL78mns1Fc2\n13chYGnpL42LtZRh1RniaBII+Nqm2ZMGEJpNhfR/aHDSgIz3aYithk77NRC0dJPq5Pmlcq1lGVqH\nZff0uFsQpnLYp+QSOGh/9Lo7dqKxVZ6H1w/IhiYBg7b+YgGur/28jBBAtgCd68ev07Upbfoptc0C\nvG4M0ALukMDnO9fJdZemm0DJ81t5QsfQsgFf4JTAXgsAPiCW/NKyGSqhvqGxTJqOXnPAqbVBAk3J\nzy3dO5HDPiWn9F/qXA0wJWCj/2kdtDwnGk136ULWb+g5N5Cd3nkLMT5fPieufu1OYah+IY7Jz0WR\nvZO4qz/ECem1UJ20ciSnsYDD9Y/19UktAAPhz8NKbMfSWdOX9ov0aJJUv9bX1lRbAyIOYLzc0Hy+\n8dPKpfYulc39wer3bmRJ3vThBut+OwPga5rumP+nnSC9D007SLrurrm73VGkfyvGagevk0rIIEkO\nagl3mNB3ZS3GY9Vp6cTHSBoDXj8fQ0nHkADmu9Pv0miOSsdbuknE9dH6j37OgT454YQzJkknLUBI\nfaoFKPdbekWWi29mIIG3BexakNGYp8Qi+bhYZWv6WIw0pN0+WTLA1BzBYjY8nzTdlNhDp6BlGYuW\nrxujpOkkdqPVIzm1FpktkYAuRDRdNeYUoisvT3svXnNAqQxJJ36ev9Wi5ZPaLAG+73nR0H7m9YUC\nnO9cqB7W9W7AVssfMp4+RtsJa/yjYpgULPkfv05/u2NaDj/HX7qX2IAWbfhSgaY7Lcu6zs85sYxD\nY2NaPa48ypLosRZRQ4Em5JpUNj3n68tOzvkCCtdLY21OL2nqyOvmDEmajkqM0hIt2FlsTTrnC3Kd\ngrTkH5KenYjGBKW6eXpNf83G6bHm5920gUvXgPmqV70KfX19AIC1a9fiwgsvxEc/+lEkk0mceeaZ\neOtb33pIHikiU+OWANL3n0+FpE7n5ySjpcfWAPOpgzQl0n5bZWrX+HnJsaS3o7gOFngvhoO49CEs\nkOezyus0P9XBWl7hNkHHlZbl00V7Q0yyA8uppXq0QK+xT8n2LYbNhfYXv671BScStC5tRyKXRnpV\nUQtQ9Le0TskB1AL/hUhXgFmtVgEAX/va1+Jz559/Pq699locffTReNOb3oStW7fi5JNPnpfPAkQn\nnCHSqTVPBzzd6doO4bx+SUKm3ryMEOMOHawQhmIZrARQPuDnaWnk7lY0cNbqtSSUGUsgIs0ctDwh\nOvumltRheeB21y3bDLFVDgoamNK8FhP1gawm/O02y3es8nzBSQvi9NhnIxRvrFcoO5GuXq78/e9/\nj3K5jEsuuQSvf/3r8Zvf/Aa1Wg3r1q1DFEU488wzceedd4p5pUZ22wjOSul5jU3+XwtnEk4f+p/q\nGTLw3Lik8nxMygc4GqMIEToOWhtDxqIb0PLls/T1ia9PtHFwNmAFTcpoOwmuvL5Ogr0mnZYhtc0X\nVEL16AQfaP/z41Cb61S6Ypi5XA5vfOMb8Zd/+Zd48skn8bd/+7fo7++Pr/f29uKpp55S84cwEIkl\nWJGZDx5/TczHIjSRIrtVHmfGvqkhbaPFCDXQpIBH65SmKZJwo+qEAVqByhKJHflYF22TpacPhCSG\nrjGdhTqbxu64vpruPKBajDEk8Erpu/lImASU1kxHyyONgxakQoIp18H6lEW30hVgPuMZz8D69esR\nRRGe8YxnoK+vD1NTU/H1YrE4D0Cd0AHXDNKaLvmmUpLh+6YePuZFy/YxBus/F1ov3wyhU8PnelgA\nKBmgD/xD6nUS+tyn5GD0v+aUUltouVL7O+lPrp8F0r7gYNmLZo88v08kHbifWXppdUt5rPp9bFMD\nVEknDqT0XCdBTLLxhYJmV1Py7373u7j66qsBAPv370e5XEZPTw927tyJdruN22+/HaeddpqYN3Ra\n5usgybikSMPL6JRNUX14mdLURAI+jQlLdfCFcB/z0q75DJTn41MYq8+k31oAtPJyXbUgI+XrxPAt\n/XhZof3N7VQCx04Ym49thQKbpSvNz4NCSBkhY9mtaDYl/bb0AnDIPRBa/kJ17ophXnDBBfinf/on\nvPrVr0YURbjqqquQSCRw2WWXodls4swzz8Spp54q5nXTRncMyNFWMhDrbrAT68HhbgxQY39aPu27\nQbx9tAwfw+Jl8DZIZQHyW0/pdBqlUgmFQgFRFKFYLCKVSsWfZW21WvFvbrQWsFjnrbRSkJDa5GNz\nLn0IiwhxopAyrHw+5tkpeIcwVXqO2qkWSKUyNRvl1zn7pml9/RISWEIZK7cNLfAslFk66QowM5kM\nPv3pTx9y/tvf/nZQfgqa7jegA0VINOOObYExr5eXsZDIrhkbb4M15fQ5XSft4H1br9eRz+fx8Y9/\nHJlMBq973euwbNkyRFGEer2OZDIZg6XW7sVkFoD9fRdJQkDJGnc+DovRnhBws+rrhkFqY8M/vCal\n58f8NVeqk6SnJiFBTWsjX8vnZbq+448/+XReTDmsD65TY+FMjEdB6Vgqxwl/F1hyGN/Nl5CIG3I+\npOxOgIGn900hreWIdruNRqOBf/iHf0C9XscHP/hBtFotvOY1r8GWLVtQrVbjj0x1a3w8+vM2+cba\npZFAxAo0vB5NpJnMYkoIe+THElsLCaC8j7mN+2ZEUn0WKwtlg6HBzPrt2hMqEkGQyl+ILHzP9kUW\nPlA+w++kE7phsNR46N9CdelEOp3ehUwV2+02stksLrvsMpx88sn43ve+h23btiGbzSKVSs1rT+gU\nl/8OYafdOGbIlM5XjzSe1vguVHyg12kA9fkFLZu3T6rfV67VL1rw6bQsrf8t++bHiwmOkhz2d8mp\n4UgNtN7F5VFXm8pZvy0w6TQi8bbw/HzqQHfGcaI97sCn1doUUwJMK8rS841GAwMDA7jwwguRz+dx\n6aWXIp1O44ILLsALXvACzM3NzXshwE3XpfKsPuqUcVltof3I8/uWPPixxMYlZ+VOHDIF1Jw+lI1p\nzFsri6al01YpjTTTkvSS/IZ/052m8wEdPe8be4oH0kYcfNmBj4nWNwsF0iXfQFiaCtD/PA3NR29M\nSPl4ek0XH2PhzqKVzZ1LAil37H5br6OFiGYEPgCi+ROJBOr1Oj73uc+h1WrhXe96F371q1/hjW98\nIwYGBjA7OzuvXc6I+acmfGKBJx9riRFa7fWVr6WXjqVzISw+pCxfEONC+0ICTukcZ5Q+v7LGUANB\nDmLUHrSyOfjysqU1TImEhEonIB4qSzollzqOgylnf1o6en4xIolWr1WupWMnA6WBcigIWvVJ7MAB\n4OzsLJrNJq644gps3boVN998Mx566CFkMpmYXUqvxXUKYJJT+Mqz2r9Y0mm/dyMhY8VnXzSND3Q6\n0XWh4MHLCA0wEmO3wM3qh05loWN52AFT60geFd01HjHdF+6sxW3pmNcZ0uGdABS9Jjm+ZNg+cLfO\n+4yTGpY25XN/jUYDURQhk8mg1Wohk8ng3//93zE1NYWrr74aN9xwA3K5HDKZTMzsqX4W2IWAoeZ0\nUjqfwdP6OgE7aQYjAVdI3Vr5Etj5ZhdUD5pOs3HnH5rwskLHhevEr0tsWdNVC4jaMgH1+9Bgyu1/\noUDrZEkYptZxlrPxDg2ZSlNAkhiNVaelZ0hbeNlOf03nEEeXnNcCzlD93Dplq9WKA9H09DQuvvhi\nfOMb38DOnTvxoQ99CDfeeCPy+fy878tLTh8CVFYap4uUrttX3CRgkoCGOthiM0tuAyE7O1mfYqF5\naZl82m/ZkjTjkIIctzNrBiOlpX6o6aPVEUWReW9Datf/lRxWwKQOJnUQT8eFRxxNfNHXAiZtmcAX\n2Xkeq01SuzU2IwG9FDGtfFpZfDxoue6xopmZGVx22WU499xz8Ytf/AIf/ehH0dPTM+9ZTWtPSK2v\npdkDPS99SZTqTdscElx8rIgvNUiMpxMJZf1cH4tJ8rbQ37w+Ph4+u5LSSf5q6aHp5vzVYuwhgZ9f\n087x9+N9QakTOeyAGUqNQ1hLKAPkZfLyfMxOA0vJeHxlWW3l5zTw9rVTAxAtj5S+Wq0ikUig2Wyi\n3W7j+c9/Pq688kps374dN9xwA/r7+1Gv1+M3gzRGwh1E0yOUGWh9JZXpC2g0f6dsUmqTBQg+CQnc\noSDeSdu1ujRAXwzRdOlEZy2dFagWQw4rYHIg6YYlSaJRfsqiaP00j6Rbp4DnynP18XdZtXol0JUc\nJzQiWzqH9AGVTCYzL5/bXOWGG27Arbfeio997GPYvn070ul0DKp8WkvzUzYaqoMkvt11FjOoWhIS\nyDWdQoIeTycRCMlfOrmLzIV/10gqywJQra8l0Jf8jNsx9V2tXt4PoUGlW1mSmz4SrebH7rc2KNY5\nbQotgZUFlBYQ+dgmBwQfi+S/LV3ob16eJhbT8zE05ziZTAbT09P4yle+gpmZGXz2s5/F//zP/8Q3\ngyzw87GvUJYXMjPRANCawjvplGlqXz+1fmtB0RpTa9xDrluisVjOnLstXxtbqc0amdLqtsb7/0KW\n7C55J0bLB0xihiGR1Tct6WRKJaWxtjYLMWhNvxBjjaLIvENKo7YUsHj76V86nY4fPWq325iensaV\nV16JTZs24d5770WpVJrXfimAUN184CC1lY9Np0yi09mLlF6yQSlYc/ExzE5mBSGA7ksTct13j0Aj\nNz7/7tT+fUE2tOyFAD6Vw76GyY+1//RYY6HcAS22SPP4DJSntQyBOrJVLnd0qi8tRypbMyRJT9+H\nxyTmavUZXcdMJpPxmmW5XMbf//3f47jjjsN73/teTE5OYnBwcJ7O/K0Q3hbLQbSx0L4Tw8u0xj0k\nKPpmLSGByQkPJLR/eP9GUYRcLod0Ou0NchYo8bG0fEMKQhrAWDMJy664X0u2Ln1eO4REJBKJRfta\np0+W9E0f3iDXyd1GCl/EkVger89yQvpb26LO0lnTIwQQfTrRc9xoebkh7MrHigCg2Wzi3HPPxbJl\ny3DVVVdhaGgIn/zkJzE5OYl2u410Om0yldA+Cxk3rUwtQPnyad/2lsAlxAZ4egeUrp6pqSk88sgj\n+N3vfofly5fjuOOOw4knniiWw/WwxBeg+HXNN925kPROrADJg6nVLp+tSwFK+obPYoDmkgAmYLMn\nKS39D+jrmzQP7zTLyEI703I8Dvq+IEBZofYgviQhYOFjYFYdFsi640QigUajgVQqhT/5kz9BMpnE\nV7/6Vbzvfe/DVVddhf37989j35KOoeLKoO9Hh5Yj6c6vc6FMlpfDGVYogLn89HGtyclJ/OpXv8Ke\nPXvQ09ODF73oRXjDG96gBnEOuiF27AsUNF83QZqf1/qB95O2lVtoPbQ+VyZ9dldqdyjeWHLYv0vu\nJMRwpWhORTq/UOe0xAJAes3Kq11biD5OKKhwsdimZuRatHf5HINMp9N45StfiVKphK1bt+Khhx7C\nySefjOnp6UWbCtH6F5qXgw4N3iE2IzkhL4dKFEXznludmprCPffcg127dmHXrl14xStegXXr1sWf\nrXZ18PJCWaXW5tB8vmBNdQnNy+2sE3/WwFfSqRv/60QOO8OkrEPbzUej+RJA0GNuuNLGFnzQrGkG\n/60NMq1fMoqQqZoFciEsVZqaSHrysrV2a+fob8rCxsbG8NKXvhSlUgn/8R//gbVr1+Liiy8+hOlb\nxm61Qxs/3jbKgPmu8e66tCs+ZXFc+DhIbbECtXvddGJiAr/85S/x29/+FqeffjrOPvvsePNmjaX5\nAprEojgT11icL2BKwusMBWFehxbYfexSswt37NovfQQxhGn7ZMm2d3PCjVZioRLw8J1RtDooIIVE\nay3Cac7OdbfK7yQq07I6YbShDq+d11iqL9C46+effz7S6TRuvPFGnHfeeVi+fDnq9TqazWY8HZW2\n66K/NSeXAqRlO1pZ2idMpLbS/7Rerf9o+e12G7lcDjt27MCPfvQj7Ny5E2eccQauuOKK+H18x9Dp\n86nU3i0nt9ieBmy83zphZb6gavW5pF+IcL15ezjwU9Ck6Zb0q5ELEQqQFnvRzocCEQdNq3yezxed\nJXbWzYCERHirvVrAkPTTyqd5NECijuzSWAzhz/7sz/B3f/d3uOiii7B+/XpceumlqNfr8SYffPyd\ngWtjagGWpLvWJq1/JPDwBSR6XrrBkEql8Lvf/Q733Xcf7rvvPrz2ta/FX/3VX8XtdAw4mUzGnwbh\nZUg6+URKax37fCIkIHPbkOqQfDCETPjA1+ejnbDnEFmymz6SOEPysTrAP4WjIkWnEFCkebVyqU4h\n7etkGkLz8KkF1yG0vBCHlABN6mcNzAuFAg4cOIBUKoWxsTH09/fP23hYWpy32q/9lvTi5xbLUbhw\nEKDtiqII+/fvx09+8hPs27cPL3/5y3HSSSeh0Wig2WwilUrNy+ezc+s3Ty/llwKfBqydkAreD1oa\nrdyFjE9I3hAdOpUlfdNHMgaLaVCxgNJiBRo40PpcOv7Hy9aO+W+NVYcAhQSQnDnxNJpIdVsORf80\nBsrLb7VaaDabKJfLuOqqqzA1NYW3vOUtuP/++1Gr1Q65+2zpHhIYeN/SPPQtHJ6O96M0xiHjQxl3\nIpFANpvF7bffjs985jM48cQT8b73vQ9nnHEGGo0GgIPMM4qefn1W2iiC25X77ftIGAeHdrs9bz2T\n95HGqGkdGtBJ/cEDCE8r+ZM2C5D6WfMdPs5SexYreAYB5v3334+LL74YALBjxw68+tWvxmte8xp8\n4AMfiAf885//PC644AJcdNFFeOCBB9SyJEbAO4w7qjtnga1l5KEMRutU3xs8IQ/NOv21L/q5PHwq\nofWNpq/kdNY1yZjoO+E0ndZ+ms/lcUb8iU98AuVyGf/1X/+FcrmMdrt9yM0Y62H7kJkDbwtlfDzw\nSMHAleWrnzJI+qyfu6mzbds2XH/99bjpppvw/ve/Hy9+8YtFkKZ9rPWvFCx8Y8DbqOXjYCr1JW8z\nrUvqP3pdeiSLH2sBV/rvytR9UN7qAAAgAElEQVQCKB9nd533+WFhmF/60pfw/ve/H9VqFQDwsY99\nDJdeeiluuOEGtNtt3Hbbbdi6dSt+/etf4zvf+Q6uueYafOhDH1LLkzrPl1bqjBBg1JihlceXJnTK\n4tPPBwS8LMuhrHOhdUh6a8EkNFq3220MDAwgk8mgVqvhi1/8IjKZzCFAxNc2JV21+nygytNK7bLS\nUnE3raLo6U2XHTDV63Xccsst2L17N/7iL/4i3pTE98qurx81WwoRbSw5+fDpsZD6JfLjxDduVjDj\nzFjCFY2ULES8gLlu3Tpce+218e+tW7fiec97HgDgRS96EX75y1/i7rvvxplnnokoirBmzRo0m01M\nTEyIylpRlUcF2tF86hTa2bRcn/jydDrAGtj52CNvu/TRL99vaXol1WUZHhfKjrTr3HBLpRKuv/56\nvOIVr0ClUsEPfvCDee2hU0aLLVvTQMumuF4hgYePnxPHjOv1+rzdnPbt24dPfepTSCQSePvb344t\nW7bM25We1y89JWAFBK5rKNBp5Uhtc2mkMeyE5Ei6cr/vBrRCAxu3Je24W/EC5tlnnx0vUrtKnZK9\nvb2YnZ3F3NwcCoVCnMadDxWNNkud7c77OqEbGi4ZpGRENC3VwaqL6ul2Ntem5/w3dT7flEhzphBj\nkYBH62eN/Uvpx8bG8JznPAfr16/H3XffjYcffhhDQ0PejYelNlnnpGu+wKHVzR3eHbubNrVaDdls\nFvv378dXv/pVrF27Fu985zvR09NzyCuhWt/RdnKblvLx9vhEm6m02+34/WsJUKwAK5Wv+QjNJ5EI\nny3TOjodu05tJlQ6vulDDbxYLKK/vx+FQgHFYnHeefrWAs1Llea/JUYpgUoIK5I6zedk2lZdEsPV\nxBp46SaET09n3D7wkxijph8/lvJZrE/Lo4FCFEVIJpP4m7/5GxSLRXzrW9/C5Zdfjmw2a74SajFH\nqd+0tncy7aZCmbD7jIebjieTSXz/+9/Hv/zLv+CMM87AhRdeiFqtFm+a4TZV1saO2jo/5sKDLdXN\nZ+PuN22LNnuj/yUglfTn53wzM99YaDZszX64PlKfLwZYAl0A5kknnYS77roLAPDzn/8cp512GrZs\n2YLbb78drVYLe/bsQavVwvDw8CF5qTO636GRoxPpZjqtCR8MXzS18rfbbfFGhGWANI+vv0LaLLEv\nrd1Wu2hZFpOhxloul/Ge97wHUXTwXerBwcH4nXT3TKJ7HpGzEs40upk5hJ53Uq/X42N3lzuKIuTz\neezduxePPPIIAODlL3/5IZtGu7Q+Pbtpj8tnjYs2a7N0kIBK8llej6VXaLDqth8k8QWdhUjHgPme\n97wH1157LS688ELU63WcffbZ2LRpE0477TRceOGFeNvb3oYrrrhCzMsH0Vor0fJxkSi4xYyksnka\nK1paZfH6ueFJYMnrlV7b43q635qBW23VQLoTkcqQxkECkJ6eHjzrWc/C+Pg43vSmN2FkZCRuc6PR\niJcq+HRR6ruQR9AW4iR8uSCRSKBQKOCBBx7Aj370I6xYsQL//M//jNnZ2XngyvuJ6xLCfmhaOhuR\n8ocEaleONIuS8mhCwZjaK79ulW+JRSZC7ZWn0WYw3UjU/r+geIpcc80186YS7bb8SA5/D9SJjzFJ\nkV1yKGp80jl6TQICmo+X74uUoWmoaGyLlufrGylvSBDxiVQ3Hwf+mJKbrr7rXe/Chg0b8Pa3vx3V\najV2QD7ddHndf/44jKXHQhiLqws4CNiDg4O45pprMD4+jrm5OVxzzTUoFosxyLu1/pB+pm1yv7XX\nfSVb84lFGDR9rOv0vNWn2kxAWnrgfkbL4M+Pcj18OmpBpd1u47LLLlP198mSfGbXidQh1mB0iu2+\nTnXHGhNw+nQy/bbKldL4dHU6SMc+sdiNVbePsVjlS/nco0QOCKvVKjKZDJLJJJ544gn86Ec/QrVa\njdP4GFRoHyzWupV72Pyxxx7D6OgoJicn8da3vhUzMzOxbq6N3YKaL8AuFlhShhgCfN2c03SSbM+X\nxxeMQ+tcLFmSHdc1ALCmHk644/JIRacK0nnLsX1sUspjtVViupS1AJh3t9xqo1W/L8jwvuoUgDQH\n5GxBAtR2u41arTYvfSKRQKVSwXXXXYdarYb77rsPzWYT9XpdZFn0nNZXrg3aeq829laaVquFZDKJ\nSqWCdruNL37xizhw4ABe97rXYfny5fNecZQ+AGeNrctHRfrEiDb22lKStnGKxNY1YmDZvwa4/Dd9\nxZm3VwM9OsbUZ6WZnmsr7yutfzsNZpos2ScqNAltlMb6qNFa0+YQRic5nhTxNOeUgE977tAqQ7rO\n26L90fKk9mug7AMd/vRCJ2zOAeDExAS++MUv4pnPfCZuvvlmzM7Oxs86aiCvTXVdGt+TF9a4aO3s\n6enBxz72MUxOTuK6667D5s2b5+mi2YtUpxW8NUAJsXVehiXcR7Q6OGhZ6ajevA+BQ78WKvUXL8P9\npgBKAxNdztPsQ6pjIXLYP7NLxUJ9H+W2AEGqS4umkk6dfgBKq0NKpwGgpbdmUCGGIDkqvWYZmA98\nrWOfTlF08FGjqakpvPKVr8RDDz2Eq6++Gv39/YesUfpAQGqD1g88vTvWvifzxBNP4NOf/jSeeuop\nfOUrX0GtVos/LaGNGT+nAbilG7VD6VXVTiXUZqX+tgCZ94EU6KSgHPIGFN/PVgt8Unu0QL5Q4FyS\nNUzXUB8wWaLReW2AeN1W+T6gtoTWHeLIndZhAZgFtlo+X8SXdArRz5JMJhO/NujWB6enp+N3sn3v\nWWt1SqBiObDVvmaziWw2ix/+8IcoFot4/vOfj5mZGTSbTaTT6XhbthAH9vWXdhzi7L46O7F1DtwS\neFpExDonlW/5ashvKe9CAdEnhx0w+YBI1+hvi+XQP+2jZFIZUuRzAK6tI/nAhtbtrjlQ4PslSgMc\n+qyl1n6enwIIL5fq5PLxNV9eHl9H0uoP6fdKpRKPV6PRQKVSwfXXXw8AePe73z3vi4kWoEtraNqj\nRvTLghYwuWuZTAbf/e53MTo6iomJCbz5zW+O7+A7lukeZuc2LZ2T9Odt4LoBmLctnmW7IeDhA3Wf\nrpr4/ELzdVqXBaA0rbRWzNsg9YFkM93IYV/DDJ3GaOetRX1Xh/stGS79s4yHAoGmj2ZUdN0npH10\nPVACP9puqQ9oG7V8Vp9p63fWMRcLsPiY07Unup556qmnotFo4Oqrr0Zvb28MFgDiB9q5npJjSf3u\ngoQVqOv1OtrtNur1OkZHR7Ft2zacddZZ+MIXvhC/6sudl+b3Abykkw+QLH+RzktTZAmkrYCkle+z\ne003Cmb8PE3L10yBQ32D+3dI/bTdC5UlXcPUzknXtchpObU0XbI60QfoXKQB8Bm2ZsBWuZb+IXVb\nEjImltNw/aSyfDq32wc/qHbWWWeh3W6jr68P6XQ6fie71WrFb9o4kaaM0rpxqE6JRALpdBpRFCGb\nzeJHP/oRRkdH8ad/+qeYm5s7BLClMkMk1NFD0nGh7adroZ2WsRgiEYbFqEfrE2udVQto3chhB0wp\nqtDoYYEDNwZ6zFkSL1dbq3HH0nRc6+gQoFyI4fn6QZJuDSFUz1CGQ89T3bVgROtfvXo1ms0mxsfH\ncd1118VrhMChTEMCa5+T0jr5DMOVXy6XMTMzgwcffBCf//znUSqVACCefnOdQ4S3l4OZNtbaEo5W\nHu8jnlfSRzrfSTs1IuNLG/IonVReJ31P+1lbk+1UlvyxIm1wfSxHMjCLYfruymmg6vuTxMe4tDZS\nffl5q92d6uz6w+rHToSWyYXqLm306qTVaqFWq+Gqq65CLpfD73//e2Sz2fhZR/5ZB15GyGyC68vB\nq7e3F5/73Ofw7W9/Gy95yUtQKpWQTqcPqSskiEkAIF33leF0k3S2gNbHMKXzGkuzfCzUHi1dug32\nlv7a+T8qwKSOxZ/LsiKLNECA/kylDwh8ACgZuWVAUrSU8kgPFUs6SeBNJTRSSk7D+47rZwUqKS29\n7vsQHF2f4k7vNuctFov48Ic/jFQqhQ984AMolUpot9vz3jPXyrXAiR67tdZmsxlfq9VquOeee1Ct\nVnHffffhvPPOi9MBhzKi0Om/S0vT0HQhj7BJgGUFYx4M6ZqxD7S4PUq2Jk39pfZZ7abr3Rp4W+uV\nmg9IyzS8jQuRJXs1UnNmDcQkCYnSUh5LH+2cpY80sJrzhurYST6qW6d3251Yhs9/a9MbLTjxeiT9\n3LONwMFXJ8vlMpLJJG655RYA8qdxpTo0B+R53XplFB3crq2npwc//elPUS6Xcdxxx6FWq6kBWRNt\nhqDp6SMGVv9KbZLSWKQhVKw+8J3XmC5tnwWwIcAp6arNZn0zTZ8s+U2fhZSlTcM0wwwxOCqW42mG\naInFiK1IyB1Ja6u2VsPT0DqlazxCc+PWNj6W6vONidM1mUzGd8VLpRKuvPJKNBoN3HXXXRgeHo4f\nFJeYsdantA5uB+41TPcmz4EDBzA5OYlnPOMZeMc73oFGo6EyLJ9TWuxHSqOVx3dm72Y62QkTlqSb\ntBqBoH+anWp+xdNbAUcTa6emUFmS5zC7/eNiPZZhRdaQsmkenk8qz3dMz/mWEiSw09oi5fcFD6sN\nwKE30KS6nFCH9BkwBzFXF31O1T0vmUwmsXHjRuTzeXz2s5+NH/nxlc+n/VqaVCoVT8l3796Nr3zl\nK/GmGq4uH8MMAWv6W1rDpUDA81lTWiutdc6d52UtFEgk++R1SoDH01qAqJXN67Cu/dEBJhVpbcT9\n53TdHfMoRc/TckI7xhfltN+S0fFyQwbdB2xaW0KM3GKttK+ltllitdvnOLRuet09NkTXed/0pjdh\n3bp1eOqpp+Id/DnwSLqFAJ17yyifz+Paa69Fs9nE85//fFSr1Xg9VQMozsA1O9Tskufha7NawON9\nKAUEd00D8sUWCfhd4KP9JLFlqT95ebzfO7FNTc+FyB/Uu+Qau3JpeV7nXPQNDupQIQZC09NB5Wtm\nnLnQcyF6+3SR+qaTwZWA3McO3TUNkLXytWAmpaW/XRr+VhEw/11ul3Zubg7nnnsuAOCBBx6Ip9GS\nQ1rBgY+H24XIPd9ZKBRQKpVwzjnnxLpY3xqiukt97Js2cvukNkzFCpY8iDuR7NalsQKvBVS0LCkI\nSGIBnWZHVEdpbDXyoemjBaiFyJJMyV3HO1YRwq60yC3dOdWmtJoBS2xLYjHcEfguKhbASYag6UwN\nU2MQllN2wjxD0ziACnk7RatD6gM+PlSazSZGRkZQq9Xw9a9/HYODg/H3dNx02sfEaD00KLpp97/+\n679ibm4OPT098ZcgG43GIQ/KW2Xyuvnre9ymeYB3eXx1SIzS9aWzP+cPrg6qS0g/WXeueZALtTOp\nTusRNJfHR5g0PUL8sFtZkik5f7casKOHNtA+hmOBJAVaySil6M3LlCIk16cTp9b6QvrNjakTRurT\nxQcCoXVw/aw0kiQSCRSLRbzzne9EoVDA9u3b0dvbi3Z7/l3uTqZpUfT0+mU+n8fY2BhOOeWU+CYT\nTUdFYsvdsBXOvLiO3IYsdsSnwFK5Ehunafh/3yNIWj6trTxfJzZE2y5hhi+v9PuPimH6mFAIQEqG\n1Un9EnvlIl0LAe1QHRZLeF+EGJMWZHxpQ691A95aOa1WC+l0GkNDQ5iZmcFPfvITpNNp1Gq1mCGG\n2AQHnXq9jlQqhVtvvRWNRgMveMELUC6X409nAPK766His18toHczHtrsSgPPThlWp+k1UA+xO+l8\nCIsNDZrdtJ/LYQdMqrA02PRPMjxOxX0GR9NonStFMmn6YS1kh0i30ZGf530gTWU0ltqJ0UisQGJI\n9LcVFLluFkuhU+5Go4E3v/nN2LlzJ77xjW/EX5fk9qK1i/dHq9VCX18f7rzzTgDAUUcdhXK5PK+t\ndLklhJ1Y/c7bzG2y3T704XKpv0PWVbkO7fahG49Isx+e1wJan7/xY5//SfVw2+M7TUnt5OVI5S1U\nDvurkdQRnGE68e1E5I5pp/EBkHaQkfJS0cDEYgMuPS/HMjqpPaGsUKqL18nvRPI2u/++/SY1o/QZ\nH9eTAoMGslwfl9axPbcet27dOpRKJWzbtg07duyYV457nlIDKyrNZhPDw8O47bbb0Gw28c53vnPe\npzEksNLsUbMxqY30HAcv5wc+W5PaFwIOtC5trd3yMcmGtOBhAbDWLk6SJEYq+bzkXxLR4qRnIRKU\n+/7778fFF18MANi6dSte+MIX4uKLL8bFF1+MH/7whwCAz3/+87jgggtw0UUX4YEHHlDLkiKMBmQu\nPU8nAeVCI4kPQCyg1XS2wNoHvFJd2lZXvrqlsjnbkMqwhOalD5XzujQdOUPm+d3NHbrpxapVq7Bi\nxQrcdNNN8+p3n7WQPllA2+PquOuuu3D77bcjlUqhv7+/q52IuAPzdvF6eVs13eifY9G839yfdmed\n/ve1QxIt0Ett4GVq+vrK1hgtP7Zev7XqXiyGmfIl+NKXvoQf/OAHyOfzAIBt27bhr//6r3HJJZfE\nabZu3Ypf//rX+M53voO9e/fibW97G2688UZv5RIj8aXRzktRXmJ63Qg3DhoJLQlNI9UTqrMGeqHi\ny8+vU718ACX9ttpGQcixRpe/Wq0inU6jWq2i1Wrht7/9LZ797GfP05GzH24DLuhs27YNqVQKZ555\nJkqlkpd5+PS18lhBRLJP31hqDLYT3axA5qtfSmO1h5+XGKRUllSuZTuhZS7EV4AAhrlu3Tpce+21\n8e+HHnoIP/3pT/Ha174Wl19+Oebm5nD33XfjzDPPRBRFWLNmDZrNJiYmJg4py0fnJdEotsVKLee1\nxGKSkqFaUzZqGNqUjesq1c8ZDG2Xb7OMUIey+sgHcLSt0ndxtHZJ16jRS/39ute9DlNTU6hUKrjl\nllvmfdrW11YHvsPDw9i1axf27duH008/Pb7bziWUZXfaTouR8d9u+crH2kLEsrtOyuZ2E7Kxh8QY\nfXVxVhlSRrd904l4AfPss8+Ot9YCgM2bN+Pd7343vv71r+Poo4/GF77wBczNzaFQKMRpent74x2q\nqYR0EBc+QCEUW3oImpbFAY8bpAZw1jRPA05+LDE2rV8kMLUAkpYXIloA48ao9R/XXQoSnHVIfUvZ\nn+QAbhqWz+fxlre8BcViEc1mEzt27EA2m43LcdN3qpd7zdKtiX7ta1/DxMQEPv7xj6PRaMTT+U5E\nskMtqGnOrAVd+kc/VUvTWs8I83r5des/3eGe605BSxpzKS3VWepD6dgJt6VQ7JAAVtKzW+l4BfSs\ns87Cpk2b4uNt27ahUCigWCzGaYrFYvwqG5eFUuKQ8nxMVgI7mldzeq0ODqqhbdQYKq9TusYNgOsT\nKr60GsBxCWVbISzE/ZbY5tDQEFqtFnK5HO677z5kMpkYKN2jRvybRa1WC/V6HVu3bsXU1BQSiQS2\nb98egyV/0JzbRGhf0fZp4yr1A7dHq580XXy/QySEWfJ2ST6ikZxO6u8kD/cDjZAsBvZ0DJhvfOMb\n45s6d955J04++WRs2bIFt99+O1qtFvbs2YNWq4Xh4WExvzY18DEzfuwT7gD0vAZU0jktUoc4Qie6\ndjOYlp7d6kL14exQMjrKeiSGogWWUD1oee53X18f6vU6Hn30UTz55JPxDaJ0Oo1UKjXv8xZRdPCT\nE1/+8pdxxx13YO/evTjhhBNw8sknz7upwt++CelPfmedM1upPzUgDQnSGjhIdmyJxnp5+6R+kNpJ\n7URLb+kiMVc6LhJ7lvpB6nsp30LEe9OHywc/+EF85CMfQTqdxvLly/GRj3wEhUIBp512Gi688EK0\nWi1cccUVYl6JMWjUmR/z651QbO749LfEoKS8XFxe7WuVnQrXJaScTvNo17X+8OWVADW0Tl4OL4OO\nr3OIVCqFWq2GN7zhDfjyl78MAPjNb36Dl73sZTHDdFPwRqMRb67xmc98BlNTU3H5l1xyCWZmZpBK\npebtWkR15Y/fSIGS2yK/rvWBNmYS2ISCtxTgLODkutP/9IYbPa8JHydJb81+JL+xAjRtlwSkvmej\nF8oyo/Zi8NRA+cQnPnFIhOCG6TZFCOnwbgHCSQjjkdiwVTZ3dF6WVacVKDSdQkRqgxaktPySM4YE\nLJ6XO2BIvS6Ne4c8kUjg/e9/P/r7+1GpVHDVVVfFO7PTdcxms4mxsTF885vfRK1Ww/j4OD7+8Y/P\nsznHit2jRbxdPvfQAJSek1h5CJvziS+PZa/STI/7o1a+BmIWIZH60wokWr9bAE71l+px597+9reL\nZYfIYX1wXZqmAPMX9+l3mCVH1zpVG0QrfSgIS0YvtcG1UWPPoeW5AaeDb00pfE6t7d7E+5+XT39L\ndWvt0D7ZwXWhbaW/aT5nF64/AMzbfq1WqyGVSh1yh959N/z+++9Hs9nE3Nwc8vn8vLvitHz327Er\n/jC9ZI/cKfn0kV/vNAhqY2KVyYEv5FvstFzprjftL8kWNR0lu9LsWOpPS2+tTum9+cXkhEu+4zof\nDCu9b1rgE6mDu6kzBETon1QWBQpNV7pGtpC2+5wsJPrzNlgA7kAnk8nEa5vumzzuo2IuL3XsVCo1\nD6joXWIKZK1WC1u2bAFw8ImMPXv2AMC8+qIoQj6fx3333YdqtYqVK1fi//2//4dKpTLP8dwU3h3T\nT2UAmBe0JAB0fw7QpX0ffTt9W33Ng7LGVjm4WUtF0vhb12kZ2lqvVIYPqHh66fEhTkCkMqRAJpW3\nGNLxGuZCRAIMC3y06Kld99Ub2uE0bQhgdZIuxKi4g9CF9RBQCxE+hQoti+aRvrMTRRHq9Trq9Toe\neughpFIprF+/HolEAhs2bEC73cb09HT83R4KmHRbMgDzHvlx550TbN68Gdu2bUMikcCuXbtw0kkn\nxZtqRNHBL0D+7Gc/AwCMjY3h/e9/f/ydHreBB3CQrebzeeRyubhvk8kkxsfHUa1WYyCnN7Roe2m7\n6Xj62LzWr5Lwenh/c3vhzF3Ko4l0jbeFt9VK5ytbskG+LBCql0un+eJiAOdhBUzAjmZa9NQkZPA1\nAPMZksYM6W9Ld0vnbsUHliGAreVfjGmLq39ychKPPvpoDFAHDhxAFEV46qmn8JKXvATHHnssGo0G\nxsfHUS6XUS6X42/ouGcjM5lMDI71en3efo+1Wg2rV69GtVpFPp/Hrl27cOyxxyKZTKJeryOdTmNu\nbi5+o6enpydmrul0GuVyGYODg+jp6UEul8Pg4GB8l/2RRx7B7t27sWPHDpRKJRx11FFYsWLFvFc0\naX9ZNmA5reXs0vmQfteuSb99xIMDsSaWD2r22i2Y8Xyd2LukUzdyWAFTiq488kpU32qkBXzWZhRS\nJJIiMi3TMnZLNMPzGQkFiZApkzX90tLwh8V9bXMskC4XUMlkMhgYGMDGjRtxyy23xI/4VKtV7N69\nG9u3b0cul8PGjRvx0pe+FMlkEkNDQ6hUKmg2m8jlcvEUfm5uDolEAvl8HqlUCslkEpVKBf39/cjn\n85idnUVvby8OHDiAzZs3o1qtotlsolgs4lvf+hYmJiYwOzuLyy67DKtWrQJw8B119/64WwJoNBp4\n4IEHcM8992B6enpe3Rs3bpy3dur6yGJLbszccSjL89m5VJc7pvVodfqE+4ikQwjz4+m5r0l+wJdJ\nuF92MhuiPkMxJbQfLDnsDFPraApWtHOsGwiWk1uRiBuSZAhUQurRps08rWbEkkOFTNNC09F6eF/z\nDQ0sZ6Y7eUusodFoIJPJYGhoCBs2bMDjjz8eP+LTbrdRqVRQLpdxxx13YGZmBi95yUuQSqXiNJOT\nk0gmk6jVasjlcvH0OJ/Po1gsIpPJxG+RbdiwAXv27EEURZibm0Oz2US5XEahUMBvf/tb5HI5zM7O\nYvPmzahUKmi1WiiVSjGjzGazGB0dxfe//30kEgns3r07Zrrlchkve9nLUCgUYqDkQCiBIrdvaXoo\nOX8ICNBxoOASyrqsoMsDswZuPh2tdmpBmxMWtzwj+YrmixbA8jIWIksyJaf/F1qONTXSpgH8mC5k\nWyzQYr78jjbVg4qvDq0MywhC+9I39ZLa6875WAJ3hnQ6jU2bNmHnzp3xIz+9vb1IJBJIp9MYGBjA\n7t278b3vfQ/lchmvetWrsHr1aszMzMRll8tlRFGE2dnZeA2xXC6jVquhUCigv78fO3bsQLPZxNTU\nVAy2bmf2SqWCc889F/v370e73Y6Z6q5du5DP5/H444/jsccew8zMTDx+pVIJ6XQa55xzDgYGBswb\nb1Z/Wmm57Vk2LJVv1U91oMc+G5HAWwI5yQd4MO1Wb7pNXygZoud8hMUKJqGy5J/ZpdIJiIY03KpL\nSsPL5VMUX3STyvAxN0kk4+rUgCShOlq6aIalTaWk6J9IJJDNZvHsZz8bURTFDK/dbqPZbMYAODc3\nBwD45je/iUcffRSpVAq5XA69vb2oVqsoFotIJpNIJBIxWDpGOTIyglQqhUqlglKphGQyiYmJCfzu\nd7+LH15/9rOfjXK5jJmZmTj/8PAwVq5ciSeffHLeA+yJRAJ9fX04+eSTkcvlDnknWupzLTi7/75+\nDjkXIhooWrYv1efzF5eGl6Gx6xD/8+lqkQXud6F+3q0cdoaprX0B/imqJZ0wrRADkqZN7jiEbXDj\n0aYMUh1cR4uR+kQyNKk9vG6N9UpMhLfb3VXOZDI49thjsWLFClQqFdx5551ot5/eFNjV7cq99957\n8brXvS5+oyebzaJer2N8fHzeJr/T09NIJpM45phjcNddd6HZbGJ0dBTZbBZ9fX144IEHMD09jenp\naRx11FGoVCoAgFqthuc+97m4+eabsWfPHuzbtw+FQgHNZhP1eh0bN27E2rVrkclkkMlkYl2tQEn7\nh/aBlD50THifu/Oc6fqm2FZwlAKAxBy1wGnZsqSTxHR5P0lv6UhgyPXyMdLFlMMOmNI6CRc6YNSp\n+E0cPjiWQVmASvNJwGCaDFAAACAASURBVCCltfTX2gE8Pe2wyrVEap/kbO635TS0nZwdSn3i9Jfq\ncuLy0jIGBgZQKBRwzjnn4N5778X4+Hh8LZPJoF6vY3BwEOVyGZ/5zGfQbDbxtre9Db29vSgWi+jv\n70ez2cTMzAxmZ2djhrlixQoMDQ1henoaqVQKy5YtQ7vdRrVaxdTUFJ71rGehp6cHhUIBfX19aLVa\nuPXWW/GLX/wCQ0NDqNVqKJfLOO644zAyMhJP2XkfawDHHV7rEz4OvM+l8eJ1SOOtpQsdey4cBKUy\n+csnfN9SrR+kN3A0XaSA0yn79Plmt7IkX40EEEdv+hs4dDoTwrj4datOHy3XjJIbPI941jRMcgif\nvjRQ8HJ5HfSBaR7VeVrefgkA+Wc+eD9Y4E7rjKIovtnj7pafcsop6O3tRTabRaPRiKfYlUoFhUIB\nK1asQCaTwRNPPIFms4m+vj709vaiVqvF+xesXLkSq1evRrPZRKFQQBRFKBaL2Lt3L2ZmZuJHiy64\n4IL4Jk5fXx/6+/sxMTGBgYEBAEAqlcLAwADWrl2L3t7eQ/bG1IBM6xtr9kGn9xK75gAd6vCWbnws\nJHvQ2iKV62yDvlwg+TBnghyAJbaofXZX6h9fMNB0WAwAPewME/Df+KAR2BdVpGsh50LTaHVxRhsC\n4hyMO4mCPpAKFQoCrv6Qu+ShIunpQDmZTKJcLmNychKFQgGZTCbea9Uxw0QigYGBAezduxfHHHMM\nli9fHm/FVq1WEUURhoaGMDIyEm8pWK/XMTIygqOOOgr79u2Lv9uTz+fR09ODvr4+7Nu3D7t27UKt\nVovXUPP5PLLZbPyYlNOjkz6Q2I2V1hdwrH7sFED5WHciHKCk+jUyE1qvxQh9/hjKJhebaS4JYFLh\ngytRdwsEJaDVfvvya7857deAT2InvD5tuhMivG6JlfP6NKGG7dYUpamVY0fcgfhbObRcSW/33729\nMzc3h5UrV8brnT09PXH6dDqNp556Cvfddx9mZmZw+eWXY3R0FJlMBoVCAWNjY0in0zHguvfG/+3f\n/g3nnnsuUqkUTjrpJCxbtixOc9NNN6FcLsfPcDrWSx+QB/Q7vZaTWiDLAVILvrQcWr41y5LsXatD\nE83PrJmQNLOSytDy+/QI0a8T0rGYoLkkr0bSxtIbAJxZSiAU0rFWnZJw8JH0dOck8AgFZesDTjSd\n1nZetq9NVAd+XmqzVh83Wg6ikn68XHd9ZmYGy5Ytw9zcHKLo6V2+6/U6MpkMqtUqRkdHMTU1hZGR\nkfg5zJGREWzfvj1+zrNer+PAgQM4cOBAfBNo//798Vs+fX19WLVqFdrtNvbv349UKoVSqRTfCHL6\n9/b2ig+kW0FbC6oagPK+8gVgqR8l4dPMTtguL4cfS74I4JBAKTFaS3dJNx9D1O5ddMIqFzJronLY\n1zA1BigNmq+R1BHptIpfDwFLCgI8D382zKW1dJQGTPq0ANdDAmvtm9VW/fw6N376p+nPp1fuv2OY\nIfXS8pLJZDytHhkZQW9vb8zw3Js39Xo9njI3m834ExTpdBrr1q1DNptFsVhEtVqNH3YfHh7Gr3/9\na2SzWfz3f/83Go0Gent74zvgN910E2q12iFrvXRJAHga2Fz7LOCh7I+OGbc5iZnyMeHlauMiBTi+\nHsrHhY47PeZlat+HknZtomVLLNeyK94nUtpOAxUtx/VBCFB3I0s+JQf8U2futBzMtAhlMQYpwlMn\noHVI61sSIFrMlJ+X/kv5tf6RdND6kbclJJ12TXJyqe1SXgdYK1eujNcg9+zZM4/hAUAul0NPTw8y\nmQwGBwdx22234fjjj8fmzZuRSCSwfPlyAMANN9yAbDaLVCqFe++9N2aT2WwWjz76KO655x5kMhnk\ncjmUSiWUy+X4+UoA8R10Ou6WUIDkdiIxTN5vHBwsoJDyaEzWiQ8orBs0UnmahLBEiQhRO5DSW22z\n9JP8hpdPg+FC5A8CMEOdlxusls4qQ0qjDXbIsS/6ajppwNOJ3lJaHu2l81J63q++dJpYTt9oNJBO\np1GpVLBjxw4UCgXMzs5icHAQjUYD5XIZ7fbBN3JarRaWL1+OsbEx5PN5jI2NYWZmBslkEnfccQdm\nZ2dx//33o1QqYeXKlajVaigWi1izZg2iKML4+DhuvvlmAMDq1avjG0SZTCb+fMXY2BiGh4fVQKm1\nTQJYzfktAPBJCFPj4KMFL8o+Jd21tlvEwKe75TtS30l9aNXJ+4eOoeWXC5E/CMCURGKHfFrRCVOy\nwIMPnnQ9BEikaxbz0nQOTSsx0RCWQkVjqVKbtffHrbGi1xqNRszupqenkUgk4s8xu3e2nWOnUils\n2LABAwMDKBaLePDBBzE7O4uZmRlUq1VMTk6iWq1icHAQJ554Ih599FG02wffAX/uc5+L3bt3Y25u\nDk888QQ2btyIbDaL4eFhzMzMoFarYW5uDtlsFul0Ot6JiOvM+0Bia5Ljh3wmQQqYWjofs6L9zo+p\n8LaEBHipTo0ZS/YeWqZ2LDFPSW8NFzrRI0SW7DlMTVzDJVCglN7KF2pgFjuzzlsgbYET15O31dJX\nyq+J1hfdBBdepnVeAmNnvIlEAo1GAytXrozXK3t7e5FKpWL25zbbaLfbWLZsGfbt24eZmRlMTk4i\nl8thzZo1OHDgQLyr0LJly9Df34+xsTFks1lEURS/JQQATzzxRLxxh7up5Jhuq9VCPp+ft8s/1Vn7\n7drJWVEI65bARAMLXo8moYGWMl5p6u6zQ00PzTdcerqzlZSO18vz+4DfysN9ZTFA8w8OMC3qLVFw\nKQ0X12nau8EUXLSBDD3n6nF1cEDxTbFompDPXViAxc9JU8RQI5J2Euci9b8DSnd3e9OmTchms+jv\n70d/fz9GRkZQKBTmfeGxv78fjUYDTz31FPr6+nDqqafiGc94Bnp7e7FhwwZUq1Xs378fpVIJ69at\nw9TUFOr1OtasWYOhoSFMTU2h0WhgcnISl1xyCarVKmZmZlAsFrFs2TI0Gg309fVh2bJl8YP1nDHy\nmyAccKS07ppkiz5A1cbD6mt+nddr1S+l1QKFBjrcnqUy3Lq1ZPv0utZ+iV1avt5ut+d9DZTqam0O\nEipLApgWuwplZb6yu9UrtEx+TtpenwOltN0+DwYUtDkj0cBYM6huRWKKneTj4+QM2H2IrNFooFKp\nYHZ2FmeccQbOO++8eDf2KIrih9Tb7Xb8qJD7Ps++ffswMjKCZrOJVatWYc+ePTjuuONQqVTw+OOP\nx3UlEgls2bIFuVwOuVwuXh+t1Wp45jOfiaOPPjp+S4gHNt72EPZI0/IgRfsnhO1w0NW+yeTSWksA\nnQC3Nn48rzvvW3qQdHH6ui91SrpZpMddtwhEJ787FXMNs16v4/LLL8fu3btRq9Xw5je/GRs2bMB7\n3/teRFGEjRs34gMf+AASiQQ+//nP46c//SlSqRQuv/xybN682duYxRbeoVadPl244bs8ElCF6iZF\nT6qL5rASi+DXtWhr1a+JNQ2ioCAxDK3eVquFubk59Pb2Ip/PY2JiYt5mxIODg3jqqafi1xPpJ3Pr\n9Xq8yfDExARSqRRWrlyJXC4XP8w+OzuLVquFvXv34pRTTonfV89ms/GWbQDindXdbu38CQhf26w+\nCu0/+tsSX+DqhMGGjL/GTLsNoFLwD6mfShT5P51L0y5GGktMwPzBD36AwcFBfPKTn8Tk5CT+/M//\nHCeeeCIuvfRSnH766bjiiitw2223Yc2aNfj1r3+N73znO9i7dy/e9ra34cYbbxTLlKYc7r/WYSFR\nkTupT/h0QzNkCpJSfTTaSswitH2aDlqZnFkCh258ITFOXofkELw+fqz9dnVTcW/21Ov1+GZLFB18\nBrJcLqNarcabY0xNTWHNmjVot9vo7+9HFEXx/pjDw8NotVqoVqvYt29f/HrkwMAApqenEUURyuUy\ndu7ciRe/+MV4+OGHccIJJ6DVasWPEznm6e6o53I5DA0NHcLSeF+FgEanIGPZrRQcNR8IBSTf53Ot\n4Cq1tZuZHJ1pWRuDW8J195EM6hu+Z2tDxJySv/zlL8c73vGO+HcymcTWrVvxvOc9DwDwohe9CL/8\n5S9x991348wzz0QURVizZg2azWZ895OLNfXx0WfN6PgxdV6pPj7l8EVq/tU/DTwt3Wk6nt/SkYIe\nPaetsVn1WOn52xuaWFM8bQycrplMBlF08JGf0dFRtNtt1Ot1VCoV9PX14ZnPfCYefPBBTE5OYmBg\nAM1mE7Ozs5icnEQqlcLWrVsxNzeHVatWoVAoxDeLgIN32XO5HC644ALcfffd2LRpE1atWoUDBw7M\ne7tocHAQ09PTqNVq8XfO6cfWeLs4aIZOgfkfL1cqh9YljScvkwZDHnR5GT6QoSJ92oUfhwCPNLXX\niIObaUizLSk/byfViadx1xZjhmsCpntbYm5uDm9/+9tx6aWXzqu4t7cXs7OzmJubQ6FQmJfPfUaA\nitRRklHxa040QOXAQ+/MUWMKiYrW9JiWwd++4W9caCCotdkHUhQorb7Q2sR1osfuTrHEWqkOnFlI\naXm73KNEmUwGk5OTaLfbWL9+PTZt2oTh4WEUi0WUSqX4+zxbtmxBf38/2u02Tj31VDznOc9BuVxG\nJpPBsmXLkM/nMTw8jKGhIUxOTuLHP/4xZmdn0Wg0kEwm8fDDD2PDhg0ADr6GuWbNGvT19WF6ejpe\nt0wmk+jv70c6nZ7HyHkbeB+4T/BKwBQyDrR8nrYb5sPr1e5+a3k1v9P0omxNetNNsnmrDom4SDYl\nga7kY25s6JdIQ/0+VLw3ffbu3YvXv/71OP/883HeeefNAwq3VyGP9sViEX19fcFKdNsgzci0Qeq0\nTAv8Qq6H6KM5Dwcod2x9ToPqpNVPAd/tZE6ZIK1L6pNOxd2EiaJo3t3y3t5eDAwMoNFooFQqxY8Z\nuTvn2WwWmUwmvmM+NjaGoaEhrF+/HnNzc5icnMTIyAjWr18PAKhUKqhWq1i9ejVqtVpcXrVaBQCs\nXbsWuVwOlUoFqVQqZrvOwULayhldqEh5rNkJzxdSfsishYoGVLzcToSn74TVSnr5yuY2zesKJSSd\niAmYY2NjuOSSS/Cud70LF1xwAQDgpJNOwl133QUA+PnPf47TTjsNW7Zswe23345Wq4U9e/ag1Wph\neHj4kPJ8AwgsLNJKLMhXL00T0vFaPqkeCk5SuRYQ07bRx1gsJuSOtbuswEHG5z794L7U6K65VxTp\ng9wSeEpTRUmndrsdA5Zbw3TvkhcKBeTz+XibN7f1WyKRQC6Xw8DAAP7zP/8T99xzT/yq5PT0NO69\n915EUYRHH30UURRhcHAQzWYTlUol/t6422i4VCohm83G+2Ymk0lkMhkAiL9CSafjGmuU2i4xOosh\nacJtR2P4Uj76R5myNpuwZhrSN+Y1kfpHs4WQ8qzrHBQlf+O+tRiPD2li3vS5/vrrMTMzg+uuuw7X\nXXcdAOB973sfrrzySlxzzTU49thjcfbZZyOZTOK0007DhRdeiFarhSuuuEIt0wKIUGOjLIgzNOrk\nnKFJ5XQyjeF1U10lnSSRoqIEhCG6uLSa0/I09Xodk5OT8Zcbs9ksenp60Nvbi+XLl6O3txetVgvT\n09PIZrOoVCoqMwpZtG+32+jp6cHc3Fx8g2fXrl1Ip9NoNBrxfpUOSAcGBjA6OopisYh8Po9nP/vZ\nePDBB1EqlVCtVjE+Po5isYienh4cc8wxSCaTGBsbQy6Xi4FxxYoVmJycjDcSTiaTMSvNZrMYGxsD\ncPAhedceiclLwseW209IYObvNGuMXgrWUvnuSQNenqS7JpIPaWSBsmx6rJUb0iedBBmJWUr95/pE\nW8LqVqL2YnHVAPnUpz4F4NC7WNTgeKdJna5RdmmTjE6mAtoxL1fTQ9KVA2G3LNvHdrVyXXp3I27n\nzp0xy6tWq+jv70cul8Pq1auxYsUK9Pf3Y9myZfEjPJVKJX7Eh7aBOxd3JOAgUy0WixgdHUWtVsPY\n2BiazSZOPvlkNJtNzM3NYfny5ZiZmcHRRx+NTCaDbdu2xZ+kKBQKaDQauOmmm7Blyxbk83nceeed\n8Rcfx8fHUS6XsWXLFuzYsQPDw8NoNpvYsGEDisUiCoUCTjnlFPT392N2dhZ9fX3YtWsXcrkcCoUC\nli9fHn+bXAu+Wn9qYy9dt4IoD7RS2m5nXSEAaP0O0YcGDc0v+TWrX12ZUv1WGq3dUh30Rnan8gf3\nLrmPoTnRgFQzaHquUwPsJIJaLLOTaBt6nl/nfeD0cdNW9+cY2ezsLOr1OgqFQjylBQ4yF7clGtff\nCmS07mq1GrNDx2hLpdK8GyfT09OYnJzE0NAQli9fjsnJyfgm0fT0NFqtFo455hiMjo5idHQUe/fu\nxcjICKampuJXHt3GHel0Grt27QIA9PX1xXfaHbvN5XJxu9zO63R7N59T8zRSWh8z0mxUC6YaePB8\nEtuzfEETnw9J5y0f6ISwWEDqIx5av0gEbCGyZBsIa53uY3E0DS/PObe2Ua/U+ZpInasxYV8brOlX\nSL28LF6P5uiUXRaLxfiJhnq9Htfj1jF3796NmZkZ9PT04MCBA+jp6UG9XgeAeJ3RrYW61wklVu/0\nabVamJiYiL/Z49K75y/du9+VSgX79++P70AvX748BvLHH38cjUYDMzMzKBQKOOuss1Aul3HnnXfi\n7LPPxtatW7Fq1SokEgn09PQgl8vhuOOOwwknnICZmRn09fXhsccew7Jly5BOp2OAbDabqNVq8Q2o\nhUzX+Hj6xoKn0UCSz7w0gKC2oIEqB0FpGYq2xeoPqx1ae6Xf2jmpDp/PaHVJX/z8owPMUFCh6bvp\nsJCIE6KnE2lqIEUwep7r7gPZUBYZYoyuXMem3LvUjpFVq9V4mzP3zfBarYbp6en4DRi3ua97bMw9\njpNIJGLgoY7q6pybm8Ps7CwmJibiJyhqtRrq9TpyuVz82mM+n4+B7NZbb8WKFSuwf//++AH13//+\n9zFTXb16NX784x/Hn9792c9+ho0bN2J8fBzJZBJ9fX2YnZ1Fs9nE+Pg4MpkM9u3bhyeeeAKnnnpq\n/BmMVatWxaBRq9XQ09Mjjk+IndL/0lhYQOqb7fiYKhfLZyx2RtNYS08SIHc6m9L8hl8Hnt6DVvvM\nseUvVtBaKGAe1nfJqVNp0wf6WwIpms8dW8yVp7fKkDrUciYuIcDN03Y7gL6poTuu1WrxNLzRaABA\n/K52vV5Hu/30+730DnqxWMTc3Fz8f25uLp5eO8BLpVLiHclKpYJSqRRP6R1ou89EZLPZeA/MKIrQ\n19cXf3/c6Vmv15HP55FMJjE7OxvfPXef22232zEINhqN+Dvoe/bswdTUFGZmZjA3NwcAqFaraLVa\n8V6czWYz3rHI9ZUFfNpY0amwdD507Cwb0OyP1yGdk8q3dJO277P0pmWHsEVJrPo0X9QkxNcXKkv6\nXXInvHF0iq1FC9/bFlS0tR/33xoIuqBNbw5oO5eHTj20dlF9NQarATG97piZA72xsbEYjKIoillf\nT09P/G61+ya3ey7SgWJPTw9mZ2eRTCbjbdXcNN19vMzpVKvVMDo6iunpaQBPP0xcLBYxNDQUM1QH\n2pOTkxgfH0cikcDk5GS8xtlsNrFx48Z5QHvMMcfg0UcfRbFYxPHHH498Pg8A2LZtG3p6epBMJnHU\nUUdhdnYWRx99NFKpFNauXYuxsTH09/ejVCrFAEtZk/SqHj9njbU2rebjqZUjpePCn5Ol9Us6SXVZ\n1/hNPQ1oQtixdI2Xq7FV3g/SVF9jtpbPSGV1I0s2JbeuaeBGxUfTpXVMzkQlFsHP8zd6aBpfeySd\nNcfxMQNejnSdt6der6NUKsUMkRpUFEXYsGEDhoeHEUURdu3aFe8M5BibO6YbZbhNePv6+lAoFLB6\n9Wqk02nkcjmk02k8+eSTOHDgAOr1evyGzeTkZAyQbsOMdruN2dlZbN++HaVSCUNDQyiVSmi1WjFg\nu7XMqakpPOc5z8HU1BRWrlyJ7du3x1vCOfYKIGaUg4ODMQt2SxDj4+MYGhpCsViMN+CgYMkf9+H/\nQ+xWG6tOloI0kNPYlvWOuGTfIfX76ubCAVbSUyrH98iPr+1aue6cVXe3siR3yUMilEvno/pSxNXA\nUPvNr/F9M/kDwfTYpbEGR4raku7dsBIqnIG697RLpVL8TGIUHXxMamRkBIODg1i5cmX8MbG1a9ci\nkUhgz549mJycRE9PD8rlcrw1WhRFMSjNzs6iv78/fuNmeHgYqVQKhUIB69evj+9wt1otDA0Nxa/K\nOhB3d+Sj6OAdfLehb6VSwcjICMbHxzE1NYW9e/fi/PPPx4MPPoipqSmUSiWccMIJyOVyaLfb8RJB\nPp+PQXtiYgLJZBKNRgMbNmzAqlWrsH37dqTT6fjTu26M3Sd6JWCk46Y9OkODKB17jQWFjiEtSypf\nAhtJBx+ISenosfRRNQ3ALMZL/cgX6CXxlU31kGafWl90KksCmFrUpp3qy8/zSt8rkYy/Wx2ps/By\nLeeQjEsDT0lCmKfWXrdW59YuqYGl02mkUimkUql4SzXHypYtW4be3t4YMOv1+iHrge6toJ6envjm\nj/vkQ6FQQDabxfj4eLyO6W72uBtCfX198dTYrU2OjY2h1WrFN4cmJiawZcsWTE1NxcDP+zyRSCCb\nzca7uLsvQY6PjyOdTmPv3r04/vjjsXz5cpRKJURRNO91Tc4AQ1l9CMuh1zgodDIz0fTR7C6EDYey\nOk4QOFCH+Kp2rOljgaZv+cMiKyH6+uSwAyZttDWAGnPkUV4yYAq61pRKYgwuD91cQDJIrrvkEG6q\nJ7Wb6yYxT+u6K5+XS+uu1Wool8vxdBw4+BEw92wigHifSAeQrVYrfn+btu+RRx5BX18foijC6Ogo\nkslkXL57W8fdPV+1ahWSySQGBwdRLBYxOTl5yLjQ/SibzSbq9TrK5XL8ls+yZctw9tlnY8+ePRgb\nG0MymYyXD3p6euI1VgDxw/fNZhOlUgkrVqxAKpXCgQMHMDc3h+3bt2PFihVYv3498vk8isVifMPK\nsUweqOlGGxo4WexNY37SFN1iolL6bmZPodN2zk65bfGypP9anfwmmxSEeF9zPax2Wvpxn+1W/mDW\nMGkaYP6nOCVg4uBJO0ej5LwcC0wl9hcaod016ZU1aeC1aR1No4EnFZrfMTU3pY6iaN6NnHa7Hd+N\ndlNULu7zEmvXrsWyZcsQRQc/IbF//3489thjiKKDN3Mc+OZyOdTrdezfvz8Gz3w+jxUrVmB6ehoH\nDhxAf39/zP5qtRoeeeSRGHjdZsGnn346TjzxRDz00EPxc6NjY2MYGBiIdXW6l0qleQ6YzWaRz+eR\nSqWwadMmPPjgg1i+fDkef/xx7Nu3DytXrsQJJ5yAfD6PbDYbt5O/r+/62WJUmj1ozk1f17OCPv8t\nfXCN1xPC9KTZjQSQPlvTfIPn89XJywwNRiFkyGKpC5HDzjCliNlpfq0zJfotsUiNtoeIxjbdsVZO\nSPmWQ/jScn3a7aen5JRB0a3vtL0gqSQSifh5Sfc1x+Hh4Xmb8+7cuTMuy4F0KpWKP2rW09ODgYEB\nLF++HJVKBbVaLb5RlEgkUC6XY0b8whe+EJs3b46Zpbt55EDNtckBPt1B3d3Fj6II+XweMzMzmJqa\nwtDQUNwvExMT2LVrF0ZGRuLvkrsH+XmfW2xMGx8pMErslJdpAa4lobZsgaAEVBbgSP7UDeuVAoXm\nqyHg6AsoCwVLYImm5JZIrNJiczQfT8cjG2d8NN1ChJdF9ZJ2Pw+t2wJF6SYEZeeNRiN+BtPd1HGA\n58DHPYvYbrfn3figZTnW5h45cjv+DA4OIpFIoFKp4Oijj8auXbvijT1mZ2fj/Svd+95RdPB5y97e\nXpTLZUxOTmJwcBBHHXUUstks9u3bhwsvvDCeQheLRaTTaaTTaezcuTN+hMjdIIqiKF6bTafT8x5f\nooz65JNPjnUplUoYHR2Nn9McGxvDcccdh9WrV8ft1jYV4WNnAZM05ebjJ/2WWF9IHaFsSpt5SXVS\nm6Xtl4KBBcbWo1nd9p/WZklXXs4fHcN04gOpEIPgaUPWOVx6a02Dd7wG2tZ5x+Z4WzoFZ82ZnGjt\ndmysXq/P+0yEu1njHvNxAMSn5FRnB7AOdB2rcwCay+Xi74XPzs7GzzrOzMwgmUzGD8knEgn09/cj\nk8kgn88jk8nEU+jXv/71ePjhh+MbO9lsFqOjozhw4AD6+vowMjIS1+9e2QQwD8gds3Wf5o2iKGaR\nbq/No446Cjt27MCuXbuwfPlyzM3NYdeuXVi2bBnWrFkTb//GZw3cDjQWRYOZNUZSXh6wLDZo2YEW\n+ELql5g2FWnZQAoiGqOzziWTyUNu3kpAzr8OIJGGhficJYcVMLWGhQy01RFS5PKBIR8ILepLulnT\nNJqGDz7XVxtQWia/sSOl4+VEURS/2ugAst2ePwV3wOMAlW5CIdXDvxcE4JBHclqtFmZnZ5HNZuc9\naD0xMYF2ux1vgrFq1SoMDAyg1WrhpJNOQrlcxpNPPhnvzt7X14eHH34Y9Xodq1evju+oO11dOvc1\nySiK4mk9cHAttVgsxksG09PTKJfL6Ovrw/DwMAYHB7Fp0ybs2bMHlUoFTz31FJ588kls374dxx57\nbPyUAG0D30bNsXI6nlKfWPbDmRAHZon9aXbCf/NH4TjTk3yNl6eRFs1uOcDTftE+eyH1keST2idU\neF9xvw3x1U7kD263Ikt80c/KZwEb0Pk6pgVgFlDztD59temJrz3uVcL+/v744W13PYqimElJN3uk\n/qKGT5cDnPO5x3rcjuYuT61Wi5nk2rVrMTQ0FG8GUigUUC6XMT4+Hu/D2dvbi3q9joGBAdTr9XmP\nGdVqNbTbB58vddN19y66W6t1Sw3ZbBbt9tOPT7lXNelrlz09PfG78slkElNTUygWi2g2m1i9enWs\nd7t9cNMQ94C8xDUiYgAAIABJREFUY7QOuDnY0UDJ2bs2naW/Q8HSsmsNuHyg242EMsmQciS2q5Ut\nTe99uiy0vYcVMOnze4D/ziMVjWlq02KaB5Df/JE6XJJQaq9Nw6TzEuPk9UnXtProb7fO2N/fj3Xr\n1qG/vx9PPvlkDD5ut/F2ux2DiLtjTOuUHo6mW7PR//l8Hn19fchms+jr64vfBHI3VMrlMmZmZnDg\nwAEMDg7imGOOwb59+3DgwIF4I5CVK1didHQUc3NzqFQqMVN2z3fSZ0rdzSv3Bcjp6el4V3f3eQpX\npnsG07Hs3bt3Y/fu3UgkEhgYGMDAwACq1Sp6enqwa9cuJBIJPPbYY9i8eTPS6XT8/nsmk4k3HqZT\nd3oTzTFe+l0ZOqYhDktnFRREJAbHxz4EaCTboec5kNP8oYzN9Yv1lIFEIix/diL1aQjJoF8e6FYO\n+5Q8pFN4Y0MimGQw2tRXm8pa+ljTfEk0lkZ1sCJfKHOg+lP93Npib28v2u12/Jqi+46PW+N0/3m/\nabr9f/bePUbSqzwTf6qru6ur6159n/uMPYMvE2xgIBut1wRiMBstYTcKcSIUtDGrDWTjLFolMkyw\nIXIS1ko20ibkKiX/JKtFIqxQ/kAiLMJrGRMTEQixAQ94rt0909eqrq6q7q7b9/uj93n7qXfO1z2e\nSdqLfz5Sq7urvu985/Ke533eyzmf/1sj491uFydOnMDq6qr5NBcWFoxlVioVvO1tb0O73cb8/Dwu\nXbqEkZERexPk/Py8Ha4xODho74VihF5BaWtry06E59mWURTZgR2MgudyOQwNDSGfzyOTyWB6eho/\n8iM/giiK7EDlc+fOWRpUsVhEq9XC+vo6vvnNb6JQKNjL15555hlj7kzOTyQSNs6JRAJDQ0OmNEJ7\n1EMmsn6nY3yjp9p7xR8CohAI7sZibwTgQp/zen/Wgn8xmd4XZ8r79eKvDRGS0NjeSB9utLxiPkwg\nnlrfiGD4+0L3+AHdjWGGnsdr4lwBcW1S0yquXn+9/95/FvfOlTggp9k4ODhoPkWgf0cU03P0J04g\ndSHwtPR2u41Go4FarWY/9XrdTFceWszT3u+//350Oh1Uq1XU63Xk83msrq6aKd9oNCyBnq/BZaCH\n4KNBHy6OKNqJ8rO/NLe5ZzydTiOTySCVStlBwkNDQwaiy8vLBvQEQQC2W2l4eBhvetOb8OUvfxlb\nW1u2FZQpV0z6HxwctIOLi8ViH8sMzb+Xo91k9OWwo5drtoa+f7kEQQtT2fYC/RCj9W/m9P3ZbR36\n70NM/VbKK+bDjGOacexyLzPD71NVh71/Zqi+3bRW6H8fBNhrn6z2JTSJodck7NV3D2g6pgTZVCqF\nTqeDfD5vr4jgPWSYvr16mg/fx1Or1ewwjGazaUEWRsbJ0Bglb7fb9vrbe+65B6dPn8alS5ewtLSE\n9fV1lMtlXL58GeVyGc1mE+fPn0cU7SSKMz+TiercF08ATqfTdi3nYnh42Bje5uamRevpnshkMnZg\nsCoTugjo32y1Wnj22WftsJAoivC9730PyWQSb3rTm+x1vvPz831bM9muoaEhlEolHDhwAGNjYxgb\nG4s9tFeZlDdjvQzfCOuLY5e7/e+vjyMtcVaT3sey2yHeIVbs6/LyHCJV/FxlOs5S2q1fL6e8Igwz\njorrd37QQkXv5aJhnfqe7Tiw0jb4id8LrPzz48yZOIaw29mDnmWqmRHHWuNYCvdXc2cLx0a3/XGs\nms0mms2msa1Go4FUKoVKpWKvUabvkCBJXyMP1+CBxKOjo7j77rtx7NgxdLtdfPvb3zZGOjo6ivPn\nz+P48eM4d+5c33wpICqo12q1vrxRvpeIrJP5pVyoDPYA21sn8/m85ZNqSSQSliLF8en1evjX//pf\n43vf+x5efPFFRFFkZ4eeP38eqVQKBw8exA//8A9jbm4OX/rSl2ybJ4+nW19fR6PRwOLiIg4ePIjp\n6Wkz4fdatHEH+YZkQ2UijgTsVg/njLKgpjQBW9eEB6vQc0LEIbT29Vov46pE4uqJw5O4fv9TsMxX\nPEoeR69V48Z10oOaamb9Xuv192naCO+NMxv07zgfTZwpof/HLYgQuwxdF2K7/nNlvmRd3BHDa4eG\nhiz16Lvf/S4WFhawtbVlTJQBFgYyCBytVgsrKyvI5XJotVqYnJzEv/gX/8JeXvbSSy+hUqmgUChg\nYGAA58+fBwDUajU0m010u10UCgV873vfM7dAKpWy3TpRtH30G18tQSCs1+v2tkmCqS62KIos4EMA\ny2azyOfztl3Sj69uV+SRcmSNd911F06cOIHFxUV84QtfwMzMjB17d+7cOTsp6d//+3+Pb37zm3j+\n+ecRRZHt14+iCAsLC1hbW7MT65k3Gpr3vf6OY336fYhgeMLg644DvpCshT4LMTpPRLwV5OuJI0Z+\n7ema3W2s1OLbDURfbtkVMNvtNs6ePYu5uTm0Wi186EMfwvT0ND74wQ/i2LFjAICf/dmfxY//+I/j\nU5/6FJ566ikMDg7i7NmzeP3rXx+sM44h8Ts/WTfaQQ6S1zJ73RP3/BC47mYa7fUML7RxYBm6P27M\nQuyYRduaTCYt2ZwHTzB6Xa/Xce3aNVQqFQPMzc1NpNNp2yG0vr6OwcFB2znU7XaRz+dRLpeRTCbx\ntre9DblczlKDyDzvuece/P3f/z02NzfNXOZhH2SUIfBKJLYTzsk8dQz1LEtdgPxN5UCGxAR5gr6O\nj6+j3W73sUxu6zx69ChOnTqFlZUVJBIJzM/PY3h4GIuLi0ilUpibm8P09LT5Y48cOWL1Ly4uolar\n9UVod7M89pKhvWTlRuUnbm2FQCgOBOPq5ndx8hha56F+7tUH/U7nMcRCfd9utuwKmH/913+NYrGI\n3/7t30alUsG/+3f/Dv/pP/0n/PzP/zwefvhhu+6FF17A1772NXzmM5/B1atX8cgjj+Czn/3sdfV5\ngQ0BFBlGnPbQ+3bT1MDehwiH2hYColAb/PdxAhjS3nEgF/o/JKS+jXGaW83+oaEhpNNpVCoVtFot\n/Mt/+S9tl0u73cbi4iISiYTt9ebWRJrRfMa73vUuHDlyxExeghhZc7vdRiaTwalTp/D5z38ec3Nz\nuPfee+20I/oet7a2+nZC0dymac26WT99pjySjvcAsKAMgzAETO5h5/9+PMlWmOrmgxQ6v/fffz/m\n5+fx7LPPIpFI9J3ePj8/j+PHj+Otb31r3zbStbU1dDodrK2tGQizqKmrcxjyhe9GKEI+Tn+eK58V\nBxjK0OPGSWXNy6sHJv08jq3G1aV/x8m9/19/h7ISOCb0dd5K2RUw3/Wud+HBBx+0/5PJJJ5//nlc\nuHABX/rSl3D06FGcPXsWX//613HfffchkUjgwIEDFhUtl8t99cWBkH6mpm1oH2po4Hj9bhOyGzv0\n9Sq43cj5nFrfy2EPIS0cp8XjBE/v4/V+0ZOVMdfy9ttvx7lz57C0tITl5WULdqjJOj09bWz0ve99\nr0Wt8/m8mZbaJj6T/r18Pm++x+eeew7FYhGXL1/GnXfeaf5Qto2gpZFwHXueqRl6hxCj3TzXk68P\nHhsbM1OcrDY0Tz7x3M8D/x8cHMTBgwfx0EMP4XOf+xySyaQx55GREfz93/89Jicncfz4cZw8ebLv\n1b90B6icaVu8nHsZ4dzeyEEptCZYr64PAkYIkD1w+7bEEYJQm3n9jZa4SDpl2SsAv97jTpqKosj6\nHNqgcTNlV8DMZDIAto/+/+Vf/mV8+MMfRqvVwnvf+16cPn0af/RHf4Q/+IM/QC6XQ7FY7LuPkVAt\nezEwCrB3/ur9IRYZV9eNaMO4v+PaCYTfS7RXP7U/IWa92328bi9WHdL0wI4fc3h4GLlczvyMBw8e\nxD333INcLmd5m8lkEs8++yzuu+8+W3iMLNNE13YrM0oktncQTU5O4qtf/SrOnTuHfD6PY8eOIZVK\n4cCBA7aoBwYG7MBiZZQETPUp02+q+9dpqivgEcQZoR4ZGbF3/fixDilXv6goi56dvPvd78alS5fQ\n6XTwne98B5cuXUK73cbo6Ci+8Y1voFKp4MyZM7YVVdlyHFjpWIaUrgcxLw9cOxqo8deHCMdeOYue\nxe1FeHybPUHZS379tT7FyIOlZ+W+fbqpYDfQv9GyJ+xevXoV73//+/Ge97wH7373u/GOd7wDp0+f\nBgC84x3vwLe//W17lSpLo9GwpGMtnuX573Qg4ljjjQLcbnRf61JhjGtfnEDcaAm1JU55xIHezTxf\nn0OgGh0dtYTv4eFhM2XL5bIxoTNnzljQhEEXAObfSyQStm2R7dZn9Xo9XLx4EZlMBslk0k4aSiQS\nffu/oyiyU5WUEURR1MeUNM1J+6VzSLAYGhpCsVg0BfFymE5o7BUsqCwGBgZw+PBhHDlyBG9/+9uR\nzWYxNDSEpaUlAMDCwgIqlYoB/255mAqS+j3ZVUg+Q/Ps6/N92O2+EKOMA6C92hRaryGQ3YsceAYZ\nalvcGvLf6/NvlWnuevfy8jIefvhh/Oqv/ip+6qd+CgDwgQ98AN/61rcAAF/96ldx9913441vfCOe\neeYZ9Ho9zM/Po9frXccutcRNMBlGSBvGTUwcEOrfHgj9pCvlV7+af4afAN8P37a49nmtrs8PjUuo\nnlDx/db7aK6m0+m+HT8KYvy+VCrZPV7AyPL8nBCwaLYfPnwYAGwvO9tCAGG6ExkAg006NvRr8lls\nMwNPrVbLfKE0fQ8fPtz3VkuNSnuTTU25ELtRBaDMjX5U7vh53/veh//4H/8jPvShD+E973kPKpWK\nnQRFVu5Zkv87NL8h94OOo7ovQp/zO2+ah5i81hNicX689Jkqv1qnv48lBHi7kYUQUWK9ZPFUtLoj\nTNujaXS3UnY1yf/4j/8YtVoNf/iHf4g//MM/BAB85CMfwW/91m9haGgI4+PjeOKJJ5DNZnHmzBk8\n9NBD6PV6ePzxx4P1eQe1Zw1xkcTQwOrnughC98V9r+1i3Vq8wPCz3XxOuzFgBQxti+ZFxgFjSGB8\nUbMxJBxc9JVKxRLa1bTV6/YCeg/y7JuO89bWFo4cOYJvfvOblgvK59DnSPbIPeCMgGu0m2M2MjKC\nRCJhx8UBO/vm+SK2iYkJZLPZ60DKj12c1RBSjqrIOc6qWHkt3QbdbhcvvPACTp06Zfv0d2NiIdbp\n1waL9097INhNsXoA1XbEkQy/hvz4UX5DY+jv1/r9Z3ElFIgLKZs45qrX/FP4MXcFzI997GP42Mc+\ndt3nn/70p6/77JFHHsEjjzyy68N0oDx4aqf2AjDWcSvFCyU/Cy0EfX4c6Pqym6bcTVBCz/UKI84U\n2ast9MW1Wi1kMhkDy91MmxupN6RMEontRHCCF4NK6s8jIwVg7FH/18WtQSa2S5lqsVi0iLgeKOzb\nFzd+cfLk5SM0Jp6NTk5OolqtWtK95pKGnhUCxzj5jJsD1s858CDiZUjr1Ln2v0Nj4McnRCziiu+X\nB2z9O8ROfT0hArMbU73V8k8TOrrBEqd9gH5zWQdCNYg3Nfx3/jN9pp8grU+vURDRwVft5E9c2suU\nCAmUMgOfSrVbnawnTuhC9/J6vsmRpwPp+ZJxghZiBru1jQGZwcFBVKtVjI2N4eDBgxgeHratjWoG\nKsPt9foPB+b+cr6p0n9PdsmdNKVSCZlMpg+UOb7qgggBXtxPaBz0/5AyO3PmjL0LXgNlXi5V/ijv\nKo/+79B8eJlX2fB1hPqrBMHPe8iUD13rXQPa15Bch9aqjoc3sbU9tIr0GWqx+fQofW6o7S+3vGKv\nqPCABNyYU5slxIDUJAxpZwUrrSdOk4c0Pz/zZmtIQ+rfXqA1cdsHT26kzyGA08/4t0aR0+k0lpeX\n+3IdeWSaX8yhRbFb0Tmkuc9TfGZmZjA0NIRvfetbfT7QgYGBPrcAFQfNdD3Hk4tBX1ExPj6O8fFx\nHD9+3AI9oWPq/HjGMU0PQnqvnzM/JzpGTGLv9Xp2UIeCTog46LyGciv9by8nobxOXr+bJeFLKM1K\nxyJu3LQNIYUeen6ISGif9F7vDtptXfr6tdxqLua+n4fJEgI1v9h5nX6v97NOgk4caLF4TRR6Xug+\nfhaXVOwXVkjAfH9C/fO+mpBSUGHxjM+3gxqZ7I0H9xYKBQNKZe0ELA/Ift5CwKxKpNvt4sCBA7h4\n8SJSqRQKhQIGBwexvLyM5eVli54zWJNIJGzLpl8IZGdsP7+bmprCiRMnUCwWkc/nr0sf8kfW+XH1\nxYOeVyAce29Wh4Cl3W6jWCwaw2a6VkjOPEuM+9zLilo5/C4ua0H75dus3/vthKG2edkDdkAoDlRD\nyv1GAJWfeRCMu87LbNzzbqW8oq/ZDQl0CCBDQBm3K8MDaVzZTWP6Z6oGZdkt8BP6LI4hxJXdmGbc\nvaHPmcIzMLDzdka+w9v30QvxXmMUYmKat0iA4d7qXC6HpaUlY5EESx0XJsXzb9bHOnu9HlKpFMbG\nxlAoFDA6OmrpQzpmmroUYiz6d5yS9IDhlZUHNC3j4+NYX1/H1NRU39h45bIXaChAK6h55hViXX4t\n7AZYGnQk4ISYrp9//39orPhdnOzHgaW2089vqHjC4J/t3QY3U/YdMHcDJ9UQewFLnHBonQqucc/f\nbUHp917g/CSG7o1r8259CSkH1q3XeEEKsRcV2uHhYVy6dMnSbfjOGz3izUcRPevybeE9mnJDEOTp\n6wDsbMqZmRmsra3ZfvNEIoFsNmtpQpoSQjDQNBXuWJqZmcHx48dRKpWuy7f0QBc3b1ri+uflx89J\nnHKPogg/9EM/hP/9v/+3nZuZSCT6WGFozPUlYH5u9VpdIyo7CsoKkn5NafHs0VsXbOtuABYaVz+m\nlJHQug6tNz8GHtD1vrg1GKr3Bw4w+dtrTmBH0/Fz/h83uLwn9LkPHsW1RZ/l61Tg8feF2FnoGX4h\n6983kkbF/0P5obv1ST/jz/z8PHK5nL3BkUEfgpTvl/Y1BCqe8QCwd4VzTzf/57mTfA1FFEV2sDG3\nMzIgxGfxLZd6dmU2m8Xx48ftfMvQCUQhn3CIXVG+dmMeHijiWKaWXq+Hw4cPo9VqYW5uDqdPn+67\nVl+epnOq7DzUZt8n/+w4wNNn+Pu8ctGAXGjs/P06fl6Wta3qRw21LW7c/ZzutglA6/MMebdnvZyy\nr1FyDxChH78wd9MKXmvsNji7admQQITuU9Ml7t6XMyEeREOfh66P64sXMl1A7XYb9Xo9CBAhwPDz\nEvou1GZGyXmyOXcEJRLb2yb52lsAfeyWwEi/KwNRGswg6OrrIbQ9fqx0LPzn6o/UlJw4hRHKk91t\nrsm219fXkc1mg4Dnr/dj6dPrQmslbh0Bu7/DZjf5YXqXAnvcM+LYoa93r+tChCJurOKKl0ddq7ut\n/5dT9pVhxiVo68R4X0wIoOIWMBD/FkRet9egxfl7/PPjtLu/3j9fmU2oTwrMbE+IIe/GMkP11Wo1\nNBoN5PP5vmv5EjQ1iX19oc8UeHx7E4nt3UN8MRmvoe/x2LFjWFpawqVLl2y3D9kVAVNLMplELpfD\nHXfcgVKphGKx2He+pSpaz3j1xWQs3opRufOgoX0PRZA9c+MzO50OxsfHceXKFXu/j+aW+vs8uwuN\nNb+LY5gqf1xrnnVqm0N++FQq1SdziUSibz7U9+3XgV97ni1znPV5yqy1H75OXRd0JfH/0NrjWz33\nwo6XW16Rl6BxgNgZpc6M1noh9CaEApeWkCDr4uY9ntrvZiqEUoDYVi/QoRJadKFF4XPivID5MVGQ\n0vv0eprEs7Oz9iZFRscJlFtbW32nmXvBD41JyNfG/3nIbqvVwsbGhr2YjK9uiKII5XIZQ0NDOH/+\nfN+bLLnXna+HyGQyOHz4MI4dO2b73bljKO70HQKGtkn7pjt1dA51HNknjdLrvPn7VLYSie2dS6dO\nncLy8jJmZ2dx2223BWU5VLzJHgJIX4cHE50jyooyU10//J9pZn5O1Srx6yqOUdLS8EzRg7HWo2RK\n38qp/VZA9CCszwodthFHPl5O2XcfZlzyMBBmYn4xKhvwQqr1xFHwkA9qt4HWSYxLOfEgHTInQiwm\nBOq7sVsvsF6gfY6ZauBr165hdHQUmUzG9jkre1CA4QLaLdjhTwBS0OcPwZl5n4nEtsk+OTmJzc1N\njIyM4NChQxa9HxgYMFY6ODhoJ67ztb0jIyN92yf5XGVdIQshtHC9n5BsJKSsWLwJHAJbFr687eDB\ng7hy5QpOnjx5XSpbnLL1MqQ/2iafakWlp64GnTOvpBVAdF1ohgOfEQfQfjz8mOua0f55cqCK2Cf6\nK4Ara4xzWQA7r0HWsQpZLy+3vGJvjfSMzTMob0aE6vD/e20Xd61+7n16aob5RRZih7u1JQ74tK1x\nfQ397dmF1uWFC9gBD+Zf8sRzH0ijEKk/0YPHbmMZiq7z4As1idV8UiZBVkMzludz8jCQXC5npnto\nDkPKyc+D9kVNY1/8GIfMZK+M4xj45uYmcrkcLl++bNtDdV5CSjK0+HWcvSyEWBqAIMjpWHjGqP3W\nOkJZFCGQj2uTfu7HSGXCf6/M11/nFZSfm5ClxutCjPjllFckD9Nr2NCE6j0sIUapArDbIvaLSuum\nNuUk6YD7iGsikbADFkJt0+tCpkSoj95Fweu8dvWfe5Mc6PcT072xsbGBlZUVvOENb7D2E6DISvhq\nXAKs9kNZtjIqBUIdr4GB7VdDRFGEZrPZx0YHBgbM/B4aGkI2m+1jRlykbCeDD7xXASzEMEKL1I9Z\nyLflZcsrc13AKnf8XuWNGQhLS0soFotoNBr2sjhtp59H7ybQ54SANJHYOQPUy4lut9XPWL+OJ79v\nt9t22LIHbO3nboCpCkPXl65R/VzvUwWv/fYAH1Im/IwWDbfn6hxStm6lvCIMUzseMnvihDHkK/L1\n3Qgr0gFXMPCO57hrdXF7De8ZigrQXn5TLzh6XUg7htImNM0mkdg2uZeXl5FMJjEzM4NqtYrR0VEs\nLCwgnU6j3W5bYMYzadXM/jkEXa8gBgYG7NSekZERrK+vX6ccdMwInqqwQkyZAKCLjH+rOe0XJetj\nLmSr1epjLRpw8izOAxc/4/+8V5/LH6ZJVSoVDA8P4+rVq5iamrqu/d5f75V3aD14puUB08s+P9dt\npn6bJ5/Ha/z9obljP0O+fA/0Plik9bK/+kZP73rQejhOUbTjK9V+6/mpfJZ3V9xs2VfAjDOpWELa\n25c4lujr2e1+zz7iQNi304OIZ17+Pq0vxDxDbWcdvh27Xev7rc9st9tYW1uzlB4GYci0uCh1K2Hc\nmPq+cRyAsDKJogiNRsMCTwpQvv8hcFIgUmXJfnuT2i9a7c9u5reXy92YjX8OAc8HFJS5Dw4Oolar\n4eDBg9YWD5whRenbGZLFEJD6e0Ltp6tEQV+v9esnJGdewakshNaGWj9qlXhZooIMBTz9+tG3m3pl\n4p+vryq52bKvgKmDAIR9TRxsfhZK8t2NPcYB8W7sj8/xkcRQ8e3wJnuIHXGBeKamC9b799R02M33\nEuq3Xluv1zE3N4ejR49iZGTE9nVvbW3hypUrJnT0rymbV9PNg4UySoIvsD3HfP9PFEX2vvIoivpO\nGuJnIRDW/wkk2i/vVwwp0TilxDnzC8qDpr/X+wQ1bYfjxv87nY6dsDQwMIDJyUlcvnwZR44csV1P\nCsr+Od4VEAIrFh/I4e9QQr/+reChIMax0OdTdkOBE++DpNlLV4qCqmez3qpgG/TNnZqWps/T51Km\nge1XOdP9EUWRneZPF9EPlEmuYBIyGTzgUDDjXpEa0ohx4Oi/85o5jrGE7gdwHUvwC3M39uNB37c3\njuXFlZD/k+XKlStYWFjAfffdZwnUjCAmEglUKhXb8RNieeyLCrgqNi4eBVq+kndgYMAAU5lsaEz4\nTA8AXvkoO9Hio71ecbJvOmeq7AiA+nxlfmr2q7wpU1fWSXZJJbWwsID5+XlLL1KFq8zbK4g4ueIc\nct70Hr/FUucztPa80lX55PmivV4PzWazbxyYlqbritaLAqzWqUpWZV7f2R5FkW1MoMtI+8PsC9bL\n+9T33W63rX6a7QxE3krZ99OKQmYFcH0KhAq9T1JVIfJnU+p3KoAeoEJsVn+HoozaNr+4Qn3ybfIL\nn23TupS5aVv5HReovlzLCx7/73Q6uHLlivkUNzc3MTAwgNHRUQDAxsZG31mT2k7vLNcFzYUeetcO\n+xdFEUZGRrC6umrCy0Wm4KUApG1QJcnnxFkoOt7KPjxAq6zoomXbtJ0cSz+urJcLT4+bY53tdtty\nW7vdLsbHx/GP//iPeOmll3DHHXcYC1WZ9tFoTwh0bvy4KWATHHwf4+TPg7f3AbNt/J7AxHHWffzq\nD2curlesrJvfqxx7K4VjwjFlv/lOKraBZxHQr860NLWc0um0BTZvpez7eZgsCiyaxuI1qmrAECPR\nv3WS9cfXo/4TbQ8QNvP83yFHv2epXmv79oeYsf72jFM/52tllQEpyLIf7XYbGxsbJuTNZtMOx2Db\nvcZlH+KYjSo4z7gJOslk0tKCCDQ8tFj7QV8VsKOgPIsL+Zfj2sTx8/Og9/kxCgGW3qdJ4ARK9p2K\nXPugh98SGMnQuNC3trYwPDxsz+V86OlM9M0RVDQ4xfboulHmrQxP+6wK2o+prg2/DnUtxcm8Kj22\nTYGV7VMFQ1Dk+LBt9PuyqGzQcqGM9no9NBqNvq21yWTS3kiq7fJH4t1MeUXOw1QTUjU3hU9ZXujV\nBBxYD4I6eTpYCpweCOIGMcRMdXGEBMr7Rzwb4r064SGA9G3nZKu29xrZs8IoilCtVlGpVFAsFrG5\nuYnl5WVL1el0Omg0GiaAGxsbBnIEvtBJ7HwOv2N/+JNOpw0Q0um0tZ1t1MOKtS+hedB500XJ79Ri\nYd+9ye9lS+vi3wQ2lStN1wFg54oqU1KA8m3d3NzExsaGgcTg4CDW1tZs08Dm5iba7baZuWx7FEUY\nHR1FOp0csIgyAAAgAElEQVRGPp+/rn+e5enf/PFZD5pio0oAgJmvAOwVImRsAOyAFFWwVBpMSxse\nHg4CtB7hR6BUFxvbvbW1hVQqZf5GAij759ki50h94p1OB81m0+ZdFQuV2Ojo6A+WD1M1sWocLgS/\naKhRvNmmi1d/PLDyGn3nNT/z7gFtIxejj2SG2JcuFC2qaVk0SqhOd9XM+r+yY1302jddKLp7ZWBg\nACsrK+h2u8jn8yaQ7XbbzJpms2lvPxwdHTUQ5QJQs8czEQqiBhcIFDSpmGxOV4A/UMPLAseTY69m\nL4FA5zmOjXumyDq1Xrbfy6CXJZaQ3y2KIkuL0uv5Wg1geyGvrq6iVCqh2Wzi4sWLaLVa1sZkMolq\ntYooiuw1HtzddODAAZRKpT7z3csX+0hGpy6PRCJhc0nQo5tAmX8ikcDIyIi1V32ClBmeQEVgIttO\npVL2UjptU7fbRTqdtgCMd+nwf4Ik+wTsnFLFPlDxaFCNdVHBU/FzeyfbT6XNOkNr/uWUVzRxnQNE\nba5+CtX2um9U95iq+eB9QHQix5lrbIduw+I1nEROtIK75pPxer2fi5rPVnOZAr+XlvMKwpurOpZq\nFmk7Op0Orl27hmw2i2KxaCCti4lbJSl0rFuTrCl4/j05rM+Dji7UdDqNjY0NrK+vY3p6GltbW3bY\nh7Y/mUz2LUK235t6CrLKIjjnQP9uJY6HMst2u22Li89RwONYkh2peaxmcSqVMiXDemhidjodTE5O\n4siRI2g2m7hw4QJmZmbw7W9/G8vLy6hUKn1jXyqVTD7q9Xqf6b+1tWV/6zkA2h/Kp8oB28/+aYBm\ndHS0b0y73S7W19ctSMXxYvCO48B3MlHZ93o984Frsji3r7bbbQs0DgwM9KWYsR+UISp0DWLRGhoa\nGrLXKfMZ3E5LhaB+1larhVQq1QfoUbSdsUHFcLNlT8Dsdrv42Mc+hgsXLiCZTOKTn/wkoijCRz7y\nESQSCZw8eRIf//jHMTAwgE996lN46qmnMDg4iLNnz+L1r399X13erKPwURg9o1Aw0JwxBUqv+Vm/\nmoucXP4o4Hnnu5o5BF5gB6CVeVFQCOqbm5sm3N6H5t0F6pei70Wfr2xJwULNHwVxFmVX6rNMpVJ9\n7wcnyyS46zx4/xjHieBDs8kzXS5S3RLJw4oJiBRuLhwKOJ9B/5WOHwBrO/9XNwCfreCqpjMXmT7X\n550qAOszVQGpfKnMeL8an8nFyWuHh4cxPz+PmZkZTExMGLtXACQr14Ce5rHqNlZep8ERtkfPEeX3\nSjwog7oBge0GYH5ABlwIYPyO/5Nld7tds04I9MB2YJEn7utOIt1txufo89VVoDJBEI+i7aAi541n\nr2rARwNvzWbTXE+3UvYEzC9/+csAtl+t+9xzzxlgfvjDH8YP//AP4/HHH8eXvvQlHDhwAF/72tfw\nmc98BlevXsUjjzyCz372s311UaCoNVh0AvUcPp1cYOdAAwUF3q9/q4nFehR0FfC8+cXvKRQElZCp\nphNMcCWwqManYCv4qkmoC82DoV5P84Rt4bN8agevW1pawtGjR3H06FHb1QPANDrf8+2BRv1T7Bfb\nrgtW54F/Dw8Pm0YfHh5Gu91GtVpFNpu1hUcg0rEkWAL9J4+ria3zqZaHuhDUJKOceabaaDRsfuij\nI4CSTXFx6/ywXTpfHPdms9nnY0ulUjhy5IgBWKFQwNLSEmq1Gl73utcZSGSz2T6Gq2yYLCybzRoI\nefeIMkzdNUX2yzkk01JTW+WQAKdgrYBM5kgLj0CkqTwjIyP2nHw+b7u8Njc3DfTJYtl2jivBnXPB\nsSdOcJ6azSZGRkZQrVYNQLlGNYDGMdDXspCt30rZ8+4HHngAP/qjPwoAmJ+fx/j4OJ566im85S1v\nAQDcf//9+MpXvoLjx4/jvvvuQyKRwIEDB9DtdrG6uopyudxXHzukGpQCwwVFwVTTVlkE0G86xfm0\nFMzU5NeiiwnYYZzKLsimFJDYD31mXACJ7eS1FHwePKF1KZtUPw6FMpVKYWNjoy//UZ32fFa1WkWz\n2TSTSN0PvI4MSAFK3RrATqqIAguFU/vMBVav120cCe6Li4uYmJiwQIeasQQgjoMqRY6JghlfSRFF\nkZ3Q7v263uLgYlfZ0EAL55smLMGWwQg+i6Ymn0cT0yt/LmoGTzKZDAYGBjA1NYVGo2H5mOp3VKtD\nFS6DRbrQOZ883ENBnYGNWq3Wt8bIOpU8qEwz0ERgqVQqNm7sI10I8/PzZrGQIbfbbRQKBWOUnU7H\nrul0OsjlciYPnjhQmVKeyBITiQTW19dtPz7PQG00Gshms1hbW7OjAIeGhsxfubGxYfOgfR0aGkKj\n0Qiu0RstNwS3g4ODePTRR/HFL34Rv/d7v4cvf/nLJqCZTAbr6+uo1+soFot2Dz8PAaaa2wD6GJKa\nVvp8XufB0Zuy+p03P9TM9qCnAkRBVgalLgDWp4tS00kA9IELsLOzgk51Ld7cp5LQz1g/lQ1NEwVt\nBTNGX5na481IttH3S/urjNyzGmpxNQXVLOdp471eD5VKBVtbWxbFJJMkOJL5KGtWZUlgpQ9teHjY\nzLzQPCpLp/9L+8B54MLV32qea7/8tbyf48t3JLHd6mvkeaAMgrRaLQMA5jHW63U7Q5RzMzIy0peW\n1Ol07B51LSgoDQxsbxZgG5ixQCBkfTwoeHNz09rY6/VQrVat3nq9bvJBUMpmsyiVSrZbDNjx27fb\nbfPNdrtdVCoVDA0NYXR01J5NpVOtVo3B0qfLOoaHh7G6uorh4WHzb+fzebMOGo2GzScDZATnRqNh\nSmpjY8PWWjqdRiKR+Of3YbI8+eST+JVf+RX89E//tA0UADvFO5vN9qF3o9FALpfrq0MXAieFIEZ/\njgoaQUYBVYuyRQINhZwBBhYfeVMmwcVFgGDqx8DAgAUpfK4otSNwfYoJhXt4eNhMi3Q6baZQo9Gw\ncVAznD/0PapZzzaqH4t/NxoNM5eiKEK9Xsfy8jIAIJfL2dFiFEYKpvrs9ORzmi7qXvCmO8ec46Tp\nQgRALrB0Om372dUXSlbh+0mlwIAC25tKpezFasrKstksJiYmbJEC/RFXmoAcQ8oCzU31kalC1n5y\n7NVfCcBMQi5EZdBcpGQ5BK6LFy/i7rvvNuA/f/68KcFisWgyt7a2ZjtngG2wJttk+hYtjmQyiXq9\njkKhgHQ6jcXFxb7AZ7vdtu2BTHmiTFBG6AMEgGKxiImJCaytrdlY12o1tFotA376LLvdrrlF0uk0\nDh48iAsXLgDY3qpIZTE2NgZgO6g4NjaGer2OcrmMO+64A8888wwOHTrU55+kS4GsstPpoFarYWxs\nrA9DAGB1dRWjo6NoNBo4fPgwqtVqn7uGfVNf9M2UPY/u+NznPoc/+ZM/6ROA06dP47nnngMAPP30\n0zhz5gze+MY34plnnkGv18P8/Dx6vd517FL9eBwYCg2w4z/hwqAPiotZI2G6gNWcZooDwc8HfZTZ\nanCATIY+n1arZY5i+nmU5RF4+RzWodu4qP3b7TZqtRoqlYr5ulqtlv0oG6VfS31Y2l5qatZBE1EB\nYnl5GSsrK8jlcgZYPHx3fX3dXALAtiVAEOVY0CE/MjJiSmtrawsbGxuo1+vGkrjw2Cf6ixqNBtbW\n1rC6umpRXzWNCFR0LQwPD9urM5LJJEZGRmwbWzabRT6fRz6ftwWi7SKTXVlZwdLSktVJJsMgVKvV\nwtbWloEb382ey+WMBVGhANsBMwL81taWLdhqtYqlpSV7FzrZIZkNWWChUOgD1kqlYiCxubmJp59+\nGlevXrVDOVRhRVGEXC6Ho0ePmnnKqDxdOZQZKkuSk2azaeliiUTClC9ZHtcHZXVyctLWpVoBrIdy\nSbBnJPvgwYOYnp7G2tqayXqtVkO73ca5c+f6XolCWZ2fn8fq6iqazaa9sz2RSGB2dhbA9rkHzWYT\n6+vr1ke6gpLJpL0xYHFxEa1WC/V6HfV6HRcvXkS9XketVkMul8PVq1cxNzeH4eFhrK2t2fbcTCZz\nHel6uWVPhvnOd74TH/3oR/G+970PnU4HZ8+exW233YbHHnsMv/u7v4sTJ07gwQcfRDKZxJkzZ/DQ\nQw+h1+vh8ccfv64uAiB9KhQmLiT6kehkVjai6SZcOFqHslFlnpxwMhOCMgVOGYz6y/Q6HwhSENOo\nnppuyr64V1sj6grO9XrdzoUEYLmMnU7HJpvjxB/NpctkMsaehoeHce3aNWxtbaFUKqHVamF9fd3q\ny+fzxqLp06HSoaLh2JIF9no9e4EaI5PqEtET3NXvt7y8jCtXruCee+4xoC+VSmbq0WQia6fpyudP\nTU2h0+kYayRTpC+MLIvMqVgs2nFqVGTK7MmUa7UaNjY27IVqZLS5XA7r6+sGsgxWqVyMjY2h2+1i\ncXHRAhw0G9fX15HJZFCv101JJZNJrK6uWl8eeOABZLNZ/M//+T9x4cIFjI2NGYtstVrIZrOYmZnB\n8vIy5ubmkM1mTckVCgV0u13cc889OHLkiCmSXq+Ha9eu9blCpqamMDs7i2w2a0DJed/Y2MDk5CRq\ntZqRAcoMX3tcLpdRqVTMV0hFxzouXboEYPv96zSHaVVsbGyYL7PX2z51fnZ2FjMzM33MlMqj0+mY\nn3dmZgZLS0t98l2v1zE4OGgK4+jRo6YI1tbWcOjQISwsLODw4cNYW1vD0NAQ8vm8+ZJzuRyWlpbs\n5P5bKXsC5ujoKP77f//v133+l3/5l9d99sgjj+CRRx6JrYsApZFIzXkkkJLtAejL8tddBxoUAHZ2\nYqifSpmNArD6zRQUh4eHDXzq9bppdw1S0fyhSUuBo/8G6D8YVZNo1b/FhUzGS83O6y9duoRWq4Xl\n5WVjGATqQ4cO2S4Rjgn9dTzObWtrC8Vi0RYRsHNgAxUC+wHsWA+Dg4NYXl625xFo+QyyYJp6Cq70\nFzKglEgkMDMzg2w2i0wmY+4IJrKzTeor5Pwxwk4lyu84J8BO8IyBBwYv6LPkWDP5muPo/eNra2s4\nevQoKpUKEokEqtWqjQdN3oGBAUxMTBiT5AIeGxvDhQsXkM/nbSz4KmOCKoE8mdx+Z9HQ0BDuv/9+\nXLp0Cevr6307c5rNJl588UWMjo5iYmIC3//+9/uYWLfbxbFjx3DlyhXcdtttqFQq1r+xsTFUq1Vs\nbGxgbm4O09PT6PV6lpNYq9Xs+VQEIyMjmJycRLPZNHmtVCp2hmqv18P4+LjFKQhijEIPDAyYZbG4\nuGhKamNjA9VqFYcOHcL58+ct7YcgWqlUMD09bQDc6XQwOjpqTHFiYsICh61WCzMzMxZYYnDp0KFD\nZoqPjIzYeKdSKSwvL9uaW1hYMDaeTqd3B7w9SiK6VY76Mspv/uZv9jnVgZ0gAhcjwZTfWUNFywMw\ns5SLnEJBwGVUlT4mgpQPDnBRcoEzIk4wZNS31WqZgBB09bUPZL5kO2wbhZnCogEs9okMm6bkxYsX\n8fWvfx3dbhfT09OmoXO5HMrlMl566SUzjYCdxH+WyclJ9Ho93H777eby4GG+yq6ZXsTP2e5yuYzZ\n2VkzW7nDo9frIZfLodFo9EU8qczYz263i5deegmNRgO33347pqensb6+3he8AmBmf7fbtRQQ1tFq\ntTA5OWltyufzpgg0aFGv1zExMYFqtYq1tbW+hdXr9bC2tmYBD47N3NycveOcCzWKIszOzmJiYgKp\nVMpY1cjICNLpNFZWVox95XI5a2Or1UKpVML6+jrW1taQzWaxsrKCfD7fl4ZD5kVGSha8sLBgckhQ\n4qL/oR/6IVy8eBFHjx7FtWvXkM/n8dxzz2FkZARveMMbLGrNsrW1hampKSQSCWNp2WzWfPlUJIVC\nwXyaZOgXLlzA4cOHkclk7L3x6XTalGAmkzFFQoVH9lapVGy9UMHqzhoGx0ZGRlCr1YzFp1Ip80nS\nIlpZWbH6OYcrKysmz9/+9reRy+X6UpH4nMXFxT5LMJlMYmxsDJ1OByMjI0ZKzp49e9MYtu8HCHNB\njI6OIpVKmW+IARJm8ROY6KOjYxnYyQHTlCOaJ8zVYrSPAwfA2A99pwBMqKk9qe24JVOd2sxXI6Mk\nS6NrgK9j6Ha7lhtG1km2oukNuguB6RVs4x133GEpIkNDQzh06JClfhw/ftwAUHfqADuvF6UPlmYv\nBYsCpae3HD16FNVq1SLQZA/0F9LMbrfbqFQqFuCgT4vO/FarhX/4h3+wBfHmN78Zw8PD2NjYMCZc\nq9VQKBRsnOgDrNfrGB8ft4BHq9VCrVYDABsnjQiTyUxMTKBYLOLq1asGlul0GplMBrVarS9YSBeF\nnrfY6/Wwvr5ufWe/O52d9wvRl726uorx8XHMz89jbGzMtjsyG+HEiRPmaxsbG8PS0pIFP9PpNBqN\nhpnVVLQHDx5EOp3G+vo6Tpw4gdnZWZTLZSwsLCCbzeKuu+5Cs9nEyZMnUa1W8b73vc9cCpQrvv+d\n8r+2ttbH4MfHxxFFO4c5r66uolAoYH193fyRNOPr9Tpe97rX4Tvf+Q6q1aq5k06cOGHM884770Sx\nWMTFixfx0ksvIZvNmiIaHh7G6dOn8ZWvfAUzMzPIZDJoNBqo1WoYGRnB+Pg4er0elpaWMDY2ZoGa\n1dVVDAwMIJ/P29obHBw0kDtw4AAajQbe8IY34IUXXkC1WsXU1BSWl5eRzWYxODhoz2L0v1AoYH5+\n3urY2trC6dOnbwnDkp/4xCc+cUs1vIzyhS98wQIM1FzKKMmGGOjp9XomwPyOprSyUppeg4ODfX4R\najpNK9GUHgU5mrTUqplMBqOjo3YNF3273UaxWLS3L3oze3NzE/l83tpKk50LlyAaRZGBGU3aTCZj\ni298fNzalMvlMD4+bpp6dHTUEpOnpqYMjJRZj46O4sCBA6YI+ExgJ3LMiDZzJEdHR1GtVo110H+p\njJpOfLogaGaTbV26dAnJ5PabIUulko0B/VZkXjSRGTTgnAPbGRZsn+YBMu8ym82iUCgYK+90OigU\nClY3/YA0s1OpFCYnJy3NiTK1trZmCq1YLNquJFXQ6+vrJiMjIyM4deoU7rrrLjQaDSwuLgLYDpCM\njo5iZWXFfIgEfDL6Q4cOYXh42HyCGughAWCeaqVSwfHjx9FsNlGr1VAulxFF20n2BLter2d+SG6v\nvHz5sq2farVqMt5oNFAqlXDlyhUcO3YMi4uLlqpEUnHt2jUDU2YNlMtldDodHDt2DIODgyiVSra3\nnQr/0KFDuHTpUl+K1LVr10z+M5mMyRL99ZR1slaCPq0mWgi0Gg4dOmQ+yH/8x39EOp3G5OSkrT3F\nEHVFsR+5XA6lUgmZTAYrKyt48MEHbxrD9hUwn332WVsA9FESSOgDq9frfa/IpNNXo9Y06Rn5BWBm\nMUGAi5psRJke76UZQTBOJpOo1WoYGBiwXC8yAd7HvDWyKN133ev1UCwWbTECQD6fRy6Xs1yyjY0N\ni9QSQN/whjegWq0asDJyWygUcPjwYQNAsmEu3iNHjtiiJ2O84447TPiuXbvWl9R96tQp1Go1EzBq\n3tXVVSwvL1t09XWvex3m5uYM1AhmBJByuYynn34as7Oz+Lu/+zvMz8/j/PnzeOGFFzA0NIRjx44h\nl8uhXq+jVCrZ/mMqslwuh+XlZYt212o12+9O8B0fH8elS5dw+PBhC4aob5RnbarfkEnMGond2trC\n2tqaLdJqtWrMpVAoYGxsDMvLy2aKHjlypC/5njl+99xzD65evYpms4lKpWJuiZGREfMdUgkePHgQ\n1WoVExMTSCaTKJVKuHjxIpaXl81VQ8ChrBP86Ecngzx48CBqtZrJysjICObm5jA0NITp6WljbktL\nS7a2+PK1RCKBTCZjLJ4seXp62hTx8vIyEokEyuUyut0uCoUCKpWKuYq4xzudTptvleDd6XQwOztr\n5jZzsenKYQJ5rVbDysqKuV1okVGRc81Q7g8cOIBCoYByuWzBq3a7jc3NTdx99902h3S3MDB24sQJ\nTE9Po1qtGrFoNpumtBno+9H/uxHnZsq+AuYzzzxjYEdfH7UE/UOMfvZ623uM6SujH4IC0Gw2TQjI\nRhkIYT4Y8xIJGIwG0ym8ubmJdDqNqampvog5gUMDPADsfTg0w8mYCMoExEQigXw+j+npaYuWFgoF\nM4HJkqgsrl27Zr5XRpDpAjh37pw51smkOp0ODhw4gHw+j+XlZYyPj9si2drawuLioh0PtrW1hcOH\nD2Nubs5YMnPcBgcHLZp4/PhxAxL6FvP5PFZWVnDo0CFsbW3h4MGD+PznP49z586h1WphcXERH/jA\nB1Cv1/HmN78ZX/nKV/CBD3zAmGEikcDa2hoKhQKuXLmCI0eOIJ1O4/LlyyiVSqbQxsfH0e12sbKy\nYgwJALLZrPnhoijC1NSUbcFrNpsol8t9O0RarRbK5bKZuBwDyg6ZD+VgdHQUFy9etINCtra2LId1\nbGzM0mampqYM1HmmpR6cm8/n7ZkTExO2S4bMtFQqIZfLWfBic3MT9XrdErbVNZVMJi1KXigUcPXq\nVdx+++3I5/NGHMrlsoEEE97vuOMOM0N1VxXbQYZ36NAhzM7OYnJy0ggCXTaHDh0yHyL9ijMzM2aZ\ncO1RMQDbLiCy/WQyiUqlYi4OpoppJgTHi4qy3W5jdnYWyWQS165dM8W9urpqKUHMZiiXy3jxxRet\nTZyDarWKoaEhXLhwwdh0oVAwdxD97iRJb3vb224aw/YVMD//+c9bkiyd8GSEjHbRKU7fEZkhO8sU\nhFQqhXq9bv4bRvhSqZT5Z8jEaMowYliv1y2Ngb6d5eVlvPjii+ZwpuamX5MgDMBMceaJ0c/DRGPu\n/OAuBi4A+lfGxsbMZGC9q6urxqYYLRweHsbk5CRGR0ct97Hd3j4BZmhoCFevXjVQp3+OJgnNIIL0\n1NQUAJhA0+dFxaRBGzJJBlPK5TKazSa+8Y1v4K677jLGWSqVjOlsbGzgTW96k+0WYToJt70xsjsx\nMWHBH24VpKLJZDKYmZmxY84YsWWKD8Hr+9//PlKpFE6ePIlUKmXmHcedinVoaAjNZhNjY2OoVCp4\n29veZi8i47PvvfdeDAwMoFQq4ejRo8hmszhw4AA2NjawtraG8fFxrKysGFNiwIQsmHJaLpdtvvl2\nSG7mGBgYwJUrV4y90ddJNwAtrmKxaMq6VCoZk5udnTW///T0NAqFgjE/zgX9jZTXYrGIjY0Nk7OJ\niQmTX/pIueebLoFut4vJyUl0u12LATAXs1ar9e0gI8CzLvrUaQEcOHAAx44dQ7VaRb1eN5mnu6dY\nLGJ1dRWdTgczMzMAYGuXpzeplchNCbfddpuNEb9j9gLXHoNe6ienfGxsbOCBBx64aQzbV8D8m7/5\nG8sxBHb2KdPkot+oXq8b+JH5cRcRc9aWlpYs0kZgI2toNpsWuSQL4F5g+mwmJiaMzeqRWtls1s6H\n1HQgJtpyq9mhQ4cMcGi60BVAVkRXAFMsuHWtWq2iUChgcXERIyMjaDQaxjSYM8f9srqFjH4uaviV\nlRUzexkIoG/stttuw1//9V+b74apLgD6AKVUKmFkZAQXLlwwRt/pdIzVTU5OGoNOpVI4duwYUqkU\n7rzzTkxNTaFQKFjAhotra2sL09PTGB4exuzsLEZHR1EoFHDXXXdZ6gmtBjJvMi8GZLjrJZ1O48CB\nA7Y3e2xszKLIVKgMEnDsyYzpvx4dHcXrX/96PPfcc0ilUnYwBLfvUs7m5+dNWS8tLeHkyZPmZiFD\no2+PgK75tplMBtlsFnNzc7ZpI5vNIpfLWYYFg2i0gCYnJ83XR385FStlp1QqoVwuY3V11Q6eoNKO\noggTExN9SmZ4eBhLS0sm8wTW0dFR89NSjuhaaLVaWFtb60uFI6HQA2hWVlaQSqWM+NA3TWuOirhQ\nKFgeKK9lsItBKbaVz+S8624z+uX1vEsCOQDLYaZ8UoGQADAdjoHKwcFB3H///TeNYfsKmP/n//wf\nAwhqvmKxeN37q+kfYepAOp027UiTlYEa7jhJJBKWEsLDA5inx90aMzMzNiEEBpoF1OaFQsHyHPkZ\no5xkMIxyVyoVC9wMDAzg7rvvxsTEBIBt5ry0tGQR31wuh9e97nVIJBK4fPkyGo2GBU7YZqb7cNdJ\nFEXIZrNYXl62eiYmJjA6OoqZmRnzWw4ODmJxcRG5XM5yzs6fP4/Dhw/j5MmT2NjYwOrqKoCdg0To\nO1tfX8e1a9dw++232zyNjIxgbW0Nx44dw+zsrJk+3MfLhHqy6kKhgGKxiGQyiXw+j7e85S1oNBo4\nevSomY0MdlDQ6aMFtpUgmezU1BR+5Ed+BPV6Hevr68hms8ZSDx06ZP5fOvnT6bS9KZBZC8lkEuVy\n2SyJXq+HF154AcDOll0mww8MDFiUnwuUCf7MxaW/r9vt4tSpU2a1ECC5K42gxfooK3SBcB82zV7m\nLrJwkZPlEUi3trYsH5fgxkAcd7NQiXa7XcsSIIhzmzAVJgGFwUPKHceaY0Bg57gMDAzg8OHDJg9M\nHqcccq1q4IeuAc11ZvyCKVl0pxFA6c/kRgi6uAiW4+PjFrvg2iHg0petcYX19XUbm1sFzH3Nw/z4\nxz9umoOOcmpA+q6Y1U+twL2o1Pz1eh3Hjx/HwsJCnzl84sQJLC4uYnh4GJVKBeVyGeVyGVtbW5if\nn7eoW71ex5kzZ/D8889bAizNCjJfsrJKpWJ1MV2FW7PINnO5nPUD2F4kxWLREn/HxsbMV8SI7ejo\nKGq1Gt785jej0+lgbm7OTMlqtWp+xUwmY8+lucPdFzSbx8fHzWfJnRKrq6vI5XIW8VxfX0epVLKt\neTTdOJ75fN5Yy9GjRy0QAMAWB1k3wZk+Q7Ja+o+vXbuGe++9FydOnMAXv/hFAOjzv6XTaUtYphJg\nX5hAzX3nAMz1QODjzi76ogGYeab5tZQrPZ+g1+vhyJEjWFxc7LMaEokEVldXkclkUCqVjMknk9tn\nnHXrpAsAACAASURBVNLqWF9ft1039LsSUAn6tHAI6DSLKR8M7HD8OJfMTWWCdSqVMlcNmSbNXQas\nmH7H7AwfMGXAkqA1NTVlW265E4cEgoSlWCxa5J3J7gROEhkGMbkJheyTdZHx68HUHE/NsaZFSUZN\nhkkSwvGnJcmtq4zw6wYIuvlYB69lUj2zFzKZDH7t137tpjFs332YTJVhYmypVMLS0pJ9XiwWzQkO\n7ORc0vQmA6vX65iamjJtQiDmwiALZFI2I6oHDhxArVYz1koNViqVsLGxgaNHj9o+Z+42oQmwtrZm\nDmvdlgns7KWlH5Z+GAC20Ljtk22/evUqzp07Z2CwurpqAZZOp2PJ02QaBBW26ciRIwBg4E4TigIO\nwFgf0zzm5ubM9dDr9cx/yCAP2zcwMIByuWzuApqYly5dMl9wq9XC9PS0RWTJIEqlkvm1yHgI1gSO\nZrOJubk5HDx40OqjQqKZSzNbATeXyxmzoquAkft2u22sTt0vXExsM01OKhkCRSKRsETvbnf7bY+M\n2nM3CQNIBC/KqG52IIixfZr363NbaU7S6iHgMGDHzRokDXqaEevVgJGm9/A7pjPV63VzGzF1Tnff\nkFnSvGX9lBd1pdDVwWPbaC2RrWpaHeeTv5vNprkTyFw1r7nX61kgie6XTqdjoEsg59hTYVAxALB2\nkr0y1pFIJPDWt771pjFsXwHzqaeeskheIpEws7lcLptfjUnDTPxl/pruB11bW8Pk5CQuXbpkwn75\n8mVMTU2ZVqJvUn0jzPqnGcNgUz6fx9WrV203yuXLl/t8J9zBMTIygnK5bNFcCjQDLMlkEhMTExgb\nG8PFixct3aPX6yGTyWByctIOkWD0kn1mvtrs7KwFJAiI1MyZTAZzc3MWfWSkdWhoCOVy2YSX/smF\nhQXMzMygXq9jcXERk5OTfaYZmQsXLw894ELudrsYGxtDu93GysqKMdo3velNuPfee5HJZCx9hyBF\n01A3JNCEJHBxp8Ydd9yBK1euWBCBqSIEH2AbGK5du4bJyUnrV6FQMMAnyHGxkIkQuJiRQMUL9L+q\nhKks7XbbsggITjR/CbT0LzNwNzExYYnWwM5ed7I6+kbZbyp1Aotu1x0cHDTTVrfN0s3EeaGcML2N\nwRpud+R9jJCr35TjybxdAgpdI9oGAh8A6weBmwTGP59ASkZIBk3A4n28hwCp2St8BiP7ZKLq02Sg\nE9hm0XSvMF1KD13heHPOW60W3v72t980hu2rSf74449jdnbWBL/dbuPIkSOW9Eyhp4Czw0z74AQz\n6p3JZDA4OIiVlRXcc889WFxctK191WoVq6urmJiYMKper9dt0phaNDU1haWlJTsejNFApugwd6/Z\nbOLgwYNYXl7GXXfdhXPnzlkeWxRFKJVKZmrRbJuenkYymcTly5dRKBQsN5NpFjSRgG3mdurUKSST\nSSwuLhoYATCznKBG4dV94pVKBceOHbPoIJPu8/m8HculZhA1Nscwn8/bjgwyRLaTUVeauGtra7bD\nZmlpCc1m03yp9JnR9GNwgTmUAAxMmNSfTCZx4MABLC8vG9CxX5zzbDbbd54m2SZZLU1wghPBgoyW\nZhpBlaYd2852UKGRiTJNjDmjmotLtkaFSWCgSck+MLBC0537p8l+eS0VmTJWVRwMfNEUZQ4q08AI\nJuw//cqcC84Dl7zm9XLsmIZHsARgAUMCGK9RRcNINLDzCmCmIXFta/CG9WvSOX2b3Kig5wkQ8PW5\nvI8WB5/PrAP6mrUNGxsbt7Q1cl8B8xOf+ISxLTrJx8fH8d3vftdYZzqdNhZZrVYxPj6O2dlZAwce\n6c+tVOl02nxGyWQSuVwO58+ft7ra7bY5lil03/ve93Dy5El0u92+VAj+raYPHdBMrF9ZWTEwZ1oI\n05vobwLQB1b0/V27ds1YRS6Xsx0bqdT26wzOnz+PUqlkJ1rTdMlms5ZwTpDTbZXU6Jubm7Zvm6DN\nvckMtnEx5PN5C0CwPzRjomj75B8qGD6fCoRHnzGDgWYPAAMv+qJoFtK8000KZIg0uXj2IgDb7kZf\nlW5n5Kk6dOTTOuHcVatVO5BD9zMzWMT5ZbCIoML2cEET4CgHTNnh4iXgEDj5OYGQzIkLmMyVwKq+\nS17PYB+wc+IVt7Sqf5IgSHBl/TSbQ6BE1km5obLhPJKdE4A1WONjDQBMqRBICdrAzm4yyjuDtTo2\nvJ8ESq0AVXTcHUTLjCyWdTMLgAqQ7grdtMFxqdfrPzh7yUulElZXV7G4uIhCoWDJ50xw5uBw10Sh\nUMDly5ctMZgHUNTrdTPdisWibZ9i/l8ulzOB4CDzENtisYg777zT0hwymQwWFhYsCZ2mANNdmA5E\nc537jel0J4AxkMAId6VSsQWr5hjZHQE0lUphamrKjtdaWlrqi2ACsJw47gLi1i+yaJpcQ0NDmJub\nMwBg2g0XUC6Xs3zAKIqwuLhoYE/tz1y8+fl5E2ayD03up5+T4wzsnKBOYGb6DY9Eq9frBnr0UZJd\nqclF4AD6j+OjGc5UK/aNY8OdJQRw/s10E7p76CqgeUqWzzbxuQRrjbhSQZHlsy6CERUzgZxgxgXO\nueC1ZEy6uYLtoDWkzEsBkfUrgJMBaoBFd6QpILNPqrT4DC3KUDWwxsAhzWMCPO8BYH5ZmuJ8BseP\ngKztIhASVPlcZcjsK9tPS4TzxrbpuP5TlH1lmP/lv/wXSz5lAjlPXaZ5QSGhH2N8fBxXr14184sT\nwvw7YMcEYE4bhZjsbG5uDsD22X2rq6vm50un06hUKnb6DE145p4pe6Ivhgm3qVTK6iHdp5ZjIKJQ\nKJigkhGqhuVCIktm6g1NK/qauL2QwbB8Pm/tY2oWTUUKENkATXNGQtkfsm/6ovgZhUyj0axTtb36\n4Bhg4bUEVrIXfqcLhXNGk1BZjS54pnKRVdI/R1nQd8jQqqDpysVGS4T+NxYucAYOgJ0gI0GMrLRe\nr9t8UwmyLYlEwiwkArqyaV4P7LztkuOrTEgTyFVx5PP5PtAgc2V/1K9HMCUQsz6uE6b6cPz543M2\nNbeV8kryQZlR8AN2WCHljf+znWSjCmZUWpwzgrPWA8CeSYtAfaqMN/CZrJ/QxvFifx577LGbxrB9\nBcxHH30UwHbUmHlW+Xweq6uraDQamJqaQru9fZ5juVy2xUSTkBqEAsEE5GazaSyQTIoLj4NK3wkF\nlwcLbG1tGdjxtBcCHsFP89/4Pbd+8ZQbOrE1sKCRWeancYIB2MIEdl4Ixb6xMOqrviymTGgEkgyN\nAM4FwTqp4ZncDOwcejwwMGDvY2LOHrBzQj7ZJcGP9zN3Dtgxxfm/RsPJRNl+FXIAlvivB6FwwROs\nyfx1QTD3j8DAuSIj5RhzcVGBsPAlZbxewZ7mPf2u9JuyvYxqEySZnE1lq6lMavKTkXGOyc6AHSbn\nTWjOE9tH+eLcaRCFwK+gzD6REVPhUB75bKZJqWKhC43X++i2sj7+rayOwR5uUOGc8x7Kg64B1qWA\nx0L2rZF3jg/ljySBYE6lzvp//dd//XpwusGyryY5dxvQMV4ul22xTk9PW9CHG/wJUED/2/goDDT9\n6FfjAuMJKGqSqE+Nuw2YRsOFxrQXgjQFkaYeTdco2kloV78fJ4v5k7VazZgj2RMXDlNTyBopjAQ/\nCjuDPTxYgteRARB8KNSqVHQnytDQkPWLjEJBWrdUkk3xO7oeCGz8zAdO1DHPxa6pXpwLXXRcFGRs\n3BpLxz7nlM9Ws43siCBIYGBfCV7ePCaAsT1cVL597IsCO7Cz2OkK8WBL3yDHg3OndXCBsx20Fhik\nIFvSve8EM44blTK/p+nNQ4Ipv7QqdH4I2lxn7D/7QkWu4EQQpVIjKBE4WQfnB4DJPPtMkOP/7Aev\n5ViwqMtH62BbNNqvaWasRwFWx/tmy76fh8kINROqlQVx69bCwkLfYuKiITBysShzIBNSIeL3TD6m\nn4YROKaysA4KKVNiCCh0SHNiaUYzEAPssC2aFRqJ1YCCsgzdokZGA+y8soMmK4WEC4OCoAEEgjAZ\nItMpyIKAHU1NYfPCBMDmgm3UCDrHTuvT7XgsyhyoXJjORPBTQFcXgJrinE9lgIygM52LQMEFS/cH\nr+EYqc9QGRf7oYtSAy1UlupnU3NQI/Gsi23hPKmJrXPHuqhYON/qStBnKVvVdioIk50qoPBaApqu\nHbZHDU21cvg8/V59lToeHF9eS/PeM0cWdePoMzx7Zb1sk7oxqAx0bahbgvPDdXirBvW+AibBQYGN\n/pJud3ubXa/XM5ZDvxB3Faj/hJn7wI6vg75IzRsDdtIigB2fHEFKzRwAlvpDtwHNbWp4sjdOPs0N\n+gT5DGpt1WwEVe07zYZmsxk8Pp8RWHV2M4+PJinZNZkqgZpCwr3p9OOpEHJM6UclsLGeRCJhPkSa\nwvR9MmjGOrWfAPrcIOqG0GARhVqBh58pkDMTgGM+Ojp6XbCB7SAg8j4NIugc0Afp/YMEGV6rwMKF\nyTGmEiZTU4BU9qSATNAGdnxz6pPkb/7weoIeAUPrZfupIHSevaIhm+X9WgcLx0iJh7oY/HipnNNd\nwVQuXSssCp6sR5+vFoi6DtT01jWhVgxJkFcgKhc3W/YdMGmiMmKaz+dt8ZFZ8EVGZEocfO5a4BZK\npi3QfGS6i5pwQP/pQolEwg5cIFgMDAzYdjQKpB5moH5G3ZGgTIwmsgIjfX/AjjCqqaL+HI4Pf3Ph\nUMhZ1F/J/jAgpdFfspXBwUE7H5PbSHUhso165iIXB9vhc+VUeShA8Fr1eepi4IKmMCszU1bDBUjA\nVhcD51YLQVxZjCo1fTbngn3UuSCLpemuAKOArwub8865J/CrwtbxA3aYlfoh+Tn7yLqVXWo9VFD8\nnuyRpEQLZcMn76tyYN/VH897WXQs2QYCtAazlE3zGgU8VRjqy6Q8ce4onzremoqlFpvexzniOuDY\n+bm7mbKvgKkBDwKi+iw5qWpyczDUZ0ezkDttVDMTdLinF9geZJ7zqBPJvdCsj1sE+Vw+SzUqtRb7\nosJOrc1r2E8uTk2bYb9oUlLgOT4cA40ealEBUbOqXq+bT0+BRcFKfzNoxRw8DeSo/0sXqy5IXeD8\nrQEC1eoKEMpQeK8fZ12Iyqi4SNQ0VXNZ62ZfeY+ahzoPBGQFEWU5LApYyjjVRCdw6vZZzzC133ym\ngog3b3VcOLfqX1R3gwKDMkN1t/j1SAaq/lLWqdcp41TwUWtBn6tywet0HWo7VMF581uZttaj7Wf/\nVGkqodkXk7zb7eJjH/sYLly4gGQyiU9+8pNYX1/HBz/4QRw7dgwA8LM/+7P48R//cXzqU5/CU089\nhcHBQZw9exavf/3r++qi9tUIHcFCTQDtNP07BFJlGnr8G81PPdiVA8wTbjjwDKoQCDTXi+k4dL5z\nsbIeLlx1tnvh8OyQk8TJY7/IbnVygR0WykVHxqI+LRb1c3KM1CzWBU7znPOg7hGydBZ1onu2xrH2\nbJUCyznQaLAHTX5PkFFfm7I5Llq6Cdhnji/QrwwUDPlcz6YUfHQs9HPKgtajbMz733ScQww6BGBe\nfjz70e95L/uvriVVmiGQYpvV/Fe/IdejWj1UJB7MVKa0PTp3Xhmy6Pxw3HmNBsy8kmJdbKf6TznG\n2kbKLevTcflnB8wvf/nLAIBPf/rTeO655/DJT34Sb3/72/HzP//zePjhh+26F154AV/72tfwmc98\nBlevXsUjjzyCz372s/0PG9x5tzj9QHTes2M8BIOOWvrBdHEoO1C2yR0DBBjduQDsgByDBfycyct+\nkfO5BFQGNmgSqwMe6F9UBAL2t9PpWKRW/S0EezUjvQNck4PVN0UBJdCy/byfvkNVIDqOBDcFD97H\na/zCU/cD69QfzwzJtpUNqZlLsPOgFsrZ1Odx7AD0sQ7tP7/XXE8FJ7J+HQ/+TXnl+IWUAJ+p0WGV\nBb0m5FpQWVaTlrLjGayOocoHx9y7f7xLRMdd54ffcU3pXCu4s3ilre4dLd5896DG9aRmu7cSdF74\nLG/JKGPVPfShsbrVsidgPvDAA/jR//sOjPn5eYyPj+P555/HhQsX8KUvfQlHjx7F2bNn8fWvfx33\n3XcfEont05a73S5WV1ftlBstFGyl25wUMioOBBmTXzAKIolEwvZE6yAreyATo7+L/r04U4ILQ1OB\nOAHJ5M4p7LrYtR6dZPaXrE9zwhKJhCW3q4mi/VQhUiCm4OmCY9/VDFMWwUARBVwTqvks3q9AF2Ja\n+p36INk2ZQLsDy0GD8aMFnv2w+fo3FNZ+CCRgqler2xM26/Fs1MF3jjlwPHwRd0raqVwvhT8tGiw\nKG6RK8gqACqoK9h69koZ8WY2x0gDZ/75Cursu4K6+tqVKerYKkv1sqvyr3Xp7iOVJa+oud49y+Yz\n9y3oMzg4iEcffRRf/OIX8Xu/93tYWFjAe9/7Xpw+fRp/9Ed/hD/4gz+wLXssPI5MAVP9eKp5NNlY\nGQaLmkDKOrxfiL+90BFY1UxlHT7Cpk57f62CCX97Uw9An5CwqKb05hiBUUFHhZzPU1DgPbpgCDg6\nFlwAftGzTer74ndkiB4wOBb82wP8bvPifXl+IWnSuz5TAUwVpDIfr6T0upCvy7Mzfq4gxmeG2qL1\n8j4P8ioTlHm2LbRwQ/Liv/dt0Gu8stCxUWXsAcq7W7yS0n7oOOsa03Wr86NrXOXL+xL1GR6s2Q+t\nS+dDyQW/17YoaHpmfDPlhoM+Tz75JH7lV34FP/3TP41Pf/rT9o6Yd7zjHXjiiSfwYz/2Y3aGJbBz\nsrUWskLPRjzDU58m8xm9L4WBFw6Yz8tSmq8BEv5w8Gj++wH3Zp1fXApgvE8BXZ3UCia8XydOWSPH\ng9cruHrQ0y2WOr68RqOnbCsVk0YSff8019IzndBC1YXH/3V+Cdre5PWLTZkn54/XaNAnBPp8hsqJ\nAgWL97PpfHgXC/vH5/hnal8oAwqinv14V4vOLduhrhYdb08EOEYexJTpeZn37hjdEaUyoGMQYnIq\nlwpoagnqvOq1Oo7aPwVKbYuyQ/3OA6UnIB4YdR3eSrneNnHlc5/7HP7kT/4EAMz390u/9Ev41re+\nBQD46le/irvvvhtvfOMb8cwzz6DX62F+fh69Xu86c5zAR9OBE6eaip3XweZgEkg1PYa+LkZ4+R0n\niLlxjKhTGMlq6T/lM7gjQn1onmWpJtSgh17PbZe9Xq/P1FWQVVPGs04WNa11r7GyYvaFCdvqZuB3\nuuB4j1/Y/EyVmndZ8G9VViEXgLJP3dfLwuf5FBt9hmfV2hYNFnGRUlmqFaLj5f9WRQvgOrlSM5LX\nqMyxj94n6/vK5+lvvV5lnM/yClTnk33nXPu50fFJJpO2Y0gT5PWH887cXa1Xn8d2eKIChDMKPMkI\nBflILryS9WPk69dx83LFOdFr+Pc/O8N85zvfiY9+9KN43/veh06ng7Nnz2JmZgZPPPEEhoaGMD4+\njieeeALZbBZnzpzBQw89hF6vh8cff/y6ulQD0BRWzciBYPHsTjUbfYl6j15HLaSmY8jMUTNQ7/VC\n6+/z/VLTyws/r2GfVDC8qaHXe8AIlZBppYs85G/0gq6g6dmv/55t5firv4hjrv31dXk/l47hbsKs\nzI399QtM2YVnhn6xhZRTqL3+Hg8KqvD4naZz+bp00caNUQh0Q+3T6z0TDH3nwUuv51rRtnkl5sdZ\nSY3eo9fvVnQ81Rq4EVDbbQw9QHpQvZWyr4dv/Nqv/ZoJu0+5UFOCTSKY8fQian/eA+wsOu9H1Hpp\ngurEKjsC+im/ai5lNtpOBR2tUxcY8zJV+EIgrAzbMwYVcr2Wn6s5rwqF1+oY8CcOUNS8Crkw+J2m\n8MQtTs+iQwtJwS2Kor7oJvvDulV58JoQY6D7xfffL05+ry4YAH1sOLTQvEJgPZr7qHOiz1a5ilNs\n2mZto86L1ucBLk7xhD4LWQ9qKfh72SYlGT5Q5YFS2b8WPssreQW4UH267kMKfi8WH0UR/tt/+2/X\njcWNln1NXNcF7XP8gP59q7pIvKbgYNNc4Gf6WwdR95Z7oFNAUj9KiC2oqa8A6YWOfdV0Ib2Hfefi\npu9Hmarvgy4EL5x8Ps9l9IxFx98vSPYrDiR0fBQ8deHGLfiQsCuTCAF0KDrL//mdyom2mf8reOk8\nqVzp9WoSs14Nwqks6hyzr6pstT3af580r0qPfffKVGWW1+02jyGfpq9Pr9VnhgiCV5TeRaHzx/Hw\nSlrnQBWsr0tBOeSH9oRBFZ3KUxwIh8brZsq+AqZfcBp48NqORU1vHTT/t/qiKMAEAgUlFk6eCqtf\n9B6wfC6kFgUPgl4I2LSP+tszFj8unulpcjuv4Vj5wJO2Tfuvv1XoPQh4YCagsMS5LvyzeD/HfjcW\n48deATL0Ow7oQ6CtYBW3uLws+Gu1XR7QdEH7tmjqVNxzFVTiGCW/96wyBECcT99vYGetePnTa0Mg\nr8Dlx18VYNw8+PaF2qx9DBUvEyGZ1nbtJac3Ul4RwFTqD+xsjVLhYPFsTkuc2eI1sPr49F4u4JAW\n90m/vEcnVeuL+9v3n30OLSb/OyQoKmBx14bAI1Sfsjbt081o4tC4+AWjz/NaX0HGg6bOr69XrwsV\nnVevNEJ1hJQc7/f91br8356FhnzRCjqhZ8f1NQTioeeG2hnqr7Y/DtjiPgu1zyvD3Z4faoOva7d2\naxtC31G2QthyM2VfAVNNHuD6CCojdZ4FeGDlQGqakhc8nTDdI8vvVYi9L5IL15tA/D7EBjSlh9ex\n+EnyaUT+ev0/tEC0Xg+8HMdQUfYRSq/xc6N91b/VnPMLRsfIPzu0sLTtoTEOjUWIWfm/+Zvz6006\n/u39impxhEzruDHeS/GpcvZMMQ4UPINSufZjp+6tkF9PWb0HUw8qoXkJyYGWkPx6crCbXITGQ397\nAI67L86Hz3G41bKvgMn9wOp/8JOowONpPk1OZYVqEviB0t8+NcIvSO8T8wuShW0PJUfHMcIQa/Au\ngZCJrwtNF4YuAI5LIrFz8hDb6X1rcf3hd/ztA2JeYfgFqcAdYqf8zAfeQnMVMtO17QpUfsHrZ/pc\ntTiAsI8z5L7Qvqhy1P6E7vH9ixt7r4D8NbpG/Djowb1eocQpmhAJiRtD/9vf5+c6BKZeJhS4Qm3i\ntX48vDL0biQtcSxyt3teTnnFTHIPIroI9xIyfqegE3pWyI+k93pBCAmf3uMB2vtR99JoIUYWSqjV\nery/1AOnF/g4YNZ+aH/0cz/+Cm46d6Gx9kwnjs3oGITaHVokHig9KKmC8/3bbVH5+n1/QyAZmgPt\nk8qF3qcKbi925OVH/Yw6p17eQvX5Pvu++3kMrSVff5xyCjFKr+C8nPNH178Sqjgrxo9nqC9+Pf9T\nlH0FTADXCSIXle7UUUEIMRdlZHGDyTr5vy6o0PUsyj5Y9Lm7gbNe4xek/vZgFVpAIcahCyakcck8\n45zhfvErMOg1KrB+HEJgqj8h32wIzOOANzSvcaxNsx5C5pYfJyCstEJt8nOkzw3NSZxi598hOY5j\nddpGr1y1Tr8+dNxCQas4xRcn76F+aFHryMururSAMKv0RMCvmbh2eDdK6Dp+7t0ftwqc+34eppqT\n/Ewn2Au0ahmvofV/BeGQyRhF0XWmmH7nJzEUfND2hLRuaNeD/1H25YErbmLjwEW/D4GN9onXqytB\ngYd9ZvGKw0f2d1tkeo8qPx1D7YOOh/9Or/E+Nq8Qfd1+rnVstG7PwnV8vJxoPXElDkA9G/Nzo4tc\n2+Dbxc81M8QzOS0emPx83IgiixtPPttfc6NBljjWHaeAQmvFs01f5z9l2VfATCT6D8v17CR0PYVK\nmQ/QP0i8Vu8LCZ7f3RKaIP9bt4F5s0af6wWWPkQPrHr0mU8ZCi3sOCFVMFRfV0j4fLsVvP0C8u3Q\n54UYkX7vxz/Udu9rVoCL87mGFomfg1B/Q7Kh7Q8p1ZAiDC1E36e9TFlVstpPr8Q9UPs6/Bj7foXA\nws9x3NxoCQH1buATx853U+L8POQK8cqDxVtLnrlqnSFZvlUA3dedPq+V18pr5bXyg1xuPZPztfJa\nea28Vv5/Ul4DzNfKa+W18lq5wfIaYL5WXiuvldfKDZZ9Cfr0ej184hOfwIsvvojh4WH8xm/8Bo4e\nPbofj/5nLf/wD/+A3/md38Ff/MVf4NKlS/jIRz6CRCKBkydP4uMf/zgGBgb2fDHc/+ul3W7j7Nmz\nmJubQ6vVwoc+9CHcfvvtr7q+drvXv+wviqJXXT8BYGVlBT/5kz+JP//zP8fg4OCrso8A8G//7b+1\nQ8wPHTqEhx56CL/5m7+JZDKJ++67D7/0S7/08rEp2ofyhS98IXr00UejKIqib3zjG9EHP/jB/Xjs\nP2v50z/90+jf/Jt/E733ve+NoiiKfuEXfiH627/92yiKouixxx6L/uZv/iZ6/vnno5/7uZ+Ler1e\nNDc3F/3kT/7kK9nkmyp/9Vd/Ff3Gb/xGFEVRtLq6Gr31rW99Vfb1i1/8YvSRj3wkiqIo+tu//dvo\ngx/84Kuyn61WK/rFX/zF6J3vfGf0/e9//1XZxyiKos3Nzeg973lP32c/8RM/EV26dCnq9XrRf/gP\n/yF6/vnnXzY27YtJ/vWvfx3/6l/9KwDAvffei+eff34/HvvPWo4cOYLf//3ft/9feOEFvOUtbwEA\n3H///Xj22WdjXwz3g1Te9a534T//5/9s/yeTyVdlXx944AE88cQTAHZe9vdq7OeTTz6Jn/mZn8Hk\n5CSAV6/cfve738XGxgYefvhhvP/978ff/d3fodVq4ciRI0gkErjvvvvw1a9+9WVj074AZr1eRzab\ntf/1XTM/qOXBBx/sOwQ5kpwvvgDO95uf/yCVTCaDbDaLer2OX/7lX8aHP/zhV21f+bK/J554Ag8+\n+OCrrp//63/9L5TLZQMI4NUrtyMjI/jABz6AP/uzP8Ov//qv46Mf/SjS6bR9H9fXvbBpXwAzIsZT\negAAAd1JREFUm832vSCt1+v1gc2roWhScaPRQD6fv67foRfD/SCUq1ev4v3vfz/e85734N3vfver\nuq9PPvkkvvCFL+Cxxx6zVxADr45+fvazn8Wzzz6Ln/u5n8N3vvMdPProo33M8dXQR5bjx4/jJ37i\nJ5BIJHD8+HHkcjlUq1X7Pq6ve2HTvgDmG9/4Rjz99NMAgG9+85s4derUfjx2X8tdd92F5557DgDw\n9NNP48yZMzf0Yrj/18vy8jIefvhh/Oqv/ip+6qd+CsCrs6+hl/2dPn36VdXP//E//gf+8i//En/x\nF3+BO++8E08++STuv//+V1UfWf7qr/4K//W//lcAwMLCAjY2NjA6OorLly8jiiI888wz1teXg037\nQvPe8Y534Ctf+Qp+5md+BlEU4bd+67f247H7Wh599FE89thj+N3f/d3/r707tmEYBMIo/IM3wbXl\nBehZgIY9aOgtRkCek96SizQpIuXSRdb7NkCcXgU6hRCUUtKyLF8Xw/278zw159QYQ2MMSa/dTMdx\nPOqsn5b9rev6yDt999S5zTmrtaZSipxz6r3Le69aq67rUoxR+75r27af2sTXSAAw4uE6ABgRTAAw\nIpgAYEQwAcCIYAKAEcEEACOCCQBGBBMAjG7/Y28rWaa2TgAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "img = plt.imread('stinkbug.png')\n", "print('Dimensions of the array img:', img.shape)\n", "plt.imshow(img);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Simple 3d plotting with matplotlib" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that you must execute at least once in your session:" ] }, { "cell_type": "code", "execution_count": 74, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from mpl_toolkits.mplot3d import Axes3D" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "One this has been done, you can create 3d axes with the `projection='3d'` keyword to `add_subplot`:\n", "\n", " fig = plt.figure()\n", " fig.add_subplot(, projection='3d')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A simple surface plot:" ] }, { "cell_type": "code", "execution_count": 75, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from mpl_toolkits.mplot3d.axes3d import Axes3D\n", "from matplotlib import cm\n", "\n", "fig = plt.figure()\n", "ax = fig.add_subplot(1, 1, 1, projection='3d')\n", "X = np.arange(-5, 5, 0.25)\n", "Y = np.arange(-5, 5, 0.25)\n", "X, Y = np.meshgrid(X, Y)\n", "R = np.sqrt(X**2 + Y**2)\n", "Z = np.sin(R)\n", "surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.viridis,\n", " linewidth=0, antialiased=False)\n", "ax.set_zlim3d(-1.01, 1.01);" ] } ], "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.3" } }, "nbformat": 4, "nbformat_minor": 1 }