From 6bec27e918aa7fd82e9fa89422347bfac67ef304 Mon Sep 17 00:00:00 2001 From: Rob Fatland Date: Sat, 18 May 2024 17:58:55 -0700 Subject: [PATCH] moho --- book/_toc.yml | 1 + book/chapters/rob/anomaly.ipynb | 4 +- book/chapters/rob/data.ipynb | 8 +- book/chapters/rob/documentation.ipynb | 135 +++++++++++------- book/chapters/rob/issues.ipynb | 23 ++- book/chapters/rob/shallowprofiler.ipynb | 102 ++++++++----- .../rob/shallowprofiler_technical.ipynb | 56 ++++++++ 7 files changed, 235 insertions(+), 94 deletions(-) create mode 100644 book/chapters/rob/shallowprofiler_technical.ipynb diff --git a/book/_toc.yml b/book/_toc.yml index 4c070bc..bd3f68b 100644 --- a/book/_toc.yml +++ b/book/_toc.yml @@ -16,6 +16,7 @@ parts: chapters: - file: chapters/ocean_science - file: chapters/rob/shallowprofiler + - file: chapters/rob/shallowprofiler_technical - file: chapters/rob/issues - file: chapters/rob/anomaly - file: chapters/rob/data diff --git a/book/chapters/rob/anomaly.ipynb b/book/chapters/rob/anomaly.ipynb index 8b72c08..2b3818f 100644 --- a/book/chapters/rob/anomaly.ipynb +++ b/book/chapters/rob/anomaly.ipynb @@ -5,7 +5,7 @@ "id": "1c216635-59e5-4886-bbd5-634c54c5606b", "metadata": {}, "source": [ - "## anomaly\n", + "# Anomaly 1\n", "\n", "\n", "This notebook generates anomaly metadata for an OOI RCA shallow profiler, typically scanning a time series lasting\n", @@ -818,7 +818,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.5" + "version": "3.11.4" } }, "nbformat": 4, diff --git a/book/chapters/rob/data.ipynb b/book/chapters/rob/data.ipynb index 1ace658..3ff69f5 100644 --- a/book/chapters/rob/data.ipynb +++ b/book/chapters/rob/data.ipynb @@ -4,7 +4,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Introduction\n", + "# Data\n", + "\n", + "\n", + "\n", + "## Introduction\n", "\n", "\n", "Data are pulled in as large files for ingest. These are external to the\n", @@ -609,7 +613,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.5" + "version": "3.11.4" } }, "nbformat": 4, diff --git a/book/chapters/rob/documentation.ipynb b/book/chapters/rob/documentation.ipynb index fc1946d..69b7627 100644 --- a/book/chapters/rob/documentation.ipynb +++ b/book/chapters/rob/documentation.ipynb @@ -309,6 +309,13 @@ "\n", "[TOC](#1-Technical-Elements)\n", "\n", + "#### Notes\n", + "\n", + "\n", + "```{note}\n", + "This is a note; an offset comment that gets its own box.\n", + "```\n", + "\n", "\n", "#### Inline images\n", "\n", @@ -324,26 +331,22 @@ "
\n", "```\n", "\n", - "In the JupyterBook we have a Markdown alternative (since the HTML does not work properly):\n", + "\n", + "In the JupyterBook we have a Markdown alternative (since the HTML does not work properly).\n", + "The short version looks like this (no formatting).\n", "\n", "\n", - "```{note}\n", - "Here is a note\n", - "```\n", "`\n", "![short name](path_to_png_image)\n", "`\n", "\n", "\n", - "Example: \n", - "\n", - "\n", + "The Myst-NB version looks like the following example: \n", "\n", - "![dubious oceanographer](../../img/rca/images/people/dubious.png){width=50%}\n", "\n", "\n", "\n", - "






\n", + "



\n", "\n", "\n", "```{image} ../../img/rca/images/people/dubious.png\n", @@ -353,14 +356,10 @@ ":align: center\n", "```\n", "\n", + "\n", + "\n", " \n", - "```{image} ../../img/rca/images/vessels/revelle.png\n", - ":alt: revelle\n", - ":class: bg-primary mb-1\n", - ":width: 500px\n", - ":align: left\n", - "```\n", - " \n", + "


\n", "\n", "#### Local animation file (mp4) playback\n", "\n", @@ -374,12 +373,29 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "id": "f9db8cb9-4dd7-4014-96aa-40fe967ea1c1", "metadata": { "tags": [] }, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "from IPython.display import HTML, Video\n", "Video('../images/animations/multisensor_animation.mp4', embed=True, width = 500, height = 500)" @@ -410,12 +426,36 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "id": "15435601-0c8b-4fdc-a4d3-1f26f3a10ab1", "metadata": { "tags": [] }, - "outputs": [], + "outputs": [ + { + "data": { + "image/jpeg": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAUDBAkJBwcHCAkJCAgHBwcHBwgICQgHBwcHBwcHBwcHBwcHChAOBwgPCQcHDiEODx0REx8fBwsiGBYSGBASExIBBQUFCAcIDwkJDxQUEA0UFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFP/AABEIAWgB4AMBIgACEQEDEQH/xAAdAAABBAMBAQAAAAAAAAAAAAAABAUGBwEDCAIJ/8QAYBAAAQIDAwUHDA0ICQMCBgMAAgADAQQSBRMiBhEhMkIHFCMxQVJiFTNRU1RhcoKSotHwCBhDY3GBkZOUobLS1BYkNFWDwcLTFyVEc6Oxw+HiZLPyhKQmNUVWdPFG1eP/xAAbAQABBQEBAAAAAAAAAAAAAAAAAQIDBAUGB//EADoRAAIBAgQDBgUEAQMDBQAAAAABAgMRBBIhURMxQQVhcYGRoRQisdHwMkJS4cEGI/EVU2IWJDNDkv/aAAwDAQACEQMRAD8A4yQhCABCEIAEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgDKFf9qexRt1iXfmnZyyLuXZceczPz2ehpuLhU1SMIRjSKpNyx3Rq1Y0jVmhVnIRjSdOHTTyw4/hTnBpZnyGRqRk7JjYhP8AZ+S7r8BJtxnMXSc/lp7l9zGdOFQuyvxm9/JTE03ZE7pySvYgqFYLe5NPRjmv5P5x/wDkJysLcOtKbnZaQam7OF2bccbZvHZoW6mwi4VRDKxjxDyQipHCS1sMsyrELo6HsO8ou7bF+kz/AOAWfadZRd22L9Jn/wAAkysj4kdznBC6P9pzlF3bYv0mf/AI9pzlF3bYv0mf/AIysOLHc5wQukPab5R922L9Jn/wCx7TnKLu2xfpM/8AgEmVhxY7nOCF0dD2HOUXdti/SZ/8As+05yi7tsX6TP8A4BGVhxI7nOCF0f7TjKLu2xfpM/8AgFn2m+Ufdti/SZ/8AjKw4sdzm9C6Q9pvlH3bYv0mf/AI9pvlH3bYv0mf/AIysOLHc5vQukPab5R922L9Jn/wCPab5R922L9Jn/wCMrDix3Ob0LpD2m+Ufdti/SZ/8Aj2m2Ufdli/SZ/8AizDiR3Ob0LpD2m2Ufdli/SZ/wDAI9pvlH3bYv0mf/AIsw4kdzm9C6Q9pvlH3bYv0mf/AACx7TfKPuyxfpM/+ARZhxI7nOCF0h7TfKPu2xfpM/8AgEe03yj7tsX6TP8A4BFg4kdzm9C6Q9pvlH3bYv0mf/AI9pvlH3bYv0mf/AIsHFjuc3oXR/tN8o+7LF+kz/4BHtOcou7bF+kz/wCASC547nOCF0f7TnKLu2xfpM/+AR7TnKLu2xfpM/8AgEBnjuc4IXR/tOcou7bF+kz/AOAWPadZRd22L9Jn/wAAgM8dznFC6O9p1lF3bYv0mf8AwCPadZRd22L9Jn/wCS4nEjuc4oXR3tOsou7bF+kz/wCAWPad5Rd22L9Jn/wCLoXPHc5yQuj4ew5yi7tsX6TP/gF69ptlH3bYv0mf/AJ+VjeNDc5uQuj/AGm+Ufdti/SZ/wDALzD2HeUXdti/SZ/8AjKxeJHc5xQuivagZQ92WP8AP2h//XrHtQsoe67H+fn/AMAmZ1uOzI53RmXRHtQcoe67I+fn/wAAtjfsPcoi/tljfSZ/8AhST5MTMjnPMjMuj/ab5R5qt+WL9Jn/AMAkntSbfvha35Y8CLVjvmepz82rePGi6DMjntYXRhew+yh7ssb6TP8A4BZH2H2UPdti/SZ/8AhSTV0GZHOSF0QfsRMoIf2yxvpE/wDgEN+xEygIat+WN9In/wAAk4kdxxzusroF72JmUA603ZHz8/8AgVo9qrbvdVk/Pzv4JNdaC5scot8ihEK/faqW93XZPz87+CR7VO3u67I+fnfwST4il/IXJLYoNCvz2qlvd12R8/O/glrj7Fi3O67K+fnfwSPiKf8AIMktjrjd2nrjJi1nNUnJa4HZ6+4LNNXfgRQXBhNeEWq7g68IjhGbYHaIYYDDorqT2WmXl4y/YjXWpYpZyZOsan5lwi/NmWx0lQ3piXFCJQhyLmMB8IiHh6muvjVqz8p2wChrtdnOr+Mi4QjF89X68jOwHzOUvBehoZAgIXgIGjc1Th+gTpeF/ZH+9HQpbZWUnuDrZMzHaTKm86TRFhdH4IqOjGkSeqbAXsJPCN9Zc30ZtrjlHu/m41sMBERZMRACxDLzZX0g50pK0W9LGfkhGKo2NVVJRVuhL3MobuqoSaIRqpMaS8klq3Abadm8trJInCIWZh1webq0/XUo/CZJoRYexMlhGVtIiu//AEVrM56e9nip77HSypGUyllp0idZFvE/KzFLjjDZasyy+3hm5XPoiUNMIaY507PJ6Segkp35I7mQtrU4JCJDQUCxDEaSEhLaEh44L3CY6MPqVnLIxXKK6mmC9Lbvrow9fiWIzPQD1+JGSQZobmteVu3z0IevxLzGY6EPk/2S5ZCZo7muCM62b4hzB9fFXmL48wfJL7qTJIM8dzzGKF6vh5o+SXoRB0eZDyY/dS8OQmdAsRRfQ5kPJii/HmQ8mKXhyDNEysrG+IcyH1o3xDmQ+tJw5C547/noZRmWN8N8yCN8BzIfV6UcOWwZ47mULyT49iHr8axfD2B9fjRwpCOaPawvN8PYh6/Gi+HsQ9fjScGQnER6RnWu/HsQ9fGWb8eb5w/fRwpC8VHtGbDVyDhLorzft83zh9KaJi0SCZKMNXDo4xIadpOhhpTdhs8RCNrjvFeV6lZkHRwwGvaCr7C8RmB5vnf7qPgzvYfKrFJO+hlC8b5Hmj8v+6xvkeb5yX4eY34iBsisLXvkeb5yzvkeb5xI+GmL8RA9rK175Hm+cSN8jzfOJNeFqCrEQNi1o3wPN+16Fi+Hm/a9CT4WoL8REUNr3mSYZkeb9r0L1vvo/a9CsqDSsVnJN3NpQSWshHCve+uj9r0LyMwPN+16Ekqcm7oljNJGvfLnN81Yi+56it2+uj9r0I310ftehMdOfd6EinHvMMmRLLWsS8i+PN/7noXoXh5v/c9CjlQk7ch0aiFGyo9OtVPVU1Fs04SqHEJfFFPcZro/a9C0CQiVV3i/aehQ1MPN2sSwqxVzazjERPX2qVi4p2kRfHtf2vQvJTHR+16EyVF3vyfcSRn06CSdw1c4liUHgxW0zHtf2vQvIuiI03f2vQqrpyTehYzJ21ENoji8VNdOJPT7olrAXnehJoxb7UXnehU6tGbLNOaQjgKzSlNYcwvO9CIvN9rLzvQoeBIlzoRnBJ3IJeb7fMLzvQtDjzfay870JVRkJnR8/LRmHX3X3CF0HZtwnnL0ifn5kiKonnCGGaWaCOOMdGeIwgtUqdVI4iIeHEWcL7dX9tkC90aLji12c61MtUDSLZjfU3Mo6RHM2i8Wq5Mi3GEW5cYYqY5oL2JtELl7VQ05TegPCvTtNIs2a23mFgAp0x05+Vb9WpKpJyk7tlSEVFWQsbPWfEqRLCU7KN3jDnRtOzi0tl2YwgtrQ3bZODwTTms9JDv2y3v7+SLEwXZzZsy0i26Dl5G8N26beJ6VpbtFttzV33KasyPfgtskdRE+FVY603ZnBvj/APm2Y5rd/NBMQ4QNWm2LhMtELWtVvcr+znhEaiIpKZ0t6KtAxT1IvE1cuMuDLm3w7DsuROMsiWFyblB1t77Jsx4uPkTPakpeiUyDjTwiN25MSjZMvti4Qi45Oyw5ojSFWkYaao50rslt1humJC6YuCUs0y5whOODS3OyBFheE4jQTfw580U7m7Bex0d7HrdFnn7WlLJBtu4fEt8iEzfssEw244+5LN+5tFARjmz6IlDjhoXTsBXOvsNMmwArRtaYw3dNmsVNss1OELb826Nz+wH4yXSd5L8/zi9KuynGnaJmVacqjzaCbMvOZKolL9s84kfm3bPPJJx4kXwsu4SZvX1gsw9fXMleaX7ZDylmhjtnnJePEPhZ93qI4j6+sFin19YJbdsds89Fyxz/ADkceIfCz7vURU+vrBFHrT/wS64Y5/no3uxz/PRx4i/CS7vUQwb9fWCxd+vrBOG92uf56N7tds8+COOhPhJfjG+79fWCxEPXD6E470a5/wBY+hY3o12zzx9CXjxD4SX4xuiPr6wWM3r6wTlvRrtnnj6Ebza7ZHyx9CXjxE+El+MbIwQnLeTXPj5cEbxb58fKH0JfiIifCS/GNuf1qWIxL1//AGnIpJvnx8ofQqx3Qcv2papiSKs9UnY4qf7sf3xTo1YsZLCzQ95VZTtyYkNVb1Orst9JzT9XKnDJ51wpKWcdLhXGRccq98qcHDnw6CHQqh3PrNcte0hF4uAZ4eZjHabEsLdRcpno+CpdAws9vnx8qCZx1fUklhW1aPmxrq6Xr8qZsp5mkW/+PjYuNS7qeHPj5Q+hRzLuUAZaqB59YNJDrENUPs8XSU9CvBzSK2Iws4QcrDDI2ni1qSUkZtcDDhioiI9ehzemI8Y99VPCbISWrKm3CGznxxCRNiPilTiFXMTGFry59CDDqV7Ll1RcZeF0dr76xH19a00bnVojPWc2/E8xDdtuD0rpuovjO8ipJvIef9lZ8K8Wk2T1MNKMmktBDH19a1j19caXRkun9lYhJ9NP40dxvBnsIs3r6mjN6+ppbvL31G8vfEcaO4cGewi9fXGiHr61pZvL337KN5dNHGhuLwp7CP19cazm9fU0s3l779lEZH31Jxo7iqlPYRevrjWM3rh++lkZL337KxvH331+VJxY7jlCWzEmb1w/fWM3rh9KWRkumsby6aXixHZZbMSwh64fSiEPXD6Uq3l76s7y99+ymOpEcoy2Ym9dn0rzD11fSle8vffsrEJH337KR1IjlGWzE+b1w/fXmI+D5vpSuEl779lEZH33zRTHUiPUZbMREPrh9K8RD1wpdvL33zRRGR9980VG3EkSlsxscaH1pWgmPWkU7lI+++aK8FZ/vvmioJRi/wARNFy7xnJn1pH0LUbPR80fQnqNm+++aK8FZvvvmioJQj+WJVKQyGz0fNH7i0uMFzfNH7ifY2YPbfNbXgrLHtvmioXTiSKUj5xS0RaJ0iFxhpxoSfiTlVqTIEVINVe4XplxQ05hTk0DQvNsu0tPMsOPOi11iy5IRvHGmuV2dOBUxcLivE0S7jbZb7pI2mLx5t17E7aE71ts6e1CZaPBQzJmIz4kVT7jUlKOFtE/Pv3ruLvQ0KzFXHsd5RkXSbq4I7RcGfmSEsUlZMp1lurjEyp/yW9pkZkpRwm6Xp+ZfeliAt7PylmsD19yYb0uaufFCOdNL8KnJtsCpGZm5ayxLmyzA1P09HDpTsMd83jjOArRfbseQ95syW/SXR5oxgPH8KfCNwbPAuYW5sTJ0eEuZsWxbtNgWyu7x9kdE/KRjojHNGOZea2r1tsyYumx3yTXCTMk64Xu0kTGOWIqc8WzjCEIklQONtsTtotN4Rps6yQ97ZK7qbp01G92ObFOORVvStlZR2ezPMNTwE2EtaYPU3MZmdpvHHW4wgLkGqhhGBaIYo6IwzqWjT+a7Iqk/lsjtL2P2Tu9MmrJadCh6badtB6EAEaXJ1zfNJQ0xqEXGx8VTxqWAqPfBItVvZ+JUW3u0WuF0P5MWtwQGGGVcpIo4RIadFGHRDlWGN221RuqsmrWwNGP6G7iOO3xYRhzVZnTUm3ePXqu/wDoyVWWl0+n+L9fEvRqXAqPfAieqGzT3uksNsAVHTCJ6ocnxceJUYzu4WmNFWTVrYGjD9DdxOR1Y6uEe8sS27haQ3VWTlrYGjAvzN/S5Hl1dXDxJrpR3j6oOLHTR/lu/wAS9QlwjT0gI9UNXR0ekshLN6O+FeqOqqIDd0tAaP8A4ctbAwQfocz1wuXU1cPEsy+7tOQEKsnLY4OXi3+gzOJyNOnU1cPEk4Md4+qBVVs/yxekJdv/AA7zUHi+8sRZb/wr3UHV+8qNDd6mhp/+HrXws3f6FM9cw6dTV7y1/wBPk3o/+HrW0S5N/oMz1zRp63q6OJHBjvH1QcVbP3L1iy3zvc7zUHi+8iLTenFxNwc1B1Y5/QqHju+TH/2/av6Pc/oM3rc7rer3lshu+P8A6htT9HFv9Bm9bsx4HSPeS8GO69UHE7vr9y9CabhV0Qg7qDqx/wD0g2QxdEIHqDqxVHR3fnYiX9Q2riZg3pk5rW7JcDq95Zc3fzpP+o7UhUyLQ/mc2WKGt7jiHFxI4Md4+qDiePv39/gXc40EK6i63CBlg2YrDrQDXpHAIRLBsnqqkXfZAFEXP6ltTGzAB/M5vWhylwOrpQ5u/iV6XUa0xraANMnN60OdwOKGnQlVGO8fVDXUfS/v39/gXc6yA154jwdFWDn6qHGRhXnIcEQgWDn6qpV/d/CN7/VFpDWAQGqTm9BBn1uBxLxMeyEajf8A9VWlCsQp/NJnQQc7g0KjHePqu7+xHVetr9d+/wDoux1kRr0jgiMCwc/VXk2hhXnpwGIRw9s1eVUlM+yHYK+/qy0IXt1TnlpnQQfssSV2Tu6Nzz7ss1Z820b+YhdfaeZYYFhsnHHnnHAhCkYDVmhpjTm5UKjHu9V3f2DqSd7X6259/wDQ9bsuWG8WTlZcvzhzO1UI03dQ8K4OnWECph33I81UaLxOFiqLzvBW/Kq1ynJ12ZKohqIW6tamrWLpRqKMe+UV5sK3paz5uWmZpp14WnLwWmGnHqnm6SbvLsIwEYceaPHEYJsoxjLKtN+hdTap32OhtzWwRkZAKxEZh90d81CVQmQjds8fEECzfCRKSE+PNHrt1qlrfKqYf9kLIxvfzGe0zDTo8A/oEc1UdTW0cS8lu/2fG9zy04OeZF0apZ8cO1saymjRpvnb1RlzqV+l/Tx/oucZnVwjiMmtrWH40yZYzAlIOFSI0udLWbKkuXsEqsd9kJZo1ZmJrDNi6PAO6uGrk40htXd8st9h6WFqZqffjTEmnBERdERqLRyRpjmUtOnRjJS057kTliZK2oucfxeMkFuxqYcbLabIWyHnDiES87NFJ25qokrGBOCQjiLmFtDqlT0ocasYp3p3LGFWWpYk24bbFLDjBUkRcINVWs3VVqxhsOKwwtqq7pbb4QXKeue51VVY+iS57yfypbsgSnZgSNlh9tt4Q1rt6pmoR8NtnykrlvZA2UJNcE+ItzLzmIfcnKvOxFo+tUcPSw7h89r68/Mdjp4tVf8Aa/S7bF7BbhFd0tN8ILhD1z3PW5dbCtY5Q1XdLQ8I2Tg4nMQjrcut3lRkPZCWUJNYH43T7xavuLl5q1bWLi+tamvZA2UNwRNv8E4/zetO3lPjYuLR8KscDCd3r+dxUVXH/iReo5SVU0tDwjJPDiLrY63LrYuJeIZUc1ocTN+OIsTY01cutiHQqIlvZA2UO9qgf4In2y1esuVU06cRaujRqx0xWmT3fLKEmKhdG7v23NXEy5Vd+EUMOhHw+E7vUON2ht7Ivwcqx7UOJjfI4nMTOHF4UKh0LB5WNjUV2GFgZnWcxMF7oPO+BUBLbvVlDvaoHSuWX2HNXEy51unTizUjn4tWK0yu7xZQ72qbd4GWflntXE2VN3TpxZqR40nAwncPVbH7eyOg3ssGxvODb4NkXyxOdYL3Qed8C8vZYtjeVAHAttuuYnC4BzVeHnfAueGN3SyhFgTbdKmSdknut4mypuSHTi1dK0tbudlUs1i4X9XFJP6uKmm5cH4KS4+ck+HwncOjWx+30OiX8t2hvKmwpZuycKpzC25quDzh/wAl4mMumm7ytpsbkm73E5wYvdbc4sQR7PIubR3a7MIaTFzhLOKSepJvEQ9acFYf3abLMSrFzhrMGUepp6831t0dOrreUmSo4TuJI1cd1X0Ojnd0BobytoRuXhZeqcc4MnOtlxYhLsrDm6A0N5U0I3TwsPY3ODcc63Vo1Y85c2Tm7HZpi/rZ35BlhzV6+yWF7j1dZeZ3djs93fdVQ75lpYdYcMyx7px6sUx0cKSRq43qvodIuborQ1VMCN29cPVE5wbxdbEtGqXOWv8ApJY7QI8NcFwjmF/ZbLRhz8kVzlaO7BZru/cRDvlmW5uGZY1i49WKTTu6zZ7gzIj7vcODiHg32dYuPlSSoYboSRq4t819O46V/pKYw8APXrjrjg0v9pLRhz9leA3TWCu+AHhHCYHhHOvjrMlowl2I8q5vnN1ez3N9kOG/cYfbxCV2+zrEWnVisT26rZp75IKhvX2JtrEPBvN9c5dWPZTXQwy5DlVxWx0aO6iwV3Sx1xwmRqccHhm9ZstGEv8ANao7q0thLe3XCIW8bmJxvWb4sJQ7C5zm91Gzyv6CIaptmbZqu+DcHrglp5VpnN06zyvaSpqmxm2aqcJe6DhjypkqFAkjWxHVHR39Lcthplqryq74RzEQ9cHiwlBeIbrsthplqrwSJvhHMVOsPFrQ7C5pjukyOsJUkMzft6uGrrjfGvH9I0iOqXW3yeb1dUtZvjTHRoknFr7HSkd2KWw0y1VQkQ8I5iEdbk1odha/6ZZbuSqoah4RzEI61OjWh2FzVDdDkRu6S62+Tg4h625rN8a1jugyI3dJdbccIcQ9bc2eNM4NLuHcWtt+anShbtEt3Js3g8IWJvnDo+paj3amO5NmrrhYh5w6FzW3l9Jjd4utk5TiHE25srWGXUmN3iqpvBpqHrbmz8SjdGn3flh/FqbHR7u7iwJfoNWGqq8LV+RaXd3ZruEdUS65skucY5bynB7VIkJYm8Ql8fIkkcupTDrYRJstXVJMdGmPVSoRewAGZmZes64M0k5SNLQi0QtSzDY82LhEUeypBIUk4TparltTb5dJuzJQiHxYHTFR+xTIZtsaq4i8w4+LNO9JZlkqqSPiLT6xTzZEfzJgtopTKV7xiFsavkUlFXlqTT5Da5AgZY5CZs6btJ0vfZ+ptnxqSFSJ8hYFpsMAyko2wJj1wb6WZceFtws9yRxceKJQhVxQzwhBIrWkqr1seN96w5Aei0Mo3MufxLzbExVLTb44r+1nG2ekzKShCVPRViHyN32I56jMOV8yTkoMuDDQyjXADTwLDhN0k/ijmqCBaDLPmiUY8cVLtyjc6K0Ht/vPiEuy82RPOlw869hfEWmy0sy8cMYuFpjDPCHHGKY8hMm23am3zEHRJngiwi28Tks404/V16ptwswcUKY8cVa8m24+L5CJBS8IjTTU1d3jbko5ToIW+DIC5RfzcicoykrtjJSUeRae+rS1uq5/OCswm7S2bXc+cH0KsOpr/bCWYWdM9sJGR7kWdbFoRnbS/W7nlD6FnqhaX63Pyh9Cq3qdM9sJY6nzPOJDg9xM0di1OqNp/rlzyh9C9QtW1f1uXlD6FVELPmecSIyEz2wkcPvFzR2LWK1rX/XJeUPoXiFr2v8ArkvKH0Kq4yMzziWN5TPOJGR7iZo7Fq9WbZ/W5eUPoWyFs2z+ty830Kpoycz2wljekzzySZHuF47Ftjblt/rcvN9C9Rt23P1r/wBv0Kot6zPbHEb3mee4kyPcdnjsW9C37e/Wf/b9Cz+UVvfrP/t+hVDczfbCWINTfPcRw5boXMi3/wAobe/WQ+S36FiOUtvfrAS8Vv0Jg3Ksh3J4Xpu0H3wlWyuWWmTFl+ZfpG84QoRu2hqHVhnjEuxCOee5P7nrDbxCUtvtrpzL02/SRYW3HCi22wHZi3CMcObPxqCpWjTbTlyJYUpT1S077DD+U2UHdw0lq4W9npZsX7ky5ZZUTxSQy03M74emyrERpEWZTVEqR1idMSLPHZbHnK77Xyek32G2p1oSab4NtoSJlhunVFkW4Qi2WYacMdOnjVSbqe5++0+5aMu5fS7xCRAWF6SbwtjUPE5KjhGqGaMIZoRhypaGIhJ3v4LcZVoONtPPYrYYCDZOEQiDY1ERFSI+EXrrKypWNvWY0Esw+w0yY75aoFtxt0XaSIxdKEIuadEc+mFObsJBuX2CMzOlNmNUlZjl2xVqzNojrOU8RAxV5TkO1qzcobLanpRyReImoEROS0wPXJGZ2XR5zJcRBxRhpVuFDNHM3q/oV6lZKWVLRfUgkcqsoO7Gvm21rjlXlB3Y1822qzylsO0pObdlJonBdaKnQREDglquBHbAoaYR/fCKbaZvnuecopU5J2uSRlCSul7ItyOVFvd1sfNMrMcpre7rY+aZVQwhN9sc85ZDfnbD8okmSe475NvYtWcswWrEhah1E8VrRlniEuCbZIAG8u+IRvjHOXJA4ckFrskROoSw0jUJDrCQqUbnsjvnJIJeaxQfnJxpzs3bjQjV4UMMYd8YKBZMzxN61JusOOMPc1wmeDIvBMKT/aLQUnOGTrYz8mSWdbnuXfflJ2ZKXIQebqcZIhFwbzg3MQloII8In6OUtvdtlPmGUxWobZzouDUIvtiJVaw1VMl8l5xqv7yc2nHMOHWLZwrMySzNGlmi4p/4uW3+UtvdtlPmGfQsRykt7tsp8wz6FU++Z7th+csb4nu2Oecl4T39xLx29i2fyjt7tkn8wz91H5RW5zpP5hn0Kp4TM92w/KJG+57nuecjhS39wzQ29i1/ygt3/ofmGfQsdXrc5sj9Gl/Qqq35PdsPzkb8nu2H5yOE9/cdmht7FqRtu2+ZI/RmPQtZWzbPa7P+iMehVfvye7YfnLEZue7YfnJODLf3DNDb2LP6r2z2qz/okt6EFa9s9os/6JLfcVYb8tDnueUS9DO2h2xzzkcJiZ4/iLK6r2v2izfoct9xEbWtfuazfoct9xVtCetDtjnnLPVC0O2H5yOCxc8fxFkdVbX7ms36HLYvMWYWvau1KWWX/o5b7irbqlaHPNZ6pWh2wkcFiZ1+IsqFtWp3DZn0OW+4s9WrU7hsr6HLfcVZxtO0O2EvG/7Q7Y55yOA+4dnj+ItCNs2n+r7K+hy33ERtm0/1fZX0OW+4qx6pWl2wvOWeqlpc8vOSfDeAZ4/iLN6s2p+r7K+hy33EdWbS/V9lfQ5f7irHqlaXbHPOR1TtLtheck4HgGeP4izSte1P1fZX0OW+4jqvaX6vsr6Gx9xVj1TtLtheciFp2l2wvOSfD+AcVfiLLjbFpfq+y/obH3F5jbNpfq+zPobH3FWxWnaXbCWorStLthecj4fwDir8RZRW5aX6vsr6Ix9xait20+4bL+iMfcVauWhaXbCWg560u2Ek+H8B3FX4iq3ZUqm2DAWYPUkxZ8uWIi2SnXR0jCEMUc+nN2E55OzAm7KSgjwV5aco27qi7vmUK8ux2Qg4I5k3ybRFSTFQuz5OMSVWs1JD+kzbhFprPFij31sI6DZflxzwbc3pZbRbQs/pM653o4tKji8ruTNXJJLQquHtq9yYe/aOMuSTn1CmK0mbppjPqtHb7Y5vezIYEPfjUI+MpJkyFTdmCWIh6huOeK9ad2P2UgGWvG7LEu5hmXOkU7NzM655klnV2UVKJEtH6j/ZNnED1JC2TxMtsTInSQ79sySknGXB5wFB4gj4StnJGwLuUbIhKp4RcKrWuxG7lqunBi7GPgwUdyFydKbn6jqoG8feLouOSA+Ue9CGHeFyOyrp3uPNSVKmXREbVyIdSuijqV0VL97iiMuKg4jEykQ6ldFYjZfRUuuRWYS4o4gZSH9S+ivMbL6KmG9xWIywo4jDKRCNl9FeY2X0VMN7CvO9hScQMpD42V0UdS+iphvYVjeoo4jFykO6l9FEbL6KmEZYViMqKOIwykPjZfRQFk1EIiNREVIjziLCI/KpkxZ5OFSDZGXNASIvJFPVg5OvhMsOOsGANuC4RGNNNIkQ9/jpSqcmJohjbYcYabboumWHm5YidK5bKZeIRvLwYRjTGLmbRxxKEIdlS3Jq03d+z43glJM3MsxSTZXs2zedUXeDxtlA7tuk46LuOZbYWG2W+W3eGamahfB7VIXNZsR2RzUwz9GHYQ1ZktKSlxLtty8uyOqPBttt1VEREUfCjEijpqzxisyrFuV2aVOpFRyrmSB6abMRE6TEsRCQi4OHVwl2FFMsJ10apRkxJ206mJYSbq3oyLYjNzbg7TLQUlCEeMnWh051Hcqd0GTk7p4nb1q8u3jZEZlljVGp1xmPB6w6I6Y8iW5I3rt9ak03dPT4t3DBa0pZzeKUYLmunUT5996ENhWMFh807vkvyxWxdV04d75DxY1mNSkozJS40MsNi22OsXSccL3QyiRFGPLEoxW0l6E1kxXR6SWnMweTEGUFitWiwMsdIzDWGReLyt6ul2ouSPJFVPNWMTbhNmNJNkQkPNIVak9agtODtENLlPOL3Nv5Rqj3m++o2+1W4Th4icIiIucRFURLNxNVJ26ov4em0rkK6m9FZ6mdFTDeorG9RVbiFjKPeQZiNkFLVUmFoX5dFt0INCXlhm+EoKtsoZPelp+9To7OrfjeEPlBeD8Ij2VKRmylH23P7O+y5KPDzScK8Zc8KDgiXixTdlfKDMyF4GF5srwS7W4JVD8hj8nwq3h67cvC1vDqQ1aKS8b+pHZ6PWy5pF5w1D9YpRCz6icIR90c84rz/USCMxesC7q6rhDzSEuEH4o1Q8VSvJkRcaxa1Lf2Sb/0c/jJMbpUzLqgwy/27PoxkhZnRWY2Z0VMN7CjeoqpxGT5SH9S+ijqX0VMN7Cs71FHEYZSHdS+iiNl9FTLewrMJUUvEDKQzqV0UQsroqZQlRWd6ijiCZSG9SuijqV0VM97CswlRRxGGUhnUnoo6ldFTPewrO9hRxWLlIZ1J6KxCyeippvYUQlhScVhlRDOpPRWepHRUz3sKzCXFHEYZUQuFkdFZhY/RU03uKN7ijiMMpDOo/RWeo3RUzuBWYMCjiMMpC42N0UdRuippvcURYFHEYZUQuNjdFaysboqbxYXkmEcRhlRBisXorUdidFTk2VpJlJnYZUcftcLSTWArSLeUp/01ly2F53o1Ulp+FYnI3jdTI077EpSSHuay5bC/M9EnIiWn4VtYG96zg3+XUyQ94sxj9LmejnxafhWyYZv7tuXwdUXN4SnvFkyWF17o1xEoxilSJrjlkq7dywzZapOvzrI82SseUdYlPFOafbhDvqTZNWTez7FnANbrIyzJDsi3KSRSDxFTpoKZm5v4pZzvZ2+xmhIRcAeBK4uA2up0k9dyDXhTVoUx74sFHigrZ3BMlCYZmbYmCrmLSLgSLZkm3CuyHm3p3jvwOCrbeWBE9Sw8n7JblGRZAcWG8PacKmmoujDihBOS8wQqg0zCCysQijOgAjBYzL01CpwWxxG5VdjUIkVI1FTVGHInCFiP80B8J1v+GMVJChOavFEU68IO0nYbcy8xTtCwZnkAS+BwVresWaEc5MHm6NLn/bjFK8PUXT6DViab6jYsZl6jBYzqBlhAvMYL0iMEgHjMsRXuKwMMQ7I1DUXNHaLDp+RFxxKMkpg2mamizXhVFm2hHCPJq62bwk8xnSLWbb8K7pLym4wTQFsYrvfco7SIiIvXYuC3sjUMR5O8ljU4Ze5yx+A6XoUc6sov5WPjC61RvN4S2SHwSL+KEU1TlltuiTbzrrrRCQuMOjLOMuCXbBJvk4/FgnK9LaYHxXf9kz5XW4UowN1LVzcy4MtINE7hcmXBIhJz3lsBJ0o8gtx5Sgo05Tdh+kFcrUNzyzyygf3reDJMNyzlrStLYyj8+LgzMlLUtwhxUi+YcUOBhtlBWSZpDYdnjKSzbAkTp4nH3j65MzLxXj8y50zcIi70M0OKEEoIlswgoRUV/yzLq1JVJZpeXgbM61zs4LTZOFs6o84i1R+P6oZ48i9QJRa2prfL12PWm9bpbJF43FDvDGO0nSq8ONxkKWd2NLBE64UyeInKqfB2i+Okc3eEUpWIQWVlttu5oaIxmWIozrykFPM1Li6240eq5hq5pbJD8Ef3pss0Sqclz1iqEv7xvCXilCmPyp2LVTXMPcIy5tlwZf37Gr5behWaLy/Ns9fBkU/m+Xfl4og9oy5MTb8sWo9U814WEXh+Ops/GLsqR5CP1DTzhL/AE3PveUjdGkKmWZ9oaiZIXB6Q834wJwfG+BNeQc0N5h1bwaS5wkRCPywebUmK5JbfToJQ69/1RYCxCCxnQqRMZzIzIzozoAysrzCKygD2sQWILMEAZzIhBZRFAGFlEFnMgAzIjBZghAGMyzCC9ITgPKMy9ZkJoBBCIQWUAYRmWViCAMEvBL2S8IA1GtRreUEoZsl9zVaKnnFwY+dmToxcuSGyko82cZSbd7TdFdDMiUhKF3NZMtinZ3okeLTy1J3kWhIieFshF5hltloMLzFluOXMlJMc2bnDHW5BqipcO5FaouOCbDYsOE3LYZlngbLluEuG+W9fc0Rjm0QKOdL2tz60toGyNwheeodEeEK8J4WyKHBiLDbEqEYcQuPR0RipYVIR5tFl4eo+UX6DTZsmTg3lIm0RE2NFQtvEyJMOExzZcIVS4dG/LWchFTprK20hERAWhEREREQpEREaRER2RhDRCHJSlNiZLPhLMC8I1ttjf0EJCLxcI4LYjqtQiVMNGaEGxT5LWIp3UjJX5lWpCcJWehuyHyjfmXCZmmxEhGoSHVKnWFTDMmGw7MunbzokKf4QVZvUAzKsrdy0nN8uty4CLTbhNiRDURUlTUrOOCrnqVU4XScL7SdTt1Ed+hVm7ValrzLEo8Dbogw6QlMS4uNttvODU2JPDoE4w0whnVWuZR24PCb5nubWJvFq9IVfW6hkVaU2LJST5DLiI38vU4IvOVFduE23ngRQq44wzpgsTcQyqdaGMpC7h2SfNmHhcJD9yuqEmk4Xt11SRBxIq6qWv001KrPL/KC7ESnJ7Dq4nlrby4ygxM7+tKrmC4/VzdnSr3mdxzLwmrnfIU005t9VDT8yobO7heVguVTGInKmxO/LCQiRaxQhHiEowjDmqVU6nST8mvuMz0/3JLy/osSTystJhiWljapdYlmG3yeqJ4nhZbvCcItNWepb/y0tLmNeSnAZR11uWKaIjmBlpZl8yIiJxxlhtknCItJZ4jn06cScGLEHmqpVUFJ23J4OVlc9ZEZSPzLzjMw2Ild3gkO10VMEwWLZd08LnRIU/xVWT1JTySrq38t5kX3G5VoaGyIajxERDtKw3FXsbKqcIucRfaRC3UHckWR75T0tfTTbd6LzjeEdkaSH6iT+3YjXax8lNuSEtdskPvlXlCP3VJ2YqniNJuxapO8RGNktCNWqIjUREVIiI4iIi2RhDTn5IJFkdZt6RW4dQg+JMWS0dXB2drOTpCWkXZkxEodgG2YbUVstRnqhNjYoFwN23N20Y+52cThCzIVbLs042Qx7DbT0dqCnVpM1M0js6ojhEadURHZGENEIfAtPs/DvK5vyMvH4vLNQXn9hhNxeIRWsorXMvi22RFs+UXNEelGOiCtEYkt+0KG7kddwdnWESw4eaRRww8aPImyVapHpFiLwvuwhoh4K0BU48Lx7REQ83CNOHow1YeDGPKlsVQq1MzLlOGVWPDh0jUWziVb2nl3M3xDLsDQJUiR1ERU7SsOdhwLn92X2VAmLJTYW6j2JRy4nu0Nl5Sk+ReUpTl4261dOt0l0SHopG1YuHVTlYFnXTxFzhpSzcegK5IIqN5RVNlUPOFwfCb/ANiKCkqZ8pGuDEuap8IlKTg+qK+IbilJdGLpGmZlnGdlxupvoi5rD4p1Q+RVrYrZy07My20IvOMCXgkQj4rjeb4CHvKYZIT9LjzG0zS6PSYe65T8FOf9nFJN0GVuJuUtERwC4Iv09pIhF75IUn+zj3klSLyWfNElOSzXXJijIzKcpy8E2rk2xEqdkhLmqSqO5MWddOEXRJv5twh/hUjgqrZKa5h0WxJwtURIi8EVXc9uhv3hCxLCQCWEiIqiU7t2H5s6PObp8pQiUsbop8bdRGaIZfTncw+USlGReUpTl4JtXTrdNQ6wkJc0k3s2GnbJuzbp5wucKJuPQFckEIrD7tIk4WqIkReKvA6y9vSDr7LzLLZGRNkOHVGrnEWgfjimJX5CvQrqd3Q374hYlhIBLCREVS8/0gTncjflEphZ+Q8nLYp9+s9qXlCGkei5MlDF4kPjipHk6MpeU2bJtCY6zpDfEz0nH389z8WbPyQRKtSi7c3stX9ixTwdWazWst3p/Yl3P5WetBi+flHJIasJPCQi8PbGmyxEHfjCEPhUpfyWpw75bq5pjT9mMV4mLYuhLh710uuO4qR6LNWn4Sjp+BRObykFsipxeEq88ZBK0Y3fXXRehepdmX1nLTpZav16EgfsUh91aIvCIfOzKLz0nbgkVzIsTAbN1NskRD4LkQj9SWyWVlWti8X+JPMpa4uKBY2UXrHQnl2VBrRv6kDmpq3m8RWM/SPNG885uMU/5OOTMywLjso7KnzHQIS8LFDV+FS1ueIdUvJSpq2HO2F4xVfaUvx9J84teGpWl2XPpJehGoSp9rJNWUduydni2VoPkyLjgt8E2UyTdW08LfWx+DPmU+ja7nO80fQtbs/VrNtl4TTZfagpIY+guab/ADxI32VWfVfnkRKUlHZxu/sqZs+dY1ar1xshLtbl3AxEu9HMk01ZVuBqyMs9/czjZF/jQD/NONhy7cnajjku0DLVotlfg0Istk+wNTTtI6K4hUMY8sM3YU3GfFaeGVLEQzxRlYunVw88jl4aEHs6z5wmRcfk3WT2g4N7ySYMoEPxr27KGOs2Y+EBehTgZwVtGaHnKR4JPcrrET7ivIsGXWm3HS2QEcReMWaA/DGMFusfJ6eIqpoW5cNloCvnqffHNRv4IQJWAL485a3i5qfTwkIv5tRlStUfLQa5CyRDEIjVztYvKLT8icRgtbDpVLaYYldWjslZdxWktL9e8p61Gn7l2iZpdpK6K6G7Etm8Eo5yHkjmzaEz2FlCIPuSkw+68643KTbJG0wwyLcyyRONN3JkRUPCQ4454Qpz6UyZR5btCRDUI061Wz4XNVQyFttO20MwD9XBv4B5ovjTi8olxOHhmTTO/wATJxnFx35dx0nM2y2JVYSEtYS8nWTpIwEmxcDEBapfwl0oKjjyjG+FknBrIaqdYqecXN+NTnIzKGghbIsDhUlzfCHpQVjDtw0fUh7QoceKa5r8sWMAaq2xFAw1V7zLQRzbPEUwWdIG65S0NRYvBHFrEWyKkJQWnJCcBu+Ei90xU4rvwuapaKhm+d2RHVlJR+Vajk3YDAsk3MAMxVTVAqhESHFwZDGER+FO1j5pUaWBNsNai/dIfOOKVQmpZzVKqkcQhhLwuWC1xnW29UnCHmk3reMMMy2PiaMY5PYxpUa0p5+u44jbx6v8RelIpsGZg2zerjFrEI37ojV0hz5ih3l5mJhjCQXlRa3B6v1LUU81rcJV0gpH/JRxxFDnHR+Ys6VZ6SdyK5QZLE0RPMjW1rEGs43+9wO+m6WDCrFmXcNVQgKiFsXRPVNbQjeQHVFzVKnox4/GVXE0oWcovXqvEu4SvOXyyXmIhHVW3MjMiKzjRNZqOiH2lIzTBDnFhEaiIuaKAFYWmxLCN+6DV4XB11DVSOLkzbQpRamVUoxLOPgbcweFtiXacEnpmZeK7Ylmxz56jcIRz8kM8eRVJldbgzL77Aa0oTNXRvRcEW6edCkYx77mbkUas1m/cmXSGoZazpmZs7W4R+WJt4pkadJZ4NkEM2nNVGGtBRxoSq11Hppf87yac1Sw7l11sdX5E2EUiyIukLs3Oi5N2jMDqvzpE3VR/wBO2A3Qw5rGjlT+Q7KQhN3rEpNhi4Nt4qcPBvNDsltRgWgY8UBhyxS+BYatktWK6OGmhycpZ/mI3bkpQV4OqX2lD7Yn2yebZN0WmhIqjIqaiHrhDzs2pDvkUdmCmmXU8LUk5ipMsIl2sRxOOfFDi75QXO+UVo3rxFqgOFseaI6vjd9ZfaddUlZc2bvZVF1lmlyRZ7Fryz75My5Viy2Or1sRqpGkktVe7lHXpsua20PlERfwqwIxWfTk5RTZfqwUZWRrmutueCSY2AT3NdbLwU0swTyMXsBhW1oFhjVW2CSXMEe0ktVupkkrXh0cNKs4SVqsfH66EOIjem/D6EHJwmH2psfcSpdHnMPEIuVdETpj8DhKX2xJDMyjjGth4PpCQ1N/KBUx8GKSS+Sk3M4mpZw2nKhIypZbcbLCVLjkYVaKtMM/1KV5NZGTgMMtzDjAmzeM1XhOXjIlwJFSGEuXN75GHItLGKMJXutmrryKeEm5RtZ7rT1ITkNMk4wTZ9dlnnGHKtqkRJtzxgLP8NXYUiTrIbm7rc69MjMtC0+2IuNXTxFeCVTbglohoqch8DkOxBPY5E/9SPzRffWPJRT0aNG7fR+hBLUhwJJulW8KsmZyBvBp3zT+yL76S/0dODqzLReEDg/ZjFGm6C/cyJsN4VtaFSV3IubEcF274BYvJchBMs7JOMOXbokBiOISSTg1ZhGSehqhBMOXuV5yjm8mtVgRFwR7cWJyrnFn+v4E+uTYsNuPliuGycEec57mPl0x8VUvlG8cy/djidfdpq6ThVEX2oqGvO0Mq5v6Gl2fSzTzvkicZJyTtoCM7NP73kNbCX5zM06wsNcYjGOi8KGbjzZ1KLUynaaaGWlRFmXb1Wh2i7Y4XG4ceUizxVZzlpXHBiQlSItjsjSI04aoppbnJt8iEGH3ae1MPvVeDdtxqVZQk1livHd/0a943zSfhfkiWZRZT0jVUok7bxE4WKr1wp6sLIK2Z4ScGRcZDDdnaAjLNudIW3I16PgipxkXuNu3hFaEzwRarNntk2V5znpt9uGCENkIQzx49GiNilg+V9CCpjkr5VcrCw8oTcJwqsQlT0Rp1lYFkW8NI85TaW3GLGabKrfJmRETju+SbKotoWmIC2PxQTFa25Y1eVSFoE171NtXg+K7LUl8UYfGo8Rh1F2bXqTUMWpq9n6GyWtkipxJxC0U32dkBONj11h4venafNehCPyxXufsaeaGp2WdpHaCl4RHwmYxVTgPYfxo7jp1VHawrU7bjY7Sh85O6yYLStAuciNC4kqticTeULd+xi1XCLyW3E9S9ujSOLZVKSlqcI44WyN2PhFrfJDR4ycpW2qdUl1nY+H4dJ36s5LtivxKqt0RcbdsDzkpatTpKqpS2uknFm2ekthQRjOTLLbtBa7Vn3SZ4IqSqHydoVBpW2uknSUtYuDoIaiKnFiHEknBWCM3cnVgvEQjUVRbSVW5abUs2RGYjzRURtm2W5NsnK8RbKrqdtB+0HdYqSLCqdOGd3fImnLIrLmanZKRdebem5SWeNukqzb1qe2DxOD3izqv7e3IpRxxx+zZwpQicJy6dbEmG6iIqW3GsxthDkhHPoT4NtNERDV42yXjLezMt6wuLiYynT0u0eiONOo81k3uUxljk3aVmzIzZti6yVIjMM1OMFThpcLjbLwlY25Y47POMMABCbrjbTeYquEcKkSHRyVZ/FU2kbSLVKkgppICESEh2hIS0EKecibWk7Pn25tqUaA2qipGptvhBISIRHQJZiLNHMrVGvG6zojqUZpSyHQ8rklJi22F3VQAjnrc00jAatbl41sjknJ9rL5xz7yRZK5byk8TQNVC66ESEC6I1ENUOx31KlpJ31RzM6WV2ktSPxyRlOafzhKgPZEZJMWZOylpy5zLYvEzeiDudoSYdbbqeb4yAge49OaI99dPqo/ZF2CxOMSO+AMrtxykgcJkhjGiI4h0FDOOemKs4VRlO01pZ+ybXuipillinH+S93ZkLtjfMjY9qTbBUOtyV426JNuUk24JapaeLswVJw3ScqRkGLTvRdlZl4pZp0QZcInxK7Jkmx0iefRpVjZYzTo2Ha1TjhCMo83iKr3RtVzuU5ZyxWbJWKLbs1Ni4/MsNA0JUz4vk8y4NTnCCLZFHkjnbhoVSvRoVmnOKb3fMkpRlG6TPeUe6VlLIkTc7SyQkLZVNtkIuEN5dk43GMBPNpzZ86ZJPdutUXKidbMfJ84Yqd2jlZKPvT8zdG61LTrxTpOyIuXIvSFy229ebQvDnzaY5tMFGSy2spxsnbughG7J0bPbuyfekLiknBzC2Vbdff44cUVX+DoLkreFyVZnzFOVG63as45LSgk5Lk8TDdIjS4V8Q0kRd+BZ+TQussnsiWilpcjfO+dYF0oDd7QjUUKhzxhCoYZ1zLG2m563LOsm6MZgrUYceF1tseBZG8HhGYxxQAadHJy8i7KlZduVZiZlqgNbhdgYUwEeaEOKAw+uMVbpUIwp3S1b8Xp3kU/1W6Ja9BgdyGYGGeL5wgPOFqn7K8OZDNd0uDVHNDOLcdMdUfhTyTlf5y/hagQ72l+MiLYcMdp6PIHFDjjp4lssxGJQfe1/cw4xZGP+bkeUvih33OCS1Gxld6L/AI7yMx3P2+6T8gfSqi3eG5axZC8CaF55wiEWaRHEOrVScaRr0xhm4gJWxlxlUQ38pJFAXGm65ya1m5Frs9hyYjxQDliUOSEVxNl1azczPuCBEUpJOOUkRXjj77jmIiL3QyOkYeDDkipPh2oqUuvTrbciWIjObhDpzfS+w0szZNMO3tRPz9246e02yLhERFzarynPyVRjyKdWJNt75st46RacbclCw4RF9kmNXiphUPkwUNtezyFhwj688NTnvdI4WR5ohDR341R5U5WCQzNnCyOu2NQ871hFT5eHaS5/lgb4l4s6U3DMoL+zSs2ZwTFjlvSYAiqcfw8C/i00k3TDsZxzKcSzt1eNngARJ0ei2OJzxYceb4VzLknlIbDspbw030g43JWsJYRelHOBGbKnaCqrPp1S7KuTdPypYblRNlwXqqXL0CEhddIeDESHQQQ1owz82HZU9WrGMM76amPTw0+Pw11/PYim6hlAUy8TIFSPN5rY6rfHrcse+XeUBelMOt5v+68xtAiIiKmoiqKqr0rRPTpU7Pr4S5LEYjjTcmdrh6Co01CJNdy5gRbmyHadZHyWyL+JTTOq+3NXHSlniCoqny2cOFtv4lKr6ZpKrDtYxHV/hWxh8FUnTUlysZWJxMI1Gmxym48GXgprZWqYmn9UqaejSSRjMuc5SPBTRGsRBkjYjhW2EVGI2g+O1hWI2s7zucmPCTHqrElK2MsOOELYCRmRUiADURc75Iac6hxWy/zlJdza3vz0iemRl6WiFmrDeOOOCNNWbNohyRzZ01UZQeZ9BXJSVkWzLvELbbeEhbERGoaqREaR762766DfkpNCdIvdGj8LW81BTDnamy8Fwh/cs2pVlJt3LcKaStYURn/ew85eCtQh9zb85JTmXNqW8lwUndnS7kL5xv0qPMx6ihU5bTna2/O9KTuW6/s0D4o/xJI7P/8ARu/ON+laDtH/AKNzxnW/SlU5BkQsja0yWsZeLh+yo9lPArxtwsVQ63gknQJ9zZkxHwnavspPlK/MlIP0i0BC3eCAiREV3iw1bWariVik5SdiOcUkV7l/Oi1IE3tOuNiPgt8IX8KgOQFjzc5PuONCNIjci6XW2BLr7znNEQ0aNMYlmgnHK6Wnp7ezANOXpTNLZGDjLbYk2RPOPOFCEBaEBqiXJAezGCm+TMu2xLdS5ByhlnhJ2dMcT7hazzg8ZVRqgLUOKGaHJGKsLDuU05cki1RrqNHLHm3r4DrYUZOUIZaUabdeLCUwbbbky+W0444UMzIdgYZhhD65SU8/qk+I94Sep/w4QFQeatBiUbIZXCRdcdOm+e8ItkejDRBMZZW06xjSq+Iuv0vy6F6ik1qvuWW685svt1eC99peGppzbdEvBJz+LMq5HLBsvdBSyVypa7a35Qqg83QtpIm7k+I84vBFembWEucXRMavtJskbUqbvKaR5xDTV4KI203VSNPiqBp9SS7H8Jxv/wAcK3s2iQ6qjwPVaq3tuEhTlHkxrpp80OFr2fJzg/nDdJl7szwb3jF7oPeKEVAbf3IL/wDRbQERqqIDapcLo3gxiI/DmUzB7nClLT4irNLHTg7tJ+JXq4SMlZNrwKJt/crtlrC1LXzQ1Ukw4LmHWqpz1EUfg0xUFtSz7SlKt8SkyxTiqJpymnnEWbCOfsrrcLSp2vKTizaok3SWLo632lt0O3I8pRsYlbsV84s48k5+bG7qaPhMTeGoiHnCI4uLvJzkre5xYl1RNRlHNeWYP9mPg6wwgmSbyQsZ8rw5FqummoKm+jq8RfDm49Kvw7boPmUJ9i1lyKHZtnpeUVKdAyluKXO1jUI7VWzSrlyb3NbLk3nX2midi+3d0TVL7bLdVRC2LkM1RYc8ePMMIdlYtTcvsh8iLelyZbUsbjH+HniH1LT48Jx0Ml0pwlquRR9mWsVpPE885qlha5qmEvLi3duCVNOJOc9uJAL19JTzjXQmGheH5xmIl8sE025kPbjY0tAxNB7w+IufNvwCNXehnUbu1ZDlKKd2U2OQVsnhMm2h5oXnozLZDcttQiGh+jm1X5EXijCEPkXQWT2Tbrgi9MEbAFSQhiviq5wl1n49PwKWyUq01hZHFziIiLyijnXG1sXb9TOxw+Fk9UrIpDJTcXtWkSmLT3uG0IsXzxD4LhwgPxqwh3KWLsRCcnr3tp70cHpcCLIf5/KppFwR1iWh58i1FnrGyvol6L7GtCjpa79X9xx3LMhWpF3fJTLky9dk22LrYtXNWsQC3GMCjEdGfPHR2NKsuKpJx6cEqmnCGnyS8VODeUM24N2+TrRD7rLuk2XjCWcS+OC1KfaFOWklb6GViOzqn6ovN46Mse2H5mAUyzUDMsIxMoCDfZM8+tm5Bhxx5YQ0qHbpFnvnZpE+ZHBomyzG01jKOcS6xGN3m0Rzx7ObvqOz01atNUpaNZcdE3F1n4r5gHIfLCEFF7TtzKMm3G55imVpKp5icZm2ah1artkSHPHs5lfhjIRWZJNLnZ6v/Jk/9Nq1KihJtNtJX5J37lqRrLmQdGwbWLZ3o4WqQ7QrmfcttJuUtqSm3nBZCWJ9ys6qby4eFkcMIx0mQ/WulztU3G3mHhbmGHhJt5p2q7cbLZKmMI/JFQW2rBsNsqSsZjENVQPzbe1Tq3+tn9dCwafbVF3jK9/C/wDk6qt/pXFU9Vla8TRP5UWM/LTcsE2wDU7Oyk7Mi6L3COEJFMiQjCFQQiLYcfFnjxcaSFo5PtuE2BSggTjDoiDTzjN63KXdTjdFJZnKtEYZs5DHiXtyybDEaupQ+DvmZ/nYviRJSthiQkNjMVdNybcpqGrFw2b/AMVKu1KPRy9P7K//AKexW0fUe9wt1qdy/hOtVGywMxM1UlUVLdI3bVNWnFCnjXYcCiR38xAii3ilpUIEVEeISOnC4/Grj1R5OKJR5hyBt9uzXCn7Ps9hp2m7olJZsnnBIiEqiOMIkPLpipmO7hafLZs59DAvsvLWoY6FSCyp7d5hdodnVcPWyTa6Oy1X/JfclKlEr97rtOAIaQYGPGIc448pfJoTHlfPzRmUjJCTVQ1TM8YFcyzW1RVoeejDihD49EFXLG6xaBS1/ci0UYFgfYIHBpKnEIny8fwKD7oW7hOHIuWeJjKzEyIw320N3cNVcM42JZ6jEBKMO/mVmhNOd379DPxFN8PLG6v6vz6Gv2QmVwWfIDY9nlGBPEV4USqffdc64++5xuHCBfKcIbKpjIWxbzhzHgZYsPv03tF0gagWaHfLopmnbXftu2qWiIicLXPFcSw4nHnOc7HEUe+58CtwJFtphuWaGlpoRFsdqked0oxqjGPZUs6maV2MoUOHBL18SG263hLxqVE8nZwpadu8VDhVDzadoVPbWYUJtiUISvB1hxD/ABKWLzLKK/ldywbDlXd/iMuLZszrJNvifWRZwuOOueBAc/w5ocqzlDPtkTbEuNMrLDcsD0R1nCp0VFGqMY9JPWS2T02NliOpNzbbZP1VcBLFwjcoPNOMKTj2KhhyL1I7nLrmu+IeCFX71i46rKp8keSNPCU4Qed8yLNGtc+WFWMxuZiOtNn4rbY/azrB5BywvMt1OO1PNiQmWEhqxDwebjh2IqjTw0pyUV1LtTEwinJ9BPuYSpFZwuU60y/5pCP8Kl29qR1RIafCqHaH4sKdbOshphttplsWmhwiADhESKrajnLTyxzxS0ZTyeivRcNhVSpRg+isedYrG8SrKa6sir8ptCPNpp2qf4ofWkD7LnMHnc7xsP8AkpwUnrYdbWH+IeaSSPyQ7Q4udzud43eU0qEX1Gwxb2IQ8JFs0+vnLzBqnXEi8EiH90VMIyI83zaavB6Sy3Z7fSEebTV/4qB4dX5llYtpciGb1JzEGHo7SG5JwXmyIS642WrrUkPNUufsOoqhLDi9aUnOQIcVRDzcKhqYZW1JqeMfQnzkk2WyKb5qyx2SMPBcIfsxTzLRwj4I/ZWuYguAq3UmjsKbuiJzUi6OpMvji7a56UgdhNj/AGuZ+cq/cpTNj/Em2ZbTMxJYjrsxOd1v+V/stUJic7rf8r/ZO77S0wbTkwNcnvktZ90v2hJ5C2pmRbEmhB0Hi4QnRIiG7wjSWeFI4vlKCTyQYknt20RYmRbMuCJkbxrFixFwjZDCMRdhAihnhDiLNHRFafZ1uJrsZ3aF+E7dxpy2yodnhlpIfzfgymZ90RvG2WGyu7wqYxwx5BjGGeJDDTBQy3MommG7lngmG8Q4sThbTzxe6Ox7PFDihmgoxlhlK0F8LT9N44T0yJYSJwXHBabEe1AzdwhDkjedlQNiDtpE5WZS8uItkOGlx9tyqlxurYw62ZWMTNuVo+Zo4ClGFKKfl/klRZSb8md7NHrdcLEV2POpHa7ytKSydsbqW2yci6c7rOTpzLzbhYaSISZjCkewEIQhD/Ot7DmpOz5YW2hbap1jw3jhc5wuMij2Yr1M5aOuCNy0+YuUk2YtPC24JEQiTbxQgJQjFtyEI5/c49hVYuSuoq73tcsVoRupSlZdFe3uTuz8mLKHWYbeL34nnC848yfZJqRYxMyks0XOBpkSHwSzZ/rVaZKQnpx+4acYB4usszT5MuP61QsuURbE4cdBRhGPJnzRU8ayGtsOvMMBhqH85bcq8Ehgq3wlafJEz7QoR5yWg5PkLpVE5V41K3MMMDtColNPTMthmmHWS6Y4fnBziXxRWyXtNvnKtUoThpJNFmnXjNXi013ExGbbHCK3hN1KMSr485LBmR5ygcB6qIeiml5F9MpTQ0rAzfSTMo/PckANrDkyTY6qQSs7SlcJgS1ktgU1yNAWuW0l9nzhOOMt7ThCP3vqqTXNNBraq35LPDfkVQ8C3h/vHMOH4IVKbC0OLWjHv9iHGVlTpSl3FgC8twupnbmRpXsZpds4WOFzXHepYim0Zoectzb1XSp1ky+XUco5tBkcf5xLSb9SYZG0b/EA0iWHWqvMOFzDCFOeHHDTpz8WfMnZuJCK8+q08smjvqNVVIpiivo+Uk71rttlSRUrU9NEPg9JI32Rf5vRTErcyzF68hVG3W6sOJbjeadpqqAugVP2oRUVtyUNgbwBKIjrEIkVPkwUcjlSI64mHSIXB84oQgpVDYbNt9CzgkWh1X3R+bL7ST2tIuEw42My2V5hGsSaqLZEirjBVuOX7WqLol4JCWJS3IS29+PONjiFtsXC1S1ipxCWilSxTejIp1XTWdc1qM72RtoN1FvYiEsVQELgl5MVH7SkHRKl1ohLZqEV0FNvld0jtDSq7tqyxdfJgG26SIaqR2h6XGPxLlu1KkcPVyQT6d+r6Iuf+q66irxi/wA8SsX7AnncTEs5RqiQj5RDowlyZuwk8jYk42+LbzZCRDhEi2iLWpLNARV7vWPLMS2JoahEdWrWH41XtiyDb9o3l3hFyrFiw6ojiS43FQw0Ixf6rXfd3Eb/ANSVbq0FdvcrXdYsyc6izO9xKspmXb4E+Ewk4Rakc/1wVF71tcdqcGn3x/0rvSzbHFubcbBsRBwbykRERqpIdXNiTmdhDzQ8Ztv0L0b/AEzhVXwalPR3a5HD9u9tzliXKcdWly9D58F1Zpprnaf7x+n/ADWpuxbScbdfIXyFlup0zvCu29oiqjhFfQ87Dau8TDRF2bpv0Krd0NoXJkbNYaEJWWcZdtIxbEW3pkaX5SzKhhiphdvlD+4hyxXQPs+nCLk5ctkZUO1HVkoxj6vkVruQZKdT5IXHR/O5sRceq1m29ZtnwtqPfLNyKYOQWyJLxEVmN3NEaLSlqlnI7J4ZmbF4xqaYcGkC1XpnWZZLoDTeR7wwhtJ1ckycJtkRxOU3YltVc7mjmqjGPYGMU9WLaTUtwbTd60yJNtnVSThFiffxQ1jPi7EBGCjrVckbLmOpwzSuS9tsWxp1toiLWIixERdKMdKIOqPu5UN7TTg+M2X74JKeVDXa3fJb++ssvEpOawpPYhXtpSzfNvXPm2XCUUmMpw2W3fN9Kcdyy2b22hG7pHekyQkRbXB7ObsVK5g4/wC7HxRTx0rUZ22ZaIyI4VkZRLYQXoWy5peSux4rOD4YgjLLVGT85PASDpe5l42H7S2DZTpbIj4RJvxMV1JI0Z9ExgjIrEJNSYbELaMYeUS3DYQ7ThF4NI+lNeNgupKsLUfQiO9PWla3WC83EpuFkMDslH4SL+FJpuymqS1x8EvvZ0342L0VyVYRrVjVJR4MfBH7KxMLc3L0cCJEQt4RItYqedStMxBcHiVarJd7O5w7vTi+5DbNJvmE4TcE3vqEmED0FphBb3lqCCcgF0iKcH8nymcRuMAF3eN8KTb4kJU8IJQpEdbFpjCmEOKMYJHZ4qCzmWVlWplHJWA1JyNoTrMyQvHMNiLsvvS+cmRbvG8z9IiRURjEY6cMcy0cHWlRleKuUcZh1Whlbtrc05W+x6Gedv65YRKqql9wSIsRdcZYhhjFNdvexvmycbKStMRFtltql5wqhFvVESZbzkObkjy8WiOaFh5SZMPk5cNWXMhLsFwHU996zm6XBEi4OQmggWOrRGEOXsxTTaVgE5ci9Zts1Ms3I3UzaokQjtPXMxCL58lZZ4xV6WNzfqitSrTw1SFss3py0K0tj2NtruNtCM9J1s0jiOZIXxxVOPVBHhYR5sIQjDsRhpdrC3I8opRgpTfMmcq4VTgXrzgtlqk8y26zmE48sIZs9MM8YRhAoSZyzzbYeYCxraMHibcKsbedKpvtbouRNsY8sBjCEeVN8kUzLPC8Fg2qJDViOTykmR1aetunEC+NMjXUXeMWn3MmlTqSVpyTXehljuZW42X9kwlUJC68O1UPucadmPHGMOzyq4Nz237TalikrbBqZBsRuJhp0imfBevAGGeHI5nzx4ow5Y19PZXzg6tlzjXhZP2m59pR60MtLS2SnJfwcmpn/UZimcWael/MV0YTWq9C7LSnqqmwATDZvRpqHZqbGMYKIZRZIPzjfAMMS508HMNC8NPi54C58kVHMhrRtKemWXxm54JSQISnwes9yW3+4WJmWaJ1kYt54jnjRnhAc+mEYwz2LG1nSKomnfCunKfBEShqpuKxtZQ+fW/Syt56Fzs7s2lmvHS3W71fqVwzuWW4I/8AzKUHpOtU/Ze/clQ7n1uCP6dZpl0hmG/3qcu2qfaz+bL0JIdoPkWFsyLog56FiyxH/ivc6BYTeT9iGOZCW93ZZA9IimS81uEUss7Ia2R67PWUXgNz5fahBTmzpV9wanRIObVrF4uz8aWQkukmPEpftX55kscLHrJ+32K4nck7ebISYKzXh2hvZlkvFFxvN9cVIcjbAtArx60gaaYbpFsZd0nHH3tampwIQZaGGmMYZ4xqzQzaYqXy7tO0RJWM43q4qubspaWIgndxXd47+RDWw7dsr8Rnm7ElSHSZNEQ4YAV4XhFeYR+DjSCz8m5Nhxxw3X3atkibbEcWHE3DOXYUoOXBzEQ/Hq/7Jht6wHDGqXcHawFhq8FwdHywUkcRKMk4NJ76XGuhTmnGotPYWtuSgjSI6vOcIi8oopwkqT600NI7dNQj+0cUGycYcYvHJpqp0SpbF0ahGnWcEdVwo8kdOaHwp4jbxaxYR2atXxR2U6WMrW+aUn3Xt7iLAUFrCMfHmSWYeARxY49imkPK4y+LMmt+dqGnCIjqgOER8X96idsZRjslV4Kjc7lcI7SgnWqSjlb02LEaEIvMlruasknCa13RKkSGgRHFSVWsLY8UCLjip41ag04lUVkPlUWttbVOy5zo4viUuaew+KlxtJJqxn9m1XlaZJ5i12tUkkdnW9kqfBUbcLpLS9M04qlTymoqtuRLpO2acNReEnAraHnVfDi+0qptDKNtgSIyHDrYhHDzkpyYtF20mSfkWH5kBcuSJlojpcur278K7xfAp6eFqVH8sW/BEdTFQirzaXi7EoyjGz36hmJSWdItsmmxcHwXm4QIfiijc2yWGUfmX5RyqXcuOCdbJ5xmkiJwReHW0EOaMc0eznUetyWmZa6KdYflL0eC3wF0JdGriE+hGNWbTmU/3L6nJJ8hxBfCJauyIlql6VYeHq0rZk1flcrVcTSqQbi01ydmT2IjrEmyVl2BInamyIiLFUnWZhUJKATj2Ih1aSLzSXPdsV+BOMsidt+j3G9n4COJUtbWJPPNi7hqGnwkzWfZzDDxYhEatokzRnCGmgiq5y8yrhEQ1VFi8qpc/VrxxE1UlBXTT5t3XRGguyMvOX3J/YzIuzIUlrFd1a2sLhd7mqSO2E5VhMKe/UJfvUUyKLGJf9a0Pm0l/wBxTLLmyimrOmWG+u0XjH961jCHx8XjL1XsLEzeHg9Fmeuy7zje1cFT4srq7S897DHb0q+xLuvA0UwQiRCMvS654V25EYFmhnLNn00RhyqnslpQjlJ+x3TvZ1p+ZnW3TIapl9xwimyLnE5ULkIckHhhxDBWVuJWm/vLeU1WLrEaxB3rgtuEVTRwjtA4Lgx8KCrzdilnLMtyUn2cLTzgt54YaXqSOU8VxsX2Y5+0B2V0l5LNCa1Wviv+Hc5uMKeZOD0btr0fNfSxDnYdGnndEtqpbGg871pUhyukwMmrRl/0edqcLmsv6xD8eKObsiSaJaUvXBbpIhGknBHWcEipbYEtknI1Qz8kBcjyKhOk4y+nffkatOspQu9N+63O43Wq+TbDjw9em27tv3iULCTnRN2nNDot59pbZMaWxHoj9lPmVshQziuyOqpw6SGpzojm60MBEYQ5IDBRIrVEcJFSPO5vk6UmPwUqcY7vV/ncOwGMjWu1yWiFrwrzKi2JVOtk6PNFwmfOGEU3v2o1suCXm/aWWrQbLaHxSWU6MkaamiaWbPWIPXrLfPpb8J7zSu1Mci8oLB3223KSO95hy8ETJgSKmmohvqyiOeA/GqfKbHnCtmTtqC1aMs9stuebSVSdRpSc1zI6svkfgdStT7FPN/Z0/ZzreM+xzx8bg/tQgolZsyJstuDqkNSWQiuijhlbm/M5meJkn+lEobIS4iEvBIVug2ojAVtGJbJF5X+6bLDf+RGsTf8AayVULF2o1eO8hu+WXpzLEXpvZfdH4RYMfObz/WonRa/cvUmjVzftfoSIgSd0FHH37U9ymZYi5sxJ4fGJiYhH6kzT1r5SgXBS1izY1d02jIF/iQMfrUbnk6r1J40XPkn5okc9DhnPXWEUhfiqZyP3Q565JyYIXTJ+ZvKxqpIZlwSG80RphTmUg/pL7bLD4jlPmlBcpiaydST72dTRw0owiu5E1mU3TEVFHN0+U22nx8G7L98E3v7p8iRUi2/4wtj/ABqHixJeFIljq8tQUJe3SZTtbv8Ah+lJ/wCktrZaPxiFPjViJwpbFpSMFMpXJmzWHBmRlpFmaHhN8XEs2/eENLjl+MKqo1Fnjn01RVEyW6AblQg0IYSpIsX+y6LsRsYy0s5FtusmGSciICOMmmyLVh2Vr4B5k7dxmY9OFrvfkeGnhIRICEhLVIcQls6ygG7RkuM5LNzbWGakKqSqubyWcIb5snOIc0aThn7/AGVY86ztD433khKKsVaS2DDV9VJHMU5Kzw00iwV3qkUzLCXjVPDVnWG7PnmyHg5QS4PCU43iEsWESfzEObj0wzLpd8RIaSGr12SUXtbJ4iquKqem62XmuSh/5qpLD21SNN4tT0aRT0HREiv3JmULEQixaD93T0bmLuHP2cyf8jnyaeGdOetA2m3CFtl6beJhx0hqbIqYjegMCEqYwzRiQ5+xGRvZIuaxiJ86smG2xHnETbAUjCHLGK1FaEtKEIyoibrAk2ydPBMCRVFvZstUoxIoxdLFGPFTDQpkqcYZpO22mtyGFPiVLRjdddvMk7M+6VJzRuhEh4MCLh8XujlUeCHsQjDPHsQXhx8j1XyHw8Wr0h9Cru0rVdIicIqiLWqWqRtch1j85Y9apd6LTv1fmdBShGK1evdy8ifPnMhi66PZAqvN40hG3Dqu6SEulUJeSSYmreLDwicmbeEqRMRPwqSVSXgWVIdmZ4iw1eStrT5eEkzNqtU0iIj4I0r0NoBskomSq9tBxbMfBW0YDzk3xmR8LwV7gfN8lNIZDjDor0D/ADhTfB9zaHwVtF/ooTsJZMXkbZDSQ1DzY4k3z9hSzokPCBUOwX3s6zvhAPYujtKaniJXsRVacYxciOzW5y0QkO+3BAsXWxvOiVWfNT8MPSotNbkLbrxXNoGV2VLl602LbZdrvBPEfezRzcuZT/KO0zFsWWCpemSIRPtY+7PeLDi75QSeVmBlmRZDVHxiItoiLjIox0xj2SU9TGJStZFChCrUTlm06HPFmTDbFNZCNRbItj7nVrCHvmbTGHKpK5lK0Ijwg+UosO4NaTrpOv2k6RuFiIR/h4hHvQTrKbgb401Wg6dOKkxqHyVPVoZpayK2HqxhHvFTuUbfPEfCIR+0vck40644TzjptEwQtjJTLLTjbtXBuFvmXcbcCnRmzw1uVWBkpku/Ki227LWfNCO3GUuH/nGzjAi+GCs+w5aTGARNoW83G3SJD9mC18JhMJG0s92ujSt7sy8b2jitYqFk+qf2WhwK/khb1pkLwtPvMkRE0RC22yDYkQiRFngGrpzwXau4ZZnU/J6UlDlpaVelHQmXQlX3H70nCFp99xx3Od7EDhnzxjDihDRCCe/ycau35dve1y4Tt1n42wccvAG7JuIFSWzHOMYDmjDNGMEWdk5vZpwRflzrlnWCokJGVccqHBFx2VzR0RzFmhCEI0rey4VRfD0bft3JKy8znJYvFVH/ALi0V7Jb8tbvX0HPK3KSzWGyZtAmKC1mZghMXNnrRwjefFBRIrKkZabbKz2hZl50GptiDROtt8KEBOAs5qePTmzwzVKFZTbn1oTcyUybsiJEVWtNl5OBSnI2ynGrll823XWaWyoMiERvKhEW3MQjCHFnzLPx86UKLjGV79L6eJo4CFeVROasvzQnxDhJQTK2zqbx8dUi4QeaRfw8qm8/MtsNE87hAdYtbaUenbVlnGyIMdWsOsLg80hLMvP+1oQlFKTXn/g7jsl1YSc4RbXJ7EMaIRb8La6X3kqB6psfBGmmqrDzS+FLWpeVIhztvhiqogVQ4fj1VvYgw05UDZdE3Swt+CPpXMU6UFq5LmdHUqrpF3JDkqxRLDrVb5YeLnCREOH5FaCqiyrVBwnGGsRi225tEJFeDrEUOzpz5laYuQ5SHyl6b2U4PDRUHdI4DtFTVeTmrNkJysb3raTE7DQDuF3wY0tu/JC6P9nHspv3aclhtOyHmR0ORbpbOGEm3M4uSzols0TAt6eSBmpnlJZwzTBNZwqziQxLVhslVm05ogRQUI3SbVnLIsJ6ZahITJy0uV6EzMHLXoDh4KkMbtFMc0Yjpho5F0tGrmya/Mnaz6rp9jl8RQcJSaXyvW+z/wCSodz15xyzHpSbwO0uOCBFSW+5QqXm2qtoj4vCLsKyNzrIAn5cZmYMmgIqm7qmqYw0OO1GOFrYHswGMdtQ3IWTG1ZmWtR0TlmptlonZchwsPDU3OuSxcZC5GoBOOaPDOx4xXRkkbV2MG6RAREREdAiIwpGAw5IQhoTMRNxfyck3Z8/yxPh1GV1N2bSbXL8uMjeRUjSNTd5TynGr/ZeY5GWZ2hv6krygtCkaAjrccYciiL5lrYy8FSUadaqrubRVxWNo0JZYRTH8skrMHYAfjD0LX+S9nckRh819xRSZEtqtJYR8PWqq2vB49VXFgZ2/Wyku1FL9iXr/RNhyUkY8R/WHoWz8j5bZdcH4Ih91QsZgecQ+St7U17674pJrwVXpP2F/wCqQXOHu0Sr8i2uSZe+UPurIZJYiG/fhDNx8HSXi8aZ5OaEvdHfKUgsmdzFiMih0lVrU60Fzv5ItUMZRm1eNvNmv8kuxMOfGI/uWxvJkh93KPiqRNlnhngvaoOvPrb0X2NlUIc1f1ZHYZPF236o+lHUM+cMflH9ykSE3ivZeiHcFbv1I2Vju9H5UlnZF1ttx0h0NtuOFi7WJF/CpcoPun2zdMRkGjrnbQZmG2JeFNV0AZ5mYLmtAGjPHlMYcafS+eSVkQ13woOV37HMdkBSMyPNnZvzn3HP4l4ntVbZMuEm9b9LeHF4pfxJPOrmMbG1aa739TpMLLNRi+5fQYZ7WTG7VUXhJ9m4YkxTEcReEqaJjxE0ploaqTRSqS1k9AyVWOOqI4iIhEfCIqV0nlBlednlJNzDDVDz0lLOGDrnAlMuNsNkIk3C8Gshhyac3ZXPGQ8veWjIN7JTLBeS82X8Iq6N3P8A+WlMjrNNXw/3ko+My2XxXeddX2NQTptvq/oct21UfFjHufuWe8VPlU+dSmO2rUunaRYE8NVRGLeLm9binKTmBflm3R1X2m3R/aNi4P8ACmLKsRpadLV1eb66w/WtahBOVpGHVqNQzRNNuZTCwTdEobwuNC5UNyI4hEiHFGFWarNn7IxWLEypF+8qlHWrtpx4arkhcJvWbwxjTo05482Kj2VLIuyDRiQDcOONERCTuHXb1Yw5HeymHJqauHL4HGjNsXKRFpwbypshu6s+YRjVy6FNKhFL19vuJTrSlyN2XOVLjpMs3e9xEanGq7ypwiKmohgPFAeLNoqUOnbYbbEiqUeti2yaFy9LHU5VzhKqmmnjq7yqvLC0H3XxZpMSKmlohIXCItURb4yLNpzZs65HEKVaq7Lr+I9FwqjQoxjfkue+5d2Tcg/ab7LIHvdl6ot8U3mFsSIrloYwvDjdlCEIxGGcdMVrt7JObbcLerouhVSN6Vy5Ts1UwiJFHj0RWdzGDsjLSF6TYuskLxCThYSvLy5IW4RhxaI8nGp1az0oM2/MsiPCEV2dI1UltVc6PF4qt1qFClQzSXze9/sZdLF4mvinCDWVd2nMjGSORLpCTloTZMFssy9LjlPOcec0Dn5owj34qQnkoIj+bzlXReGn/EZ/fBR2etM6ipLCS8ylquDtLAm22dPBJLUl1nWa+2XCt4eeBC42Q+Lp+WEE7FIt7QqIy9tnzkoK2T52zUoJJliNiUNg02hyYbqwkoyxME5iIudhS+XDxkzKxkhwC0SMqcQiO1zqV6bmiq2qVqZiPqKzGYpq6KR2ESFZPimq17d3s224Tbhi8+LVIU1COKpynaGFPFDjqgvLs1hqTdMTL94xcG0AU8MLouE4QkQ4madFWtDTyqSjHUqY2VoJPqzdCdI518u0i2wPRw3jn1kMPFSsj5yZrCKq+c7Y+85/iF+6mCXOviI07XOVarG7LFCCjBI5yDdknv1Mf/uf5a9huzzn6mP/ANz/AC1Zchuev63VRwtYv7X51T0f3J7DIh3annfFbe/mLqZUEuUff+jj4Yim+creRUIbr9oclhvl4s3/AC1tHdctL9QzPkTf8lW0W58dNW/n6cWK7c2db3TkS6U3G98s3xWo6FREOJoiwjhq6/qxTHBLVxt5v7EsJ05uyl7FNjurWoX/APH5r5qb/lLYG6ba5auTs4XgtTv8hWa/uTuSM2Lkvbc208yQuNm0wOEtbVKYzF2M0dEYaIq3bNCcJllvfzRvCy2446UmXD1UlULLc6IslHsQjGGdW4UqKjefs39irVq2llhr7HKsd0i1/wD7cnvmJ3+Qum9zQhOzLOfMTamHJZh16XOqplxxu8cbEXM0cMSKGaMIRVTW9uCSm+Z2ddtWZdJ55x4gGWbFsSfcIibbqms+iJcqsiwCabbFiXfxsMt4SISIRG7bIip2oRpzw5KoLI7Ym6FNTorMr66vReDRqdlxp15OE5Wl0RJd0GNVmOc0ibUDsZ6FNPNVhTbQTksTBlTXTeRCmoDHws+iKhkzk81LNk4MyZ01YboScKnoiWce/GMIZlzeNoPG0VKHQ7DszFUcPSdGo7SctNH1Eb83S54y2HM1Cmx6DhU0hUeLCWGkdkqkSrUzUOdgYBVixUlT8i5qeET0TXPdG7khJXTWn+B2yQe/P3B50s4PhVUiOt4S5/yn3aGnX3pKaG0LPOSmXRF2QfbInqeBJtwX28zY4RLRy511BZNlSwjvkCofdG7qeLrZc2kc0OPl5dCqe2fY4We5NvPm+6RvuuOF1sRqcKrV2dJL0v8A01gZTpuCasktb9dvQ85/1RjKMasZO+1mtupAcit22zbPmymTftefqYcYFmbdYuRvHGSJ4bpnPXC5zQ7xRSDdL3WLItkW23RmWWhfbcIRpJwmxLhGxLNCmqGirkU/H2NVnkWF8vKFbg9jTZtVJOu+KQkS6hdlTUr516/0cs+0qFuXsNNleyJspgREZaZpbFtsREmxFttsaW2xG7wjCCf5b2V9lh/Y5n51sftNqCZb7gJSzhb0qdDWGscShxbkFoOVUShEPOUdWnXo2i27dLWa+g+nTw2I+dWv5p/Ut+0/ZVWa5/Y5vxX2fuJpj7Juzaqt5znzrP3FTtqbl840VJsUF0kla3NXy2afOTY42svlTt6fYV9k4f8AU1fzLq9s5Zvck586x/E2gvZN2XVVGTni/asfy1ULO5Q/zvML0pV/Q4+Q1Xoj4TZelWYVcTJ6S+hDPB4VLVfUtaHsn7M5LPni/byw/wCmvY+yos8f/pk5H/1Mt/LVSBuJTZarrZeC08X/AG86WyPse7XfquWjcp7DEyI+U5CEPrU3/u9/oV5YXBdf8lsNey1kR/8ApE19LY/kraPsvZL9TTH0tr+Sq4nfYs5QtSzk2bTAg3SRAL9Uzd7Tl03AoZh5dOflzaIqNjuIWoWqLRYRLrmy4NQkOjF8SbGjiKmq18Gn9GLOlhKektPG6L9lvZmywwzdR3fpjf8AJSqHszpb9TO/TG/5K53LcOtscQsCXgmJfu6S1FuN22P9kLD69hMeArdYP88yeGJopWjUXqjov25DRatkF8c4P8LKwfswObZMPpUf4WlzY7uV2yOtJueLi/cl0vuZWoI/oh1eKP2syY8HV/g/RjuPS/7i9UdAB7MFyoarJCiqF5mm4107VFTWar4dC27lmVc1aE3amVU712dHeUk0OJuWkmSvCbZq2YnTp443cY8q51HISevm2yYcGohHVqpqKmol1KzZLcnIMSTWEGGW2sPg4iw6NMao54/vV3s/CyzNzjbxRR7SrRyKKle/fexBAP8AOZ8RqL85qGrmkyyWrx99aZ0S5q9uwu52dEcOJkuliZEcXkrzNTbnOXDdqLLiZp/yZ2fZ7vhoNbIYptMc1HhC8Ik/zkyWKoRLxUxTDeIuli/8Vn6FsTFBK5KOJJDW2UjiT4issfcwhVa0hTsuC5zsLd44Xg6B4+RX3lxJg/ZrjZ6mcgL+7fAmyXNmTFqb0fYmaqaXKS8bWHwShUPjKebj27r1SetKUtWWagTc7dSjUuNPBANPCi+UYuHnHPnz7XIuq7MxEKdH5tzlO1sPUnXUorS3+S1NxO0L/J6zSIqjYZKUd519JOFLOVfG2Sebea/NnPey+8P8Q/UovM7odiWazSQlJNE5UVDAttE88VRFwccxGUaoxSMd2TJ18rgZsiJ/g6BbISIi2R062Hk5q0Fi6efMn1uZTwtRxccrFbcb1ibbIRLgwfETFshwEQOFSWeGiB5+LZgoW1Nti5TS1ip1WmcJeRyLWe6tknZ8y63ezwuiLss4JDOzLdJ03g0uPlDZHNHNnhyLaWV2Sm9hnSm7SBl14mxK9tMqnMVQ0tmUdklb+NpPW5Xhg6sdMoo3QrOYd3pPiw0RutC44dA3l9qEREOmqtooZ+yUeJNm5/GWG1KXWmBfmWnZZt0hEpm8Jupqlws5Dni3Toj7onWQykydtJkZKUnLQdFgrylorWZd/OXCpFx4YQJ4YnVmGOfNpTPa+T1lC/UE9NsvM0vUvT1oi43SWEibdxCOfRnzZu+oasoK1RX8babbbF6jCrKPDk/uJ5xtwXXBEmqW3MPXiGnWGodOHNSk09N0DjISqxVDUI4dbC5pSGalZEnidat6gnCIqQtJwWxqxUiJBGke8tGU9mXjFz1TaddKm5OdtCom29YrgXAGGKBDnjphxLExcqdaMle2t1+WNzs7Ph5pvazNmTj7c5Nk0V6LLN2UyYDUQtk5TSJDngJ5qo54w2U47o7EtZTjpOu0tDUQ4ScKnZppjGrRTHjz4tKNz+zGhbJjfbjREVThSFoSkyJEWG8cbcYIhHk49HFBS/KvJGTtJuWGYnJkrhoWaxuLx2kRbvHidlSqPMI6tMOXNnjFWMLhcI6WSco33638+hHjO0cSq+aCeXlbmrb+JU+RuXEnaFQy7hCbes06N25T2wR0wIe/COjlU2kHaiqSMNw2yheF9menGnWyqbMCkhIS6P5pD/dKMpbEnGn2Rs1rfA08JfTMoxVT7o22OL4YRhCCzsf2ZThHNTnF9yepq9ndsObyVItd7WnmPMthW8JlRyXG2Rpqs0Sj0Z6UL7UYLde2qOtZD5dEJmSL/WgsXgz290bPxVPckMJ6lanZ4dbzVG3Zi1f1HPF4LkoX2XkkfmLU/UdpeQyX2XkfDz2D4qnuSGZm+akjU8NQ/s+d66FF5yftf9R2l803/MTKVp2qPXbEtMKdoWKsPimpadCa/ayljKsZpWZK7DtOkbsRIyvnBKnVwuFtEnSZn+cLlPm1f5qqGrWtMH3LiyLTdaeK8wyjhE2Raw0jn5dKmVkWPlE+N4FlTYCWzNXMsXzbzkC+pJLC1OeVlqljKeXmXYe5zN1cFMsANO0D7hdLEJw416Pc8tCkvz5rPs8A/rbPu/ZU2yRt8J6UamYREXcTMy1UNTE20VD7URjpHMYlGGfjhEY8qe4RXUuGV5XzXM4TNB6pfUqccg57WKeappbLrD9VJYXP7RyR+pPljZMTjVIb7a1SAob2dprEuaT+bSOnvqbOMbUM8cXFm2T1xh/mgALsR7GfNyhql8cNCWVOEkEJuL0j+epXc/kLOOuk4c62RE5iLejlNJDwRU74wwhHRFLpHI6ZFhuubqJunEDDjbjYjhJseHjhhxw+NWBCFQ+F8q8tR7MOPWw7UOP5Uxwi1YlTSd7c/H7lfzWRj5jcjM0CRcIdxeE4QlU3iJzCGbscvKm4LFGWdcIWwrcIRJ0W7snBGouELNizx08cVaTw/JxeD2Ipkm5lzFQAkJFqlrCW1raKeVZfauEhVo2cnHwV7mj2diHSrXUU9N7EQGcuL1woQzU4fC2frTNF5twb4hqpqwEJDSRVVYs0OKrj051LX2TOoTaEsWIaRIVpiyI4d7DSOLV5xLkaWGq0abhTnq90+XkdDiK0KkL5Xm3urWIQLjjjzjm9qRqp1hxa1JD5ujpL3+cxKoZYIDSPuu1tYVNTYpxDLeLTh8lepd12qoGKSGktUVlw7Ad7yn6J/csUO0HSpqKi9O9cyNykiThCNJYcWGrxsXrqq4GGhpHCOqPGI81RuXmX3aRJq6EtYtYvm+L4lIZY4xwlhMdaGyUOcHRj9XEu+7HwMMNSeSTfK91YwO08dLEyjnha1+t+Zuuh5o+SK8PS4EJDERzFraFuWMy2MzMlpMaJnJyUPXaq8Y/SkwZISI8TX+I799SDMvOZScepa2Z+pDwYLlFehELT3PrLfKp+Tbdj0if/AIXIJOG5xYw6tnsf4pfacipvEV4JtGdvmHzR5ESlskLNbw7xlB5pXQkJfOZ6S73yJzl7Hlm9SWYDwWmx+zBOpNbK1U062IedtD4XOHvo59X6icR9TU2AjxCI+CIj9leJsYkOGrD0ksu+wtcYjDjIflgnqViGp8ysNkjNnAtFRDyw2f8AyTXa2TjWJ2XAcxVXjY7O0UWxHkz6afkUgdZEtUvJxfZXhsRa1jzR6RCPmqxCtkeaGj23KUqWaOSeq+ngRSXkg2RSiEoPNTraQNEVYFp2oQxCXS6Mf80ljDwfX4ldjXclcoOgoOw3lIDqpPM2aOt683/JO8fX1zLRNGpYVZX5kdSnG2qInP2WI4h04hLZ8ri1uSKQTm0OItoatUS7XTzY4k+Wg95vr6+DBNDg4Sq5tVX2fkWpSba1KdtdCEDk4M5MvCLl06LeEqahIRIhEXB71WiPSSS09z60BqoFp4ei5dkXiuQUjyQc/rFyocV24JFzsTZVdnSrFCC4Dt+nH4lu3NI9A7FrSWHSvyZzraGRlpDrSh9Ki7cHzYqOWjYU4JU72f8AILyV1Q6KapxoatlYfDibHHZyy/Y853M/82S9StizlX6M6PhDSui55oUxTifGnATjMrzJuyivN7TrXBTLZNkJFipqHhBIdLZjERjCMOUexngqf/KTqJb86W9t8b0dcYONVyThAVIvnTCMBMgoz9mI5+VXZlZbIy0y28Q1kLeER2sSglv5MTM489vhoWXbacGfEqcLbYjdtjT34LpqVOl8LGPXV+pgzlUeJlJ/pdl5o9MbqspbT7MhMShS4uOCQnGZKm9bEibHg2qtMdGiEfjVuZCbndmOky9NThS7ouXjNLrk3KXglSP56UYBXGGmkoD8eaObnqeyGKxn5afImpq5cqGVK8En8JDhphhzceeObVT1YWVtL9/ZEyUqbhUuSRERaxERCTJZ7wc+nRnhi4oRVeGWCva/53lipGTdoy+xfltexSk5t9+bG15oSmXCdwy0oTfCc2mMKod/lS2PsaxGy5ay4WnWEs+4+JuylNROVYSFp/DmvOOEVF9zzdhcaJls/wA0IiEnAjwlnPatRCx7gUey1EYQjppjxK+Mn90KWdbHfFMufOA79gvHbhU0fQOEPhjxqeNWM9Fb0SZXnxYfq9ehQmWG5vPZNWXOuSk4JBO3DR3L87ZpsOM1E2+0+JkInGqmNUOIc0IjnjnhO5dlaUu7cZRNb9CbvGnJqeJufZFikiKq0GzJ5kRDRmjoxcmddqSk5KTrbl0bE011twQJt5vwXA00/BFMc5udWQ5V+YygVVVUMMjrDSWrDWxK0sRKNkna3QrcKlO7lzfXwKTnNwOwLTYbm7Km5yRamWrxoWXd+SJtuDhuxfheNQ5NEY5uwtmUvsdxnLgnbQuN6SwywlLiJNk23TieIgqEsOnRmV75NZLMWfKMSUkNEvLN3bIRqKkaic1ijGJaSLlVU+yRyfnDkCfkN8g6w8245cuOUuMDURcGMcRQO7LN0eXMqtavnkk473dtf787lqhCaTyyvtf80GXIfcAKz3nX5e0hmL9gWCvasIi5eVCTLcI1RitJexrEiIhnnxqKrRaFojrfEqNsjdPtmWmRIpt2Yuy1HXHBc8rQQrorc13XJyeFt+YaaZleDbEXb6/mXKqXXG5nQ02AwqjmKEYx7KqThq3G3g9GTRqyWk4+a1QyOexxdHVtCcp6Nqzo/aBOk1uITLtm9Td+GIYfzjfT7k/TfX12UyTdVEY7PF8ivSTeF1sXAKofslzSHZJbCa/8lC5N/tXv9ywmtypbV3LJuZknJI54Wbxm4F5knt8tDSI3jbxBr5h0x5ao9lOFg7nLstLMShWgR3DLbIm62Tjzt2Os44TkLw48uhWVACWIBV0lXd+VvYkuiFDkQ73Z/gf/AOi9jkW7tTmHosYvOcUyg2X/AB/5LEY+L4X3k3Xb2FuiMs5Ftbb8yfjC3/2wSqVyTk28V1WXOeIn/Ncjm+pPsYIoJKnLp7aA2hO1LNtjSAiI80BpHyRXq7FbaVpdqqpESLnEJCJDh1qS1kqhOTGuokcabsGR5TdtPTNmWhZ9Ey2245/WskwV+23duVDeZy0Dn4lBnslrQb/+ryZDzmrZbcxeCLkIj8ipe8WYOLcr4pVHdwjfe7+9jOw+DdKKi53S7l/Zc8vZlqVUjbghzf60IfJ4bMnlizrcEamspxAxxN/1yQlUOIdZyMOPs6FQEX1mD/hKtGo1+1e/3LUqMH/wvsdMWTlrl5hEbYknf/yJyyDLxiI4KS2ZlfugmQiE5Y7pFq/nNkfwvrkKEwswmVNCtTj+qmn5y/w0Q1MNJ/pkl5HarOVW6HiEnbDiQ6wxmrNgXmzCYbQ3WssGHyYecsa9b1hvWSHxXG5jMS5K32XfWIzChxbp1o5VTUXveX0cmPw1GVOV5yutkre51y3uyZVco2GX7TF5s0lDe7VlPytWH5b38MwuPN8L2M0XJUsp4GXRr0/s0eJD8Z2Qxu429tNZP/PvD/rRS1rdttvlayf+lv8A31xPvhet8pvwEv5ez+4qqw29zuqyN2O23XBbFvJ8SIqajm3xESLnFXhU+aykylOnNHJcj2aZqbLZ2V82AmSEqhIs/ZS123HzGk33SHmxMtn41qYP/YjlaT73f6XM7F0XVd4Sy+9/M+kMLbys5mTfxTM8swtzKnajk0HwzE8X7182oWu72xz5wvSsRtZ3nueUXpV74mH8I+/3KXwlb+Z9KAtPKwuXJqHjz5f5GtJ2llhyfk3/AO/j/rL5vwtl3trvzjnpR1af7a75bnpR8TD+Eff7iPB1f5fnofRSZtHLWmoTycH9nOl/rpjnrdy17uyeD/00z/qOxXA0bZf7a78456VrO0nC4zc8ovSnfFUv+2vdf5G/BVn+/wBrncU7beXWzatgw8FgR/7kc6Zpie3QD1LasrxAlB/gzrjIp8+cXlIhPFzi8pROvSb/APjXq/uTxwlRL9Sv4HX0xZ26KXFbcr4jsu3/AKeZa5uxt0Okarea8WZlhLzWVyRC03e2OfOF6UdVHe2O/OF6U+Negv8A6l6v7kcsHWf71/8Ak6hdyYy6cL84tknRLZG0xb8WkYD8iWZMZKZRSzwvmLr5CWuMy3M+UROasVyj1Sc7YflF95bAtd0dV10f2jnpT1iqSf6Pd/cY8BWtbNH0/s+l+SFqOPsi3MNExMU4hOkbynWIdOJSCEu5sj9n0r5YjbL+tfu4dXhHMPg6VuhlFM90zPzrv30541dF/krf9Jl/Je59SIslzSTdPFrYh8YhH7UV8yPykm+6Zn593761OW0+Ws++XwuH95Cx9ugkux5S/cj6MWq5rUkOHDrN4ulx/F8iQuu0tbNVJYah9PKvnidrOlrOu/OOeleY2o72135xz0qzHtqSVsvuN/6Av5+39ncATt26TgOCBiOEhcbxCVOtp+WEU+M5XuiPXGC8IR/hOC4C6ouc8/KJZhaDnPPyi9Kwu0M2JqZ9Fp4m7gsPHDwy3ud+wy0Mar3exjs0kTf8ZJHMZbD2tr53/ZcHxtFztrnll6V56ouc8/KL0rP+Dlv+epczI7Zn8sS2W2vnCL9yYJ/KhwtUWh8ov3rkbqi521zyi9KOqTnbD8ovvJywkl1DNE6lsazDtC02ydxBSI6tIiNRVd5XlP5MsPkwRDiZbFtuntY6q+d8bafwwv3cOrwrnpXpvKCaHVmX4ftnfvrQozlCOVq5Sr4bPK8ZWO0N1fc8cp33KiTxCI0h2shw1U83MRR+Fc1ZS5MONuDesFLuiWuIONkJYtUh08XKoL+UU33XM/PvffRC35nF+cv4tbhHI/aKKdKpdfp9ySjTcNJSv5Fh2Na83LE2T7Q2hLtiQ0YW51seDpK8zZnKbsYQzw2VKbIy4k2nL6SnjlHRux3pPC41SJOFeNtvDn0RwQjGHJn4sypArZf5X3PLJI5iaiesVXhYi8pVnSzPX2LGZLk/J8jvyzssSkRYctSR3vNXgtsWgDrbcsV43URC6xGkms1Og4aYdmMc6VH7IiUFwm7uWKmrFv5ilynaGrN9a4fd3SbZNttp20H3mmW7tpt4r0GwpEaREtGq2MPgFI/yxmdoZY/DlmS/co+HXv8Ar025kTVFrWOvcd6y3sgJQixSwkPvU3LufvTtK7tUietLP+LdkPlVr54FlU7TTcyv0ZsfsohlW/2uX+a/5J9q6/d7f2M4dH+L9TvLKW1slLS/TbNqItZ3exNvD0r5mECL5U02DIZNyZDvWengZEiJuXmBJ5gbzWEam6xGPHmzxzLieGWD/a5f5r/mtjeXEyPuUtHwmi++iXxElZy9h64a39T6LWNugWHLNk2D9NRXhYHiJxykRqqKHYEUrLdYsbt5l4LRL5xwy9me0yf0f/mt/wDSNN8dzI/RR+8ktX/l7DMlPZ+p9ET3XrI7afzRLU5uvWR2x3wrsvQvnr/SXPbLcmPgybP8S9R3TrQ5snDwZOXTXCs+vsOSp959Bi3YLKp1nCLpDSX+Sx/TFZVVIuc6oiKn7UF8/wAd1a0+dLfQ5bD4OFaz3U7X7eA+DLSw6v7NN4VXcX/b2Z9Aw3W7LqLhP8QaSSab3Y5ERwCJR2RvP4tC4JDdWtnuoPo0p/L41gd1a2aqt+Qq4v0aU+zc5kcKrv8AnoFobHc09u1MDqMV9HEReLd50w2ju1Th1b1kXS8Bhwqf2hQzfWuPC3Ybe/WBj4LUoP2WMK0zO6tbjg0naD9PRu2/OZAYpHRqvr7/AND0obDeNl2byzTnkgiFlWb3YfkB95RStFatcKX8voHGj/El/UezO7nPmw9KxCxbO7uLyW/SolBxZvIo4cv5fQONDYl/USze7i8lv0o6i2b3cXktffUQvIovIo4ctxePDYmHUOze7i8lr76Oolmd3F5LX31D7yKLyKOHLf6Bx4bEw6iWb3cXktffXiNiWf3d5rf31EryKL6KOHPf6C8eGxK42LZ/dnmt/fXnqNI92ea399Ra9is3xI4c9/oHHhsS4LCs8v7dT+zD76x1Bs/u75QD76iN9FF7FGSf8vZCOtDYl0bAke7h8lv76HMn5PDTPDTtRiIa3giaiN9FF9FGSW/sg40NiX/k7J/rAPmx/mLBZOSf6wb8kfvqI3xIvooyS39kHGhsS2GTcp3c35I/fRDJuV7ua8n/AJqJ3xIviRknv7BxobErjk1Ld3N+SP315PJuW2ZxsvF/5qLXxLF8SMk9/YONDYljWTLBU/njQ1dmnV6WPD8CweTLA/2xr18dRS+JF8SMk9w40NiURyba7rb8n/mvQZLtkJFvtqkfBHza86it8SL4kZJ7hxqexJ/yaa5JsPJ/5ry5k42P9pb9fjUaviRfElyT39heNT2JF1Ab7pb8n/dBZPt90t+T/uo7fEi+ijJPcONT2JB1ADt4eT/ujqAHbw8kkwX5Ig+SbknuHGp7EjmclybprdbGoah6Q85aOoI9tDzkyRmCRvgkZJ7hxqew8xsD31vzkRsD31vzkzb4JG+CS5J7hxKew89QffQ85eY2F76HnJnhMEs75JJknuHFpfxHbqL74HnLx1FLnh53oTXvglnfBJ2We4jq09h06il2wPO+6iNilzw870Js3ySN8kjLPcXiU9hwjY5c4fO9C1P2aQ8ZD8VXoSPfJI3ySFGe411Kex7jL9LzS9CIsdL6i9C13xIv4p1pEeaJ6uekPnehFz0h870LxfRRfRS6iXiernpD53oWbrvj6/EvO+CRvgkfMF4nuDHSFZjLdIV43wSzCZLspLSFzRPW9+kKIS3SHyl530SN8ki0hc0DZvXpD5SzvXwfKXmE85yRXjfJJtpDs1M270j0flRvQu98q1b5JG+iRaYZoG2MmXqQo3mXrFa99n2UQnD5yW0gzUu8TIQhSFYEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgAQhCAP/2Q==\n", + "text/html": [ + "\n", + " \n", + " " + ], + "text/plain": [ + "" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "from IPython.display import YouTubeVideo\n", "YouTubeVideo('sjfsUzECqK0')" @@ -441,45 +481,42 @@ "#### Summary\n", "\n", "\n", - "For a general take on data manipulation, particularly with `pandas`: \n", - "See Jake VanDerplas' excellent book Python Data Science Handbook. \n", + "Start with Jake VanDerplas' excellent book **Python Data Science Handbook** (free online). \n", "\n", "\n", - "We have here multi-dimensional oceanography datasets in\n", - "NetCDF and CSV format. Corresponding Python libraries are `XArray` and `pandas`.\n", - "On import these libraries are abbreviated `xr` and `pd` respectively.\n", + "This data is in NetCDF and some CSV. Python libraries are `XArray` and `pandas`\n", + "abbreviated `xr` and `pd` respectively.\n", "\n", "\n", - "The XArray method `.open_dataset('somefile.nc')` returns an XArray Dataset:\n", - "A set of XArray DataArrays. The Dataset includes four (or more*) sections: `Dimensions`, \n", - "`Coordinates`, `Data Variables`, and `Attributes`. To examine a Dataset\n", - "called `A`: Run `A` (i.e. on a line by itself) to see these constituent sections. \n", + "The XArray method `.open_dataset('file.nc')` returns an XArray Dataset which is \n", + "in turn a collection of XArray DataArrays. The Dataset includes four (or more*) sections: \n", + "`Dimensions`, `Coordinates`, `Data Variables`, and `Attributes`. \n", "\n", "\n", "* \"more than four\": Discovered while looking at seismic (DAS) data: Some XArray\n", "data may include yet another internal organizing structure.\n", "\n", "\n", - "In pandas the data structure is a DataFrame. Here these are used to manage \n", - "shallow profiler ascent/descent/rest metadata.\n", + "In pandas the table-like data structure is a DataFrame. DataFrames are are used here\n", + "to manage shallow profiler ascent/descent/rest metadata.\n", + "\n", + "\n", + "Post-read: Remove extraneous content from a dataset, downsample, remove NaN values, \n", + "change the primary `dimension` from `obs` (for 'observation') to `time`, unify/combine\n", + "Datasets, save the results, and of course create visualizations, often data-versus-depth\n", + "charts.\n", "\n", "\n", - "Common reductive steps once data are read include removing extraneous components from\n", - "a dataset, downsampling, removing NaN values, changing the primary `dimension`\n", - "from `obs` (for 'observation') to `time`, combining multiple data files into \n", - "a single dataset, saving modified datasets to new files, and creating charts. \n", + "Datasets in this JupyterBook are kept fairly small. Larger datasets can be \n", + "downloaded into a repo-external location.\n", "\n", "\n", - "Datasets that reside within this [GitHub repository](https://github.com/robfatland/ocean)\n", - "have to stay pretty small. Larger datasets are downloaded to an external folder. \n", - "See for example the use of `wget` in the **`Global Ocean`** notebook.\n", - "The following code shows reduction of a global ocean temperature data file to just\n", - "the data of interest (temperature as a 3-D scalar field). \n", + "The following code reduces a global dataset for temperature to just data of interest.\n", "\n", "\n", "```\n", "# Reduce volume of an XArray Dataset with extraneous Data Variables:\n", - "T=xr.open_dataset('glodap_oxygen.nc')\n", + "T=xr.open_dataset('glodap_temperature.nc')\n", "T.nbytes\n", "T=T[['temperature', 'Depth']]\n", "T.nbytes\n", @@ -492,24 +529,19 @@ "A 'thin layer' of signal variation might be washed out by combining samples. \n", "\n", "\n", - "This repository does include a number of examples of down-sampling and otherwise selecting out\n", - "data subsets. \n", - "\n", - "\n", - "\n", - "\n", "#### XArray Datasets and DataArrays\n", "\n", "\n", "##### Summary\n", "\n", - "There are a million little details about working with XArray Datasets, DataArrays, numpy arrays, pandas DataFrames,\n", - "pandas arrays... let's begin! The main idea is that a **DataArray** is an object containing, in the spirit of \n", - "the game, one sort of data; and a **Dataset** is a collection of associated **DataArray**s. \n", + "There are details to learn when working with XArray Datasets, DataArrays, numpy arrays, pandas DataFrames,\n", + "pandas arrays, and so forth. The main idea is that a **DataArray** is an object containing one type of data; \n", + "and a **Dataset** is a collection of associated **DataArray**s. \n", "\n", "\n", "##### XArray ***Dataset*** basics\n", "\n", + "\n", "**Datasets** abbreviated `ds` have components { dimensions, coordinates, data variables, \n", "attributes }.\n", "\n", @@ -547,10 +579,11 @@ "def my_preprocessor(fds): return fds.swap_dims({'obs':'time'})\n", "\n", "ds = xr.open_mfdataset('files*.nc', \\\n", - " preprocess = my_preprocessor, \\\n", + " preprocess = my_preprocessor, \\\n", " concat_dim='time', combine='by_coords')\n", "```\n", "\n", + "\n", "##### Obstacle: Getting information out of a Dataset\n", "\n", "\n", diff --git a/book/chapters/rob/issues.ipynb b/book/chapters/rob/issues.ipynb index d9a4dae..b614c30 100644 --- a/book/chapters/rob/issues.ipynb +++ b/book/chapters/rob/issues.ipynb @@ -5,7 +5,13 @@ "id": "d7298eb1-3264-4415-bc2b-b2351e97e8da", "metadata": {}, "source": [ - "# Duplicate timestamps in THREDDS 1Min data\n", + "# Issues\n", + "\n", + "\n", + "## Duplicate timestamps in THREDDS 1Min data\n", + "\n", + "\n", + "Overcome this by using zarr files from CAVA.\n", "\n", "\n", "In the `data.ipynb` notebook the goals are:\n", @@ -168,12 +174,25 @@ "```" ] }, + { + "cell_type": "markdown", + "id": "ba920d0e-0b3b-402a-b40b-04e84059cd66", + "metadata": {}, + "source": [ + "## recreating shallow profiler notebook\n", + "\n", + "\n", + "- Need consistent naming for spkir\n", + "- Need to re-get the data from CAVA\n", + "- Address bad pCO2 for not-july-22 months" + ] + }, { "cell_type": "markdown", "id": "53f9a65e-39d8-453c-b667-7f8a2b048f36", "metadata": {}, "source": [ - "# icepyx install is tetchy\n", + "## icepyx install is tetchy\n", "\n", "\n", "* I clone the `argo` branch: `git clone -b argo https://github.com/icesat2/icepyx`\n", diff --git a/book/chapters/rob/shallowprofiler.ipynb b/book/chapters/rob/shallowprofiler.ipynb index eb4bdfe..6789285 100644 --- a/book/chapters/rob/shallowprofiler.ipynb +++ b/book/chapters/rob/shallowprofiler.ipynb @@ -5,28 +5,24 @@ "id": "fcf387a2", "metadata": {}, "source": [ - "## The OOI RCA Shallow Profiler\n", + "## The Shallow Profiler\n", "\n", "\n", - "This notebook introduces physical and bio-optical data from the Ocean Observatories \n", - "Initiative (***OOI***) Regional Cabled Array (***RCA***) *Shallow Profiler*, shown below. \n", - "These platforms are anchored to the sea floor by cables. They are positively buoyant\n", - "and are parked at a depth of 200 meters where they continuously record sensor data. \n", - "By means of a cable/winch they regularly profile (sample) the upper 200 meters of the \n", - "water column, hence the name shallow profiler.\n", + "Shallow profilers (one shown below) live in fairly deep parts of the ocean. \n", + "They are so named because they operate in the upper 200 meters of the water column. \n", "\n", "\n", - "Some further detail on how data are collected: The bulbous pod in the photo below \n", - "(called the Science Pod or SCIP) is attached to the moored rectangular platform \n", - "by means of the yellow cable. The profiler ascends and then descends nine times per day.\n", - "Multiple instruments are visible, bolted to the SCIP, where each instrument bears\n", - "one or more sensors. Hence the sensors correspond to types of data: Temperature, \n", - "chlorophyll fluorescence and so on. \n", + "This notebook introduces physical and bio-optical data from several such profilers,\n", + "each anchored to the sea floor by cables.\n", "\n", "\n", "\n", - "![shallow profiler](../../img/rca/images/rca/shallow_profiler_platform_1_in_situ.png)\n", - "\n", + "```{image} ../../img/rca/images/rca/shallow_profiler_platform_1_in_situ.png\n", + ":alt: shallow profiler\n", + ":class: bg-primary mb-1\n", + ":width: 600px\n", + ":align: left\n", + "```\n", "\n", "\n", "Photo taken by the Remotely Operated Vehicle (ROV) \"Ropos\" at a depth of 200 meters." @@ -62,49 +58,81 @@ "id": "22247484-c1bc-4522-81ca-4e6603c57aac", "metadata": {}, "source": [ - "## Build a data dictionary **`d`** for a given site and month\n", + "## Data dictionary\n", + "\n", "\n", + "Here is a short vocabulary list towards understanding the data we explore here.\n", "\n", - "From the imported `shallowprofiler.py` module we have available `sensors`: A list of lists. \n", - "Each entry is `[sensor_name, instrument_name]` so for example `sensors[4]` is `['temperature', 'ctd']`.\n", - "To see the entirety run a Python cell with just `sensors`.\n", "\n", - "With instrument and sensor names sorted (with spectral irradiance a special case) the next step\n", - "is to build a data dictionary called **`d `** with keys corresponding to sensor (data) types:\n", - "**`conductivity`, `temperature`, `pco2`** etcetera. The corresponding value for each sensor\n", - "key is a five-tuple indexed \\[0\\], \\[1\\], ..., \\[4\\].\n", + "- An ***array*** is a large, logistically challenging undersea observatory\n", + " - The one we are concerned with here is called the **Regional Cabled Array** or **RCA**\n", + "- A ***site*** is a location with a fixed latitude and longitude\n", + " - We are concerned with three sites, to be elaborated more later\n", + " - In particular we focus on a site called **Oregon Slope Base**, abbreviated **OSB**\n", + "- A ***platform*** is a mechanical structure installed at a site\n", + " - We are concerned with a fixed platform -- the one anchored to the sea floor\n", + " - We are also concerned with a kind of \"sub-platform\" that is connected to it\n", + " - The sub-platform is called the SCIP, short for SCIence Pod\n", + " - It is attached to the main platform by means of a winch\n", + " - Like the main platform the SCIP is positively buoyant (it floats)\n", + " - When the winch is unspooled the SCIP gradually rises toward the ocean surface\n", + "- An ***instrument*** is a device bolted to a platform\n", + " - Each instrument carries one or more *sensors*\n", + "- A ***sensor*** measures some physical parameter, recording measurements as data\n", "\n", "\n", + "The following cell builds a dictionary of datasets derived from sensors attached to a\n", + "shallow profiler. \n", + "\n", + "\n", + "```{note}\n", + "For further details on how the Python code works see the chapter **Shallow Profiler Technical**\n", "```\n", - "0: XArray DataArray: sensor data\n", - "1: XArray DataArray: sensor depth (meters, negative down) corresponding to data\n", - "2: float: Default charting lower limit for data\n", - "3: float: Default charting upper limit for data\n", - "4: string: Default chart color e.g. \"blue\"\n", - "```" + "\n", + "\n" ] }, { "cell_type": "code", - "execution_count": 86, + "execution_count": 2, "id": "0dc9ce86-ece0-4a8e-b016-b8604c1c30e2", "metadata": { "tags": [] }, "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "./../data/osb_ctd_jan22_temperature.nc\n", - "./../data/osb_pco2_jan22_pco2.nc\n" + "ename": "FileNotFoundError", + "evalue": "[Errno 2] No such file or directory: b'/home/rob/oceanography/book/chapters/data/osb_ctd_jan22_conductivity.nc'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", + "File \u001b[0;32m~/miniconda3/envs/argo-env2/lib/python3.11/site-packages/xarray/backends/file_manager.py:211\u001b[0m, in \u001b[0;36mCachingFileManager._acquire_with_cache_info\u001b[0;34m(self, needs_lock)\u001b[0m\n\u001b[1;32m 210\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 211\u001b[0m file \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_cache[\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_key]\n\u001b[1;32m 212\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mKeyError\u001b[39;00m:\n", + "File \u001b[0;32m~/miniconda3/envs/argo-env2/lib/python3.11/site-packages/xarray/backends/lru_cache.py:56\u001b[0m, in \u001b[0;36mLRUCache.__getitem__\u001b[0;34m(self, key)\u001b[0m\n\u001b[1;32m 55\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_lock:\n\u001b[0;32m---> 56\u001b[0m value \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_cache[key]\n\u001b[1;32m 57\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_cache\u001b[38;5;241m.\u001b[39mmove_to_end(key)\n", + "\u001b[0;31mKeyError\u001b[0m: [, ('/home/rob/oceanography/book/chapters/data/osb_ctd_jan22_conductivity.nc',), 'r', (('clobber', True), ('diskless', False), ('format', 'NETCDF4'), ('persist', False)), 'f6d2224e-9178-46b2-9e35-ddafe4f594ee']", + "\nDuring handling of the above exception, another exception occurred:\n", + "\u001b[0;31mFileNotFoundError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[2], line 29\u001b[0m\n\u001b[1;32m 27\u001b[0m f \u001b[38;5;241m=\u001b[39m AssembleDataFilename(relative_path, sitestring, sensor[\u001b[38;5;241m1\u001b[39m], monthstring, sensor[\u001b[38;5;241m0\u001b[39m])\n\u001b[1;32m 28\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m sensor[\u001b[38;5;241m0\u001b[39m] \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mspkir\u001b[39m\u001b[38;5;124m'\u001b[39m:\n\u001b[0;32m---> 29\u001b[0m d[sensor[\u001b[38;5;241m0\u001b[39m]] \u001b[38;5;241m=\u001b[39m GetSensorTuple(sensor[\u001b[38;5;241m0\u001b[39m], f)\n", + "Cell \u001b[0;32mIn[2], line 18\u001b[0m, in \u001b[0;36mGetSensorTuple\u001b[0;34m(s, f)\u001b[0m\n\u001b[1;32m 13\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mGetSensorTuple\u001b[39m(s, f):\n\u001b[1;32m 14\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m'''\u001b[39;00m\n\u001b[1;32m 15\u001b[0m \u001b[38;5;124;03m s is the sensor identifier string like 'temperature'\u001b[39;00m\n\u001b[1;32m 16\u001b[0m \u001b[38;5;124;03m f is the source filename like './../data/osb_ctd_jan22_temperature.nc' \u001b[39;00m\n\u001b[1;32m 17\u001b[0m \u001b[38;5;124;03m '''\u001b[39;00m\n\u001b[0;32m---> 18\u001b[0m df_sensor \u001b[38;5;241m=\u001b[39m xr\u001b[38;5;241m.\u001b[39mopen_dataset(f)[s]\n\u001b[1;32m 19\u001b[0m df_z \u001b[38;5;241m=\u001b[39m xr\u001b[38;5;241m.\u001b[39mopen_dataset(f)[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mz\u001b[39m\u001b[38;5;124m'\u001b[39m]\n\u001b[1;32m 20\u001b[0m range_lo \u001b[38;5;241m=\u001b[39m ranges[s][\u001b[38;5;241m0\u001b[39m]\n", + "File \u001b[0;32m~/miniconda3/envs/argo-env2/lib/python3.11/site-packages/xarray/backends/api.py:566\u001b[0m, in \u001b[0;36mopen_dataset\u001b[0;34m(filename_or_obj, engine, chunks, cache, decode_cf, mask_and_scale, decode_times, decode_timedelta, use_cftime, concat_characters, decode_coords, drop_variables, inline_array, chunked_array_type, from_array_kwargs, backend_kwargs, **kwargs)\u001b[0m\n\u001b[1;32m 554\u001b[0m decoders \u001b[38;5;241m=\u001b[39m _resolve_decoders_kwargs(\n\u001b[1;32m 555\u001b[0m decode_cf,\n\u001b[1;32m 556\u001b[0m open_backend_dataset_parameters\u001b[38;5;241m=\u001b[39mbackend\u001b[38;5;241m.\u001b[39mopen_dataset_parameters,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 562\u001b[0m decode_coords\u001b[38;5;241m=\u001b[39mdecode_coords,\n\u001b[1;32m 563\u001b[0m )\n\u001b[1;32m 565\u001b[0m overwrite_encoded_chunks \u001b[38;5;241m=\u001b[39m kwargs\u001b[38;5;241m.\u001b[39mpop(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moverwrite_encoded_chunks\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;28;01mNone\u001b[39;00m)\n\u001b[0;32m--> 566\u001b[0m backend_ds \u001b[38;5;241m=\u001b[39m backend\u001b[38;5;241m.\u001b[39mopen_dataset(\n\u001b[1;32m 567\u001b[0m filename_or_obj,\n\u001b[1;32m 568\u001b[0m drop_variables\u001b[38;5;241m=\u001b[39mdrop_variables,\n\u001b[1;32m 569\u001b[0m \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mdecoders,\n\u001b[1;32m 570\u001b[0m \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs,\n\u001b[1;32m 571\u001b[0m )\n\u001b[1;32m 572\u001b[0m ds \u001b[38;5;241m=\u001b[39m _dataset_from_backend_dataset(\n\u001b[1;32m 573\u001b[0m backend_ds,\n\u001b[1;32m 574\u001b[0m filename_or_obj,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 584\u001b[0m \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs,\n\u001b[1;32m 585\u001b[0m )\n\u001b[1;32m 586\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m ds\n", + "File \u001b[0;32m~/miniconda3/envs/argo-env2/lib/python3.11/site-packages/xarray/backends/netCDF4_.py:590\u001b[0m, in \u001b[0;36mNetCDF4BackendEntrypoint.open_dataset\u001b[0;34m(self, filename_or_obj, mask_and_scale, decode_times, concat_characters, decode_coords, drop_variables, use_cftime, decode_timedelta, group, mode, format, clobber, diskless, persist, lock, autoclose)\u001b[0m\n\u001b[1;32m 569\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mopen_dataset\u001b[39m( \u001b[38;5;66;03m# type: ignore[override] # allow LSP violation, not supporting **kwargs\u001b[39;00m\n\u001b[1;32m 570\u001b[0m \u001b[38;5;28mself\u001b[39m,\n\u001b[1;32m 571\u001b[0m filename_or_obj: \u001b[38;5;28mstr\u001b[39m \u001b[38;5;241m|\u001b[39m os\u001b[38;5;241m.\u001b[39mPathLike[Any] \u001b[38;5;241m|\u001b[39m BufferedIOBase \u001b[38;5;241m|\u001b[39m AbstractDataStore,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 587\u001b[0m autoclose\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mFalse\u001b[39;00m,\n\u001b[1;32m 588\u001b[0m ) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m Dataset:\n\u001b[1;32m 589\u001b[0m filename_or_obj \u001b[38;5;241m=\u001b[39m _normalize_path(filename_or_obj)\n\u001b[0;32m--> 590\u001b[0m store \u001b[38;5;241m=\u001b[39m NetCDF4DataStore\u001b[38;5;241m.\u001b[39mopen(\n\u001b[1;32m 591\u001b[0m filename_or_obj,\n\u001b[1;32m 592\u001b[0m mode\u001b[38;5;241m=\u001b[39mmode,\n\u001b[1;32m 593\u001b[0m \u001b[38;5;28mformat\u001b[39m\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mformat\u001b[39m,\n\u001b[1;32m 594\u001b[0m group\u001b[38;5;241m=\u001b[39mgroup,\n\u001b[1;32m 595\u001b[0m clobber\u001b[38;5;241m=\u001b[39mclobber,\n\u001b[1;32m 596\u001b[0m diskless\u001b[38;5;241m=\u001b[39mdiskless,\n\u001b[1;32m 597\u001b[0m persist\u001b[38;5;241m=\u001b[39mpersist,\n\u001b[1;32m 598\u001b[0m lock\u001b[38;5;241m=\u001b[39mlock,\n\u001b[1;32m 599\u001b[0m autoclose\u001b[38;5;241m=\u001b[39mautoclose,\n\u001b[1;32m 600\u001b[0m )\n\u001b[1;32m 602\u001b[0m store_entrypoint \u001b[38;5;241m=\u001b[39m StoreBackendEntrypoint()\n\u001b[1;32m 603\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m close_on_error(store):\n", + "File \u001b[0;32m~/miniconda3/envs/argo-env2/lib/python3.11/site-packages/xarray/backends/netCDF4_.py:391\u001b[0m, in \u001b[0;36mNetCDF4DataStore.open\u001b[0;34m(cls, filename, mode, format, group, clobber, diskless, persist, lock, lock_maker, autoclose)\u001b[0m\n\u001b[1;32m 385\u001b[0m kwargs \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mdict\u001b[39m(\n\u001b[1;32m 386\u001b[0m clobber\u001b[38;5;241m=\u001b[39mclobber, diskless\u001b[38;5;241m=\u001b[39mdiskless, persist\u001b[38;5;241m=\u001b[39mpersist, \u001b[38;5;28mformat\u001b[39m\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mformat\u001b[39m\n\u001b[1;32m 387\u001b[0m )\n\u001b[1;32m 388\u001b[0m manager \u001b[38;5;241m=\u001b[39m CachingFileManager(\n\u001b[1;32m 389\u001b[0m netCDF4\u001b[38;5;241m.\u001b[39mDataset, filename, mode\u001b[38;5;241m=\u001b[39mmode, kwargs\u001b[38;5;241m=\u001b[39mkwargs\n\u001b[1;32m 390\u001b[0m )\n\u001b[0;32m--> 391\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mcls\u001b[39m(manager, group\u001b[38;5;241m=\u001b[39mgroup, mode\u001b[38;5;241m=\u001b[39mmode, lock\u001b[38;5;241m=\u001b[39mlock, autoclose\u001b[38;5;241m=\u001b[39mautoclose)\n", + "File \u001b[0;32m~/miniconda3/envs/argo-env2/lib/python3.11/site-packages/xarray/backends/netCDF4_.py:338\u001b[0m, in \u001b[0;36mNetCDF4DataStore.__init__\u001b[0;34m(self, manager, group, mode, lock, autoclose)\u001b[0m\n\u001b[1;32m 336\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_group \u001b[38;5;241m=\u001b[39m group\n\u001b[1;32m 337\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_mode \u001b[38;5;241m=\u001b[39m mode\n\u001b[0;32m--> 338\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mformat \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mds\u001b[38;5;241m.\u001b[39mdata_model\n\u001b[1;32m 339\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_filename \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mds\u001b[38;5;241m.\u001b[39mfilepath()\n\u001b[1;32m 340\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mis_remote \u001b[38;5;241m=\u001b[39m is_remote_uri(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_filename)\n", + "File \u001b[0;32m~/miniconda3/envs/argo-env2/lib/python3.11/site-packages/xarray/backends/netCDF4_.py:400\u001b[0m, in \u001b[0;36mNetCDF4DataStore.ds\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 398\u001b[0m \u001b[38;5;129m@property\u001b[39m\n\u001b[1;32m 399\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mds\u001b[39m(\u001b[38;5;28mself\u001b[39m):\n\u001b[0;32m--> 400\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_acquire()\n", + "File \u001b[0;32m~/miniconda3/envs/argo-env2/lib/python3.11/site-packages/xarray/backends/netCDF4_.py:394\u001b[0m, in \u001b[0;36mNetCDF4DataStore._acquire\u001b[0;34m(self, needs_lock)\u001b[0m\n\u001b[1;32m 393\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_acquire\u001b[39m(\u001b[38;5;28mself\u001b[39m, needs_lock\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m):\n\u001b[0;32m--> 394\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_manager\u001b[38;5;241m.\u001b[39macquire_context(needs_lock) \u001b[38;5;28;01mas\u001b[39;00m root:\n\u001b[1;32m 395\u001b[0m ds \u001b[38;5;241m=\u001b[39m _nc4_require_group(root, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_group, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_mode)\n\u001b[1;32m 396\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m ds\n", + "File \u001b[0;32m~/miniconda3/envs/argo-env2/lib/python3.11/contextlib.py:137\u001b[0m, in \u001b[0;36m_GeneratorContextManager.__enter__\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 135\u001b[0m \u001b[38;5;28;01mdel\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39margs, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mkwds, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mfunc\n\u001b[1;32m 136\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 137\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mnext\u001b[39m(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mgen)\n\u001b[1;32m 138\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mStopIteration\u001b[39;00m:\n\u001b[1;32m 139\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mRuntimeError\u001b[39;00m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mgenerator didn\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mt yield\u001b[39m\u001b[38;5;124m\"\u001b[39m) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n", + "File \u001b[0;32m~/miniconda3/envs/argo-env2/lib/python3.11/site-packages/xarray/backends/file_manager.py:199\u001b[0m, in \u001b[0;36mCachingFileManager.acquire_context\u001b[0;34m(self, needs_lock)\u001b[0m\n\u001b[1;32m 196\u001b[0m \u001b[38;5;129m@contextlib\u001b[39m\u001b[38;5;241m.\u001b[39mcontextmanager\n\u001b[1;32m 197\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21macquire_context\u001b[39m(\u001b[38;5;28mself\u001b[39m, needs_lock\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m):\n\u001b[1;32m 198\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"Context manager for acquiring a file.\"\"\"\u001b[39;00m\n\u001b[0;32m--> 199\u001b[0m file, cached \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_acquire_with_cache_info(needs_lock)\n\u001b[1;32m 200\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m 201\u001b[0m \u001b[38;5;28;01myield\u001b[39;00m file\n", + "File \u001b[0;32m~/miniconda3/envs/argo-env2/lib/python3.11/site-packages/xarray/backends/file_manager.py:217\u001b[0m, in \u001b[0;36mCachingFileManager._acquire_with_cache_info\u001b[0;34m(self, needs_lock)\u001b[0m\n\u001b[1;32m 215\u001b[0m kwargs \u001b[38;5;241m=\u001b[39m kwargs\u001b[38;5;241m.\u001b[39mcopy()\n\u001b[1;32m 216\u001b[0m kwargs[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmode\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_mode\n\u001b[0;32m--> 217\u001b[0m file \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_opener(\u001b[38;5;241m*\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_args, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n\u001b[1;32m 218\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_mode \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mw\u001b[39m\u001b[38;5;124m\"\u001b[39m:\n\u001b[1;32m 219\u001b[0m \u001b[38;5;66;03m# ensure file doesn't get overridden when opened again\u001b[39;00m\n\u001b[1;32m 220\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_mode \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124ma\u001b[39m\u001b[38;5;124m\"\u001b[39m\n", + "File \u001b[0;32msrc/netCDF4/_netCDF4.pyx:2463\u001b[0m, in \u001b[0;36mnetCDF4._netCDF4.Dataset.__init__\u001b[0;34m()\u001b[0m\n", + "File \u001b[0;32msrc/netCDF4/_netCDF4.pyx:2026\u001b[0m, in \u001b[0;36mnetCDF4._netCDF4._ensure_nc_success\u001b[0;34m()\u001b[0m\n", + "\u001b[0;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: b'/home/rob/oceanography/book/chapters/data/osb_ctd_jan22_conductivity.nc'" ] } ], "source": [ - "d = {}\n", + "d = {} # d is an empty dictionary\n", "\n", - "relative_path = './../data/'\n", + "relative_path = './data/'\n", "sitestring = 'osb' # available: osb = Oregon Slope Base\n", "monthstring = 'jan22' # available: apr21, jul21, jan22\n", "\n", diff --git a/book/chapters/rob/shallowprofiler_technical.ipynb b/book/chapters/rob/shallowprofiler_technical.ipynb new file mode 100644 index 0000000..cc5d459 --- /dev/null +++ b/book/chapters/rob/shallowprofiler_technical.ipynb @@ -0,0 +1,56 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "d7face82-f51e-47d3-ab05-cc8c5fec2e0f", + "metadata": {}, + "source": [ + "# Shallow Profiler: Technical\n", + "\n", + "\n", + "This document documents the code.\n", + "\n", + "\n", + "\n", + "From the imported `shallowprofiler.py` module we have available `sensors`: A list of lists. \n", + "Each entry is `[sensor_name, instrument_name]` so for example `sensors[4]` is `['temperature', 'ctd']`.\n", + "To see the entirety run a Python cell with just `sensors`.\n", + "\n", + "With instrument and sensor names sorted (with spectral irradiance a special case) the next step\n", + "is to build a data dictionary called **`d `** with keys corresponding to sensor (data) types:\n", + "**`conductivity`, `temperature`, `pco2`** etcetera. The corresponding value for each sensor\n", + "key is a five-tuple indexed \\[0\\], \\[1\\], ..., \\[4\\].\n", + "\n", + "\n", + "```\n", + "0: XArray DataArray: sensor data\n", + "1: XArray DataArray: sensor depth (meters, negative down) corresponding to data\n", + "2: float: Default charting lower limit for data\n", + "3: float: Default charting upper limit for data\n", + "4: string: Default chart color e.g. \"blue\"\n", + "```" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.11.4" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +}