{ "cells": [ { "cell_type": "markdown", "id": "f7ca0b83-6c6e-4a5f-9470-f3350131a57b", "metadata": {}, "source": [ "# Introduction to JupyterLab" ] }, { "cell_type": "code", "execution_count": 1, "id": "52858197-98ec-494c-a30a-630baac76cdd", "metadata": { "nbsphinx": "hidden", "tags": [] }, "outputs": [], "source": [ "# Colab setup ------------------\n", "import os, sys, subprocess\n", "if \"google.colab\" in sys.modules:\n", " cmd = \"pip install --upgrade watermark\"\n", " process = subprocess.Popen(cmd.split(), stdout=subprocess.PIPE, stderr=subprocess.PIPE)\n", " stdout, stderr = process.communicate()" ] }, { "cell_type": "code", "execution_count": 2, "id": "d5c6d75f-8cef-473e-bbfe-4894a0ae517f", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "
\n", " \n", " Loading BokehJS ...\n", "
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "(function(root) {\n", " function now() {\n", " return new Date();\n", " }\n", "\n", " const force = true;\n", "\n", " if (typeof root._bokeh_onload_callbacks === \"undefined\" || force === true) {\n", " root._bokeh_onload_callbacks = [];\n", " root._bokeh_is_loading = undefined;\n", " }\n", "\n", "const JS_MIME_TYPE = 'application/javascript';\n", " const HTML_MIME_TYPE = 'text/html';\n", " const EXEC_MIME_TYPE = 'application/vnd.bokehjs_exec.v0+json';\n", " const CLASS_NAME = 'output_bokeh rendered_html';\n", "\n", " /**\n", " * Render data to the DOM node\n", " */\n", " function render(props, node) {\n", " const script = document.createElement(\"script\");\n", " node.appendChild(script);\n", " }\n", "\n", " /**\n", " * Handle when an output is cleared or removed\n", " */\n", " function handleClearOutput(event, handle) {\n", " const cell = handle.cell;\n", "\n", " const id = cell.output_area._bokeh_element_id;\n", " const server_id = cell.output_area._bokeh_server_id;\n", " // Clean up Bokeh references\n", " if (id != null && id in Bokeh.index) {\n", " Bokeh.index[id].model.document.clear();\n", " delete Bokeh.index[id];\n", " }\n", "\n", " if (server_id !== undefined) {\n", " // Clean up Bokeh references\n", " const cmd_clean = \"from bokeh.io.state import curstate; print(curstate().uuid_to_server['\" + server_id + \"'].get_sessions()[0].document.roots[0]._id)\";\n", " cell.notebook.kernel.execute(cmd_clean, {\n", " iopub: {\n", " output: function(msg) {\n", " const id = msg.content.text.trim();\n", " if (id in Bokeh.index) {\n", " Bokeh.index[id].model.document.clear();\n", " delete Bokeh.index[id];\n", " }\n", " }\n", " }\n", " });\n", " // Destroy server and session\n", " const cmd_destroy = \"import bokeh.io.notebook as ion; ion.destroy_server('\" + server_id + \"')\";\n", " cell.notebook.kernel.execute(cmd_destroy);\n", " }\n", " }\n", "\n", " /**\n", " * Handle when a new output is added\n", " */\n", " function handleAddOutput(event, handle) {\n", " const output_area = handle.output_area;\n", " const output = handle.output;\n", "\n", " // limit handleAddOutput to display_data with EXEC_MIME_TYPE content only\n", " if ((output.output_type != \"display_data\") || (!Object.prototype.hasOwnProperty.call(output.data, EXEC_MIME_TYPE))) {\n", " return\n", " }\n", "\n", " const toinsert = output_area.element.find(\".\" + CLASS_NAME.split(' ')[0]);\n", "\n", " if (output.metadata[EXEC_MIME_TYPE][\"id\"] !== undefined) {\n", " toinsert[toinsert.length - 1].firstChild.textContent = output.data[JS_MIME_TYPE];\n", " // store reference to embed id on output_area\n", " output_area._bokeh_element_id = output.metadata[EXEC_MIME_TYPE][\"id\"];\n", " }\n", " if (output.metadata[EXEC_MIME_TYPE][\"server_id\"] !== undefined) {\n", " const bk_div = document.createElement(\"div\");\n", " bk_div.innerHTML = output.data[HTML_MIME_TYPE];\n", " const script_attrs = bk_div.children[0].attributes;\n", " for (let i = 0; i < script_attrs.length; i++) {\n", " toinsert[toinsert.length - 1].firstChild.setAttribute(script_attrs[i].name, script_attrs[i].value);\n", " toinsert[toinsert.length - 1].firstChild.textContent = bk_div.children[0].textContent\n", " }\n", " // store reference to server id on output_area\n", " output_area._bokeh_server_id = output.metadata[EXEC_MIME_TYPE][\"server_id\"];\n", " }\n", " }\n", "\n", " function register_renderer(events, OutputArea) {\n", "\n", " function append_mime(data, metadata, element) {\n", " // create a DOM node to render to\n", " const toinsert = this.create_output_subarea(\n", " metadata,\n", " CLASS_NAME,\n", " EXEC_MIME_TYPE\n", " );\n", " this.keyboard_manager.register_events(toinsert);\n", " // Render to node\n", " const props = {data: data, metadata: metadata[EXEC_MIME_TYPE]};\n", " render(props, toinsert[toinsert.length - 1]);\n", " element.append(toinsert);\n", " return toinsert\n", " }\n", "\n", " /* Handle when an output is cleared or removed */\n", " events.on('clear_output.CodeCell', handleClearOutput);\n", " events.on('delete.Cell', handleClearOutput);\n", "\n", " /* Handle when a new output is added */\n", " events.on('output_added.OutputArea', handleAddOutput);\n", "\n", " /**\n", " * Register the mime type and append_mime function with output_area\n", " */\n", " OutputArea.prototype.register_mime_type(EXEC_MIME_TYPE, append_mime, {\n", " /* Is output safe? */\n", " safe: true,\n", " /* Index of renderer in `output_area.display_order` */\n", " index: 0\n", " });\n", " }\n", "\n", " // register the mime type if in Jupyter Notebook environment and previously unregistered\n", " if (root.Jupyter !== undefined) {\n", " const events = require('base/js/events');\n", " const OutputArea = require('notebook/js/outputarea').OutputArea;\n", "\n", " if (OutputArea.prototype.mime_types().indexOf(EXEC_MIME_TYPE) == -1) {\n", " register_renderer(events, OutputArea);\n", " }\n", " }\n", " if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n", " root._bokeh_timeout = Date.now() + 5000;\n", " root._bokeh_failed_load = false;\n", " }\n", "\n", " const NB_LOAD_WARNING = {'data': {'text/html':\n", " \"
\\n\"+\n", " \"

\\n\"+\n", " \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n", " \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n", " \"

\\n\"+\n", " \"\\n\"+\n", " \"\\n\"+\n", " \"from bokeh.resources import INLINE\\n\"+\n", " \"output_notebook(resources=INLINE)\\n\"+\n", " \"\\n\"+\n", " \"
\"}};\n", "\n", " function display_loaded() {\n", " const el = document.getElementById(\"f7ab9380-fe21-4c70-9e9f-6d5dd490b689\");\n", " if (el != null) {\n", " el.textContent = \"BokehJS is loading...\";\n", " }\n", " if (root.Bokeh !== undefined) {\n", " if (el != null) {\n", " el.textContent = \"BokehJS \" + root.Bokeh.version + \" successfully loaded.\";\n", " }\n", " } else if (Date.now() < root._bokeh_timeout) {\n", " setTimeout(display_loaded, 100)\n", " }\n", " }\n", "\n", " function run_callbacks() {\n", " try {\n", " root._bokeh_onload_callbacks.forEach(function(callback) {\n", " if (callback != null)\n", " callback();\n", " });\n", " } finally {\n", " delete root._bokeh_onload_callbacks\n", " }\n", " console.debug(\"Bokeh: all callbacks have finished\");\n", " }\n", "\n", " function load_libs(css_urls, js_urls, callback) {\n", " if (css_urls == null) css_urls = [];\n", " if (js_urls == null) js_urls = [];\n", "\n", " root._bokeh_onload_callbacks.push(callback);\n", " if (root._bokeh_is_loading > 0) {\n", " console.debug(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n", " return null;\n", " }\n", " if (js_urls == null || js_urls.length === 0) {\n", " run_callbacks();\n", " return null;\n", " }\n", " console.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n", " root._bokeh_is_loading = css_urls.length + js_urls.length;\n", "\n", " function on_load() {\n", " root._bokeh_is_loading--;\n", " if (root._bokeh_is_loading === 0) {\n", " console.debug(\"Bokeh: all BokehJS libraries/stylesheets loaded\");\n", " run_callbacks()\n", " }\n", " }\n", "\n", " function on_error(url) {\n", " console.error(\"failed to load \" + url);\n", " }\n", "\n", " for (let i = 0; i < css_urls.length; i++) {\n", " const url = css_urls[i];\n", " const element = document.createElement(\"link\");\n", " element.onload = on_load;\n", " element.onerror = on_error.bind(null, url);\n", " element.rel = \"stylesheet\";\n", " element.type = \"text/css\";\n", " element.href = url;\n", " console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n", " document.body.appendChild(element);\n", " }\n", "\n", " for (let i = 0; i < js_urls.length; i++) {\n", " const url = js_urls[i];\n", " const element = document.createElement('script');\n", " element.onload = on_load;\n", " element.onerror = on_error.bind(null, url);\n", " element.async = false;\n", " element.src = url;\n", " console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n", " document.head.appendChild(element);\n", " }\n", " };\n", "\n", " function inject_raw_css(css) {\n", " const element = document.createElement(\"style\");\n", " element.appendChild(document.createTextNode(css));\n", " document.body.appendChild(element);\n", " }\n", "\n", " const js_urls = [\"https://cdn.bokeh.org/bokeh/release/bokeh-3.2.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.2.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.2.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.2.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-mathjax-3.2.1.min.js\"];\n", " const css_urls = [];\n", "\n", " const inline_js = [ function(Bokeh) {\n", " Bokeh.set_log_level(\"info\");\n", " },\n", "function(Bokeh) {\n", " }\n", " ];\n", "\n", " function run_inline_js() {\n", " if (root.Bokeh !== undefined || force === true) {\n", " for (let i = 0; i < inline_js.length; i++) {\n", " inline_js[i].call(root, root.Bokeh);\n", " }\n", "if (force === true) {\n", " display_loaded();\n", " }} else if (Date.now() < root._bokeh_timeout) {\n", " setTimeout(run_inline_js, 100);\n", " } else if (!root._bokeh_failed_load) {\n", " console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n", " root._bokeh_failed_load = true;\n", " } else if (force !== true) {\n", " const cell = $(document.getElementById(\"f7ab9380-fe21-4c70-9e9f-6d5dd490b689\")).parents('.cell').data().cell;\n", " cell.output_area.append_execute_result(NB_LOAD_WARNING)\n", " }\n", " }\n", "\n", " if (root._bokeh_is_loading === 0) {\n", " console.debug(\"Bokeh: BokehJS loaded, going straight to plotting\");\n", " run_inline_js();\n", " } else {\n", " load_libs(css_urls, js_urls, function() {\n", " console.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n", " run_inline_js();\n", " });\n", " }\n", "}(window));" ], "application/vnd.bokehjs_load.v0+json": "(function(root) {\n function now() {\n return new Date();\n }\n\n const force = true;\n\n if (typeof root._bokeh_onload_callbacks === \"undefined\" || force === true) {\n root._bokeh_onload_callbacks = [];\n root._bokeh_is_loading = undefined;\n }\n\n\n if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n root._bokeh_timeout = Date.now() + 5000;\n root._bokeh_failed_load = false;\n }\n\n const NB_LOAD_WARNING = {'data': {'text/html':\n \"
\\n\"+\n \"

\\n\"+\n \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n \"

\\n\"+\n \"\\n\"+\n \"\\n\"+\n \"from bokeh.resources import INLINE\\n\"+\n \"output_notebook(resources=INLINE)\\n\"+\n \"\\n\"+\n \"
\"}};\n\n function display_loaded() {\n const el = document.getElementById(\"f7ab9380-fe21-4c70-9e9f-6d5dd490b689\");\n if (el != null) {\n el.textContent = \"BokehJS is loading...\";\n }\n if (root.Bokeh !== undefined) {\n if (el != null) {\n el.textContent = \"BokehJS \" + root.Bokeh.version + \" successfully loaded.\";\n }\n } else if (Date.now() < root._bokeh_timeout) {\n setTimeout(display_loaded, 100)\n }\n }\n\n function run_callbacks() {\n try {\n root._bokeh_onload_callbacks.forEach(function(callback) {\n if (callback != null)\n callback();\n });\n } finally {\n delete root._bokeh_onload_callbacks\n }\n console.debug(\"Bokeh: all callbacks have finished\");\n }\n\n function load_libs(css_urls, js_urls, callback) {\n if (css_urls == null) css_urls = [];\n if (js_urls == null) js_urls = [];\n\n root._bokeh_onload_callbacks.push(callback);\n if (root._bokeh_is_loading > 0) {\n console.debug(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n return null;\n }\n if (js_urls == null || js_urls.length === 0) {\n run_callbacks();\n return null;\n }\n console.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n root._bokeh_is_loading = css_urls.length + js_urls.length;\n\n function on_load() {\n root._bokeh_is_loading--;\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: all BokehJS libraries/stylesheets loaded\");\n run_callbacks()\n }\n }\n\n function on_error(url) {\n console.error(\"failed to load \" + url);\n }\n\n for (let i = 0; i < css_urls.length; i++) {\n const url = css_urls[i];\n const element = document.createElement(\"link\");\n element.onload = on_load;\n element.onerror = on_error.bind(null, url);\n element.rel = \"stylesheet\";\n element.type = \"text/css\";\n element.href = url;\n console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n document.body.appendChild(element);\n }\n\n for (let i = 0; i < js_urls.length; i++) {\n const url = js_urls[i];\n const element = document.createElement('script');\n element.onload = on_load;\n element.onerror = on_error.bind(null, url);\n element.async = false;\n element.src = url;\n console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n document.head.appendChild(element);\n }\n };\n\n function inject_raw_css(css) {\n const element = document.createElement(\"style\");\n element.appendChild(document.createTextNode(css));\n document.body.appendChild(element);\n }\n\n const js_urls = [\"https://cdn.bokeh.org/bokeh/release/bokeh-3.2.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.2.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.2.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.2.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-mathjax-3.2.1.min.js\"];\n const css_urls = [];\n\n const inline_js = [ function(Bokeh) {\n Bokeh.set_log_level(\"info\");\n },\nfunction(Bokeh) {\n }\n ];\n\n function run_inline_js() {\n if (root.Bokeh !== undefined || force === true) {\n for (let i = 0; i < inline_js.length; i++) {\n inline_js[i].call(root, root.Bokeh);\n }\nif (force === true) {\n display_loaded();\n }} else if (Date.now() < root._bokeh_timeout) {\n setTimeout(run_inline_js, 100);\n } else if (!root._bokeh_failed_load) {\n console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n root._bokeh_failed_load = true;\n } else if (force !== true) {\n const cell = $(document.getElementById(\"f7ab9380-fe21-4c70-9e9f-6d5dd490b689\")).parents('.cell').data().cell;\n cell.output_area.append_execute_result(NB_LOAD_WARNING)\n }\n }\n\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: BokehJS loaded, going straight to plotting\");\n run_inline_js();\n } else {\n load_libs(css_urls, js_urls, function() {\n console.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n run_inline_js();\n });\n }\n}(window));" }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import numpy as np\n", "import scipy.integrate\n", "\n", "import bokeh.io\n", "import bokeh.plotting\n", "bokeh.io.output_notebook()" ] }, { "cell_type": "markdown", "id": "7454b386-bdad-49da-b908-99e42352c91e", "metadata": {}, "source": [ "In this lesson, you will learn about different ways of interacting with the Python interpreter and importantly the basics on how to use JupyterLab. All of your homework will be submitted as Jupyter notebooks, so this is something you will need to master. It will be useful for you to go over [the intro to LaTeX](intro_to_latex.ipynb) to learn how to use $\\LaTeX$ in your Jupyter notebooks.\n", "\n", "You should, of course, read [the official JupyterLab documentation](https://jupyterlab.readthedocs.io/en/stable/) as well.\n", "\n", "We will start by introducing the Python interpreter." ] }, { "cell_type": "markdown", "id": "1b805e06-087a-45d9-baab-2a713a550f29", "metadata": {}, "source": [ "## The Python interpreter\n", "\n", "Before diving into the Python interpreter, I pause here to remind you that this course is not meant to teach Python syntax (though you will learn that). The things you learn here are meant to help you understand how to use your computer for data analysis more generally. Think of it this way: part of the mission of this course is to help you unleash the power of your computer on your biological problems. Python is just the language of instruction. That said, let's start talking about how Python works.\n", "\n", "Python is an **interpreted language**, which means that each line of code you write is translated, or *interpreted*, into a set of instructions that your machine can understand by the **Python interpreter**. This stands in contrast to **compiled languages**. For these languages (the dominant ones being Fortran, C, and C++), your entire code is translated into machine language before you ever run it. When you execute your program, it is already in machine language.\n", "\n", "So, whenever you want your Python code to run, you give it to the Python interpreter.\n", "\n", "There are many ways to launch the Python interpreter. One way is to type\n", "\n", " python\n", " \n", "on the command line. This launches the vanilla Python interpreter. We will never really use this in the class. Rather, we will have a *greatly* enhanced Python experience, either using **IPython**, a feature-rich, enhanced interactive Python available through JupyterLab's console, or using a **notebook**, also launchable in JupyterLab." ] }, { "cell_type": "markdown", "id": "94e4939c-585d-4e77-a39b-f230e18820f5", "metadata": {}, "source": [ "## \"Hello, world.\" and the print() function\n", "\n", "Traditionally, the first program anyone writes when learning a new language is called \"`Hello, world.`\" In this program, the words \"`Hello, world.`\" are printed on the screen. The original `Hello, world.` was likely written by [Brian Kernighan](https://en.wikipedia.org/wiki/Brian_Kernighan), one of the inventors of Unix, and the author of the classic and authoritative [book](https://en.wikipedia.org/wiki/The_C_Programming_Language) on the C programming language. In his original, the printed text was \"`hello, world`\" (no period nor capital `H`), but people use lots of variants.\n", "\n", "We will first write and run this little program using a JupyterLab console. After launching JupyterLab, you probably already have the Launcher in your JupyterLab window. If you do not, you can expand the `Files` tab at the left of your JupyterLab window (if it is not already expanded) by clicking on that tab, or alternatively hit `ctrl+b` (or `cmd+b` on macOS). At the top of the `Files` tab is a `+` sign, which gives you a Jupyter Launcher.\n", "\n", "In the Jupyter Launcher, click the `Python 3` icon under `Console`. This will launch a console, which has a large white space above a prompt that says `In []:`. You can enter Python code in this prompt, and it will be executed.\n", "\n", "To print `Hello, world.`, enter the code below. To execute the code, hit `shift+enter`." ] }, { "cell_type": "code", "execution_count": 3, "id": "0a52bb26-2c2f-4ed7-b7b8-6757d65cc8fe", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Hello, world.\n" ] } ], "source": [ "print('Hello, world.')" ] }, { "cell_type": "markdown", "id": "195778eb-9e04-42b8-9e7e-381277e49181", "metadata": {}, "source": [ "## .py files\n", "\n", "Now let's use our new knowledge of the `print()` function to have our computer say a bit more than just `Hello, world.` Type these lines in at the prompt, hitting `enter` each time you need a new line. After you've typed them all in, hit `shift+enter` to run them." ] }, { "cell_type": "code", "execution_count": 4, "id": "ef9bbe40-9eca-41b4-ac5f-37a8bab1368b", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Beautiful is better than ugly.\n", "Explicit is better than implicit.\n", "Simple is better than complex.\n", "Complex is better than complicated.\n" ] } ], "source": [ "# The first few lines from The Zen of Python by Tim Peters\n", "print('Beautiful is better than ugly.')\n", "print('Explicit is better than implicit.')\n", "print('Simple is better than complex.')\n", "print('Complex is better than complicated.')" ] }, { "cell_type": "markdown", "id": "d90f4541-f46c-42b5-bf31-c7fb61d12c6b", "metadata": {}, "source": [ "Note that the first line is preceded with a `#` sign, and the Python interpreter ignored it. The `#` sign denotes a **comment**, which is ignored by the interpreter, *but very important for the human!*\n", "\n", "While the console prompt was nice entering all of this, a better option is to store them in a file, and then have the Python interpreter run the lines in the file. This is how you typically store Python code, and the suffix of such files is `.py`.\n", "\n", "So, let's create a `.py` file. To do this, use the JupyterLab Launcher to launch a text editor. Once it is launched, you can right click on the tab of the text editor window to change the name. We will call this file `zen.py`. Within this file, enter the four lines of code you previously entered in the console prompt. Be sure to save it.\n", "\n", "To run the code in this file, you can invoke the Python interpreter at the command line, followed by the file name. I.e., enter\n", "\n", " python zen.py\n", " \n", "at the command line. Note that when you run code this way, the interpreter exits after completion of running the code, and you do not get a prompt.\n", "\n", "To run the code in this file using the Jupyter console, you can use the `%run` **magic function**.\n", "\n", " %run zen.py\n", "\n", "To shut down the console, you can click on the `Running` tab at the left of the JupyterLab window and click on `SHUTDOWN` next to the console." ] }, { "cell_type": "markdown", "id": "bb82dd03-42be-4263-a0f8-adf95d84778b", "metadata": {}, "source": [ "## Jupyter\n", "\n", "At this point, we have introduced JupyterLab, its text editor, and the console, as well as the Python interpreter itself. You might be asking...." ] }, { "cell_type": "markdown", "id": "909a6343-8f0c-42f8-8e15-0e6be2b01d32", "metadata": {}, "source": [ "### What is Jupyter?\n", "\n", "From the [Project Jupyter website](http://jupyter.org):\n", ">Project Jupyter is an open source project was born out of the IPython Project in 2014 as it evolved to support interactive data science and scientific computing across all programming languages.\n", "\n", "So, Jupyter is an extension of IPython the pushes interactive computing further. It is language agnostic as its name suggests. The name \"Jupyter\" is a combination of [Julia](http://julialang.org/) (a newer excellent language for scientific computing), [Python](http://python.org/) (which you know and love), and [R](https://www.r-project.org) (the dominant tool for statistical computation). However, you can run over 40 different languages in a JupyterLab, not just Julia, Python, and R.\n", "\n", "Central to Jupyter/JupyterLab are **Jupyter notebooks**. In fact, the document you are reading right now was generated from a Jupyter notebook. We will use Jupyter notebooks extensively in the course, along with `.py` files." ] }, { "cell_type": "markdown", "id": "378cf423-0dde-4bd0-a4b0-9fbacd00cce0", "metadata": {}, "source": [ "### Why Jupyter notebooks?\n", "\n", "When writing code you will reuse, you should develop fully tested modules using `.py` files. You can always import those modules when you are using a Jupyter notebook. So, a Jupyter notebook is not good for an application where you are building reusable code or scripts. However, Jupyter notebooks are **very** useful in the following applications.\n", "\n", "1. *Exploring data/analysis.* Jupyter notebooks are great for trying things out with code, or exploring a data set. This is an important part of the research process. The layout of Jupyter notebooks is great for organizing thoughts as you synthesize them.\n", "2. *Developing image processing pipelines.* This is really just a special case of (1), but it worth mentioning separately because Jupyter notebooks are especially useful when figuring out what steps are best for extracting useful data from images, which happens all-too-often in biology. Using the Jupyter notebook, you can write down what you hope to accomplish in each step of processing and then graphically show the results as images as you go through the analysis.\n", "3. *Sharing your thinking in your analysis.* Because you can combine nicely formatted text and executable code, Jupyter notebooks are great for sharing how you go about doing your calculations with collaborators and with readers of your publications. Famously, LIGO used [a Jupyter notebook](https://losc.ligo.org/s/events/GW150914/GW150914_tutorial.html) to explain the signal processing involved in their first discovery of a gravitational wave.\n", "4. *Pedagogy.* All of the content in this class, including this lesson, was developed using Jupyter notebooks!\n", "\n", "Now that we know what Jupyter notebooks are and what the motivation is for using them, let's start!" ] }, { "cell_type": "markdown", "id": "44937b99-8863-4362-b312-10759f485ab7", "metadata": {}, "source": [ "### Launching a Jupyter notebook\n", "\n", "To launch a Jupyter notebook, click on the `Notebook` icon of the JupyterLab launcher. If you want to open an existing notebook, click on it in the `Files` tab of the JupyterLab window and open it." ] }, { "cell_type": "markdown", "id": "91ea7d9f-2cef-4730-a352-51e48fdb127e", "metadata": {}, "source": [ "### Cells\n", "\n", "A Jupyter notebook consists of **cells**. The two main types of cells you will use are **code cells** and **markdown cells**, and we will go into their properties in depth momentarily. First, an overview.\n", "\n", "A code cell contains actual code that you want to run. You can specify a cell as a code cell using the pulldown menu in the toolbar of your Jupyter notebook. Otherwise, you can can hit `esc` and then `y` (denoted \"`esc, y`\") while a cell is selected to specify that it is a code cell. Note that you will have to hit enter after doing this to start editing it.\n", "\n", "If you want to execute the code in a code cell, hit \"`shift + enter`.\" Note that code cells are executed in the order you shift-enter them. That is to say, the ordering of the cells for which you hit \"`Shift + Enter`\" is the order in which the code is executed. If you did not explicitly execute a cell early in the document, its results are not known to the Python interpreter. **This is a very important point and is often a source of confusion and frustration for students.**\n", "\n", "Markdown cells contain text. The text is written in **markdown**, a lightweight markup language. You can read about its syntax [here](http://daringfireball.net/projects/markdown/syntax). Note that you can also insert HTML into markdown cells, and this will be rendered properly. As you are typing the contents of these cells, the results appear as text. Hitting \"`Shift + Enter`\" renders the text in the formatting you specify.\n", "\n", "You can specify a cell as being a markdown cell in the Jupyter toolbar, or by hitting \"`esc, m`\" in the cell. Again, you have to hit enter after using the quick keys to bring the cell into edit mode.\n", "\n", "In general, when you want to add a new cell, you can click the `+` icon on the notebook toolbar. The shortcut to insert a cell below is \"`esc, b`\" and to insert a cell above is \"`esc, a`.\" Alternatively, you can execute a cell and automatically add a new one below it by hitting \"`alt + enter`.\"" ] }, { "cell_type": "markdown", "id": "163a3176-559f-4679-8bd5-e89bed326a28", "metadata": {}, "source": [ "### Code cells\n", "\n", "Below is an example of a code cell printing `hello, world.` Notice that the output of the print statement appears in the same cell, though separate from the code block." ] }, { "cell_type": "code", "execution_count": 5, "id": "fd3c2d37-2b64-4096-86ef-a5c3b218dd6f", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Hello, world.\n" ] } ], "source": [ "# Say hello to the world.\n", "print('Hello, world.')" ] }, { "cell_type": "markdown", "id": "2d62efae-4de4-45e9-b8e4-c55ca15ae66a", "metadata": {}, "source": [ "If you evaluate a Python expression that returns a value, that value is displayed as output of the code cell. This only happens, however, for the last line of the code cell." ] }, { "cell_type": "code", "execution_count": 6, "id": "b27a098f-5f2f-4d37-b38f-ab47b563c3f1", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "11" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Would show 9 if this were the last line, but it is not, so shows nothing\n", "4 + 5\n", "\n", "# I hope we see 11.\n", "5 + 6" ] }, { "cell_type": "markdown", "id": "416b609e-3ac0-4710-8d2b-e7858579a788", "metadata": {}, "source": [ "Note that if the last line does not return a value, such as if we assigned a variable, there is no visible output from the code cell." ] }, { "cell_type": "code", "execution_count": 7, "id": "c1e3530b-7039-4df9-877f-dbfb111c53f8", "metadata": {}, "outputs": [], "source": [ "# Variable assignment, so no visible output.\n", "a = 5 + 6" ] }, { "cell_type": "code", "execution_count": 8, "id": "74f7a6e4-c542-480e-8bce-273df6abe825", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "11" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# However, now if we ask for a, its value will be displayed\n", "a" ] }, { "cell_type": "markdown", "id": "e63f92ad-f119-4a05-bdb9-95de533e888c", "metadata": {}, "source": [ "### Display of graphics\n", "\n", "We will be using [Bokeh](http://bokeh.pydata.org/) almost exclusively during the course. To make sure the Bokeh plots get shown in the notebook, you should execute\n", "\n", " bokeh.io.output_notebook()\n", " \n", "in your notebook. It is good practice to execute this in the first cell of the notebook. Let us now make a plot using Bokeh." ] }, { "cell_type": "code", "execution_count": 9, "id": "a6db6d4f-363d-4c6d-944e-2ede860bccf9", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "(function(root) {\n", " function embed_document(root) {\n", " const docs_json = {\"5af136ee-f459-4ebd-8ffe-9480ad15e644\":{\"version\":\"3.2.1\",\"title\":\"Bokeh Application\",\"roots\":[{\"type\":\"object\",\"name\":\"Figure\",\"id\":\"p1001\",\"attributes\":{\"x_range\":{\"type\":\"object\",\"name\":\"Range1d\",\"id\":\"p1010\",\"attributes\":{\"end\":6.283185307179586}},\"y_range\":{\"type\":\"object\",\"name\":\"DataRange1d\",\"id\":\"p1003\"},\"x_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p1011\"},\"y_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p1012\"},\"title\":{\"type\":\"object\",\"name\":\"Title\",\"id\":\"p1008\"},\"renderers\":[{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1036\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1030\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1031\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1032\"},\"data\":{\"type\":\"map\",\"entries\":[[\"x\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"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\"},\"shape\":[200],\"dtype\":\"float64\",\"order\":\"little\"}],[\"y\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"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\"},\"shape\":[200],\"dtype\":\"float64\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1037\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1038\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1033\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#1f77b4\",\"line_width\":2}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1034\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#1f77b4\",\"line_alpha\":0.1,\"line_width\":2}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1035\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#1f77b4\",\"line_alpha\":0.2,\"line_width\":2}}}}],\"toolbar\":{\"type\":\"object\",\"name\":\"Toolbar\",\"id\":\"p1009\",\"attributes\":{\"tools\":[{\"type\":\"object\",\"name\":\"PanTool\",\"id\":\"p1023\"},{\"type\":\"object\",\"name\":\"WheelZoomTool\",\"id\":\"p1024\"},{\"type\":\"object\",\"name\":\"BoxZoomTool\",\"id\":\"p1025\",\"attributes\":{\"overlay\":{\"type\":\"object\",\"name\":\"BoxAnnotation\",\"id\":\"p1026\",\"attributes\":{\"syncable\":false,\"level\":\"overlay\",\"visible\":false,\"left_units\":\"canvas\",\"right_units\":\"canvas\",\"bottom_units\":\"canvas\",\"top_units\":\"canvas\",\"line_color\":\"black\",\"line_alpha\":1.0,\"line_width\":2,\"line_dash\":[4,4],\"fill_color\":\"lightgrey\",\"fill_alpha\":0.5}}}},{\"type\":\"object\",\"name\":\"SaveTool\",\"id\":\"p1027\"},{\"type\":\"object\",\"name\":\"ResetTool\",\"id\":\"p1028\"},{\"type\":\"object\",\"name\":\"HelpTool\",\"id\":\"p1029\"}]}},\"left\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p1018\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p1019\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p1020\"},\"axis_label\":\"y\",\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p1021\"}}}],\"below\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p1013\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p1014\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p1015\"},\"axis_label\":\"x\",\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p1016\"}}}],\"center\":[{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p1017\",\"attributes\":{\"axis\":{\"id\":\"p1013\"}}},{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p1022\",\"attributes\":{\"dimension\":1,\"axis\":{\"id\":\"p1018\"}}}],\"frame_width\":250,\"frame_height\":200}}]}};\n", " const render_items = [{\"docid\":\"5af136ee-f459-4ebd-8ffe-9480ad15e644\",\"roots\":{\"p1001\":\"dba2e6a5-569b-41bd-9676-9e70a8db7fdc\"},\"root_ids\":[\"p1001\"]}];\n", " root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n", " }\n", " if (root.Bokeh !== undefined) {\n", " embed_document(root);\n", " } else {\n", " let attempts = 0;\n", " const timer = setInterval(function(root) {\n", " if (root.Bokeh !== undefined) {\n", " clearInterval(timer);\n", " embed_document(root);\n", " } else {\n", " attempts++;\n", " if (attempts > 100) {\n", " clearInterval(timer);\n", " console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n", " }\n", " }\n", " }, 10, root)\n", " }\n", "})(window);" ], "application/vnd.bokehjs_exec.v0+json": "" }, "metadata": { "application/vnd.bokehjs_exec.v0+json": { "id": "p1001" } }, "output_type": "display_data" } ], "source": [ "# Generate data to plot\n", "x = np.linspace(0, 2 * np.pi, 200)\n", "y = np.exp(np.sin(np.sin(x)))\n", "\n", "# Set up plot\n", "p = bokeh.plotting.figure(\n", " frame_height=200,\n", " frame_width=250,\n", " x_axis_label='x',\n", " y_axis_label='y',\n", " x_range=[0, 2 * np.pi],\n", ")\n", "\n", "# Populate glyph\n", "p.line(x, y, line_width=2)\n", "\n", "bokeh.io.show(p)" ] }, { "cell_type": "markdown", "id": "55260d93-6b5e-484e-a26c-9aa68f4548c7", "metadata": {}, "source": [ "### Proper formatting of cells\n", "\n", "Generally, it is a good idea to keep cells simple. You can define one function, or maybe two or three closely related functions, in a single cell, and that's about it. When you define a function, you should make sure it is properly commented with a descriptive doc string. Below is an example of how I might generate a plot of the Lorenz attractor (which I choose just because it is fun) with code cells and markdown cells with discussion of what I am doing. (The doc string in this function is nice, but longer than that is necessary for submitted homework in class. At least something akin to the first line of the doc string must appear in function definitions in your submitted notebooks.)\n", "\n", "Between cells, you should explain with text what you are doing. Let's look at a fun example.\n", "\n", "We will use `scipy.integrate.odeint()` to numerically integrate the Lorenz attractor. We therefore first define a function that returns the right hand side of the system of ODEs that define the Lorentz attractor." ] }, { "cell_type": "code", "execution_count": 10, "id": "f4a92fe3-324b-456e-b0f3-4bacdf0e940a", "metadata": {}, "outputs": [], "source": [ "def lorenz_attractor(r, t, p):\n", " \"\"\"\n", " Compute the right hand side of system of ODEs for Lorenz attractor.\n", " \n", " Parameters\n", " ----------\n", " r : array_like, shape (3,)\n", " (x, y, z) position of trajectory.\n", " t : dummy_argument\n", " Dummy argument, necessary to pass function into \n", " scipy.integrate.odeint\n", " p : array_like, shape (3,)\n", " Parameters (s, k, b) for the attractor.\n", " \n", " Returns\n", " -------\n", " output : ndarray, shape (3,)\n", " Time derivatives of Lorenz attractor.\n", " \n", " Notes\n", " -----\n", " .. Returns the right hand side of the system of ODEs describing\n", " the Lorenz attractor.\n", " x' = s * (y - x)\n", " y' = x * (k - z) - y\n", " z' = x * y - b * z\n", " \"\"\"\n", " # Unpack variables and parameters\n", " x, y, z = r\n", " s, p, b = p\n", " \n", " return np.array([s * (y - x), \n", " x * (p - z) - y, \n", " x * y - b * z])" ] }, { "cell_type": "markdown", "id": "7964ee84-7908-42cc-8509-aa98c28b38c4", "metadata": {}, "source": [ "With this function in hand, we just have to pick our initial conditions and time points and run the numerical integration." ] }, { "cell_type": "code", "execution_count": 11, "id": "1d2c5e01-e29f-4d36-a634-97fb8cedc0a9", "metadata": {}, "outputs": [], "source": [ "# Parameters to use\n", "p = np.array([10.0, 28.0, 8.0 / 3.0])\n", "\n", "# Initial condition\n", "r0 = np.array([0.1, 0.0, 0.0])\n", "\n", "# Time points to sample\n", "t = np.linspace(0.0, 30.0, 4000)\n", "\n", "# Use scipy.integrate.odeint to integrate Lorentz attractor\n", "r = scipy.integrate.odeint(lorenz_attractor, r0, t, args=(p,))\n", "\n", "# Unpack results into x, y, z.\n", "x, y, z = r.transpose()" ] }, { "cell_type": "markdown", "id": "3147a762-8573-4cd0-81e1-24e15250adb2", "metadata": {}, "source": [ "Now, we'll construct a plot of the trajectory using Bokeh." ] }, { "cell_type": "code", "execution_count": 12, "id": "e8934394-da92-4979-9b58-9ec19b0e9b4f", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "(function(root) {\n", " function embed_document(root) {\n", " const docs_json = {\"62eaab30-3d04-4802-a2e0-c3c124ce0d76\":{\"version\":\"3.2.1\",\"title\":\"Bokeh Application\",\"roots\":[{\"type\":\"object\",\"name\":\"Figure\",\"id\":\"p1041\",\"attributes\":{\"x_range\":{\"type\":\"object\",\"name\":\"DataRange1d\",\"id\":\"p1042\"},\"y_range\":{\"type\":\"object\",\"name\":\"DataRange1d\",\"id\":\"p1043\"},\"x_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p1050\"},\"y_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p1051\"},\"title\":{\"type\":\"object\",\"name\":\"Title\",\"id\":\"p1048\"},\"renderers\":[{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1075\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1069\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1070\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1071\"},\"data\":{\"type\":\"map\",\"entries\":[[\"x\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"mpmZmZmZuT+fQUHSAvG3Pzt6x4iOw7Y/VvBpChUDtj9wkWWrJaS1P/HfvKOinbU/Z8WMHHPotT84FwCUPX+2P4XO2yExXrc/GNq7+NeCuD/4d9y08uu5Pz/wT0hbmbs/o5tFz+2LvT8wP5CJd8W/PwWolDRVJME/7e3dgIqMwj93VYoyjx3EP3BkdqgC2sU/jJD9WvHExz9YLNWW1+HJP2SguZ6lNMw/JJL0JsXBzj9+JpoTEMfQP1w5DH2UT9I/mfgt6HH90z9YspW9+NPVPwxw28zN1tc/7KNiHvEJ2j+Jd8mDxXHcP0VNSvUYE98/p1Fk4Zb54D96YHlU4oviP0KbZe2TQ+Q/sk5jgRsk5j/CE9EoOjHoP7d3i1MJb+o/e8qkbgLi7D+yi+whB4/vP7IYnhK1PfE/9f6CWHzW8j8EwcZCApX0PzXkbj23fPY/181vx1iR+D8o0+wl99b6P1ef2Tb7Uf0/q2UvHZYDAEA4WRG42n0BQFUPGqWVGgNAQSqA88fcBECSRsAzq8cGQKCH10iy3ghA95FDBYklC0DjrCMaEqANQGt3El8xKRBAhyO7pV2gEUATlsXjvTcTQG6sZKiJ8RRA/s+gYPTPFkBwJx53HdUYQAMzCzD7AhtAfaXUGz9bHUCfBmncMt8fQJJbpf7FRyFAlK2M4Rq2IkDKmYsdCDokQDClqkxS0iVAkUUQGeh8J0B/teeatDYpQPKjdXZx+ypALyr+M33FLEAudvsevI0uQDLmY9rFJTBACFU+8Gj6MECx+62dGL8xQG1Xbb60bTJAsh4Jc/P/MkADpcsYvm8zQOeHpOactzNAvWOCDCbTM0AcAQoVYr8zQLeMvJ4WezNAx6KANesGM0Cngla9YWUyQDQbDl6jmjFAzD6rFCqsMEDNTANtqEAvQEBwoUji+yxAl5GkQ6qXKkBiYMdS/SAoQLDeWNqloyVAEeUdoOUpI0COy62DTLwgQPnhoJZnwxxAiQLag6g+GEAKdmhj2/ETQD5K7Lbeww9AJckt3FUjCED5g3ChIgQBQHS8KHf/yvQ/5nAvJAYS4T84iagOxTXGv6B6E+ECX+q/pJg+ZSm+9r+Mj5GTbID/v5pvDws8wgPAtYLNdkZsB8A2EpTmXMUKwOeiNb5T1A3A5JOIBN1PEMBlodd05pYRwNw4BM43whLAsstwfJPUE8D+kPTPi9AUwOjZwhCDuBXA7v70TKyOFsBV6XCrDFUXwKSGtBt9DRjAUCDFP6y5GMAqcpt5IFsZwKcITwg68xnAKGthKDWDGsCRO98qLAwbwLynHH0ZjxvA3SBwndkMHMA2Exj3LIYcwJEQaqW5+xzAecp/HQ1uHcDSpWe+nd0dwJ56e0nMSh7A3STBQ+W1HsB6XqlEIh8fwKcGQDKrhh/AWNzfb5fsH8CCgWGAdyggwIJXVNHVWSDAUY7m8VyKIMA5zngb/bkgwMWKTQSh6CDAensobC4WIcCjwA+shkIhwHYMQkqHbSHA/aaNkwqXIcCG/ls56L4hwFuBIPb15CHAR4MkNggJIsA4hpLG8ioiwKXOHIaJSiLAqfbnGqFnIsD81IClD4IiwPgLgnatmSLAb0Ksu1WuIsBb10Qr578iwL4CbaFEziLAT9+EtVXZIsCwq+88B+EiwB+Tz75L5SLAytCD0RvmIsCBKeJjduMiwOnX9+xg3SLAMNw1g+fTIsDPLynaHMciwOpmfyYatyLAKzA06f6jIsBVCe+i8I0iwD9UEHIadSLA80cpnaxZIsAEUSsL3DsiwCAjsbHhGyLAcPgo9fn5IcC/yHgEZNYhwLpvyi9hsSHA4oezPzSLIcDwHeXOIGQhwHkk2alqPCHAAMoON1UUIcB47BnoIuwgwLl3H7gUxCDANcKCtmmcIMANFNKfXnUgwLt8iYUtTyDAsok6gw0qIMBnFTWDMgYgwEzJ9B+axx/A96NNZRSGH8DEw2+6JkgfwJYWX8AcDh/AAWnd0DrYHsBVVE8MvqYewJfo0HTceR7Atb3XE8VRHsBLnc0ooC4ewGTgbV2PEB7AkkXf/a33HcC7e4syEeQdwM5tsjnI1R3ANBp3ntzMHcAPDtttUskdwHdK2WUoyx3Aqw7VH1jSHcAFohc01t4dwLpK8VaS8B3AZ2QbbncHHsB11g2gayMewNvJ9FpQRB7ApYQmVgJqHsCOU3iMWZQewPZwXzIpwx7ApRsOpj/2HsB599VeZi0fwA5L59dhaB/A8FJZffGmH8DKV/uZz+gfwAy2LKPYFiDA+RmhMKM6IMD49LbHnF8gwJCQ4iCYhSDA6wAQZmWsIMBo43ZE0tMgwHmSRgeq+yDAawMwvLUjIcCll5ZivEshwAYcjCaDcyHAnb7MqM2aIcCKFhxSXsEhwGkucLX25iHAM/OC/VcLIsBa/L9oQy4iwIkOpM56TyLAT+0FMsFuIsB+MElZ24siwLal3m+QpiLA/EI3qaq+IsBL7mbn99MiwGBxKl5K5iLAFqA8LXn1IsDod0j7YAEjwGxFzXnkCSPAvMJa3uwOI8D7qSNJahAjwJKBPRJUDiPA4wbKAakII8B/FsBsb/8iwN4WTDW18iLANxjRsY/iIsBWO652G88iwIEnJAZ8uCLAbhPBZ9ueIsDAR12paYIiwBizfExcYyLAunuXo+1BIsBy9skiXB4iwInsMKjp+CHAjiPxvtrRIcCBdK3hdakhwGYRwLwCgCHAwOUVfMlVIcDhc4gbEishwBffMcUjACHAdL4BPkTVIMCAmSlet6ogwCXsT5u+gCDAwI7+ophXIMDyJXgEgS8gwN+n7OuvCCDAobY42bPGH8DjtSy0X38fwCsCZF69Ox/A8c+FAR/8HsBsi5D4zsAewBS/sd4Pih7ArtmXrRxYHsCrvtjqKCsewLZXz9xgAx7ABzbsxungHcBPW18w4sMdwH6Sjh9irB3AJzrOZHuaHcCOJCzYOY4dwHUXtpijhx3AS8yeRbmGHcAtKQYvdosdwML884PQlR3A+4qzcrmlHcDwc4dGHbsdwLDbaXjj1R3AHJVTuu71HcCDDWn4HBsewBemBFRHRR7A+L1cFkJ0HsBSa6Ce3KcewCLC3Unh3x7AdxFdWBUcH8DTaKjROFwfwH20CWYGoB/A9DPEVjPnH8CHcC+utxggwF+e8kwyPyDA2Cp5yttmIMCpWQidg48gwHSngHj2uCDAYh60Yv7iIMDC95TNYg0hwKlcZsDoNyHAFyJxC1NiIcCxWPCJYowhwJWGlnHWtSHAsPlzsWzeIcCQ3QRf4gUiwGIfwjP0KyLABg+IFV9QIsDnCL2v4HIiwMtRORQ4kyLAJQ6qaSaxIsAPTACcb8wiwJhT3hXb5CLAqbr+dDT6IsBblpFATAwjwKzlXZP4GiPAoqjXvhUmI8DdfDfbhi0jwEq4qkY2MSPAyGzrDBYxI8DvGNwzIC0jwDE7Su5WJSPAe2WUrsQZI8CXTWobfAojwFuETuSX9yLAQu59dzrhIsDAAQydjcciwIWSlvTBqiLAO7/tXQ6LIsDWb+JLr2giwDxbagfmQyLAH5il6PccIsDOllOGLfQhwGf4DuTRySHALvvboDGeIcBsIlYrmnEhwDM3Mv5YRCHAAUQI6boWIcC2AdVmC+kgwFu76ASUuyDA16hC25uOIMAzGjsXZ2IgwPql1pg2NyDAoPR4okcNIMDMTXc2p8kfwFGu0sEffB/AUBdOVVsyH8CAH8/ys+wewLsboit7qx7Az1xqMfpuHsBvNC35cTcewHczj24bBR7AIxtusifYHcAwIwxiwLAdwOR0AOQHjx3AbiFptxlzHcCHfUjECl0dwFDtsajpTB3APReNA79CHcDCf8G3jT4dwHmsuCpTQB3ACSnldwdIHcDQrU+enVUdwHWGTaEDaR3AwW/woiKCHcB83uXw3qAdwIsNggoYxR3A73wkm6juHcBpF5ptZh0ewHDM2lYiUR7AnMR8GaiJHsAue2lDvsYewNVYbwwmCB/Al1beLJtNH8DIyN+105YfwMUHO+9/4x/AFedWG6UZIMCr71J060IgwF44MipibSDASElUXdWYIMDOy58wDsUgwDLecdvS8SDADd2DyOYeIcAbllLACkwhwFLVySL9eCHATkF3MHqlIcBmhPxhPNEhwDM2XNT8+yHAVS+pwHMlIsC+fV4KWU0iwDd9YNlkcyLAh/dNQ1CXIsCczjwD1rgiwMODpDqz1yLAaVZfOajzIsAZB1FIeQwjwLUEv3XvISPAzTjKW9kzI8DCGPncC0IjwPjkrtJiTCPArSlBqMFSI8Aoo/vjE1UjwKnHtI1NUyPAEGFKfGtNI8ACVVd9c0MjwA0+d2N0NSPA6t7V5oUjI8BzIsxpyA0jwGqHoJZk9CLAS32d44rXIsBGi/70crciwH/Kv+halCLAS2XKjYZuIsCy3FKLPkYiwEo7nn3PGyLArIpwDYnvIcCBC5YGvcEhwKAxwXK+kiHAke2HvOBiIcDsBW/edjIhwF9rH6HSASHAVtQp60PRIMD4liskGKEgwPDofayZcSDAKhz5aQ9DIMD9TZFpvBUgwM+1LSy/0x/AgHHnBGd/H8A9iFOJ3C4fwOjUcsaC4h7A4JnjobOaHsD0exbrv1cewGBiRoPvGR7AYbMQloHhHcA9je3hrK4dwIlhPwqggR3AlkWw8IFaHcDqj28ScjkdwOfkaeWIHh3AwOqrNdgJHcDk3At8a/scwCLH0DFI8xzATg1nGW7xHMBVKiCB1/UcwN4cCnl5AB3Ayi7j/0MRHcD+3p4jIigdwMWHuRb6RB3A9FEiOq1nHcCppvQaGJAdwHECP2cSvh3AhVbK1m7xHcB+uYcN+ykewNC8j3F/Zx7AlalAAr+pHsANkeUmd/AewAesdnpfOx/ARgC/mCmKH8Cq37jwgNwfwHpiv0sFGSDAUSbrlDJFIMBMu8ZalHIgwFmcA1rzoCDAMwlGDBXQIMCLd7O5u/8gwJqgCpmmLyHAGNFf/JFfIcDkUtSQN48hwHSFaK1OviHA4DFdtYzsIcABmaCPpRkiwHrbPyxMRSLA+W31JDNvIsBbmThnDZciwGLznvWOvCLAO8dktG3fIsBZ7TE/Yv8iwA7S18woHCPA1kDRDoI1I8BhlpEVNEsjwCvJQysLXSPAt394o9pqI8CC5ambfXQjwLVX86DXeSPAXfmDP9V6I8BitIBubHcjwHW6jNqcbyPAfyQICnBjI8AF+pFZ+VIjwMFoy9BVPiPAVxNfz6slI8CFoAeVKgkjwNLToaYJ6SLA8LG4FIjFIsC4HQSo654iwPnrLPl/dSLAuteAeZVJIsB8vOlygBsiwLLzFwKY6yHAj4UiFzW6IcBgjWN5sYchwILNhdhmVCHAKhhp7q0gIcAAeDey3ewgwAvdP6FKuSDAEuotH0aGIMB5at3tHVQgwLqjvLwbIyDAfUePoAnnH8CbyuN/M4sfwIp9i5IsMx/A2slWbWLfHsB5OqSvOJAewDr8mxIJRh7AnqGxkiMBHsBaDqGvzsEdwGiSw7xHiB3ABQv1QMNUHcDzRiJbbScdwNtcETFqAB3AVVpWWtbfHMBGUY5Qx8UcwCheg9ZLshzAeHhXWmylHMAxaAZSK58cwCAJL4mFnxzAVbH0Z3KmHMCspKwr5LMcwNLnIBLIxxzAPna+eQbiHMCyZkDxggIdwDUvED0cKR3ALir0TaxVHcB1RZwsCIgdwLUs29j/vx3AsCsyIF79HcAdJNZq6D8ewNLVhYFehx7Akw4HUXrTHsAlmImm7yMfwKTyYvJreB/AfMQLCJbQH8ATuM7zBhYgwDACNUk2RSDAs6p186F1IMCi4ytMD6cgwLDmKhhA2SDA5/inmfILIcDhGXWv4T4hwK1BbQPFcSHAS43/T1GkIcC2h42zONYhwOnsFR8rByLANKpj1tY2IsAR06kI6WQiwIsNeH4OkSLAgA4PXPS6IsABPs/2SOIiwH9YV7u8BiPApc0FHgMoI8DXMtOW00UjwJmgRJ/qXyPAkXAvrwp2I8DXtYsw/YcjwFx8/GSTlSPAOuk3OKeeI8AND373G6MjwJdAuOfeoiPAu47Zt+edI8AhbxjKOJQjwCnGWFLfhSPAG9hcRfNyI8DDKWQcl1sjwMivgWv3PyPAGwa/TkogI8Bk6R+xzvwiwL6BfXLL1SLA0usJco6rIsDncvGDa34iwMhaNli7TiLApyf2WdocIsC9+aGNJ+khwDz0TnQDtCHAfWQS+s59IcDPcdRz6kYhwL9y67C0DyHAjOWmI4rYIMBipskjxKEgwClJJ0u4ayDAVl637bc2IMCdoc6sDwMgwGCDcUkOoh/AKfRXZsFBH8BjJUCpsuUewL+uSC1Rjh7AccStOgE8HsA6LLBtHO8dwCn7j/zxpx3AY6L4D8dmHcBC0fgt1ysdwAzZaq9U9xzAIstWPWnJHMAIePdQNqIcwEmfWrTVgRzAwnfr/lloHMCwx/ULz1UcwHcpyWg6ShzA/cG8tZtFHMDIFkkA7UccwLsePwkjURzAZaZjgi1hHMB55Zs393ccwMZwHy5mlRzAkj5Ar1u5HMAzTK1ItOMcwOUCyLlHFB3ATTGX1+hKHcCG369fZYcdwC/DysOFyR3AXGaD5wwRHsAEXnXat10ewOEsVYg9rx7A7SSKak4FH8DvJuI0lF8fwLoMXYqxvR/A2F692aAPIMACB0Iy7EEgwCFWn8aAdSDACAqgoCCqIMBov4/Zid8gwE4Bb6h2FSHAhXPwfp1LIcDi17E6sYEhwBjq52phtyHA8iRorFrsIcCllYkfRyAiwPG5IvTOUiLA8dWcE5mDIsCinbHdS7IiwCFMiwWO3iLA/5UIewcII8Dhx3psYi4jwFHJkFdMUSPAXV6aIXdwI8BrryE0mosjwCJ94JdzoiPAexIPB8m0I8DfwKjraMIjwBNcEEoryyPAumDTivLOI8BOVoUerM0jwMDQCvdQxyPAagRi0+W7I8DwKxtXe6sjwEJyK+4tliPAebuPfyV8I8Ajy2XplF0jwOrEM1S5OiPAm7SLVtkTI8A+2VP6Q+kiwJHRUJ9PuyLACVq7y1iKIsBTXWbuwFYiwDj7gxntICLAImZRwETpIcBQ/gt9MLAhwEKNduQYdiHA/LDWbmU7IcAsf+94ewAhwP9sCmC9xSDAJUkqvImLIMDhEGC5OlIgwK5XRpAlGiDAENinOTTHH8DFWUYlxV0fwKZM7piG+B7ARzR+afWXHsBpUW6IgjwewAB0XSqT5h3Af6wZCYGWHcDKOWvGmkwdwJ48FWAkCR3AeivntVfMHMBou7EYZZYcwJgaZN9zZxzAKQPE/KI/HMBiKbiTCR8cwN7qzIS3BRzAEwGB87XzG8DMeUrAB+kbwASTYPOp5RvAPdzhHpTpG8CYUTKouPQbwMjhEwoFBxzAERAx/GEgHMAyWReSs0AcwGpUVUDZZxzAf9Uj2K2VHMB4bIBrB8ocwHXGcSi3BB3AyfNFH4lFHcCnZfQBRIwdwM95M9Ko2B3AqLxyjHIqHsCSvLHFVYEewNrV4ksA3R7Ac22Ovhg9H8BhNX8xPqEfwBNcLueDBCDAzdm+RAI6IMBl5/Bu3XAgwN+eYlPUqCDAf+cChqHhIMBVYjZJ+xohwFoEKaeTVCHAN97EoRiOIcCpuJt4NMchwMwtywmO/yHAZQGjTck2IsDxE2fwh2wiwIRczAZqoCLAeBAK4w7SIsCifuIAFgEjwPqHrREgLSPAE3F5FdBVI8B2RF+RzHojwK05/MLAmyPAaiZn5V24I8BlEmpxXNAjwP0I6kx94yPAL4lK74rxI8BlmkJmWvojwM1xrTbM/SPAyFkaFs37I8AdLaBvVvQjwIXwg7Ju5yPA77m8aSnVI8AkBnEVp70jwB7OScoUoSPAQH6PmKt/I8ChMYW+r1kjwFGMRKtvLyPAIbx420IBI8Chfl2UiM8iwK+lKYqmmiLAdXa9dwdjIsC4QWyyGSkiwICWn8FN7SHAQXO1AhWwIcCH0b1f4HEhwPTbJx8fMyHAejrA0D30IMB0gHRbpbUgwMqQ3S26dyDAwoR+kts6IMAD1wBPxv4fwHdA8vFIix/AI9l1d9kbH8Ci2mRMBbEewH3W6shMSx7AtverSCPrHcBRXN5r75AdwBNXZ3oLPR3ABvec4sXvHMBhbqfLYakcwId1D70XahzAHEB+QRYyHMAfeLibggEcwOR/Z3N52BvAt0QSfA+3G8AYUH8ZUp0bwCPSw/JHixvAeQibevGAG8BfTrBoSX4bwOczch5FgxvAgG7a/NSPG8CG6j2l5KMbwGAKKSZbvxvAsTO0FRviG8DjIdyWAgwcwM1hZEzrPBzANzw1OKp0HMDaahyKD7McwOU6dlzm9xzAsIJdZPRCHcCF69+R+ZMdwByksKav6h3AZzZgxMlGHsAXyxf086cewPSLQ67SDR/Ae5c6YQJ4H8A+rhkBF+YfwHtEfs/NKyDAltoUCglmIMB6lYxfeaEgwGVHcTDW3SDAbuT7C9IaIcDoZeDCGlghwCkc3pFZlSHAeV5bZTPSIcDgIs06SQ4iwA6bdqE4SSLA994eW5yCIsCcLFMfDboiwKbuJoAi7yLAt+XG7nMhI8A8dE3fmVAjwAOrwAUvfCPAQ0I/qdGjI8DgSDoGJccjwG2o1LfS5SPAfTH4H4z/I8DpYmLFCxQkwPGx1JwWIyTAy67QM30sJMCwfaGzHDAkwCFZPLPfLSTAAenI0L4lJMDUFScNwRckwNOKf+T7AyTAU7O7IpPqI8DaHR91uMsjwBsNv7mqpyPApWhIE7V+I8BStJnILVEjwLuhnfZ0HyPA5mtGH/PpIsDtyrihF7EiwBpQfiFXdSLAc+aX7Sk3IsBAtFJsCvchwOvKvpdztSHAwvpEkd9yIcAgzn9Txi8hwABLeYac7CDAOhhse9KpIMCPnulP02cgwIBWmToEJyDAV4zCAIjPH8CQkO4g1VQfwNlw2omR3h7AGmz3iFBtHsATIJIFlwEewDyWbrLbmx3Af0z+bYc8HcBJIAzF9eMcwOm8wZJ1khzAGKmotElIHMCOednMqQUcwPt1QgvDyhvATKwh+riXG8DCHJFGpmwbwG3omYKdSRvAmqC+2qkuG8DziCbAzxsbwJaGAYANERvA9zKBylsOG8DoSAYjrhMbwNuxIj/zIBvAc/0xSxU2G8CNDlQd+lIbwHSFb02DdxvADXajO46jG8BOvLr889YbwF724TSJERzAqw3n2x1THMCgVxXwfJscwMZXAxds6hzA9Iq7Lqs/HcDNLo7S85odwLhlatP4+x3ANDNDq2ViHsBUzOXo3c0ewDaIE6D8PR/AB4Na2VOyH8BgXIcINhUgwKaQRODhUiDAtv8TgeeRIMB/HPim+9EgwNvCaK7NEiHAVRutmgdUIcDrctA1TpUhwOUuWU1B1iHAStShD3wWIsCN3o6KlVUiwN9NvFEhkyLADdBtSrDOIsBRJeed0QcjwDbzatMTPiPAC0C3DQZxI8Bk7GVoOaAjwK7Lu3BCyyPA0s1zsrrxI8DvWrxPQhMkwAXKmJqBLyTADz2cpSpGJMClwX2/+lYkwKtd3M27YSTAoIKUfEVmJMAAzgo2fmQkwBdptdtbXCTAC63/N+RNJMCbxjMjLTkkwL9zH1pcHiTAeZBHB6f9I8Br51P/UNcjwNtXULirqyPASVznBRV7I8BKShie9UUjwK4ZF3i/DCPAwq21D+zPIsCr0uGX+o8iwKGO+CtuTSLAt3BtCMwIIsCdfVTXmcIhwOrbMhlceyHA+0L5sJQzIcBa0jSZwesgwNZkbcZbpCDA4f4NONZdIMDbQ/Y4nRggwNyAgpwrqh/ABSDDpDonH8Db+HxyEqkewM16pvRNMB7ARy8dNni9HcBjvTisDFEdwNoI/rR36xzAsuioPBeNHMCOVRaAOzYcwCgj4+Qn5xvAXLg23hOgG8CWZpnZK2EbwHWpNSuSKhvA6X7d9V/8GsAfo+oHptYawPI9Ya1tuRrArwVxbrmkGsBxIey9hZgawMQjVo7JlBrAUdwd1XaZGsB7+f7weqYawAZ+mvu+uxrAcLnJ/yfZGsBdWvUXl/4awO23fHPpKxvAvQDCQvhgG8ArLC2NmJ0bwN+4QO6a4RvAz15UP8ssHMBGr1Mr8H4cwIOslbDK1xzAi2yRkxU3HcDoY7DChJwdwI5oJrDEBx7A+NMipXl4HsCMqGQRP+4ewK3mHt6maB/AEp1cxzjnH8AAGpnhuDQgwEuxUr9hdyDAOUVz+km7IMAcvCyWHgAhwAI/i4+GRSHAvFRh7CKLIcAwAXzpjtAhwDDObUtgFSLASPlq1idZIsDuJSjwcZsiwOVgem3H2yLANNQmjq4ZI8A/ak4lrFQjwNP/V+1EjCPAtbYEBf+/I8Ac7QyNY+8jwAw2iGIAGiTASKJW62k/JMDiBBLoPF8kwHwankEgeSTAxScGxMaMJMBug1m38JkkwEmKIEttoCTAfY38xRugJMAimrpt7JgkwEG8TyDhiiTA+59llA12JMD60pU/l1okwEpgz+K0OCTAFWItvK0QJMBdSQdo2OIjwOafvHqZryPAWmsT2mF3I8C8wWXnrDojwPlj6Yn++SLA/Q2bI+G1IsBCPzyD424iwFLCQuCWJSLAPiOC64zaIcCfn4oBVo4hwGtAQoZ/QSHAq4H3b5L0IMDlqDgGEqggwHtQPth6XCDA+NBR6UESIMBx/gQmqJMfwM/8MzQrBx/AnqGP5cN/HsCRkDteF/4dwE0fYCe5gh3Aeyu7lisOHcDbEg1s4KAcwGocY5k5OxzAjOckLIrdG8ClueRLF4gbwP0xgUcZOxvAmYABqLz2GsCHn3hDI7sawLEOoUhliBrAT0pDP5JeGsCAhN71sT0awN7LJmLFJRrAVUJKY8cWGsAKOUp0rRAawOFcnjxoExrA9KQoDeQeGsC+CeE7CTMawAKdXWe8TxrA7CGjnN50GsBM9KdhTaIawKe5+KTi1xrAiW92kXQVG8Dorx9K1VobwHWs+IrSpxvAs3faNDX8G8D73WfBwFccwMW5QaUyuhzA2KSQn0EjHcCCFfv7nJIdwIsy98nrBx7AMAEMDMyCHsBdNtfn0QIfwF7BrNWGhx/AiHDpbzQIIMB0ZTT2dE4gwCE7G5Q3liDAJW8nRijfIMC/5CNL7CghwPRYgxgicyHATniZcGG9IcBcQOGcOwciwAsbvNM7UCLAwLGYyeeXIsCCjbR2wN0iwC3alxBDISPATGapNuphI8AXQLxVL58jwNZyJD2M2CPAp6ok3nwNJMC4K6UzgT0kwMFLgUUfaCTA2A5fOeWMJMDqAE5oa6skwADiomZWwyTApC6A7FjUJMD2/liSNd4kwH0rVU7A4CTAkGeIpN/bJMAnAWB/jc8kwDPbxKPXuyTAMnr6vd+gJMB8+VwE234kwJZHYG8RViTAff+/kdwmJMCMAW4XpvEjwMAdwfXltiPAa4hLZiB3I8BCCair4zIjwIEkRsXF6iLAtpS3FWKfIsD4pTITV1EiwAUdag5EASLAU8oPHsevIcBsSQU5e10hwMPmeYf2CiHAoKNw8Mi4IMC2QXLmemcgwOvsEHSMFyDAIh5BDemSH8DFI7rpQPsewFKLGnfnaB7AUcFM2I/cHcCttGSM2VYdwMlZ/OxQ2BzA8BLw6W9hHMAoNir1nvIbwHR9WhI2jBvAlasRAn4uG8B6TC17sdkawBgHZ2v+jRrAnsIzNYdLGsBLqmPoYxIawKxE9Wmj4hnAYp6ji0y8GcA8U+sMX58ZwDf8+oHUixnA/rAMIaGBGcAViZhxtIAZwAt6Ad75iBnAu0kCJ1maGcCycT63trQZwHRPl9jz1xnAUpl5yu4DGsB3GW25gjgawHVFTpmHdRrAj4E24tG6GsCz+0AxMggbwIkNrc50XRvAfTJFGmG6G8AdqxLguB4cwJeT1Zc3ihzA6QMFkZH8HMCevS0Pc3UdwHYJxFp/9B3AOsRlyU95HsD5MYTFcgMfwAUKStlqkh/AjDqO4tYSIMBlMNfVUV4gwGfLoCxTqyDAY1RhWoD5IMBWlrkxd0ghwBqAStXNlyHAFX0+zxLnIcALX0tTzTUiwLHuMbN9gyLAC0bUCJ7PIsCxO5UboxkjwFjFl4P9YCPAxjsOChulI8DD/59IaOUjwNdcTYJSISTATtH2rUlYJMBt3QmuwokkwNkPn6Q5tSTAoj3NVTTaJMA0nS6MRPgkwJtLHGEKDyXAz2bpZzYeJcBGVFCRiyUlwPdL7sjgJCXAcQIqLSIcJcB+2w/eUQslwG1TclKI8iTARKCvMvTRJMDV9jS22akkwNItkYmReiTAaWtDRodEJMCslsuJNwgkwCfGJb0txiPAKLfonwF/I8AnBT2sVDMjwMAdoGjP4yLAKgjcux6RIsAnCfBV8TsiwD5v3j715CHAPPIfmNWMIcAAIWucODQhwL0+SuS92yDA5Z499PyDIMD6Kn0VhC0gwCNDffCusR/ArIymOOEMH8Adha71e20ewJbzXtVF1B3AgSsOcu9BHcAQGUzcE7ccwO+Num05NBzALM/61dK5G8Dg1wdWQEgbwHajchjR3xrAm6BpncSAGsBfGgouTCsawCF5ZVGM3xnADh6POJ6dGcDwp0oakWUZwLNNZ3prNxnAxQhNWiwTGcDiDD5MzPgYwJJdaGc+6BjAHWxIHnHhGMCbRB/vTuQYwNVGIPq+8BjAcl2ebaUGGcBHVQjU4yUZwB6TnD5ZThnA7t9JTuJ/GcD/pG0cWboZwIP9/gGV/RnAtlqFP2pJGsBrZ7WGqZ0awN9YEGYf+hrAJnGPmJNeG8AaLK06yMobwKaLq+d4PhzA5ahowFm5HMDAFOpfFjsdwKZ6RsJQwx3Au62OIKBRHsAaEdTIj+UewJG6dfudfh/AnvbEaB0OIMBCu8Cb414gwFwKNAVKsSDAqfKKr/AEIcAoqAcAb1khwBQMfZpTriHAILSFcCQDIsA4zwIAX1ciwEWvJMx4qiLAKSDnF+D7IsBKjHvh/EojwF1S0ycylyPATYqbe9/fI8BXdDHWYiQkwHPHJrgaZCTAb0PYgmieJMDiElUFs9IkwNj5Uy5pACXAH5qQzgQnJcDZkC9ZDUYlwLZ2sIoaXSXAkRQy3tZrJcC5/L+5AXIlwNwaZDpxbyXAynmSjRNkJcCbozrH708lwJOkyCkmMyXArkLw2u8NJcC5DfMGnuAkwPK3QniYqyTAkKaYsVtvJMCVw5SbdiwkwMWCpNuH4yPAwOlH7DqVI8AnskEQRUIjwLWP9Dli6yLA5Ebc/lGRIsAmKQ6s1DQiwCxfNJKo1iHA81SwjYd3IcAebOTiJBghwEYrN2sruSDAFF4uGzxbIMA+uh2/2f0fwGZ5QJ6PSR/AbJ9KV5WaHsDBqg1WzfEdwDi/KQEBUB3APAD1OuG1HMAu24Y+ByQcwN6tk8X1mhvA309mbRobG8DCcfM5z6QawFpnljxcOBrAm1AcRfnVGcB+Z++Sz30ZwGR234H7LxnAhjQcJ47sGMDF2LLXjrMYwBnbrZP8hBjAbAsFVM9gGMDFYdU2+UYYwHSSVYRnNxjAHqzNlQMyGMA/PZyQszYYwHnc+v5aRRjA6IhlQNtdGMDsX6nVE4AYwEnDNojiqxjAD9vGayPhGMCPm4e8sB8ZwPJFWppiZxnAj5YjoQ64GcB+Zn9fhxEawM96aq2bcxrAOmCF4hXeGsAp0pDvulAbwLoLNFtJyxvAwdQaJHhNHMC3h0WQ9dYcwNWgyOFlZx3AyB1dCWL+HcA3+TU/dpsewADWZLMgPh/AkdxoL9DlH8AacYRp8UggwJK3i3jSoCDAYeMeCyj6IMAQykAkhVQhwMnj9shyryHA2qEs9m8KIsDENVXL8WQiwHRd1fRjviLAqkgtYCkWI8BB0WA/nWsjwLPlkF4UviPAxo1X094MJMDn7l0ESlckwOymGgOjnCTAkHA5MzncJMAkJQAyYRUlwD2M2O93RyXAISp/4uVxJcDubxU8IpQlwKS78Ai2rSXAEoyBGD++JcDEWZGTcsUlwBNgSyQfwyXAN+2ily63JcCUXTTkpqElwN4WBIiqgiXA7MJ/OXhaJcCPyMboaSklwPxZoBzz7yTAOn3AuZ6uJMDQkWhKDGYkwD2eDOHsFiTAN6dvs//BI8A1ylGNDmgjwOFeUznqCSPAbTcQ/GaoIsBRQOU+WUQiwJcTIXaS3iHAu2eaYN53IcBnebShABEhwOX8AsOyqiDAiKhsnaJFIMB9wOZS4sQfwG16ZmNjAx/AogzRwNJHHsDOVfE9HpMdwGjSS3oX5hzA24jdqXRBHMC2tOnA0aUbwPsfQO+xExvANkc3U4GLGsAuP0TWlg0awBbQbCA2mhnAmzYOlpExGcBsec5RzNMYwIh/XhH8gBjAary5DCs5GMBBmlCxWfwXwHqYjTyAyhfAqmlAMZCjF8C797WldYcXwEe4gGkYdhfA6RsgAF1vF8B7f5xxJXMXwGYiNvRRgRfAwB7YaMGZF8C7222vUbwXwF3FRtPf6BfAWdL7D0gfGMBPDqevZV8YwC4c+sESqRjAG68Dryf8GMDmA7qkelgZwJSUneDevRnA4w5E1iMsGsCv2FgzFKMawOgGBcR0IhvApJ4ONwOqG8AQQWvGdDkcwI3gcMd00BzA7olSIqNuHcBognrAkhMewMOiB+zHvh7AVxzgr7ZvH8AqwZyk4BIgwCBo+lQbcCDAPO2+jSjPIMATYH2Rmi8hwC5V5VL4kCHAj6d3Nr3yIcBR4PsMWVQiwI7dE1MwtSLAJCWJvpwUI8C5Ds8j7nEjwHxx0rxrzCPAIEO011UjJMAOld3t53UkwBbAyyNbwyTAjX5vLekKJcDXlQOHz0slwA2UrfZShSXA3K/XPsO2JcDmAOnjft8lwDqu1uf2/iXAsjWDV7IUJsAwxDCGUSAmwCoQztOQISbAbAvi3UoYJsD5WwYAegQmwHiozg855iXAkjm2SMO9JcA9s+Flc4slwHjyfvHBTyXAUYyE2kILJcDXK7lpor4kwCB5bbWhaiTAED+vtxIQJMDE2OAs1K8jwKTlYmDNSiPAL6EpC+rhIsBvNoFmFnYiwBi3hYY7CCLArkb4GjyZIcCD5SCf8SkhwHGWNAMquyDAYAu00qVNIMCtGiurLcQfwDa8Hk0+8h7APNAGa6EmHsDGnnNVWmIdwMSH3DtMphzAblgXKzvzG8AALeh6zUkbwHRkopeNqhrAZqtUDOwVGsBCKsa4QYwZwBJz5B/SDRnAEAXPvc2aGMDoU7tXVDMYwPwZWzt31xfATULOXzuHF8BWS2hom0IXwLxPhn+JCRfA4PkfBvHbFsCCrdEUuLkWwCCtds/AohbAuFOzieqWFsAFpse7EpYWwG84askVoBbA/uibms+0FsBPvrcHHNQWwPc2LhrX/RbA5LMbIt0xF8DfMVmiCnAXwF1kixM8uBfAIQrjfk0KGMC79CzxGWYYwM/Vc8Z6yxjAzoXvzkY6GcDIAY1NUbIZwHz7sNBoMxrAVmlc5lW9GsBaXr2s2U8bwLWguEGs6hvAmSSaFHuNHMD+Rlwc5zcdwHUcWPyC6R3A1SR3F9GhHsD+89+kQWAfwBXDI2QYEiDAvZmzYHJ2IMCPtQAjxtwgwCkEA4eeRCHADJIMXnmtIcAMi6ERxxYiwOIhiozqfyLAQZY3cTnoIsDkoZus/E4jwEyKBnRxsyPAzIUGtsoUJMCsJx0HM3IkwAuYkA7PyiTALG0XdMAdJcAdPddGKWolwFZBtcovryXAgGL0oALsJcCfaVQp3R8mwKNhg/kLSibAvXXeRPFpJsCpSO0ICX8mwEjT9M/siCbAhtu13VaHJsC1HzKlJHomwCpVYltYYSbAGtyinRk9JsAvX+4UtQ0mwCqLDh+b0yXAqXI8hV2PJcByFGFcrEElwNQPwy5S6yTAr0E8mi+NJMCGM+CPNigkwPbiSWVlvSPAOqfP5MFNI8CTeeCHVNoiwN8Lyf8jZCLAp40/KjHsIcAoS3+Hc3MhwJZF3D/W+iDAvPFkvzWDIMAsnYHoXQ0gwAKvFKgRNB/AoIHpM7xTHsD5WREk5XodwChAzvuQqhzAgTjnGKDjG8CAS3xL0CYbwMZoed++dBrAOyWE+erNGcBNc3wsuDIZwOQs2C9xoxjANjBsoUogGMBttSnCZakXwKWYgx/TPhfANUpkHpXgFsBe39Zeoo4WwDPG/vLnSBbAgMccZEsPFsAHmq2DrOEVwMa8DgjnvxXAONVv8dOpFcB0i8i8Sp8VwJxMz14ioBXAsRoYEDKsFcB6P+/kUcMVwEOXejdb5RXAM6n14igSFsA+ErpRl0kWwDrGVWCEixbApAkCFc/XFsB4d6QtVy4XwIdN3YL8jhfAoKY3Qp75F8DiV+P9GW4YwP022JJK7BjAcmkG5QZ0GcBCgYFxIAUawAXCerdhnxrASfgoeYxCG8ArSbTWV+4bwFhbIUZuohzAUElDbWteHcBc4hrk2SEewKYtp+gw7B7AxQ/zD9K8H8AuOmaBg0kgwKgBBav/tiDAjXeaTWcmIcCkRZ9bNZchwGCjHVPVCCLA0rhm4qJ6IsDjNzbi6esiwFJgYrXmWyPADHO7H8fJI8BLtMmjqzQkwKfGtnGpmyTAoSag8sz9JMA6McjzHFolwLedz2eeryXA+LRMu1j9JcAvDmiYWkImwHacrRG/fSbAGGrk7bKuJsCoxFUCetQmwHtTc0907ibAwi3HsyL8JsDGoMz7Kv0mwH4vmBBb8SbAvTTOLKvYJsBfquThPrMmwBlabu5kgSbAJZ541pVDJsCXWwpUcfolwBNXrLe6piXAfRKnZlRJJcCrkCKoOuMkwFsvufx9dSTANShkOz0BJMD27oSun4cjwKagsGXPCSPAptm16vOIIsDe2L59LQYiwN0phvKQgiHA6pAHPyT/IMALs4nC23wgwEwJUIgw+R/AQFVvOEv+HsA5tdMAdAoewHKwxbvrHh3ABxEFW8g8HMC3nbld9mQbwPW+GOk6mBrAuMqhXTbXGcABJ8hEZyIZwD7E+nYtehjAnXBOXs3eF8AazyQ9c1AXwO3zPGg2zxbAtLnwYRxbFsDksA3MG/QVwLgIticfmhXAj8QIXQdNFcBX/pQHrgwVwIgxZITn2BTACTVnwoSxFMCmIrXVVJYUwLCzK04mhxTAIu8hVciDFMAbGgCTC4wUwCKkU9/CnxTAJpzlvcO+FMBC2Gqr5ugUwP4a5ToHHhXA8AeUBQReFcCrOnluvqgVwAqGRjoa/hXAlvEr/PxdFsCxiq9WTcgWwPinkxDyPBfAzW2l/9C7F8BAUzjAzUQYwH4W+ETI1xjADBcXMpt0GcBThQwMGhsawPM4pjUPyxrAnXgnvTmEG8Ah5DwDS0YcwG7gJjXkEB3ADCLVppPjHcDyoncU0r0ewAVFvNX/nh/ApioADjFDIMDZu5sfkLkgwC55eqIgMiHAO7cq2VSsIcAKinDmjCciwH0DrD8WoyLA47MPeSseI8B9UAeQ9JcjwPqWLL+HDyTASbgb9uqDJMC5l5YFFvQkwDRI34j1XiXA0kd2l27DJcA8KlU8YyAmwPKdLZm3dCbAyChPrFe/JsBxjW+GPf8mwCDPGcB3MyfAdfP08y9bJ8CMjGX1sHUnwDRqh31sgifAcWw4AgCBJ8DXZF98OHEnwHA81NsUUyfATMeDDccmJ8DsFwp3s+wmwOCrV/BupSbAtwM7TbtRJsCnBtmkgvIlwNsr1Y7RiCXA+rXUndAVJcAySz1ivZokwPLuV0LjGCTAlfH8b5SRI8AFyR09IwYjwKCv8QLcdyLAK+8rxP/nIcAtQ46kv1chwDSTUEQ5yCDAblLV/nM6IMB27wwNvl4fwK02CZygTx7A8yFKUQhJHcA3dQ0UO0wcwFnh75RNWhvA+E0YrCV0GsDwpOtZfZoZwGKlJT3mzRjAV8/MU80OGMDw2TTjfl0XwOGUlmkquhbAJGNigOYkFsC80VObtJ0VwMBWsZaEJBXA24juCDi5FMAhajBRpVsUwFEp/16aCxTAttCLL9/IE8Al27oCOJMTwIYaBkhnahPAxao3RS9OE8DxEet7Uz4TwOUFLc+ZOhPARspobctCE8CPtOyCtVYTwLiZC7cpdhPAa3Fgd/6gE8C4Q6ETD9cTwI57las7GBTAq24T8WhkFMCROES+f7sUwOUm24BsHRXAurlXeR6KFcB0EeTNhgEWwLZzMW+XgxbAxYw8zUEQF8DFdVNadacXwMAh29kdSRjAtLS1eCH1GMA5K3ytXqsZwB9/kd+paxrA9IFt1Mo1G8Asp0DleQkcwIlfjABd5hzAKrBbfATMHcDACBjF57kewHG76/Vhrx/AVRRtNddVIMCxTeS08tYgwDxHDX98WiHAxARmFNnfIcBRtTRMV2YiwEvjjYov7SLARvueaoNzI8B+t9D+XfgjwCbEg7+0eiTAd7mARWn5JMCt97LqS3MlwMH1LVwf5yXAXJGNKp1TJsCsIiVUe7cmwMT1K7RyESfAt/rWMEZgJ8C11ax5yqInwFj2TAvu1yfAGq8vKMH+J8AuXn1ofRYowJNwqH+MHijAgnK62o0WKMBmmEvGWv4nwOUNf9MI1ifAJmTSWuqdJ8CM9bMGjVYnwPRZX3q2ACfAdgQvPF+dJsAU1VkprC0mwBVLbMfmsiXA9Npt1nQuJcAJ0ziIz6EkwCEJ1796DiTAolLZsPx1I8DvNhop1tkiwABVk717OyLAszbkAFCcIcCz/D7Ynv0gwLNA/PGZYCDAt8t4rqyMH8BgqLkCll8ewFTC8bOgOx3AdtadCEEiHMBzk42csBQbwFiRj0zxExrAGFm17dAgGcCWzZuO7TsYwOa64RO6ZRfAJwNq/4KeFsD8P789c+YVwGW3KNuYPRXAioxAiemjFMCP9LbjRhkUwBztPmiCnRPAn3BcGmEwE8DWy2fOntESwKoYnBrxgBLAAfNN8gk+EsBPPoXpmQgSwAEbLidS4BHAu+tiC+bEEcDlpZGNDLYRwEsq1leBsxHAsO8PpQW9EcB24eblYNIRwLJYDTFh8xHAKAP6gtsfEsC+efTOq1cSwDPzEuW0mhLARIRvLuDoEsCyrI8/HUITwNBgZkJhphPAsXhgNqYVFMCTD7kE6o8UwMY7SmgtFRXA48JmpHKlFcDx9/cHvEAWwKfoEjwK5xbADir6T1qYF8AlKiiOo1QYwIbk2gbVGxnAUUWp2NLtGcAk+Dgsc8oawE2KBul6sRvAsJc8JJqiHMBf1KZLaJ0dwBtDMBdgoR7Aswv5UdutH8AMHvxIB2EgwEPviniC7iDAt67i/M1+IcCUsTH2PxEiwGZc3kgUpSLAk+fydms5I8CGsgIBSs0jwJ7bCX6YXyTAcmX1kyTvJMDgavbtonolwPZ2ml+yACbAfiwDPeB/JsCs1CgLrvYmwHVsz22YYyfA7sMQSR/FJ8DdkLXjzhkowOJ3b7hJYCjAR2pvpFKXKMBSjmD11r0owHbRuNv30ijANLPSuBLWKMAZdeXVx8YowCaKZQb/pCjAiJ039elwKMB58bXjAysowAJvs90O1CfA0ZzHgA5tJ8B3NIWlQPcmwNDDsFAUdCbAuRwYbR/lJcCYbjzWE0wlwFw1Xju0qiTAweyUWskCJMCMl9r9F1YjwM3SSQ9YpiLAMRO8/Sz1IcDEGG6TH0QhwJBHu0iZlCDAsYhOC8LPH8CtaGN5Mn4ewHhdlm5+Nh3AhDnp0lb6G8AnCGs8JcsawE/84p0PqhnA80PL8/yXGMCIoEqhmpUXwA7IXTZioxbAcTbdZZ/BFcCfcdn6dfAUwGi+jqfnLxTAdeiwkdl/E8BYUfGGGeASwAff18xiUBLAbr1Vg2LQEcBDc4aXu18RwHP8skUK/hDABanrLueqEMCNhXkG6mUQwDz7Td2rLhDAkRRDEskEEMADZcPexc8PwGSzj/VBrw/Aou/bBGSnD8CEpg7UmbcPwDZhiIFi3w/AVmmEpCcPEMDX0i/3AToQwCP8M2obcBDAKhL9YlixEMCY46g6pv0QwIYc5Nn6VBHAG72hMVS3EcCQP2ePtyQSwHc39cswnRLAHc//UdEgE8B+T7L3rq8TwI7buKniSRTAVj+l34bvFMAeMeHUtaAVwKV1wICHXRbADdZbRA8mF8DKDHRJWfoXwIKnbYpn2hjAkA9LfS7GGcBMKUVekb0awMJ+IRVewBvAWTlkukjOHMBfhRu95uYdwL04obWpCR/Acphg/+waIMAYTmyRSLUgwNHVsihaUyHAGgJlh3f0IcB+Mmkm15ciwF0W7yyOPCPA1tpQ847hI8DkVLpSqIUkwLvN0eKFJyXAkSLTgbHFJcA2GxU6ll4mwONld8uE8CbAFQ3k8rl5J8BJUiRrZvgnwDhUJLi4aijA3jYvaejOKMA0u8OVQiMpwC2WWRA3ZinAHwZUu2WWKcBg8MRNq7IpwC0MTMwsuinA/xvl/WCsKcDQORc6F4kpwA1S/RB7UCnAmL1qgxQDKcBwBum6xKEowCXqZW+/LSjAEq0+YYGoJ8CvhCx9xBMnwJvqqV5ycSbATlCg9JXDJcDf88gITQwlwNOMRFm6TSTAxrF11viJI8BEralzEMMiwOZpXdLs+iHAZbkJ61UzIcBLf1G16m0gwCu6xWw7WB/Ampn9lGbeHcDZlBrcgnAcwFENkpBhEBvAGsmyaH2/GcAlN30VAH8YwOdmE+PITxfAN2cEAXQyFsCxbQcdYicVwOnOEQjALhTAymtuNI5IE8DT/zncp3QSwPqwfLjJshHAUxsnM5gCEcAPxjIKpWMQwJ5fMrvoqg/A7doUWQKvDsAR9zWGgtINwONoMkFRFA3Ayb6owVhzDMCbzx9iiu4LwG5SP7jihAvAqZPo72w1C8BRnpt+Rf8KwK/Md0Kc4QrA7Cy5HrbbCsCPt3on7uwKwBZvWWu2FAvAmdpgZ5hSC8Dcr+cvNaYLwJ17GllFDwzAEt8IpJiNDMDF42l2FSENwDZt5R+4yQ3AZtOM7ZGHDsCL9F4KyFoPwBx33xTJIRDA/RVlexyhEMC0wQYgiisRwDxgpGtEwRHAHC4mDINiEsBdf0WEgQ8TwCBRBIB9yBPAsDgR5LSNFMC11aWNY18VwNQrXrjAPRbAWhsa//soF8AXsyvoOSEYwGaUi/iPJhnA+MBePQA5GsBbmDJJdFgbwI1OTpq3hBzA62QGeXG9HcCE/r5FHgIfwHUOKyoEKSDAETKWOCDWIMBgR04iy4chwP5psWVIPSLA6VRMoLP1IsAt4Ph0/a8jwNoKyCLpaiTAxnKdFgslJcDdnCvQyNwlwF4s13JakCbAJUwiU849J8BtwSnQDuMnwNHcR6vqfSjAvKm0/R8MKcD5SPWlaYspwFoqYPmO+SnAnuyzHnVUKsCnAOFpMZoqwGDgGLkbySrAsKNOxt/fKsBsxWRMjN0qwK+T0uqewSrApWta4AuMKsBxGAf4QD0qwCkH62Mj1inAkrNhmAhYKcDKG4enqsQowFuus+MYHijAQMbW1KVmJ8CsQ/6k06AmwNJwiy5AzyXA6Zj4upH0JMDdF5pZZRMkwABDBHY/LiPAeoSTHH9HIsDRPAofVGEhwBKVxxa4fSDAI9LUMNQ8H8A72R6m2YkdwOxT9HsN5RvAQg1t5odQGsC5Lv6p8s0YwLY5KUSRXhfAELfLTUoDFsCpwNeKsbwUwKsHsjQSixPA8z51JHluEsBHaniZvmYRwLlzN2uPcxDAiaAvDusoD8CA8AdPv5ENwHR+13lQIAzA9QQcEjfTCsBvOEXm+agJwHGe5j4XoAjAfGETsAy3B8DUwXuqXewGwHFnaOyYPgbAuRmG8lysBcA1b8eCWzQFwN3IIHhc1QTAaWft4j+OBMAIM8GX/10EwFed+EWwQwTAZyxqKYI+BMDaZgRpwU0EwJxR6TLWcATA8Q9voUSnBMDPb790rPAEwO/UJrTITAXAc//WI2+7BcAkwBa1jzwGwH260t8z0AbApe1n7X12B8DemoMzqC8IwMZLlD4E/AjADZJm6PnbCcB0nLZSBtAKwK3aSMK62AvANFVSTbv2DMAXQ1ZUvSoOwJ1frbOFdQ/A1f+GT/NrEMCdb9+IXikRwFSJc9128xHAbMdGprDKEsD2Yv4GgK8TwD1OyEdWohTA5jjqrJ6jFcAIMQW5urMWwIqbg8X90hfAFF4K2acBGcAN2ziu3z8awFokpdSrjRvADSFo4urqHMBgc1O1SlcewCNqFb8+0h/Ac4AmyXqtIMBO+hTaJnghwELd9A1lSCLAC4yoXkMdI8DGg4rXlvUjwBo8xtL2zyTASMv8VLmqJcDhn8YK8YMmwLtl+n1tWSfA8MPcHL4oKMDzy12oOO8owI4LQX8DqinAtv4SFCRWKsD9WB6dkfAqwIWhsJxLdivAvW/2mHPkK8BeNwXKaDgswDLcaz7kbyzASVFzlROJLMBpvGZdsIIswNE8cTMSXCzAt0YcDjoVLMDo+Nqn1a4rwDa9ZaA6KivAfvBbqVmJKsDQNPi9qs4pwHMewvMT/SjAhIwZzMwXKMDfLZgOQCInwBLEqRfuHybA0ohDTFEUJcBjjrjvxQIkwPR43DJ27iLAtoXq3kraIcBzD3Cd4MggwDL4iygDeR/AuKolp0VuHcAy42zwyXQbwBwmorAujxnA2PmJKHq/F8BwLpToJgcWwATEyRoyZxTAWlq1hSrgEsCAMmWZP3IRwG6fnwZQHRDAgH/JB+/BDcCn+fcFN3kLwGwSKHLtXgnA1xNJyEZxB8BvAC2jSK4FwK4pQl/ZEwTAN+o5ds2fAsDVKR7A8k8BwGL3x8oZIgDAiwB39joo/r/FpUBX0kf8v76geO36nvq/McwBvucp+b8KDjT4AuX3v+Zsb6vxzPa/1OCbHZbe9b8p1CwBERf1v7rZV8HBc/S/vCaJGkby878ppYgbeZDzv297l8RxTPO/e0ZKWoEk87/9h+ODMRfzv+gJ2lRCI/O/On2gTKhH87/5w3FbioPzv0Alj/4/1vO/vOaseE8/9L/6qMYtbL70v0Gxxyx1U/W/4hrG5nP+9b9M74cYm7/2v2+Be+dFl/e/1UzDMveF+L+BSx8XWYz5vxiseaQ8q/q/AX6Mwpnj+7/pVgxAjzb9vx7h9Adjpf6/nvRkO8EYAMBQyahjQe4AwBmkIsYQ1AHAlm8zliLLAsCcHWaoftQDwOpd7phB8QTAWN7w1pwiBsCWZIuG1mkHwAYHPShJyAjAf7J98GI/CsAM31e4pNALwDoD1megfQ3AG4t/tPZHD8CUz/kFqpgQwLSriju2nRHA6phmHPuzEsAbR+FxUdwTwE/ol06LFxXAhcaGmG5mFsDJqedKrskXwNFzJEHiQRnAGvU4VH3PGsCysySZwXIcwBSG+pqyKx7AADOdcAX6H8CodsFbh+4gwHFbc0LX6SHANjbdWB3uIsAhWaMNNPojwMd+9uCZDCXA/qXQlGYjJsCDOGHjQTwnwCorUN1cVCjAaesnVG9oKcBlJSeuunQqwBZBOcUTdSvAYQ5GBvVkLMAJYXfBmT8twFQT9doiAC7AeuaxG8ShLsB20yk/+B8vwFJ75qm4di/Aaw/gr7SiL8Bt4Xupg6EvwDRARwXNcS/A7EToJWITL8AoLvwXR4cuwE+o//qozy3AZuu++cLvLMCxaeR9tOsrwF8P7rdMyCrAARTPXdCKKcDztvGLvjgowITMVyqZ1ybAIoazN7RsJcCrGNQnDv0jwNrXuVAyjSLAm2sqViUhIcC+HyV6tXgfwNO5IZ9kwxzADWm5ffcmGsAed+DJ/aYXwFVHwlcORhXA9+hrpOEFE8AAWhj+becQwA2RTnUH1g3AAr+SpdAgCsBbz549360GwBqe9IMlewPABkNxEgmGAMBRqh/jDJf7v+17REefkPa/Idec78vx8b+KYVUxvmbrvy+ptqgjnOO/pbU3cpnq2L/AMrD98o/Hv0C97S/l03I/aHzw6AfUxj9idURIza3VP658H6clL98/KogUeKUC5D/a8WNXHSPoP/KE4HFaA+w/0qkeJyKt7z8Fb03A0pTxPx8zW5HEQPM/ZjKUOXfe9D9wmBzOvnH2Pzk5SBA4/vc/e9A94E2H+T/QKPPAPhD7P5PZr1EinPw//4RHtO4t/j8gvXPOfcj/P+1hBy1JtwBAheBtXW6RAUAsJKrI/3MCQOdUeABKYANAG0Z10ZZXBEDjbc8ML1sFQGTE4R1cbAZAtoIHZWmMB0DKNUhOpbwIQBuknBxi/glAQIvBXPZSC0BPPpjxvLsMQNOKlaYUOg5ArugMOF/PD0DknAzbf74QQD/vxRIsohFAEr3YHGOTEkCVW6uEz5ITQOSC68YUoRRAvL883su+FUCXJ7sAf+wWQKMbUHqkKhhADJVfhZh5GUCx43f3ldkaQHmXU9StShxAVxMsiL3MHUA2+lvqY18fQPnwcYH6gCBAkvi3YLZZIUBFLzpzMDkiQINYsUd5HiNAeV7JA2AIJECAf4jSa/UkQFCabWvW4yVAVO8JU4jRJkB0JkOXF7wnQHbLy9bJoChA5SH0Y5p8KUDguVY7RUwqQEciHlNXDCtAWbO1c0S5K0BJ5SVSgk8sQGzrmRioyyxAR/pb9JAqLUCokhuff2ktQCeSE3pAhi1AbJptjEd/LUCaO37Qx1MtQMjS/qrBAy1A+AKaEQeQLEDrlAfiNPorQOg0WOWhRCtAqLMP9ERyKkBmX4JmlIYpQEKCUHhhhShAPMlKW7JyJ0DDrMKBnVImQDUZxEEoKSVAQPyTUCr6I0AJBUL7NskiQIjOxm2MmSFAIHuq1ghuIECj1b+2SZIeQPPCzi/lWRxA8YE6kUA2GkALOfZx+ykYQOT4gkkHNxZAH7BCnrheFEB7QpVq2aESQArSqsK7ABFA/OeCBZj2DkALW4ACRCIMQLNx+uMhgwlAzJmfjWsXB0AeYDHyB90EQDXEWXah0QJAz+DFQLnyAEC5/1lIb3v+P1Mf+L7zX/s/IhIM6rqN+D+8N/u1kv/1P3MClI5qsPM/wvAYq16b8T9rnkMGgXfvPw34SbI5Guw/B8Cnd38W6T8iRmeqbWTmP8/2Paqk/OM/m9PLdEnY4T8nqh/YBuLfP7dY53Lxgdw/UVqxMpOF2T8uOyjKFePWP/pAMC6AkdQ/F1CS76mI0j9SnrA6LsHQPwh97Z+9aM4/SrV4QW64yz+Bgk13n2bJPwT7e1ikacc/JHjS09q4xT8EjW7JlUzEPxNOrmMIHsM/7Lyt5TInwj+0/UrW0GLBPzB1/YlIzMA/8cdJEZxfwD/h4mh8WxnAP3ynPc8w7b8/YvHDg7Xpvz/2x4vDFhLAPyeg4ACkTMA/Ivu7ijWjwD+EwDcO0xTBP40H9d/SoME/GVb07dRGwj+MmkWBvgbDP/lFf8i24MM/zS84HCTVxD+209n2qeTFP76nR5YnEMc/vDVmPbdYyD9b8oMSrr/JP+ynL5GcRss/AVm7kk/vzD+WORPk0bvOP5J0rTQ3V9A/hkpyatlk0T/TfaxzOYjSPzffBiXmwtM/CmUifJUW1T8AULYjJ4XWPyqHq0enENg/f/vbu1G72T+W7Ft9lYfbP2JeE40YeN0/Uj9vL7yP3z8/L4zI0OjgP0j8Zm2XIOI/OzfBXApx4z/Rf0owKtzkP0WFPQgjZOY/zMp9ElAL6D831FVbP9TpPzIhSem1wes/wJTXKLTW7T8115JUPQvwPy400pZHQvE/TWkCCWGS8j+dcsQBmv3zPwl6rQQuhvU/NnGL6oYu9z8UsZcsQPn4P4pJqkEq6fo/mCBPEU4B/T+W2M9Z8ET/Pz1OaoPK2wBAdEmEKYEuAkC0fBrEoZwDQIZRU5pVKAVAlWw3U+rTBkDvImQY0qEIQMIOIP6ilApAlO5dZBWvDEAlxOH7APQOQM63kQkssxBAiTOgU5AEEkBug8tKtW8TQC0axiMh9hRAZ4Nwdk+ZFkABQum0pVoYQLqqVFVkOxpA9J3uL5Q8HED+zKVg714eQPMAT5JiUSBAXCCUGeyDIUB64XOum8YiQHLY0k2IGCRAoJ5krz94JUC3kP/Wq+MmQEJb+YP4VyhAZ1A/lXrRKUC2ai5TnEsrQAVjtFXSwCxArPHXZ50qLkAjF5rpnYEvQFhx+nPeXjBAXyHTzjbrMEDr4IjUg2ExQKILk2ebvTFA+1y1grz7MUDjN8vRzxgyQDCadeGiEjJAURLolBboMUAGoUCOOpkxQLQ4ZH1RJzFADlJtfr2UMED2TtcurskvQL6Q7nVoNy5AY6Zw1cx7LED6xRHVbqAqQH94LQ3WrihAR8afXRWwJkAW9DAbe6wkQNw9eZBbqyJACsJVFPSyIEB9neXyxZAdQLgFIFJf3xlAd2mnQ7xXFkA3iJUZE/4SQKUGnm0Jqg9AzLxc8LS7CUAP8/wEhDEEQOCDdDcSFP4/liWrVOGE9D9abbVhXVvnPxIU6C82Kcw/uNfAJuD4z79DrTDuWNTlv+9x2PZ4R/G/EKD8r4oi97+QVM/y0ob8v0FSiz7CvwDA0Rx0T7sLA8AmMoU+iCwFwAjGt2YdJwfANMCmfSsACcDGi60cHbwKwBChB/gVXwzA2jeoUfPsDcADjGpPTWkPwKsUqH+8axDAmA6xYEUdEcCvUol7rMoRwPGoR2Y/dRLATiRtfS8eE8Cvs+Q0k8YTwEmeXE5nbxTArNfK6o8ZFcBGdzRy2cUVwOHYxkf5dBbA2JJESI4nF8BgD70OId4XwAfchPsjmRjAy36B/fJYGcDAVtUb0x0awEXkEMLx5xrA6imT0WO3G8AEl9h7JIwcwAWleuwTZh3ANaI8zvVEHsCvFXW0bygfwN9jhrwDCCDAL0bN0ZB9IMDCDzn5f/QgwFx/+wxgbCHAPSSKbq3kIcAJCRHT0VwiwGSfwV4k1CLAMaVbIepJI8DQ5IsJV70jwPqommOPLSTABur06KmZJMCqKENysgAlwGixcFGtYSXAMoiQT5u7JcAU47Q7fg0mwJTduAReVibAtLp2MU6VJsBMyHqTc8kmwNmd9gAK8ibA5eyZ22kOJ8CaFB4pDR4nwKsHW/+TICfA+ll8DMgVJ8B64YkKn/0mwKbp/vo72CbArCCUFe+lJsD1n+5mNGcmwAL25y2xHCbAghO8FjDHJcBMhiJ9nGclwPRZmPL8/iTANsguQ22OJMAemnM7GBckwKaK920xmiPAUPSHMe8YI8DGKKwJhZQiwB6pIKAeDiLAZ6Zia9uGIcBz0FATy/8gwHUInprqeSDA3uJwlETsH8BU7vqriOoewEBX+VQY8B3AGYkYojz+HMD/vkqqERYcwCaGnCiIOBvA1NeyxGdmGsAGuOHbUaAZwOLW8aPE5hjA3zjOhR46GMA2RaaSoZoXwImEXvt2CBfABa0xd7KDFsDspZSFVQwWwGK0JYZSohXAu6z8l49FFcClp/496fUUwDwabcM0sxTA/6pVX0J9FMBSL+0W31MUwL3awV/WNhTAW3uag/MlFMD11iPJAiEUwMSjemLSJxTAJlZDJTM6FMDF2dgO+VcUwMlRD5f7gBTAgPQe0xW1FMA2ashqJvQUwOjD02APPhXAfnntr7WSFcAeSva7APIVwOplIpfZWxbAeMdrGyrQFsB4YR/X204XwBLV2cnW1xfAQubk8/9qGMALRsSyNwgZwA+ZwO1XrxnAKmFZDjJgGsCigkvIjBobwOz3dq8h3hvACu4Oo5qqHMDP2cYLj38dwHjsaAKBXB7ACEJyU9pAH8CDbYXI9BUgwAF8EZFvjiDAGh73PGUJIcAymYHOS4YhwLVxZoGGBCLAIDGyBGWDIsBTK2gUIwIjwHpfjYTofyPAV4oZ28n7I8BA1JuQyXQkwAPh1Qba6STAHXWhTeBZJcCOmwy2t8MlwAfusj42JibA7tnVyDGAJsAHPp4AhtAmwNM8P9MaFifAxRPqQetPJ8Du8B5RDH0nwKE7Pc2znCfAkHZFlD6uJ8DfbJYVNrEnwLZgLr1UpSfAs20EDImKJ8DxSrQn92AnwJNTKc34KCfAS91wmhvjJsAqpjDHHZAmwKOQNHHpMCbARhhyuo7GJcD/0JAAPVIlwFrnjIA71STA1j10ueFQJMBuUynfj8YjwBs70KSnNyPAtxprm4WlIsDsq69SexEiwNOPi1vKfCHACOVnPaDoIMBd5w9hE1YgwPPFA9hBjB/AR3sQ81ZzHsDhwOo59WIdwPxtASR2XBzAQWzS/f5gG8D+S65Xg3EawGcEainIjhnAp3Wfd2e5GMA+mktK1PEXwBTQjtJeOBfAp1ynmziNFsAlXQCtePAVwAjb/YcfYhXACzrN8RriFMD+s1F9SXAUwDHuts19DBTAM2EujYG2E8Cva/AVGG4TwGpQns0AMxPAm3qkNPkEE8DxNXisvuMSwNiknPcPzxLAOJwTeK7GEsDnvXovX8oSwPhlDIXr2RLApNp91SH1EsA4bEjP1RsTwH5gu57gTRPAVJYk7CCLE8C9B8StetMTwHwW683WJhTARVuypiKFFMAr0ZZTT+4UwKj2IdVQYhXAHfGCCB3hFcDl97pvqmoWwCHWIMfu/hbAgCAcad2dF8D5Fbd2ZUcYwP6nCMpv+xjABMHbq9y5GcAMX25JgYIawBBv2fAkVRvAm2QSDX4xHMCIs7XtLhcdwJMo9VfCBR7AiRq9+qf8HsCnRJPDMPsfwDVvuJpFgCDALETK7N8FIcB+n2321o0hwO/K7jmEFyLAUz638ymiIsDdz0FX8iwjwAOKs1LvtiPA7AJi+Bo/JMDX68KwWMQkwAE+QE53RSXAlgGfHTTBJcAnN44EPzYmwImV87M/oybAANDR5NsGJ8DaogZ+vl8nwBpyy4efrCfA0cWsmUzsJ8AkXwqAsR0owLVEirDgPyjALW0+KhtSKMA+i3tU11MowEOoInrGRCjA+gVYi9gkKMA4ymrnPfQnwEmjMwxnsyfA/cFmKAJjJ8Bs0sSt9gMnwG0HjSJflybA/RXrfoEeJsAEiU+CxpolwOM3RGywDSXAiGSChtF4JMC1w1vqwt0jwLmcVtcbPiPAwfPu5WmbIsBolMVIKvchwIBqPjzEUiHACSvrsISvIMBWpLQsmw4gwAttRaQv4h7A2cWS4tSvHcDtiPYDxYccwFYYNMVfaxvAWrSBachbGsAu5bpn6VkZwH1E7Md4ZhjA0WLS8/yBF8AKrCbH0awWwCFzELMt5xXAZfag0SYxFcCIZ3LNt4oUwO2sz4jE8xPAJxfZdR5sE8DY9NeViPMSwNvP+hq7iRLAd121qWYuEsDwLFE8N+ERwFdoRanWoRHA27Dv0e5vEcBVKHt+K0sRwEZeRuw7MxHA+Vi0FNQnEcAQeS+yrSgRwJVvsgiJNRHAuYfDdi1OEcDu5PPTaXIRwA+bQJ8UohHAPShcAgzdEcDYQjiqNSMSwP2zYXd+dBLAI496B9rQEsDQk5gVQjgTwAMFtrK1qhPASNhtUzgoFMD0LJmv0LAUwHYUvXKHRBXAVpfytmXjFcDFE8RGc40WwD8GVKS0QhfA1xMHxygDGMA8vaeZxs4YwPBdQid6pRnAc6+kfCGHGsBeeL02iXMbwKTF58JoahzAuLRHWF5rHcCLfuOo6nUewG8HsmBsiR/AJQVfwo1SIMACvqVqAuQgwGLyS6aCeCHA+IAB+mIPIsBPJu8m3KciwH7E28QJQSPAzhcLcenZI8CJfby6WnEkwFV73vMfBiXA9w5dG+CWJcDq6wgCKiImwPx4o8Z4pibAibVgwDkiJ8CJUpfV05MnwPeU1x2w+SfADr6UrENSKMABIScnGpwowHtf7srg1SjAagNDXnH+KMDxXrB/3BQpwMtCX79yGCnA3eRc/8sIKcAhWm2PzOUowAHNcrunryjA6LImi99mKMClfdW3QQwowCJ19/jhoCfAYfO3ABImJ8B9zVaaV50mwPkKoXphCCbARJS/WftoJcDKQxPtAcEkwDZJxUxXEiTApQnvONheI8C08XyZUqgiwE5jEHV98CHA9qwEgPI4IcBS1YFLKYMgwBBMDAXooB/AV4gvNftDHsB5Y6eUkvEcwAsavStmqxvAPUA6e+JyGsBSzXK5LEkZwBkNHxAoLxjAFTUJhnslF8AUkl1KmCwWwA0TYSXARBXAH6192wtuFMBZt9lccagTwEFEZKTJ8xLAOla/MtZPEsDTf9AXRrwRwGz3gYS6OBHAg4iX4srEEMB91plzCGAQwA/PA3wBChDAfcfL/4eED8DCq9gxwBAPwGssL9vTtw7AyG8DpPZ4DsD+DO00alMOwFKHx0+ARg7AvUu2apxRDsCzKpbbNHQOwK5p157TrQ7A/IKLxBb+DsCMKEaNsGQPwAQrQzxn4Q/AdYK2UQo6EMDbzC23Uo4QwI0RnRWM7RDAwZBICL5XEcCvCOK+98wRwOFU6htPTRLA37AXpd/YEsDp1nVIyW8TwO7lSfMuEhTAeyrr6jTAFMCy+x/q/nkVwFf9GfWtPxbAyfBj3l0RF8A2Sat0Iu8XwE+JilAE2RjAiKcFO/3OGcBkDHAp9NAawPzhtse43hvAULBFk/73HMDv5A2XVxwewGh++LwuSx/A3OnC7eBBIMAmk8TSjeIgwAH7ysgGhyHART4gA5UuIsAUabuIX9giwIKxCv5ogyPAePTuF44uJMBbAvbvhNgkwBGgU3/dfyXAbiuQdAMjJsBNYaivQcAmwOZpqJHHVSfAKX6rP7DhJ8DgyFHaC2IowP1U3qLq1CjA+ScuvWk4KcCf764kwYopwDckrVVSyinAvTZT2bb1KcC+KDD+zQsqwBc4hN7ICyrAfCQm3zP1KcBuLuoT/ccpwHDVGO52hCnAt7WqCVcrKcASNY4psb0owBod7ZLuPCjAZ40UcMKqJ8B4f7bqGwknwMqjstIWWibAI3W7sOufJcAVouUY4NwkwF6cpPM3EyTAHd0VUChFI8D0tSUlzHQiwEyGYDwbpCHAOzTkW+PUIMCAdFmYwwggwJR4MVtTgh7ArnbYOqL+HMCRRCyeh4gbwEUz/cu3IRrAADK9DY3LGMDU3USQDocXwHBEByP4VBbAk1Vzb8I1FcBLT1pUqykUwJSoiiK+MBPAss5CiNtKEsBY+WAHwXcRwI5ldN0PtxDAVtv4T1MIEMBUtyisDNYOwGUmmj8xvQ3Aa2sk/uXEDMCmIal09usLwJzFLKUuMQvAwll1kGCTCsAohdzUaBEKwIhNtXoyqgnAiWMtBrpcCcDsnyHkDygJwLkuGEhaCwnApACEjtYFCcDgW5U02hYJwJCf1XTTPQnAEVtilkl6CcB007H53MsJwEIoietGMgrAa1ygSlmtCsCpluH2/TwLwFhUKyM24QvAHef2chmaDMBy/OX41GcNwMo9igKqSg7AdwpKtOxCD8AECnk4gSgQwHRSZfuvuhDA5DctnUNYEcDYNdVsggESwLO645W2thLAVktsZix4E8CorPxIMEYUwDyOJmwMIRXAAksUAAYJFsCy0s0JWv4WwOaMUbE5ARjAf6F3B8YRGcBwiLwvCzAawDRkver6WxvAqo9icWaVHMBDCeKz99sdwFDAL+8pLx/Arw5y3CBHIMCDezFRIvwgwOKWylb4tSHACz426NlzIsDYLCb50TQjwFDOIvO79yPAzFaz+UC7JMA8kvdN1n0lwLXgwja9PSbAlteB3AT5JsBffohkjq0nwHYsosITWSjA0iigZDH5KMBjfNvbcospwMBr32BiDSrAKlO6zpp8KsDPBTB729YqwL1X4vccGivAIBM4m6VEK8AJ+aWYHFUrwBq1zTuaSivAFshrJ7QkK8Dzf66HhOMqwCVHYqerhyrAUNf2pUsSKsC3jbmc/oQpwBAyBubH4SjAe79PgQErKMCbq+DyRmMnwKpXYexejSbAqAjQFCWsJcCXmgscdcIkwP6XyAEY0yPAHY8sOLTgIsDQHSL8wO0hwKC2mfx8/CDAFHuwMugOIMCBDa5FgU0ewCfRrkkDixzAlVI8hsrYGsA496t5zjgZwIAkt3qSrBfAe+7HyS81FsDwHAmZYNMUwEJkgnyLhxPAzuIU0c5REsA6f9jECzIRwI+cX8PwJxDAiRdcOQZmDsAj5NydT6UMwB6gQs5WDAvALPJY8ZGZCcB/9TJjYEsIwJG8IC8VIAfA2T0z+P8VBsCCx8l0dCsFwCfIQZ7QXgTAwLTIuoGuA8BKUOVkCBkDwP2U97H7nALAf+JElws5AsARwEmrAuwBwHkQ0VzHtAHAkOC2uFySAcCAPM3R4oMBwE2d+96WiAHAHrJCH9OfAcB+SeiQDskBwFahC4fcAwLAL0zOKOxPAsCR72LgB60CwAaC278UGwPA6MbT4BGaA8BBv7HFFyoEwHs7xa1XywTAqNIb9Bp+BcDzvjJmwkIGwKQXx5HFGQfAeMLDC7IDCMBE/7WeKgEJwAhy32HmEgrAmrnnqK85C8BVtKfCYnYMwDge/G/syQ3AcNUOCUg1D8BQv32ZvlwQwGrVUYnOKxHAVrdpa18IEsByoOHA/fISwAigkV007BPAcbBqSon0FMD+DsoBegwWwDttC+12NBfAicEMDt5sGMDIXSu29LUZwPBkCjXgDxvA2RcAa516HMDgRrcz9/UdwIEpGah7gR/AF3qOIziOIMDoyX2X4mIhwFQzYtcDPiLAdKPFSaoeI8AFsQZypQMkwNCK5tV/6yTAFEMZCHrUJcD3zhBhh7wmwHBFoyVNoSfAdTo71CSAKMDILRpdIlYpwFhxV+geICrAzgjXnsjaKsDb7ByWt4IrwA79UKCHFCzA23UWJ/aMLMB7UGS/AukswIkPDZQQJi3A71nEYwZCLcBFlT2dajstwCgC0Tl5ES3AEqJdVzHELMC/LrQ7WVQswIPAEUN4wyvAQmM9KscTK8CoAEkCGEgqwGadZMy3YynAeH/KKkxqKMA43iOnr18nwB0HMfnORybALhQ3QYkmJcD1gbOslP8jwI9RHmdo1iLAE8qqLiyuIcBxFkhqrYkgwJGJNpuy1h7AZuw+rXaqHMAyUzOw/pEawN08mnrsjxjAXv9NfjmmFsCtCJyyRtYUwFM2rdPtIBPAboDGB5OGEcBSVCI0NgcQwFwmqvsGRQ3AaSjNPMWvCsC+xa2uCU0IwNXfxNTiGgbA99hkJCEXBMBEyyMNaj8CwNWQejZIkQDAQ73oYXIU/r9AugSkcU/7vzJnTfCUzvi/8DZC7QCN9r+NWSXEA4b0v6C5qfAdtfK/wgZarQgW8b+fcDK2dEnvv10o6G/Suuy/NKh8Zhl56r865To9u33ov4ktM/Cqwua/Mb0o/llC5b/M2y5/tPfjv8MoYXAc3uK/vp2ddWTx4b+YMSlDyi3hv5KZKNzwj+C/sM+AxdoU4L/nAXWmyHPfvxdKljN8+d6/TZg+R8+23r9rZB3TVKjev5SXbk8qy96/B8p2E+8c37/XG2J1vJvfv+AdUVkPI+C/QxqZT4eN4L94dXIV9gzhv5SSLNQ8oeG/SKDL8WtK4r+jjwh+wQjjv5t9PwCo3OO/zJnQprXG5L95giPRq8flv8PsrPV24Oa/EreR5C4S6L9GIlxeF17pv3D9CgShxeq/htEEnGpK7L91OGSrQu7tvxnL8GEps++/zz2abKnN8L89Xb3RlNTxvxorAtWo7/K/K7YprFUg9L/kRxOIK2j1v5rde3HcyPa/ia2tRT5E+L/MbcXMTNz5vxcdseYrk/u/2mP6xilr/b/6LeYvwWb/v+63P9NNxADAlsDwxsnpAcDxpwwEWyUDwAzJjEeieATA8Xj1BlvlBcBpNf+0W20HwPfAK42VEgnA4Ksx0BPXCsDG118++rwMwOnT85iCxg7Aabgwc/x6EMDRKIUT26YRwKOy7IsM6BLAaby3Q74/FMAGlZNkFa8VwKZ14c0mNxfAlT8m7OzYGMA/mb0bO5UawAFoRDaubBzAE7CB7JlfHsDB2TRU+TYgwGA/FOGZSyHA/OUqCSFtIsBj+76YpZojwG+DwhXR0iTA7PpWf80TJsD3eVl/M1snwIZ7n4f6pSjAr2EayWzwKcDWswxtITYrwCPImbv/cSzAi+t47k2eLcDmRA4qzrQuwLimpjfrri/Ahx9pmvpCMMBLZww8tpkwwFLXD1Kr2DDAumALw0v9MMADQBzVogUxwD/FYtV48DDAn60U8mu9MMBQg1Ue+2wwwJUhh4CBADDA53VEmUX0LsA/ivWyVbktwPQYB03IVizAp/8olNPTKsBYN0CD8jcpwKU05/aPiifA0c6Ny77SJcAcDzcwAhckwKRbWBsnXSLAEqz19i2qIMDpsM7DhAQewAj3Yn980RrAlIUwSmrAF8CMDdW/CtUUwFzUhXfYERLA7LDxfW7wDsCeUI5nPhEKwMVG9o2LhQXAH5xV4oZLAcC7p6en1cD6v/2FNp9sgfO/pbvHZn2h6b8MgJzN7Zfav4AyIW+Y+66/YqkuUn0M0T/Rg16FECniPzyB67+sC+s/27X1zE6g8T9pw4pk7mz1P+BGHZla9Pg/d0EKNNc+/D9ryIsRQFT/P3RkUAoDHgFA3sv3VJd+AkCeSBekKs8DQCpnpUDXEgVAPzrhDIZMBkCrTrf/8H4HQEAiANulrAhANj7SAQnYCUCGt5hRWAMLQC2Pe+2tMAxAtbWA4gJiDUBKC/CVMZkOQInetO331w9Anb70kfyPEEAqLQmcXzkRQHa1cPjd6BFA2g82sCSfEkDtQmfv1FwTQGFDULWDIhRALitpMrnwFECH18LJ78cVQFHGdbCSqBZArx+EJPySF0DS6r8yc4cYQPrJkQUphhlAmk6gujWPGkBnBAS9lKIbQBcIt6QgwBxAW024o47nHUC0GkePaRgfQFXPxkoGKSBA4uyv5s7JIEDwS7RaBG4hQNo9VHj8FCJAvhhbv+q9IkCZW+pj3mcjQO2EZvLAESRAR2EfylW6JEBQlTSsOmAlQI+vxpzpASZAaZ23ULydJkC9bltY8TEnQBv9wyazvCdA5rxC/iA8KEBj0+2oWa4oQKgNo8CHESlAC4fvKe9jKUC8EXkv+6MpQLU0TZhM0ClALYOv88bnKUCzn09PnOkpQCo5BZZW1SlAoqn07t2qKUCmTR6je2opQAE/2EnZFClAvLn7PfyqKEASULGiPS4oQAihW3U/oCdAq8eGWd8CJ0C4OEPtJ1gmQE6Ej3VBoiVAmI2VsWLjJEDgi7ODwh0kQCXsGASLUyNA17GOYs6GIkA3Z+XVfbkhQC1dra9i7SBALaFrihkkIEDdtgnaHr4eQOp30FkBPx1AlToCnfLMG0D1kBA4rWkaQM13HFyTFhlAlS7TR7XUF0ABPdii2KQWQMI+Fl+AhxVAILWRy/R8FEBjyLmVS4UTQI3O84VvoBJAMCir0SfOEUDcs2TpHg4RQL1LE7PoXxBARsL/URCGD0A0eQa46G0OQOe63bU5dg1AsUbJEtudDECCkJfVo+MLQJUlCN1vRgtAhabGjSTFCkBKVv6ytF4KQN4RkaIjEgpAp3Cku4feCUAlm01XDMMJQB58LjrzvglABmStmpXRCUAhEeHJZPoJQKTP3YzqOApA15WkMMmMCkDccE5iu/UKQN3fedKTcwtAeNaCqDwGDEDUu7DItq0MQJ+nj+4Yag1AHl5ZmY47DkB0irXJViIPQHF9iUNhDxBAViWylJmYEEA6K4UuDC0RQOZLtOf2zBFAyR3aP5x4EkDmCHnMQTATQIJQlWMu9BNA6ej1+qfEFEBGUvco8aEVQKekBUZGjBZAiD9tF9qDF0BDj3P60YgYQCln/4VBmxlAn6jMkyW7GkCnQOitXugbQPcqdtuqIh1AiqWm0Z5pHkAr3K2WnrwfQEn4K9hqjSBA4FM9g5dBIUCNBpdaJvohQBXC+Q9AtiJAZeevV+F0I0A7nMje1zQkQGOb1yTA9CRAgBkckwSzJUDqRnIw3m0mQEQsPlNXIydAxBirqlDRJ0CvrRHniHUoQA/2bSynDSlAcYt1U0iXKUDJcG++DhAqQKsz91C0dSpAcdbe1R3GKkC72bXebv8qQDaWRP0cICtAurF7GQEnK0AXFPesZRMrQGR7s84Q5SpAX/QwPEmcKkBxLzzs1TkqQHOmsCD4vilA+nqqW2AtKUB2/N39HocoQJlaRZ+RzidAMCDfX04GJ0ABK7F5DjEmQMBRz0iZUSVAxM760bBqJEBFwzeXAH8jQP9WBD0PkSJAmfskSTOjIUA2mzsBi7cgQGjjRYbunx9AKyY1FzLcHUAiUR+VoiYcQHjyzzOFgRpAPO531qjuGEAXJLWIbm8XQKLuRmPTBBZA/HDlPHuvFEDaAoimu28TQHJnuM2mRRJAEVED+RUxEUB2eXpnszEQQKPPQt0Gjg5ABHgHiNngDEAUs6vRf1oLQJy3oWx7+QlAZbrEJzq8CEBSZmDDH6EHQOmIA02OpgZAfEmtIe3KBUDNop+6rgwFQNn1IWRVagRANvSZAnfiA0Cdq58EwHMDQJmPpZ/1HANAguWzcvfcAkCiFmiowLICQLUegK1onQJA8Oa2kCOcAkBvA2UcQq4CQGoGDrkx0wJAmfIcJXwKA0BZRj4Nx1MDQMQRvYzTrgNAihdvnX0bBEBo5a97u5kEQNmRswGdKQVAigt3/ErLBUCAfC55Bn8GQC+vcwooRQdAoj/bAR8eCECfgoyYcAoJQJx6YwC3CgpAtyxGVKAfC0CDI/Zc7UkMQFclxhxwig1AgJekEQriDkAk0R0N1SgQQEnYzvMk7RBAecOvcHW+EUDLWukuSZ0SQL5qLYYiihNAtq+otYCFFEALahWR3I8VQDXJq4akqRZALemL6TfTF0AmBoJl4QwZQLiGbInQVhpA1BpWTxKxG0DCd/uZiBsdQP99OpvglR5A4HKhG8QPIED2cIw20dsgQIwCvIN9riFAoqQ98PyGIkBFt+cYS2QjQBJa1UklRSRARhLNQwUoJUDmFupHHQsmQIsfLQRW7CZAFf3TDE/JJ0AaJpGZYp8oQDBweRqtaylA0AgARxkrKkC9Sp3acNoqQAKpvA9yditAGe4EU+n7K0BSlpNTzmcsQBJJY/NityxApH9uR1LoLECunE12zfgsQBLiazak5yxAYNi54la0LEBk+d5mIF8sQOy4Bhz36CtA3q/PV4RTK0BC3ChXE6EqQKlKGet41ClAUb2o2PXwKEArgeEzFvonQDky1wCQ8yZAbzQZNSPhJUCuKJLPfMYkQBbxGT8epyNAZkIBy0mGIkCwNow09GYhQMXhCWa7SyBAxqNUasNtHkASOo8gmlQcQI57e64STxpANKKmR5pfGECJ6S6HAIgWQJv+dJiGyRRASvtOge8kE0CPs46zkJoRQHtdE01iKhBAvaqZCx2oDUDZKJ4NAC4LQOVfpeXd5AhAqA3VH9nKBkDcmZYV290EQAXCIr2lGwNA41Rm5uKBAUDxF80SMQ4AQCD6b0VcfP0/TTMvHgAf+z8xaOzSt//4P/94SLMWGvc/6TS0meFp9T+jn5EOFevzP7rMsofpmfI/KHj8EtZy8T9lDwm1kXLwP8UIvHAnLO8/CGXhSSa17T9CW9ceC3vsPyxc0tI6ees/+bXD6Y+r6j9+/eDyVQ7qP6wNZadEnuk/vogd6HpY6T98cv23eTrpP69HXFcfQuk/4KJGjqJt6T/A6x89jrvpP9mjFzy9Kuo/XCTRmla66j87LJY9ymnrPyHUrezNOOw/CNHExlon7T9FXhUrqzXuP3iGCQo5ZO8/h6FSV95Z8D/fhob2lRLxPzNYBuPc3PE/fN3uNmu58j+cdI7fF6nzP76zSQfZrPQ/ssCAscTF9T+HjU6AEfX2PwjnS6gXPPg/WBktCVKc+T9814lnXxf7P0g7D8QDr/w/xI0hxyll/j9fVMAb8h0AQL9BuLi3GgFAdEa8ZxkqAkC7SvL4YE0DQEGjDefuhQRA6NDmtDrVBUC3arMO0zwHQCE10phdvghAFfi1UJZbCkC8AzteThYMQHo4/Cxq8A1AKLWdm97rD0BXKPKCVgURQEkP2PBuJxJAp26HzjxdE0A8oPitv6cUQBP1WpPsBxZAfLfmhqZ+F0BEC4FdtQwZQKPs1XK6shpAJqu3DSNxHEDPQEkvGEgeQOg/cM61GyBAo6WKCEEfIUBXPoVVHS4iQO3dfvxpRyNAtWl/oOdpJEB0Vumg6ZMlQCOhxwlIwyZAAZ41QVP1J0Bsh371yiYpQI8AshraUypA1sdd/hl4K0B/SYKBno4sQOn3DUYNki1At+D4CcF8LkDvLLFn+UgvQK48Ws4V8S9A/Fldbew3MEBT46rNV2AwQBxr+mj7bzBAdnRBy5tlMEAmXqlvqkAwQLw4klVSATBAWkWUmvFQL0BSFJiPZG8uQPm+sqhYYi1AjxR9XB4vLEDBpR8AtNsqQH6mHpN6bilAMOK3Me3tJ0DICp5SYGAmQChd40/MyyRAvP2Z/KQ1I0CI0PJ6vqIhQDyqpVc+FyBAAztQTS4tHUA5tdj7GEcaQISaBzV6gBdAvCNdTWLcFECUphPD1VwSQDGcsoTwAhBAoe6tJxKeC0AdBEEVpIEHQC9QNCDyrgNAM41HZYUjAEA71Qm/i7j5P6hLaKFJq/M/JNGsMQMv7D/wh8yFD+rhP2kkG1vj7dA/YFWJi6idfb+yDqvzdXrQv7yvnHv7Pt+/7uorhvtx5r/tsOGDGMTsv3wtpkdJUvG/i0R+z7oQ9L9vcPIEC6T2v766j7uHEvm/q50mwyNi+7+S30uveZj9v4TMrbnPuv+/PalPOg7nAMAEvTUGhusBwKUxaPEC7QLAMHV0LJntA8AxWMNPQO8EwP8j8jbW8wXAOUKdxCH9BsBo1pN41QwIwBXjWdmRJAnA5E0+oOdFCsAQBuSdWXILwL3Hek1eqwzAeLLKC2HyDcDHBCPnwkgPwM0r4XztVxDA+OpFIHsUEcAeeqxtq9oRwDGiCVQZqxLAyWFtkFiGE8BCvGoz9GwUwMs3aK5sXxXAY8+8XjVeFsDBpWuGsWkXwDSf+qQwghjA/UR0IeqnGcChF/4++NoawBYBpFFSGxzAi9QhMcZoHcAkAOPv8MIewHLUqXWbFCDA8RfCqF3NIMDneIKmK4shwOkacZFITSLA5+wM0skSI8Dm7qA3k9ojwEfSW9FToyTAIgM924NrJcC9UDYoZDEmwA6ym3b/8ibAsgKtLC6uJ8B59Yy/nGAowIuhhjnVBynALmVy5kuhKcCTrDYkbyoqwNOINfu5oCrAyYPt4cgBK8AqFFy9b0srwI7sOu/PeyvAC9gjE22RK8AG2KD8PosrwOZzNpm/aCvA+ZF2l/MpK8AbDEsNbc8qwLSYy9xHWirA8LBjASDMKcAuxxmAAicpwAmHvg9abSjAbp5f1dihJ8ACeuiyYMcmwCEMSJfr4CXAoExcF3XxJMA905xW5vsjwBijofcEAyPAue6Je2UJIsCI2qEuYREhwMp3aYMPHSDATvzbHIVcHsAATsd0DI0cwAlx1HJDzhrA71dgbjUiGcBs8n6oc4oXwKPT2P4fCBbAbbgZofibFMBovNQtZEYTwDUk0cF9BxLAbUwxnSDfEMCYS5w75pkPwC9yXMjhoA3Apf6iFOjRC8BG00nDeisKwGKQ92/3qwjAHEKWVqRRB8DtnZcyuxoGwJa+WHdyBQXAS3jJBQUQBMA8vDKIuDgDwASi85jifQLA8xNN2+zdAcAGOZspWFcBwN3Rw/q+6ADAgPCYHteQAMBpOkTmck4AwA1cz+GBIADARifPNREGAMAtMPZQl/z/vzpIIHR5CADAvh5b7f8jAMDzJ1YJYVAAwBEYRs86jQDAOndyu0baAMDG/b0cWTcBwEx1AHJgpAHAtUJFyGQhAsCqiEoeh64CwPkJks0ATAPAcW8U+SL6A8DMGLL+VbkEwGOMFOkYigXAnzZr3QBtBsBxwtJ+uGIHwFgW/j3/awjAYopXjaiJCcDRWaLsmrwKwBFZa73OBQzA9zj5y0xmDcCl3QV9LN8OwAINYcLIOBDA69Y2hVQPEcC+VKUJ0/MRwOPwNIze5hLAqP7YSg/pE8B+Voww+PoUwNKMBckiHRbA4QEMZwpQF8DRfExdFpQYwBUbLRmT6RnAV8oqMqpQG8D2yY0iWckcwNgvbMFmUx7AJMFza1fuH8DPcHz6r8wgwJJspcirqSHA7Kzkf1SNIsC8gBzFoXYjwD3QWjdGZCTAeTUv4KhUJcCsQfDv30UmwD253H6tNSfA9XwjIn8hKMDEUwQwcQYpwBB2fYdW4SnA3Lh2kMWuKsBewefmKmsrwPzoEMHhEizApkbIlFGiLMBcNuzyDxYtwHGOe94Eay3ArzwhWo+eLcD7D4uDp64twOnGkXH7mS3AXrS8OwRgLcBlgborEQEtwKaiKuRHfizADI9EWZnZK8AShkyHrBUrwJvpqrbANSrAsL6J1Yk9KcCULk66CTEowBTy4iVpFCfA/khH/dLrJcBimNS3U7skwA8lPU++hiPAVgTpW5dRIsBekzd0Bh8hwC+u0Naa4x/AzmnAiImYHcAGYvvouGAbwF2jpBJAPxnA0FdrkHo2F8APalLpGEgVwNHO0xMzdRPAHPfMqlu+EcDiZ4wCsyMQwIktM/PySQ3AptjiKUGDCsD9PftDtfEHwPjwCnVRkwXAY7f3P85lA8BNcjLsr2YBwNrL5sGxJv+/zlH7QDLS+78sLSxFdsr4v4expqccCva/UeE4/96L87+NsMLNnkrxv+rIogvfgu6/CWw6uzvX6r+697uvaYnnvzEHSMUBkeS/IqkRwiLm4b88nhCo4wLfv32+WfQxuNq/94aClIff1r8Uz7nmNW3Tv0vDqpx9VtC/9g0kFQUjy7+/spsIfSrGv/ITh3PnssG/ysylhHtau79MazmFpRe0v9QCS2HdCKu/y3Oxw/8onr/lv3RTsaSAvxrZy4t2eYc/P661jOtHnj9P161IY8anP7fXdeiv4a8/cGHg6rrHsz+iaetMlHO3P1jYl4ks/7o/MYStdnp0vj9q/SNuYO7AP4+ntv1UoMI/ELj+njBUxD/KM/+Z1Q3GP7UYgwf+0Mc/I0bTYkahyT/UuyCGN4LLP9QPwCZQd80/Teaj5w2Ezz+8Y80J+9XQP2GvYg1P+dE/ZPbD69kt0z8V16TngnXUP1yGIKpF0tU/6nGsXzZG1z9IJgfnhdPYP/qkIRCGfNo/uHeVA65D3D+U5OvUniveP3d0zhuUG+A/nRNsyaY04T8/AtOapWLiPzHafvZNp+M//GEpeX8E5T8OIwEUP3zmP7TGnm66EOg/FSUob0vE6T82Ct8PfJnrP7QfRGkKk+0/UaGgBO2z7z+D4Gu7q//wP133l51fPPI/i9AdcPCR8z9aaGq4YgL1Pyz1cxTkj/Y/m7PtLc48+D8lTfvNqQv6P2HJBvUx//s/UiS1/lYa/j/AmobeIDAAQPwitDUragFAfAMetBu9AkBB5t7G4yoEQKtAa/uVtQVAc5WMc2ZfB0CDuBfQqioJQGidtVjZGQtAPPqhHIcvDUDhtqrGZG4PQC4km9+c7BBAKQnmk245EkAlWHQPFp8TQLPN/lL+HhVA/HOGMoa6FkCRjU0r9XIYQBJEgD9tSRpASC85Qtk+HEACDDQQ11MeQGajsppORCBAbY4c0G1uIUBylLGcy6ciQP3nwEyA7yNAZ16HTyNEJUCDyHNAs6MmQEW5AvB9CyhAQxsOXAp4KUAR6oU2B+UqQEqx3kBBTSxAyQxKUaWqLUD591IJUvYuQN1FxmdeFDBAJnZPQ/acMEA3i2sm5RAxQBj+ftBCbDFAepQS6oKrMUBR7NaZr8sxQDb0EvCfyjFAi62jtiOnMUB6xUPpHmExQDN3m/eQ+TBA8Iz2moZyMEAp6cH5750vQCw0pQYvJS5A/O3Lki6DLECWVo2p18AqQN7qcAsk5yhAvcyEu7n+JkAGG0nhmw8lQOtCKyLzICNAAU5tpOw4IUBBSQvOWbkeQJkAcwelIBtAz7TOPgmuF0AprRgeEmYUQB0qVJy9SxFAPFZua2jBDECvvrsSAUsHQDX2x4KHMwJADJMpxJTx+j8ADRCn8S7yP4SV4GWsLeQ/uQrJJgH+xD/eH6clfQLRv1EcbXAfKuW/hXixTo5o8L9jvmx6GMb1v0Qn0Z6CuPq/ti6UxFhK/7+z1k/K48IBwNwRWgxGugPARCqZfvSPBcBCLHkdUEgHwNGGJR145wjAxCJy1ElxCsBcofOzYekLwItLteocUw3AWC1vqJuxDsDVon/U4QMQwHagA3UhrBDA5XfrN8lSEcCPx1B7/PgRwBbEkbzGnxLAM0mivBxIE8ClWVF73fITwPyodQTToBTA7CrSBbNSFcAm2jEpHwkWwD1VoC6lxBbArBMhwr6FF8AWFrEJ0UwYwPPLzekrGhnAnWCm/wjuGcDkM25RisgawEarW7W4qRvAnbFc+IGRHMClegrHtn8dwCW8gGQIdB7AB0AXQwZuH8B3WOPDjTYgwHuziFBGuCDAJ6iHe7o7IcDsRUt5YsAhwHT1AzqgRSLAOOll977KIsA1zKIt804jwHCFiBpb0SPApHtq3f9QJMA=\"},\"shape\":[4000],\"dtype\":\"float64\",\"order\":\"little\"}],[\"y\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"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\"},\"shape\":[4000],\"dtype\":\"float64\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1076\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1077\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1072\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#1f77b4\"}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1073\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#1f77b4\",\"line_alpha\":0.1}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1074\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#1f77b4\",\"line_alpha\":0.2}}}}],\"toolbar\":{\"type\":\"object\",\"name\":\"Toolbar\",\"id\":\"p1049\",\"attributes\":{\"tools\":[{\"type\":\"object\",\"name\":\"PanTool\",\"id\":\"p1062\"},{\"type\":\"object\",\"name\":\"WheelZoomTool\",\"id\":\"p1063\"},{\"type\":\"object\",\"name\":\"BoxZoomTool\",\"id\":\"p1064\",\"attributes\":{\"overlay\":{\"type\":\"object\",\"name\":\"BoxAnnotation\",\"id\":\"p1065\",\"attributes\":{\"syncable\":false,\"level\":\"overlay\",\"visible\":false,\"left_units\":\"canvas\",\"right_units\":\"canvas\",\"bottom_units\":\"canvas\",\"top_units\":\"canvas\",\"line_color\":\"black\",\"line_alpha\":1.0,\"line_width\":2,\"line_dash\":[4,4],\"fill_color\":\"lightgrey\",\"fill_alpha\":0.5}}}},{\"type\":\"object\",\"name\":\"SaveTool\",\"id\":\"p1066\"},{\"type\":\"object\",\"name\":\"ResetTool\",\"id\":\"p1067\"},{\"type\":\"object\",\"name\":\"HelpTool\",\"id\":\"p1068\"}]}},\"left\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p1057\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p1058\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p1059\"},\"axis_label\":\"z\",\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p1060\"}}}],\"below\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p1052\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p1053\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p1054\"},\"axis_label\":\"x\",\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p1055\"}}}],\"center\":[{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p1056\",\"attributes\":{\"axis\":{\"id\":\"p1052\"}}},{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p1061\",\"attributes\":{\"dimension\":1,\"axis\":{\"id\":\"p1057\"}}}],\"frame_width\":200,\"frame_height\":200}}]}};\n", " const render_items = [{\"docid\":\"62eaab30-3d04-4802-a2e0-c3c124ce0d76\",\"roots\":{\"p1041\":\"d952bd27-b677-469d-8f18-1923b385885e\"},\"root_ids\":[\"p1041\"]}];\n", " root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n", " }\n", " if (root.Bokeh !== undefined) {\n", " embed_document(root);\n", " } else {\n", " let attempts = 0;\n", " const timer = setInterval(function(root) {\n", " if (root.Bokeh !== undefined) {\n", " clearInterval(timer);\n", " embed_document(root);\n", " } else {\n", " attempts++;\n", " if (attempts > 100) {\n", " clearInterval(timer);\n", " console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n", " }\n", " }\n", " }, 10, root)\n", " }\n", "})(window);" ], "application/vnd.bokehjs_exec.v0+json": "" }, "metadata": { "application/vnd.bokehjs_exec.v0+json": { "id": "p1041" } }, "output_type": "display_data" } ], "source": [ "# Set up plot\n", "p = bokeh.plotting.figure(\n", " frame_height=200,\n", " frame_width=200,\n", " x_axis_label='x',\n", " y_axis_label='z',\n", ")\n", "\n", "# Populate glyph\n", "p.line(x, z)\n", "\n", "bokeh.io.show(p)" ] }, { "cell_type": "markdown", "id": "b5c56339-8c0e-4db0-abd6-8297655a1cdc", "metadata": {}, "source": [ "### Best practices for code cells\n", "\n", "Here is a summary of some general rules for composing and formatting your code cells.\n", "\n", "1. Keep the width of code in cells below 80 characters. This is not a hard limit, but you should strive for it and consider 88 characters a hard limit.\n", "2. Keep your code cells short. If you find yourself having one massive code cell, break it up.\n", "3. Provide complete doc strings for any functions you define. You can and should have comments in your code, but you really should not need much because your markdown cells around the code cells should clearly describe what you are trying to do.\n", "4. Do all of your imports in the first code cell at the top of the notebook. With the exception of \"`from ... import ...`\" imports, import one module per line. You should also include `bokeh.io.output_notebook()` in the top cell as well when using Bokeh.\n", "5. For submitting assignments, **always** display your graphics in the notebook." ] }, { "cell_type": "markdown", "id": "2486fa27-1dd0-42d9-a760-a9f1147b1e59", "metadata": {}, "source": [ "### Markdown cells\n", "\n", "Markdown cells contain text. The text is written in **markdown**, a lightweight markup language. The list of syntactical constructions at [this link](http://daringfireball.net/projects/markdown/syntax) are pretty much all you need to know for standard markdown. Note that you can also insert HTML into markdown cells, and this will be rendered properly. As you are typing the contents of these cells, the results appear as text. Hitting \"`shift + enter`\" renders the text in the formatting you specify.\n", "\n", "You can specify a cell as being a markdown cell in the Jupyter tool bar, or by hitting \"`esc, m`\" in the cell. Again, you have to hit enter after using the quick keys to bring the cell into edit mode.\n", "\n", "In addition to HTML, some $\\LaTeX$ expressions may be inserted into markdown cells. $\\LaTeX$ (pronounced \"lay-tech\") is a document markup language that uses the $\\TeX$ typesetting software. It is particularly well-suited for beautiful typesetting of mathematical expressions. In Jupyter notebooks, the $\\LaTeX$ mathematical input is rendered using software called MathJax. This is usually run off of a remote server, so if you are not connected to the internet, your equations may not be rendered. You will use $\\LaTeX$ extensively in preparation of your assignments. There are plenty of resources on the internet for getting started with $\\LaTeX$, but you will only need a tiny subset of its functionality in your assignments, and [the next part of this lesson](intro_to_latex.ipynb), plus cheat sheets you may find by Google (such as [this one](http://users.dickinson.edu/~richesod/latex/latexcheatsheet.pdf)) are useful." ] }, { "cell_type": "markdown", "id": "f3c140c8-b1d3-42fb-9698-3174a8731b98", "metadata": {}, "source": [ "### Quick keys\n", "\n", "There are some keyboard shortcuts that are convenient to use in JupyterLab. (They do not all work in Colab.) We already encountered `Shift + Enter` to run a code cell. Importantly, pressing `Esc` brings you into command mode in which you are not editing the contents of a single cell, but are doing things like adding cells. Below are some useful quick keys. If two keys are separated by a `+` sign, they are pressed simultaneously, and if they are separated by a `-` sign, they are pressed in succession.\n", "\n", "|Quick keys | mode | action |\n", "|:---:|:---:|:---:|\n", "|`Esc - m` | command | switch cell to Markdown cell|\n", "|`Esc - y` | command | switch cell to code cell|\n", "|`Esc - a` | command | insert cell above|\n", "|`Esc - b` | command | insert cell below|\n", "|`Esc - d - d` | command | delete cell|\n", "|`Alt + Enter` | edit | execute cell and insert a cell below |\n", "\n", "There are many others (and they are shown in the pulldown menus within JupyterLab), but these are the ones I seem to encounter most often." ] }, { "cell_type": "markdown", "id": "fd749df4-dc7b-4843-95d8-e7cdc80ba19b", "metadata": {}, "source": [ "## Rendering of notebooks as HTML\n", "\n", "When you submit homework, you will also submit an HTML rendering of your notebooks. To save a notebook as HTML, you can click `File` → `Export Notebook As...` → `Export Notebook to HTML`." ] }, { "cell_type": "markdown", "id": "6d62ea4a-e8b3-467a-a362-2bececd51c7e", "metadata": {}, "source": [ "## Computing environment\n", "\n", "At the end of every lesson, and indeed at the end (or beginning) of any notebook you make, you should include information about the computing environment including the version numbers of all packages you use. This helps reproducibility. The [watermark package](https://github.com/rasbt/watermark) is quite useful for this. The watermark package is an **IPython magic extension**. These extensions allow convenient functionality within IPython or Jupyter notebooks. In general, to use magic functions, you precede them with a `%` sign (or a double `%%`) in a cell. We use the built-in `%load_ext` magic function to load watermark, and then we use `%watermark` to invoke it.\n", "\n", "We use the `-v` flag to ask watermark to give us the Python and IPython verison numbers and the `-p` flag to give us version numbers on specified packages we've used. We can also use a `-m` flag to give information about the machine running the notebook, and you should do that, but I will not do that for this course to avoid clutter.\n", "\n", "Your versions might not always match (especially if you are using Colab), but doing this is good practice and can help with debugging." ] }, { "cell_type": "code", "execution_count": 13, "id": "330688ca-9774-4c66-a352-a9d312a212c8", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Python implementation: CPython\n", "Python version : 3.11.5\n", "IPython version : 8.15.0\n", "\n", "numpy : 1.24.3\n", "scipy : 1.11.1\n", "bokeh : 3.2.1\n", "jupyterlab: 4.0.6\n", "\n" ] } ], "source": [ "%load_ext watermark\n", "%watermark -v -p numpy,scipy,bokeh,jupyterlab" ] } ], "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.5" } }, "nbformat": 4, "nbformat_minor": 5 }