{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Exploring `.bag` Bathymetry Data Files\n", "\n", "An exploration of data and metadata in Bathymetric Attributed Grid (BAG) files." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "References:\n", "\n", "* BAG website: https://www.opennavsurf.org\n", "* Format Specification Document: http://www.opennavsurf.org/assets/papers/BAG_FSD_Release_1.5.1.pdf\n", "* A slightly dated, Python 2 based video lesson on accessing BAG files: https://www.youtube.com/watch?v=dEtC6bRcjvc" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Working environment for this notebook:\n", "\n", "* Python 3\n", "* `conda` packages:\n", "\n", " * `h5py` - Python interface to HDF5 format used by BAG\n", " * `lxml` - XML parser and manipulation library to access BAG metadata\n", " * `numpy` - for n-dimensional arrays\n", " * `matplotlib` - for plotting\n", " * `notebook` - Jupyter notebook\n", "\n", "\"Keep Calm and Conda Install\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If you are looking at this in the Salish Sea Tools docs at\n", "https://salishsea-meopar-tools.readthedocs.io/en/latest/bathymetry/ExploringBagFiles.html,\n", "you can find the source notebook that generated the page in the Salish Sea project\n", "[tools repo](https://github.com/SalishSeaCast/tools)\n", "at `tools/bathymetry/ExploringBagFiles.ipynb`\n", "or download the notebook by itself\n", "(instead of cloning the [tools repo](https://github.com/SalishSeaCast/tools) to get it)\n", "from\n", "https://nbviewer.org/github/SalishSeaCast/tools/blob/main/bathymetry/ExploringBagFiles.ipynb." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from io import BytesIO\n", "\n", "import h5py\n", "from lxml import etree\n", "import matplotlib.pyplot as plt\n", "import numpy as np" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": true }, "outputs": [], "source": [ "%matplotlib inline" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## BAG Dataset\n", "\n", "Load the BAG dataset and explore some of its basic attributes:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [], "source": [ "bag = h5py.File('/ocean/sallen/allen/research/MEOPAR/chs_bathy/092B.bag')" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "/\n", "/ocean/sallen/allen/research/MEOPAR/chs_bathy/092B.bag\n" ] } ], "source": [ "print(type(bag))\n", "print(bag.name)\n", "print(bag.filename)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "('BAG_root', )\n", "\n" ] } ], "source": [ "for item in bag.items():\n", " print(item)\n", "\n", "for value in bag.values():\n", " print(value)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[('elevation', ),\n", " ('metadata', ),\n", " ('tracking_list', ),\n", " ('uncertainty', )]" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "list(bag['BAG_root'].items())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The list above contains the 4 elements that the BAG specification tells us\n", "should be in the file:\n", "\n", "* `elevation` is the depths as negative 32-bit floats, with `1.0e6` as the \"no data\" value (land, typically)\n", "* `metadata` is the BAG metadata, a blob of XML\n", "* `tracking_list` is adjustments to the `elevation` data values made by a hydrographer\n", "* `uncertainty` is the vertical uncertainty in the `elevation` data values\n", "\n", "Note that under Python 3 the `h5py` library maked heavy use of `memoryview` objects\n", "which are iterators.\n", "The transformation to a `list` object above,\n", "or the use of a `for` loop above that collects the items from the `memoryview`.\n", "\n", "One odd thing to note is that the metadata is stored as a collection of 1-character strings\n", "which turn out to be single bytes in Python 3.\n", "We're going to have to do something about that...\n", "\n", "Peeling away the HDF5 group layer:" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "/BAG_root\n", "\n" ] }, { "data": { "text/plain": [ "[('elevation', ),\n", " ('metadata', ),\n", " ('tracking_list', ),\n", " ('uncertainty', )]" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "root = bag['BAG_root']\n", "print(root.name)\n", "print(root.parent)\n", "list(root.items())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## The `elevation` Element\n", "\n", "Pulling the `elevation` dataset out of the BAG,\n", "and the depths data out of the dataset:" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n" ] } ], "source": [ "elev_node = root['elevation']\n", "print(type(elev_node))" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n" ] } ], "source": [ "elev = elev_node.value\n", "print(type(elev))" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "-341.917 1e+06\n" ] } ], "source": [ "print(elev.min(), elev.max())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As noted above `1e+06` indicates no data at a point,\n", "typically meaning land.\n", "Let's replace those with NumPy `NaN`s so that we can work with the data more easily:" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "-341.917 4.2\n" ] } ], "source": [ "elev[elev > 9e5] = np.NAN\n", "print(np.nanmin(elev), np.nanmax(elev))" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAU4AAAD7CAYAAAAFI30bAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzsnXd4HNX5tu8zM1u1kla9WLLce8WFYgMiQDABE0LvoYaS\nAAGHmBpMgICJ4aOTAA7NkNDLj+AEAphqjDEY27h3S1bv2r4z5/vjzK5kY9xwgOB5rmu1u7OzZ0Zn\ndp993nLeV0gpceDAgQMHOw/t+z4BBw4cOPhfg0OcDhw4cLCLcIjTgQMHDnYRDnE6cODAwS7CIU4H\nDhw42EU4xOnAgQMHuwjj+zqwEMLJg3LgwMEPGlJKsa3t3xtxAtx4441MmzbtOznW3YcfTmzuXPJC\nIVqBuL298j//AWDOYYeRBVxcCNrBIIoBFxAB1sOHs+EL4NJt5L3enp+P1dREP8ACSoEGYBVQBJzZ\nA4xseLkBzBAUPv9PygcOpHffvjx32208c+21XAQccRaIQuBoIFvdPuk9nEby+RdHUkcRl/AghdQT\nwk8bQf7GuXiJsiran5poKRuf7UdyrQeW2+dfgbrK/ewxB0rwgwhEyM5rJeDuJINOAoQI0kKQdgJ0\n4CdCFm0ECOElgpcIGYTxEyKLDvyEyKWFTDrItDrI7IyhRSR6m0R02vMWtu+xH0eBDnubCdQBm2HV\n87AYmAkcjjKDRr3xBgcdeeS3v/B7GM+edx7mxo2YqGsN6rMkgYR9++1bb32rY0ybNu07+1780PF9\nzoUQ2+RM4Hsmzu8Sv33rLaYPHEjOypWEUd9bgE8OO4wooAMhIBYCbwJEDurL7gbKoD+waDvj60CN\nPW4xamItugga4BfD4IuN8K+jjqLo6qvpfdttTDjzTP5+3XXUSMmcV6HXaOjtBiYCCRjtXobl0RD5\nsJY+fMo4fESo5D3yWc1pPEMzueR6m2n25jL/zDB1oRIaZ5bBWsBjn5wHyLBP0J3A7YviciVwkcBL\nDBcJdCySaFjdPDgmGjomOhYaFgIw0YnjpYMASQwSmkFnVpyMQISMzDCusERLgBa257AVyAQaAa89\nMRLwA1lQdgi4FsGsJvDZ1+GHipNnzvy+T8HBDwB7DXECZE6cyMqVK+kF9ETxSg2KUwyUWvgkBPvO\nhYxyoBYoA9bBJhTv3CUEw557jvXvv0/D/fdjAv5DDoGaGqzly7GApfbxjtNgvYQZ1TA4CpNzIcul\nhGBo3TqklPQoK8Ps25cI0LB6NcFqCC2GjGKgETwZSWQQcmihgAY2UEE72dRRRAQfhdQTIMRGetJB\nAOG3cHui6h+UKObW7X9QA4RA6Ba6YaKJFBlKBCklrX5lJSAR6efqldQW9ap6l0YCFwJJQiSIGwbC\nm0QzwJD2/nEgiSJN7POQ9k0DX2/IbwDf/wBxOnAA3zNxVlZWfqfHu2TmTG79298A9Y8PQJnUoFSi\nDozUwVsKfAC0ALlAM7yP4tAI8PlJJ9HdYD/3hRd4++mnWXvZZVj2PgJYbinL1ARWNMHPotA3CLka\nJJ59lsSTT+J2u7nykUcY0L8/b1dUsHKVyYZVcGwVitFPUifXf+JaCsvqGBZfRqMnh+UMIoKPccyn\ngvWUUkUHWSwMj6Ypkgf7AKOBFSgTORfwSQiAOxAmkNGJlyheoriI24rTRMdEs/V4SnmaX4shSnQs\ndNtYVfSrExdupFuQcMUxrCRuTwK3T2L4UL9KAfvtlv08x574bAgMgLOehMwaaGnZ3Sv848B3/b34\nIeOHOhffa1T9+5gU36RJbMjI4H2UGPtVAH7bG44aCMeNhrxLQD8ZOAua8iD6HMgQXFkJNe4txxIo\n9Qhw4qWXMlVK+t59txJ2wDoUMQdQLkatBmQDnLsv7N8TPnnzTdauWkVlZSWlPXoQO+IIOvr3px1o\n70BJr/UgNoBvdYysFSFKWuvp0VpLEXXk0kwLOcpUt1ootTYzjCX0FutAt0CTEJSQhTKLvYBhYRgm\nurBskrTQkIhuylPYzyFlVX+zrwdIvx9735Q7XQJSQ/1KGfbxPfakeVDyMgAUAMVwxAgoyFbv27Rg\nwS5d1x8Tfqhk8X3ghzoXe5WpDnDl7NlM79+f+OrVzAOKO6FCh41t0C8b3JNRPycW5J0GPID6kh8E\n+nzQujktUwS5NeIo16iOUp86iiPSzlUPuFxQM3kym6+9lj633grA+f/8JzWbN1NfXc2b+40nQ4ND\nXeAeAIHVMQKJGOwDuf3a6LnPZpKawQdF41nOILJjnfSObeQO/Rrqs/M42v1PahMlxDI9yKRASg3h\nMnF54/j8EVwkCNCJhxgeYrafM572dXb3aYLya24P6j0mwlajmmWhW5ItcifseUXvmhTpgfgAcG0G\nrTf0r4ST/wo8dwNcf/1OXlUHDr5b7JV5nFNXreI6Kck47zxeO+oonkj4iQHtSZRMXAN8iWLAK4Dj\ngE1w8QA4tVwJJo2u++446fLLkdnZBFHWcRDbbAceb4H/tILVCIOzoCgDfH/+E++99hprVq4EoKS0\nlJHjxtHSbwANSWhphlgV0Ixi4SoQm8DTmMTfEaUoXkehrKdFy6FRyycr1klJtJ4yz0byvfW4/VFc\ngRiGL47hSWC4E2iahZZWm1vfzLS/U2yhNb+eTSC3eCy2scc2ILd6rIPpEySDKOXZC0oGQUkZzH/r\nDea/9cbOjOrAwXcK8X2VlRNCyB9KSbvpffrgW7eOMcCEySizNojKJSpFseN6CP8FDAl/bYOwpdxz\nEeCkpiZyc3PT490eDNKnrY2+KB5ejeKIVPrK7wcoxUkcFjXDl03guv56Trn55vQYtTU1NGzezNKx\nY8kERmVAhgeyR9rndziQD9ZAsLIEX/YdRINWQGGigQxCvOU+jGUM5kM5kXYySVhuTHQMLYkhkniJ\nkkGIDEJ4iOKz043cxPETTvs/1fZQt/sofjrxEcNDxL6P4iaBmxgGSXxEMBJJ3PEkRgKMVHAohlLc\n3S+7G5JBQcjnxhuO4WoCrdae2GeAWljaayzWufczbOy+e/KyO3CwXQghvjGPc69UnFtj6tq1WJMn\nM9/vZ8NqiC0DqlFf9BhqlsrBvx+4+sB5OTA5AKN1KBcw/9//ZsVXX20xpkBx72jgRGAsKipvAM+v\nhLe/UoJ2aDbk66DfeguPC8HqFSsAKC4pYfiYMXQMHEgbUBOG2lZINKOCVg1AI2jNoDdL8kPN5JuN\ntLqzaXYHyaeRCjaQK5rJFm349DBePYpbqBSkVDQ9da7aFiozZaZvHXHfBXTzc6afbxmkV48l6HGJ\nnrSIew0iWS4VNCoBBgPFMKTlMxoXvMmnb7/Op++9zuLPP97183HgYA/CUZzd8GCvXrg2bOBYHxRU\nAIcCvVE5iC5gNtAEG94HnwYBFyxJwMI4uC+7jLPvuQdQirN/Wxvj6eKJlcBCVDC5xN422Q2+InDn\nwOfL1FieG27g1D/+MX1Oz06bRvymm0ig3IIZGug6jCuEsmzgBKAAZAVYObBw4mBaCQLgJ8wcKtlA\nBY3kU0MJMTxpIjRIYmCSSTt+IvgIp5VlSnGq5PcYPiK2Ao3aSjOKv5tCdZNAJ4ELpWYNK4k7HsdI\nSNxxwASRoCuiTrfJMUC6IZSlEXV7sUyD7FAYT1sS6oF/ofLBooAHOgmw8ZJ3GLLPuD127R042Brb\nU5x7XXBoe7hk/XruFYJFETi0CHgHZar/BBX9PQnYDBUeoAXavlJ8mgDia9eSSCRwuVxYqIC4SyiL\ns1mqYBEoDk4l3P8jDu5N4NkEk3srVfrSrTfzxM030+vVVwE4edo05I038tdf/AIdCC9fjmvFCqoa\nIRmC3JWQ1QbCD5oJOaFWNK9FrV4MQAk1aaKM4qWFnHSakW7bzVY6Jt7FZalszlTeZlf+Zuq1LT2h\nW3pF7XshkEJiCdC6q82UndPtd1NY4E5YWFqCkMcgmRR4XCj12Qslz1vVvoFEJ/Wf/ZtkMo7QBOHW\nRvqPnkBuXt5OXmkHDr4dHMW5Fe4VgiRwZW9UKDwPOBC1XLECxYBzUfmRS+HLNpjXoAjyly0tBINB\npgWD9G5r4xDU9tl0Ca0BwEBgMzAPlSmUAwwLwKgsWNgES2LKFagDZ2w1R8/ccAOxW24hbI9XYIDf\ngInDlUq2JoPMh6UTB7A5qwgNiyJZR2aigxfdx7GRXqylF7F0NjoILDzECdKKnwiZtOMmgZ9QWlF6\niONL34fwkLB9o1HcRPF083G6iav7ZBzNtPBELTQT9ARdPs7U6iF1AqCBdIHUIe4WmC6BZklcUYkR\nsycyZk9cG/A5dMYCyKQgM9HBBq0fUU8A68yZDB6xzx76NDjYm7E9xekQ5zZwe8+e5G3aRCfQsyf8\n/EQwoiizMeW4jAEPw+o2mF8DbqlWIqWWcuYB+9u7vYPiCffPf47QdSpefZWAabLa3j9s7+8CjimB\nYDZsCMP6OojGoF7T2H/pUvoNHJg+x9nPPMOaF19E++or3CtWML4YCgqh5GigFGoPzqc+P5fW4iyk\nFOzb/hnvikOo8xfwrlFJCznEbR0skBiYZNOKnzABOm3zPIyHmE2cylzfmji9RNNE6SOCQRIPcXSS\nuMw4umnhjpnoJmhJEKZSl6RuKWiADtKApAuSBpguDS2hYSQthJTK3K+TEAJ9EYh2e4IlyuebgDlj\nb8HbYwgA/mAhI8ZO2LMfDgd7DRzi3EXc3rMnYtMmkqgUzosvhYwo8E9UKH0IMNR+HoLnFkGJBZ9J\nZYYLVGbNvig+eBe1/ZJwGJ/Px91+P95IBC9KVTaghGwAGJUHowpQhBCCxfWKX5befDOnbiOvcdY1\n1xC5/XYCandGB6DED6VHgiyE2JEuPqwcR0cim2M/mY3MgM2uEt4acRAfMpEWctJjmegE6LSVZ5gA\nHfjs6LtSlrEtiDP1XBFnAh9RNEy8RNGw8BBDN02MpAlS4o5JNFPl5WPC1+pjmUp1Jt1gapB0ayRc\nLiKaj6TUAYEllZ2fiLswTJPCRD1GUuJZIdUPW6M9Vgt0JDKpXdeLmvIJHHTjQ9/iE+Fgb4RDnLuJ\nW8vK0KqryUcR30+yIdcFgYhaEeP6FRgJcNUCGbDyS1hbAwtqVADoIBSJzkbxYIo4Hzz9dMx4HAlk\nvPACJajvu4kStFnA+FLI9MCaOtgchvJS2NAGK445lb7HH0/FsGFpBRqPx3nq9NOJmyblL79MvoCh\nEyEzHxgPy37em5WD+zFm0WLKOmpJhHQW9BnBO/0OZjX96CATiUYcAy9RcmglQGc6aPR14gzbhNlF\nnLqtODVMRZgp4rRMjGQSJLhjFsICzVKkKaytJtwEbMVpapD0aCQMg7CWQQKX7YvVkQgSGOhY5CWb\nMJImWVUxRAuIjSh/aJ096Z/CiqxRFN75NjndUsYcONgRHOLcTaxeuZL5//gH4sYb01XRegEj7McZ\nQMaJkHUkKkHdgqUfwiuvKevxVJSSfBdoB861ibM7ptulqw5GmepNqDTNogD0z4IPamC5hPN7gPTB\nX1ar/YJ/+hMnXnPNFmNFIhGe8PuRwCG5MCATmusgbwDEi1103JnB3D7j6Ne2msGz1hGWXjonZDB7\nwk+YzZEk7AWkBkmyaSOPJptAO2wzPdaNQNXNRRxP2lSPpolTw8RFEk1aGCTQLQsjkQRAT9qhJJs8\nU8rTshcnSQGWLki6DUxNIyz8JHDZKfsqnim6JeprWGSZHXgSCTI2JFVZu9XYkTl1XTbKPqzPPJyD\nLvrL7n8gHOxVcPI4dxP9Bgwgo7SUetT3z4PyY1YJcPshWAjeemA4yH2BBhgyFDweRW4rgVA5jOgB\nZVnwgN/PY1dfvcUxxr78Mr6TTmIR6rve2ws9gOZOmL8ZCrzQW4flDdC8FvoChUDs2muZKQSPnX46\nb7/0EgA+n49es2bBcccxpxme2ABVUdhYDa4lCbI/7SB7STuNeXnUD8jFXx2l8KsmBi5eTS/Wp32V\nQJoa47jTa4yAboswuyLoqQh7KuvTsqsmSTQsoSGFfa9pWJqGpSnFbuqKLLvfq8cCSxNYYut4Punj\npI6rUkEFcd1FzHAhfaignh/qjWKa/PmQBT09a/HHN+zRz4eDvReO4twBWltb+evAgcj6+nTxWj8w\nyg+HDkTlEJ0NMhd4CUQT/OU+MBMqGF94EBTnwPyV8M4yKJg6lXNvv/1rx/mzEOioCkx9UcqzN5Dt\ngoAbMCDcAXWWElKbUJZoK2D6fPw6HE6PFQqFeDIQIKVtXcBJ2eDaB6iAtvwAiVst1tb3Y/ziRVhv\nQ2gfP6+ddgQLGWVnaaoszgxCFFFHDi1k0o6X2Bb5nS4SeOxoulrrrvI4QeJJJ9qrhHpDqgROwzTZ\nLoTAFIKk5sJCI4qHVEmSOJ50er5A4iJJKm1Klyb5iSbciSS+WpNQSwBtpYU/Eebjkr/Ta8gESsvK\nd/kz4GDvxLfK4xRCeFBV1eyvLy9IKW8SQuQAz6KSdNYDJ0kp2+z3XAOci1pod7mU8s098Y98HwgG\ng0ytqwPg1pIStNpaosAnYchdD8WtULIPiN7QdpUL98cWF31kUlUHBUPBVQFkwjgBC4efSI+RI7d5\nnKvsH5EHR4ygZfFiClCTGk6oNJ6flYEvGxrqoSmq3HgeIGPkSBIDBjBTCCIeD0csXEj/QYO4uNuP\n0l9POIGnX3yRwLtq6aYY2Yn2rEAzwtAB1hDIbA0zYPEaQsMz2EAFOiYJXITx00kAHxF8RDBJdqNC\nVeZky8cCEw0NK60MRUqtCvte2/EPphSplfNq3FTtzyQGFhoJDARgdVsFZQqdTiMDj4jj8XUSMDv5\nPHkYUTOf0n5jHNJ0sMewU4pTCOGXUoaFEDrwEXAZcDzQJKW8QwgxFciRUl4thBgCPA2MQwmo/wD9\nt5aX/yuKszvWr12LaZr8Y//9oakJgDGjYNLBwGAInSkwkuAZJ6FdKUTjMHBfALwLkZu/7uPcGk/f\ncgt1N9xAb1TEfThKMRZmgcuApRKWtSgfqwvw3n47R1x+OX/3+dgADP7znzn5d7/bYsy2tjZeDgaJ\n0FXPuBQY4oKKAyH0oiDjMYlcA4k+Bk0Tc3lt/BGsZACtBNlMCXk0M4AV5NFMFu14ieJPB43itk8z\nYfs6lY/T6EZqetqAt9LugB3BxCCOQQQ/EoGJThN5JHARImOLRH4VmLJwkcBNnPhH11NeOpriknK8\nXu8OjuTAwdexx4JDQgg/Sn1eDDwFHCylrBNCFANzpJSDhBBXA1JKOd1+z2xgmpRy3lZj/c8R59a4\ntbAQvaGBScOgKBtKroBIPxfRUi/mfA3eBWsi5Afb0D4C3oHHx07l7G2Y6ltj5siReBYtojfKNVCu\ng9uAjCBoXljcBg26KpCMvU8AtYw9jnIpbKs/EsBjZ5yhqCsWw/XCC1R4YPgxkB8HRkOswsXc8WP5\ncMj+WGispxct5NCTDfRkEzk04yeCnxBeu8iHbifR63YrDkWQWxKnno6L78BUt2Gik8AgRAATnSQG\njeQTx00HmelKogKJl2i6ELNZ72F46G769B6wU8dx4GBb+NZLLoUQGrAA5X57QEo5XwhRJKWsA5BS\n1gohCu3de6DW1qRQbW/70eHMTz9lzuOP8++bbmJMBZTMAV84werh5YR/5kf8TEV882a1q3WXOye0\nAAgcfzyJRYtoo6vLBIAVA13CiJ6Q9MCyJqUg21HV5otQarRx28MCcM6sWQA0NTbyfy+8wLoY+J+H\n/N7AgeD5KEFl/VzWDyknn0ZO4AU+YCLvcCjVlDGO+eTRhASSts5M+TklLhJ2jyIgTZwWJklbcQo7\nlWhHxUOS6MTtNPsQGUTxUkcRMTx0kAmo6vQxPIQI4F/i5vTMM/B4vJT0Lt35yXbgYBexU1F1KaUl\npRyNMr3HCyGG8vUCjf/b8nE30LNXL86aNo1kXh6mBN4CboLhj61l0Nz1zJfjmMv+WLU6oTVQuxgS\nX33FGzZxbQ/5I0bQfuaZVI0YwWrgSwnrTYhEob0drAYwGuCEXDgwA0o15YSupYs07xKCh4Tgzeee\n2+YxJCrdEeBT4Jl18NnvYGMCCMEvn3qOw+a+S8EXzQyLL6WEGpIY1FNIGJUiFMNj02T3lm47vn1T\nNdDur5v2mKqek4skBnFcxHGTtEuUNJNLI/l4FgQpa+xNr4o+lBQ7pOngv4tdKvIhpWwXQswBJgF1\nKdVpm+r19m7VQHcvfJm97Wvo3vazsrLyB1smf0c4c8EC3n/8MR649SZGZsLE1yC7o5PyfatYKgbz\nu8tuZUrNVNa+Atmvv87q11+HM87Y7piHHnsshx57LP+YNo3IokWssWC9BT3snyczpgpnFGdAURY0\nbYaNcVVEpGOrsb668EJ+etJJ33isFpRKzUQVXN7wHPQ8WXX69C6QeDLaCfb5nK/cQ6ihlLX0IYdW\nfESJIBBYJDHspZtKVqd8mal8TjDSrTpSSlPvJsFTie2p7RZ6uuJnO1mEyEjXqg/jp4NMQmSwiBGY\naNyklzCxcuxOXzMHDrbGnDlzmDNnzk7tu0MfpxAiH0hIKduEED7g38DtqJztZinl9G8IDu2LMtHf\n4kcSHNoRbs3NhZYWpkwCr4CWJ/zMyT6Y19xH0yNWw09i7zFs3w9oWQ4fXX015952206NK6XkkdGj\nyf3yS3yoFKRDPSpVyZuN+vmLgqXBB22wMqz8nCYqZSn74ou58MEHv3H8+045hcizzyJQkfoAKsl/\n9Bkqgd4IQ04ZNF6ZRWNeHs/2PYGPmEABDfRmHQNYgYc4WbTjIoGPCDrmVsRJmjgB2++ptst02Eiz\nH5lINKI2STaTmybONrKJ4qWJPFrJZilqXfqkOVHGZZZy6Jj9dvm6OXCwLXzbBPgS4F0hxEJUQZ9/\nSynfAKYDhwshVqAqV94OIKVcCjyH6pL7BnDJj44hvwG//PJLevzhDzzyHnzwCeQ0hckKdxKgk489\n+3Fv1sVEJ6iWxLsCIQS+Y45JtzJuBxqSkEgAqcIZOugCKvNUaniqoWQCtkuaAKfcdx8GpLsKmSgF\nmjwc1r4Fm74AXJD/dDuD5q5jHz4nh1YaKaCFHGL4iOEmjsc2qV2Y6DYZKnM7mq7w6SGG2zbzVVao\n8mOq7VE86RSoZvJoJpcWcmglm3YyieAlgUE7WTRSQAIXGhYvVOZz/ZAok6teYcpH23ZNOHCwp+Ak\nwO9B3Jqbi97SwhXF4LF/kj5+ZxxvDTyEVzmGOG6mv34RfZ77HO/rsDoERR9/xogxY3ZqfMuyuH/M\nGIyFC8lDmdYTs1RZOcNNuqJ6LAYfRGFxxCbDYJDLttNzt6Ojg6d++1s6/va3dCU9N4qkN6Dqmox1\nQ+/DgAJI5Ots/Gkp//lpJZsop5MAeTRRymb8hMmkA4MkXiLodopQl6ZMNXQz01Xnt+yxqbYmcNNG\nNhF8tBIkgpckLlrIIYyPjVTYZJqNhyidZGKh4yJO4ZpOHs46gMKCgt24ig4cKDhLLr8juFGrfYxx\nqJpyB0BWQTsVrMcgQRw3+k8z6f0Q9NLhsAB8bi+X3Blomkbw6KOVGkTlcTZGIB6jq0SbBR4XHJbT\n1V1zR8k/mZmZXDJzZvp5hz3cepQXoBVYHUd5ql3gWmHS955NVLCR/qyihlIaySNi15GPp1Wlh6Qd\n1DHtzE51c3Xro6mRxIWFgUwHglIF65SSVSZ6kDayWcFAvmIYYXz2SAlAkE0bPsK0kMOSvr3ZL9LM\nWe++s9Nz68DBrsBRnHsQ03JzyWpp4TeDwe1GMdsFwAFwzrAHmMd+nMw/GMYSjrtvNuId+Nu7UNMG\n1+3kXCxasIA1CxZQc+GF6MA+qIpKBS4IBJTylBbEo1DdAcuAGr+fknvvRfd4mNQtKPXazJlogOH1\nMun006mvq+MfxcV4UMSccdVVnH3HHdwnBAYqypcBDCsDfxAC+bDxhBLW/boHixnBEoaRRxM9qMZH\nhACdtgEf+1qwKBUkSuVhAnaupk4T+VhodBIgipcOMtP+zgWMIYqXLNoBaCU7vZ49jotWgiry31FI\nv7Wbeau01FGeDnYLTuuM7xBR4LFVMLQHTOwN5t9BXwEld9aQQSebKSVIq7J/gzCwSBHnzuLzV16h\n+pZbyERdvA2oQFCuBfE4GD7AArdLqc1yoDkcpuH884nk5GwRzV9//vn4gFhhIZx+enq7hVLPZ99x\nB4AdE1epTgAZVVBSC4GDoOcnNfh+rep2/ptJWGhk04ZE4CKZJjWDRLogh1qEqUx2Ey2d86nWGhnp\n+0S6DpNKs28lyEbK09F7DStdiCSC3z53O9Xe0llWXsGa6o0OcTrY43AU538Jz959N6uvuIIp+4B3\nHEz9y40sZDRlbKI36znr2jtZextw47VUTrv1G8e5Y+xYEgsWqKpAuk7F9dcTqakhOX8+fPFFqnA6\nAOM02KcQVXjEgnlvqGpOflTnj40CeuaC3g/0JvjULlHnBbssh0IRKoB1mX19qquqeL+8nDBdXS+8\nwIRMKBwLmUlgAqya0pPXM3/GAs8+ZNNGGVX4CZNNq224x9Bt8zrl80x5Nk10u1Wcjw6yaCFI0s4T\nXUNfWgmmK9YD6VVDYfzp9esWGi3kkLRcdIQCSCnw+GJomsVvPljC/hk5TBrntBh2sHNwfJzfAwxU\nkMUTAd6An/+/NzicN3ETVzu8qO42Jb5hABsFRx+dbgppmSbC5eKiv/6V7COPREOpwVQXioWpBwcC\nP1VmdT7QE1VtKaBBZTkceCIcsJ+6+KmUpVTlJ90+762R6oFkZz7RAXzWAU2tKMk7G/pXbWRkeAkN\nFFJLMR1k0UHA9n16ieO2V7OrFeVJDBJ2QrvqnZlB2F7MWU0ZLeQSJoNFjCSGp1vnzZjtTY3gIpEm\nY7VmSSOJTvffZIHkocrBPCq2znB14GD34CjO/zLeu/cuDr51CivrVaJ5rTycTfTkGDGTGNB/B3Pw\nxLRpVN10E166Gr4JwHfssZQddhg1v/kNMZQCFChym3QAvP2xItVRQIYftHyIeMCvwaDDIfEMLI3A\nwoh6Xww4pa2N56ZOTQXnOf+hLdtNNDc38+p11xH5iyoGnCqdMRDVJ0lrA3cltP9tKJ8W7MP7gYMI\n0IlEdOseD6n4AAAgAElEQVRfpAhPIPETJolBJ4H0+vNG8lnOQNwkkGh4iZBFOzHcmOhoSFv1pirB\nu9K+UQudtZE+RJI+LEtDCInbE0fTLfxGGBcJzp+zkvEZRRw+bv9vfW0d/LjhVID/HhGJRAh1drLo\nsQc48MmbmPf/xvPe4RM4YIrJ8KuvJ38H/renpk2j/qab7KqTStzp3V43UASZi6rTmYlSmDX28+5O\n7AvOUBusHOh8EJ6OpWv+UkuXab4jTLdrh5ooVRtAkWgZ0AlMegmWjuvLrLLTsBAsYiRuYkTwE6SZ\noB3YyaSDGG6ayLdzM7PtcnHqPCL4cRMlSFs6Kp/AlTbtU2lL0i4dYiFY3jaQsOlH1y2EkLjcCTTN\nwu9WPeCDtDBmfi2Pjjt+p/5XB3svHOL8AeC5GTOoveoq9rlrPG9fUcn+12j8dFdWDl16KRbQPm8e\n8rPPcKGaswVQ5GWiVip0ogi2HdDcbjwXXICMxbAefRRLhwljYdhIwIIPP4OkBqs/VySbKC7mypod\np+c/8pvfEHv7bVzLl6Pbx0up1HxgUga4fgqb7ujByuK+VAdKqKOYFQyggUIEkjA+qtf1piWYhTcn\nRCZqoUDK/5nAlTbDu6opqSPJdPX51FZBHDcWGqs6+xNO+tF0E6FJDJeJEBKPEcUt4vRkIwFCTJoT\nYnhGBYeOO3CnroGDvQ+Oj/MHAFVJCLI6OihnI/ouzLwQgl/dfz8X3X8/RZMmAUpZploL90OZ8P1Q\n/slcVFRceL2ce//9nDBjBgAxEz6Yh7LL22DioVA5SX0IEvaYO4ML7r8f//jxqudSt/8PlDsikQQ5\nD3p/UU1FyybKqaaEGoawjFI2k0Mr5VQxvvfH5ASa7PVDEdx25N3EsOtvGumamykYdjqT3q0MiOjW\nZ1jXTQxX103XLTQt1chD2n8Fn1bGeUsu2/mL4MBBNziK8zvGhpt7sOaGCsT1B3PILTunOLtjzj//\nycrZswk98ABeVA5nD5TJXYhSofNQSrQOpSQHPPwwP7/gAiKRCM9OnYqMRxn3wSNo5TDkIPjkDWA1\nfGmXSiq87z4VOQ8EOOrss792Di/cfz91Tz2F9emnCFRkvlv+PW77XPr2hvIxkN0Laobms/rsnjSR\nTz2FdJDJcgbRQSb1FKbXuGtYmHaBj3ay0hWSXCTSOaACSdJ2Qhh2ylMTecRx0xAtIGkZSClASALe\nMJpm2rWUkhRSTxbt9KCKUmoYPSeATxQxfuhk8vOdtCUHXXBM9R8QFs4Yyrzf7UPJNWUcs5Om+tZI\nJpM86HKln++DXSXevk/1cU/FkEUwyBXdllw2NzfzYl4ehh/OuQ61tvJ5eMguNa3b7xdlZVy6adPX\njj9dCDIglR9Aof04hlLV3eutH/oT6OMFDNjwqlrbXkUZMdx8yEG0k0knmcTwAFJ1xEQStVcLdZJB\nDG+6EJ3qZwQJXEjAbeccNJJPFC+d8QBSasRjBiDIz2jEpaeqMFkU0EgW7fRmHWVUcRAfYKJRtPwv\nDB207bYmDvZOOAnwPwDIPLtk2vklDGIlMcp2eyzDMLhMSkzT5LEpU9h0zz0UoII8NajVnj1y4JMk\nrO6AcGsr/08ISm+7jdprrkmvDOoFEIL6pODf82Q64GOizHdRVcXdQpCFUpGtgOv00+l/zz1sevpp\nsvbfn7Y336Rx2TK8Z51F8skn0y6JVIuOt96BCy+GtrlgZDaQfXIDJbc0kE0nI31LWeHvx0pXfxoo\noI4imxBVwrxEUMJmPMQI4SdEgDVmXxLSoFPLRCKIRTwkki6QoOkWbm8cTUsyKHMNbhGnlWA62GSh\n2cozQRbtWAhWMACBpJBtfj8cONgmHB/nfxkvPPAAt+TkYGmQNEFi4ibGgR/eTduEnG81tq7rnH/3\n3TQAbSjCWoPyN4bbYWIuZKECN16g+ZprcEM6ab5UA3pC4iZJZ7dxIyiT27DvgyjfqQUkn36apssv\nx//pp5x/9934xo7FAqJPPkmCLpM9aR9DAIyERgHrOmHtTCja0IK3PUG/5o0MiK+mjGrKqCKLDjII\npVOWUj2EVG2kNnJopkyvosiow9CSCE0SC3uJhnwkkwamqSsfp5GkUNRTymaAdAWllF9UNZLTCBFg\nNf1YTb8tgk0OHOwIjuL8L6MgGeN4rRWxH+gHwoj96mFhPRwKvjlR5hUIPmqEK7+F28JrGLRddhnJ\nu+7Cj+oBn2WCaIMjcmBei1pBpNFFhkN9MPRkIANyfgKx/4BlR9Xb29t58aabOO4Pf+ClP/6Rprvv\nYnw+DIiDGYaWuEqof06IdCBKQxUFSdqPpX0sAbx2EfTIhIkHw9KvYP5+kO0HfQoI10ZOHLNRsbUP\nqvOLWF9ejpkjSOgudJJkyU7C0kfCdKG1CIQlCXv9dHgCzCo4lVqK2ZwoRbMshrMYDzEEkkw6OJS3\naSeLTbbC15DE8FJND3I2hrnedSw9SnrAoN2efgd7IRzi/C8jbsLmZvC8DZ1vQvkpoP8COBo4B8Ze\nBKMt1d3y9Ouv361jnNbSQiAQ4I277kLHNsEBXYdgAQywiTO1sMgj4KBMVCknD6B1vQaQlZXFOXfe\nCcA5d97JvXfdxcf1KgjVBxWBd6Gi8Jo9RByVilRLV2sll/14PdDeAWM2gxWBjYAvDMmblSrtNwPl\nkJXQI7+OHrKOZp8fv0v1ihemne4UA89alC8hB8JBD2uyerGCgURcPrvzZpgoXgQSDzFG8wV1FNFO\nJpqd/5nEoJUgJbU6Pcb/KNthOfgvwwkO/Zfx7F13sX7KFA70qhqZU/sCOaiQtxe4FHgSFqyHTxvZ\noh/6riISifCi308xKqfT9EOhHxpj0D8IdUHo2aRWC/UKQPB0YF8IPwmPvQxkZVH0hz9wwpQpW4z7\noBCYKPIao8PoXGiNw6K2ro6aBioVqQPlNhBAzxkzGDd5Mp888ggm0DZjBh5UfROJItw6VEqVDxhV\nCfhVhafSfpA7DmgHqwNqN0A4Dh2rQXRCbgRcPojflE/LkAKWNQ7GROOL4SPZGK9gnejNQM8y/hj9\nIx4zzufeEXTqAdbQl9DGPH7j+iVlJU5vIgffDCc49D1CoCZ52UW/5dJbb+Xvd91Fw403MNIFB3jh\nk9oyou/34ieTP2RE8tspT1Bc3I5Sg0vCMCoMi4GecVhTBT1LYFQhSj5GUZKxj4qI+9rbafnd72Ar\n4nShiM4EOkzw5kFxBFa3KdKM2/9nKrc01Zlzw+9+R27Pnpz+5z8D8MiMGegoBepD9VaxuxsTA+bO\nUY99wAEG5J4CNKjGdBu+gDoJVfYpD0YFw4YsaKTc18iIJcuQApYNG0hdpIQCrYEKzwYKIi1kxUI0\nuTbSomeziTLcdYKycQ5pOth9OIrzv4x/3HUXa6ZMofiqqzjPLtMGMOfu6VTeezXN52fSdG02/Q+q\ngipINKvXXa27PzehUIgNgQA1KBM9juoh5DMgmYT9hqOiPcOAQWA2w+ab4D+mbTGXlnJ59df76z05\ndSqts2dzxOLFdNBV+EOgyHIjirRjgPuYY4i+9hoC+P02rvPsp56iYckSWl9+mYxVq9LtOrwon6lh\nP2478UQsjwdmzUqvTtIB90kVZBUKDq9eT9uQAt7fbwI5ta0cJD5iSelQ6kUug1cswfduPe5SyNkX\nkjkar+Vcip/9mHTgKbs9vw72Djgrh75HpApvfI06MoDxYCzowOurQq4G2QZGEAw/PH3rN5ea2xEy\nMjLoE4kwok5ltGvAZmCwW7k107lCFhAFmYAWsyvv85s+FGdNn45vzBiCdC3rjKAUaZP9PEWmg047\nbbtjHXnmmZw1fTpiyJAt/KuWPaZETdGQ885jzK9/jd1eCWGPGftVP8S0/vh6Qq2nmMeOPpNXzj+K\naIWHqMdL/gut5D1QT/Wr0PgpsA6MNRYDg6c5pOngW8NRnN8T3vnzdPa76Wrao6pnUFZUzcWsW26h\n+oYbKLnxRs7q1j752+BeoX40izU4aQDKFi5AVeXogWKqV+Dl1ao7xm92cF0esyvC56NI0m8PuQjg\n1FMRFRWMP/VUhowYsdPnOPvJJ2lctiytKkPPP0/OmjXpNiGp9fDZJwfIqAzQdNEB6UZuFrpd5sNk\nKUPQMTlz4jTyP9qM8fHHjNx/f+bMmkWsuhq3oRrbDTnllxQWF+/0+TnY++CsHPoBwrIsTNOkI+gm\nJwOevuRGzpg2Lb1d0zR0Xd/xQDuBREKtrnnY7eZMD2QNQRFnMYo8o8Ab8Nly+JgdV0maJQSdQIX9\n3IdShytQRHrqHriufznqKLxvvJEmzdRM9HuzB77Dg/yLSbSQQxbt6Jhk0YaGxVr6UkcRB0+8j8Ef\nfUm2TZzvHnAAvefOpbQQ3AFY+tx8hoxx+rA7+GY4pvoPEMvzdVxD3SR1EF5VpBhUQzaXy7XHSBPA\n5XLhcrkQwEMxukKCqSrGvYAK+NR+6e/Tp39tjAfOO4/pQnDPCSfguu469OHDCaPUYAJl5idQEfLn\n/vQnVi5dukvn+Ngxx/CMEPxNCJ4Sgh5vvEEvYFghjOoHoz4pY3ysD20HDeZDJrCSAXQQoCcbGcJS\n+rOaUmooppafhf/FhX/8kv0fgbLZh9PwhwyGNM8lowI6C6FJh6Kjx/HeqZN3YzYdOHCi6t85np8x\ng5ZrrmGoAbIJCgIgQ9/NsaPYFZByUBIuYW8MAxVdGQCnTp36tfemfI/JF1/kZCl5fNMmkosXb8HB\nSfs+fN11bOjblwFDhuzS+aUq0PuBUpQYDpaApxxWBQXtbg9z2Y9NlNurgCx6s44i6qinEIngMP5D\ngd4E/cFVAp0nBNCEpPyrMKGFsHkJ6dSqSOd2TsaBg+3AMdW/Izz6+99z/h138Nwdd9A0dWo6iJJa\n272zRYS7Y7rtu5Q+H1eHw9+4X1tbG08Eg4AK5FycElouVA26MqACFp4Dc9l2Lunbr7zCwl/8Aj+K\n2FI+R90ewoWKhrtQ6UZgB3lOPpmsYcMQwIlbpVk9d8stW5g8GtA6axZyxQoG/bOImT+7nlpKiOOm\nlM3oJAmRQRQfAToZ3rGEq2bei7bJouGcTFoHB9mkl5MV7mBU7VfEo24aTrHo/CpOgwUZAurPOZfA\nIYdwSLemdQ4cbAvfKo9TCFEGPInq4WUBD0sp7xNC3Ihqfltv73qtlPJf9nuuAc5FccLlUso3v/2/\n8b+NyIwZPHjnneTddhsJlIuxA7jAsvgufkAMlNIKAKwC+tsvJFGqsw0G3gqLr4N7bDfB5WZXR/ZD\njz2Wr+xdc7caO9XjXUcltZeiRGwc4NlniT/7rPJRbkWc8RtuwI0iYQ3lK43a7zPRqaacBvIBKKMq\nvVyynSz6s4qBnasw2i2SDZBR24kYIKnWe6CHJe5aC3drlKpmaLPU/+7WoM+FFzJ0/PhvN5kO9nrs\njKmeBK6UUi4UQgSABUKIt+zX7pJS3tV9ZyHEYOAkVI5yGfAfIUT/vUpeAi/cfTebr7iC7ClT+OWM\nGehS4uo2BapgL8y6/nrO/BapRwBFkQgPCbHdVUcCOFmDwr7AOFT1j5j9ogkMBl8MzvwLfHqRxVrg\nESEoefRRjj7vPECRo0BVmbeOO47s4cOx7Od1L71EcPFiPKhAUSFwoBfMIoj3gpYgLDlF/XjHNLBc\nMPgicMdh5d+6StnlApv/cDSt/ghXRO/mC9coGvU8BBZJXHwRGU2IDDy+GG35mSz5IJPMlR2UHysJ\nfNnJqLKlEJWqMGk1GB4Ij+1H9KjTqRUw6uLjkTVVLHttPkPGOsEhB7uHXTbVhRCvAPcBE4FOKeWd\nW71+NSCllNPt57OBaVLKeVvt96Pm0hRxem1zOi6lKg4sBEiZTruJCkECmGJZ2xlt24jFYjzhVdUv\no4Bhj5Uq6waK7ACSUnJpXxB9UOyXgcow99g7ZaHC5BNBvgx8AY++DtI+/x4zZ7Lx3HNJ0lUp/uxu\n1++JM84g/PTTaKhqShnAEdmgjwDtMFQAKmjvbKDs/XygHT6coPJA3ahf2jvkw0yZfy9DByzhH/4T\n2ODqSQ7NdBLgPSqJ4GUfvqCABk4/7gXK6zbD5SjZOsi+r0Vl/z8Knw09grEz/wXAkiP3Y8jCeSz/\nP4c4HWwfeywdSQjRC5iDWnMyBTgbtWjkM2CKlLJNCHEfMFdK+Yz9nkeBN6SUL2011o+aOGcIgR+4\n5ADAC7UrobpKRa4BRo+F/SbAvfeo57vj40zhEZvc7AJDBIAGuhq5uezHRwJZHsjqC/Sla3lOd5nY\nEzgUeALCt4N7NMz6UI1zvpQ8cs45JB9/PH3sJHBpt3N/5+WXaV6yhM3PP0/24sV4gdEjIacccu8B\nrRNEHJJZ0FaUhRY1CT/vp7Ush4x9O2nMySXXaKS4pZn6giBzqKSKHixlqFKaxMiknRuvnE75vGoY\nDqIYRZRtQCZYQyB+nkC0SBL3gmbC2rPmMmz0frs9xw72PuyRdCTbTH8B5bPsBB4E+kgpR6E+tndu\n7/17GyQwFFWgQiaheCiMORz2s7sz1H4Gi+6ByQOUSHpViHS+5a7izEgEUIU9TvaogsOpkm5ne+Ci\nk+H8XGUOb4pB81q6wtepT4BEOSbrgM/BPB78j4FxGZx9BAwog4eEINcmTampN+qoBPt/PfMMAD/5\nxS844YYbEEOHYqH8uKu/hMbXwcwDKwgyD5KFgubsTFoLMujx1waGvraSXrWbyYm2UpSsw52I45VR\nMmU7eTQRoBMvUfJpoIAGjMwkIh/EeGA4sBr4ClgLWpW9tj5f4D8FfEcJnHKbDvYkdiodSQhhoEjz\nKSnlqwBSyoZuuzwC/J/9uBoo7/Zamb3ta5jWbWVMZWUllZWVO3naP3y4UVGzpxcrfjp+PBCAQCH0\naFAT7wMCA6BlFSDhJbebk7+F8uwAfF4IxpTizBKQVWifSH+IzYMlQE+dVARGwQS7c4W6rwLdj1qf\n2Qr8Eg6qgtjvFa8aQNnjj7P+rLMw6XIHdIeGUqNxYAOgj4Ml2UeRmd1Ott0eeOi7K/DNjsNBQDE0\nhLLJrA7hNSVaFHLj7QzPXUqdrwGvK4orkSSvsx2XEScQ7YAOSN4BVgyMCFT17IOWZVHMRvRWMMIW\nHzb8CiNQyQGjHLXpYPuYM2cOc+bM2al9d8pUF0I8CTRKKa/stq1YSllrP74CGCelPE0IMQR4GlX8\npgfwFvC14NCP3VRP4a9CEAMMXUeYJsdWQFF/0FJs44Gn/g9Oy4cP6yEu4eBYDLfbvcvHelgITvND\nIB8VZckE+oBcBlLCivmwCdjXC5n5QDZID4jUAvBsIA+0cfbjUSBbSDdtF/8COuDpe7sqIsXpEq0G\nUDJrFoeefDIAT7lcWMB5g4DJ8OAdvySTDvJpwiDJobd8jPhYwlnAQFg+ugILjQEt69CrQeuAeAU0\nZudQ5ymgKNJIcV0zlhu4HfQvILYGEhENw6+zdEIlWolJ/+y5cBp4WpOsyHyfYSMd0nSw6/hWPk4h\nxATgfVR1MmnfrgVOA0ahUpTWAxdKKevs91wDnIdKsd5mOtLeQpzP3nabqlfpctF41VUYKIV29sH2\nDh5UYKYIaIa3/67I6MjdmJuHhKAQOH44ym63k9vjzfDMWuUDhS4zox/qombSVXzYC5x5v/3kYPii\ndAgyV1Jo1VE2txm+BG6HdU3wnp06ug+Qb8CXSWVapJZIxlCu1J9OBvaHG665Bg2TPqwnj0b8RChn\nIyYGCQzayMZE4+DnP1PnvgAly0PA25DogPXVKmju0aCtd286zr8Ad3lPJp52+i7PlwMH24OzVv0H\nhBfuvJOm665DxGKcPRrcQbqSH31AG7z8d+hhwshoFI/H841jxeOqz+RLHg+dKEI+LQdcQ1H+gTjI\nZnhlETQCRnEx59TU8EchKAAGqsOxHBXgDns8ynqPxTj8VBh+Gmwens/sisMZyleMu3MxQgNhSWSD\ngCaQ7YLQ0xqPaefg8T2OxMJAMlaTjKwA83yNn/32ZYJaC2gwhKUMYAUJ3JSziQxC+AiTlC5ayCGO\niwwRYWjdSvIeaIUmEI3AZ2BGob0RLBMMHVZMOJBxb7+HEI4D08Geh0OcP0A8ZH/ZL+6PYq9c4Bco\n52QSZj+uyrRtz+f5sBBEUf7UYcCIDMg6H+WXbAbZAB1fwOMxxckX2GM9bFd0///snXeYVOXZ/z/P\nmT6zvbDLsgVYepeOgIKgscUSEFtUbFFjLNEkr3kTfymaGJPYfTUJGmOMgiJRVFCIAqL0Kr2XZXsv\ns9Nnzu+P+8wO2LLUxeR8r2uvmT3lOc95Zs537n73VDApHf5UL1JofP8MpRh/HfQpAAbDs9Nuxo+T\nYvbhxkcvdlJBLhHsVJDLVbvf4Sc5D/N+ynlcxUyKKCGVRtJp4O9cz4zf3ANjdfIn7OEy3iIZL+nU\nU8w+nPgpooTCxkqSG3xszulJvTudKBrDo+tw74lgLddhtrE22wA/RFogGoJtcxdzxn+QbdzE6QOz\nAvxpiDt0neczMvjL7gamuSEpDVQ5WNKBRrjgEnjzHWlbcaPPh8vlwm94z59wu3EC+VaYdhni3IkH\nV4Yglg9sgFgFLAuKQFsPPGH0Q58AfAoMUuAPQbBTJ6YfONA2t2a3mw9mhii+KYJlBfSZtp1VjOJv\nXE8KLYRidryRJN5fcTnMVVztUxKjeZ7OH/oXEnFr2B1hGr7bGTVRR+sfgfQohRykngzyKMdJgBgK\nB0GS9GYsWyPodkhJbybZ3YhVj5K8O4zaiRQT9SL2hCBEIxbqYg52jRnH+OMgzVgsxozhw7Fv2IAb\nCFx8MdPeeKNtv8ViOSZbs4n/fJgSZwcjLnkmI0LnhU8iKZGt4JsNL7RCWNO4Pxpty03PQ7hy+rnG\nm/jPn1EsZNcyMRH2L4KNB2G9sTseHH+pgqJsYyAPPL9M9h+eefTC975H84wZnHsJeObm8h4X8TLT\niaGxsWwoPGODR3fKINPToAfYbm/GndRK08bOEAWtuJWC1BJ6O3dhJ0geFaRTTy92k0ojhRzCSpji\n6D5cNREacz2EsRLASUq0GVdLEM/sqBDnB4gIboFN/ccxaOYnx732S+fNY+fFFxNDIrHcwJlAZmfI\nGwsre05h9G/fPO7rmPhmwlTVT3P8xW7HFQ6TBVzQG7gKcVlXAFF45mUhPYcGd45D4hb3IkSpQ6QE\nZuwVybIRcfBYkZiwLsAuJY3UYjoM1ODMbiQ6pvmAJvi0Fja3QM7TT/Odu+4iGAzyV6eTs2+C7D97\neEObxl+073GosjsNP8iGNZugcjDcpON8uIG8pHL6O7aiEcVp5HK68OEghIMAqTRTSAnJtJBBfRuR\nJuvN5G5rgb3QOlHRqnnoVONFfxtxRC2EoN9CZdiF1QE1c97hjLMnnvDP4Onx49E3bsQCaNEo4/1+\ncnIgezKs7nYZAx74B1ar9Wttzib+s2Cq6qc5rCT67RBCAjIVRkUOuOuHxkF2pFtZqXGiBbH7GaU7\nAxz5WoNkUU4tknGrq6BTPMvQirAxQCoMahYPe9Xdd8NddzHzrrtk32eQPb8V+5AY/kIXka1WmAPg\nhdHgurCJCZlLyKKGSSyilC40k4oTPx5asRMihRbctJJpEKaDEFE02dcUlNLxm8GzRcezxivVlOMx\npgp2Dx3JwA+XAxjd0U887v4kIcEuevttVlx+OVlVcOFBGNXwNlyVxIoB0xjzyOsnaQYmvkkwifM0\nQDWiJiYD9IRXH0+YLC+5E2HUKESrIdYMuh/YDqX7JIXTgnyQfsTUGPewNyJBtB8dkGpMlyXD3rVQ\n3MW4mAUhaQ+kFMEd3eHTQ/C6kfN+x8MIC3sgaHWwe28/+NgCvA1WH9a+I+mRuYdxLCU7Usc1DW9Q\n6c7iE9t4fBY3Vi2MGx+Zqo5UvYn0WCOKKLouvc2zgrXYW/XE5BdBpBSa7SloCvYNHs7Qdz9i4En/\nBI7EOZddxs4zz6RiyxZmbAItEmGqw8fQijfYduWP6da7Py6X6xTPysTpBJM4TwMU//GP1N9zDyXA\ncI9wmg1DILQiKvUW2LFQMn/8nzs/bvDwk8hXj58aQITXBsAXhOLRSDvKeDVfj3FwDCiFcX3g/Uqj\nJNwE2lpXHgrnw0obrAT4DC68nPP/+jZZVHM7f8azMoRtHRRQyzWet2AIhHtCuasTyfZmPN4QjoNG\nfTevcf14plIqElS6QaoZZextAiQ+tKNwx7Jlbe8/mjOH16dOhXXw3RdHsKH4Ks68d2YHzs5ER8O0\ncZ5GeM5qpV80ytk3g7IipKJA98Cs3xoVkIDrvmLdHktPRzU20h+RPFfK6diQOM0CoI8bkjKgvFTI\n9CCi+Z9VANFD0MUDWZcAAYjuAF0Dy0SYe+0FXH7/fNhTBr/I4+XuN3DtT19BDxutP3qAtQn0ZtCD\nQKt49bVvg+VMJL0oR7a3tdOMF/AE+UXYAhyCpk8bZbfFQlJS0glc4ePDR2+/zYEbb8Q6ZQo3vPBC\nR0/HxEmGaeP8BiEACXtmXCLMEj/R4Rk+X4bvl5fzvNvNDhImwrgWXGv8bfDBlIDYP/0Ib50LZHul\nWvXEJIzSwbBvu1x3TCkkj2qSmKZgK9oUH6ouws6NifbANetghAN8YaiOiXWhVx745oJ7IZJH5jAm\nFkVE2hhio2hAYlmNfan90sABWwaOYsDclce1nicSky67DC67rKOnYeI0gNms7TTDfkjkmacgGf/v\nSQZlvJ/5V8HlcjG9ro4pJSWAqPrxFh1h4AKj3e7iGLQocNnFU9/9TLAlCU/H/KCvhugK4ckUDWzf\nh2V9xsPZQA7EcmNc//LL6Arqn3+eQbrOJF0nJaCTG9UZpOv00nX2hjOp9mQSDEB0NcLcTcZNxEg0\nKbIh6no8g6o7kAUDDqwimK7wJSlW/HMODfX1NNTX09zcfOIW3ISJY4ApcZ5GaEW4EieJsm8A+8Qs\nGO+t9lXw+/3MyMxsq7+pEKdQZ2AX8H5xMenABQ5wZoJ9FCzdCCXLJbopHShvhkFW0DKMKkhdgH5w\ndr4JET4AACAASURBVNrHhl2yCJwOmAf9syHz3jvg9tu/dD7F1bUA1FkVSavBEs/J72HcTAwh0RRk\n7F5IDGu8N4cf7DWya+TtU7FYAQ02DR3HoHeOP47ThIljhSlxnkb4cSRCDORTKQIGIdJXq+Esslq5\nvqbma0aQ43TEjJiFqNIHVaIvuR+YE4RV5RBthbH54HBAwCLe/X1AJBWCVhjaHVKSwT8bRi9aifMH\nPizfskippSwoOLSLZX+7lGUWxQd/+tNXzikzorP6lpuo3ZlNyWsOKQkT7+ypIcTZ13hVyEQCoIdA\nHwTW88DSF1o6wYf1sM3sTmmig2ES5+kIC+CEYLFCTwUGwOjrIBKJ8Gx2druGOFyVmJacsHmCaMg7\ngJKFUP0p5F0NfXrIORqwfj/M2QH+Kvh0F/zjHZh3G9w4+E/0GLpTyh6FdUoX98RXkszYIujxozu+\ndj7jH3+RrK3VbJt8ESxA6ts5jAs6jdeeSIuNcqAWWuugeQ2Sn94TkkfA5Fug35h2LYEJEycNJnGe\nRnjFahXCcwIFsKZoCC8UfBd1ixTcUIhQ9kuleEYpfu90Ul1d3Xa+y+XiPl0nnJODnpODFTEdvtss\nHOVAfE7JiAq/AvhAhxf/Bkt3SucMCyJ1BoHPWqEpIpJrCvDchvs5J/djuFiBS8ErsG14D+oK0unU\n3U0gRfHxjD8fcU9NTU3UVFdTY8zTU5BGjSOHwGKnTKCVBHE2AFtgWwm0FIAaADubYHMZeN8H7yxg\nF2je8DFXyzdh4kTAJM7TCFEkExIXNHR1U0UOjaQKa6WK9m5DSC8ZyA4GmZGT84VxHqis5IHKSmqQ\nniY+ROPvjsRGDkPaehQiyUm1SN3MAAlTYxckgN5n7N8DcAfcFPuTpIQOkYN/t/wXTPp4Pv+36VZq\nW2DoPUfaO7f9v++RPTCH7FEyz/FPvkj25ko2jr1AovcrEJtmFyRR/BrodyEkZ4MnF3p1hbwW8FeD\nT8n+4u9t4LMtnx7napswcewwnUMdjEcPqyWZDNyQAeTCqpwRbKcfQRwi8g2Q3kQpiGR4EPF6F37N\n2Dc2N/NSSgp+hBDzEH9TXjo0+mBDUK7ZDdgJTM8DyxgomyOxnQGgn4IhGYga/XOoGpxDj/xN1I7J\no/HlLEiV+piLtHMo1vdwxm+34h6qoYV1lB/G2IF+EKkBPUuhdYfaueUEbG7qysHzMjiHIkGmTQhr\nnys3Gc0By/dcWLdr1Ocm0TQ4mfeaRhC1aOxLW8zrW7bwm163mRWMTJxymBJnB6P3jBnYrNZE354z\nIdIXmknGSxIBHMJuFZB3HfTtB5nWRExnewJzYgjJZgBuBbYcsLpEGj2EjJUEbCiH2hCsQeI8RwLF\nLlBuUIbn2xXzczHzGNZ9hRxQBFtrB1IR6MwbXMXf//dqatanEJhuE8J/AHgCrC+DrQ8ESyBnVB6u\nKVNxOaG+EXgSEWn7IPXu5sifWgmvF07hiYvuYP+wIrQSuOnqmUz9ybtEsFI/QLFu23pMmDjVMCXO\nDsZlt9zCU9//Pm7gcg1UDGytUEoBtWQBisp+KeTubSb9GkiPQLQbvDEv4T3/KlSWSY+8eDx9DECX\nXPdAVIg3gDi5nUBXDUreg+90hgof5N2CqNK1QCHECqCLp5Se7CSDOlouSmbvzj7UeTMJuZ34cbKT\n3sxmKv3u38b4W1dgKQN2gHcG7DiYT36gDmfIz4jpl1O1s5S1t9xMn38tIO8pcCyFvYugvhRsOthn\nQnSAF9v5EQpXV9J9RwmxM6C5VzKpNNI9uhe7PujkfDAmTHwNTOI8DWBBVOlSXXr30AIWIoSxEcVC\nJbnkdmkmth8WrYJoWMKKBr74opDhV+Ddvn3buk26EZJ0xwt7SNeNtvObgdKYSJ5qAuQFkJaWcU9S\nZ2g8w0kAG2Ec+HFhIYbyA3U2Wj1JNCenohEjhoUATgIeG64DEZqv0El6BkbNP8TK6VNIf/Of2K3g\nKc7ngmSwFQJZsPtl6OyGLDfUt8qcj/iCpoL3Xhstne30Zhdda0qwhL9uBUyYODkwifM0wA9CIWYo\nxRodUt+BrjdCJvXYCFNDJ2YzjSGRh+Fu2FQB9+k63/qa8XRdp6y0FCuSsZmDOJWaALsGkajU5sxB\nAutDhYVowKqSElKB7h/BphboVwBad9A6gbU7NEXSOKQVskIbzc5Yb7bUDCQadkI5lFu6kZrRQNSq\nUR3rxMR/fErrjWFCVsjKgeD/Qvklhyh8+EkaH3qyba6bf/tTxi56FRzQcwhE3BrYICnTSsRipTE7\nn9304KWR15JFLRpR7NEwV37wNmk7WthoNrA00QEwifM0Qd5LL3Hg5pvZGIvRdSF0uewQGjGC2GnW\nk2EuLG388h7mn4fP5+PdQnEb+RGBESTEyBcGmwO0kJgU9wLTDh4E4GmlcAIbqyUkad8uSNslqZ7d\nPoBuUys5lFZEkruVYMBOpDLZGBQog+27h9I7fxO/aX0YopIERASyesqF8pYXSgrTPyBYC450OPTE\nXKh6Vazt5VDxSibhyRZKKGS/1o1t9CGAk1Y82AhzBhvIbaom7ZkWifc0idNEB8B0Dp0muGj6dO6M\nRjkEPPM8TFy0Go/eShQrpXSBWbDNLxz13L/xIiuliKWm4kI0bTuJX0g/4PeBOyamSx04dPAgLS0t\nqK5dKUtOxoHEoechGv1G4J/VEFoNwVorOuBx+0SEbUJyNTUosu7n102/ENtAC/Q4F3o8BfoosP4A\nomUQ6w3cBI7LAReMfOBSYo2gbwFGQKXWmS2NA5mlX8UsrqKKHHQUaTTSJVLGWZ+spP+Mzaz6LJf3\n+k5jyNgJJ+5DMGGinTCJ83RFE1iNWkjNpLLQyLT0fM0pcbjdbjy33BJPQCLegdiK2FJdbrDbZXsU\neK1rV/716qvctX8/nmuuYScSlx5FHONZiO1zx+XQuEgjhAMbYZmMPTH4gbLuTHvybUmZXAaR1RD7\nBUT+DDU/h8YfQfM1iPGyL9ACoTLwLodIBbALRjyziUt++y9Ug6KaTjgI4qGVM1jP8LJ1qBtbqfxf\n4NVXufh1sxq7iY6BSZynGe7WdXRNo/lqGMlqolhoJIVqr6jp7e14E0MC2OO+oDSLOMh3A3+rhnkt\n8uHnKeG+kjskZdKRnU0TEqYUQhxKTSRae+RXH6SGLJpiqZCkA7pczA9NniTCditEIWYHSy6s/usb\nlK3fS3Kjl8yITlpIhzt1+KEO+3Qc9ToNZxdT3reYgynFHCwrpmJxPs8v+SFvl19FHuXkxcrxTF5L\nWZ8StqliGroX4zQrsJvoQJjEeZpicRhGvryRIDZaSaYrEoMOUPzyy//2/BHXXIMNMUH6gR0x2IrE\nc9YjAe5BoIcj0dwN4LsPPdRWLjOKEKYX4cblwMH/KSGAi+ZAipzkROwHAXht1BQO3FUABdDqg0Ap\n6FFYUlzMqg8++Mq5Fi3YQ9HKPRStlb+GGW+BAzy0UMRBiryHyGxuxjd0KKN372HY7j0MHmMmrJvo\nOPxb4lRK5SulFimltiqlNiul7ja2pyulFiqldiqlFiilUg8756dKqd1Kqe1KqfNO5g38J+KeaJRA\nDAr7l1FHNkEcjDsPthv7v3X11f92jIFDhxJGIorqEeHQhnDcvdEojuuuwwt4FUzQJHvoGaV47eGH\nuUPXcf7sZ1T17ElVaipZSDsOlwVQsOSsCzhvwYfY0ppRyWEpEafDvfVPMcM5nZYe0PIuuL06Z069\n4uh/nS2gp0iw/UhW0ztlOym5VrItgbbe8hVlZRzcs6ftfxMmTiXa852OAPfput4fGAPcqZTqg+SE\nfKjrem9gEfBTAKVUP2AaYsW6AHhOqcPyCk20Cz5gXbeBtMbcaCoG4yBisVD42mvtHqPfa69hueAC\nNITbhiPpms9Pm0b4lVfYBnzghx7J0McuwmPdgw8CcMPDDzN91y70K65os3demQljHYi42goWaxSV\nqsvOGNgdIUb8ayNNflCHlWNKQwqUtBs6qHeBt8FDK8m0kDcEzu62nu0bpBdQxR03UDiqJztXrzqa\nkU2YOCH4t8Sp63qlrusbjfdeRPDJBy4F4jrjy0C8p8AlwCxd1yO6rh9AzGojT/C8/6PxksWCAg5m\ndqG+IZNcKsEBMaXaJW3Gcf7VV5Papw+NCLcVIMU9gnPmEEFSMB3A801wICye9FRg765dNDVJw7Qb\nZ8wg1rs30dRUPqoGrTc0zUpGP0cj6HMQswKZgB+8m7OJLHAQHtub0vfntc0jBHjLy9s9b5vNiXd9\nEq6XgmQtrsUai+C/wUHsdmhtOsQn/5xJy7sf8WE91JYcYu+uXabkaeKU4qi0KKVUV6QuzkogR9f1\nKhByRYQZkDo3hw47rczYZqKdsANnF8EsriISsvCrF34DFaBiMf58FMQJicwgP0JgaVZR2TWgy6xZ\nFM+aBUC2Rz4kD7Cwd2+Wzp7dNsZtO3ZgmTKFXUD1Vpgz8mKq8zLRQ3YIWxN9hD4C9kG3T3cw4vwL\n286PAtrdd7d7zj37D2D72LPw5UNSfTVFvlIiXXX83S2Mb72JkTuuoVwuRc3117O6d2+2rF59VOti\nwsTxoN0B8EqpJOBN4B5d171Kqc+3vznqlpW//OUv295PmDCBCRMmHO0Q/5FoBbq9Bx8zAT1mofv3\nlvA84CRGdNYs/jpnDjeFQu0a66bHH2fGE09QgWEjjSQKFp975ZXMuPNObMB2L0zLl+LBFX7Yd+ut\n7B47FpAPtrWxETdgs8BN/zuT3VP7MM8zVRh5JxKCNBlx3R+Gv115JXYkZvRxpdCAe9vR3XTEQ/PY\nuno1/X40ivCyGBWPptOcESNvfiU1S3UaEEJuNu6l4cABSrt2Jb+oqF3rYsLE57FkyRKWLFnSrmPb\nRZxKKStCmq/ouj7X2FyllMrRdb1KKZWLPDogEmbBYafnG9u+gMOJ00QCVmBzQS8iESs2Z5BO/wOR\nR2V7P6R6+9Gg2+zZ6MDmK644Ihj+2WnTCG7YgBvhv5Z6yAlIzGYEWNKvHxbE++4wttmTZQKW5ojo\n9Y1IvJMP8UTlHXntCImmccDX5tZ/AQpUJdg3Rkmp8dKa52T7IQdqb4AMpO5xvG1R91unc2jCRPIX\nLjqaK5gw0YbPC2+/+tWvvvLY9qrqfwW26br+1GHb3gGmG+9vAOYetv0qpZRdKdUNac1l6lFHgQgQ\nSLXj9zlxJ/nZ/tv+3PVtuOV6SZOMhcPMeuSRdo83eepUzp06lft0naS778aJOIJCs2dj37OHsHHN\n7T7w6wmJFES9TwVGKLihCxR3A34PjqEhCCgIKWFWBeyGLR8VwDhFaxfFnm1bmTZjBrfqOq777jvq\ndeg/YiRLp9zOQb2YrKebKJxXzYBXgvR+Dy65ES67RswaduDjMHz2db2TTZg4gWhPONJY4FrgHKXU\nBqXUeqXU+cCjwLlKqZ3AJOB3ALqubwPeQDrFzAe+r+vt0M1MtMEKFD9SgkWLYbcGKa47BE1QsUQc\n2hGOwS5yGFIR4ow7hyzIF6ERUFbZ7z7s+FbA5oSyMvC55CRlickJXkTidALp8NufPwovgecC6HHZ\nALZ+tACAGx577JjmetYjz9P8yD+IPAeWx3Vsmo7rDHBfA9oAkWTj6fLtM16YMHH8+Lequq7ry0g0\nSfw8Jn/FOY8A7ReJTByBFiDjjWZ+/MAfeEHdSvr+ZjYthUG/gV2FD3PXd392zGPrJNIpQZxBPmO7\nFylwnNciJBQPnq8CNvqlrUfNUhh8L/SbthV7kp9IhY1Y0JrI7fQp9lR2Iye9muRY6xEMf98x/n4O\nHD2apWefR/8lC0mbBZaR0DLCgSUJCvODNAegvhYiixez5pNPGDF+/DFdx4SJ9sLMHDoNMXDOHGiF\n81jIhbwH74tjZ9WotygcPfW4xlYIIcYpLIIEt8d/QUMhqZhUgzh06ozjvUixj3qg5J8w+X/nU3TR\nLjzJzcL0jcYgrXD9+BdYOXmEsO4J0jV2hWCVD5gFvATJDUGyugQ5/yGYei1kWRK95E2YONkwifM0\nRNmUKQD0j27lzz+6DzULcv74EKMmXUb3Hr2Pa+wIoj7kIURjQcKTbMY+b1Ak0DBS3MMJ3Kbr2G+6\niQza6newbz/senEI9/R7Sg5sQOKDvLBix3i2Fg1Az4YRd007rvnGccuCBRRv+Iy3tyQz769QfytU\nPG2losFKcxfF0P/Xk/6P3spwU9o0cQpgEudphhXTLqWrrkMvcL0dhVWI0fEEVk7VECnShThWDkcM\nyQ4a4ZJwiHgpDR0h1qhxvq4Dn8JDFb8W918EsWo3ATtt/CXpZtSvwdv9xM2796BB1I0eTUME5n8I\nC/4YYcF9Ef41z0XDJS8y/id/OXEXM2Hia2AWMj4NEL7Aju1AGN8hGAzghn3v5ZKTVIk3BOkhnQkn\n8Hoawm/5iAoeJBEmFATKglL8uFcqlPpghpExm2Ec78DodbQd+D94bv6NvBqazrKVZ0usVDps3ziE\nn3/7p1z5zlukncC5f2/hwiP+f+P223F61+FyuL/iDBMmTjxM4uxgrL7i2wzfG4VHwB6F7yc/yZXM\novNcKcD52dXXnlDSBDFHuhACtSJkGf8ixNX3RmB5KyTrhs/HOM6oUUxnwLcP7EXw7dIFfDpxMsuW\nIqJpVAZ4PnYnw92bGXiC5384pv3pTydxdBMmvhwmcXYw+rz7Hr5aRdIIsKbAXyruhSg0t4DHe2Il\nzTjiQeONCHnaEFumQgi1uwMawrA2IqT5LQeEwvBeTNLSa5BkoX01MF6DYl8FGQMrYaoxqA74of5A\nHiGrCyYpVt77JqO/PeUk3M2R2LdrB4FWr9yMUS7UlZxCt569Tvq1Tfz3wCTODkYkCskBqfm2dhdU\nXnI1Oddchx47OZVRxt92G/OffrrN2a0hMZtB4zUed+bSYCAQjUFtGNLSYHI/6Vf01keJL05DA1AK\nw9PWSlrTLkQkdRx2gXKOMmXo2NHy59sYXLtU4qxagH2wtv+36PaXr64HasLE0cJ0DnUwkj1wbup8\nqguyGFoX5eKXX2PEty5g5AUXnJTr9e7XLy6ItWUM2RHS1El8IaxAakyOqYlB0A/5bsg5XzzycV50\nK+A5uHLr65wz/j06jSpLBImuVXAtVO0A747dJ+V+voAoxLzQ0AI1LbBnDaS9uIDwtxRrf3z0a7p9\n82Y2rl5tVl8ycQRM4uxgWGzw+5sfJNhq58ULL+SDV145qdd7y7AJxj/4GCJtRhES9QMuhxwQQZq9\nddYMgmwENsHoqXDO3XBuT0h70AXfAftHOo/c/AterrhepD2jwdFv+QlpPWHikz89qffVBguEm2Dp\nP2D+XGgNQ5IbbGOAY/Dwz7/2WpaMGsWh/ftP+FRNfHNhEmcHY859v6Xbq+uILS3HtmABDbtPrmRW\nt13qyMc1ZzeiXe9EpMswYEsFnw0WIxFG3pj0ECIE1EOnNOhihy5/gt03D4YIqDUw4PX1TN68iKTr\narB2D4AfPls/HIcDqn0n9bbaMPixj3F8qNN0++1E+vfH7hJzZ+QAEmt6lLAjNmAzZ9jE4TCJs4Mx\n6uqr8WRbCXdA7zELQqA9ECdQJRLD3lANZYFE/rcd8HoRD5IDEUOdMkZPdkkOZx9wTIW9Q7vJDidt\ndToP/CWXyDDnqbsx4Prnn6ffk0+S1Q0cXcCfhcTDHiXiLZaX3nors3/zmxM8SxPfVJjOoQ5GYdeu\nzKxXDHCJL+OrigKcKMQ95/FWwX6kLXpXEqbJfUHZFq9PXJQKllQgBSHEXNp6Dmuazo/ufIhSuuAk\nQA3ZpNFIndVJJCxk2a28gtk5UykYp1j5wD8ZffHlJ/kuYcm9d5K+cinJbnCmAG4YHviArRtX039I\n+9xui//5T5I3byYGaMuX412+nN1TptCzT5+TOncTpz9MifM0wCGgvPXUXS+CSJpRjswIijuJ0oEs\nF/RGsikB+aZ4jINDiQFseoR8DpFCM5XkUkcmNdu7EKx3CStHgRrYOb1Ykt9PkXd9wpP/R/TRJ3AG\nkQWuBkpI/DocBRSyNif7R83ENwcmcZ4G+GFn6OkWYe5kfyA3P/UUYRJhjiB2zZDxvw1ItUhHy3P6\nwIRiCUHS4hWQ6xHdNRlwgG6BdBqxEqGSznhJIpyhE3MCneHGS/8EVfDzpY+i10Cfqd85yXf4OcTF\n6RhC3EdprIx3QI63VTZhAkziPC3wXh2s8YlEcyqq+2iIMBhB+qZjvAfhF4sGmhVh0WyEeIqAgwh7\neJAy8TZp4RvGymWRt/kVDzKCNWSnV+NMDySaG10YAj0G14K9GBbffsspuEtkMQch/VbjsVbHsMDq\nc68mTJjE2cGY+cgjVLSGqY/C9GiUa37965N+zXt1HdcPfoCOEGUdQqQgXwi7HSxOhMkdCEmWInp7\nJlKeehtQCZ61EXQ0uleUcunvP6TPtt1k2BuwZ4YgE15aezv83Q6bNLTNOh+kX87Ez15k1fy3T/p9\nDj1rMpv7nAmFgAfW9jyf/sPan1Yw8TvfITJwIHbktk9kzr2JbzZM51AHQyFqsvP669G0U/c7ds69\n91I3bRprnniC5LfewoeYAi1AyA9ZISjqSqIpelw09SPu9hYgBbx5DjSiENGhATqFjdZTGuKFCiNS\naznwaSvbft2d/C4DSfv9z/lk4buMf/LFk3qf9onP8VlrM8QgNSX9qM8f8Le/EWhtJdv432wGZwJM\n4uxwxFs/pBcWntLrdisupltxMcPHj+dxpUhCHENRYFkMbDGYvBI65ULqIKSqRwijaCeSsF4DgUI7\nKbSwqNt4evQ/SK/UnfhwE4lZhYU9iJdJAf/08OA99/DywEmsHnUlvedsZdXkSxl18SUn7T579xt8\nXOf3Hzr0BM3ExH8STOI0wVmffnqE/W7ZuHGAdPqN1kH9asjqDsmFJFzLRk+N1GofaYUN2AiBFwZ+\nvJO8rqX4k1z4sh2kJzXQ4M4Vx8wZQLQTpfbRvDrhKkZOXI7lgZ+y7NE/0AT4+vRh6owZp/DOTZg4\nNqiO6qOmlDJ7uJ2meFwpHMBwRMAc6ACbFVyjjAPqgRzgLCAfmq+1UaIKiGoWCudUkDbRy2OeH/AP\nx7VYCdNABlXL8tFbLIw6/2OCUTsr951NrNTO229cyiU17xBcCC1h2PXme4y96KIOunMTJhJQSqHr\n+pf6BE3iNPEFPKUUdsQ0aQcyFCQpGDIUqiohyQuOIrB+Ww6KXKbYn5lP2GOhy4EaYl1ivG25hGe0\nH1BAKTlUsahyEiXVXRmSuoGkwmaGBdZTECrlXyXn4gu5GRpZS9723fT4/Toi6el0++MfGTJmTLvm\nu2XDBgAGnHHGF/YtfeF2bPs2U/YxqNGjmXKM3TZN/Pfh64jTVNVNfAGHh9+0APU6hHQY4gV/C5Q2\nQVYTFHUB8sFaoJM6vJl6Txr+Qgu5S1q5ce3rXPyTeSzmbPbSk3G5n1DS6SCfvD4J5isuuGM+I10r\nmTJwNpt9g7k6NBPLwAg//evtjPtkHq1nnsmngPWDDxj9rW997Xxbm5vZPGECyydO5HuLFrFh2SLS\nrpiEXgVjr4a6AOxdDv6UlJO7cCb+a2CGI5n4AsavXInl0ktpApoRv1B3gBB0dkrmZUCH+uUQPABs\nh/RyLyGsRJUFVkL1e1A72sfgcctoxY2HVrqp/fQ+dwtJkxp49sMfccuyV9g+cwij/7aePzb/mFsc\nL/DW83fw6xUv4/hxDwadC0kP/JBFt3/va+cb79wZWr+erRs3UjxwOPvyBuM3yuKhxCRr9l03caJg\nquomvhKvK0UTkpo+JBkKs4AgNNeBMwnsPcB/EFzJQBTC66HV5SBtVxDegNKHIKMI3INgz8wCDngK\n+AW/Yn99MUUtJWQVVXEpcxnTsorUUDOHMvO4ueFF9sR6kJ7RwLD163l8zBSiOgTeX8iwyed+6TxX\nffwxqyZMQCEqVGzSJBzBIM5PPwUk8ycCtJx/Pre+//6pWDoT/wE4LlVdKfUicDFQpev6IGPbL4Bb\nkQxggP/Vdf0DY99PgZuQ7+o9uq4v/OKoJk4G/jByJApRI/reey8XXHPNcY3Xd80a1j78MOVz56K1\nQqGh6XpSQTmBJnBkgrcE/BHIXApJ3ULCVC7odCZYFeCB/H1VZNc28MLSOwnqToLXKOpJYxZXsdR9\nNlmuWqJohF02MvR6MqinqU8K1hc6U7ipgqqf3cWmh1PQfv8sA0YeGcTeb+hQXGvWsG/tWkrvuIPI\nmjUoXSc0ahRWv5/M0k34oonsKBMmjhftsXG+BDwD/P1z2x/Xdf3xwzcopfoC05Akt3zgQ6VUT1O0\nPDWIrVnTZntpqaw87vHeHzGCPi+8QPXcuZTGwNcIdhdY7bSxkGaHpIshySrbtN26lIjPBbvhq4nl\ngE0P4bSESN28C1YCfwaK4IK/fQwp8FHmODZaBxBzaqTTwChWoXsUsYvcuCdDt4E7ia6C4DmjWDtq\nHMM/+qRtnsnJyQwaPpxBw4fD7bezctEiNkyaRCwlhZDFQkV9otq9CRMnAv+WOHVd/1Qp9WXpEl8m\nwl4KzNJ1PQIcUErtRlrnrDq+aZr4Mjw1fDgA96xdy+ynnz6hnr5Zv/kNKUDpQw9x1rp1LPv1r1n0\n7lyKgjCwk3GQF4nr1BB93oYYQDXgAIT2QNV6sHugUw/k5zQLYikQqwRLA6gFck6/87dh6RwihWYi\nWLESwUmAutRkGnweGiemER2h0X3fIXqVb2Tb5OHUDRjKroBG69q1xEh8IfWWFnq8+CL9xo9n4fTp\n2I19+ooVPD98OBqSSWobP55rn3jiBK6aif8WHM+z9gOl1HXAWuB+XdebgC7AisOOKTO2mTgJUOvW\nARJ3GaCttjAApfffD/fdd8xj+w4elJqdBw8yf9gwPEiR49YYDIxAZTPkZiOJ7ltJlIyzIt0uayBa\nATU14GmCnG0QSLURHmQludFPzQGIlEOXNUABdO5eT3b5Gv4w7EdUkMc8LqKeDNZah1HiKuLKqrPM\nZwAAIABJREFUZXMJKCvBX9hI2e+l39/XwcfrCOyEKn+i/UcQqeex7+ab2YcUcXID5w6DlkgT8401\nA/B17nzM62PivxvHSpzPAb/WdV1XSj0MPAYcdcmbX/7yl23vJ0yYwIQJE45xOv+dMLRjQOItzzPi\nGReecQZR4HdDh6KA/1m//qjHPu/BB3l3xoy2Mpy68WoHquphUxQ+qYRBFuidC2SQyE9/E2gAWxr0\nyAR7F+A8sGdFsG2NCJtpEPRB617w6EAQLG6dkYc2UZ1UzpvpU6glm2WMJdnawpmD1tBJr0a3g54E\nKkPOGTUWfA2wdZ1EADQZ848ZfzZjnRZvEwE5nlbqBxyffMLu7dvp2bfvUa+Pif88LFmyhCVLlrTr\n2HZ51Q1V/d24c+ir9imlHgB0XdcfNfZ9APxC1/UvqOqmV/348bxSREmE2dz3ufV8VB1pTfmfo1zv\n55XCjZCRBSFNEG6Ml6XrCUwejrDRtUgBEDuwA9gIDEaqKw1DmHeFMeCHEAlArBvYuwFDEJYbBpHO\niubeDnbSi5/yCBZinMMiBvs2c3Hth2KwfBjYD1yBlC5aDr69sHi+DB9vcZRuXLYJkUYjxr2kG9Ms\nWLfOzEc38aX4Oq96e+M4FYfZNJVSuYft+w6wxXj/DnCVUsqulOqGtLNZffRTNtEeTNi0CdvNN1MA\nFADPDh7MvJdfbtt/yaZNXLJpU1vF998PHsz7M2e2a+yZRnk7DanK1pVE8fdyRHrDeB8+CLEWhCxb\nkEpKYWNSZwFjEZZqQFT6WqgLyp91AMK+ybTpP5YWnZRPg/TdtY+e7CGChR30YZnzTP6VO471Wf2h\nP2IzTaOt3J09DUa4oGDcKKJDh2JH/FQpwKgB8O1RcNkgGNG1bRpmEzYTx4T2hCO9BkwAMpVSJcAv\ngIlKqSHI83gAuA1A1/VtSqk3kGqNYeD7plh54vG4IWm2ItJfML5j0yZ2TZ/ORTfcAEDfgQMB+Jmu\nM+OHP6T+ySfx1ta2a3wHwnUBRFhMt4I3IsRZg0htTYg093wNnBeEPrWIyq4jlu1sYwA3wrTliBMp\nEzL3IGLflcYga4wbWQrKDdaBOinNXgZHPiNmVVSQR7OWQos9iS72MoovO0hqpVcINxWoAr0Byhcs\nZfz48WwbPx43MPBS8IXB6oL0JGAtRELyQwDQaewwgh7Y/+F6+gz5YsqmCRNfhvZ41b8sGPClrzn+\nEeCR45mUia/GnGefBeSD85Co3BZAVIKU++9vO/b3BnECqKMMT4pLqSDtg0MREQwP8cUvjQOxVzZ+\nAJ5NYHMjldfTjAkeXmo+hhDddIRgZ5EwTAYQ6TQF2AfBsJ2IxYKLADbCaMQIYaeOTJYXDCe5s5fO\nlnLcmo+shhas9VEOt04oQH0GGTmgphsT90Jpxlnk3/Mcez/+GO3+O02x08RRw8xV/4ahtaqKeCfh\nDETiLCPRg6z5scd4+rHH6PzYY+hbtrSddzTcEO+AqRAOq0AkzbjdMBPx4Fcbx/RGpNH9UehZAREb\nuAYjBHkI2uKBfMBeYzKDZVv5++CtFG7VgU4fIZ0pvw2uhhAXj/uAHWl7eZkb0FH4cRJFY5FjInZH\niL5sI5cqzipdhSpJ3MNtnyTiPI/ALRC3aDYePEBmNijzKTBxlDBz1b9h0KGt2VonRFPtCfRB8smT\nERIq/cMfgMQH3OmBB9p9jfO3bcNxxRVgXAvEb+MlQZ5BRNK1ArsRYg1r4M4AR7x/uWacGEOkyibE\nvuBDOk7uAFuTkLDFuLfyEJT6jEH3wCGtgEbSyKeUJLxYiRoF6Z0EcNBIGv5aD7b9UZngUTQG6nfW\n2exbsI2987bRtY/pWTfRfpi/td8wxIkwC+EkEBOiBgxJhVI/vBsCKivpivhqmoHa3/2u3V71Xn37\nsiQtDYVwnpGK3kaacYk0CSFpOzDIAxkuUOnGZMoQNh2KwYjGROJ9iUshGhKJ2eKERkOVj+rQEoTW\nQ+DJhsGWjRTjwkaISjqzjX5EsRDBSgwNL8kEQw6UF/RWjkq0TkpKIskMRTJxDDCJ8xuEP/bti6qt\n5fBMbQ2R1qxId8ouXeG7qUAd1O4TR3caUnv40b59GfCzn3HRd78LwDMGacSdS26E1yJAemUlPsS/\nE+dCh7FfB9IUpFgg2ehgZvGBzw+eOhLZRDFEwrSQsCXEY4K8oPxgt0EseqTqEwMiGsQckHzAT3JN\nkAv8Swjk2nn2jExKKMSND42YkGiqVaouWyD99utYOvYczvrzX493uU2Y+Ep0aHWkxwBt0iTu/fDD\nDpnDNw2PK0UyCRudCyFMG5CeCWkZiFEyB6iDqlXCWwsOG0NDuMtJgsuSjdcWY1sM4bruxvYuxjW6\nOKApDKEYZLrA4wLbcGOwXcZJ2carE2HiMcbAuxEGbjYm8QnoPqioAW844YwKItp2j+6QMhyYjAS7\n7ZMJVf0qlT1p3ZjDVKxEcBAkmRZu2v8qWesb4GewftAkhr5hfqdMHB9O20LGdhKeWxNfjzefegoL\nYtfsoomk5nGCLwBJhaAdvpA2IBcyL4aMSrg6DDhg9WohqAMIQXpkMynIdp9xagjhPAeSUekBMpLB\nkwR6M4QC4LKD1QFt5ZgGGydYkA+12Rj0n4htMx9hxTogDFEvRHxgj0GyBi0xkWQtgNMGSWcizJ0N\njENE5+2Q+X4Lrd3qSR/dgIUoNsLYCLMnvxCv30XX9HL67FrB9vXr6Dt02An/HL4K6+89l4z6gxCA\ncAN4D4I9FzyTjHWphOaDsH6rLM/YK6Gi+ComTD/57aBNnHh0KHHmAL6PPmLtsmUMHzsWgPdffbVt\n/8jzzyczM7ODZtd+/OvNN+nUtSuDjaIbJwP+ujpygSIb5CRDkw8cDnC4EWaLO2JstOm9VkP3TusE\nROC8Xgh5WSG0CVp2gNMBSkkwenpEPOitiOd8eLzXUCoilmZDqpWESGpFPOcpJJq42aDNOBpDgtRB\nbAUNxvXDEAlCNCoedIBoK4RjkOkGdzJoRUj6BCSykRrBao/RXZXw4CeP0ZCWwnsDzyWAi0pbDlo+\ndO1ZjnuPj3AwHv90apDpO0BRaI/8WPjh0F6I7ob8QWBNBd6B6lpIapHjixT0Dj8EWx5i6YE7OOvi\n507pfE0cHzpc4owAS6+8kk+dUqLCsncvIBJR51WrTnvinPePf7Bl+nQy7ryTj267jVhTE7dv3EhS\nUtIJv1YtkBsGLOByQDgImgMscZ3dTeITVcgCZyE6vUJc5A4gALYBkHYGqCyksvsuiHwoqZQBoDgV\nHDGwOoEiJHA9HpcZF01tCMv6EWKN52XG88xCCKlHEQk0RJuR1KJBTEGzV3aHdDnFkgyWLETSTEPs\nBBEkPy0I3uE28EDSljCEMaTOEH6clCd1ouQP2aR4vXK9Uwjb/1vEx4tmc/by+2W914EeADYDYWit\ngVAQ+gHJOWB3I+tWTyJ0wcQ3Bh1KnFZEWKGsjADyAMXjpaPA1vnzCXi9jD7nnI6b5Jdg4ezZhAMi\n0Rz88EOIRvHu2IG+cydaayux2IkxQMx75ZW26JrhV1zBkoce4iBQXw91MejVG5H44qSVdtjJdsTt\nHZcK7QhxRYF0iV20ZCIP7R7QBkO3rtDtAFAJeiOoGNALIa98Y9xmOR+grQJIANGz44ZKzfizI2Qe\nMo6Jly8KGcSpCWHGEJOowwGefsb1RkK0i6KuwIOuFNrIKFGsNJAO6BQMr0AnistwElmIEdWsHMwp\nJCnHSycuYfG6cUwcNve4P4f2IC+/gP0ZnUSNyoCCMyFQCnVLjWIjGqS5IP9q2Y/DWLO4ZG7iG4UO\nJc6JNwEarHgP6ivluYr/WYDmX/2K9Rde2OHE+ccxY4hWVXHz6tWsWbCAbTfcQHo0ShLCIRmAfeFC\nSjhxz8CbTz9N3b334tR1AsD+9HRsCBemFUNyvNRPCkKY8VSiOOKVimwkvEjJiFjnQJiqk/G/B4mB\n3Gscn0qiikc2IrV2R6RLjJtUxv64FFplnBv3OCnjGpqxrRUhTeP/aBRiMUgyTAW6DrYUJJq+O7T0\ndeBNclFCARGsRLEQQyOGhkLH606WGpsodBJRSFE0IlgIG8efSgyZeDllWwrpYi+B4WBLgtBumVxW\nH7B0RcwPTtgyYSVpmTmgYMCg5K8f2MRphw4lTncXIAiTrkYexoDMqGoDNDZARQzYNZ+ZD/2SpMJu\nbY/Bvl/+Eg4caKt00+mhh0guKAAgq6iIUSewPN2+3buJ7dyJamhg8WuvUbt+PSoaxY5wVhR5aDUS\nfHO8mPf3v1OzZAk2XceK8Ju9qYGkAjj7bLmQpRGR/rIRVToeJxRHPErejhCnk4Ta7Db+4gWJ4/FG\n/WkLF1LxG4ur/2HjGJ9xTJlxs50RQv4QIc9URMKMR+ofJFG+KU62EZE4lVVIU7OC7Vwkkv+7EO5k\n4UBaPl6SKCOPsFGXSSNKJvXYiNCkpRLFgpMAVqI0kYqVCFGsRLChoaOdYlHO4/HgeeBg2/8WpM7J\nl2HAKZmRiZOFjm3W9j7ycLUgD2OF8dqMPHhBIAB/fRuqG+UZhoTzNs76YRJhNNrUqdw+e/Zxz++D\n11/ns5/8BEtrK7a6OnQSwhSI86TYmOaOz83BV1BAwa23ct2DDx71dd985hma7rkHi66TitzjWDs4\nB4P7XBKSpKHy4kIWJK4Gg5ClhYTEmWK8OozzM0kkucc+98dh58bfx9Ml/cAioJFENHw8VzJOlnHb\nQlx1aCRRUukwW57eapybBcRzyXPBO8aKz+1kp6U3AZw0kmoQYQwLUXKoxIFUitdRlJJPACcaUexG\nPruTAHmUsW/dmUwa9tZRfwYmTMBpHI5EPvJwxe1fnZGHLP4Q1gJNcNMNyANcC3oV1OyDoAWaNTl0\n5z4IBIzq32++yetG9SAefpjuY8cy+ksk0P1797L5448pW76c9F698GRlcc6VV+LxiL4b9HpRJSUo\nhHPCffrgMTz/ra+9RsDvp/Fz0493U0yeMIFoOEw4HMZms33h2l+Fd196ierFi0nWdWzGeE7A1Rus\nnUlIf1aEBCERaK6R+DTjAejxnMi4x9tNQvKMV0FuNdbZb6x5PDA0k4RDKYJUL6riCAePoSvL+HHy\nViQC3v0kCmHGtyPvVVdjPjchv0DJEHVDvTuNVouHEHaiWEijGSthhpVtIaW+VcKbaoCLIdjLSmP3\nNCOH3U0EOy586ChDtT+K/EsTJo4CHUuccV037hGKh7HE3xcYr/FQltmgwtBpNAnHh4LamdAQSFRD\nj/Pv1p//nIarrvpS4ty+YgU7br75CEHtjMmT24gTElKtAqKlpUx55BGys7OpfOghYrEYswcPRq+r\naxPW4m0bbn72WTRNw2o9uuUtu/VWrNEo2Qh3jUoGaxE4z0LU4QyOJK24/TBus4gvgOWwfRYS3m4X\nCUmyxljTjcaYcak0TsLxfkIxhDxLjes64wtCQu1XJDKE4uRuhD2RzpHieLxe3RDEVGDU4vTnWQg4\nrDRqafhxoRHDQyv9GvbgqfBj/12Y0H6o2wQ2O2Q5wFYbwVXox291Uo8QaBfDWBLESYT2/2iZMHE0\n6FDiDKaBJSa5yiruQIiCbqPtgdetEMlR6LrClh9DayERK1gv55zrQZhSAQ1QvUJ642h2qPTtY+4L\nL6CAPT//OdaqKpIQbuhpzKMeec4/mTmT4jFjGHnWWUAiqiYG6F4vuuEtzzV61aTccANNq1ahL1sG\nAwbgGjMGAJvNhssVZ6j2YevGjVgNSVPDEA47g5bBkXaJePPwuLQXJzCNhJp8eNnpMImk9gBiFvEB\n85EK6iA/Qv0QUvMZa7nceO8wzs8hET8WHzP+OWmIyh337FsRaTNEm02TGOxOGkjPZzcBsHLedxjd\n8y0imRC1Q11SKn7lJICTGBqZ1JHi9ZL5RBNsgdaPIOCH0vn/YsTkyWBcdsjXrGn/Uxf/buK/DB1K\nnI1JKWhEcXhCaNEYdk8ULWZodMaDH9Mg6NGIaFaSFofRamMwCZHAOiOs5kbUzb2AEzqNBOzQLRV2\n7FjN/FtXt/GIBegmu/GS8FvEgJIHHuCg282itDQ0nw8PCQ0z5brryMrOPmL+Nz72GD6fj+amJtwe\nDykpKce8FpvnzcMSi7Vp053TwGqosKQj5BYPPI+nXMUlzLjx1XHkmG3qehpCml5gu2T/VM6GYBjy\nuoA9k4RHvAUhxjghHj5m3BxuRRbOT4I8c5HPIf5/PPWoC+xXvXHfupj0wyTwPme+yLp938dbVYbb\nlYdr2G2EseMzLNkpNMtnvRfwwWcvzKR43NkMPs3jek38d6BDibNJS0ERw6aF0Ww6NmcYhY6FGCGs\nRnSeRth4H+rRii07it41gpYcwxUKocV0bFk6hEE1IGRiSKJs4/+3d+5RdlX3ff/8zjn3OTMajd7o\ngR6AERDMy4FIssw0dgxubMijfjWhYMd2E9ctbdMU7KzW8nKbQNYK2CvUWU5wakJJwG3qWl0rdjB2\nh6eMiS0Z8xIPWwJJ6DWSZjRzn+ec3T/23ufcERLo6jXSzO+z1ujeu++5956z7+g7v/17bVa+3f6k\nwyBbQFqQbLeVK6PDMN6CzU0bj9oFpLUaaa2WNc8ACG+4gcXXXEMQvDG9pVqtUq1W3zB+LPhV7lnn\nQF8ZK5AReZDH+ys7/wp4J+yhCLlPcwRb6z0CW74Eu0Zzl+gCb1VuJV/a+xxQ72gNyS1I391oB9Yi\n7Yzc454rYZfhBjas/Aar3v3BN5zezIEBrrjiPR0jP+OZ5zdSGNvNml+8xg4tA1wh2eo3nzpFOaVM\nqnCO0UtASoG2FVBil6mXYAhICDEIbbc23/uuojMwa5RoIWFKmCSESULQUWqYOTkDd7sNgn5sDt0w\nhBshbNlMnuoo7G3mzS8WYfXAVc4xArz/9tuz5fmJ4E9XrEDqdbsd+c038xHXK7MCLBRYtB/aLTAp\nyFJ3PT6p3ON9j96X4EW1M/TfJq8b/y6YF6FVzwuIMnzqkFfTEtZKrZCb5JAv0xPyoFGRfPL8xHnx\n9H7Yo2TleReTJMlbH6gok8wkC2cPYSachgIttzROiN2pSZbiTHZbp0KTEq2wSBgmjBebiEkRl1rV\nliIGoTwrpthq07OjjoxA8BxWXC7D/ie/DHpiuHADtPbD7q0QJzCS2JVtjP1/P3TPPaxYtYorr776\nmK/1mU2beGHDBlZcdhn9112HabepffWr7Hn4Yb7Z38++H9o97fYaaIxB0Ie1uM4mV7nOzDFvgWZ5\nWOTbUIK1GFvAZmzO5TNA0zYDqZC7R0MfRCq5nxXkiesB1lXghdX/NelszjmD/LfIV8IAVOGVsQtY\n9U/eaG0eiSiKug6oKcpkMKl5nN8xa7MON4cKZ74etUt3gIC4I/5h3D40CSWaExJP2hRcInREJa2x\naGwn4W6INmCX8C+42+VYsdgBbIf6d6B0PpgqtPfA8HPwgoF/BMJKhaS3FwN84rnnmDNnzhGv7Y/O\nPZdkdDSL4zQBU6/TOzbG7Ftu4WO33QbAV8tlTLOZBaATd/upmyFYAMGlbtAvkb0F13nre8H1YhXR\nl12OuuceA162P6YEO8Zg78v27YohXLgMxGB3ZFvo5iXA1UBiBTrG5mN6N0iTPELvihZYSF51NAC8\nA14ZvYBz3v3cEedJUU5nTts8zlH6AUOVmhPQ3FnXoJwt4QNSJ5Qx0lER4selwxSzlpTtDt6gjASG\n/TMGqMyos3BgN0FsCEcTSKFdLELNUNzYIlqUUjHO1GwAfTBjESwJIWlCWKmTluvs2wffu/tulq9e\nnUXfO3n2Jz8h2bEDqdezUu3l2G5q0e/+LstW59668u/9HmNPPkm0YQNFnOugD8JRkAtgwt8PX8lT\nJv/WEvJk9hZWPP0eFA2swG3BOm/7rHA2N0E5gvPXYoWuj7zsqYV1Z5TIl+6umxEt8v0yylghPYhN\nTejFRtUDbJBoAJ6o3c/qd3/4LX4DFOXMZFKFs0GJgNSVLJqsDtn7NqvUCUgInILEmWXaPmJqs10t\nhk44bRK1YGhToDLbri9L81sEGEbpQzDMuGiUys4WxUZC47yIwk8Swu2GvkXQtwfe9hK2Rm6W3Vo2\n3vpZfvRQmeEHtr2he9MzQ0NU6vWscVAD6zc1wPV33DEhTenGO++kXq9zb38/abvNXuDjF4DEWMWt\nkVdR7cYK0zKscPl9fbwvsUAebfcVOzV3Eq6oQMZh6SC533GAPAremd7kl+jeX+kzF8pYkTTkAnsW\n9rfI/8GZCVs4j3es+vUjfe2KcsYzqcL5GkuypTrYoI8VThsYSogISGlQJnK5N20iKtles8b1rGgi\nGFoUMAixu00IiWizmO00KVGnQoMyTUoUadHHQRqU2c08CgtazPncMDMY5ZzerYQHUnp31JEaNNZE\nBEsMxZcTojGIxmEJDb73l3/BslWr3+D79CtWHyvZis0EWv+Vr/Dhju17ASqVCp9qtbhr9WraGzYw\nEsGANcSthbeZiQ06fKjfC1oPVjC9L9IXy/tje7EWYwMkhHAuebu5mNxK9ZbsPKxwtt1xfunvt7b0\n+wZlF0DeCzSwx6cHQorFToerokwtJj2q3hn42ccswC7BY0JSQgq0aVHM9tUeo5cq48REjDKDkJRZ\nDFMgoUWEceaUYCjTICZiHwPUqdBDjTolEiJ6GGcmB9x79lCgSJE2I/Sz7X2LCUmoJA1rDQe2/vnc\n5sv0HGjSe0OLs3fB/G9/jqfuK7P/kR0MDNhea/NmwfU3QVCAtAhmGBiGe1f+a675nd854lw0N22i\nArz4Q1jwY5j3KlR+GVs9NRdracbYML8XTS+oPjHdN9GAfNN1349zkRvz+aBj7riKe/0MrDAWyFvE\n+ZQmn5bkhHFCXbs3/V1F0aO77+aSq44+IKQoZyJvKZwi8jXg/cAuY8zb3dgA8AC2L88W4EPGmBH3\n3GexFcgxcLMx5sEjvXezIykmIKVEAwFG6cv8lAkBgRPXhluXHnS75KTOMq1Tcb7PhIiEMg2ElDoV\nQpIsqdoTElOkxTYWExNlJX4HmUGRFj2ME5LQCMsYoEibNgV2lhcwf8YeCr8eU/pvKaVRWBI2ePLy\nWZjPfYnRGizd+TDlg9j2aDOwzs0xOPjsszx4zz2sfOc7efGxx7KsofNXr2bzE0+AS0+KY2jEYGZC\nciGEvqyxs0rHJ8L76tDOiLrvf1nGLtP9UvoSd8x2rCnsSzHnkbeZS7F+y5hceL1F6mvkPT79yfs+\nW/Dzg29j7fuP/MdBUaYKbxlVF5F3Yu2Tv+4QztuBYWPMn4jILcCAMeZWEbkQm7L8i9gWHg8B55nD\nfIiImH9lbs8eh6SUaDqpNB09GCVzv43RR0LgKgpttL1J0UXh7cI9om1zPF1eqA1AJx3R+JSow0fa\neZw9j5iUIAs8+d0UKzQISFhstjGLfVz67POEr2OFYy8k/x3iMSi9C7tO/w2suPwF8AT8YCY8/iDE\n5TKFRiNrcoR7PILVoQ+EMBBCz9ch+QCUN2HFy0fS95N3SPKbo/mGHZDvIrkb6+esguv9a32QO9wx\nIWQNPv3rfU16Ayu4PhHeN/HwPT8jSGZai7rwCjbS3gM/H38by6/ZfNjfI0U50ziuqLox5jERWXrI\n8PWAd+zdAwwBtwLXAfcbY2Jgi4i8BFwJPHm4907dxwfELtG9CB3BHyuO7jyAHsYgi7MHNCkRkrhH\n+ZI/JSDsCDb5ULN1ARRoUcyi8TZnNKFCHbvdrD2nGCFwQaXAfSLAiPRToMXwWf309NQJGwmF2Qnh\nIgiLYK6CtA9as4qU0xayGLgcFjXgHZfBz19rsPxcCNpQaMBzWxtZ9L0E7Eldh6UGNo2os8zRL7EL\nwEynhTOFNITyuCH0y2svin57yhS7xPeNUzrxCe1Bx+va5Mt2bxr7Jb1r+xc+5XqCPgK04PFP3cea\nX/3nh/uaFWXKcaw+znnGmF0AxpidIuJb4i4CNnQct92NHZa2C/4YIlIMqbM2vbXXiWAo0naiaCPx\nJZqMMIM2ESUXYBJMFhwKOwQvICVyifUmk1kfXvIyav2jNshkSQgzn2uIYQvLeI0lbJm9HJltCIzt\n4rP20kcp0WRvcQ77xfo7+xlh+ft2EL4GS/4ellwBa1ZC5JuS/BSuWA2k8Myr8JMNsNFAbwIrHofC\nPKyijkPyTUjvAy6GwuXAR+1ztWoZISWMm6Shre03vksIUKq5KL0POPmcUB8xh4kW60zygJL3oybA\na+52GzYA9QpWjJ+ArYvO4aprPnSkr1lRphwnKjh0TFn0P1j3PeelTFk0uIKFg+cR0nZiZiaIqHXt\nhVm83aYwpcxhGMDZnOL8ptYn2bmMj0icFuSWt+/OFpIwRq8T2zh7DUBMSIAQEWJcqlRCyJjLyxmQ\nA5RpMFLqp2DaDAezGaEfgzBGL+XZbeYGw5QuTmEEkv6I8f4ClVqT4tKUQgjsgMCVNraxLsixBvR3\ntGOTtj0mdr1K0wqkVahJ1VrEVYMYQzuMCExKoR0jxpAUIIxTCm1bNSQ18obCAfmWFr5R8dPkDYZ7\nsF2RDNaT3SbrAxA/AunrtgMVgWjFj3LGMzQ0xNDQ0FEde6y/7btEZL4xZpeILMB61MBamJ2LwcVu\n7LBcvO5652NsuRQjm6+ZEBKSkLrlsskaQOZll/lS3ppKxtpdHVZjkdS9Tyd+H5r8aPt+3hK1aU02\naGWX7tZZUJ9QtG0DWH7pv49Z7JU5zJQDjNLHQfqyuvst85bBPIjfFpGaAAkMbSlwhfkRvWaMpet3\n0PNii/6dtrryadyeauuxDpAvAudBMBfMB6E4F8xi2LN0BgeLttY/JOag9JGKOF9sSrNQxHhfbSml\nXG8SpHbnSimQVwL5UspXsSLqLU07qdYn2sJal853avZBezu0WrDxjrv5pd/6rSN9xYpyxjA4OMhg\nR+/eL3zhC0c89miFs7PDI8B64CbgduBG4Fsd4/eJyJ3YJfq5wA+P9KY1KhRpueR3awZV23ULAAAO\nyUlEQVR5oUsJiIhdWpJQpe1svZjA+UGBrCmIuNcUKWT5mz6RvjPHU5wqGHcvQGgTOSvWOKszyZbw\n/vKN+xH3TEyEYNy2DSlFJ6wj9HOQXlqUSAkoSZMKNSLJz71NgWGZRVsi5p+7l8K1LfpfgaVVKC4F\nsx8qB7FBmq3YpsMRyGyoX1ykvrTE/mgmNamSENrKK7EdjgvEJGJTufJyVUNaDTFGSKI6YTulPM7E\nfMwq1se5zT32TUR8f86xiY+jEF4/fwWDb5JipShTlaNJR/obYBCYLSKvAp8HbgP+p4h8HPtf+0MA\nxpjnROQbwHPY/2afPlxE3fNA8zey+zeV7iMipuq6R9ggsmTBGrDVRWFWF2TfNnTSGpA4sfANyvPt\nuvzrvDUKOHtQ3LuFLuRkhaeRWZw2FxRsCWgnTYokROxhLhEJVcZJCBlmTofAWoH3yfYhCb2MIRh2\nsNAm+O81FF6A1n8eYPw9s1gUjJGYiMpL22206A7gdRhfV6B2YYmNwaU0gjIVasxiPxWX8Z64a/Pb\n5/psgJgQASpxjTBOKdVTwhb5En0Ym9T+IlYgI+wS/oC79Q0+9rjnX7LPRZFrEKIo05CjiaofKVT6\nnsMNGmP+GPjjo/nwUinP4/xbPj7huY9zF8sfq9IXVxDg5cHaBP9k4BKWrDA1SYhoEBI5qy7vlJav\nO3003qYtGRePlyz9ySCMU80i9b4XaEJIIYueWKIsxSmP1qeIyyHNN6z1FrFF3L8myzUdXjJAa22R\nA+fMwBQDxrH77aRFML2w75qZVthCw97I+k7LNLJy1MRdj7dwK9SJiF1Wa0CBFgUTU2ylRK2UyOdp\nuo3wqLnbNrmn2jcWMeTL91Z+KwKP/9lfs+ajNxzN16woU47J3eXyTT47jmPCMETEis2/579SIKZE\ng5CUiBYFF8gp0aJNRINKZnnaZyMiJ1p1yhNCTXnIyZI6m7NFyQld55aNtpVdREzFWcRR5o+VzHXQ\nmQng3Qp+We/9tlVqRCQs4+dUqWUVUU1KHGAm67mOHSzkXeYR1vA4s2QfVVPjskdfwMwW/vGii7L6\neyvPgXNb2IBa0Sme97GWaFI0LeaMjFAcT5FRrHB6C/JlJm6oBj5pNt9wzW/dbODR677Gqt/8FxO+\nG0WZipy23ZHejEOjtHfwhxMe37nhT6it2sn8IbtD9fbBF9wSPXQWpd231l91j6sxNM4GbFOgTYEG\nJRfXt0vaqHMPWydOEBCS4JuFpM7G9Mtx05Hy5H2jQp7oFJDSpuB8rUViUkbop0mJktsXfJjZ7GEu\nw8wmJWRMem0NvRNkiYCi9cH6a/TnmDprMyVgG4sxCEVaRCTMZTezGAa3j3lmPdawyfQlbATdbx38\nOlm9++uFxZz15dcmzPva7r5GRZmSnLbC+VZcElzOE3yHGwf/JQD/hd/Hbwjryy9t0Mk+ipwFlmY1\nR4GzOO1j75f0kXRxPlFbRWQyy9UvidsUnNza8ZiIgCSz9FIXpPI/I/RPCCLtwe5f1KRM3TUe2c08\nfoFnCImZwzDDzGKAfSQS8ONVKwFcmlXJ5bMmWcL/bubRokiVGhVq9Dgf5wxGKNJmtK9M1Jsw0Gha\n6/F1N5ErsLtnus7Nj8z5c9Zc80lEhPmn5JtUlDOP03apfqx8acNttFZtzyzH1HlDI2KKtCnRJCXg\nAP0kFKhTdotqm5zkb4EJkXRrKYYuiSnPM/XCGbrlvc0SyAU8djX3PrfTIBRcninYoFODMr2MUafC\nUrZSpMUA+ynR4GxeJSJmscvqqlPJ3hNsFH+cniwINcB+CrSZwQghCcuar1JstykfIG85l2KFMwXm\nwZ7xecy9YtcJ/y4U5UzmjFyqHyu/IJfwAi9nj9tEtAkJaFFwKU153RCZJRoSYwgRihSoZ+LkvaFl\nGplYAVl+p7c+fXpS00Xf/fv6LUCKtAhJstd5W3QGo4CtVqpQp0iLKjVibK+3cXrp4yDj9GAQGpQz\nN4MNChWJiDPBLNLMzlmMoXqwTdjELstjsm2UH67/GVf/ymcwxjBXfZWK0hVTTjiXzl3O/qFLkMHv\nZNamrSYypIS0Xa16lTopTWrYXMgmJQTboQk4xJIkE1FP7mFMXDlnPEGQfQaA90cm7vVeOG0WaZgF\nh6x1mmRBKt9dOHZbgPhleY1qFun31qv/g9BJ5Kqrwrbbs74AB5oDzLxqH5A3GtAAj6J0z5QTzvPO\nWcl556zk79JvZ81C0iDI0otsZLye+R5ttD3KUobs0twGerwoBRharujS9vz0eZ9p9nzbWai+IikX\nQEvDRfV3sBDAJsV3OAkiEkpAkZiYAr3UKdGiRZG623tXXPDJuhTsUj9wPlObVoVrq9ekmtYIDxrk\nrFzMZ6Ioyolgygmn5zeDvwfgxZef56fbvoeVHXFWoWG0tIPSqpdYPnQhCSHbF/yMhTvPYcv81zh7\nV94M6meDz2P3SbMCFHV0xxAXHAqcbWucWFoPaOhCT9ZK9b7VWQxngZ18a2ST5Yx6/Hv5vFDbCSom\nJnLL9DxijxP7orNeATY/+p9439WfPplTrCjTlikXHDpa/uHxb7Ljqgf4WHQ/AF959E/59Nrf565H\nv8xn1t58xNd9kf+QWYrg8zltGpMNFtlxX/E0RnWChXqoRXponqlngH30M0pEC7t/UhW7JVDgsgcM\noUnpScZI6gU+3Pd/TvgcKcp05s2CQ9NWOI+Ve4e+nuVvAgxXXyO+chcFWs4bGeM3jMtr5IOOV/hU\ndfsu3kK0QZ8iES0MAb2M0ctYFpTyvljB2Br+Hy1m1sHz+ODgJydlHhRlqqPCOQn874e/zsGrv50F\nbXxQyGM3pIsyS/XQSqZdzKNFici12UsIiOMCX4z+6JReh6JMV6ZVOtLpwjlz386LQ3kZpq/0OdC7\nmdI7trrlfpL5On1XJl8B5Bt0nDt0IXkjvQAGJ+mCFEXJUItzknmINRgXGEoJaAx9gH82+G8n+7QU\nZdqjFudpTG3otwEyH+jyWZdM7gkpivKWqMWpKIpyGN7M4tRWtIqiKF2iwqkoitIlKpyKoihdosKp\nKIrSJSqciqIoXaLCqSiK0iUqnIqiKF2iwqkoitIlKpyKoihdclwllyKyBbsrdwq0jTFXisgA8ACw\nFNgCfMgYM3Kc56koinLacLwWZwoMGmMuM8Zc6cZuBR4yxpwPfB/47HF+hqIoymnF8QqnHOY9rgfu\ncffvAX7tOD9DURTltOJ4hdMA3xWRp0TkE25svjFmF4AxZicw7zg/Q1EU5bTieNvKrTHGvC4ic4EH\nRWQzcGjLoyO2QFq3bl12f3BwkMHBweM8HUVRlGNjaGiIoaGhozr2hLWVE5HPA2PAJ7B+z10isgD4\nf8aYCw5zvLaVUxTltOWktJUTkaqI9Lr7PcB7gZ8C64Gb3GE3At861s9QFEU5HTlmi1NElgPfxC7F\nI+A+Y8xtIjIL+AawBNiKTUc6cJjXq8WpKMppi+5yqSiK0iXaAV5RFOUEosKpKIrSJSqciqIoXaLC\nqSiK0iUqnIqiKF2iwqkoitIlKpyKoihdosKpKIrSJSqciqIoXaLCqSiK0iUqnIqiKF2iwqkoitIl\nKpyKoihdosKpKIrSJSqciqIoXaLCqSiK0iUqnIqiKF2iwqkoitIlKpyKoihdosKpKIrSJSqciqIo\nXaLCqSiK0iUqnIqiKF2iwqkoitIlJ004ReRaEXlBRF4UkVtO1ucoiqKcak6KcIpIANwFXANcBHxU\nRFYeetzQ0NDJ+PgzDp0Hi86DRech53Sdi5NlcV4JvGSM2WqMaQP3A9cfetDpOimnGp0Hi86DRech\n53Sdi+gkve8i4LWOx9uwYqooyhTj7x5ex+yrv80e5jJODwvZQXlPzLvmbjjs8Y/e9UnWjt7No5f9\nFWvf97FTfLYnhpMlnEfF0NAQ69atA2BwcJDBwcHJPB1FUY6By5fdwPCm99CDYBACUqIwgrmHP37x\ntX/ApuHf5vxl55/aE30LhoaGjtrCFWPMCT8BEfklYJ0x5lr3+FbAGGNu7zjmxH+woijKCcQYI4cb\nP1nCGQKbgXcDrwM/BD5qjHn+hH+YoijKKeakLNWNMYmIfAZ4EBuA+pqKpqIoU4WTYnEqiqJMZSal\ncmg6JceLyNdEZJeIPN0xNiAiD4rIZhH5BxHp73jusyLykog8LyLvnZyzPvGIyGIR+b6IPCsiPxWR\nf+PGp+NclETkSRHZ6Obi8258Os5FICI/FpH17vGZMQfGmFP6gxXrl4GlQAHYBKw81edxCq/3ncCl\nwNMdY7cD/9HdvwW4zd2/ENiIdaEsc/Mkk30NJ2geFgCXuvu9WB/4yuk4F+76qu42BH6ATdebdnMB\n/DvgfwDr3eMzYg4mw+I8quT4qYIx5jFg/yHD1wP3uPv3AL/m7l8H3G+MiY0xW4CXmCL5r8aYncaY\nTe7+GPA8sJhpOBcAxpiau1vCioFhms2FiCwG/ilwd8fwGTEHkyGch0uOXzQJ5zGZzDPG7AIrKMA8\nN37o3GxnCs6NiCzDWuE/AOZPx7lwS9SNwE7gu8aYp5h+c3En8AfYPxqeM2IOtDvS6cG0idCJSC/w\nv4CbneV56LVPi7kwxqTGmMuwVveVInIR02guRORXgV1uFXLYXEnHaTkHkyGc24GzOx4vdmPTiV0i\nMh9ARBYAu934dmBJx3FTam5EJMKK5r3GmG+54Wk5Fx5jzCgwBFzL9JqLNcB1IvIz4G+BXxaRe4Gd\nZ8IcTIZwPgWcKyJLRaQIfARYPwnncSoRJv5VXQ/c5O7fCHyrY/wjIlIUkeXAudjiganCXwHPGWO+\n3DE27eZCROb4aLGIVIBfwfp8p81cGGM+Z4w52xizAqsB3zfG3AD8X86EOZikSNq12KjqS8CtkxnV\nOwXX+jfADqAJvAp8DBgAHnJz8CAws+P4z2Ijhs8D753s8z+B87AGSLBZFBuBH7vfg1nTcC4udte/\nCXga+EM3Pu3mwl3b1eRR9TNiDjQBXlEUpUs0OKQoitIlKpyKoihdosKpKIrSJSqciqIoXaLCqSiK\n0iUqnIqiKF2iwqkoitIlKpyKoihd8v8BCZX5mEjxHucAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig, ax = plt.subplots(1, 1)\n", "ax.imshow(elev)\n", "ax.invert_yaxis()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## The `metadata` Element\n", "\n", "Pulling the `metadata` element out of the BAG,\n", "and getting it into a form that we can work with:" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "\n" ] } ], "source": [ "metadata_node = root['metadata']\n", "print(type(metadata_node))\n", "print(metadata_node)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As noted above,\n", "the metadata is a collection of single characters in the form of bytes.\n", "We need to collect those bytes into a buffer and parse them to get an XML tree object\n", "that we can work with in code:" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": false }, "outputs": [], "source": [ "buffer = BytesIO(metadata_node.value)\n", "tree = etree.parse(buffer)\n", "root = tree.getroot()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we can get a somewhat readable rendering of the metadata in all its verbose XML glory:" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", " \n", " 2db1df98-90f2-4e20-a91e-6089111e2f5d\n", " \n", " \n", " eng\n", " \n", " \n", " utf8\n", " \n", " \n", " dataset\n", " \n", " \n", " \n", " \n", " dillt\n", " \n", " \n", " CHS\n", " \n", " \n", " MDH\n", " \n", " \n", " pointOfContact\n", " \n", " \n", " \n", " \n", " 2014-02-07\n", " \n", " \n", " ISO 19115\n", " \n", " \n", " 2003/Cor.1:2006\n", " \n", " \n", " \n", " \n", " 2\n", " \n", " \n", " \n", " \n", " row\n", " \n", " \n", " 337\n", " \n", " \n", " 500\n", " \n", " \n", " \n", " \n", " \n", " \n", " column\n", " \n", " \n", " 448\n", " \n", " \n", " 500\n", " \n", " \n", " \n", " \n", " point\n", " \n", " \n", " 1\n", " \n", " \n", " 0\n", " \n", " \n", " \n", " -13804000.000000000000,6075000.000000000000 -13580500.000000000000,6243000.000000000000\n", " \n", " \n", " \n", " center\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " PROJCS[\"WRLDMERC\",\n", " GEOGCS[\"unnamed\",\n", " DATUM[\"WGS_1984\",\n", " SPHEROID[\"WGS_1984\",6378137,298.2572201434276],\n", " TOWGS84[0,0,0,0,0,0,0]],\n", " PRIMEM[\"Greenwich\",0],\n", " UNIT[\"degree\",0.0174532925199433],\n", " EXTENSION[\"Scaler\",\"0,0,0,0.01,0.01,0.0001\"],\n", " EXTENSION[\"Source\",\"CARIS\"]],\n", " PROJECTION[\"Mercator_1SP\"],\n", " PARAMETER[\"central_meridian\",0],\n", " PARAMETER[\"scale_factor\",1],\n", " PARAMETER[\"false_easting\",0],\n", " PARAMETER[\"false_northing\",0],\n", " UNIT[\"Meter\",1]]\n", " \n", " \n", " WKT\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " VERT_CS[\"Unknown\", VERT_DATUM[Unknown, 2000]]\n", " \n", " \n", " WKT\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " BDB_92B_500m_WorldMerc_2014-02-05_extract_final.csar\n", " \n", " \n", " \n", " \n", " 2014-02-07\n", " \n", " \n", " creation\n", " \n", " \n", " \n", " \n", " \n", " \n", " dillt\n", " \n", " \n", " CHS\n", " \n", " \n", " MDH\n", " \n", " \n", " originator\n", " \n", " \n", " \n", " \n", " \n", " \n", " unknown\n", " \n", " \n", " onGoing\n", " \n", " \n", " grid\n", " \n", " \n", " eng\n", " \n", " \n", " utf8\n", " \n", " \n", " elevation\n", " \n", " \n", " \n", " \n", " \n", " \n", " -124.003\n", " \n", " \n", " -121.996\n", " \n", " \n", " 47.9995\n", " \n", " \n", " 49.0024\n", " \n", " \n", " \n", " \n", " \n", " \n", " unknown\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " dataset\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " Designated soundings applied by automated procedure.\n", " \n", " \n", " \n", " \n", " \n", " 0\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " otherRestrictions\n", " \n", " \n", " Not for navigation, not to be redistributed\n", " \n", " \n", " \n", " \n", " \n", " \n", " unclassified\n", " \n", " \n", " Contact Pete Wills for inquiries: Peter.Wills@dfo-mpo.gc.ca, 250-363-6384\n", " \n", " \n", " \n", "\n", "\n" ] } ], "source": [ "print(etree.tostring(root, pretty_print=True).decode('ascii'))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To get information out of the tree we need to deal with the\n", "namespaces that are used for the various tags:" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "{'bag': 'http://www.opennavsurf.org/schema/bag',\n", " 'gco': 'http://www.isotc211.org/2005/gco',\n", " 'gmd': 'http://www.isotc211.org/2005/gmd',\n", " 'gmi': 'http://www.isotc211.org/2005/gmi',\n", " 'gml': 'http://www.opengis.net/gml/3.2',\n", " 'xlink': 'http://www.w3.org/1999/xlink',\n", " 'xsi': 'http://www.w3.org/2001/XMLSchema-instance'}" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "root.nsmap" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Building the tags that we need to get to the resolution,\n", "and then walking the tree to get the resolution and its units:" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "collapsed": false }, "outputs": [], "source": [ "sri = etree.QName(root.nsmap['gmd'], 'spatialRepresentationInfo').text\n", "adp = etree.QName(root.nsmap['gmd'], 'axisDimensionProperties').text\n", "dim = etree.QName(root.nsmap['gmd'], 'MD_Dimension').text\n", "res = etree.QName(root.nsmap['gmd'], 'resolution').text\n", "res_meas = etree.QName(root.nsmap['gco'], 'Measure').text" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "500 Metres\n" ] } ], "source": [ "resolution = (\n", " root\n", " .find('.//{}'.format(sri))\n", " .find('.//{}'.format(adp))\n", " .find('.//{}'.format(dim))\n", " .find('.//{}'.format(res))\n", " .find('.//{}'.format(res_meas))\n", ")\n", "print(resolution.text, resolution.get('uom'))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "There might be a more elegant way of doing the sequence of `find`s above\n", "if one were to dig more deeply into XPATH syntax.\n", "\n", "Similarily for the data region boundaries:" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "collapsed": false }, "outputs": [], "source": [ "id_info = etree.QName(root.nsmap['gmd'], 'identificationInfo').text\n", "bag_data_id = etree.QName(root.nsmap['bag'], 'BAG_DataIdentification').text\n", "extent = etree.QName(root.nsmap['gmd'], 'extent').text\n", "ex_extent = etree.QName(root.nsmap['gmd'], 'EX_Extent').text\n", "geo_el = etree.QName(root.nsmap['gmd'], 'geographicElement').text\n", "geo_bb = etree.QName(root.nsmap['gmd'], 'EX_GeographicBoundingBox').text\n", "\n", "west_bound_lon = etree.QName(root.nsmap['gmd'], 'westBoundLongitude').text\n", "east_bound_lon = etree.QName(root.nsmap['gmd'], 'eastBoundLongitude').text\n", "north_bound_lat = etree.QName(root.nsmap['gmd'], 'northBoundLatitude').text\n", "south_bound_lat = etree.QName(root.nsmap['gmd'], 'southBoundLatitude').text\n", "\n", "decimal = etree.QName(root.nsmap['gco'], 'Decimal').text" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "west: -124.003\n", "east: -121.996\n", "north: 49.0024\n", "south: 47.9995\n" ] } ], "source": [ "bbox = (\n", " root\n", " .find('.//{}'.format(id_info))\n", " .find('.//{}'.format(bag_data_id))\n", " .find('.//{}'.format(extent))\n", " .find('.//{}'.format(ex_extent))\n", " .find('.//{}'.format(geo_el))\n", " .find('.//{}'.format(geo_bb))\n", ")\n", "west_lon = (\n", " bbox\n", " .find('.//{}'.format(west_bound_lon))\n", " .find('.//{}'.format(decimal))\n", ")\n", "print('west:', west_lon.text)\n", "\n", "east_lon = (\n", " bbox\n", " .find('.//{}'.format(east_bound_lon))\n", " .find('.//{}'.format(decimal))\n", ")\n", "print('east:', east_lon.text)\n", "\n", "north_lat = (\n", " bbox\n", " .find('.//{}'.format(north_bound_lat))\n", " .find('.//{}'.format(decimal))\n", ")\n", "print('north:', north_lat.text)\n", "\n", "south_lat = (\n", " bbox\n", " .find('.//{}'.format(south_bound_lat))\n", " .find('.//{}'.format(decimal))\n", ")\n", "print('south:', south_lat.text)" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.5.1" } }, "nbformat": 4, "nbformat_minor": 0 }