{ "cells": [ { "cell_type": "markdown", "id": "0dff81f1-150e-4132-a41f-7d5b32dbae1d", "metadata": {}, "source": [ "# Adjoint Plugin: 1 Introduction\n", "\n", "## Introduction\n", "\n", "In this notebook, we will introduce the `adjoint` plugin of Tidy3D.\n", "The `adjoint` plugin allows users to take derivatives of arbitrary functions involving Tidy3D simulations through the use of the \"adjoint method\".\n", "The advantage of the adjoint method is that the gradients can be computed using only **two** FDTD simulations, independent of the number of parameters.\n", "This makes it possible to do gradient-based optimization or sensitivity analysis of devices with enormous numbers of parameters with minimal computational overhead.\n", "For more information on the technical details of the adjoint method and what it can be used for, we recommend these references (with links to their pre-print versions):\n", "\n", "* [Gradient-based \"inverse design\" optimization in photonics](https://arxiv.org/pdf/1801.06715.pdf).\n", "\n", "* [Adjoint method for electromagnetics](https://arxiv.org/abs/1908.10507)\n", "\n", "If you want to skip to some case studies of the `adjoint` plugin being used for some applications, see the\n", "\n", "* [Gradient Checking Notebook](../notebooks/AdjointPlugin_2_GradientChecking.html).\n", "\n", "* [Inverse Design Notebook](../notebooks/AdjointPlugin_3_InverseDesign.html).\n", "\n", "* [Multi-Objective Gradient Notebook](../notebooks/AdjointPlugin_4_MultiObjective.html).\n", "\n", "### Function differentiation\n", "\n", "The adjoint package enables users to take derivatives of functions that involve a Tidy3D simulation. For a bit of context, let's first talk about what we mean when we talk about differentiating functions in our programs.\n", "Say in our program we have programmatically defined a function of one variable $f(x)$. For example:\n", "```py\n", "def f(x):\n", " return x**2\n", "```\n", "\n", "Now, we wish to evaluate $\\frac{df(x)}{dx}$.\n", "\n", "If we know $\\frac{df}{dx}$ analytically, this is just a matter of writing a new function to compute this derivative, for example:\n", "\n", "```py\n", "def df(x):\n", " return 2*x\n", "```\n", "However, many of the more interesting and complex functions tend to compose several sub-functions together, for example\n", "$$f(x) = h(y) = h(g(x))$$\n", "might be written in a program as\n", "\n", "```py\n", "def f(x):\n", " y = x**2\n", " return 5 * y - y**3\n", "```\n", "\n", "As one can imagine, defining the derivative by hand can quickly become too daunting of a task as the complexity grows.\n", "\n", "However, we can simplify things greatly with knowledge of the derivatives of the simpler functions that make up $f$.\n", "Following the chain rule, we can write the derivative of $f$ above as\n", "$$\\frac{df}{dx}=\\frac{dh}{dy}\\frac{dg}{dx}(x)$$\n", "\n", "Thus, if we know the derivatives of the composite functions $h$ and $g$, we can construct the derivative of $f$ by multiplying all of the derivatives of the composite functions.\n", "This idea is straightforwardly generalized to functions of several inputs and outputs, and even functions that can be written more generally as a more complex \"computational graph\" rather than a sequence of operations.\n", "\n", "### Automatic differentiation\n", "\n", "The idea of a technique called \"automatic differentiation\" is to provide a way to compute these derivatives of composite functions in programming languages both efficiently and without the user needing to define anything by hand.\n", "\n", "Automatic differentiation works by defining \"derivative rules\" for each fundamental operation that the user might incorporate in his or her function. For example, derivative rules for `h` and `g`, in the example above may be used to help define the derivative for `f`. When the function is evaluated, all of the derivative information corresponding to each operation in the function are stitched together using the chain rule to construct a derivative for the entire function. Thus, functions of arbitrary complexity can be differentiated without deriving anything beyond just the derivative rules for the most basic operations contained within.\n", "\n", "This capability is provided by many programming packages, but we chose to utilize one from the [\"jax\"](https://jax.readthedocs.io/en/latest/) package as it provides the flexibility and extendibility we needed for integrating this functionality into Tidy3D.\n", "\n", "Using `jax`, we may write a function $f$ using most of the fundamental operations in python and `numpy`. In `jax` both the operations and their derivatives are tracked when the function is called. Thus, `jax` gives the option to apply `jax.grad` to this function, which uses all of the derivative information and the chain rule to construct a new function that gives the derivative of the function with respect to its input arguments.\n", "\n", "This brings us back to the `adjoint` plugin. The point of the `adjoint` plugin is to extend `jax`'s automatic differentiation capability to allow it to track functions **that involve Tidy3D simulations** in their computational graph. In essence, we privode the \"derivative\" of the `tidy3d.web.run()` function, using the adjoint method, to tell jax how to differentiate functions that might involve both the setting up and postprocessing of a tidy3d simulation and its data. The end result is a framework where users can set up modeling and optimizations and utilize jax automatic differentiation for optimization and sensitivity analysis efficiently and without needing to derive a single derivative rule.\n", "\n", "In his notebook, we will give an overview of how `jax` works for beginners and provide simple example of the plugin. More complex case studies and examples will be provided in other notebooks, linked here:\n", "\n", "\n", "* [Gradient Checking Notebook](../notebooks/AdjointPlugin_2_GradientChecking.html).\n", "\n", "* [Inverse Design Notebook](../notebooks/AdjointPlugin_3_InverseDesign.html).\n", "\n", "* [Multi-Objective Gradient Notebook](../notebooks/AdjointPlugin_4_MultiObjective.html).\n" ] }, { "cell_type": "markdown", "id": "87d26e12-3c03-432d-9cf4-61f0b03a8608", "metadata": {}, "source": [ "## Automatic Differentiation using `jax`\n", "\n", "Before jumping into any Tidy3D simulations, we will give a bit of a primer on using jax for automatic differentiation. For more details, we highly recommend checking out jax's [tutorial on the subject](https://jax.readthedocs.io/en/latest/notebooks/autodiff_cookbook.html), as we'll be covering a lot of the same topics but in less depth.\n", "\n", "First, we will import `jax` and its `numpy` wrapper, which provides most of the same functionality, but allows derivative tracking.\n", "\n", "Tip 1: if you run into an obscure error using `jax`, the first thing to check is whether you're using the `jax.numpy` wrapper instead of regular `numpy` in your function, as otherwise you will get errors from `jax` that are not super clear." ] }, { "cell_type": "code", "execution_count": 1, "id": "d1ce429f-3183-4f7f-8b16-dda847239742", "metadata": {}, "outputs": [], "source": [ "import jax\n", "import jax.numpy as jnp\n", "import matplotlib.pylab as plt\n" ] }, { "cell_type": "markdown", "id": "b5d017ba-6dc9-4cc0-b226-2b3c3438e0d5", "metadata": {}, "source": [ "Say we have a function $f$ that performs several operations on a single variable.\n", "\n", "We can define this function `f` in python and also derive its derivative for this simple case, which we write as a function `df`." ] }, { "cell_type": "code", "execution_count": 2, "id": "c501ff19-8e46-4aaf-86dd-89a97732dfa0", "metadata": {}, "outputs": [], "source": [ "def f(x):\n", " return 5 * jnp.sin(x) - x**2 + x\n", "\n", "\n", "def df(x):\n", " return 5 * jnp.cos(x) - 2 * x + 1\n" ] }, { "cell_type": "markdown", "id": "434d1841-45e5-48a3-986c-56e630badd2d", "metadata": {}, "source": [ "Let's evaluate these functions at several points and plot them." ] }, { "cell_type": "code", "execution_count": 3, "id": "237ede5f-0a7d-45cf-927b-dcb2a9b57d9c", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAioAAAGwCAYAAACHJU4LAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy88F64QAAAACXBIWXMAAA9hAAAPYQGoP6dpAABqs0lEQVR4nO3dd3gUZcPF4d9ueg8hCSQQeu8dARVQFBUQBQERkKYo4qu+KgrqZ1dUsDdElK6ICKggINKk9957D6Gl9935/hjMK0oJkGR2k3Nf115sNlvOsCR7mHnmeWyGYRiIiIiIuCC71QFERERELkVFRURERFyWioqIiIi4LBUVERERcVkqKiIiIuKyVFRERETEZamoiIiIiMvytDrA9XI6nRw/fpygoCBsNpvVcURERCQXDMMgKSmJ6Oho7PZL7zdx+6Jy/PhxYmJirI4hIiIi1+DIkSOULl36kt93+6ISFBQEmBsaHBxscRoRERHJjcTERGJiYnI+xy/F7YvKX4d7goODVVRERETczJWGbWgwrYiIiLgsFRURERFxWSoqIiIi4rLcfoyKiIiIw+EgKyvL6hjyN15eXnh4eFz386ioiIiI2zIMg9jYWOLj462OIhcRGhpKyZIlr2ueMxUVERFxW3+VlMjISPz9/TXxp4swDIPU1FTi4uIAiIqKuubnUlERERG35HA4ckpK8eLFrY4j/+Dn5wdAXFwckZGR13wYSINpRUTELf01JsXf39/iJHIpf7031zN+SEVFRETcmg73uK68eG9UVERERMRlqaiIiIiIy1JRERERKWCGYTBgwADCwsKw2Wxs3LiRM2fOEBkZycGDB3P1HJmZmZQrV461a9fmb1iL6awfuZDTCVmp4MgEwwDDAU4HGE6w2cDTFzy8z/+pfz4iItdizpw5jB07lkWLFlGhQgXCw8N57rnn6NixI+XKlcvVc3h7e/Pss8/y/PPPM3/+/PwNbCF90hR22RkQfwQSjkByHKTEnf/zFCSfhNQzkJEMmcnmn1kpuX9um4dZWHxDwD8M/IqBX6j5Z0AkBEdDSGkILgUhpcA31Cw7IiJF3L59+4iKiqJ58+YApKam8s033zB37tyrep4ePXrwzDPPsG3bNmrWrJkfUS2nolIYOLLg7H6I2wGndsG5A3DuEMQfgsTjgHF9z2/zAJvdfB5n9v9uNxxmsclKgaTjV34e70AoXhHCq5y/VIbilc0/PX2uL6OICOYhlbQshyWv7eflkauzXPr06cO4ceMA86yYsmXLMmLECHx8fLjhhhty7vf6668zcuRItmzZkjNPTLt27UhNTWX+/PnY7XaKFStGixYtmDx5Mm+88Ub+bJjFVFTcTepZOL7BvMRth7idcHo3OC9zjrqXP4SWgcASEBhp7u0IjDD/DAgHnyCzRHgHnL8eYB7esXmA/R/DmJwOcy9Ndvr5P9MgPQHSzpnZ0s6Zl+STkHAMEo+af6adNffanNhkXv7O7gWR1SG6HkTVhaj6UKImePnm+V+fiBRuaVkOarx8dXsl8sr219vi733lj9WPP/6YihUrMmrUKNasWYOHhwdvvvkmDRs2vOB+L774InPmzOGhhx5i+vTpfP755yxfvpxNmzZh/9vv5iZNmrBkyZI83x5XoaLiyrIzzEJydC0cXw/H1pt7Sy7GKwAiq0FENQirAMXKQWhZ88+A8Lw75GL3AG9/83I1stLMQ1Bn9pjF6vSe85ddZtGJ3Wxecl7HC0o1gLLNoWwLiGliHmISEXFzISEhBAUF4eHhQcmSJQE4dOgQ0dHRF9zPw8ODiRMnUq9ePYYMGcInn3zC6NGjKVOmzAX3i46O5tChQwWWv6CpqLiSrDQ4ugYOLoNDy8zr2en/vl9YBYhuACVrQWQNs5yExPx774cr8fKDiCrmhXb/u90wIP7w+T0tG+H4RvPP1DNwZJV5WfqheeipRC2o0Aoq3wYxN4CntyWbIiKuy8/Lg+2vt7Xsta9VWloavr7/3otcoUIFRowYwSOPPEK3bt144IEH/v26fn6kpqZe82u7OhUVKzmdcGID7J0P+xaYe07+eQjHPxximpp7F0o1gOj65mDVwsJmg2JlzUuNu83bDAPOHYRDy89flpl7kv7a67L8E/NQVYVWUOlWqNzWHKwrIkWezWbL1eEXVxMeHs65c+cu+r0///wTDw8PDh48SHZ2Np6eF27f2bNniYiIKIiYlrD83Tx27BjPP/88s2fPJjU1lUqVKjFmzBgaNWpkdbT8kRxnlpK9f5h/pp658PtBUeahjnItzD/DqxS9M2VsNggrb17q9zBvSzxhFpa9f5iXlFOwc6Z5ASjdGGp0hOp3m6VHRMSN1K9fn4kTJ/7r9h9++IFp06axaNEiunbtyhtvvMFrr712wX22bt1K/fr1CypqgbO0qJw7d44WLVrQunVrZs+eTUREBHv27KFYsUK0xwDMsRg7fjU/VI+tu/B7PsFQoSVUvNX8s1j5oldMciM4CmrfZ16cTojdBHv+gL3z4Mhq8zDZ0TXw+0vmXqcaHaHWfRAaY3VyEZEratu2LUOHDuXcuXM5n4FHjx5l4MCBvPvuu9x4442MGTOG9u3bc+edd15wdtCSJUsK7Rk/YHFReffdd4mJiWHMmDE5t5UvX/6yj8nIyCAjIyPn68TExHzLd80MwxxnseP8//hP7bzw+1F1oVIb81K6MXh4WRLTbdntZhmJrg8tB0NSrFkEt/9s7nX566yoP16D8jdB3QfMw0reAVYnFxG5qNq1a9OgQQOmTJnCI488gmEY9OnThyZNmvD4448DZpkZOHAgPXv2ZOPGjQQGBrJixQoSEhK47777LN6C/GMzDOM6J9m4djVq1KBt27YcPXqUxYsXU6pUKR577DEefvjhSz7m1Vdf/dduL4CEhASCg4PzM+7lGQac3Aqbp8C2GZBw+H/fs3tC+ZZQvT1UvQuCSloWs9BLPgW7ZsGWqXDwb6freQWYe1ka9IIyzbTXSqQQSE9P58CBA5QvX/6iA1HdzaxZsxg8eDBbt2694PTjy+nWrRt169blhRdeyOd01+Zy71FiYiIhISFX/Py2tKj8Ffrpp5+mS5curFmzhieffJKRI0fSu3fviz7mYntUYmJirCsqZw/A1qnmB+Pf95x4+Zt7TKp3gMq3mzO2SsGKPwybfoBN35kT4v0lsgY07g91upnzxoiIWypsRQXgo48+onPnzsTEXPmwdWZmJu+99x7PPPMMfn5+BZDu6rl9UfH29qZRo0YsX74857YnnniCNWvWsGLFilw9R243NE+lnjWLyZYp5riIv3j4QJW25jiKSrdd/Vwjkj8MwzzNecNE2PqTuZYRgHcQ1L0fGj9kzkEjIm6lMBaVwiYvioqlY1SioqKoUaPGBbdVr16dn376yaJEl+F0woFFsH6COe7EkWnebrND+Zuhdlfz0I4mJXM9NhuUucG83P4mbPoe1oyGM3thzdfmpdJt0OIJKHeTDguJiLgQS4tKixYt2LVr1wW37d69m7JlXej00vjDsGESbJxkLuz3l5K1zUGatTppzIk78QuFGwZC00fhwGJY/TXs+s08e2jvPHOAbvMnzNOctTq0iIjlLP1N/N///pfmzZvz9ttv07VrV1avXs2oUaMYNWqUlbFMu2bDqq9g/yJyFvXzDTH3nDToZZ65I+7LZjMnjKvQyhy/suJz89DQ8Q0wta+59ECLp6BeD82AKyJiIUvHqADMnDmToUOHsmfPHsqXL8/TTz992bN+/infxqjMGQorvzCvl78Z6j9oHtrxcs0BS5IHUk6be1hWjzIXUQQIKQM3P2MWFp1GLuJSNEbF9bn9YNq8kG9FJW6neTZPvR7mDKlSdGSmwPrx5hpDySfN20LLwE3PQr0HVFhEXISKiuvLi6LiwqvYWSyyGtzykkpKUeQdYI5jeXITtB0GAZHmWKVfn4DPGplnfDmdVqcUESkSVFRELsXLD5o9dr6wvG0WlnMH4af+MPoWOPCn1QlFRAo9FRWRK/H2h2aD4MmN0PpFc+Xm4xtgXAeY1AVObrM6oYgUAq1ateKpp54CIDU1lc6dOxMcHIzNZiM+Pj5Xz7Fo0aKruv9fvvnmG26//fZc33/OnDnUq1cPZwHsXVZREckt7wBo+Rw8sREaP2wujbDnd/iyBfz6JKScueJTiIjkxrhx41iyZAnLly/nxIkThIT8b46u1q1bM3r06Dx7rfT0dP7v//6PV155JdePueOOO/Dy8mLSpEl5luNSVFRErlZgBLQbAYNWm+sHYcC6sfBpA/OsIUe21QlFxM3t27eP6tWrU6tWLUqWLInt/ESUZ8+eZdmyZXTo0CHPXmvq1KkEBwfTokWLq3pcnz59+OSTT/Isx6WoqIhcq+IVoet46PMblKgF6fHw27MwqhUcWn6lR4tIfjAM88w9Ky5XcRJtSkoKDz74IIGBgURFRfH+++/nfK9Vq1a8//77/Pnnn9hsNlq1apXzvVmzZtGgQQNKlCgBwG+//UaVKlXw8/OjdevWHDx48ILX6devH3Xq1MlZIy8zM5P69evz4IMP5txn8uTJFxSf9PR0atasyYABA3Ju27dvH0FBQXz77bc5t3Xo0IG1a9eyb9++XG/3tdDUmyLXq1wLGLAY1o2BBW/CyS0w5k6odZ85CDeohNUJRYqOrFR4O9qa137huHmIOBcGDx7M4sWL+fnnn4mMjOSFF15g/fr11KtXj2nTpjFkyBC2bt3KtGnT8Pb+36STv/zyCx07dgTgyJEjdOrUiUGDBjFgwADWrl3LM888c8HrfPLJJ9StW5chQ4bw4Ycf8uKLLxIfH89nn32Wc5+lS5fSq1evnK99fX2ZNGkSTZs2pV27drRv356ePXty22230a9fv5z7lSlThhIlSrBkyRIqVqx4TX9luaGiIpIXPDyhycNQsxMseB3WjTPn4dk7D2573ZwwMJfLtotI4ZacnMw333zDxIkTufXWWwFzTErp0qUBCAsLw9/fH29vb0qW/N8SLRkZGcyZM4dXX30VgC+//JKKFSvm7I2pWrUqW7Zs4d133815TGBgIBMnTqRly5YEBQXx0UcfsXDhwpx5S+Lj40lISCA6+sJyV69ePd58800eeugh7r//fg4dOsTMmTP/tS3R0dEcOnQo7/5yLkJFRSQvBRSHDh9Dwz7w61NwYqM50HbzFPP28MoWBxQp5Lz8zT0bVr12Luzbt4/MzEyaNm2ac1tYWBhVq1a97OMWLFhAZGQkNWvWBGDHjh0XPAdAs2bN/vW4Zs2a8eyzz/LGG2/w/PPPc+ONN+Z8Ly0tDeCiE+Y988wzzJgxg88++4zZs2dTvHjxf93Hz8+P1NTUy+a+Xvovnkh+iK4PD82H298yf3kdWgZfNofF70F2ptXpRAovm808/GLFJZ9XXv/ll1+4++67r/pxTqeTZcuW4eHhwd69ey/4XvHixbHZbJw7d+5fj4uLi2P37t14eHiwZ8+eiz732bNniYiIuOpMV0NFRSS/eHhC88fhsZVQqQ04MmHhW/DVzXBsvdXpRMQiFStWxMvLi1WrVuXcdu7cOXbv3n3JxxiGwa+//pozPgWgevXqrF69+oL7rVy58l+PHT58ODt37mTx4sXMmTOHMWPG5HzP29ubGjVqsH379n89rl+/ftSuXZtx48bx/PPPs2PHjgu+n56ezr59+6hfv/6VN/o6qKiI5LdiZaHHVOj8DfiHw6kdMLoNLHwbHFlWpxORAhYYGEj//v0ZPHgwCxYsYOvWrfTp0wf7ZcaxrVu3jtTU1AsO2zz66KPs2bOHwYMHs2vXLr777jvGjh17weM2bNjAyy+/zOjRo2nRogUffPABTz75JPv378+5T9u2bVm6dOkFj/v8889ZsWIF48aNo0ePHtxzzz306NGDzMz/7RFeuXIlPj4+Fz3clJdUVEQKgs0Gte8z516p2QkMByx+F76+BU7++38yIlK4DR8+nJtuuokOHTrQpk0bbrzxRho2bHjJ+//888/cddddeHr+b2hpmTJl+Omnn5gxYwZ169Zl5MiRvP322znfT09Pp2fPnvTp0yfn9OMBAwbQunVrevXqhcPhAKB///789ttvJCQkALBz504GDx7MF198QUxMDABffPEFp0+f5v/+7/9ynv/777+nR48e+PvnbmzOtdLqySJW2PoTzHoG0s6Bh7c5NX/z/4Ddw+pkIm6jKK2eXKdOHV566SW6du2aL8/fpUsXGjRowNChQ3N1/9OnT1O1alXWrl1L+fKXXrxXqyeLuKtaneGxVVDlDnPsyh+vmHOvnMvf0/xExP1kZmbSuXNn7rzzznx7jeHDhxMYGJjr+x88eJAvvvjisiUlr2iPioiVDAM2ToLZQyAzCXyCocNHZpERkcsqSntU3JX2qIi4O5sN6veEgcsgpilkJMLUfjBjEGQkW51ORMRyKioirqBYWXPNoJufA2ywcSKMagnHN1qdTMTlufmBgUItL94bFRURV+HhCbe8CL1/haBoOLPXPI15xedXtdiZSFHh5eUFkO8zo8q1++u9+eu9uhaaQl/E1ZS/yTwU9Mt/YOdMmPsCHF4BHT8H3xCr04m4DA8PD0JDQ4mLiwPA398fWz7PDiu5YxgGqampxMXFERoaiofHtZ/RqKIi4or8w6DbRFgzGuYMhR2/wslt0HUClKxldToRl/HXon1/lRVxLaGhoRcsrHgtdNaPiKs7uham9IbEo+DpB+0/gHoPWJ1KxKU4HA6ysjTTsyvx8vK67J6U3H5+q6iIuIPUszDtYdj7h/l1gwfhzuHgpVMyRcQ95fbzW4d+RNyBfxg88CP8ORwWDYP1480zgu6fBKFlrE7nNtIyHZxMTCc2MZ1zKZkkZWSTnJ5NUno2KZnZOJwGTsPAMMBpGHjYbfh5eeDv7YGftycB3h6EBXgTEeRDRJAP4YE++HppNmGR/KSiIuIu7HZo9TyUbgQ/PQSxm2FUK+g6HsrdeMWHFxUJaVnsjUti36kU9p9KYf+pZA6eSSE2IZ3E9Ow8f71i/l6ULR5AueL+lAsPoHx4ANVKBlMxIgBPD51YKXK9dOhHxB3FH4HJD5hlxe4Jd74LjR+yOlWBS83MZuPheDYfS2DLsQS2Hkvg0JnLn6rq7+1ByWBfigd6E+TrRaCPJ4G+5t4STw87NsBus2GzQbbTIC3TQWpmNqmZDlIysjmbksnp5ExOJWWQ6XBe8nV8PO1UiwqmZnQwdUuH0KR8ccoV11kpIn/RGBWRwi4zFX553FzgEKBhX7jzPfD0tjZXPkrJyGbtoXOs2n+GlfvPsPloAtnOf/8KiwrxpWJEIBUiAqgQHkD5iEBKhfoSGexLkI9nnpQFwzBITMvmWHwah86kcOBMCodOp7L/dDI7TiSRnPHvvTeRQT40KR9G0/Jh3FQ5gnLhAdedQ8RdqaiIFAWGAcs+gj9eAwwo08w8hTkwwupkeebg6RT+2HGSBTvjWH3g7L+KSXSIL/XKhFKrVAi1S4VQKzqEYgHWljWn0+DQ2VS2HTf39Gw4HM/Gw/H/2gNTISKAW6tF0rpaJI3LheGlQ0VShKioiBQlu+ea41YyEiG4NHT/DqLqWp3qmhiGweajCfy25QTzdpxk/6mUC75fKtSPGyoU54YKYdxQoTgxYf4WJb066VkONh6JZ/WBsyzfd5q1B89dULqCfT25s1YUHepG06xicTzsOkQkhZuKikhRc2o3TO5uTr3vFQD3fQtV77A6Va7tjUvil43H+WXTcQ7+bZyJp91Gk/Jh3Fq9BLdUi6R8ITlckpiexZLdp1mwM45Fu+I4k5KZ873wQB/a1S5J54alqV0qRONapFByy6LyzjvvMHToUJ588kk++uijXD1GRUXkb9Li4cfesH8R2OzQdhjc8KjVqS4pITWL6RuOMmXtUbafSMy53dfLTpvqJbijVklurhJBsO+1rxPiDhxOg9UHzvLr5uPM3nKCc6n/m7isZnQw3ZuUoWO9aIIK+d+DFC1uV1TWrFlD165dCQ4OpnXr1ioqItfKkQWznjbnWgFo8gjcMQzsrjHfh2EYrD10ju9XHWbWlhNkZJvjNjztNlpWieDuetG0qV6CAJ+iOXtClsPJ0r2nmb7+GHO2xZJ5/u/Hz8uDu+tG0+/G8lQtGWRxSpHr51ZFJTk5mQYNGvDFF1/w5ptvUq9evUsWlYyMDDIyMnK+TkxMJCYmRkVF5O8MA5Z9DH+8Yn5d5Q7o/A34BFoWKS3TwbQNRxm77CB74pJzbq9WMojuTcpwd91oywfBuppzKZlM23CM71cfZu/f/s5uqhzOwzdV4KbK4TosJG7LrYpK7969CQsL48MPP6RVq1aXLSqvvvoqr7322r9uV1ERuYhtM2D6I5CdDiXrwAM/QHB0gUaIS0xn/IpDTFp1KOeQhr+3Bx3qRNO9aRnqltYYjCv5ay/U2GUHmb31BH+Nwa1aIohHW1WgQ51oTS4nbsdtisrkyZN56623WLNmDb6+vlcsKtqjInKVjq6F7++HlFMQXAp6/gSR1fP9ZffGJfPlon38sukYWQ7z10xMmB/9WpTnvoalNd7iGh05m8qYZQf5Yc1hUjIdAFQID+A/t1ZSYRG34hZF5ciRIzRq1Ih58+ZRp04dgCsWlX/SGBWRXDh3CCZ1gdO7wDcEHpgCZW7Il5fafTKJTxfsZebm4/z126VxuWL0v7ECt9UoodNu80hCWhYTVx5i9JL9OXuqyocH8MStlbi7bin9PYvLc4uiMmPGDO69994LloF2OBzYbDbsdjsZGRmXXSIaVFREci31LHzXDY6uBk9f8/Tlau3y7Ol3nEjk0wV7+G1LbM5tt9cowWOtK1EvJjTPXkculJyRzfgVB/n6z/8VlupRwbxwVzVuqlx4Jv6TwsctikpSUhKHDh264La+fftSrVo1nn/+eWrVqnXF51BREbkKmakwtS/snmOevtz+Q2jY57qe8sDpFEbM3cWsLSdybruzVkkev6USNaNDrjOw5NZfheXLRftIOr/44k2Vw3nhrupUj9LvRnE9blFULkaHfkTymSMbZj4JGyaaX7d6AVo+B1c5oPVUUgafzN/D96sPk+00sNmgXe0o/nNLZZ0+a6FzKZl8umAvE1YeJMthvi/3N45hcNtqhOmsKnEhuf38LpoTFYgUZR6ecPdnEBQFfw6HRW9DcizcNSJXc60kZ2Tz9Z/7+XrJflLPD+ZsXTWC5++sRrWS+s+C1YoFePNyhxr0bl6W4XN3MXPzCb5ffYTZW2N5rm017m8cg13jV8SNuNwelaulPSoi12H11/DbYMCAGh2h0+hLrr7sdBpM23CMd2bv5HSyeeZd3ZhQhtxRjWYVixdgaLkaaw6e5f9mbGVnbBIAdUuH8MY9tahTOtTaYFLkue2hn6uloiJynbbNgGkPgyMTKrUxV1/2vnChv81H43nll21sOBwPQLni/jx3RzXurFVSc6C4gWyHkwkrD/HB77tJysjGZoMHbyjLc3dUK7IzAIv1VFREJPf2zofJPSA7Dco0NyeG8w3mTHIGw+fu4oe1RzAMCPD24IlbK9O3RXm8PTVfh7uJS0xn2OydTN9wDIDSxfx4t3MdWlQKtziZFEUqKiJydQ6tgO+6QkYiRnR9fqz2MW8uiCXx/Bkk99YvxZA7q1Ei2NfioHK9lu45zfM/beZYfBoA3ZuUYehd1Qr94o/iWlRUROTqHd+IY/y9eKSfZbezFD0zXyA8qiyvd6xJo3JhVqeTPJSckc17c3YyfoU5RURUiC/vdq7DzVU094oUjNx+fmvfrYgAkJHt4KPt/rRPepFYoxhV7Mf4o9gwfu1ZWiWlEAr08eT1jrWYPOAGyhb350RCOg9+u5o3Zm4nI9thdTyRHCoqIsK6Q2dp/8lSPvpjDzscUbxf6mOyg8sQnHYUj7F3wek9VkeUfHJDheLMefJmet1QFoBvlh6g42fL2HMyyeJkIiYd+hEpwtKzHAyfu4tvlx3AMCA80JuXO9SkQ50obEknYPw95vpAAZHQZyZEVLU6suSj+TtOMnjqZs6mZOLjaeeldtXpeUNZndkl+UJjVETksjYfjefpKZvYG5cMwH0NS/NSu+qE+v9tHpWU0zC+I5zcCgER0PvXAll5WawTl5TOsz9u5s/dpwBzvaYRXetqoK3kORUVEbmoLIeTzxbs5bOFe3E4DSKCfHi3c21uqVbi4g9IPQvj74bYLeBf3CwrJWoWbGgpUE6nwdjlB3ln9k4yHU7KFvfnyx4NqRGt37GSd1RURORf9pxM4ukpm9hyLAGA9nWieKNjLYpdaQ2Y1LMw4R44sQn8wqD3L1Cydv4HFkttOhLPY5PWcyw+DR9PO2/cU4uujWKsjiWFhIqKiOQwDIOJKw/xxqwdZGY7CfHz4o17anF33ejcP0naOZjQCY6vB79i8ODPEFU3/0KLSziXksl/p2xk0S7zUFC3RjG81rEmvl5XXhdK5HJUVEQEgPjUTJ7/aTNzt50EoGWVCN67r861TdyWFg8TO8OxteAbYpaV6Pp5G1hcjtNp8PnCvXzwx24MA+qUDmFUr0aUDNHkf3LtNI+KiLDm4Fnu+ngJc7edxMvDxkvtqjO2b+Nrn13WLxR6TYfSTSA9AcZ1hGPr8jSzuB673cZ/bq3MhH5NCfX3YvPRBO7+bCkbDp+zOpoUASoqIoWQw2nwyfw9dPtqBccT0ilX3J9pA1vw0E0Vrv9UU99g6DUNyjSDjASYcK85dkUKvRsrh/PLoBupWiKIuKQMuo1aybT1R62OJYWciopIIROXlE7P0av4YN5unAZ0ql+KmU/cRO3SIXn3Ij5B0GMqxNxg7lkZfw+c3JZ3zy8uq0xxf356rDltqpcgM9vJ01M2Mey3HTicbj2KQFyYiopIIbLmoDnD7Ir9Z/D39uCDrnX5oFs9An088/7FfAKhx49QqiGknTXnWzm1O+9fR1xOoI8no3o15PHWlQD46s/9PDpxHWmZmnpf8p6KikghYBgG3yw9QPdRK4lLyqByZCC//udGOjUonb8v7BsMPX+CknUg5RSM6wBn9uXva4pLsNttPNu2Kh/fXw9vTzvztp+k+9crOZOcYXU0KWRUVETcXEpGNv/5fgNvzNxOttOgQ91oZgxqQcWIwIIJ4FcMes2AyJqQHGuWlXMHC+a1xXId65Vi0kPmINuNR+Lp9OVyDpxOsTqWFCIqKiJubG9cMh0/X8bMzSfwtNt4pUMNPrm/HgH5cajncgKKm6cqh1eBxGNmWUnQIMuionG5MH4a2JyYMD8OnUml0xfLWHdIZwRJ3lBREXFTc7fF0vGzpeyNS6ZEsA+TB9xA3xblrVtALjACHvwFwipA/GGzrCSesCaLFLiKEYFMG9iCOqVDOJeaxQNfr2TO1lirY0khoKIi4mYMw+DT+Xt4ZMI6UjIdNC0fxsz/3ESjcmFWR4PgKHMtoNAycHa/uUZQ8imrU0kBiQgyC/Ot1SLJyHby2KR1TFl7xOpY4uZUVETcSFqmg8e/28D788yza/o0L8fEh5oSEeRjcbK/CSltlpXg0nB6N0zsZJ7CLEWCv7cnX/VqyP2NY3Aa8NzUzYxest/qWOLGVFRE3MTx+DTuG7mcWVtO4OVhY1in2rx6d028PFzwx7hYOXPMSkAExG6G77pBZqrVqaSAeHrYGdapNo/cXAGAN2ft4IPfd+HmK7aIRVzwN5yI/NO6Q2e5+7OlbDueSFiAN5MeuoHuTcpYHevywitBz2ngEwKHV8CUByE70+pUUkBsNhtD7qzG4LZVAfhkwV5e+3U7Tk0MJ1dJRUXExU1dd5Tuo1ZxOjmTaiWD+OXxFjQp7wLjUXIjqg70mAKefrB3Hkx/BJyaFKyosNlsDGpdiTc61gRg7PKDPPvjJrIdTouTiTtRURFxUYZh8MHvu3j2x01kOpzcUbMkPw1sTuli/lZHuzplboBuE8HuBdumwaxnQIcAipRezcrxUbd6eNhtTNtwjCcnbyRLZUVySUVFxAVlZDt4esomPlmwF4DHWlXkix4NCn5+lLxSuQ10GgXYYN0YmP+a1YmkgN1TvxQjezbEy8PGrC0neHLyBpUVyRUVFREXE5+aSa9vVjN9wzE87Dbe7Vyb5+6oht1u0fwoeaVWJ+jwkXl96Yew9CMr04gFbqtRgpE9G+LtYee3LbE88b3KilyZioqICzl8JpVOXy5n9YGzBPl4MrZvY7o1dvFBs1ejYR+47XXz+h+vwNoxlsaRgndr9RJ81cssK7O3xvL4d+vJzFZZkUtTURFxEesPn+PeL5ax/1QK0SG+/DiwGTdVjrA6Vt5r8STc+LR5feZ/Ydt0a/NIgWtdLZKvHmyIt6edudtOqqzIZVleVIYNG0bjxo0JCgoiMjKSe+65h127dlkdS6RAzd0WS/dRKzmTkkmtUsFMH9SCaiWDrY6Vf259GRr1BwyYNgAO/Gl1IilgratGMqqXWVZ+326WFR0GkouxvKgsXryYQYMGsXLlSubNm0dWVha33347KSlafVOKhsmrDzNw4joysp3cUi2SHwY0o0Swr9Wx8pfNBncNh+p3gyMTJveA2C1Wp5IC1qpqJKMfbJRTVp79cRMOzbMi/2AzXGyqwFOnThEZGcnixYu5+eab//X9jIwMMjIycr5OTEwkJiaGhIQEgoML8f9ApdAxDIPPF+5lxO/mdPjdGsXw1r218HTFmWbzS1a6OcX+oWUQWBL6/w7FylqdSgrYgp0nGTB+HdlOg/sbxzCsU23rFteUApOYmEhISMgVP79d7jdiQoK5JkhY2MUntBo2bBghISE5l5iYmIKMJ5InnE6DV3/ZllNSHm9diXc61y5aJQXAyxfu/w4ia0ByrFlaUs5YnUoK2C3VSvDx/fWx22DymiO89ut2TbcvOVxqj4rT6eTuu+8mPj6epUuXXvQ+2qMi7i4z28kzP27i103HAXi1Qw36tChvcSqLJR6Hb26HhCNQqhH0/gW8A6xOJQVs6rqjPPvjJsAs78+en35fCie33KMyaNAgtm7dyuTJky95Hx8fH4KDgy+4iLiL5Ixs+o1dw6+bjuPlYeOT7vVVUgCCo6HnT+BXDI6thR/7gCPL6lRSwO5rWJo37qkFwGcL9/L5wr0WJxJX4DJF5fHHH2fmzJksXLiQ0qVLWx1HJM+dSc7gga9XsnTvafy9Pfi2T2PurhttdSzXEVEVHji/LtCe3+HXpzTVfhHU64ayvHBXNQCGz93FpFWHLE4kVrO8qBiGweOPP8706dNZsGAB5cvrf5dS+JxISKPLVyvYfDSBsABvvn/4hsI5R8r1imkCXcaAzQ4bJ8KCN6xOJBYYcHNFnrilEgD/N2Mrc7bGWpxIrGR5URk0aBATJ07ku+++IygoiNjYWGJjY0lLS7M6mkieOHwmlS4jV/xvIrdHm1E3JtTqWK6r6p3Q/iPz+pL3YdUoS+OINf57WxW6NymD04AnJm9g1X4Nsi6qLB9Me6lT0MaMGUOfPn2u+PjcDsYRscLeuCR6jF7FycQMyhX3Z9LDN1Aq1M/qWO5h8XBY+CZgM1dfrt7e6kRSwBxOg4ET1/H79pME+Xoy5ZFmVI/S7/nCwm0G0xqGcdFLbkqKiCvbdjyBrl+t5GRiBlVKBDLlkWYqKVfj5mehYV/AgJ8egqPrrE4kBczDbg44b1IujKT0bHp/u5ojZ1OtjiUFzPKiIlIYrT98ju6jVnI2JZPapUL4YUAzIgv7bLN5zWaDu0ZApdsgOw2+7wbnDlqdSgqYr5cHX/duRLWSQcQlZdD729WcTcm0OpYUIBUVkTy2fN9peo5eRWJ6No3LFWPSw00pFuBtdSz35OFpDq4tWQdSTsHE+yD1rNWppICF+Hkxrl8TSoX6sf90Cn3HriEt02F1LCkgKioieWjhzjj6jllDaqaDmyqHM65fE4J9vayO5d58gszTloNLwZk98ENPyM648uOkUCkR7Mu4fk0o5u/FpiPxPPXDBq0LVESoqIjkkTlbYxkwYS0Z2U7aVC/B1w82wt/b0+pYhUNwFPT4EXyCzXWBfh4ETq20W9RUigzk6wcb4e1hZ+62k7wze4fVkaQAqKiI5IHZW06cX6beoEPdaL7s2QBfLw+rYxUuJWpC1/Fg94QtP8LCt6xOJBZoVC6M4V3qAPD1kgNMWKkJ4Qo7FRWR6/TblhM8/v0Gsp0G99YvxUfd6uFV1BYXLCgVW0OHj83rS0bAunHW5hFLdKxXimdvrwLAKz9vZeGuOIsTSX7Sb1OR6zBr8wn+8715rLxT/VKM6FIXD7uWp89X9XvCzc+Z12f+F/bOtzaPWGJQ60rc17A0TgMen7Se7ccTrY4k+URFReQa/brpOE9MPl9SGpRiuEpKwWn9AtS5HwwHTOkNsVusTiQFzGaz8fa9tWlesTgpmQ76jV1DbEK61bEkH6ioiFyDXzYd58nzJeW+hqUZfp9KSoGy2eDuT6HcTZCZBJO6QuIJq1NJAfP2tPNlz4ZUigwkNjGd/uN02nJhpKIicpV+3niMpyZvwGlA10alea9zHZUUK3h6Q7cJEF4Vko7D9/dDpmYtLWpC/LwY06cxxQO82XY8kWenbsLilWEkj6moiFyFGRuO8d8fNuI0oFujGN7pVAe7Sop1/IrBAz+AXxic2AgzHtVpy0VQTJg/X/ZsiKfdxqzNJ/h84V6rI0keUlERyaWfNx7j6SlmSbm/cQzDOtVWSXEFYeXh/u/Awxu2/6zTlouoJuXDeOOeWgCM+H03v2+LtTiR5BUVFZFc+G3LCZ6esgmnAd2blOHte1VSXErZZtDhE/P6khGwabK1ecQS3ZuUoU/zcgD894eN7IzVmUCFgYqKyBX8sf0kT5w/BblLw9K8dU8tlRRXVK873Pi0ef2X/8ChFdbmEUu81K46LSqZZwI9PH6tFjAsBFRURC5j8e5TPDZpPdlOg471onmns8akuLRb/g+qdwBHJvzQA84esDqRFDBPDzufdW9A2eL+HDmbxmOT1pHl0Lgld6aiInIJy/edZsD4tWQ6nNxZqyTva54U12e3w71fQVQ9SD0D33WD9ASrU0kBKxbgzdcPNiLQx5OV+8/yxsztVkeS66CiInIRaw6epf/YvxYYjOTj++vjqWnx3YN3AHSfDEHRcHoX/NgXHNlWp5ICVqVEEB91q4fNBuNXHOKndUetjiTXSL95Rf5h45F4+o5ZQ1qWg5urRPB5jwZ4e+pHxa0ER0H378HLH/bNh7lDrU4kFmhTowRP3loZgBemb2Hbce1dc0f67SvyN1uPJfDgN6tIzsimWYXifNWzIT6eWgXZLUXXg06jzOurR8GqUZbGEWs8cUtlWleNICPbyaMT1xGfqsG17kZFReS8XbFJ9PpmFYnp2TQqW4zRvRvh562S4taqd4A2r5rX5zwPe/6wNI4UPLvdxkfd6lMmzBxc+9QPG3E6NXOtO1FREQEOnE6hx+hVnEvNom5MKGP6NibAx9PqWJIXWjwF9XqA4YSpfeHUbqsTSQEL8ffiy54N8PG0s2jXKT6ev8fqSHIVVFSkyDsen0bP0as4nZxB9ahgxvdtQpCvl9WxJK/YbND+IyjTDDISzTWB0s5ZnUoKWM3oEIZ1qg3Ax/P3sGDnSYsTSW6pqEiRdiY5g57frOJYfBoVwgOY0L8JIf4qKYWOpzd0nQAhMXB2n84EKqI6NSjNg83KAvDU5I0cOpNicSLJDRUVKbIS07N48NvV7D+VQnSILxMeakp4oI/VsSS/BEaYawJ5+cP+hTDv/6xOJBZ4qV0NGpQJJTE9m0cmrCM9y2F1JLkCFRUpktIyHTw0di3bjidSPMCbiQ81pVSon9WxJL9F1YF7R5rXV34B6ydYm0cKnLennS96NCQ80JudsUm89us2qyPJFaioSJGTme1k4KR1rD54liBfT8b1a0KFiECrY0lBqdERWp2fV2Xmf+HwSmvzSIErGeLLx/fXx2aD71cfYcaGY1ZHkstQUZEixeE0eHrKRhbtOoWvl50xfRpTq1SI1bGkoN38HFS/G5xZ8ENPiD9idSIpYC0qhfPELf+bDG7fqWSLE8mlqKhIkWEYBi/N2MLMzSfw8rAxsmdDGpULszqWWMFuNw8BlagNKadg8gOQmWp1KilgT9xamWYVipOa6WDQpPUar+KiVFSkSDAMg3dm7+T71Uew2+CjbvVpVTXS6lhiJe8A6P4d+IdD7Gb4+TEwNBFYUeJht/Fx93qEB/povIoLU1GRIuGLRfv46s/9AAzrVJt2daIsTiQuIbQMdJsAdk/YNh2WjLA6kRSwyCBfPr6/nsaruDCXKCqff/455cqVw9fXl6ZNm7J69WqrI0khMmnVIYbP3QXAi3dVp1vjMhYnEpdStjm0e9+8vuBN2DHT2jxS4P45XmVvnMaruBLLi8oPP/zA008/zSuvvML69eupW7cubdu2JS4uzupoUgjM3nKCl2ZsBeDx1pV4+OYKFicSl9SwDzQZYF6fNgBO6hBAUfPP8SppmRqv4iosLyoffPABDz/8MH379qVGjRqMHDkSf39/vv32W6ujiZtbse8MT07eiGFA9yZleOb2KlZHElfW9m0ofzNkpZjT7KecsTqRFKC/j1fZdTKJN2dttzqSnGdpUcnMzGTdunW0adMm5za73U6bNm1YsWLFRR+TkZFBYmLiBReRf9p+PJEB49eS6XDStmYJ3rynFjabzepY4so8vKDLOChWDuIPw4+9wZFldSopQJFBvnzUrR4Ak1YdZu62WGsDCWBxUTl9+jQOh4MSJUpccHuJEiWIjb34P5Bhw4YREhKSc4mJiSmIqOJGjpxNpfeY1SRlZNOkfBgf318fD7tKiuSCfxh0nwzegXBwCfyuafaLmhsrh/PI+UPEz/+0mdiEdIsTieWHfq7W0KFDSUhIyLkcOaKJmuR/Tidn0OubVZxKyqBaySC+frARvl4eVscSdxJZ/X/T7K/6EjZ+b20eKXDP3F6VWqWCiU/N4r8/bMTh1GnrVrK0qISHh+Ph4cHJkxcut33y5ElKlix50cf4+PgQHBx8wUUEIDkjm35j13DwTCqli/kxrl8TQvy0ErJcg+odzNlrAX59Eo6ttzaPFChvTzuf3F8fPy8PVuw/w6jzUxuINSwtKt7e3jRs2JD58+fn3OZ0Opk/fz7NmjWzMJm4m8xsJwMnrmPz0QTCArwZ368JJYJ9rY4l7qzVUKhyBzgyzGn2k09ZnUgKUIWIQF67uyYA7/++i41H4q0NVIRZfujn6aef5uuvv2bcuHHs2LGDgQMHkpKSQt++fa2OJm7C6TR49sdNLNlzGn9vD8b0aaxFBuX62e3QaRQUrwSJxzS4tgjq0qg07WpHke00eHLyBpIzsq2OVCRZXlS6devGiBEjePnll6lXrx4bN25kzpw5/xpgK3IxhmHw+szt/LLpOJ52c/2eujGhVseSwsI3BO7/DryD4NAymPuC1YmkANlsNt6+tzalQv04dCaVV37W/DpWsBmGey9ukZiYSEhICAkJCRqvUgR9sWgv780xZ539+P56dKxXyuJEUijtnGUuXAjQ8Quo38PaPFKgVh84y/2jVuA09HsmL+X289vyPSoi12rK2iM5JeXl9jX0y0PyT7V20HKIeX3mf+HYOmvzSIFqUj6Mx89Psf/S9K0cPaeVtguSioq4pQU7TzJ02hYABraqSL8by1ucSAq9ls9D1bvMwbWTe0KylvkoSp64pRINyoSSlJHNsz9uwqlTlguMioq4nc1H4xk0aQMOp8F9DUvzXNuqVkeSosBuh3u/gvAqkHQcpjwI2ZlWp5IC4ulh54Ou9fD39mDl/rN8u+yA1ZGKDBUVcSuHz6TSb+wa0rIc3FwlgmGdamtqfCk4vsHm4FqfYDi8AuYOtTqRFKBy4QG81K4GAO/N3cXuk0kWJyoaVFTEbZxNyaT3mNWcTs6kZnQwX/RogJeH/glLAQuvbJ62DLBmNKyfYG0eKVDdm8RwS7VIMrOdPDV5I5nZTqsjFXr6LS9uIT3LwUPj1nDgdAqlQv0Y06cxgT6eVseSoqrqndDq/KnKs56Go2utzSMFxmaz8U7n2hTz92L7iUQ+nr/b6kiFnoqKuDzH+cmW1h+OJ9jXk3H9GhOpWWfFajcPhmrtwZFpzlybdPLKj5FCITLIl7fvrQ3Al4v2se7QWYsTFW4qKuLSDMPg9V+3MXfbSbw97Izu3ZhKkUFWxxI5P7h2JIRXhaQTGlxbxNxZO4pO9UvhNODpKZtI0ay1+UZFRVza10v2M27FIQA+7FaPJuXDLE4k8jc+QecH14bAkZUw53mrE0kBerVjTaJDfDl0JpW3ftthdZxCS0VFXNYvm47z9m87AXipXXXa1YmyOJHIRYRXgs5fAzZY+y1smGh1Iikgwb5ejOhSF4DvVh1m4U7NrZMfVFTEJa3cf4Znp2wCoG+LcvTXhG7iyqq0hdbnB9fOfBqOb7A2jxSY5pXC6dfC/P303E+biU/V4b+8pqIiLmf3ySQGjF9LpsPJnbVK8lK7GporRVzfTc9ClTvNmWt/6AUpZ6xOJAXkuTuqUjEigFNJGbz+63ar4xQ6KiriUk4mptPn29UkpmfTqGwxPuxWDw+7Soq4gb8G14ZVgIQjMLUvODTAsijw9fJgeJe62G0wbcMx/tiuM8DykoqKuIyk9Cz6jFnD8YR0KkQE8PWDjfD18rA6lkju+YVCt0ng5Q8HFsOCN6xOJAWkQZliPHxTBQCGTt+iQ0B5SEVFXEJmtpOBE9ez40Qi4YHejOvbhGIB3lbHErl6JWpAx8/M68s+gu0/WxpHCs5/b6tCBR0CynMqKmI5wzAYMm0zS/eext/bg2/7NCYmzN/qWCLXrlZnaPa4eX3GY3Bql7V5pED4enkwQoeA8pyKiljuwz/2MG39MTzsNj5/oAF1SodaHUnk+rV5DcrdBJnJMLkHpCdanUgKQIMyxXjo/CGgF6ZvISE1y+JE7k9FRSz107qjfDJ/DwBv3lOL1tUiLU4kkkc8POG+MRAUDWf2wIyBYBhWp5IC8PT5Q0BxSRm8NnOb1XHcnoqKWGbFvjMMmbYZgIGtKtK9SRmLE4nkscAI6DYBPLxh50xY+qHViaQA+Hp5MPy+84eA1usQ0PVSURFL7I1L5pEJa8lyGLSrE8Xg26taHUkkf5RuBHe+Z15f8AbsW2BtHikQDcvqEFBeUVGRAnc6OYO+Y825UhqUCeX9LnWxa64UKcwa9oH6vcBwwtT+cO6Q1YmkAOgQUN5QUZEClZ7l4OHxazlyNo0yYf6aK0WKBpsN7hoB0fUh7SxM6QVZaVanknz2z0NAi3ZpLaBroaIiBcbpNHh6ykY2HI4nxM+LMX0bUzzQx+pYIgXDyxe6TgD/4nBik7kmkAbXFnoNyxaj7/m1gF6cvpWUDM1WfLVUVKTAvDd3F79ticXLw8ZXvRpSMSLQ6kgiBSs0Bu77Fmx22PQdrP3G6kRSAJ65vQqli/lxLD6N4XM1p87VUlGRAvH96sOMXLwPgHc71+GGCsUtTiRikQqtoM2r5vXZQ+DIaivTSAHw9/bk7XtrAzBuxUHWHTpncSL3oqIi+e7P3ad4acZWAJ68tTKdGpS2OJGIxZo/ATU6gjMLpjwISTp9tbC7uUoEnRuUxjBgyE+bycx2Wh3JbaioSL7aFZvEY5PW43Aa3Fu/FE+1qWx1JBHr2WzQ8XMIrwpJJ+DHPuDQ6auF3UvtqlM8wJs9ccl8sWiv1XHchoqK5Ju4xHT6jllNckY2TcqH8U7n2thsOg1ZBACfILh/EngHweHlMO9lqxNJPisW4M2rd9cE4POFe9lzMsniRO5BRUXyRWpmNv3HreV4QjoVwgMY1ashPp46DVnkAuGV4d6R5vWVX8DmH63NI/mufZ0obq0WSZbD4PmfNuNw6syvK1FRkTzncBo88f1GthxLICzAmzF9GxPq7211LBHXVL093PSMef2X/0DsVmvzSL6y2Wy8eW8tAn08WX84nokrNfnflVhWVA4ePEj//v0pX748fn5+VKxYkVdeeYXMzEyrIkkeeWvWDv7YcRJvTztfP9iQssUDrI4k4tpavwgVb4HsNPihB6TprJDCLCrEj+fvMJcNeW/OTo7Fa/K/y7GsqOzcuROn08lXX33Ftm3b+PDDDxk5ciQvvPCCVZEkD4xbfpBvlx0A4IOudWlYNsziRCJuwO4Bnb+B0DJw7iBMGwBOnRVSmPVoWpZGZYuRkungpelbMDT53yXZDBf62xk+fDhffvkl+/fvz/VjEhMTCQkJISEhgeDg4HxMJ1cyf8dJHh6/FqcBz91RlcdaVbI6koh7ObEJvrkdstOh5RBoPdTqRJKP9sYlc9fHS8h0OPn4/np0rFfK6kgFKref3y41RiUhIYGwsMv/DzwjI4PExMQLLmK9rccS+M/3G3Aa0K1RDANbVrQ6koj7iaoL7T8yry9+B3bNsTSO5K9KkYE8fov5H7o3Zu4gIU2nqF+MyxSVvXv38umnn/LII49c9n7Dhg0jJCQk5xITE1NACeVSjsen0W/sGlIzHdxYKZw3762l05BFrlW97tD4YfP6tAFwZp+1eSRfPdKyAhUiAjidnMF7c3ZaHccl5XlRGTJkCDab7bKXnTsvfDOOHTvGHXfcQZcuXXj44Ycv+/xDhw4lISEh53LkyJG83gS5CknpWfQbu4a4pAyqlAjki54N8PJwmf4r4p7avg0xTSEjAX7oCZkpVieSfOLj6cFb95jT63+3+jDrD2sg9T/l+RiVU6dOcebMmcvep0KFCnh7m6erHj9+nFatWnHDDTcwduxY7Par+5DTGBXrZDuc9B+3lsW7TxEe6MOMQc0pXczf6lgihUPiCRjVEpJPQq3O5mBb7akstJ6Zsomf1h+lWskgfv3PjUXiP3y5/fz2zOsXjoiIICIiIlf3PXbsGK1bt6Zhw4aMGTPmqkuKWMcwDF75ZRuLd5/C18vON70bqaSI5KXgKOgyFsZ1gK0/QalG0Owxq1NJPnmxXXXm7zzJztgkxiw7wICbNc7vL5Y1g2PHjtGqVSvKlCnDiBEjOHXqFLGxscTGxloVSa7C6CUHmLTqMDYbfHx/ferGhFodSaTwKdvcPAwE8PtLcHCptXkk34QFePPCndUB+HDeHo6eS7U4keuwrKjMmzePvXv3Mn/+fEqXLk1UVFTORVzb7C0neHv2DgBevKs6bWuWtDiRSCHWZADU6QaGw1y8MOGY1Ykkn3RpVJom5cNIy3Lwys/bNLfKeZYVlT59+mAYxkUv4ro2HD7HUz9sxDDgwWZl6X9jeasjiRRuNpt5ynKJ2pByCn7sDdkZVqeSfGCz2Xj73lp4ediYvzOOudt0hAFc6PRkcX1Hzqby8Pi1ZGQ7aV01gpfb19BpyCIFwdsfuk0A3xA4ugbmDLE6keSTSpFBPHJ+fMqrv2wnOSPb4kTWU1GRXElIy6Lv2DWcTs6kRlQwnz3QAM8iMCpdxGWElTfP/MEGa7+F9ROsTiT55PFbKlG2uD+xiem8//suq+NYTp80ckWZ2U4GTlzH3rhkSgb78m2fxgT45PkJYyJyJZVvg9bn10Ob9QwcW29tHskXvl4evNGxFmCun7blaILFiayloiKXZRgGL07fwvJ9Zwjw9uDbPo0pGeJrdSyRouumZ6HKneDIgCkPQsrl560S93RzlQg61I3GacAL07fgcBbd8ZsqKnJZny/cy4/rjmK3wWcPNKBGtCbVE7GU3Q6dvoKwipBwBKb2BYfGMRRG/9e+OkG+nmw5lsB3qw9bHccyKipyST9vPMaI33cD8FrHWrSuFmlxIhEBzEG13SaClz8cWAwL3rA6keSDyCBfnr29KgDD5+zkTHLRPNtLRUUuau3Bswz+cTMAD91Ynl43lLU4kYhcoEQN6PiZeX3ZR7D9Z0vjSP7o0bQMNaKCSUzP5t0iumihior8y8HTKTw8fi2ZDidta5bghbuqWx1JRC6mVmdo9rh5fcZjcEpniBQ2nh523rinJgBT1h5l3aGit2ihiopc4FxKJn3HruFcahZ1S4fwUbf62O2aK0XEZbV5DcrdBJnJMLkHpCdanUjyWMOyYXRpWBqA/5uxtcgNrFVRkRwZ2Q4embCOA6dTKBXqx9e9G+Hn7WF1LBG5HA9PuG8MBJeCM3tgxkDQDN+FzpA7qxHs68n2E4lMWnXI6jgFSkVFAPM05Oembmb1wbME+Xgypm9jIoN0GrKIWwiMgK7jwcMbds6EpR9anUjyWPFAHwbfUQ2A4XN3cboIDaxVUREAPvxjDz9vPI6n3caXPRtSpUSQ1ZFE5GqUbgR3DTevL3gD9i2wNo/kuQealKFWqWCS0rN5Z3bRGViroiL8tO4on8zfA8Bb99bixsrhFicSkWvSsA/U7wWGE6b2h3NF6xBBYedht+XMWDt13VHWHjxrcaKCoaJSxK3Yd4Yh08zTkB9rVZFujctYnEhErstdIyC6PqSdhSm9ICvN6kSSh+qXKcb9jWMAeGnGVrIdTosT5T8VlSJsb1wyj0xYS5bDoH2dqJyJhUTEjXn5QtcJ4F8cTmwy1wTS4NpC5bk7qhHq78XO2CQmrCz8e81UVIqoM8kZ9B27msT0bBqWLcaILnV1GrJIYREaY54JZLPDxknmastSaIQFePNcW3Ng7Qe/7yYuKd3iRPlLRaUISs9y8ND4tRw5m0aZMH9G9WqIr5dOQxYpVCq0hDavmtdnPw9HVlsaR/JWt8Yx1C0dQlJGNu/8VrgH1qqoFDFOp8EzUzax4XA8IX5ejOnbmOKBPlbHEpH80PwJqNERnFnmSstJJ61OJHnEw27j9Y61sNlg2oZjrCnEA2tVVIqY4b/vYtaWE3h52PiqV0MqRgRaHUlE8ovNBh0/h4hqkHQCfuwDjiyrU0keqRsTmjOw9tVfthXaGWtVVIqQ71cf5stF+wB4t3MdbqhQ3OJEIpLvfILMlZa9g+Dwcpj3stWJJA89e3tVgnw92XY8kSlrj1gdJ1+oqBQRS/ac4qUZWwF48tbKdGpQ2uJEIlJgwivDvSPN6yu/gM0/WptH8kzxQB+evq0KYM5Ym5Ba+PaYqagUAbtik3hs4nocToN765fiqTaVrY4kIgWtenu46Vnz+i//gdit1uaRPNPzhrJUjgzkbEomH/6x2+o4eU5FpZCLS0yn39g1JGVk06R8GO90ro3NptOQRYqk1i9AxVshOw1+6Alp56xOJHnAy8POKx1qAjBh5SF2n0yyOFHeUlEpxFIzs3lo/FqOxadRITyAUb0a4uOp05BFiiy7B3QeDaFl4NwBmDYAnIV/ZtOi4MbK4bStWQKH0+C1X7dhFKJJ/lRUCimH0+DJyRvZfDSBsABvxvRtTKi/t9WxRMRq/mHm4FpPX9jzOyx+1+pEkkdealcDb087y/aeYe62wnMquopKIfX2bzuYt/0k3p52RvVqSNniAVZHEhFXEVUX2n9kXl/8DuyaY2kcyRsxYf48cnMFAN6ctZ30LIfFifKGikohNH7FQb5ZegCA97vUpVG5MIsTiYjLqdcdGj9sXp82AM7sszaP5ImBrSoSFeLL0XNpjPpzv9Vx8oSKSiGzcGccr/6yDYDBbavSoW60xYlExGW1fRtimkJGAkx+ADIK1yDMosjf25MX7qoOwBeL9nI83v1Xz1ZRKUS2HU/g8e/W4zSga6PSPNaqotWRRMSVeXpD1/EQFAWndsL0RzW4thBoXyeKJuXDSM9y8vZvO6yOc91UVAqJY/Fp9B2zhpRMBy0qFeete3UasojkQlBJc3CthzfsnAl/vmd1IrlONpuNVzrUwG6DmZtPsGr/GasjXReXKCoZGRnUq1cPm83Gxo0brY7jdhLSsug7ZjVxSRlULRHElz0b4uXhEm+tiLiD0o2g/Yfm9UXDYOcsa/PIdasZHUL3JmUAeOWXbWQ73HdPmUt8mj333HNER2ssxbXIzHby6IR17D6ZTIlgH8b0bUywr5fVsUTE3dTvCU0eMa9PGwBxO63NI9ftmdurEuLnxc7YJL5f477rAFleVGbPns3vv//OiBEjrI7idgzD4PmfNrNi/xkCvD34tk9jokP9rI4lIu6q7VtQ7ibITIbJ3SEt3upEch3CArxz1gH64PddJKS55zpAlhaVkydP8vDDDzNhwgT8/f1z9ZiMjAwSExMvuBRVH8zbzfQNx/Cw2/iiZ0NqRodYHUlE3JmHF3QZCyFl4Ox++Kk/OAvHXBxFVY+mZagcGci51Cw+nb/H6jjXxLKiYhgGffr04dFHH6VRo0a5ftywYcMICQnJucTExORjStc1efVhPl2wF4C3761FyyoRFicSkUIhIBzunwiefrD3D1jwhtWJ5Dp4eth5sZ15uvK4FQc5cDrF4kRXL8+LypAhQ7DZbJe97Ny5k08//ZSkpCSGDh16Vc8/dOhQEhISci5HjrjvcbdrtWhXHC/OMFc+feKWSnRrXMbiRCJSqETVhY6fmdeXfghbf7I2j1yXVlUjaVU1giyH4ZanK9uMPF656NSpU5w5c/lToSpUqEDXrl359ddfLziF1uFw4OHhQY8ePRg3blyuXi8xMZGQkBASEhIIDg6+ruzuYOuxBLp9tYKUTAedGpTi/S51dRqyiOSPeS/Dso/NvSsPzYOSta1OJNdob1wSbT9agsNp8N1DTWleKdzqSLn+/M7zopJbhw8fvmB8yfHjx2nbti1Tp06ladOmlC5dOlfPU5SKyrH4NO79fBlxSRm0qFScMX2a4O1p+XhoESmsnA6Y1AX2zTfHrQxYBAHFrU4l1+iVn7cybsUhqpUMYtYTN+Fht/Y/ubn9/LbsU65MmTLUqlUr51KlijkyuWLFirkuKUVJQloWfb69cK4UlRQRyVd2D7jvGyhWHhIOw4+9wZFtdSq5Rk+1qUKwryc7Y5P4ca37DJvQJ50byMh28MiEteyJ01wpIlLA/IpB9+/BOxAOLoHfX7I6kVyjYgHePNnG3Ckw4vddJKW7x+nKLlNUypUrh2EY1KtXz+ooLsUwDJ6fupmV+88S6OPJmD5NNFeKiBSsyOpw70jz+qovYeN31uaRa9brhrKUDw/gdHImXyxyjxWzXaaoyMW9//tuZmw8bs6V0qMBNaIL9zgcEXFR1TtAy+fN678+BUfXWRpHro23p50Xz6+u/M2SAxw5m2pxoitTUXFh368+zGcLzblSht1bm5s1V4qIWKnlEKh6Fzgy4IeekHTS6kRyDW6tHkmLSsXJdDh5Z7brL5WgouKiFu6K46W/5kq5tTJdGxfNie1ExIXY7XDvVxBeFZKOww89ICvd6lRylWw2Gy+1M1dXnrXlBKsPnLU60mWpqLigzUfjGTRpPQ6nQecGpflvm8pWRxIRMfkGm4NrfUPh6Br49UmwZpYLuQ7Vo4JzJgt9Y+Z2nE7XfQ9VVFzMwdMp9B2zhtRMBzdWCmdYp9qa0E1EXEvxitB1HNg8YPNkc1I4cTvP3F6FQB9PthxLYNqGY1bHuSQVFRdyOjmD3mNWcyYlk5rRwYzspblSRMRFVWgFd75rXv/jVdg1x8o0cg3CA314/JZKAAyfu5OUDNecI0efgi4iJSObvmPWcOhMKjFhfozp25hAH0+rY4mIXFrjh6BRP8AwV1o+ud3qRHKV+rYoR5kwf04mZvDVYtc8XVlFxQVkOZwMnLSeLccSCAvwZny/pkQG+VodS0Tk8mw2uPM9KHcTZCbD9/dDyuXXehPX4uPpwdA7qwEwasl+TiSkWZzo31RULGYYBs//tJk/d5/Cz8uDb/s0pnx4gNWxRERyx8MLuo6HYuUg/hBMeRCyM61OJVfhjlolaVyuGOlZTt7/fbfVcf5FRcVi783dxbT1x3ImdKsXE2p1JBGRq+MfBt0ng3cQHFoKvz2rM4HciM1m44Xzk8D9tP4o244nWJzoQioqFhq77ABfnp/C+J1OtWldLdLiRCIi1yiyurmAITZYPw5Wj7I6kVyF+mWK0aFuNIYBb/+2A8OFiqaKikVmbT7BazPNgWfP3l6FLo00oZuIuLkqbeG2183rc4bCvgXW5pGr8lzbqnh72Fm29wyLdp2yOk4OFRULrNh3hv/+sBHDMBeIGtS6ktWRRETyRvP/QN0HwHDAj33g9F6rE0kuxYT507dFOQDe+m0H2Q6ntYHOU1EpYDtjExkwYS2ZDid31CzJq3fX1IRuIlJ42GzQ4SMo3QTSE+D7bpB2zupUkkuPta5EMX8v9sYl88PaI1bHAVRUCtSx+DR6f7uapPRsGpcrxkf318PDrpIiIoWMpw90mwjBpeHMXpjaDxyuOZmYXCjEz4snbzWXbflw3m6SXWASOBWVAhKfmknvb1dzMjGDKiUCGf1gY3y9PKyOJSKSP4JKQPfvwMvfHKsy53mdCeQmHmhalvLhAZxOzmTkIusngVNRKQCpmdn0H7eWvXHJlAz2ZWzfJoT4e1kdS0Qkf0XVhU6jABusGQ2rvrI6keSCt6ed5+8wJ4H72gUmgVNRyWdZDiePTVrPukPnCPb1ZFy/JkSH+lkdS0SkYFTvALe9Zl6fO1RrArmJtjVL0KRcGBnZTobP3WVpFhWVfOR0Gjz74yYW7TqFr5edMX0bU7VkkNWxREQKVvMnoMGDYDjN8SonNludSK7AZrPxYjtzErjpG46x9Zh1k8CpqOQTwzB4feZ2ft54HE+7jS97NqRh2TCrY4mIFDybDdp9AOVbQlYKfNcNEk9YnUquoG5MKB3rmZPAjVl20LIcKir55NMFexm7/CAA73etS+uqmnVWRIqwv9YECq8CScfN05YzU6xOJVcwuG1VXm5fg2GdaluWQUUlH0xYeYgP5pkLO73aoQYd65WyOJGIiAvwC4UHpoB/cTixCX56GJwOq1PJZZQu5k+/G8vj7WldXVBRyWO/bjrOyz9vBeCJWyvTp0V5ixOJiLiQsPJw//fg4QO7ZsEfr1idSFycikoeWrz7FE9P+d/U+P9tU9nqSCIirqdMU7jnC/P68k9h7Rhr84hLU1HJI+sPn+PRCevIchi0rxPFa5oaX0Tk0mrfB61eMK/Pegb2LbQ2j7gsFZU8sPtkEv3GriEty8FNlcP5oGs97JoaX0Tk8lo+B3W6mQsYTukNcTutTiQuSEXlOh09l8qD36wmPjWLejGhfNWroaWDjkRE3IbNBnd/CmWaQUYCfNcFkuOsTiUuRp+o1+FUUgYPfrOa2MR0KkcGMqZPY/y9Pa2OJSLiPjx9oNskKFYe4g/Dd1112rJcQEXlGsWnZtLrm1XsP51CqVA/xvdvQrEAb6tjiYi4n4Di0PMn8AuD4xvgx75abVlyqKhcg+SMbHqPWcPO2CQignyY9FBTokK0fo+IyDUrXhEe+AE8fWHPXPjtGa22LIALFJVZs2bRtGlT/Pz8KFasGPfcc4/VkS4rPcvBQ+PWsOlIPKH+Xkzs35Ry4QFWxxIRcX8xTaDzaMAG68bCkvetTiQuwNKi8tNPP9GrVy/69u3Lpk2bWLZsGQ888ICVkS4rM9vJwInrWLn/LIE+nozv10SLDIqI5KXqHeDO98zrC96ATZOtzSOWs2zkZ3Z2Nk8++STDhw+nf//+ObfXqFHDqkiXle1w8t8fNrLw/ErI3/ZpTJ3SoVbHEhEpfJoOgITD5mRwPw+CoJJQoZXVqcQilu1RWb9+PceOHcNut1O/fn2ioqK488472bp162Ufl5GRQWJi4gWX/OZ0GgyZtoVZW07g5WHjq16NaFJeKyGLiOSbNq9DzU7gzIYfekHs5T8bpPCyrKjs378fgFdffZWXXnqJmTNnUqxYMVq1asXZs2cv+bhhw4YREhKSc4mJicnXnIZh8PrM7UxddxQPu41Pu9enZZWIfH1NEZEiz26He0dC2RaQkQiTukDCMatTiQXyvKgMGTIEm8122cvOnTtxOp0AvPjii3Tu3JmGDRsyZswYbDYbP/744yWff+jQoSQkJORcjhw5ktebcIH3f9/N2OUHARh+Xx3uqBWVr68nIiLnefrA/ZMgvCokHYdJ90F6gtWppIDl+RiVZ555hj59+lz2PhUqVODEiRPAhWNSfHx8qFChAocPH77kY318fPDx8cmTrFfy5aJ9fLZwLwBvdKxJpwalC+R1RUTkPL9i0HMqjG4Dcdvhh57QY6pZYqRIyPOiEhERQUTElQ+NNGzYEB8fH3bt2sWNN94IQFZWFgcPHqRs2bJ5HeuqTVhxkHfnmOtODLmzGr2albM2kIhIURVaBnr8CGPuggN/wrQBcN+3YPewOpkUAMvGqAQHB/Poo4/yyiuv8Pvvv7Nr1y4GDhwIQJcuXayKleNUciYA/7mlEo+2rGhxGhGRIi6qLnSbCHYv2D4DZj+nCeGKCEsXphk+fDienp706tWLtLQ0mjZtyoIFCyhWrJiVsQB4+rYq3FA+jGYVi1sdRUREACq2hk6jYGo/WDMaAiKh1fNWp5J8ZjMM966kiYmJhISEkJCQQHBwsNVxREQkv63+Gn571rze7n1o/JC1eeSa5Pbz2/Ip9EVERK5Kk4eh5fk9KbOehW3Trc0j+UpFRURE3E+rodCoH2CYg2v3L7I6keQTFRUREXE/NhvcNQJqdARHJkzuAcc3WJ1K8oGKioiIuCe7B3T6GsrfDJnJMPE+OL3X6lSSx1RURETEfXn6QLdJ5unLqadhwr2QeMLqVJKHVFRERMS9+QZDj58grIK56vKEeyHljNWpJI+oqIiIiPsLjIBe0yEoCk7tgImdtC5QIaGiIiIihUOxcvDgz+BfHE5shO+6QWaK1ankOqmoiIhI4RFR1dyz4hMCh1eYZwNlZ1idSq6DioqIiBQuUXXNFZe9AmD/QnPKfUeW1ankGqmoiIhI4RPTBLp/Bx4+sHMmzHgMnE6rU8k1UFEREZHCqUIr6DoO7J6wZQrMelorLrshFRURESm8qt4J934F2GDdGPj9JZUVN6OiIiIihVvt++DuT8zrKz6DRcOszSNXRUVFREQKvwYPwh3vmNcXvwuL37M2j+SaioqIiBQNNwyENq+Z1xe+BX+OsDaP5IqKioiIFB03PgW3vmJeX/AGLPnA0jhyZSoqIiJStNz0NNzyknl9/muw7GNr88hlqaiIiEjRc/NgaP2ieX3ey7D8M2vzyCWpqIiISNHU8jloOcS8/vuLsOILa/PIRamoiIhI0dVqCNz8nHl97lBYOdLaPPIvKioiIlJ02WzQ+gW46Rnz6znPw8ovrc0kF1BRERGRos1mg1v+D278r/n1nCGw9ENrM0kOFRURERGbzTxt+a8xK3+8Cove0XT7LkBFRUREBM4fBhr6v3lWFg0zC4vKiqVUVERERP7upqeh7fn1gJZ9ZB4KUlmxjIqKiIjIPzV7DNq9b15fNRJm/hecTmszFVEqKiIiIhfT+CHo+Dlgg3Vj4OdB4HRYnarIUVERERG5lPo9ofNosHnApu9gaj/IzrA6VZGioiIiInI5te+DLmPB7gXbZ8B33SAj2epURYalRWX37t107NiR8PBwgoODufHGG1m4cKGVkURERP6txt3QYwp4BcD+hTC+I6SetTpVkWBpUWnfvj3Z2dksWLCAdevWUbduXdq3b09sbKyVsURERP6t4i3Q+xfwKwbH1sKYOyHxuNWpCj3Lisrp06fZs2cPQ4YMoU6dOlSuXJl33nmH1NRUtm7dalUsERGRSyvdCPrOgaBoOLUTvmkLp/danapQs6yoFC9enKpVqzJ+/HhSUlLIzs7mq6++IjIykoYNG17ycRkZGSQmJl5wERERKTCR1aD/XAirCAmH4du2cHyj1akKLcuKis1m448//mDDhg0EBQXh6+vLBx98wJw5cyhWrNglHzds2DBCQkJyLjExMQWYWkREBAgtA/3mQsk6kHoaxraH/YutTlUo5XlRGTJkCDab7bKXnTt3YhgGgwYNIjIykiVLlrB69WruueceOnTowIkTJy75/EOHDiUhISHncuTIkbzeBBERkSsLjIA+s6DsjZCZBBM7w6YfrE5V6NgMI2/nBT516hRnzpy57H0qVKjAkiVLuP322zl37hzBwcE536tcuTL9+/dnyJAhuXq9xMREQkJCSEhIuOB5RERECkRWOsx4FLZNN7++9WW48Wlz7SC5pNx+fnvm9QtHREQQERFxxfulpqYCYLdfuFPHbrfj1DTFIiLiLrx8ofO3EFwKVnwG81+H+CNw1wjwyPOP2SLHsjEqzZo1o1ixYvTu3ZtNmzaxe/duBg8ezIEDB2jXrp1VsURERK6e3Q5t34I73yNnyv3JD2hiuDxgWVEJDw9nzpw5JCcnc8stt9CoUSOWLl3Kzz//TN26da2KJSIicu2aPgLdJoKnL+yZC2PbQXKc1ancWp6PUSloGqMiIiIu58ga+L4bpJ4xzxB6YApEVrc6lUvJ7ee31voRERHJazGNof88CKsA8Yfhm9thzzyrU7klFRUREZH8ULwiPDTfPH05IxG+6worPgf3PpBR4FRURERE8ot/GPSaDg0eBMMJc1+AX5+A7Eyrk7kNFRUREZH85OkNHT6BtsPAZof142HCvZBy+TnHxKSiIiIikt9sNmj2mDmo1jsIDi2F0bdA3A6rk7k8FRUREZGCUvk2eGgehJaFcwfh61v/N6OtXJSKioiISEGKrA4PL4TyN0NWCvzYB37/P3BkW53MJamoiIiIFLSA4tBzOjR/wvx6+Scw8V5IOW1tLhekoiIiImIFD0+4/Q3oMha8AuDAn/BVSzi23upkLkVFRURExEo174WH50NYRUg8Ct/eAevGab6V81RURERErBZZHQYshKp3gSPDnGtl2gDISLI6meVUVERERFyBbwh0mwS3vgI2D9gyBUa1gtgtViezlIqKiIiIq7Db4aanoc8sCC4FZ/aapzCv+abIHgpSUREREXE1ZZvBo0uhyh3moaBZT8PUvpCeYHWyAqeiIiIi4or8w6D7ZLj9LbB7mhPDfXUzHFltdbICpaIiIiLiqmw2aP449JsLIWXM2Wy/bQsL3gRHltXpCoSKioiIiKsr3QgGLoU63cxVmP8cDqPbwKndVifLdyoqIiIi7sA3BDqNgvvGgG8onNhoHgpa/XWhHmiroiIiIuJOanWCx1ZAhdaQnQa/PQsTO0P8EauT5QsVFREREXcTHA09p8Ed74KHD+ybD1/cYJ7G7HRanS5PqaiIiIi4I7sdbnjUPI05pilkJpunMY/rAGf2WZ0uz6ioiIiIuLOIKtB3trl3xcsfDi2FL1vA8s/A6bA63XVTUREREXF3dg9z78rA5VD+ZnPsyu8vmmcGHd9gdbrroqIiIiJSWISVhwd/gQ6fgE8wHF8PX98Cs56FtHir010TFRUREZHCxGaDhr3h8TVQu4s578qar+GzRrDpB7c7lVlFRUREpDAKKgmdR5t7WIpXhpRTMH0AjG0PJ7dbnS7XVFREREQKswotzbErt74Mnn7mYNuRLWDmfyH5lNXprkhFRUREpLDz9IabnoFBq6B6B/Nw0Npv4ZP6sPRDyEq3OuElqaiIiIgUFcXKQreJ0Oc3iKoHmUnwx6vwWWPY+pNLjl9RURERESlqyrWAhxfCvV9BUDQkHIap/eDr1rDnD5cqLPlWVN566y2aN2+Ov78/oaGhF73P4cOHadeuHf7+/kRGRjJ48GCys7PzK5KIiIj8xW6HuvfDf9ZB6xfBK8Ccc2VSZxhzJxxcanVCIB+LSmZmJl26dGHgwIEX/b7D4aBdu3ZkZmayfPlyxo0bx9ixY3n55ZfzK5KIiIj8k7c/tHwOntoMzR4HT184vALGtoPxHeHoWkvj2Qwjf/fvjB07lqeeeor4+PgLbp89ezbt27fn+PHjlChRAoCRI0fy/PPPc+rUKby9vXP1/ImJiYSEhJCQkEBwcHBexxcRESlaEo/Dkvdh3ThwZpm3Nf8P3P5m3r5MLj+/LRujsmLFCmrXrp1TUgDatm1LYmIi27Ztu+TjMjIySExMvOAiIiIieSQ4Gtq9bx4Sqt8TbB5QtoVlcSwrKrGxsReUFCDn69jY2Es+btiwYYSEhORcYmJi8jWniIhIkVSsLHT8HJ5YD1XusCzGVRWVIUOGYLPZLnvZuXNnfmUFYOjQoSQkJORcjhw5kq+vJyIiUqQVK2dOy28Rz6u58zPPPEOfPn0ue58KFSrk6rlKlizJ6tWrL7jt5MmTOd+7FB8fH3x8fHL1GiIiIuLerqqoREREEBERkScv3KxZM9566y3i4uKIjIwEYN68eQQHB1OjRo08eQ0RERFxb1dVVK7G4cOHOXv2LIcPH8bhcLBx40YAKlWqRGBgILfffjs1atSgV69evPfee8TGxvLSSy8xaNAg7TERERERIB9PT+7Tpw/jxo371+0LFy6kVatWABw6dIiBAweyaNEiAgIC6N27N++88w6enrnvTzo9WURExP3k9vM73+dRyW8qKiIiIu7H5edREREREbkSFRURERFxWSoqIiIi4rJUVERERMRlqaiIiIiIy1JREREREZeloiIiIiIuS0VFREREXFa+TaFfUP6ary4xMdHiJCIiIpJbf31uX2neWbcvKklJSQDExMRYnERERESuVlJSEiEhIZf8vttPoe90Ojl+/DhBQUHYbLY8fe7ExERiYmI4cuRIoZyeX9vn/gr7Nmr73F9h30Zt37UzDIOkpCSio6Ox2y89EsXt96jY7XZKly6dr68RHBxcKP8B/kXb5/4K+zZq+9xfYd9Gbd+1udyelL9oMK2IiIi4LBUVERERcVkqKpfh4+PDK6+8go+Pj9VR8oW2z/0V9m3U9rm/wr6N2r785/aDaUVERKTw0h4VERERcVkqKiIiIuKyVFRERETEZamoiIiIiMtSUfmbt956i+bNm+Pv709oaGiuHmMYBi+//DJRUVH4+fnRpk0b9uzZk79Br8PZs2fp0aMHwcHBhIaG0r9/f5KTky/7mFatWmGz2S64PProowWU+PI+//xzypUrh6+vL02bNmX16tWXvf+PP/5ItWrV8PX1pXbt2vz2228FlPTaXc02jh079l/vla+vbwGmvTp//vknHTp0IDo6GpvNxowZM674mEWLFtGgQQN8fHyoVKkSY8eOzfec1+pqt2/RokX/ev9sNhuxsbEFE/gqDRs2jMaNGxMUFERkZCT33HMPu3btuuLj3OXn8Fq2z91+Br/88kvq1KmTM6Fbs2bNmD179mUfU9Dvn4rK32RmZtKlSxcGDhyY68e89957fPLJJ4wcOZJVq1YREBBA27ZtSU9Pz8ek165Hjx5s27aNefPmMXPmTP78808GDBhwxcc9/PDDnDhxIufy3nvvFUDay/vhhx94+umneeWVV1i/fj1169albdu2xMXFXfT+y5cvp3v37vTv358NGzZwzz33cM8997B169YCTp57V7uNYM4g+ff36tChQwWY+OqkpKRQt25dPv/881zd/8CBA7Rr147WrVuzceNGnnrqKR566CHmzp2bz0mvzdVu31927dp1wXsYGRmZTwmvz+LFixk0aBArV65k3rx5ZGVlcfvtt5OSknLJx7jTz+G1bB+4189g6dKleeedd1i3bh1r167llltuoWPHjmzbtu2i97fk/TPkX8aMGWOEhIRc8X5Op9MoWbKkMXz48Jzb4uPjDR8fH+P777/Px4TXZvv27QZgrFmzJue22bNnGzabzTh27NglH9eyZUvjySefLICEV6dJkybGoEGDcr52OBxGdHS0MWzYsIvev2vXrka7du0uuK1p06bGI488kq85r8fVbmNu/+26IsCYPn36Ze/z3HPPGTVr1rzgtm7duhlt27bNx2R5Izfbt3DhQgMwzp07VyCZ8lpcXJwBGIsXL77kfdzx5/Avudk+d/4Z/EuxYsWM0aNHX/R7Vrx/2qNyHQ4cOEBsbCxt2rTJuS0kJISmTZuyYsUKC5Nd3IoVKwgNDaVRo0Y5t7Vp0wa73c6qVasu+9hJkyYRHh5OrVq1GDp0KKmpqfkd97IyMzNZt27dBX/3drudNm3aXPLvfsWKFRfcH6Bt27Yu+V7BtW0jQHJyMmXLliUmJuay/zNyR+72Hl6revXqERUVxW233cayZcusjpNrCQkJAISFhV3yPu78HuZm+8B9fwYdDgeTJ08mJSWFZs2aXfQ+Vrx/br8ooZX+Om5cokSJC24vUaKESx5Tjo2N/dcuZE9PT8LCwi6b94EHHqBs2bJER0ezefNmnn/+eXbt2sW0adPyO/IlnT59GofDcdG/+507d170MbGxsW7zXsG1bWPVqlX59ttvqVOnDgkJCYwYMYLmzZuzbdu2fF+8syBc6j1MTEwkLS0NPz8/i5LljaioKEaOHEmjRo3IyMhg9OjRtGrVilWrVtGgQQOr412W0+nkqaeeokWLFtSqVeuS93O3n8O/5Hb73PFncMuWLTRr1oz09HQCAwOZPn06NWrUuOh9rXj/Cn1RGTJkCO++++5l77Njxw6qVatWQInyXm638Vr9fQxL7dq1iYqK4tZbb2Xfvn1UrFjxmp9X8l6zZs0u+J9Q8+bNqV69Ol999RVvvPGGhckkN6pWrUrVqlVzvm7evDn79u3jww8/ZMKECRYmu7JBgwaxdetWli5danWUfJHb7XPHn8GqVauyceNGEhISmDp1Kr1792bx4sWXLCsFrdAXlWeeeYY+ffpc9j4VKlS4pucuWbIkACdPniQqKirn9pMnT1KvXr1res5rkdttLFmy5L8GYWZnZ3P27NmcbcmNpk2bArB3717Likp4eDgeHh6cPHnygttPnjx5yW0pWbLkVd3fateyjf/k5eVF/fr12bt3b35ELHCXeg+Dg4Pdfm/KpTRp0sTlP/wff/zxnMH5V9pr4G4/h3B12/dP7vAz6O3tTaVKlQBo2LAha9as4eOPP+arr776132teP8K/RiViIgIqlWrdtmLt7f3NT13+fLlKVmyJPPnz8+5LTExkVWrVl3y+F5+yO02NmvWjPj4eNatW5fz2AULFuB0OnPKR25s3LgR4IJyVtC8vb1p2LDhBX/3TqeT+fPnX/LvvlmzZhfcH2DevHkF+l5djWvZxn9yOBxs2bLF0vcqL7nbe5gXNm7c6LLvn2EYPP7440yfPp0FCxZQvnz5Kz7Gnd7Da9m+f3LHn0Gn00lGRsZFv2fJ+5dvw3Td0KFDh4wNGzYYr732mhEYGGhs2LDB2LBhg5GUlJRzn6pVqxrTpk3L+fqdd94xQkNDjZ9//tnYvHmz0bFjR6N8+fJGWlqaFZtwRXfccYdRv359Y9WqVcbSpUuNypUrG927d8/5/tGjR42qVasaq1atMgzDMPbu3Wu8/vrrxtq1a40DBw4YP//8s1GhQgXj5ptvtmoTckyePNnw8fExxo4da2zfvt0YMGCAERoaasTGxhqGYRi9evUyhgwZknP/ZcuWGZ6ensaIESOMHTt2GK+88orh5eVlbNmyxapNuKKr3cbXXnvNmDt3rrFv3z5j3bp1xv3332/4+voa27Zts2oTLispKSnn5wwwPvjgA2PDhg3GoUOHDMMwjCFDhhi9evXKuf/+/fsNf39/Y/DgwcaOHTuMzz//3PDw8DDmzJlj1SZc1tVu34cffmjMmDHD2LNnj7FlyxbjySefNOx2u/HHH39YtQmXNXDgQCMkJMRYtGiRceLEiZxLampqzn3c+efwWrbP3X4GhwwZYixevNg4cOCAsXnzZmPIkCGGzWYzfv/9d8MwXOP9U1H5m969exvAvy4LFy7MuQ9gjBkzJudrp9Np/N///Z9RokQJw8fHx7j11luNXbt2FXz4XDpz5ozRvXt3IzAw0AgODjb69u17QRE7cODABdt8+PBh4+abbzbCwsIMHx8fo1KlSsbgwYONhIQEi7bgQp9++qlRpkwZw9vb22jSpImxcuXKnO+1bNnS6N279wX3nzJlilGlShXD29vbqFmzpjFr1qwCTnz1rmYbn3rqqZz7lihRwrjrrruM9evXW5A6d/46Hfefl7+2qXfv3kbLli3/9Zh69eoZ3t7eRoUKFS74eXQ1V7t97777rlGxYkXD19fXCAsLM1q1amUsWLDAmvC5cLFt++fvSHf+ObyW7XO3n8F+/foZZcuWNby9vY2IiAjj1ltvzSkphuEa75/NMAwj//bXiIiIiFy7Qj9GRURERNyXioqIiIi4LBUVERERcVkqKiIiIuKyVFRERETEZamoiIiIiMtSURERERGXpaIiIiIiLktFRURERFyWioqIiIi4LBUVERERcVkqKiLiUk6dOkXJkiV5++23c25bvnw53t7e/1peXkQKPy1KKCIu57fffuOee+5h+fLlVK1alXr16tGxY0c++OADq6OJSAFTURERlzRo0CD++OMPGjVqxJYtW1izZg0+Pj5WxxKRAqaiIiIuKS0tjVq1anHkyBHWrVtH7dq1rY4kIhbQGBURcUn79u3j+PHjOJ1ODh48aHUcEbGI9qiIiMvJzMykSZMm1KtXj6pVq/LRRx+xZcsWIiMjrY4mIgVMRUVEXM7gwYOZOnUqmzZtIjAwkJYtWxISEsLMmTOtjiYiBUyHfkTEpSxatIiPPvqICRMmEBwcjN1uZ8KECSxZsoQvv/zS6ngiUsC0R0VERERclvaoiIiIiMtSURERERGXpaIiIiIiLktFRURERFyWioqIiIi4LBUVERERcVkqKiIiIuKyVFRERETEZamoiIiIiMtSURERERGXpaIiIiIiLuv/AW+Nw/m5xtMSAAAAAElFTkSuQmCC\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "xs = jnp.linspace(-1, 3, 1001)\n", "plt.plot(xs, f(xs), label=\"f(x)\")\n", "plt.plot(xs, df(xs), label=\"df/dx(x)\")\n", "plt.xlabel(\"x\")\n", "plt.legend()\n", "plt.show()\n" ] }, { "cell_type": "markdown", "id": "3e9915a8-59e9-4209-bf29-bd21dcda84a3", "metadata": {}, "source": [ "Now let's use jax to compute the derivative for us and see how it compares to our analytical derivative.\n", "\n", "We first call `jax.grad(f)`, which returns a new function that can be evaluated at `x` to give the derivative `df/dx(x)`.\n", "\n", "For more details on `jax.grad` and the various other inputs it can take, refer to its documentation [here](https://jax.readthedocs.io/en/latest/_autosummary/jax.grad.html)." ] }, { "cell_type": "code", "execution_count": 4, "id": "f846ded9-26ac-4778-b637-56768b07dd6e", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAioAAAGwCAYAAACHJU4LAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy88F64QAAAACXBIWXMAAA9hAAAPYQGoP6dpAAB86UlEQVR4nO3dd3hT5fvH8XeS7k2B0paUMlrKpmwZShkKCgiKLAEplCHCVxREwK2oqKAiCgJSCgIyVAQEZAgF2XvPtlCg0FJW907O749If5bZQtuTtPfrunKRJuckn5M0zc1znqFRFEVBCCGEEMIMadUOIIQQQghxP1KoCCGEEMJsSaEihBBCCLMlhYoQQgghzJYUKkIIIYQwW1KoCCGEEMJsSaEihBBCCLNlpXaAx2U0Grly5QrOzs5oNBq14wghhBAiHxRFITk5GW9vb7Ta+7ebWHyhcuXKFXx8fNSOIYQQQohHcOnSJfR6/X3vt/hCxdnZGTAdqIuLi8pphBBCCJEfSUlJ+Pj45H6P34/FFyq3T/e4uLhIoSKEEEJYmId125DOtEIIIYQwW1KoCCGEEMJsSaEihBBCCLMlhYoQQgghzJYUKkIIIYQwW1KoCCGEEMJsSaEihBBCCLMlhYoQQgghzJYUKkIIIYQwW1KoCCGEEMJsSaEihBBCCLMlhYrIl5iYGMLDw4mJiVE7ihBCiFJEChWRl9EImSmQdhNSb0BKPKE/fI2vry9t27bF19eX0JnTwZCjdlIhhBClgEZRFEXtEI8jKSkJV1dXEhMTZfVkTC0fERER+Pv7o9frIScTEi5B4iVIiYfU+H//vQYpVyHthqkwyUox/Zudmvfxkoz4Tk3B+J/fEp0Got9wQu9qDVZ2YOcKDu5gXwbs3Uz/OnqAize46sGlIrhWBDs3uMcqmXdlFkIIUeLl9/vbqhgziaJiyIab5wj98XuGfjwDo1FBq4HZPbwIqZkGPHotGnHDmKdIATAoEHnTiN7FYCpsslMh+crDH8zGCcpWg3LV/734E7r+GEPHfozRaESr1TJ79mxCQkIeOa8QQoiSRVpULE3aTbhyyHSJPwnxp+H6WWISMu/f8lHWCdwqgVMFcPIwtXY4lTf961gObJ1NRYSN47/XHUFnAxodMVeu4Ovri9Fo/P/H1emIPnUIfYVykJMOGYmQfsuULf2W6ZJyFRIvQ1KM6d/0m3cdyj1ba7Raonf/iT6wLVjbFeUrKYQQQkXSolIS5GSaCpKY/XDlIFw+CLfO33PTiESbe7d8PL0Afceu9zzlkh96vZ7Zs2czbNgwDAYDOp2OWbNmofevW7AHyk43nYK6EQHXz8L1CCK278GoHMyb2WgkcnoP9FXtoWJD8G0Bvi3Bp6npFJMQQohSRVpUzEl2OsTsg+gdcGGH6XpOxt3buVcF74bgWQc8akH5GsQka/CtUuXulo/o6ELp9xETE0NkZCR+fn6F1o8kJibm7tYarYbocXr0Nol5N9ZooUIdqBoE/k+DzxNgZVMoOYQQQhQ/aVExY7mdR6tVQ6+7BpGbIGqzqeXEmJ13Y4dy4NPM1LpQsSF4NzB1Vr2Dvgz3bvkopKJCr9cXekfX+7bWDBoEt6Lhws5/LztMLUlxR02XndNMp6qqBoFfO/DvYOqsK4QQosRRvUXl8uXLjBs3jr/++ou0tDT8/PwICwujcePG+drf0lpUQqd/y9DXx/x/h9fOdoQ0/E/LgLOX6VRH5Zamf8tVL9Bpm6Jo+Shq+cqcFGsqWCL/Nl1Sr+W9X98EanWFms9DGd/cx5XRREIIYZ7y+/2taqFy69YtGjRoQJs2bRg+fDjly5cnIiKCatWqUa1atXw9hkUUKtcj4NSfxOz6Dd/xu+7u8PrDC+ibdoGqraFMlUfuT1JqGI0QdwQi/obIjXBpL3lGNnk3IPRcBYZO/k1GEwkhhJmyiEJl/Pjx7Nixg23btuV7n8zMTDIzM3N/TkpKwsfHx7wKFUWB2MNwajWcXg3XTgMQfj6Htj+n3bV5eHg4QUFBxZuxJEmOg1N/wsmVcGEHMYk5d48mKsT+OkIIIR5ffgsVVWemXbVqFY0bN6ZHjx54eHjQoEEDfvrppwfuM2nSJFxdXXMvPj4+xZT2IRQF4o7Bhvdhaj2YHQTbppiKFK0VVGuHf8+P0WrzvuQ6nQ4/Pz91MpcUzp7QdAgEr4YxZ4kIeO3uEVAGA5Fhr5n6vFh2/3EhhChVVG1RsbMzzZMxevRoevTowb59+xg1ahQzZ85kwIAB99zH7FpUbp6H47/Bsd9yW04AsHYAv/ZQswv4P2OasRUIDQ29q/OonJIoXPccTXR7ThkXrWmkVJMQqNfLNG+MEEKIYmcRp35sbGxo3LgxO3fuzL3t9ddfZ9++fezatStfj6FKH5W0m6bC5Ngy0xDi23S2UL0D1H0J/J4GG4d77m6JHV4tzV0F4edvExKQBMd/h+x/T7/ZOEP93tBkMHjUUDewEEKUMhYxPNnLy4tatWrlua1mzZr8/vvvKiXKK8+oEW9vOL8FDi4w9TsxZJk20mihylNQtyfU7JyvScmKYqivyCskJIQOHTrcXRA+8ykcWQz75sCNSNj3k+ni9zS0fB0qPymdmYUQwoyoWqi0bNmSM2fO5Lnt7Nmz+Pr6qpTo/4WGhjJ06NB/R41omP2SFyE1U/5/A8+6UP9lqPOiqY+EMDv3LAjt3eCJ4dDsVTi/Ffb+BGfWmkYPRW40zVPT4nXTMGedTDMkhBBqU/XUz759+2jRogUff/wxPXv2ZO/evQwZMoTZs2fTt2/ffD1GUZz6MfVxqITxPz0ydRqIHueFvtXL0LA/eNUvlOcSZuDmOdg1HQ4t/P+ZgMtUhpZvQGBfmQFXCCGKgEX0UQFYvXo1EyZMICIigipVqjB69GiGDBmS7/2LolAJDw+nbdu2d9++cR1B7TsUynMIM5R63dTCsnf2/y+i6FoJnhpjKlh01urmE0KIEsRiCpXHVXQtKvdYMVjm4SgdslLh4M+w/VvTKtBgWn36ybcg8GUpWIQQohBYxDwq5ur2GjQ6nQ6g0NfNEWbOxtHUj2XUEegwCRw9IOEi/Pk6/NAYjv1GzMWLhIeHExMTo3ZaIYQo0aRF5QFkGLEAICsNDoTB9qmQGk/owSyGrs7AqCDT8wshxCOSUz9CFLasVGJWfoZvr0l3TM+vJTr6ghSzQghRAHLqR4jCZuNIRLmn7zE9v5HIn0dB6g11cgkhRAkmhYoQBeDv73/3ek0a8Lu+Ab5vaBo1ZMhRKZ0QQpQ8UqgIUQD37Gg9aTx6/3qQkQBr3zItSHlh5wMfRwghRP5IHxUhHsFdHa0NOaYOt5s/NRUsAHVegg6fg3MFVbMKIYQ5ks60Qqgh9QZs/gQOzAcU09pPT38CDV4BrTRgCiHEbdKZVgg1OJaFLt/B0HDwCoSMRPhzFMzvDNcj1E4nhBAWRwoVIYqCdwMYvAme+QysHeDCDvixBWz9CnKy1E4nhBAWQwoVIYqKzgpajITXdoNfezBkQfhnMOspuHxQ7XRCCGERpFARoqiV8YW+v0H3UHAoB9dOwZz2EP45GLLVTieEEGZNChUhioNGA3VfghF7ofaLoBhg65fwU1u4elLtdEIIYbakUBGiODmWhR5h8NJcsC8DcUdhdmvTOkJGg9rphBDC7EihIoQa6nSH1/ZA9Y6mvit/fwhhzxJzfLesyiyEEP8hhYoQanGuAH2WQNfpYONM6Mpt+NZrTtu2bfH19SU0NFTthEIIoTqZ8E0IMxBzfDe+9ZrfsSqzjujoaFmVWQhRIsmEb0JYkIhr6fdYldlA5O516gQSQggzIYWKEGbgvqsy7xoLu6aDZTd8CiHEI5NCRQgzcM9VmYc0Q+9shPXvwLL+pun4hRCilJE+KkKYkTyrMlesCPvmwLoJYMwG96rQcwF41lE7phBCPDZZPVmIkiJmPywbAEkxYGUPnb+BwJfVTiWEEI9FOtMKUVLoG8Or20zrBeWkw4rhsOp/kJ2hdjIhhChyVmoHEELkg4M7vPwr/DMZtkyCgz/DlcPQexG4VVI7ncVIzzJwNSmDuKQMbqVmkZyZQ0pGDskZOaRm5WAwKhgVBUUBo6Kg02qwt9bhYKPD3sYKRxsd7o42lHe2pbyzLeWcbLGz1ql9WEKUaFKoCGEptFoIGmdqYfl98L/T7wdBz5+hciu105mNxPRsIuOTibqWyrlrqZy7lkL0jVTiEjNIysgp9Ocr42CNb1lHKpd1oHI5R6qUc6SGpwvVyjtipZNGayEel/RREcISJVyCJS+bihWtFTz7JTQZrHaqYpeWlcPhiwkcvZzIscuJHL+cyIUbaQ/cx8FGh6eLHWWdbHC2s8bJ1gonO1NriZVOiwbQajRoNJBjVEjPMpCWlUNaloHUzBxupmZxPSWLa8mZZBmM930eWystNbxcqO3tQn29K02rlKVyWQc0Gk0hvwpCWCbpTCtESZeVBqtGwvHfTT83GgjPfgVWNurmKkKpmTnsv3CLPedusPvcDY7GJJJz50x5gJerHdXKO1G1vCNVyzlSpbwTFd3s8HCxw9nWqlCKBUVRSErP4XJCOhdupHL+RioXrqdx7noKp2KTScm8u/XGw9mWplXcaVbFnSf9y1O5nONj5xDCUkmhIkRpoCiwYyr8/TGgQKXmpiHMTuXVTlZooq+n8vepq2w+Hc/e8zfvKky8Xe0IrORGnYqu1K3oSh1vV8o4qlusGY0KF26mceKKqaXn0MUEDl9MuKsFpmp5R9rV8KBNDQ+aVHbHWk4ViVJEChUhSpOz6039VjKTwEUPfX4Br/pqp3okiqJwNCaRtcdi2XjqKueupea5v6KbPU9ULcsTVd15ompZfNwdVEpaMBnZBg5fSmDv+ZvsjLrO/uhbeYouFzsrnq3jRZf63jSvVhadVk4RiZJNChUhSptrZ2FJH7gRCdaO8NJcCOiodqp8i4xPZtXhK6w6coXo//QzsdJqaFrFnXY1K9C2hgdVSsjpkqSMbLadvc7m0/FsORPPjdSs3PvKOdnSqa4n3RvpqVvRVfq1iBLJIguVL774ggkTJjBq1CimTp2ar32kUBHiP9IT4NcBcG4LaLTQYRI88araqe4rMS2bPw7FsGx/DCdjk3Jvt7PW0r5mBTrW8eSp6uVxsbNWMWXRMxgV9p6/yZ9Hr/DXsVhupWXn3lfb24U+TSvRNdAb5xL+OojSxeIKlX379tGzZ09cXFxo06aNFCpCPCpDNqwZbZprBaDpMOg4CbTmMd+Hoijsv3CLxXsusuZYLJk5pn4bVloNrauX5/lAb9rXrICjbemcPSHbYGR75HX+OHiZdSfiyPr39bG31vF8fW8GtapCgKezyimFeHwWVaikpKTQsGFDZsyYwaeffkpgYOB9C5XMzEwyMzNzf05KSsLHx0cKFSH+S1Fgx3fw94emn6t3JKbZJ0RcvIK/vz96vb7YI6VnGVh+KIZ5O6KJiE/Jvb2GpzN9mlbi+freqneCNTe3UrNYfugyi/deJPI/r9mT/uUY8mRVnvQvJ6eFhMWyqEJlwIABuLu78+233xIUFPTAQuWjjz7i448/vut2KVSEuIcTK+CPYYTuTWLo6gyMCmi1WmbPnk1ISEixRIhPyuDnXRdYtOdC7ikNBxsdXep506dZJerrpQ/Gw9xuhZq3I5q/jsdyuw9uQAVnXg2qSpd63jK5nLA4FlOoLFmyhM8++4x9+/ZhZ2f30EJFWlSEKJiYfWvwbdaZ/47q1el0REdHF2nLSmR8Cj9uiWLVkctkG0xP7uNuz6CWVXipkV76WzyiSzfTCNsRzdJ9F0nNMgBQtZwj/2vnJwWLsCj5LVRUPQl86dIlRo0axcaNG7Gzs8vXPra2ttja2hZxMiFKjogUB+6cE81gMBAZGVkkhcrZq8l8vzmS1UevcPu/QU0qlyGkVVWerlVBht0+Jh93Bz7oUotR7f1ZuPsCc7ad49z1VN5ceoRpmyJ5vZ0fz9evKK+zKDFUbVFZsWIFL7zwAjrd/3fyMxgMaDQatFotmZmZee67F+lMK8SDxcTE4Ovri9H4/5ON6TQQvXke+qABhfY8p2KT+H5zBGuPxeXe9kytCrzWxo9AH7dCex6RV0pmDj/viuanf87lnlqr6eXCO8/V4En/kjPxnyh5LOLUT3JyMhcuXMhz28CBA6lRowbjxo2jTp06D30MKVSEeLjQ0FCGDRuGwWBAp9Uwq5MtIY3soPO30Cj4sR77/PVUpqw/w5pjsbm3PVvHk5Ft/ajt7fqYyUV+3S5YftwSRfK/iy8+6V+Od56rSU0v+dsozI9FFCr38rA+KneSQkWI/ImJiSEyMhK/KpXRH54Mhxaa7gh6B1q/DQXs0HotOZNpmyJYvPciOUYFjQY61fXif239Zfisim6lZvH95kgW7I4m22B6X3o38WFshxq4y6gqYUYsoo+KEKL46PX6/++TUukHcPaCfybDls8hJQ6em5KvuVZSMnP46Z9z/LTtHGn/duZsE1Cecc/WoIan/GdBbWUcbfigSy0GtPBl8vozrD4ay+K9l/jreBxvd6hB7yY+aKX/irAgZteiUlDSoiLEY9j7E6wdCyhQqyu8OOe+qy8bjQrLD13mi79Ocz3FNPKuvo8b4zvWoHm1ssUYWhTEvuibvL/iOKfjkgGor3dlYrc61NO7qRtMlHoWe+qnoKRQEeIxnVgBy4eAIQv82ptWX7bJu9Df0ZgEPlx1gkMXEwCoXNaBtzvW4Nk6njIHigXIMRhZsPsC32w4S3JmDhoNvPKEL293rFFqZwAW6pNCRQiRf5GbYElfyEmHSi3g5aVg58KNlEwmrz/D0v2XUBRwtNHxejt/Brasgo2VzNdhaeKTMpj012n+OHQZAH0Ze77sXo+WfuVUTiZKIylUhBAFc2EX/NITMpNQvBvwa43v+HRzHEn/jiB5oUFFxj9bgwou+ZvzSJiv7RHXGff7US4npAPQp2klJjxXo8Qv/ijMixQqQoiCu3IYw88voMu4yVljRfplvUM5L18+6VqbxpXd1U4nClFKZg5frTvNz7tMU0R4udrxZfd6PFVd5l4RxSO/39/SdiuEACAzx8DUkw50Tn6XOKUM1bWX+bvMJP7sp5cipQRysrXik651WDL0CXzLOhCbmMErc/cycfVJMnMMascTIpcUKkIIDly4Sedp25n6dwSnDF58XfE7clwq4ZIeg27ec3A9Qu2Ioog8UbUs60Y9Rf8nfAEI3X6erj/sIOJqssrJhDCRUz9ClGIZ2QYmrz/D3B3nURQo52TDB11q06WeF5rkWPi5G1w/A44eELwaygeoHVkUoU2nrjL2t6PcTM3C1krLe51q0u8JXxnZJYqE9FERQjzQ0ZgERi87QmR8CgAvNdLzXqeauDn8Zx6V1Ovwc1e4ehwcy8OAP8GjpkqJRXGIT87grV+P8s/Za4BpvaYpPetLR1tR6KRQEULcU7bByA+bI/khPBKDUaG8sy1fdq9L2xoV7r1D2k34+XmIOwYOZU3FSoXaxRtaFCujUWHezmi++Os0WQYjvmUd+LFvI2p5y99YUXikUBFC3CXiajKjlx3h2OVEADrX82Ji1zqUedgaMGk3YUE3iD0C9u4wYBV41i36wEJVRy4l8Nqig1xOSMfWSsvEbnXo2dhH7ViihJBCRQiRS1EUFu6+wMQ1p8jKMeJqb83EbnV4vr53/h8k/RYseBGuHAT7MvDKSvCqX3ShhVm4lZrFm8sOs+WM6VRQr8Y+fNy1NnbWD18XSogHkUJFCAFAQloW434/yvoTVwFoXb08X71U79EmbktPgIXd4fJ+sHM1FSveDQo3sDA7RqPC9PBIvvn7LIoC9fSuzO7fGE9XmfxPPDopVIQQ7Iu+yajFh7iSmIG1TsO4jjUIaVXl8UZxZCSZipWYvWDrSkz7mUSk2OPv7///qzOLEml7xHVGLj5IQlo2Hs62zOrfiAaVyqgdS1gomfBNiFLMYFSYtimCXrN2cSUxg8plHVg+vCWDn6z6+ENN7Vyg/3Ko1JzQXdfwbdaJtm3b4uvrS2hoaOEcgDBLrfzLsWpEKwIqOBOfnEmv2btZfjBG7ViihJMWFSFKmPjkDEYtPsyuczcAeLFBRT7pVgenQl4lNybqDL7+NTD+5y+ITqcjOjpaWlZKuJTMHN5Ycpi/T5lOJw57qipvd6yBTivzrYj8kxYVIUqhfdGmGWZ3nbuBg42Ob3rW55tegYVepABEXLySp0gBMBgMREZGFvpzCfPiZGvF7P6NGNnGD4BZ/5zj1YUHSM+SqfdF4ZNCRYgSQFEUQrefp8/s3cQnZ+Lv4cSf/2vFiw2LrmXD398frTbvnxCdBvzKFn5RJMyPVqvhrQ4BfNc7EBsrLRtPXqXPT7u5kZKpdjRRwkihIoSFS83M4X+LDzFx9UlyjApd6nuzYkRLqpV3KtLn1ev1zJ49G53ONExVp4VZne3QbxwKt6KL9LmF+egaWJFFg5vh5mDN4UsJvPjjTs5fT1U7lihBpI+KEBYsMj6FVxceIDI+BSuthnc71SS4ReViXZslJiaGyMhI/LzKoN84GK6fBbdKMPAvcJW+KqVF1LUUgsP2culmOmUcrJkzoAmNfGVEkLg/GZ4sRAm3/kQco5ceJjXLQAUXW6a/3JDGld3VDZUUC/Oeg5vnwL0qBK8FFy91M4licy05k5D5+zgak4itlZbvejegYx1PtWMJMyWdaYUooRRF4ftNEQxbcIDULAPNqriz+n9Pql+kgKkoGfCnqUXl5jnTGkEp19ROJYpJeWdblgx9gnY1PMjMMfLaogMs239J7VjCwkmhIoQFSc8yMPKXQ3y98SwAwS0qs3BwM8o726qc7D9c9aZixUVvOg208EXISFQ7lSgmDjZWzOrfiN5NfDAq8PZvR5mz7ZzasYQFk0JFCAtxJSGdl2buZM2xWKx1Gia9WJePnq+Ntc4MP8ZlKpum13csD3FH4ZdekJWmdipRTKx0Wia9WJdhT1UF4NM1p/hmwxksvKeBUIkZ/oUTQtzpwIWbPP/Ddk5cScLd0YZFg5+gT9NKasd6sHJ+0G852LrCxV2w7BXIyVI7lSgmGo2G8c/WYGyHAACmbY7k4z9PYrxz8h0hHkIKFSHM3G8HYugzew/XU7Ko4enMqpEtaVrFDPqj5IdXPei7DKzsIXIj/DEMjDIpWGmh0WgY0caPiV1rAzBvZzRv/XqEHINR5WTCkkihIoSZUhSFbzac4a1fj5BlMNKxtie/D2+BvoyD2tEKptIT0GshaK3hxHJYMwbkFECp0r95Zab2CkSn1bD80GVGLTlMthQrIp+kUBHCDGXmGBi97AjTNpumo38tqBoz+jbEsQimwi8W/u3hxdmABg6EwaaP1U4kilm3BhWZ2a8R1joNa47FMmrJISlWRL5IoSKEmUlIy6J/6F7+OHQZnVbDl93r8nbHGmgtfcG3Oi9Cl6mm69u/he1T1UwjVPB0rQrM7NcIG52WtcfieH2xFCvi4aRQEcKMXLyRxos/7mTv+Zs421oxb2ATejUx806zBdEoGJ7+xHT97w9hf5iqcUTxa1ezArP6m4qVv47HMfKXg2TlSLEi7k8KFSHMxMGLt3hhxg7OXUvF29WOX4c350n/8mrHKnwtR0Gr0abrq9+EE3+om0cUuzY1PJj1SiNsrLSsP3FVihXxQKoXKpMmTaJJkyY4Ozvj4eFBt27dOHPmjNqxhChW60/E0Wf2bm6kZlGnogt/jGhJDc8SvCREuw+gcQigwPKhcP4ftROJYtYmwIPZ/U3FyoaTpmJFTgOJe1G9UNm6dSsjRoxg9+7dbNy4kezsbJ555hlSU2X1TVE6LNl7keELD5CZY6RtDQ+WDm1OBRc7tWMVLY0GnpsMNZ8HQxYs6Qtxx9ROJYpZUIAHc15pnFusvPXrEQwyz4q4g9ktSnjt2jU8PDzYunUrTz311F33Z2ZmkpmZmftzUlISPj4+siihsDiKojA9PJIpG0zT4fdq7MNnL9TByhxnmi0q2RmmKfYv7AAnTwjZAGV81U4litnm01cZ+vMBcowKvZv4MOnFusW6ArhQh8UuSpiYaFoTxN393hNaTZo0CVdX19yLj49PccYTolAYjQofrTqRW6SMbOPHF93rlq4iBcDaDnr/Ah61ICXOVLSk3lA7lShmbWtU4LveDdBqYMm+S3z850mZbl/kMqsWFaPRyPPPP09CQgLbt2+/5zbSoiIsXVaOkTG/HuHPI1cA+KhLLYJbVlE5lcqSrkDoM5B4CSo2hgGrwMZR7VSimP12IIa3fj0CmIr3t/6dfl+UTBbZojJixAiOHz/OkiVL7ruNra0tLi4ueS5CWIqUzBwGzdvHn0euYK3TMK1PAylSAFy8od/vYF8GLu+HX4PBkK12KlHMXmqkZ2K3OgD8EB7J9PBIlRMJc2A2hcrIkSNZvXo14eHh6PV6teMIUehupGTy8k+72R55HQcbHXODm/B8fW+1Y5mP8gHw8r/rAkVsgD/fkKn2S6H+T/jyznM1AJi8/gyL9lxQOZFQm+qFiqIojBw5kj/++IPNmzdTpYr871KUPLGJ6fSYtYujMYm4O9qweMgTJXOOlMfl0xR6hIFGC4cXErP0LcLDw4mJiVE7mShGQ5+qxutt/QB4f8Vx1h2PUzmRUJPqhcqIESNYuHAhv/zyC87OzsTFxREXF0d6erra0YQoFBdvpNFj5q7/n8jt1ebU93FTO5b5CngWOk8l9GAWvi9/Q9u2bfH19SU0NFTtZKIYvfl0dfo0rYRRgdeXHGLPOelkXVqp3pn2fkPQwsLCCA4Ofuj++e2MI4QaIuOT6TtnD1eTMqlc1oFFQ56gopu92rHMXkxMDL6+lTD+Z04NnU5HdHS0nBouRQxGheELD7Dh5FWc7axYNqw5Nb3k73xJYTGdaRVFueclP0WKEObsxJVEes7azdWkTKpXcGLZsOZSpORTREREniIFwGAwEBkpnStLE53W1OG8aWV3kjNyGDB3L5dupqkdSxQz1QsVIUqigxdv0Wf2bm6mZlG3oitLhzbHo6TPNluI/P390Wrz/nnSacCvnK1KiYRa7Kx1/DSgMTU8nYlPzmTA3L3cTM1SO5YoRlKoCFHIdkZdp9+cPSRl5NCkchkWDWlGGUcbtWNZFL1ez+zZs9HpdADotDCrsx368P9B2k2V04ni5mpvzfxBTanoZs+566kMnLeP9CyD2rFEMZFCRYhCFH46noFh+0jLMvCkfznmD2qKi5212rEsUkhICNHR0YSHhxN9fD8hQVXgRgQs7Qc5mQ9/AFGiVHCxY/6gppRxsObIpQTeWHpI1gUqJaRQEaKQrDsex9AF+8nMMdK+ZgV+eqUxDjZWaseyaHq9nqCgIPQ1G0HfX8HWxbQu0MoRYJSVdksbPw8nfnqlMTY6LetPXOWLv06pHUkUAylUhCgEfx2L/XeZeoUu9b35sV9D7Kx1ascqWSrUhp4/g9YKjv0K4Z+pnUiooHFldyb3qAfAT9vOs2C3TAhX0kmhIsRjWnsslpGLD5FjVHihQUWm9grEurQtLlhcqrWBLt+Zrm+bAgfmq5tHqKJrYEXeeqY6AB+uPE74mXiVE4miJH9NhXgMa47G8r/FpnPlLzaoyJQe9dFpZXn6ItWgHzz1tun66jchcpO6eYQqRrTx46VGeowKjFx0kJNXktSOJIqIFCpCPKI/j1zh9SX/FikNKzJZipTi0+YdqNcbFAMsGwBxx9ROJIqZRqPh8xfq0qJaWVKzDAyat4+4xAy1Y4kiIIWKEI9g1ZErjPq3SHmpkZ7JL0mRUqw0Gnj+e6j8JGQlw6KekBSrdipRzGystPzYrxF+Hk7EJWUQMl+GLZdEUqgIUUArD1/mjSWHMCrQs7Ger7rXkyJFDVY20GsBlAuA5CuwuDdkyaylpY2rvTVhwU0o62jDiStJvPXbEVReGUYUMilUhCiAFYcu8+bSwxgV6NXYhy9erIdWihT12JeBl5eCvTvEHoYVr8qw5VLIx92BH/s1wkqrYc3RWKaHy1ILJYkUKkLk08rDlxm9zFSk9G7iw6QX60qRYg7cq0DvX0BnAydXyrDlUqppFXcmdqsDwJQNZ9lwIk7lRKKwSKEiRD6sPRbL6GVHMCrQp2klPn9BihSz4tscukwzXd82BY4sUTePUEWfppUIblEZgDeXHuZ0nIwEKgmkUBHiIf4+eZXX/x2C3KORns+61ZEixRwF9oFWo03XV/0PLuxSN49QxXudatLSzzQSaMjP+2UBwxJAChUhHmDr2Wu8tuggOUaFroHefNFd+qSYtbbvQ80uYMiCpX3h5nm1E4liZqXT8kOfhviWdeDSzXReW3SAbIP0W7JkUqgIcR87o64z9Of9ZBmMPFvHk69lnhTzp9XCC7PAKxDSbsAvvSAjUe1UopiVcbThp1ca42Rrxe5zN5m4+qTakcRjkEJFiHvYF32TkHm3Fxj04LveDbCSafEtg40j9FkCzt5w/Qz8OhAMOWqnEsWsegVnpvYKRKOBn3dd4PcDMWpHEo9I/vIKcYfDlxIYGLaP9GwDT1Uvz/S+DbGxko+KRXHxgj6LwdoBojbB+glqJxIqaF+rAqPa+QPwzh/HOHFFWtcskfz1FeI/jl9O5JXQPaRk5tC8allm9WuErZWsgmyRvAPhxdmm63tnw57ZqsYR6ni9rT9tAsqTmWPk1YUHSEiTzrWWRgoVIf51Ji6Z/qF7SMrIobFvGeYMaIy9jRQpFq1mF2j/ken6unEQ8beqcUTx02o1TO3VgErups61byw9jNEoM9daEilUhADOX0+l75w93ErLpr6PG2EDm+Boa6V2LFEYWr4BgX1BMcJvA+HaWbUTiWLm6mDNj/0aYmulZcuZa3y3KULtSKIApFARpd6VhHT6zdnD9ZRManq58PPApjjbWasdSxQWjQY6T4VKzSEzybQmUPottVOJYlbb25VJL9YF4LtNEWw+fVXlRCK/pFARpdqNlEz6he7hckI6Vcs5siCkKa4OUqSUOFY20HMBuPrAzSj4dSAxF6IJDw8nJkZGg5QWLzbU80pzXwDeWHKYCzdSVU4k8kMKFVFqJWVk88rcvZy7loq3qx0LBjejnJOt2rFEUXEqb1oTyNqB0N/W41ulKm3btsXX15fQ0FC104li8l6nWjSs5EZSRg7DFhwgI9ugdiTxEFKoiFIpPcvA4Hn7OXElibKONiwc3IyKbvZqxxJFzaseMc0/ZejqDIyKqUOl0Whk2LBh0rJSSthYaZnRtxHlnGw4HZfMx3+eUDuSeAgpVESpk5VjZPiiA+yNvomznRXzBzWlankntWOJYhKhqcqdgz4MBgORkZHqBBLFztPVju96N0CjgcV7L7Hi0GW1I4kHkEJFlCoGo8LoZYfZcuYadtZawoKbUKeiq9qxRDHy9/dHq837p0+n0+Hn56dSIqGGln7leL3t/08GF3UtReVE4n6kUBGlhqIovLfiGKuPxmKt0zCzXyMaV3ZXO5YoZnq9ntmzZ6PTmebI0WlgVp8q6D3kd6G0eb2dP82rliUty8CIRQelv4qZkkJFlAqKovDFX6dZvPcSWg1M7dWAoAAPtWMJlYSEhBAdHU34n0uIHl+JkGrxsPI1UGQisNJEp9XwXZ9AyjnZSn8VMyaFiigVZmyJYtY/5wCY9GJdOtXzUjmRUJteryeocy/0wxaD1gpO/AHbpqgdSxQzD2c7vusdKP1VzJhZFCrTp0+ncuXK2NnZ0axZM/bu3at2JFGCLNpzgcnrzwDw7nM16dWkksqJhFnxbQGdvjZd3/wpnFqtbh5R7O7srxIZL/1VzInqhcrSpUsZPXo0H374IQcPHqR+/fp06NCB+Ph4taOJEuCvY7G8t+I4ACPb+DHkqaoqJxJmqVEwNB1qur58KFyVUwClzZ39VdKzpL+KuVC9UPnmm28YMmQIAwcOpFatWsycORMHBwfmzp2rdjRh4XZF3WDUksMoCvRpWokxz1RXO5IwZx0+hypPQXaqaZr91BtqJxLF6L/9Vc5cTebTNSfVjiT+pWqhkpWVxYEDB2jfvn3ubVqtlvbt27Nr16577pOZmUlSUlKeixB3OnkliaE/7yfLYKRD7Qp82q0OGo1G7VjCnOmsocd8KFMZEi7CrwPAkK12KlGMPJztmNorEIBFey6y/kScuoEEoHKhcv36dQwGAxUqVMhze4UKFYiLu/cvyKRJk3B1dc29+Pj4FEdUYUEu3UxjQNhekjNzaFrFne96N0CnlSJF5IODO/RZAjZOEL0NNryvdiJRzFr5l2PYv6eIx/1+lLjEDJUTCdVP/RTUhAkTSExMzL1cunRJ7UjCjFxPyaR/6B6uJWdSw9OZn15pjJ21Tu1YwpJ41IQXZpqu7/kRDi9WN48odmOeCaBORRcS0rJ5c+lhDHdOZSyKlaqFSrly5dDpdFy9mne57atXr+Lp6XnPfWxtbXFxcclzEQIgJTOHQfP2EX0jDX0Ze+YPaoqrvayELB5BzS7w1Num63+OgssH1c0jipWNlZZpvRtgb61j17kbzP53agOhDlULFRsbGxo1asSmTZtybzMajWzatInmzZurmExYmqwcI8MXHuBoTCLujjb8PKgpFVzs1I4lLFnQBKjeEQyZsLQfpFxTO5EoRlXLO/Hx87UB+HrDGQ5fSlA3UCmm+qmf0aNH89NPPzF//nxOnTrF8OHDSU1NZeDAgWpHExbCaFR469cjbIu4joONjrDgJrLIoHh8Wi28OBvK+kHSZelcWwr1aKynU10vcowKo5YcIiUzR+1IpZLqhUqvXr2YMmUKH3zwAYGBgRw+fJh169bd1cFWiHtRFIVPVp9k1ZErWGlN6/fU93FTO5YoKexcofcvYOMMF3bA+nfUTiSKkUaj4fMX6lLRzZ4LN9L4cKXMr6MGjaJY9uIWSUlJuLq6kpiYKP1VSqEZWyL5ap1p1tnvegfSNbCiyolEiXR6DSx52XS96wxo0FfdPKJY7T1/k96zd2FU5O9MYcrv97fqLSpCPKpl+y/lFikfdK4lfzxE0anRCVqPN11f/SZcPqBuHlGsmlZxZ+S/U+y/98dxYm6lqZyodJFCRVikzaevMmH5MQCGB1VjUKsqKicSJV7rcRDwnKlz7ZJ+kCLLfJQmr7f1o2ElN5Izc3jr1yMYZchysZFCRVicozEJjFh0CINR4aVGet7uEKB2JFEaaLXwwiwoVx2Sr8CyVyAnS+1UophY6bR80zMQBxsdu8/dZO6O82pHKjWkUBEW5eKNNAbN20d6toGnqpdn0ot1ZWp8UXzsXEyda21d4OIuWD9B7USiGFUu58h7nWoB8NX6M5y9mqxyotJBChVhMW6mZjEgbC/XU7Ko7e3CjL4NsdbJr7AoZuX8TcOWAfbNgYML1M0jilWfpj60reFBVo6RN5YcJivHqHakEk/+yguLkJFtYPD8fZy/nkpFN3vCgpvgZGuldixRWgU8C0H/DlVeMxpi9qubRxQbjUbDF93rUsbBmpOxSXy36azakUo8KVSE2TP8O9nSwYsJuNhZMX9QEzxk1lmhtqfGQo3OYMgyzVybfPXh+4gSwcPZjs9fqAvAj1uiOHDhpsqJSjYpVIRZUxSFT/48wfoTV7HRaZkzoAl+Hs5qxxLi3861M6FcACTHSufaUubZul682KAiRgVGLztCqsxaW2SkUBFm7adt55i/6wIA3/YKpGkVd5UTCfEfts7/dq51hUu7Yd04tROJYvRR19p4u9px4UYan609pXacEksKFWG2Vh25wudrTwPwXqeadKrnpXIiIe6hnB90/wnQwP65xKybRnh4ODExMWonE0XMxc6aKT3qA/DLnouEn5a5dYqCFCrCLO0+d4O3lh0BYGDLyoTIhG7CnFXvAG3eIfRgFr7PjaJt27b4+voSGhqqdjJRxFr4lWNQS9Pfp7d/P0pCmpz+K2xSqAizc/ZqMkN/3k+WwcizdTx5r1MtmStFmL2YKr0ZujqD2xOWGo1Ghg0bJi0rpcDbHQOoVt6Ra8mZfPLnSbXjlDhSqAizcjUpg+C5e0nKyKGxbxm+7RWITitFijB/EVFR3DmrusFgIDIyUp1AotjYWeuY3KM+Wg0sP3SZv0/KCLDCJIWKMBvJGdkEh+3jSmIGVcs78tMrjbGz1qkdS4h88ff3R6vN+ydVp9Xg5+enUiJRnBpWKsOQJ6sCMOGPY3IKqBBJoSLMQlaOkeELD3IqNolyTjbMH9iUMo42ascSIt/0ej2zZ89GpzMV1zoNzOpkiz5JVlouLd58ujpV5RRQoZNCRahOURTGLz/K9sjrONjomBvcBB93B7VjCVFgISEhREdHEx4eTvTPIwlpaAMrXoNrZ9SOJoqBnbWOKXIKqNBJoSJU9+3fESw/eBmdVsP0lxtST++mdiQhHplerycoKAh9n2+h8pOQlQJL+kJGktrRRDFoWKkMg/89BfTOH8dITMtWOZHlk0JFqOr3AzFM2xQBwKfd6tCmhofKiYQoJDoreCkMnL3hRgSsGA6K8vD9hMUb/e8poPjkTD5efULtOBZPChWhml1RNxi//CgAw4Oq0adpJZUTCVHInMpDrwWgs4HTq2H7t2onEsXAzlrH5Jf+PQV0UE4BPS4pVIQqIuNTGLZgP9kGhU71vBj7TIDakYQoGvrG8OxXpuubJ0LUZnXziGLRyFdOARUWKVREsbueksnAeaa5UhpWcuPrHvXRylwpoiRrFAwN+oNihN9C4NYFtROJYiCngAqHFCqiWGVkGxjy834u3UynkruDzJUiSgeNBp6bAt4NIP0mLOsP2elqpxJF7M5TQFvOyFpAj0IKFVFsjEaF0csOc+hiAq721oQNbEJZJ1u1YwlRPKztoOcCcCgLsUdg9WjpXFsKNPItw8B/1wJ694/jpGbmqJzI8kihIorNV+vPsPZYHNY6DbP6N6JaeSe1IwlRvNx84KW5oNHCkV9gvyxaWBqMeaY6+jL2XE5IZ/J6mVOnoKRQEcVi8d6LzNwaBcCX3evxRNWyKicSQiVVg6D9R6brf42HS3vVTCOKgYONFZ+/UBeA+buiOXDhlsqJLIsUKqLI/XP2Gu+tOA7AqHb+vNhQr3IiIVTW4nWo1RWM2bDsFUiW4asl3VPVy9O9oR5FgfG/HyUrx6h2JIshhYooUmfiknlt0UEMRoUXGlTkjfb+akcSQn0aDXSdDuUCIDkWfg0GgwxfLene61STso42RMSnMGOLrKqdX1KoiCITn5TBwLC9pGTm0LSKO190r4tGI8OQhQDA1hl6LwIbZ7i4EzZ+oHYiUcTKONrw0fO1AZgeHknE1WSVE1kGKVREkUjLyiFk/n6uJGZQtZwjs/s3wtZKhiELkUc5f3hhpun67hlw9Fd184gi17meF+1qeJBtUBj3+1EMRhn59TBSqIhCZzAqvL74MMcuJ+LuaEPYwCa4OdioHUsI81SzMzw5xnR91f8g7ri6eUSR0mg0fPpCHZxsrTh4MYGFu2Xyv4dRrVCJjo4mJCSEKlWqYG9vT7Vq1fjwww/JyspSK5IoJJ+tOcXfp65iY6Xlp1ca4VvWUe1IQpi3Nu9CtbaQkw5L+0K6jAopybxc7RnX0bRsyFfrTnM5QSb/exDVCpXTp09jNBqZNWsWJ06c4Ntvv2XmzJm88847akUShWD+zmjm7jgPwDc969PI113lREJYAK0OuoeCWyW4FQ3Lh4JRRoWUZH2b+dLYtwypWQbe++MYikz+d18axYxencmTJ/Pjjz9y7ty5fO+TlJSEq6sriYmJuLi4FGE68TCbTl1lyM/7MSrwdscAXgvyUzuSEJYl9giEPgM5GdB6PLSZoHYiUYQi41N47rttZBmMfNc7kK6BFdWOVKzy+/1tVn1UEhMTcXd/8P/AMzMzSUpKynMR6jt+OZH/LT6EUYFejX0Y3rqa2pGEsDxe9aHzVNP1rV/AmXWqxhFFy8/DiZFtTf+hm7j6FInpMkT9XsymUImMjOT7779n2LBhD9xu0qRJuLq65l58fHyKKaG4nysJ6Qyat4+0LAOt/Mrx6Qt1ZBiyEI8qsA80GWK6vnwo3IhSN48oUsNaV6VqeUeup2Ty1brTascxS4VeqIwfPx6NRvPAy+nTed+My5cv07FjR3r06MGQIUMe+PgTJkwgMTEx93Lp0qXCPgRRAMkZ2Qyat4/45EyqV3BiRr+GWOvMpv4VwjJ1+Bx8mkFmIiztB1mpaicSRcTWSsdn3UzT6/+y9yIHL0pH6jsVeh+Va9eucePGjQduU7VqVWxsTMNVr1y5QlBQEE888QTz5s1Dqy3Yl5z0UVFPjsFIyPz9bD17jXJOtqwY0QJ9GQe1YwlRMiTFwuzWkHIV6nQ3dbaVlsoSa8yyI/x+MIYans78+b9WpeI/fPn9/rYq7CcuX7485cuXz9e2ly9fpk2bNjRq1IiwsLACFylCPYqi8OGqE2w9ew07ay2hAxpLkSJEYXLxgh7zYH4XOP47VGwMzV9TO5UoIu92qsmm01c5HZdM2I7zDH1K+vndplplcPnyZYKCgqhUqRJTpkzh2rVrxMXFERcXp1YkUQBztp1n0Z6LaDTwXe8G1PdxUzuSECWPbwvTaSCADe8Rs2s54eHhxMTEqJtLFDp3RxveebYmAN9ujCDmVprKicyHaoXKxo0biYyMZNOmTej1ery8vHIvwrz9dSyWz/86BcC7z9WkQ21PlRMJUYI1HQr1ehF6IB3flt1p27Ytvr6+hIaGqp1MFLIejfU0reJOeraBD1eekLlV/mVW86g8CumjUrwOXbxF79m7ycwx8kpzXz5+vraM8BGiiMWci8DXrzr/XRZGp9MRHR2NXq9XL5godJHxyTz73TayDQoz+zWkY52S+593i5xHRZi3SzfTGPLzfjJzjLQJKM8HnWtJkSJEMYi4EMOda9cZDAYiIyPVCSSKjJ+HM8P+7Z/y0aqTpGTmqJxIfVKoiHxJTM9m4Lx9XE/JopaXCz+83BCrUtArXQhz4O/vf9dgA51Wi5+fzP5cEo1s64dvWQfikjL4esMZteOoTr5pxENl5RgZvvAAkfEpeLrYMTe4CY62hT5gTAhxH3q9ntmzZ6PT6QDQaWBWFwf0mniVk4miYGetY2LXOoBp/bRjMYkqJ1KXFCrigRRF4d0/jrEz6gaONjrmBjfB09VO7VhClDohISFER0cTvmkT0d91ISRQC8tegdQHz1slLNNT1cvTpb43RgXe+eMYhjvP/ZUiUqiIB5oeHsmvB2LQauCHlxtSy1s6LAuhFr1eT1DbtuiHLAD3apB4CX4bCAbpx1ASvd+5Js52Vhy7nMgvey+qHUc1UqiI+1p5+DJTNpwF4OOudWhTw0PlREIIAOxcoddCsHaA81th80S1E4ki4OFsx1vPBAAwed1pbqRkqpxIHVKoiHvaH32Tsb8eBWBwqyr0f8JX5URCiDwq1IKuP5iu75gKJ1eqGkcUjb7NKlHLy4WkjBy+LKWLFkqhIu4SfT2VIT/vJ8tgpEPtCrzzXE21Iwkh7qVOd2g+0nR9xWtwTUaIlDRWOi0Tu9UGYNn+GA5cKH2LFkqhIvK4lZrFwHn7uJWWTX29K1N7NUCrlblShDBb7T+Gyk9CVgos6QsZSWonEoWska87PRqZJvZ7f8XxUtexVgoVkSszx8CwBQc4fz2Vim72/DSgMfY2OrVjCSEeRGcFL4WBS0W4EQErhoNlTzgu7mH8szVwsbPiZGwSi/ZcUDtOsZJCRQCmYchv/3aUvdE3cba1ImxgEzycZRiyEBbBqTz0/Bl0NnB6NWz/Vu1EopCVdbJlbMcaAExef4brpahjrRQqAoBv/45g5eErWGk1/NivEdUrOKsdSQhREPrG8Nxk0/XNEyFqs7p5RKF7uWkl6lR0ITkjhy/+Kj0da6VQEfx+IIZpmyIA+OyFOrTyL6dyIiHEI2kUDA36g2KE30LgVuk6RVDS6bSa3BlrfzsQw/7omyonKh5SqJRyu6JuMH65aRjya0HV6NWkksqJhBCP5bkp4N0A0m/Csv6Qna52IlGIGlQqQ+8mPgC8t+I4OQajyomKnhQqpVhkfArDFuwn26DQuZ5X7sRCQggLZm0HPReAQ1mIPQJrxkjn2hLm7Y41cHOw5nRcMgt2l/xWMylUSqkbKZkMnLeXpIwcGvmWYUqP+jIMWYiSws3HNBJIo4XDi2D/XLUTiULk7mjD2x1MHWu/2XCW+OQMlRMVLSlUSqGMbAODf97PpZvpVHJ3YHb/RthZyzBkIUqUqq2h/Uem63+Ng0t7VY0jClevJj7U17uSnJnDF2tLdsdaKVRKGaNRYcyyIxy6mICrvTVhA5tQ1slW7VhCiKLQ4nWo1RWM2aaVlpOvqp1IFBKdVsMnXeug0cDyQ5fZV4I71kqhUspM3nCGNcdisdZpmNW/EdXKO6kdSQhRVDQa6DodyteA5Fj4NRgM2WqnEoWkvo9bbsfaj1adKLEz1kqhUoos3nuRH7dEAfBl93o8UbWsyomEEEXO1tm00rKNM1zcCRs/UDuRKERvPROAs50VJ64ksWz/JbXjFAkpVEqJbRHXeG/FcQBGtfPnxYZ6lRMJIYpNOX94Yabp+u4ZcPRXdfOIQlPWyZbRT1cHTDPWJqaVvBYzKVRKgTNxyby28CAGo8ILDSryRnt/tSMJIYpbzc7w5Fum66v+B3HH1c0jCk2/J3zx93DiZmoW3/59Vu04hU4KlRIuPimDQfP2kZyZQ9Mq7nzRvS4ajQxDFqJUavMOVGsHOemwtB+k31I7kSgE1jotH3apDcCC3Rc4ezVZ5USFSwqVEiwtK4fBP+/nckI6Vcs5Mrt/I2ytZBiyEKWWVgfd54BbJbh1HpYPBWPJn9m0NGjlX44OtStgMCp8/OcJlBI0yZ8UKiWUwagwaslhjsYk4u5oQ9jAJrg52KgdSwihNgd3U+daKzuI2ABbv1Q7kSgk73WqhY2Vlh2RN1h/ouQMRZdCpYT6fO0pNp68io2Vltn9G+Fb1lHtSEIIc+FVHzpPNV3f+gUxWxcQHh5OTEyMqrHE4/Fxd2DYU1UB+HTNSTKyDSonKhxSqJRAP++KJnT7eQC+7lGfxpXdVU4khDA7gX2gyRBCD2bh2+YV2rZti6+vL6GhoWonE49heFA1vFztiLmVzux/zqkdp1BIoVLChJ+O56NVJwAY2yGALvW9VU4khDBXMbVfY+jqDG7PE2Y0Ghk2bJi0rFgwBxsr3nmuJgAztkRyJcHyV8+WQqUEOXElkZG/HMSoQM/Gel4LqqZ2JCGEGYs4f4E7JzM1GAxERkaqE0gUis71vGhaxZ2MbCOfrz2ldpzHJoVKCXE5IZ2BYftIzTLQ0q8sn70gw5CFEA/m7++PVpv3a0Cn1eDn56dSIlEYNBoNH3aphVYDq4/GsufcDbUjPRazKFQyMzMJDAxEo9Fw+PBhteNYnMT0bAaG7SU+OZOACs782K8R1jqzeGuFEGZMr9cze/ZsdDrTtAU6DczqZIs+5YjKycTjqu3tSp+mlQD4cNUJcgyWOwzdLL7N3n77bby9pS/Fo8jKMfLqggOcvZpCBRdbwgY2wcXOWu1YQggLERISQnR0NOHh4UTPe5WQhjam+VXiT6sdTTymMc8E4Gpvzem4ZBbvs9x1gFQvVP766y82bNjAlClT1I5icRRFYdzvR9l17gaONjrmBjfB281e7VhCCAuj1+sJCgpC33caVH4SslJgSR9IT1A7mngM7o42uesAfbPhDInplrkOkKqFytWrVxkyZAgLFizAwcEhX/tkZmaSlJSU51JafbPxLH8cuoxOq2FGv0bU9nZVO5IQwpLprKHHPHCtBDfPwe8hYCwZc3GUVn2bVcLfw4lbadl8vylC7TiPRLVCRVEUgoODefXVV2ncuHG+95s0aRKurq65Fx8fnyJMab6W7L3I95tNPfM/f6EOrauXVzmREKJEcCwHvReClT1E/g2bJ6qdSDwGK52WdzuZhivP3xXN+eupKicquEIvVMaPH49Go3ng5fTp03z//fckJyczYcKEAj3+hAkTSExMzL1cumS5590e1ZYz8by7wrTy6ett/ejVpJLKiYQQJYpXfej6g+n69m/h+O/q5hGPJSjAg6CA8mQbFIscrqxRCnnlomvXrnHjxoOHQlWtWpWePXvy559/5hlCazAY0Ol09O3bl/nz5+fr+ZKSknB1dSUxMREXF5fHym4Jjl9OpNesXaRmGXixYUW+7lFfhiELIYrGxg9gx3em1pXBG8GzrtqJxCOKjE+mw9RtGIwKvwxuRgu/cmpHyvf3d6EXKvl18eLFPP1Lrly5QocOHfjtt99o1qwZer0+X49TmgqVywnpvDB9B/HJmbT0K0tYcFNsrFTvDy2EKKmMBljUA6I2mfqtDN0CjmXVTiUe0YcrjzN/1wVqeDqz5vUn0WnV/U9ufr+/VfuWq1SpEnXq1Mm9VK9u6plcrVq1fBcppUliejbBc/POlSJFihCiSGl18FIolKkCiRfh1wFgyFE7lXhEb7SvjoudFafjkvl1v+V0m5BvOguQmWNg2IL9RMTLXClCiGJmXwb6LAYbJ4jeBhveUzuReERlHG0Y1d7UKDBlwxmSMyxjuLLZFCqVK1dGURQCAwPVjmJWFEVh3G9H2X3uJk62VoQFN5W5UoQQxcujJrww03R9z49w+Bd184hH1v8JX6qUc+R6ShYztkSpHSdfzKZQEff29YazrDh8xTRXSt+G1PIu2f1whBBmqmYXaD3OdP3PNyDmgKpxxKOxsdLy7r+rK4duO8+lm2kqJ3o4KVTM2OK9F/kh3DRXyqQX6vKUzJUihFBT6/EQ8BwYMmFpP0i+qnYi8Qja1fSgpV9ZsgxGvvjL/JdKkELFTIWfiee923OltPOnZ5PSObGdEMKMaLXwwiwoFwDJV2BpX8jOUDuVKCCNRsN7nUyrK685Fsve8zfVjvRAUqiYoaMxCYxYdBCDUaF7Qz1vtvdXO5IQQpjYuZg619q5Qcw++HMUqDPLhXgMNb1ccicLnbj6JEaj+b6HUqiYmejrqQwM20daloFWfuWY9GJdmdBNCGFeylaDnvNBo4OjS0yTwgmLM+aZ6jjZWnHsciLLD11WO859SaFiRq6nZDIgbC83UrOo7e3CzP4yV4oQwkxVDYJnvzRd//sjOLNOzTTiEZRzsmVkWz8AJq8/TWqmec6RI9+CZiI1M4eBYfu4cCMNH3d7wgY2wcnWSu1YQghxf00GQ+NBgGJaafnqSbUTiQIa2LIyldwduJqUyayt5jlcWQoVM5BtMDJ80UGOXU7E3dGGnwc1w8PZTu1YQgjxYBoNPPsVVH4SslJgcW9IffBab8K82FrpmPBsDQBmbztHbGK6yonuJoWKyhRFYdzvR/nn7DXsrXXMDW5ClXKOascSQoj80VlDz5+hTGVIuADLXoGcLLVTiQLoWMeTJpXLkJFt5OsNZ9WOcxcpVFT21fozLD94OXdCt0AfN7UjCSFEwTi4Q58lYOMMF7bD2rdkJJAF0Wg0vPPvJHC/H4zhxJVElRPlJYWKiubtOM+P/05h/MWLdWlTw0PlREII8Yg8apoWMEQDB+fD3tlqJxIF0KBSGbrU90ZR4PO1p1DMqNCUQkUla47G8vFqU8ezt56pTo/GMqGbEMLCVe8AT39iur5uAkRtVjePKJC3OwRgo9OyI/IGW85cUztOLilUVLAr6gZvLj2MopgWiBrRxk/tSEIIUTha/A/qvwyKAX4NJuboNsLDw4mJiVE7mXgIH3cHBrasDMBna0+RYzCqG+hfUqgUs9NxSQxdsJ8sg5GOtT356PnaMqGbEKLk0Gigy1TQNyV05zV8A5+ibdu2+Pr6EhoaqnY68RCvtfGjjIM1kfEpLN1/Se04gBQqxepyQjoD5u4lOSOHJpXLMLV3IDqtFClCiBLGypaYVl8xdHUGt2dmNxqNDBs2TFpWzJyrvTWj2pmWbfl241lSzGASOClUiklCWhYD5u7lalIm1Ss4MeeVJthZ69SOJYQQRSIiNoE7l48xGAxERkaqE0jk28vNfKlSzpHrKVnM3KL+JHBSqBSDtKwcQubvJzI+BU8XO+YNbIqrg7XasYQQosj4+/uj1eb9itFptfj5SZ88c2djpWVcR9MkcD+ZwSRwUqgUsWyDkdcWHeTAhVu42Fkxf1BTvN3s1Y4lhBBFSq/XM3v2bHQ6U8uxTgOzOtuiTz2ucjKRHx1qV6BpZXcyc4xMXn9G1SxSqBQho1HhrV+PsOXMNeystYQNbEKAp7PasYQQoliEhIQQHR1N+ObNRM8JJqSBNfw2CGKPqh1NPIRGo+HdTqZJ4P44dJnjl9WbBE4KlSKiKAqfrD7JysNXsNJq+LFfIxr5uqsdSwghipVeryeoTRv0A2ZDldaQnQq/9IKkWLWjiYeo7+NG10DTJHBhO6JVyyGFShH5fnMk83ZGA/B1z/q0CZBZZ4UQpdjtNYHKVYfkK7C4F2Slqp1KPMTYDgF80LkWk16sq1oGKVSKwILdF/hmo2lhp4+61KJrYEWVEwkhhBmwd4OXl4FDWYg9Ar8PAaNB7VTiAfRlHBjUqgo2VuqVC1KoFLI/j1zhg5WmzmKvt/MnuGUVlRMJIYQZca8CvReDzhbOrIG/P1Q7kTBzUqgUoq1nrzF62f9Pjf9me3+1IwkhhPmp1Ay6zTBd3/k97A9TN48wa1KoFJKDF2/x6oIDZBsUOtfz4mOZGl8IIe6v7ksQ9I7p+poxEBWubh5htqRQKQRnryYzaN4+0rMNPOlfjm96BqKVqfGFEOLBWr8N9XqZFjBcNgDiT6udSJghKVQeU8ytNF4J3UtCWjaBPm7M6t9I1U5HQghhMTQaeP57qNQcMhPhlx6QEq92KmFm5Bv1MVxLzuSV0L3EJWXg7+FEWHATHGys1I4lhBCWw8oWei2CMlUg4SL80lOGLYs8pFB5RAlpWfQP3cO566lUdLPn55CmlHG0UTuWEEJYHsey0O93sHeHK4fg14FgUH/VXmEepFB5BCmZOQwI28fpuGTKO9uyaHAzvFxl/R4hhHhkZavBy0vByg4i1sPaMaAoD99PlHiqFypr1qyhWbNm2NvbU6ZMGbp166Z2pAfKyDYweP4+jlxKwM3BmoUhzahczlHtWEIIYfl8mkL3OYAGDsyDbV+rnUiYAVULld9//53+/fszcOBAjhw5wo4dO3j55ZfVjPRAWTlGhi88wO5zN3GyteLnQU1lkUEhhChMNbvAs1+Zrm+eCEeWqJtHqE61np85OTmMGjWKyZMnExISknt7rVq11Ir0QDkGI28uPUz4vyshzw1uQj29m9qxhBCi5Gk2FBIvmiaDWzkCnD2hapDaqYRKVGtROXjwIJcvX0ar1dKgQQO8vLx49tlnOX78+AP3y8zMJCkpKc+lqBmNCuOXH2PNsVisdRpm9W9M0yqyErIQQhSZ9p9A7RfBmANL+0Pcg78bRMmlWqFy7tw5AD766CPee+89Vq9eTZkyZQgKCuLmzZv33W/SpEm4urrmXnx8fIo0p6IofLL6JL8diEGn1fB9nwa0rl6+SJ9TCCFKPa0WXpgJvi0hMwkW9YDEy2qnEioo9EJl/PjxaDSaB15Onz6N0WgE4N1336V79+40atSIsLAwNBoNv/76630ff8KECSQmJuZeLl26VNiHkMfXG84yb2c0AJNfqkfHOl5F+nxCCCH+ZWULvRdBuQBIvgKLXoKMRLVTiWJW6H1UxowZQ3Bw8AO3qVq1KrGxsUDePim2trZUrVqVixcv3ndfW1tbbG1tCyXrw/y4JYofwiMBmNi1Ni821BfL8wohhPiXfRno9xvMaQ/xJ2FpP+j7m6mIEaVCoRcq5cuXp3z5h58aadSoEba2tpw5c4ZWrVoBkJ2dTXR0NL6+voUdq8AW7Irmy3WmdSfGP1uD/s0rqxtICCFKK7dK0PdXCHsOzv8Dy4fCS3NBq1M7mSgGqvVRcXFx4dVXX+XDDz9kw4YNnDlzhuHDhwPQo0cPtWLlupaSBcD/2vrxautqKqcRQohSzqs+9FoIWms4uYKYBcMJ37yZmJgYtZOJIqZRFPWm/svOzmbChAksWLCA9PR0mjVrxtSpU6ldu3a+HyMpKQlXV1cSExNxcXEp1Hw7I6/TvFpZNBpZCVkIIczC8eWEvtOPoavTMSqg1WqZPXt2nmkuhGXI7/e3qoVKYSjKQkUIIYR5iYmJwde3Ekbj/3916XQ6oqOj0eulH6Elye/3t+pT6AshhBD5FRERkadIATAYDERGRqqUSBQ1KVSEEEJYDH9/f7TavF9dOg34WV9TKZEoalKoCCGEsBh6vZ7Zs2ej05lG/Oi0GmZ1tkO/9Q24ckjdcKJISKEihBDCooSEhBAdHU14eDjRURGEdG8PWSmw8CW4LqeAShopVIQQQlgcvV5PUFAQ+srVoNci0/DltOuw4AVIilU7nihEUqgIIYSwbHYu0Pd3cK9qWnV5wQuQekPtVKKQSKEihBDC8jmVh/5/gLMXXDsFC1+UdYFKCClUhBBClAxlKsMrK8GhLMQehl96QVaq2qnEY5JCRQghRMlRPsDUsmLrChd3wZK+kJOpdirxGKRQEUIIUbJ41TetuGztCOfC4bdBYMhWO5V4RFKoCCGEKHl8mkKfX0BnC6dXw4rXwGhUO5V4BFKoCCGEKJmqBkHP+aC1gmPLYM1osOzl7UolKVSEEEKUXAHPwguzAA0cCIMN70mxYmGkUBFCCFGy1X0Jnp9mur7rB9gySd08okCkUBFCCFHyNXwFOn5hur71S9j6lbp5RL5JoSKEEKJ0eGI4tP/YdD38M/hnirp5RL5YqR2guBgMBrKzZXiaKJmsra1zV5MVQjxAqzdAMcKmj2HzRNBo4cnRaqcSD1DiCxVFUYiLiyMhIUHtKEIUKTc3Nzw9PdFoNGpHEcK8PTkaFANs/tRUsGh10HKU2qnEfZT4QuV2keLh4YGDg4P8ERcljqIopKWlER8fD4CXl5fKiYSwAE+NNY3+Cf8MNn4AGh20GKl2KnEPJbpQMRgMuUVK2bJl1Y4jRJGxt7cHID4+Hg8PDzkNJER+tH4bjAbY+gVseNd0Gqj5a2qnEnco0YXK7T4pDg4OKicRoujd/j3Pzs6WQkWI/Aoab+qz8s9XsH4CaLTE6DsTERGBv78/er1e7YSlXqkY9SOne0RpIL/nQjwCjQbavANPjgEg9PM38fWtRNu2bfH19SU0NFTlgKJUFCpCCCHEfWk00PZ9YgJCGLo6A6PRNHOt0Whk2LBhxMTEqBywdJNCRQghhNBoiKjQGeMds+sbDAYiIyPVySQAKVTMlqIoDB06FHd3dzQaDYcPH+bGjRt4eHgQHR2dr8fIysqicuXK7N+/v2jDCiFECeBfvTpabd6vRZ1Wg1+1aiolEiCFitlat24d8+bNY/Xq1cTGxlKnTh0+++wzunbtSuXKlfP1GDY2Nrz11luMGzeuaMMKIUQJoNfrmT17dm5ndJ0GZnWyRX/8B1nIUEUletTPnRRFIT3boMpz21vrCtTZMSoqCi8vL1q0aAFAWloaoaGhrF+/vkDP27dvX8aMGcOJEyeoXbt2gfYVQojSJiQkhA4dOhAZGYlfyl70+z+DPTMhJxM6fQNa+f99cStVhUp6toFaHxTsi76wnPykAw42+Xu5g4ODmT9/PmAayeHr68uUKVOwtbXliSeeyN3uk08+YebMmRw7dix3nphOnTqRlpbGpk2b0Gq1lClThpYtW7JkyRImTpxY+AcmhBAljF6v/3dYchBU9IaVI+FAmKlY6fqDaSZbUWykNDRD3333HZ988gl6vZ7Y2Fj27dvHtm3baNSoUZ7t3n33XSpXrszgwYMBmD59Ojt37mT+/Pl5zrM2bdqUbdu2FesxCCFEidCgH3SfY5q59sgv8NsgU8Eiik2palGxt9Zx8pMOqj13frm6uuLs7IxOp8PT0xOACxcu4O3tnWc7nU7HwoULCQwMZPz48UybNo05c+ZQqVKlPNt5e3tz4cKFxz8IIYQojeq+BDobU5FycgVkJEKvhWDrpHayUkHVFpWzZ8/StWtXypUrh4uLC61atSI8PLzInk+j0eBgY6XK5XEn40pPT8fOzu6u26tWrcqUKVP48ssvef7553n55Zfv2sbe3p60tLTHen4hhCjVaj0PfZeBtSOcC4efu0LaTbVTlQqqFiqdO3cmJyeHzZs3c+DAAerXr0/nzp2Ji4tTM5ZZKleuHLdu3brnff/88w86nY7o6GhycnLuuv/mzZuUL1++qCMKIUTJVq0tDFgF9mXg8n4IexaSrqidqsRTrVC5fv06ERERjB8/nnr16uHv788XX3xBWloax48fVyuW2WrQoAEnT5686/alS5eyfPlytmzZwsWLF+/ZYfb48eM0aNCgOGIKIUTJpm8MA9eBszdcOw2hHeC6TAhXlFQrVMqWLUtAQAA///wzqamp5OTkMGvWLDw8PO7qNPpfmZmZJCUl5bmUBh06dODEiRN5WlViYmIYPnw4X375Ja1atSIsLIzPP/+c3bt359l327ZtPPPMM8UdWQghSiaPGhCyHtyrQeJFmNsBrhxWO1WJpVqhotFo+Pvvvzl06BDOzs7Y2dnxzTffsG7dOsqUKXPf/SZNmoSrq2vuxcfHpxhTq6du3bo0bNiQZcuWAaY5YYKDg2natCkjR44ETMXM8OHD6devHykpKQDs2rWLxMREXnrpJdWyCyFEieNWCQatB896kHYd5nWGc1vVTlUiaRSlcKfbGz9+PF9++eUDtzl16hQBAQF069aN7Oxs3n33Xezt7ZkzZw6rVq1i3759eHl53XPfzMxMMjP/f2hYUlISPj4+JCYm4uLikmfbjIwMzp8/T5UqVe7ZEdXSrFmzhrFjx3L8+PG7pnm+n169elG/fn3eeeedIk4n1FbSft+FsAgZSbC4D1zYDlpr6Dod6vdSO5VFSEpKwtXV9Z7f3/9V6MOTx4wZQ3Bw8AO3qVq1Kps3b2b16tXcunUrN+CMGTPYuHEj8+fPZ/z48ffc19bWFltb28KObRE6depEREQEly9fzldLUlZWFnXr1uXNN98shnRCCFEK2blAv99hxatw4g/4YygkxUCr0aZVmcVjK/RCpXz58vkaYXJ7uOydLQNarRaj0VjYsUqMN954I9/b2tjY8N577xVdGCGEEGBtB93ngktF2PUDbPoEEi7Bc1NAV6qmKysSqvVRad68OWXKlGHAgAEcOXKEs2fPMnbsWM6fP0+nTp3UiiWEEEIUnFYLHT6DZ78CNKYp95e8DJkpaiezeKoVKuXKlWPdunWkpKTQtm1bGjduzPbt21m5ciX169dXK5YQQgjx6JoNM81aa2UHEethXidIiVc7lUVTtU2qcePGBV4NWAghhDBrNTvDgNWwuBfEHoY57eDlZeBRU+1kFkkWJRRCCCEKm08TCNkI7lUh4SKEPkPMtl8IDw8nJiZG7XQWRQoVIYQQoiiUrQaDN4FvK0J3Xce3dV/atm2Lr68voaGhaqezGFKoCCGEEEXFwZ2YNt8zdHUmxn9nLTMajQwbNkxaVvJJChULERQUlGdoclpaGt27d8fFxQWNRkNCQkK+HmfLli0F2v620NDQAk3Dv27dOgIDAx861Dw4OBiNRoNGo2HFihUFyvS4oqOj0Wg0HD58+LEe56OPPiIwMLBQMgHMmzcPNze3PD/ffo0KMjxdCGEeIs5fwHjH3KoGg4HIYwdUSmRZpFCxUPPnz2fbtm3s3LmT2NhYXF1dc+9r06YNc+bMKbTnysjI4P333+fDDz/M9z4dO3bE2tqaRYsW5Wvb2NhYnn322ceJWSzuVVC99dZbbNq0qcies1evXsTGxtK8efMiew4hRNHx9/e/a84wnQb89o6H+FMqpbIcUqhYqKioKGrWrEmdOnXw9PRE8+8MiDdv3mTHjh106dKl0J7rt99+w8XFhZYtWxZov+DgYKZNm/bQ7WxtbfH09LTYGYednJwoW7ZskT2+vb09np6e2NjYFNlzCCGKjl6vZ/bs2eh0OgB0Oi2zelZEr1yBn9qZZrQV91W6ChVFgaxUdS4FWFIpNTWVV155BScnJ7y8vPj666/z3B8UFMTXX3/NP//8g0ajISgoKPe+NWvW0LBhQypUqADA2rVrqV69Ovb29rRp04bo6Og8jzVo0CDq1auXu35SVlYWDRo04JVXXsndZsmSJXkKn4yMDGrXrs3QoUNzb4uKisLZ2Zm5c+fm3talSxf2799PVFRUvo/9tnHjxlG9enUcHByoWrUq77//PtnZ2bn33z7dsmDBAipXroyrqyu9e/cmOTk5d5t169bRqlUr3NzcKFu2LJ07d75vFkVR8PPzY8qUKXluP3z4MBqNhsjISCpXrgzACy+8gEajyf35Xqd+5s6dS+3atbG1tcXLyyt34UiAb775hrp16+Lo6IiPjw+vvfZa7iKSQoiSKSQkhOjoaMLDw4mOvkBI6BGo8hRkp8KvwbDhfTDkqB3TLJWuuX2z0+Bzb3We+50rYOOYr03Hjh3L1q1bWblyJR4eHrzzzjscPHgw98tw+fLljB8/nuPHj7N8+fI8/9NetWoVXbt2BeDSpUu8+OKLjBgxgqFDh7J//37GjBmT57mmTZtG/fr1GT9+PN9++y3vvvsuCQkJ/PDDD7nbbN++nf79++f+bGdnx6JFi2jWrBmdOnWic+fO9OvXj6effppBgwblblepUiUqVKjAtm3bqFatWoFeLmdnZ+bNm4e3tzfHjh1jyJAhODs78/bbb+duExUVxYoVK3LXjOrZsydffPEFn332GWAq+EaPHk29evVISUnhgw8+4IUXXuDw4cN3NcNqNBoGDRpEWFgYb731Vu7tYWFhPPXUU/j5+bFv3z48PDwICwujY8eOuf87utOPP/7I6NGj+eKLL3j22WdJTExkx44dufdrtVqmTZtGlSpVOHfuHK+99hpvv/02M2bMKNBrJISwLHq9Hr1e//839PsDNn0MO6eZLrGH4aUwcCynWkZzVLoKFQuQkpJCaGgoCxcupF27doCpP8p/f7nd3d1xcHDAxsYGT0/P3NszMzNZt24dH330EWD6wqxWrVpui0xAQADHjh3Ls7q1k5MTCxcupHXr1jg7OzN16lTCw8NzF4pMSEggMTERb++8BV5gYCCffvopgwcPpnfv3ly4cIHVq1ffdTze3t5cuHChwK/Df9coqly5Mm+99RZLlizJU6gYjUbmzZuHs7MzAP3792fTpk25hUr37t3zPObcuXMpX748J0+epE6dOnc9Z3BwMB988AF79+6ladOmZGdn88svv+S2stxew8rNzS3P636nTz/9lDFjxjBq1Kjc25o0aZJ7/b8dYitXrsynn37Kq6++KoWKEKWNzgqemQgVG8KKEXD+H5jVGnotMN0mgNJWqFg7mFo21HrufIiKiiIrK4tmzZrl3ubu7k5AQMBD9928eTMeHh7Url0bgFOnTuV5HOCeHTKbN2/OW2+9xcSJExk3bhytWrXKvS89PR0wtaLcacyYMaxYsYIffviBv/766579NOzt7XMXoCyIpUuXMm3aNKKiokhJSSEnJ+euZcArV66cW6QAeHl5ER///1NVR0RE8MEHH7Bnzx6uX7+eOwLp4sWL9yxUvL296dSpE3PnzqVp06b8+eefZGZm0qNHj3znjo+P58qVK7lF5r38/fffTJo0idOnT5OUlEROTg4ZGRmkpaXh4JC/3xMhRAlS+wUoXwOW9IWbUTC3Izw3GRq+IiswU9r6qGg0ptMvalyK4Zdt1apVPP/88wXez2g0smPHDnQ6HZGRkXnuK1u2LBqNhlu3bt21X3x8PGfPnkWn0xEREXHPx75582a+VtP+r127dtG3b1+ee+45Vq9ezaFDh3j33XfJysrKs521tXWenzUaTZ7h0F26dOHmzZv89NNP7Nmzhz179gDc9Tj/NXjwYJYsWUJ6ejphYWH06tWrQMWDvb39A++Pjo6mc+fO1KtXj99//50DBw4wffr0h+YSQpRwHjVhaDgEPAeGTPjzdVg+FDKTH75vCVe6ChULUK1aNaytrXO/VAFu3brF2bNnH7ifoij8+eefuf1TAGrWrMnevXvzbLd79+679p08eTKnT59m69atrFu3jrCwsNz7bGxsqFWrFidPnrxrv0GDBlG3bl3mz5/PuHHjOHUq7zC7jIwMoqKiaNCgwYMP+g47d+7E19eXd999l8aNG+Pv71/g00c3btzgzJkzvPfee7Rr146aNWves9i603PPPYejoyM//vgj69aty9PnBkzFkcFguO/+zs7OVK5c+b7DlQ8cOIDRaOTrr7/miSeeoHr16ly5olIrnxDCvNi5Qq9F0O5D0Ojg2DKYHQRxx9ROpiopVMyMk5MTISEhjB07ls2bN3P8+HGCg4Pv6vx5pwMHDpCWlpbntM2rr75KREQEY8eO5cyZM/zyyy/Mmzcvz36HDh3igw8+YM6cObRs2ZJvvvmGUaNGce7cudxtOnTowPbt2/PsN336dHbt2sX8+fPp27cv3bp1o2/fvnlaBXbv3o2trW2B5//w9/fn4sWLLFmyhKioKKZNm8YffxRs+F6ZMmUoW7Yss2fPJjIyks2bNzN69OiH7qfT6QgODmbChAn4+/vflf12ERIXF3ffwuejjz7i66+/Ztq0aURERHDw4EG+//57APz8/MjOzub777/n3LlzLFiwgJkzZxbo2IQQJZhWC0+OhuA14FIRbkSahjDvCy3Q6NGSRAoVMzR58mSefPJJunTpQvv27WnVqhWNGjV64D4rV67kueeew8rq/7sdVapUid9//50VK1ZQv359Zs6cyeeff557f0ZGBv369SM4ODh3+PHQoUNp06YN/fv3z205CAkJYe3atSQmJgJw+vRpxo4dy4wZM/Dx8QFgxowZXL9+nffffz/38RcvXkzfvn0L3O/i+eef580332TkyJEEBgayc+fOPI+bH1qtliVLlnDgwAHq1KnDm2++yeTJk/O1b0hICFlZWQwcOPCu+77++ms2btyIj4/PfVuKBgwYwNSpU5kxYwa1a9emc+fOuafG6tevzzfffMOXX35JnTp1WLRoEZMmTSrQsQkhSgHf5vDqdqje0XQqaM1o+G0gZCSqnazYaRTFsku0pKQkXF1dSUxMvKuzZUZGBufPn6dKlSr37AxaktSrV4/33nuPnj17Fsnj9+jRg4YNGzJhwoR8bX/9+nUCAgLYv38/VapUue92wcHBJCQkFPv0+Q+ybds22rVrx6VLl3LnozEHQUFBBAYGMnXq1HveX5p+34UoNRQFdk2Hvz8EYw6UqQwv/gQ+TdVO9tge9P39X9KiUgJkZWXRvXv3Ip2CfvLkyTg5OeV7++joaGbMmPHAIuW21atX4+TkdM/hzcUpMzOTmJgYPvroI3r06GE2RcqiRYtwcnJi27ZtakcRQhQ3jQZajIRB68G1EtyKhrkdYPOnYMh+6O4lgbSoCFXFx8eTlJQEmIYXOzrmb1K8ojBv3jxCQkIIDAxk1apVVKxYUbUs/5WcnMzVq1cB0xwu5crdezIo+X0XooTLSIS1Y+HoUtPPXoGm1pXy1VWN9ajy26IihYoQJYT8vgtRShxfDqvfhIwEsLKHZyYS49WRiMhI/P39885+a8bk1I8QQghREtV5EV7bBVXbQE46oZ++jq9vJdq2bYuvry+hoaFqJyxUUqgIIYQQlsbFG/otJ6bheIauzsD477kRo9HIsGHDiImJUTdfIZJCRQghhLBEWi0Rzk/kFim3GQwGIg9sVSdTEZBCRQghhLBQ/v7+d00IqtOA3/Y3YOcPYLz/TNqWQgoVIYQQwkLp9Xpmz56NTqcDTLNrzwquh94xCza8C3Paw5VDKqd8PFKoCCGEEBYsJCSE6OhowsPDiY6OJiT0MHSZBrYucOUg/NQW1rwF6QlqR30kUqhYiKCgIN54443cn9PS0ujevTsuLi5oNBoSEhLy9Thbtmwp0Pa3hYaG8swzz+R7+3Xr1hEYGJhnNeN7CQ4ORqPRoNFoCm122kc9RnN4nnnz5uW+Hv99v4UQ4kH0ej1BQUGmockaDTQaACP3Qd0eoBhh30/wQ2M4stTi1gySQsVCzZ8/n23btrFz505iY2NxdXXNva9NmzbMmTOn0J4rIyOD999/nw8//DDf+3Ts2BFra2sWLVqUr21jY2MLbWbdFi1a3PWaFIWieJ5evXoRGxtb4IUchRDiLs6e0H0OvLIKyvpD6jX4YyjM6wxXT6qdLt+kUMmnmJgYwsPDzWbIV1RUFDVr1qROnTp4enqi0WgAuHnzJjt27MhdZLAw/Pbbb7i4uNCyZcsC7RccHMy0adMeup2trS2enp7Y2to+asQ8bGxs8rwmRaUonsfe3h5PT09sbGwK7TGFEKVc1dYwfCe0+8A0QdyF7TCzpWnSuJRraqd7KClU8iE0NBRfX99im0wnNTWVV155BScnJ7y8vPj666/z3B8UFMTXX3/NP//8g0ajISgoKPe+NWvW0LBhw9x1atauXUv16tWxt7enTZs2REdH53msQYMGUa9ePTIzMwHTukENGjTglVdeyd1myZIleQqfjIwMateuzdChQ3Nvi4qKwtnZmblz5+be1qVLF/bv309UVFSBjv9ep1QOHz6MRqPJzX/hwgW6dOlCmTJlcHR0pHbt2qxdu/ae+8+bNw83NzfWr19PzZo1cXJyym3FuS0nJ4fXX38dNzc3ypYty7hx4xgwYADdunXLd84bN27Qp08fKlasiIODA3Xr1mXx4sW521+7dg1PT888K1jv3LkTGxsbNm3aVKDXSAghCsTKBp4cAyP2QM0uptNB++fCtAaw/VvIzlA74X1JofIQMTExDB06NLevRXFMpjN27Fi2bt3KypUr2bBhA1u2bOHgwYO59y9fvpwhQ4bQvHlzYmNjWb58ee59q1atomvXrgBcunSJF198kS5dunD48GEGDx7M+PHj8zzXtGnTSE1Nzb393XffJSEhgR9++CF3m+3bt9O4cePcn+3s7Fi0aBHz589n5cqVGAwG+vXrx9NPP82gQYNyt6tUqRIVKlQoksX0RowYQWZmJv/88w/Hjh3jyy+/fOCiiWlpaUyZMoUFCxbwzz//cPHiRd56663c+7/88ksWLVpEWFgYO3bsICkpqcB9ZjIyMmjUqBFr1qzh+PHjDB06lP79+7N3714Aypcvz9y5c/noo4/Yv38/ycnJ9O/fn5EjR9KuXbtHeh2EEKJAyvhCr4UQvNa0VlBWMvz9EfzQBI7/bpb9V6zUDmDuIiIi7uoQajAYiIyMLJL1FFJSUggNDWXhwoW5X17z58/P81zu7u44ODjknnq4LTMzk3Xr1vHRRx8B8OOPP1KtWrXcFpmAgIDcL/XbnJycWLhwIa1bt8bZ2ZmpU6cSHh6eu+5CQkICiYmJeHt758kZGBjIp59+yuDBg+nduzcXLly45+rH3t7eXLhwoXBenP+4ePEi3bt3p27dugBUrVr1gdtnZ2czc+ZMqlWrBsDIkSP55JNPcu///vvvmTBhAi+88AIAP/zwQ24LTX5VrFgxT/Hzv//9j/Xr17Ns2TKaNjUtyf7cc88xZMgQ+vbtS+PGjXF0dGTSpEkFeh4hhHhslVvCkHA4tgz+/hgSL8Jvg2Dn99DmPfBrZ+qUawaKrEXls88+o0WLFjg4OODm5nbPbS5evEinTp1wcHDAw8ODsWPHkpOTU1SRHsk9J9PR6fDz8yuS54uKiiIrK4tmzZrl3ubu7k5AQMBD9928eTMeHh7Url0bgFOnTuV5HOCenTSbN2/OW2+9xcSJExkzZgytWrXKvS89PR3gnovcjRkzhurVq/PDDz8wd+5cypYte9c29vb2pKWlPTR7Qb3++ut8+umntGzZkg8//JCjR48+cHsHB4fcIgVMKzXHx8cDkJiYyNWrV3OLCTC9x40aNSpQJoPBwMSJE6lbty7u7u44OTmxfv16Ll68mGe7KVOmkJOTw6+//sqiRYsKrW+OEEIUiFYL9XvD/w5Am3fB2tE058qi7hD2LERvN4v+mUVWqGRlZdGjRw+GDx9+z/sNBgOdOnUiKyuLnTt3Mn/+fObNm8cHH3xQVJEeyT0n05k1yyxXp1y1ahXPP/98gfczGo3s2LEDnU5HZGRknvvKli2LRqPh1q1bd+0XHx/P2bNn0el0RERE3POxb968Sfny5QuU53Zh+N+FvbOzs/NsM3jwYM6dO0f//v05duwYjRs35vvvv7/vY1pbW+f5WaPRUNgLh0+ePJnvvvuOcePGER4ezuHDh+nQoQNZWVl5touKiuLKlSsYjca7+gwJIUSxs3GA1m/DG0eh+UiwsoOLuwh9/Wl8K/movthhkRUqH3/8MW+++WZu0/ydNmzYwMmTJ1m4cCGBgYE8++yzTJw4kenTp9/1h11td02mExJSZM9VrVo1rK2t2bNnT+5tt27d4uzZsw/cT1EU/vzzz9z+KQA1a9bM7R9x2+7du+/ad/LkyZw+fZqtW7eybt06wsLCcu+zsbGhVq1anDx591C2QYMGUbduXebPn8+4ceM4depUnvszMjKIioqiQYMGDz7oO9wubP7b2fXw4cN3befj48Orr77K8uXLGTNmDD/99FOBnuc2V1dXKlSowL59+3JvMxgMefoF5ceOHTvo2rUr/fr1o379+lStWvWu9y0rK4t+/frRq1cvJk6cyODBg3NbdoQQQlWO5aDDZ/D6IWKq9DKbxQ5V60y7a9cu6tatmzs6BaBDhw4kJSVx4sSJ++6XmZlJUlJSnktxyDOZThFycnIiJCSEsWPHsnnzZo4fP05wcPBdp5/udODAAdLS0vKctnn11VeJiIhg7NixnDlzhl9++YV58+bl2e/QoUN88MEHzJkzh5YtW/LNN98watQozp07l7tNhw4d2L59e579pk+fzq5du5g/fz59+/alW7du9O3bN0+RuXv3bmxtbQs8J4ifnx8+Pj589NFHREREsGbNmrtGPr3xxhusX7+e8+fPc/DgQcLDw6lZs2aBnue//ve//zFp0iRWrlzJmTNnGDVqFLdu3SrQ0GN/f382btzIzp07OXXqFMOGDePq1at5tnn33XdJTExk2rRpjBs3jurVq+fpgCyEEKpz8SaiUp97L3Z4R6t7cVCtUImLi8tTpAC5P8fFxd13v0mTJuHq6pp78fHxKdKcapg8eTJPPvkkXbp0oX379rRq1eqh/SVWrlzJc889h5XV//ePrlSpEr///jsrVqygfv36zJw5M8/Q2IyMDPr160dwcHDu8OOhQ4fSpk0b+vfvj8FgWswqJCSEtWvXkpiYCMDp06cZO3YsM2bMyH39Z8yYwfXr13n//fdzH3/x4sX07dsXBweHAh2/tbU1ixcv5vTp09SrV48vv/ySTz/9NM82BoOBESNGULNmTTp27Ej16tWZMWNGgZ7nv8aNG0efPn145ZVXaN68OU5OTnTo0OGefXPu57333qNhw4Z06NCBoKAgPD098wxv3rJlC1OnTmXBggW4uLig1WpZsGAB27Zt48cff3zk7EIIUdiKu3/mAykFMG7cOAV44OXUqVN59gkLC1NcXV3veqwhQ4YozzzzTJ7bUlNTFUBZu3btfTNkZGQoiYmJuZdLly4pgJKYmHjXtunp6crJkyeV9PT0ghymRapbt66ydOnSInv8l156Sfn888/zvf21a9cUd3d35dy5cw/cbsCAAUrXrl0fM13hMxgMSvXq1ZX33nvvvtusW7dO0Wg0SmZmZqE/f+vWrZVRo0YVaJ/S9PsuhCh6c+bMUXQ6nQIoOp1OmTNnTqE+fmJi4n2/v/+rQMOTx4wZQ3Bw8AO3edgw0ds8PT3v6j9xu5n8v0Nu72RrayujJO6QlZVF9+7dC20K+nuZPHkyf/75Z763j46OZsaMGVSpUuWh265evRonJyeWLFlC586dHyfmI7tw4QIbNmygdevWZGZm8sMPP3D+/Hlefvnle25/9epVVq5cib+/f6HOIrto0SKGDRtGeno6gYGBhfa4QghRUCEhIXTo0IHIyEj8/PxUG0SiUZSind1l3rx5vPHGG3ct3PbXX3/RuXNnYmNj8fDwAGD27NmMHTuW+Pj4fBcjSUlJuLq6kpiYmDv3x20ZGRmcP3+eKlWqFKgJXxSf+Pj43H5GXl5eODo6qpLj0qVL9O7dm+PHj6MoCnXq1OGLL77gqaeeuuf2jRo1Ijk5mRkzZtC+fftCy5GcnJxbsLu5uVGuXLl87yu/70IIS/Kg7+//KrIJ3y5evMjNmze5ePEiBoMhd9SGn58fTk5OPPPMM9SqVYv+/fvz1VdfERcXx3vvvceIESOkxaQU8fDwyC1U1eTj48OOHTvyvf2BAweKJIezszPOzs5F8thCCGGJiqxQ+eCDD5g/f37uz7eHqIaHhxMUFIROp2P16tUMHz6c5s2b4+joyIABA/LMFiqEEEKI0q3IT/0Utfyc+qlcuTL29vYqJRSieKSnpxMdHS2nfoQQFiG/p35K9KKEt2cjLYop3IUwN7d/z++chVcIISxZiV6UUKfT4ebmljvzp4ODQ4Em8BLCEiiKQlpaGvHx8bi5ueUu9yCEECVBiS5U4P+HOss05aKkc3Nze+DQfiGEsEQlvlDRaDR4eXnh4eFx18J2QpQU1tbW0pIihCiRSnyhcptOp5M/5EIIIYSFKdGdaYUQQghh2aRQEUIIIYTZkkJFCCGEEGbL4vuo3J6v7vZ6MUIIIYQwf7e/tx8276zFFyrJycmAaa0WIYQQQliW5ORkXF1d73u/xU+hbzQauXLlCs7OzoU+mVtSUhI+Pj5cunTpgdP7Wio5PstX0o9Rjs/ylfRjlON7dIqikJycjLe3N1rt/XuiWHyLilarRa/XF+lzuLi4lMhfwNvk+CxfST9GOT7LV9KPUY7v0TyoJeU26UwrhBBCCLMlhYoQQgghzJYUKg9ga2vLhx9+iK2trdpRioQcn+Ur6ccox2f5SvoxyvEVPYvvTCuEEEKIkktaVIQQQghhtqRQEUIIIYTZkkJFCCGEEGZLChUhhBBCmC0pVP7js88+o0WLFjg4OODm5pavfRRF4YMPPsDLywt7e3vat29PRERE0QZ9DDdv3qRv3764uLjg5uZGSEgIKSkpD9wnKCgIjUaT5/Lqq68WU+IHmz59OpUrV8bOzo5mzZqxd+/eB27/66+/UqNGDezs7Khbty5r164tpqSPriDHOG/evLveKzs7u2JMWzD//PMPXbp0wdvbG41Gw4oVKx66z5YtW2jYsCG2trb4+fkxb968Is/5qAp6fFu2bLnr/dNoNMTFxRVP4AKaNGkSTZo0wdnZGQ8PD7p168aZM2ceup+lfA4f5fgs7TP4448/Uq9evdwJ3Zo3b85ff/31wH2K+/2TQuU/srKy6NGjB8OHD8/3Pl999RXTpk1j5syZ7NmzB0dHRzp06EBGRkYRJn10ffv25cSJE2zcuJHVq1fzzz//MHTo0IfuN2TIEGJjY3MvX331VTGkfbClS5cyevRoPvzwQw4ePEj9+vXp0KED8fHx99x+586d9OnTh5CQEA4dOkS3bt3o1q0bx48fL+bk+VfQYwTTDJL/fa8uXLhQjIkLJjU1lfr16zN9+vR8bX/+/Hk6depEmzZtOHz4MG+88QaDBw9m/fr1RZz00RT0+G47c+ZMnvfQw8OjiBI+nq1btzJixAh2797Nxo0byc7O5plnniE1NfW++1jS5/BRjg8s6zOo1+v54osvOHDgAPv376dt27Z07dqVEydO3HN7Vd4/RdwlLCxMcXV1feh2RqNR8fT0VCZPnpx7W0JCgmJra6ssXry4CBM+mpMnTyqAsm/fvtzb/vrrL0Wj0SiXL1++736tW7dWRo0aVQwJC6Zp06bKiBEjcn82GAyKt7e3MmnSpHtu37NnT6VTp055bmvWrJkybNiwIs35OAp6jPn93TVHgPLHH388cJu3335bqV27dp7bevXqpXTo0KEIkxWO/BxfeHi4Aii3bt0qlkyFLT4+XgGUrVu33ncbS/wc3paf47Pkz+BtZcqUUebMmXPP+9R4/6RF5TGcP3+euLg42rdvn3ubq6srzZo1Y9euXSomu7ddu3bh5uZG48aNc29r3749Wq2WPXv2PHDfRYsWUa5cOerUqcOECRNIS0sr6rgPlJWVxYEDB/K89lqtlvbt29/3td+1a1ee7QE6dOhglu8VPNoxAqSkpODr64uPj88D/2dkiSztPXxUgYGBeHl58fTTT7Njxw614+RbYmIiAO7u7vfdxpLfw/wcH1juZ9BgMLBkyRJSU1Np3rz5PbdR4/2z+EUJ1XT7vHGFChXy3F6hQgWzPKccFxd3VxOylZUV7u7uD8z78ssv4+vri7e3N0ePHmXcuHGcOXOG5cuXF3Xk+7p+/ToGg+Ger/3p06fvuU9cXJzFvFfwaMcYEBDA3LlzqVevHomJiUyZMoUWLVpw4sSJIl+8szjc7z1MSkoiPT0de3t7lZIVDi8vL2bOnEnjxo3JzMxkzpw5BAUFsWfPHho2bKh2vAcyGo288cYbtGzZkjp16tx3O0v7HN6W3+OzxM/gsWPHaN68ORkZGTg5OfHHH39Qq1ate26rxvtX4guV8ePH8+WXXz5wm1OnTlGjRo1iSlT48nuMj+q/fVjq1q2Ll5cX7dq1IyoqimrVqj3y44rC17x58zz/E2rRogU1a9Zk1qxZTJw4UcVkIj8CAgIICAjI/blFixZERUXx7bffsmDBAhWTPdyIESM4fvw427dvVztKkcjv8VniZzAgIIDDhw+TmJjIb7/9xoABA9i6det9i5XiVuILlTFjxhAcHPzAbapWrfpIj+3p6QnA1atX8fLyyr396tWrBAYGPtJjPor8HqOnp+ddnTBzcnK4efNm7rHkR7NmzQCIjIxUrVApV64cOp2Oq1ev5rn96tWr9z0WT0/PAm2vtkc5xjtZW1vToEEDIiMjiyJisbvfe+ji4mLxrSn307RpU7P/8h85cmRu5/yHtRpY2ucQCnZ8d7KEz6CNjQ1+fn4ANGrUiH379vHdd98xa9asu7ZV4/0r8X1UypcvT40aNR54sbGxeaTHrlKlCp6enmzatCn3tqSkJPbs2XPf83tFIb/H2Lx5cxISEjhw4EDuvps3b8ZoNOYWH/lx+PBhgDzFWXGzsbGhUaNGeV57o9HIpk2b7vvaN2/ePM/2ABs3bizW96ogHuUY72QwGDh27Jiq71VhsrT3sDAcPnzYbN8/RVEYOXIkf/zxB5s3b6ZKlSoP3ceS3sNHOb47WeJn0Gg0kpmZec/7VHn/iqybrgW6cOGCcujQIeXjjz9WnJyclEOHDimHDh1SkpOTc7cJCAhQli9fnvvzF198obi5uSkrV65Ujh49qnTt2lWpUqWKkp6ersYhPFTHjh2VBg0aKHv27FG2b9+u+Pv7K3369Mm9PyYmRgkICFD27NmjKIqiREZGKp988omyf/9+5fz588rKlSuVqlWrKk899ZRah5BryZIliq2trTJv3jzl5MmTytChQxU3NzclLi5OURRF6d+/vzJ+/Pjc7Xfs2KFYWVkpU6ZMUU6dOqV8+OGHirW1tXLs2DG1DuGhCnqMH3/8sbJ+/XolKipKOXDggNK7d2/Fzs5OOXHihFqH8EDJycm5nzNA+eabb5RDhw4pFy5cUBRFUcaPH6/0798/d/tz584pDg4OytixY5VTp04p06dPV3Q6nbJu3Tq1DuGBCnp83377rbJixQolIiJCOXbsmDJq1ChFq9Uqf//9t1qH8EDDhw9XXF1dlS1btiixsbG5l7S0tNxtLPlz+CjHZ2mfwfHjxytbt25Vzp8/rxw9elQZP368otFolA0bNiiKYh7vnxQq/zFgwAAFuOsSHh6euw2ghIWF5f5sNBqV999/X6lQoYJia2urtGvXTjlz5kzxh8+nGzduKH369FGcnJwUFxcXZeDAgXkKsfPnz+c55osXLypPPfWU4u7urtja2ip+fn7K2LFjlcTERJWOIK/vv/9eqVSpkmJjY6M0bdpU2b17d+59rVu3VgYMGJBn+2XLlinVq1dXbGxslNq1aytr1qwp5sQFV5BjfOONN3K3rVChgvLcc88pBw8eVCF1/twejnvn5fYxDRgwQGnduvVd+wQGBio2NjZK1apV83wezU1Bj+/LL79UqlWrptjZ2Snu7u5KUFCQsnnzZnXC58O9ju3Ov5GW/Dl8lOOztM/goEGDFF9fX8XGxkYpX7680q5du9wiRVHM4/3TKIqiFF17jRBCCCHEoyvxfVSEEEIIYbmkUBFCCCGE2ZJCRQghhBBmSwoVIYQQQpgtKVSEEEIIYbakUBFCCCGE2ZJCRQghhBBmSwoVIYQQQpgtKVSEEEIIYbakUBFCCCGE2ZJCRQghhBBmSwoVIYRZuXbtGp6ennz++ee5t+3cuRMbG5u7lpcXQpR8siihEMLsrF27lm7durFz504CAgIIDAyka9eufPPNN2pHE0IUMylUhBBmacSIEfz99980btyYY8eOsW/fPmxtbdWOJYQoZlKoCCHMUnp6OnXq1OHSpUscOHCAunXrqh1JCKEC6aMihDBLUVFRXLlyBaPRSHR0tNpxhBAqkRYVIYTZycrKomnTpgQGBhIQEMDUqVM5duwYHh4eakcTQhQzKVSEEGZn7Nix/Pbbbxw5cgQnJydat26Nq6srq1evVjuaEKKYyakfIYRZ2bJlC1OnTmXBggW4uLig1WpZsGAB27Zt48cff1Q7nhCimEmLihBCCCHMlrSoCCGEEMJsSaEihBBCCLMlhYoQQgghzJYUKkIIIYQwW1KoCCGEEMJsSaEihBBCCLMlhYoQQgghzJYUKkIIIYQwW1KoCCGEEMJsSaEihBBCCLMlhYoQQgghzNb/AWQciP6B8ZBjAAAAAElFTkSuQmCC\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# get the gradient as a function of x\n", "df_jax = jax.grad(f)\n", "\n", "# get a set of points to feed the derivative function one by one (for now)\n", "xs_jax = jnp.linspace(-1, 3, 21)\n", "df_jax_eval = [df_jax(x) for x in xs_jax]\n", "\n", "plt.plot(xs, f(xs), label=\"f(x)\")\n", "plt.plot(xs, df(xs), label=\"df/dx(x) [analytical]\")\n", "plt.plot(xs_jax, df_jax_eval, \"k.\", label=\"df/dx(x) [using jax]\")\n", "plt.xlabel(\"x\")\n", "plt.legend()\n", "plt.show()\n" ] }, { "cell_type": "markdown", "id": "be79405a-621a-4170-9799-ef65efc68335", "metadata": {}, "source": [ "Note: `jax` provides several other useful gradient wrappers, which can be used in different contexts. \n", "\n", "For example [jax.value_and_grad](https://jax.readthedocs.io/en/latest/_autosummary/jax.value_and_grad.html) returns both the function return value and the gradient value, which is useful to avoid repetitive computation if you need the value as the `jax.grad` call must evaluate `f`." ] }, { "cell_type": "code", "execution_count": 5, "id": "9d26f7d1-124b-4e0d-9f34-75cbf4030ad9", "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "f_and_df = jax.value_and_grad(f)\n", "vals_and_grads = [f_and_df(x) for x in xs_jax]\n", "fs, dfs = list(zip(*vals_and_grads))\n", "\n", "plt.plot(xs_jax, fs, label=\"f(x)\")\n", "plt.plot(xs, df(xs), label=\"df/dx(x) [analytical]\")\n", "plt.plot(xs_jax, df_jax_eval, \"k.\", label=\"df/dx(x) [using jax]\")\n", "plt.xlabel(\"x\")\n", "plt.legend()\n", "plt.show()\n" ] }, { "cell_type": "markdown", "id": "a727c6f0-b26a-4b3e-9582-148098f136ec", "metadata": {}, "source": [ "We can also take an elementwise gradient using [jax.vmap](https://jax.readthedocs.io/en/latest/_autosummary/jax.vmap.html), which vectorizes our gradient function." ] }, { "cell_type": "code", "execution_count": 6, "id": "9abb7392-9e0c-4cd6-8fd3-6ce78f563fce", "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "df_jax_vectorized = jax.vmap(jax.grad(f))\n", "\n", "# get a set of points to feed the derivative function one by one (for now)\n", "df_jax_eval = df_jax_vectorized(xs)\n", "\n", "plt.plot(xs, f(xs), label=\"f(x)\")\n", "plt.plot(xs, df(xs), label=\"df/dx(x) [analytical]\")\n", "plt.plot(xs, df_jax_eval, \"k-.\", label=\"df/dx(x) [using jax]\")\n", "plt.xlabel(\"x\")\n", "plt.legend()\n", "plt.show()\n" ] }, { "cell_type": "markdown", "id": "18a7936e-9919-4ace-85bf-d8c14d124649", "metadata": {}, "source": [ "Before we continue, there are a few things to watch out for when using jax for gradient calculation:\n", "\n", "1. `jax.grad` outputs doesn't automatically convert input arguments from `int` to `float`, so avoid passing `int` types to your functions." ] }, { "cell_type": "code", "execution_count": 7, "id": "d648c131-b674-49a7-b441-ca6569e6540d", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1.7015114\n", "TypeError('grad requires real- or complex-valued inputs (input dtype that is a sub-dtype of np.inexact), but got int32. If you want to use Boolean- or integer-valued inputs, use vjp or set allow_int to True.')\n" ] } ], "source": [ "# ok\n", "print(df_jax(1.0))\n", "\n", "# errors\n", "try:\n", " df_jax(1)\n", "except TypeError as e:\n", " print(repr(e))\n" ] }, { "cell_type": "markdown", "id": "003ef198-e0a2-495f-844e-adeff0563c1d", "metadata": {}, "source": [ "2. When differentiating with respect to several arguments, you need to tell `jax.grad` which arguments you want to take the derivative with respect to as a tuple in indices. Otherwise it will take the derivative with respect to only the first argument." ] }, { "cell_type": "code", "execution_count": 8, "id": "b42164ce-41df-4bb2-8e23-eb11b2a45547", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "dgdx=1.0\n", "dgdx=1.0, dgdy=1.0, dgdz=2.0\n" ] } ], "source": [ "def g(x, y, z):\n", " return x * y + z**2\n", "\n", "\n", "# only gives dg/dx\n", "dg = jax.grad(g)\n", "dgdx = dg(1.0, 1.0, 1.0)\n", "print(f\"dgdx={dgdx}\")\n", "\n", "# gives derivative w.r.t. all three args\n", "dg_all = jax.grad(g, argnums=(0, 1, 2))\n", "dgdx, dgdy, dgdz = dg_all(1.0, 1.0, 1.0)\n", "print(f\"dgdx={dgdx}, dgdy={dgdy}, dgdz={dgdz}\")\n" ] }, { "cell_type": "markdown", "id": "cbb36cd5-fef1-47d1-b25f-1fb7cc0d882b", "metadata": {}, "source": [ "## Incorporating Automatic Differentiation in `Tidy3D`\n", "\n", "With that basic introduction to automatic differentiation using `jax`, we can now show how the `tidy3d.plugins.adjoint`lets us do the same thing but where our functions can now involve setting up, running, and postprocessing a `tidy3d.Simulation`.\n", "\n", "We'll need to import special `Jax` components from the adjoint plugin for this to work. These components are registered with `jax` so it knows how to handle them in its automatic differentiation pipeline.\n", "\n", "We'll also need to import a special `web.run()` wrapper from the plugin. This [tidy3d.plugins.adjoint.web.run](../_autosummary/tidy3d.plugins.adjoint.run.html) function operates the same as `web.run()`, except its derivative rules are defined in the backend using the adjoint method. Thus, `jax` will know how to \"differentiate\" [tidy3d.plugins.adjoint.web.run](../_autosummary/tidy3d.plugins.adjoint.run.html) and it can be used within a function that we want to take derivatives with respect to.\n", "\n", "\n", "Here is a diagram showing how the input arguments of our function `f` are related to the `JaxSimulation` and how the `JaxSimulationData` output of `tidy3d.plugins.adjoint.web.run` is related to the return value of `f`. This diagram can be a useful reference when moving through this section.\n", "\n", "\n", "\n", "### Introducing `JaxSimuation`\n", "\n", "Now we will show how to set up a very simple function using the adjoint plugin and differentiate it.\n", "\n", "First, both our `Simulation` and some of its `.structures` may be dependent on the function arguments. Therefore, we need to use a special `Simulation` subclass called [JaxSimulation](../_autosummary/tidy3d.plugins.adjoint.JaxSimulation.html).\n", "\n", "[JaxSimulation](../_autosummary/tidy3d.plugins.adjoint.JaxSimulation.html) is just a `jax`-compatible stand in for `Simulation` and behaves almost entirely the same, except for a few important differences:\n", "\n", "1. it accepts an additional field `.input_structures`. These `input_structures` are tidy3d structures that can depend on the function arguments, and therefore need to be, `jax`-compatible, themselves. Thus, the structures used in this field must be of the `jax`-compatible type [JaxStructure](../_autosummary/tidy3d.plugins.adjoint.JaxStructure.html), which itself contains a `.medium` field of type [JaxMedium](../_autosummary/tidy3d.plugins.adjoint.JaxMedium.html) and a `.geometry` field that is of type [JaxBox](../_autosummary/tidy3d.plugins.adjoint.JaxBox.html). The `center`, `size`, and `permittivity` fields of these components may all depend on the function input arguments and the final gradients of the function will be given with respect to the values these fields.\n", "\n", "> At the time of publishing, only `JaxStructures` with geometry of `JaxBox` are supported. However, the medium may contain [JaxMedium](../_autosummary/tidy3d.plugins.adjoint.JaxMedium.html), [JaxAnisotropicMedium](../_autosummary/tidy3d.plugins.adjoint.JaxAnisotropicMedium.html), or [JaxCustomMedium](../_autosummary/tidy3d.plugins.adjoint.JaxCustomMedium.html). \n", "\n", "> Any extraneous `Structures` can be added to the `JaxSimulation.structures` as long as they don't depend on the funciton\u00a0arguments. These structures will still influence the simulation result as normal, but are \"static\". \n", "\n", "> The `input_structures` are always assumed to be added *on top of* the existing `.structures`.\n", "\n", "2. it accepts another additional field `.output_monitors`, which define the set of monitors with corresponding data that the return value of our function will depend on. Note that at the time of writing, only `ModeMonitor` are supported.\n", "\n", "3. to convert a `JaxSimulation` to a `Simulation`, one may call `sim, info = JaxSimulation.to_simulation()` where the `sim` is the `Simulation` with all `structures` and `monitors` put together and `info` is just a special information container that is needed to reconstruct the `JaxSimulation` from `sim` using `JaxSimulation.from_simulation(sim, info)`.\n", "\n", "Let us now import these new `Jax` Tidy3d types and use them in an example." ] }, { "cell_type": "code", "execution_count": 9, "id": "f304ea94-34df-4741-ab99-87003884eee7", "metadata": {}, "outputs": [], "source": [ "import tidy3d as td\n", "from tidy3d.plugins.adjoint import JaxSimulation, JaxStructure, JaxMedium, JaxBox\n" ] }, { "cell_type": "markdown", "id": "e54cc9fa-b5f2-4f62-b31e-3a0e1fa7acac", "metadata": {}, "source": [ "### Simulation example\n", "\n", "In our example, we will set up a function that involves a simulation of transmission through a waveguide in the presence of a scatterer.\n", "\n", "This scatterer geometry and material properties will depend on the function input arguments.\n", "\n", "The output of the function will simply be the power transmitted into the 0th order mode.\n", "\n", "We will then take the gradient of the output of this function (power) with respect to the scatterer geometric and medium properties using `jax`.\n", "\n", "To start, it can often be helpful to break our function up into a few parts for debugging.\n", "\n", "Therefore, we will introduce one function to make the `JaxSimulation` given the input arguments and one function to postprocess the result." ] }, { "cell_type": "code", "execution_count": 10, "id": "3cbe5188-a552-40db-a1e6-ddb4af0ead63", "metadata": {}, "outputs": [], "source": [ "def make_simulation(center: float, size: float, eps: float) -> JaxSimulation:\n", " \"\"\"Makes a simulation with a variable scatter width, height, and relative permittivity.\"\"\"\n", "\n", " wavelength = 1.0\n", " freq0 = td.C_0 / wavelength\n", " dl = 0.02\n", "\n", " # a \"static\" structure\n", " waveguide = td.Structure(\n", " geometry=td.Box(size=(td.inf, 0.3, 0.2)), medium=td.Medium(permittivity=2.0)\n", " )\n", "\n", " # our \"forward\" soruce\n", " mode_src = td.ModeSource(\n", " size=(0, 1.5, 1.5),\n", " center=(-0.9, 0, 0),\n", " mode_index=0,\n", " source_time=td.GaussianPulse(freq0=freq0, fwidth=freq0 / 10),\n", " direction=\"+\",\n", " )\n", "\n", " # a monitor to store data that our overall function will depend on\n", " mode_mnt = td.ModeMonitor(\n", " size=(0, 1.5, 1.5),\n", " center=(+0.9, 0, 0),\n", " mode_spec=mode_src.mode_spec,\n", " freqs=[freq0],\n", " name=\"mode\",\n", " )\n", "\n", " # the structure that depends on the input parameters, which we will differentiate our function w.r.t\n", " scatterer = JaxStructure(\n", " geometry=JaxBox(\n", " center=center,\n", " size=size,\n", " ),\n", " medium=JaxMedium(permittivity=eps),\n", " )\n", "\n", " return JaxSimulation(\n", " size=(2, 2, 2),\n", " run_time=1e-12,\n", " structures=[waveguide],\n", " input_structures=[scatterer],\n", " sources=[mode_src],\n", " output_monitors=[mode_mnt],\n", " boundary_spec=td.BoundarySpec.all_sides(td.PML()),\n", " grid_spec=td.GridSpec.uniform(dl=dl),\n", " )\n" ] }, { "cell_type": "markdown", "id": "f4dcb88e-490f-4579-bb7d-4166bd6a3be5", "metadata": {}, "source": [ "> Note: adding `.monitors` to the `JaxSimulation` will work as intended, but the function being differentiated should not depend on data corresponding to these monitors. This can, however,be useful for debugging, for example by examining field patterns, as the data will still be accessible in the output data.\n", "\n", "Let's try setting up the simulation and plotting it for starters." ] }, { "cell_type": "code", "execution_count": 11, "id": "f4da7dc4-b13b-4c62-8590-4877ed71422a", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAABSoAAAHCCAYAAADo9PdCAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy88F64QAAAACXBIWXMAAA9hAAAPYQGoP6dpAACxSElEQVR4nOzdeZhjVYE+/vcmN0tVqqoTqovuakA2l2bfRAQXFFtRGcdlZFwYcdABwW0Qx4WfDAqOw4yjgguCOIPMqPhl8FHUUVFAEBUGRcBBZBNRBLqhk04qlXRV7r3J+f0RTm6SynL3per9PE8/2tVJ5Xa93HP6vrk5RxFCCBARERERERERERGFKBH2ARARERERERERERGxqCQiIiIiIiIiIqLQsagkIiIiIiIiIiKi0LGoJCIiIiIiIiIiotCxqCQiIiIiIiIiIqLQsagkIiIiIiIiIiKi0LGoJCIiIiIiIiIiotCxqCQiIiIiIiIiIqLQsagkIiIiIiIiIiKi0LGoJIq5m266CYqi4Kabbgr7UIiIiFzjvEZERKsJ5zUie1hUEsXEF7/4RVxxxRVhH4YjV155JS666KKwD6PHf/zHf2C//fZDNpvFM57xDHz+85+3/NxGo4EPfehD2LRpEyYmJnDUUUfhuuuuG/jYW265Bc9//vMxOTmJjRs34r3vfS9qtZpXfw0iotjivOYtzmtEROHivOaNVquFT37yk9h7772RzWZx8MEH4xvf+Ibl51cqFZx22mmYm5tDLpfDi1/8Ytxxxx0DH/vd734Xhx9+OLLZLJ72tKfhox/9KAzD8OqvQk4JIoqFAw44QBx77LErvt5sNsXS0pJoNpvBH5RFJ5xwgthzzz3DPoyOSy+9VAAQf/VXfyUuu+wy8Za3vEUAEP/yL/9i6flvfOMbhaqq4h/+4R/El770JXH00UcLVVXFz372s57H3XnnnSKbzYrDDjtMXHLJJeIjH/mIyGQy4uUvf7kffy0ioljhvOYdzmtEROHjvOaND3/4wwKAOPXUU8Vll10mTjjhBAFAfOMb3xj73GazKY455hiRy+XExz72MfGFL3xB7L///mJ6elo88MADPY/9wQ9+IBRFES9+8YvFZZddJt7znveIRCIhTj/9dL/+amQRi0qKlVqtFvYhhGbYxBcHUZr4du7cKWZnZ8UJJ5zQ8/WTTjpJ5HI5sWPHjpHPv+222wQA8W//9m+dry0tLYl9991XHH300T2PfcUrXiHm5+fFwsJC52tf/vKXBQDxox/9yIO/DRHFHee1Y8M+DEc4r3FeI6LBOK8dG/ZhOBKVee3RRx8VqVRKvOtd7+p8rdVqiRe84AVi9913F4ZhjHz+VVddJQCIq6++uvO1J598UuTzefGmN72p57H777+/OOSQQ4Su652vfeQjHxGKooh7773Xo78ROcGikkLz6KOPire97W1ifn5epNNpsddee4nTTz9dNBoNIYQQX/nKVwQAcdNNN4kzzjhDzM3NiXw+33n+xRdfLPbff3+RTqfF/Py8eOc73ynK5XLPazzwwAPida97ndiwYYPIZDJit912E294wxtEpVLpPObHP/6xeN7znifWrVsncrmceOYznynOPvvsscdv5XnLy8vi3HPPFfvuu69Ip9Ni9913Fx/4wAfE8vLyiu/31a9+VRx55JFiYmJC5PN58YIXvKDzj/4999xTAOj5JSfBG2+8UQAQN954Y8/3++///m9x+OGHi2w2K2ZnZ8VJJ50kHn300Z7HvPWtbxW5XE48+uij4tWvfrXI5XJi/fr14v3vf//YSUAIIa655hrxyle+spPhPvvsI84///ye5x577LErjn3UJHj55ZcLAOI//uM/er7+iU98QgAQ3//+98ce1yjf//73B36fW265RQAQX/3qV0c+/wMf+IBIJpM9F2lCCPHP//zPAoB45JFHhBBCLCwsCFVVxQc+8IGexzUaDTE1NSXe/va3u/p7EFH0cF7rxXmt7YUvfKE4+OCDB/7ZM5/5TPGyl71s7HGNwnmNiPzCea0X5zXzmPofL3999KMfHXtMo1x88cUCgLjnnnt6vn7llVcKACvu9O934oknig0bNqy4e/W0004Tk5OTnVzvueceAUBcfPHFPY977LHHBADx8Y9/3NXfg9xRPfoEOZEtjz/+OJ7znOd01o/YvHkzHnvsMXzzm9/Ezp07kU6nO4995zvfibm5OZx77rmo1+sAgI997GM477zzsGXLFpxxxhm4//77cckll+BXv/oVfvGLXyCVSkHTNBx//PFoNBp4z3veg40bN+Kxxx7D//zP/6BSqWDdunW455578Bd/8Rc4+OCDcf755yOTyeD3v/89fvGLX4w8fivPa7Va+Mu//Ev8/Oc/x2mnnYb99tsPd999Ny688EI88MADuOaaazqPPe+88/Cxj30MxxxzDM4//3yk02ncdttt+MlPfoKXvexluOiii/Ce97wHU1NT+MhHPgIA2LBhw9Dju+KKK3DKKafgyCOPxAUXXIAnnngCn/3sZ/GLX/wCd955J/L5fOexzWYTxx9/PI466ih86lOfwvXXX49Pf/rT2HfffXHGGWeM/DlcccUVmJqawllnnYWpqSn85Cc/wbnnnotqtYp/+7d/AwB85CMfwcLCAh599FFceOGFAICpqamh3/OUU07Bt771LZx11ll46Utfij322AN33303zjvvPLz97W/HK1/5ys5jy+Uyms3myGMEgMnJSUxOTgIA7rzzTgDAs5/97J7HHHHEEUgkErjzzjvxN3/zN0O/15133olnPvOZmJmZ6fn6c57zHADAXXfd1TlmwzBWvE46ncahhx7aOQ4iWh04r3FeG+Ytb3kLTj31VPz2t7/FgQce2Pn6r371KzzwwAM455xzOl/jvEZEUcF5jfPaMO94xzuwZcuWnq9de+21+PrXv45dd92187VisTjy2KTp6WlkMhkA7Tkpl8thv/3263mMnJPuvPNOPP/5zx/6ve68804cfvjhSCR6t2N5znOeg8suuwwPPPAADjrooKFz56ZNm7D77rtzTgtb2E0prU0nn3yySCQS4le/+tWKP2u1WkII8x265z//+T3v+Dz55JMinU6Ll73sZT3vlHzhC18QAMTll18uhGivo4S+2777XXjhhQKA2L59u63jt/K8r371qyKRSKx410euI/WLX/xCCCHEgw8+KBKJhHjta1+74p0f+bMQYvhHCfrfodM0Tey6667iwAMPFEtLS53H/c///I8AIM4999zO1+S7Yeeff37P9zzssMPEEUccMfqHINofN+v3jne8o+fdKiHsf5Rg69atYpdddhEvfelLRaPREIcddph42tOetuJuj0HvXA761f3O3rve9S6RTCYHvu7c3Jx44xvfOPLYDjjgAHHcccet+Lp8V+7SSy8VQghx9dVXCwDi5ptvXvHYE088UWzcuHHcj4GIYoTzGue1YSqVishms+JDH/pQz9ff+973ilwu1/MxSc5rRBQVnNc4r1n14IMPinXr1omXvvSlPf8dWJnPAIivfOUrPcexzz77rHiNer0uAIgPf/jDI48ll8uJt73tbSu+Lj99cO211wohhPi3f/u3nk8NdDvyyCPFc5/7XKt/ffIBd/2mwLVaLVxzzTV41ateteIdDABQFKXn96eeeiqSyWTn99dffz00TcOZZ57Z807JqaeeipmZGXz/+98HAKxbtw4A8KMf/Qg7d+4ceCzynarvfOc7aLValv8OVp539dVXY7/99sPmzZtRLBY7v4477jgAwI033ggAuOaaa9BqtXDuueeueOen/2dhxe23344nn3wS73znO5HNZjtfP+GEE7B58+bOz6fb6aef3vP7F7zgBfjDH/4w9rUmJiY6/39xcRHFYhEveMELsHPnTtx33322j13auHEjLr74Ylx33XV4wQtegLvuuguXX375irs9vv71r+O6664b++vkk0/uPGdpaannHeBu2WwWS0tLI49taWmp845f/3Pln3f/77DHjnsdIooPzmuc10ZZt24dXv3qV+Mb3/gGhBAA2nfHXHXVVXjNa16DXC7XeSznNSKKAs5rnNesqtfreO1rX4tCoYBvfOMbPf8dWJnPrrvuOhx//PGd51idk4bhnLY68KPfFLjt27ejWq32fPxplL333rvn93/6058AAM961rN6vp5Op7HPPvt0/nzvvffGWWedhc985jP4+te/jhe84AX4y7/8S/zN3/xNZ1J8wxvegH//93/H3/3d3+HDH/4wXvKSl+B1r3sdXv/616+YhLpZed6DDz6Ie++9F3NzcwO/x5NPPgkAeOihh5BIJLD//vtb+nmMM+znAwCbN2/Gz3/+856vZbPZFcdYKBRQLpfHvtY999yDc845Bz/5yU9QrVZ7/mxhYcHuofd44xvfiK997Wv4/ve/j9NOOw0veclLVjzmec97nu3vOzExAU3TBv7Z8vJyz2Q+7PmNRmPgc+Wfd//vsMeOex0iig/Oa22c14Y7+eSTcdVVV+FnP/sZXvjCF+L666/HE088gbe85S09j+O8RkRRwHmtjfPaeKeeeioeeugh3HLLLZidne35s/6Ph1thdU5y+3zOadHGopIiz80g8elPfxp/+7d/i+985zv48Y9/jPe+97244IIL8L//+7/YfffdMTExgZtvvhk33ngjvv/97+Paa6/FVVddheOOOw4//vGPe94R6j+mcc9rtVo46KCD8JnPfGbg99hjjz0c/728NOzvOE6lUsGxxx6LmZkZnH/++dh3332RzWZxxx134EMf+pCtdzwHKZVKuP322wEAv/vd79BqtVb8Y2T79u2W1vKamprqrLMyPz+PZrOJJ598smcNFU3TUCqVsGnTppHfa35+Ho899tiKr2/duhUAOs+fn5/v+Xr/Y8e9DhGtXpzX/BXFee3444/Hhg0b8LWvfQ0vfOEL8bWvfQ0bN25ccRHHeY2I4ojzmr+iOK8BwGc/+1l84xvfwNe+9jUceuihK/5827Ztlr7PunXrOv8Nzc/P48Ybb4QQoudu1f45aZj5+fmh81T387vntP6ct27d2lkTk8LBj35T4Obm5jAzM4Pf/va3jp6/5557AgDuv//+nq9rmoaHH3648+fSQQcdhHPOOQc333wzfvazn+Gxxx7DpZde2vnzRCKBl7zkJfjMZz6D3/3ud/jEJz6Bn/zkJ51b/YcZ97x9990XO3bswEte8hJs2bJlxS/5Dtq+++6LVquF3/3udyNfz+rHCob9fOTX+n8+Tt10000olUq44oor8Pd///f4i7/4C2zZsgWFQmHFY518JOJd73oXFhcXccEFF+DnP/85LrroohWPOfLIIzE/Pz/216c+9anOc+QkKktQ6fbbb0er1Ro4yXY79NBD8cADD6x4R/K2227r+f4HHnggVFVd8TqapuGuu+4a+zpEFB+c1zivjZNMJvHmN78Z3/zmN1Eul3HNNdfgTW9604qLT85rRBQFnNc4r43zs5/9DP/wD/+AM888EyeddNLAx1iZz+bn53HVVVd1nnPooYdi586duPfee3u+V/+cNMyhhx6KO+64Y0UJe9ttt2FychLPfOYze75P/5z2+OOP49FHH+WcFjIWlRS4RCKB17zmNfje9763YmAA0Fm/aZgtW7YgnU7jc5/7XM9j/+M//gMLCws44YQTAADVahWGYfQ896CDDkIikejc4r1jx44V318OSoNuA5esPO+v//qv8dhjj+HLX/7yiscuLS11dsR7zWteg0QigfPPP3/FgNr998vlcqhUKkOPSXr2s5+NXXfdFZdeemnP3+GHP/wh7r333s7Pxy15cdV9jJqm4Ytf/OKKx+ZyOVsfLfjmN7+Jq666Cv/yL/+CD3/4w3jjG9+Ic845Bw888EDP45ys5XXcccdhl112wSWXXNLzvS655BJMTk72/HyKxSLuu+++njVzXv/616PZbOKyyy7rfK3RaOArX/kKjjrqqM47cuvWrcOWLVvwta99DYuLi53HfvWrX0WtVsOJJ55o+edBRNHGeY3zmhVvectbUC6X8Y53vAO1Wm3gTtyc14goCjivcV4bZevWrfjrv/5rPP/5z+/sHD6IkzUqX/3qVyOVSvUcoxACl156KXbbbTccc8wxPcdx3333Qdf1ztde//rX44knnsC3vvWtzteKxSKuvvpqvOpVr+qsSXnAAQdg8+bNuOyyy3o+yXDJJZdAURS8/vWvt/SzIJ+EsIEPkXj00UfFxo0bxeTkpDjzzDPFl770JfGxj31MHHDAAaJcLgshzF3kBu0099GPflQAEC972cvEF77wBfGe97xHJJNJceSRRwpN04QQQnz7298Wu+22mzjzzDPFF7/4RfG5z31OHHnkkSKVSolbb71VCCHE3//934vDDjtMnHPOOeLLX/6y+MQnPiF22203sfvuu4tKpTL0+K08r9lsile+8pVCURTxxje+UXz+858XF110kTj99NPFLrvs0vP3+sd//EcBQBxzzDHiU5/6lPj85z8vTj755J5dzd75zncKRVHExz/+cfGNb3xD3HDDDUKIlbvIdf/sjjrqKHHRRReJs88+W0xOToq99tqr8/MVor2LXC6XG/rzHaVYLIpCoSD23HNP8elPf1p85jOfEYcddpg45JBDVhzPJz/5SQFAvO997xNXXnml+O53vzv0+z7xxBNi/fr14sUvfnFnF71isSg2bNggjj766BU77Tlx8cUXCwDi9a9/vfjyl78sTj75ZAFAfOITn+h5nPw5dP9dhGjvbqqqqvjABz4gvvSlL4ljjjlGqKoqfvrTn/Y87te//rXIZDLisMMOE5dccon4yEc+IrLZrHjZy17m+u9ARNHCeY3zmhUHHnigACD2228/S4+3ivMaEXmN8xrntWFe//rXi2QyKT7zmc+Ir371qz2/fvOb34w8Jis+8IEPCADitNNOE1/+8pfFCSecIACIr3/96z2PkzuiP/zww52vGYYhnvvc54qpqSlx3nnniYsvvlgccMABYnp6Wtx33309z//e974nFEURxx13nLjsssvEe9/7XpFIJMSpp57q+u9A7rCopND86U9/EieffLKYm5sTmUxG7LPPPuJd73qXaDQaQojRE58QQnzhC18QmzdvFqlUSmzYsEGcccYZPYP6H/7wB/G2t71N7LvvviKbzYpddtlFvPjFLxbXX3995zE33HCDePWrXy02bdok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QqBcLsMwjM47A+VyGaqqolAo9ISt6zoajQZe+cpXYt26dZ4fCxGRXQsLC7jmmmswNTUV2Mcv6vU6arUapqamMDk52TOGLi0tBXIMceL3vDYqj3FrhnJeI6KoWVhYwA9+8IPOXSte03Ud5XIZExMTKBQK2LlzZ2cM7d9xXN4tSCav5zQ7eVj5XpzTiChqvJzX7PRXg1id11Z1Ublx40Y88cQTPV974oknMDMzM/TOE3kLb79UKuX5RbhcCLbVamHXXXftfH+5UGu1Wl2x3kCz2cS6deuwyy67eHosREROJRIJ1Go17Lrrrr6/q7i4uIidO3cin8931mnZddddUSqVsLCwEFhZGgYncxrg77w2Lg8r6wdxXiOiqJGbs3k9p2iahoWFBWQymc6/8eWGLtVqFaqq9qx3FqcN4pwI+1rNbh5WcE4joijyYl5z0l/1szqvxXvF5jGOPvpo3HDDDT1fu+6663D00UeHdESmUbtVDdrdiogoqtLpNAzD8H28Gra7XvdufJVKxbfXD1vU5jQreXTvjkhEtJaN2p110G6ua0GY8xrzICKyLuj+KlZFZa1Ww1133YW77roLAPDwww/jrrvuwiOPPAKg/VGAk08+ufP4008/HX/4wx/wwQ9+EPfddx+++MUv4r//+7/xvve9L4zD7xgVssSykojiIpFIoFAo+DpeDSvFuo9hdnY28DVz3IjznGY1D5aVRESjSzFpNZRjcZnX1koeREReCKO/ilVRefvtt+Owww7DYYcdBgA466yzcNhhh+Hcc88FAGzdurUzEQLA3nvvje9///u47rrrcMghh+DTn/40/v3f/x3HH398KMcPWAtZ6g97tS+oTUTxlUqlfHtzZVwpJiUSCeTzec9e129xndPs5MGykojiyMs5zEopJsW9HIvDvLaW8iAicstNf+VmLo3PrScAXvSiF40s66644oqBz7nzzjtdv3a9Xne9KLKdkCUZdrFY7Cz0TEQURd3jValUGnsBYIXVUkwKevc/N8Kc05yym4csK0ulEorFouW5j4goTJqmebJGpZ1STJJja7VajdWcBkR/XnObR/fviYhWO7f9lZvrwVjdURmmer3u6p00JyFLMmzDMHhHChFFmpfvpNktxchfTvPgnZVEFDeKoqBcLrsar5yUYpK8k69erzt+ferlRR68s5KI1gov+is314MsKi3K5XKO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DZucWFISEa00qqxkSRmOfD4fah6JRAKFQgGKovj2GkREXhhVVrKkjJYg82BZSURxoaoqpqamQu2v0uk08vm8pcdyJnWhf3JiSUlENNygspIlZXhSqVToeSiKwrmSiGJhUFnJkjI6dF0PJY/u68F6vW55/TUioqD1bxAdRn+VSqUsPU71+ThWPXkhV61WUa1WoSgKS0oioiFkWVksFrF161YAYEkZoijkwTsqiSguZFlZKpWwfft2AO1xlCVl+MrlMhqNRih5yDmzUqnwGpCIIi0u/RVnVA/kcrnO/89kMpELmYgoStLpNDKZTOf33WMoBY95EBFZl0gkMDMz0/n9zMwMS8oICSsPzp1EFBdx6K9iM6vu2LEDJ510EmZmZpDP5/H2t78dtVpt5HNe9KIXQVGUnl+nn366p8clb5dVFAXZbBbLy8tco4SIaITFxUUsLy8jm81CUZSxu4GvVlGZ15gHEZF1mqahVCohlUohlUqhVCpxUzCEP6epqhpaHt3Xg8lkMtDXJiKyIy79VWw++n3SSSdh69atuO6666DrOk455RScdtppuPLKK0c+79RTT8X555/f+f3k5KRnxzToM/1yfS8A/CgjEVGf/jUQ5XpSpVJpzX10LgrzWhTyYClKRHHRvwYiAJRKJRSLxUh+dC5IYc9phUIBMzMzgefRfT1YKBTQbDZ9f00iIieEELHpr2JRVN5777249tpr8atf/QrPfvazAQCf//zn8cpXvhKf+tSnsGnTpqHPnZycxMaNGz0/pmELj3Z/5r/790REa92gjVq610hcS2VlFOY1ueh/mHnIzQ+IiKJu2EYtcs3KtVxWRmFOUxSlZw3RIPLovx4EwKKSiCJJCIFyuYxWqxVqf1Wv1y09LhZXg7feeivy+Xxn4gOALVu2IJFI4Lbbbhv53K9//etYv349DjzwQJx99tnYuXPnyMc3Go3OwqLyV79xuyP17wZORLTWjdpNetBu4KtdFOa1er0eah6apqFcLnMzHSKKvFG7SQ/aDXyticKcJgWVRxi75RIROaVpGgzDCLW/WlxctFxUxuKOym3btmHXXXft+Zqqqthll12wbdu2oc9785vfjD333BObNm3C//3f/+FDH/oQ7r//fnzrW98a+pwLLrgA55133tA/tzop8c7KcB3yxfeFfQhE9JRRJaW01u6sjMK8lsvlQstDXvSr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YM7MzIT+H1gc8Oc0Hn9G1vDnNF6Ufkbr1q0L+xAijfNaPPFnZA1/TuPxZ2RNVH5OnNNG45wWX/w5WcOf03j8GVkTlZ+TlXmNb80RERERERERERFR6FhUEhERERERERERUehYVMZIJpPBRz/6Uddbva92/DmNx5+RNfw5jcefEbnB/37G48/IGv6cxuPPyBr+nMgp/rdjDX9O1vDnNB5/RtbE8efEzXSIiIiIiIiIiIgodLyjkoiIiIiIiIiIiELHopKIiIiIiIiIiIhCx6KSiIiIiIiIiIiIQseikoiIiIiIiIiIiELHojLiPvGJT+CYY47B5OQk8vm8pecIIXDuuedifn4eExMT2LJlCx588EF/DzREO3bswEknnYSZmRnk83m8/e1vR61WG/mcF73oRVAUpefX6aefHtARB+Piiy/GXnvthWw2i6OOOgq//OUvRz7+6quvxubNm5HNZnHQQQfhBz/4QUBHGi47P6crrrhixX832Ww2wKMN3s0334xXvepV2LRpExRFwTXXXDP2OTfddBMOP/xwZDIZPP3pT8cVV1zh+3FSfHBeG4/z2mCc18bjnDYe5zXyEuc0azivrcQ5zRrOa6Ot1jmNRWXEaZqGE088EWeccYbl53zyk5/E5z73OVx66aW47bbbkMvlcPzxx2N5ednHIw3PSSedhHvuuQfXXXcd/ud//gc333wzTjvttLHPO/XUU7F169bOr09+8pMBHG0wrrrqKpx11ln46Ec/ijvuuAOHHHIIjj/+eDz55JMDH3/LLbfgTW96E97+9rfjzjvvxGte8/+3d38hddd/HMdfOqcVorLmPHPVmP05F+7PkS3ldLHDmGFsFx6otVaYC2JBCxLCsosR66I/NEQKGRG0cEQR4RiUZXXaoJrJOrlmukaas38c+7e5VdKYvn8X0YEzdeccf57zUc/zAefifM7ne3h/P3zOeR3efj0nqGAwqK+//jrNladXsuskSQUFBTH7Znh4OI0Vp99ff/2ldevWqbW1NaH5Q0ND2rp1qzZt2qQTJ06ooaFBDz74oDo7O1NcKeYLci0+cm0yci0+Mi0x5BpmE5mWGHItFpmWGHItvgWbaYZ54cCBA1ZYWBh33sTEhHk8HnvhhReiY+fOnbO8vDx74403UlihG/39/SbJjh8/Hh177733LCsry3766adpjwsEAvboo4+moUI3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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# starting set of input parameters\n", "center0 = (0.0, 0.0, 0.0)\n", "size0 = (0.5, 1.0, 1.0)\n", "eps0 = 3.0\n", "\n", "jax_sim = make_simulation(center=center0, size=size0, eps=eps0)\n", "_, axes = plt.subplots(1, 3, figsize=(16, 5))\n", "\n", "# sim, _ = jax_sim.to_simulation()\n", "for ax, dim in zip(axes, \"xyz\"):\n", " jax_sim.plot(**{dim: 0}, ax=ax)\n", "plt.show()\n" ] }, { "cell_type": "markdown", "id": "a390df41-e293-4dbf-83e0-f5dff8e700cc", "metadata": {}, "source": [ "### Post-processing the output data\n", "\n", "After the simulation is run, it returns a [JaxSimulation](../_autosummary/tidy3d.plugins.adjoint.JaxSimulation.html), which is a jax-compatible subclass of `SimulationData`. In addition to the `.data` corresponding to the `.monitors` in the `JaxSimulation`, `JaxSimulationData` also stores a `.output_data`, which stores the data corresponding to `JaxSimulation.output_monitors`. It is the `.output_data` that our differentiable function should depend on. These output data objects are also `Jax` subclasses of `Tidy3d` data objects, so their functionality may be slightly different, but overall can be used in the same way.\n", "\n", "> Note: currently only `.sel()` selection is supported in jax-compatible DataArray objects. So you should use `.sel()` and pass the values you want to select instead of using `.interp()` or `isel()` \n", "\n", "Let's write a function that will postprocess our `JaxSimulationData` and return the power in the mode amplitude of our output mode monitor." ] }, { "cell_type": "code", "execution_count": 12, "id": "5d5c14b9-cb22-4ced-aad8-834b29c5800b", "metadata": {}, "outputs": [], "source": [ "from tidy3d.plugins.adjoint import JaxSimulationData\n", "\n", "\n", "def compute_power(jax_sim_data: JaxSimulationData) -> float:\n", " \"\"\"Post process the result of the JaxSimulation run to return the power in the mode at index=0.\"\"\"\n", "\n", " freq0 = jax_sim_data.simulation.output_monitors[0].freqs[0]\n", " jax_mode_data = jax_sim_data.output_monitor_data[\"mode\"]\n", " mode_amps = jax_mode_data.amps\n", " amp = mode_amps.sel(direction=\"+\", f=freq0, mode_index=0)\n", " return abs(amp) ** 2\n" ] }, { "cell_type": "markdown", "id": "a49d64c6-7591-4b8b-bfa3-d09c1501d4b0", "metadata": {}, "source": [ "### Defining the tidy3d simulation function for differentiation\n", "\n", "Next, we can import the `tidy3d.plugins.adjoint.web.run` function and put all the pieces together into a single function to compute the 0th order transmitted power as a function of `center`, `size`, and `eps` (relative permittivty) of the scatterer." ] }, { "cell_type": "code", "execution_count": 13, "id": "7257472c-5db1-4b93-8cdb-24b3cc32775d", "metadata": { "tags": [] }, "outputs": [], "source": [ "from tidy3d.plugins.adjoint.web import run as run_adjoint\n" ] }, { "cell_type": "code", "execution_count": 14, "id": "946493e2-b10a-4824-aef0-2e8f1ec113f1", "metadata": {}, "outputs": [], "source": [ "def power(center: float, size: float, eps: float) -> float:\n", " \"\"\"Compute power transmitted into 0th order mode given a set of scatterer parameters.\"\"\"\n", " jax_sim = make_simulation(center=center, size=size, eps=eps)\n", " jax_sim_data = run_adjoint(jax_sim, task_name=\"adjoint_power\", verbose=True)\n", " return compute_power(jax_sim_data)\n" ] }, { "cell_type": "markdown", "id": "90ee44c1-38a6-4dba-add5-9b36c43454cb", "metadata": {}, "source": [ "### Running and differentiating the simulation using `jax`\n", "\n", "Finally, using the `jax` tools described earlier, we can differentiate this `power` function. \n", "\n", "For demonstration, let's use `jax.value_and_grad` to both compute the power **and** the gradient w.r.t. each of the 3 input parameters." ] }, { "cell_type": "code", "execution_count": 15, "id": "8a6518dd-c5a9-4826-95f6-7a0ed90e2f9a", "metadata": {}, "outputs": [], "source": [ "d_power = jax.value_and_grad(power, argnums=(0, 1, 2))\n" ] }, { "cell_type": "markdown", "id": "6f787405-1c6e-40b1-81d2-1a64d667e009", "metadata": {}, "source": [ "We will run this function and assign variables to the power values and the gradients returned.\n", "\n", "Note that running this will set off **two** separate tasks, one after another, called, `\"adjoint_power_fwd\"` and `\"adjoint_power_adj\"`.\n", "\n", "The first is evaluating our simulation in \"forward mode\", computing the power and stashing information needed for gradient computation.\n", "\n", "The second step runs the \"adjoint\" simulation, in which the output monitor is converted to a source and the simulation is re-run.\n", "\n", "The results of both of these simulations runs are combined behind the scene to tell jax how to compute the gradient for us." ] }, { "cell_type": "code", "execution_count": 16, "id": "68f34dce-3504-4dba-8012-436c4ff21ecc", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
[13:23:58] Created task 'adjoint_power_fwd' with task_id                                              webapi.py:139\n",
       "           'fdve-e04381b1-827a-40a0-a0e5-e41924bbe546v1'.                                                          \n",
       "
\n" ], "text/plain": [ "\u001b[2;36m[13:23:58]\u001b[0m\u001b[2;36m \u001b[0mCreated task \u001b[32m'adjoint_power_fwd'\u001b[0m with task_id \u001b]8;id=119572;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py\u001b\\\u001b[2mwebapi.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=774385;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py#139\u001b\\\u001b[2m139\u001b[0m\u001b]8;;\u001b\\\n", "\u001b[2;36m \u001b[0m\u001b[32m'fdve-e04381b1-827a-40a0-a0e5-e41924bbe546v1'\u001b[0m. \u001b[2m \u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "9347cc6a67f24818a6f6364d64682f68", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Output()" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n"
      ],
      "text/plain": []
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "
\n",
       "
\n" ], "text/plain": [ "\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
[13:24:00] status = queued                                                                            webapi.py:269\n",
       "
\n" ], "text/plain": [ "\u001b[2;36m[13:24:00]\u001b[0m\u001b[2;36m \u001b[0mstatus = queued \u001b]8;id=421464;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py\u001b\\\u001b[2mwebapi.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=510650;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py#269\u001b\\\u001b[2m269\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Output()" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
[13:24:03] status = preprocess                                                                        webapi.py:263\n",
       "
\n" ], "text/plain": [ "\u001b[2;36m[13:24:03]\u001b[0m\u001b[2;36m \u001b[0mstatus = preprocess \u001b]8;id=383812;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py\u001b\\\u001b[2mwebapi.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=681790;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py#263\u001b\\\u001b[2m263\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n"
      ],
      "text/plain": []
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "
[13:24:09] Maximum FlexCredit cost: 0.025. Use 'web.real_cost(task_id)' to get the billed FlexCredit cost webapi.py:286\n",
       "           after a simulation run.                                                                                 \n",
       "
\n" ], "text/plain": [ "\u001b[2;36m[13:24:09]\u001b[0m\u001b[2;36m \u001b[0mMaximum FlexCredit cost: \u001b[1;36m0.025\u001b[0m. Use \u001b[32m'web.real_cost\u001b[0m\u001b[32m(\u001b[0m\u001b[32mtask_id\u001b[0m\u001b[32m)\u001b[0m\u001b[32m'\u001b[0m to get the billed FlexCredit cost \u001b]8;id=170821;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py\u001b\\\u001b[2mwebapi.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=908710;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py#286\u001b\\\u001b[2m286\u001b[0m\u001b]8;;\u001b\\\n", "\u001b[2;36m \u001b[0mafter a simulation run. \u001b[2m \u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
           starting up solver                                                                         webapi.py:290\n",
       "
\n" ], "text/plain": [ "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0mstarting up solver \u001b]8;id=13344;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py\u001b\\\u001b[2mwebapi.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=80457;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py#290\u001b\\\u001b[2m290\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
           running solver                                                                             webapi.py:300\n",
       "
\n" ], "text/plain": [ "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0mrunning solver \u001b]8;id=889829;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py\u001b\\\u001b[2mwebapi.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=872462;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py#300\u001b\\\u001b[2m300\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "feb5cf4214154583bfa22181c13b387d", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Output()" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
[13:24:19] early shutoff detected, exiting.                                                           webapi.py:313\n",
       "
\n" ], "text/plain": [ "\u001b[2;36m[13:24:19]\u001b[0m\u001b[2;36m \u001b[0mearly shutoff detected, exiting. \u001b]8;id=995133;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py\u001b\\\u001b[2mwebapi.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=335276;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py#313\u001b\\\u001b[2m313\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n"
      ],
      "text/plain": []
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "
\n",
       "
\n" ], "text/plain": [ "\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
           status = postprocess                                                                       webapi.py:330\n",
       "
\n" ], "text/plain": [ "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0mstatus = postprocess \u001b]8;id=155016;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py\u001b\\\u001b[2mwebapi.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=3170;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py#330\u001b\\\u001b[2m330\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Output()" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
[13:24:23] status = success                                                                           webapi.py:337\n",
       "
\n" ], "text/plain": [ "\u001b[2;36m[13:24:23]\u001b[0m\u001b[2;36m \u001b[0mstatus = success \u001b]8;id=285029;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py\u001b\\\u001b[2mwebapi.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=251585;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py#337\u001b\\\u001b[2m337\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n"
      ],
      "text/plain": []
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "d1167a6c7cc3490ea4f563c073e6ae37",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Output()"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "
\n"
      ],
      "text/plain": []
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "
\n",
       "
\n" ], "text/plain": [ "\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
[13:24:34] loading SimulationData from simulation_data.hdf5                                           webapi.py:512\n",
       "
\n" ], "text/plain": [ "\u001b[2;36m[13:24:34]\u001b[0m\u001b[2;36m \u001b[0mloading SimulationData from simulation_data.hdf5 \u001b]8;id=397871;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py\u001b\\\u001b[2mwebapi.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=361042;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py#512\u001b\\\u001b[2m512\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
[13:24:35] Created task 'adjoint_power_adj' with task_id                                              webapi.py:139\n",
       "           'fdve-f8af0cf2-5f89-4b28-8c5f-7dc00e73b70ev1'.                                                          \n",
       "
\n" ], "text/plain": [ "\u001b[2;36m[13:24:35]\u001b[0m\u001b[2;36m \u001b[0mCreated task \u001b[32m'adjoint_power_adj'\u001b[0m with task_id \u001b]8;id=147935;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py\u001b\\\u001b[2mwebapi.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=269924;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py#139\u001b\\\u001b[2m139\u001b[0m\u001b]8;;\u001b\\\n", "\u001b[2;36m \u001b[0m\u001b[32m'fdve-f8af0cf2-5f89-4b28-8c5f-7dc00e73b70ev1'\u001b[0m. \u001b[2m \u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "40017515c6e44113bc2cd96bf2f06b03", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Output()" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n"
      ],
      "text/plain": []
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "
\n",
       "
\n" ], "text/plain": [ "\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
[13:24:37] status = queued                                                                            webapi.py:269\n",
       "
\n" ], "text/plain": [ "\u001b[2;36m[13:24:37]\u001b[0m\u001b[2;36m \u001b[0mstatus = queued \u001b]8;id=961120;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py\u001b\\\u001b[2mwebapi.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=445271;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py#269\u001b\\\u001b[2m269\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Output()" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
[13:24:39] status = preprocess                                                                        webapi.py:263\n",
       "
\n" ], "text/plain": [ "\u001b[2;36m[13:24:39]\u001b[0m\u001b[2;36m \u001b[0mstatus = preprocess \u001b]8;id=327046;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py\u001b\\\u001b[2mwebapi.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=284465;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py#263\u001b\\\u001b[2m263\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n"
      ],
      "text/plain": []
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "
[13:24:44] Maximum FlexCredit cost: 0.025. Use 'web.real_cost(task_id)' to get the billed FlexCredit cost webapi.py:286\n",
       "           after a simulation run.                                                                                 \n",
       "
\n" ], "text/plain": [ "\u001b[2;36m[13:24:44]\u001b[0m\u001b[2;36m \u001b[0mMaximum FlexCredit cost: \u001b[1;36m0.025\u001b[0m. Use \u001b[32m'web.real_cost\u001b[0m\u001b[32m(\u001b[0m\u001b[32mtask_id\u001b[0m\u001b[32m)\u001b[0m\u001b[32m'\u001b[0m to get the billed FlexCredit cost \u001b]8;id=123027;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py\u001b\\\u001b[2mwebapi.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=687216;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py#286\u001b\\\u001b[2m286\u001b[0m\u001b]8;;\u001b\\\n", "\u001b[2;36m \u001b[0mafter a simulation run. \u001b[2m \u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
           starting up solver                                                                         webapi.py:290\n",
       "
\n" ], "text/plain": [ "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0mstarting up solver \u001b]8;id=665740;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py\u001b\\\u001b[2mwebapi.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=140326;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py#290\u001b\\\u001b[2m290\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
           running solver                                                                             webapi.py:300\n",
       "
\n" ], "text/plain": [ "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0mrunning solver \u001b]8;id=513607;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py\u001b\\\u001b[2mwebapi.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=239767;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py#300\u001b\\\u001b[2m300\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "4098107c28d0424e9af2634acb6261b8", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Output()" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
[13:24:54] early shutoff detected, exiting.                                                           webapi.py:313\n",
       "
\n" ], "text/plain": [ "\u001b[2;36m[13:24:54]\u001b[0m\u001b[2;36m \u001b[0mearly shutoff detected, exiting. \u001b]8;id=24482;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py\u001b\\\u001b[2mwebapi.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=689972;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py#313\u001b\\\u001b[2m313\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n"
      ],
      "text/plain": []
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "
\n",
       "
\n" ], "text/plain": [ "\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
[13:24:55] status = postprocess                                                                       webapi.py:330\n",
       "
\n" ], "text/plain": [ "\u001b[2;36m[13:24:55]\u001b[0m\u001b[2;36m \u001b[0mstatus = postprocess \u001b]8;id=508730;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py\u001b\\\u001b[2mwebapi.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=892;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py#330\u001b\\\u001b[2m330\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Output()" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n"
      ],
      "text/plain": []
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "043d055980e445c88668ed5caae9e0dd",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Output()"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "
\n"
      ],
      "text/plain": []
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "
\n",
       "
\n" ], "text/plain": [ "\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
[13:25:08] loading SimulationData from simulation_data.hdf5                                           webapi.py:512\n",
       "
\n" ], "text/plain": [ "\u001b[2;36m[13:25:08]\u001b[0m\u001b[2;36m \u001b[0mloading SimulationData from simulation_data.hdf5 \u001b]8;id=248239;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py\u001b\\\u001b[2mwebapi.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=475442;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py#512\u001b\\\u001b[2m512\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "power_value, (dp_center, dp_dsize, dp_deps) = d_power(center0, size0, eps0)\n" ] }, { "cell_type": "markdown", "id": "0ac63a75-89de-42c5-929d-f46da6f22864", "metadata": {}, "source": [ "> Note: the gradient evaluation functions returned by `jax.grad()` do not accept keyword arguments (ie. `center=(0.,0.,0.)`) and instead accept positional arguments (without the argument name). You may run across this when trying to evaluate gradients so it's a good idea to keep in mind.\n", "\n", "We can take a look at our computed power and gradient information. " ] }, { "cell_type": "code", "execution_count": 17, "id": "f0a786d2-88c7-406a-a6cd-956e6cfb904c", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "power = 0.548\n", "d_power/d_center = (-0.006544675678014755, -0.019715994596481323, 0.03331966698169708)\n", "d_power/d_size = (-0.024730553850531578, 0.13145551085472107, -0.14747852087020874)\n", "d_power/d_eps = -0.1650194376707077\n" ] } ], "source": [ "print(f\"power = {power_value:.3f}\")\n", "print(f\"d_power/d_center = {dp_center}\")\n", "print(f\"d_power/d_size = {dp_dsize}\")\n", "print(f\"d_power/d_eps = {dp_deps}\")\n" ] }, { "cell_type": "markdown", "id": "a20619d4-d14b-431f-b543-7f0f0bc2907a", "metadata": {}, "source": [ "From this, we can infer several things that fit our intuition, for example that:\n", "* the transmitted power should **decrease** if we increase the permittivity of our scatterer.\n", "* the transmitted power does not depend strongly on the position of the scatterer along the propagation direction.\n", "\n", "## Conclusion & Next Steps\n", "\n", "This gives the most basic introduction to the principles behind the adjoint plugin.\n", "\n", "In subsequent notebooks, we will show how to:\n", " * Check the gradients returned by this method against brute force computed gradients for accuracy.\n", " * Perform gradient-based optimization using the adjoint plugin." ] }, { "cell_type": "code", "execution_count": null, "id": "07afec21-48ce-444c-a0a8-4d8251f1caee", "metadata": {}, "outputs": [], "source": [] } ], "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.10.9" }, "vscode": { "interpreter": { "hash": "9e43a20ef2440406ea6cbfb61ead7c471aba2de37f508addf1f0635fad81ef64" } }, "widgets": { "application/vnd.jupyter.widget-state+json": { "state": { "0e79bdd12be74315ad540359b4aba194": { "model_module": "@jupyter-widgets/base", "model_module_version": "1.2.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "0e99f4c815d34e7c9e1a6dd60688a828": { "model_module": "@jupyter-widgets/base", "model_module_version": "1.2.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "11ef7df82cde44b7ad578d7c68733778": { "model_module": "@jupyter-widgets/base", "model_module_version": "1.2.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "15c203ca30c947219dce8c46f0e46ea1": { "model_module": "@jupyter-widgets/output", "model_module_version": "1.0.0", "model_name": "OutputModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/output", "_model_module_version": "1.0.0", "_model_name": "OutputModel", "_view_count": null, "_view_module": "@jupyter-widgets/output", "_view_module_version": "1.0.0", "_view_name": "OutputView", "layout": "IPY_MODEL_11ef7df82cde44b7ad578d7c68733778", "msg_id": "", "outputs": [ { "data": { "text/html": "
\u2193 monitor_data.hdf5 \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 100.0% \u2022 3.8/3.8 MB \u2022 31.5 MB/s \u2022 0:00:00\n
\n", "text/plain": "\u001b[1;32m\u2193\u001b[0m \u001b[1;34mmonitor_data.hdf5\u001b[0m \u001b[38;2;114;156;31m\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u001b[0m \u001b[35m100.0%\u001b[0m \u2022 \u001b[32m3.8/3.8 MB\u001b[0m \u2022 \u001b[31m31.5 MB/s\u001b[0m \u2022 \u001b[36m0:00:00\u001b[0m\n" }, "metadata": {}, "output_type": "display_data" } ] } }, "237775cf0a9a4c48ad73c17eb93a1879": { "model_module": "@jupyter-widgets/base", "model_module_version": "1.2.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "2e3f0b9c919d4daf9165fd2168d88763": { "model_module": "@jupyter-widgets/base", "model_module_version": "1.2.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "37b64a7f201a4e03862c97b693b4f42c": { "model_module": "@jupyter-widgets/output", "model_module_version": "1.0.0", "model_name": "OutputModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/output", "_model_module_version": "1.0.0", "_model_name": "OutputModel", "_view_count": null, "_view_module": "@jupyter-widgets/output", "_view_module_version": "1.0.0", "_view_name": "OutputView", "layout": "IPY_MODEL_0e99f4c815d34e7c9e1a6dd60688a828", "msg_id": "", "outputs": [ { "data": { "text/html": "
\u2191 simulation.json \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 100.0% \u2022 4.3/4.3 kB \u2022 ? \u2022 0:00:00\n
\n", "text/plain": "\u001b[1;31m\u2191\u001b[0m \u001b[1;34msimulation.json\u001b[0m \u001b[38;2;114;156;31m\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u001b[0m \u001b[35m100.0%\u001b[0m \u2022 \u001b[32m4.3/4.3 kB\u001b[0m \u2022 \u001b[31m?\u001b[0m \u2022 \u001b[36m0:00:00\u001b[0m\n" }, "metadata": {}, "output_type": "display_data" } ] } }, "37ebebb96ae44e9ab0d1b0967820cdd4": { "model_module": "@jupyter-widgets/base", "model_module_version": "1.2.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "5bef1268d85a446da84d41977b4af1a4": { "model_module": "@jupyter-widgets/output", "model_module_version": "1.0.0", "model_name": "OutputModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/output", "_model_module_version": "1.0.0", "_model_name": "OutputModel", "_view_count": null, "_view_module": "@jupyter-widgets/output", "_view_module_version": "1.0.0", "_view_name": "OutputView", "layout": "IPY_MODEL_c0b8392976ae4902973026301f80264b", "msg_id": "", "outputs": [ { "data": { "text/html": "
\u2191 simulation.json \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 100.0% \u2022 3.9/3.9 kB \u2022 ? \u2022 0:00:00\n
\n", "text/plain": "\u001b[1;31m\u2191\u001b[0m \u001b[1;34msimulation.json\u001b[0m \u001b[38;2;114;156;31m\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u001b[0m \u001b[35m100.0%\u001b[0m \u2022 \u001b[32m3.9/3.9 kB\u001b[0m \u2022 \u001b[31m?\u001b[0m \u2022 \u001b[36m0:00:00\u001b[0m\n" }, "metadata": {}, "output_type": "display_data" } ] } }, "7ba19997a2074cf8a4104742f541234a": { "model_module": "@jupyter-widgets/output", "model_module_version": "1.0.0", "model_name": "OutputModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/output", "_model_module_version": "1.0.0", "_model_name": "OutputModel", "_view_count": null, "_view_module": "@jupyter-widgets/output", "_view_module_version": "1.0.0", "_view_name": "OutputView", "layout": "IPY_MODEL_faa6f5247a0841418138128c0f6d1851", "msg_id": "", "outputs": [ { "data": { "text/html": "
\ud83c\udfc3  Starting 'adjoint_power_fwd'...\n
\n", "text/plain": "\u001b[32m\ud83c\udfc3 \u001b[0m \u001b[1;32mStarting 'adjoint_power_fwd'...\u001b[0m\n" }, "metadata": {}, "output_type": "display_data" } ] } }, "adf307da99dd47268f08e03f66884f6d": { "model_module": "@jupyter-widgets/output", "model_module_version": "1.0.0", "model_name": "OutputModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/output", "_model_module_version": "1.0.0", "_model_name": "OutputModel", "_view_count": null, "_view_module": "@jupyter-widgets/output", "_view_module_version": "1.0.0", "_view_name": "OutputView", "layout": "IPY_MODEL_37ebebb96ae44e9ab0d1b0967820cdd4", "msg_id": "", "outputs": [ { "data": { "text/html": "
\ud83c\udfc3  Starting 'adjoint_power_adj'...\n
\n", "text/plain": "\u001b[32m\ud83c\udfc3 \u001b[0m \u001b[1;32mStarting 'adjoint_power_adj'...\u001b[0m\n" }, "metadata": {}, "output_type": "display_data" } ] } }, "b14de67c49b245faba7d0f79abc868dd": { "model_module": "@jupyter-widgets/output", "model_module_version": "1.0.0", "model_name": "OutputModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/output", "_model_module_version": "1.0.0", "_model_name": "OutputModel", "_view_count": null, "_view_module": "@jupyter-widgets/output", "_view_module_version": "1.0.0", "_view_name": "OutputView", "layout": "IPY_MODEL_b7e576d9131e49c69dad87b967d32e8f", "msg_id": "", "outputs": [ { "data": { "text/html": "
% done (field decay = 0.00e+00) \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 100% 0:00:00\n
\n", "text/plain": "% done (field decay = 0.00e+00) \u001b[38;2;114;156;31m\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u001b[0m \u001b[35m100%\u001b[0m \u001b[36m0:00:00\u001b[0m\n" }, "metadata": {}, "output_type": "display_data" } ] } }, "b76b4588f3b74a779d13ee3610dbbdb4": { "model_module": "@jupyter-widgets/output", "model_module_version": "1.0.0", "model_name": "OutputModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/output", "_model_module_version": "1.0.0", "_model_name": "OutputModel", "_view_count": null, "_view_module": "@jupyter-widgets/output", "_view_module_version": "1.0.0", "_view_name": "OutputView", "layout": "IPY_MODEL_0e79bdd12be74315ad540359b4aba194", "msg_id": "", "outputs": [ { "data": { "text/html": "
\u2193 monitor_data.hdf5 \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 100.0% \u2022 3.8/3.8 MB \u2022 30.1 MB/s \u2022 0:00:00\n
\n", "text/plain": "\u001b[1;32m\u2193\u001b[0m \u001b[1;34mmonitor_data.hdf5\u001b[0m \u001b[38;2;114;156;31m\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u001b[0m \u001b[35m100.0%\u001b[0m \u2022 \u001b[32m3.8/3.8 MB\u001b[0m \u2022 \u001b[31m30.1 MB/s\u001b[0m \u2022 \u001b[36m0:00:00\u001b[0m\n" }, "metadata": {}, "output_type": "display_data" } ] } }, "b7e576d9131e49c69dad87b967d32e8f": { "model_module": "@jupyter-widgets/base", "model_module_version": "1.2.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "c0b8392976ae4902973026301f80264b": { "model_module": "@jupyter-widgets/base", "model_module_version": "1.2.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "c1ae983781d743dda6527383413791f3": { "model_module": "@jupyter-widgets/output", "model_module_version": "1.0.0", "model_name": "OutputModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/output", "_model_module_version": "1.0.0", "_model_name": "OutputModel", "_view_count": null, "_view_module": "@jupyter-widgets/output", "_view_module_version": "1.0.0", "_view_name": "OutputView", "layout": "IPY_MODEL_dff9ffbe73df4879841467550221934d", "msg_id": "", "outputs": [ { "data": { "text/html": "
% done (field decay = 0.00e+00) \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 100% 0:00:00\n
\n", "text/plain": "% done (field decay = 0.00e+00) \u001b[38;2;114;156;31m\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u001b[0m \u001b[35m100%\u001b[0m \u001b[36m0:00:00\u001b[0m\n" }, "metadata": {}, "output_type": "display_data" } ] } }, "c5c6be3ebe894610acf58ca885bc839b": { "model_module": "@jupyter-widgets/output", "model_module_version": "1.0.0", "model_name": "OutputModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/output", "_model_module_version": "1.0.0", "_model_name": "OutputModel", "_view_count": null, "_view_module": "@jupyter-widgets/output", "_view_module_version": "1.0.0", "_view_name": "OutputView", "layout": "IPY_MODEL_237775cf0a9a4c48ad73c17eb93a1879", "msg_id": "", "outputs": [ { "data": { "text/html": "
\ud83d\udeb6  Finishing 'adjoint_power_fwd'...\n
\n", "text/plain": "\u001b[32m\ud83d\udeb6 \u001b[0m \u001b[1;32mFinishing 'adjoint_power_fwd'...\u001b[0m\n" }, "metadata": {}, "output_type": "display_data" } ] } }, "df44e54eb2bf47ed8fb7839407f00e55": { "model_module": "@jupyter-widgets/output", "model_module_version": "1.0.0", "model_name": "OutputModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/output", "_model_module_version": "1.0.0", "_model_name": "OutputModel", "_view_count": null, "_view_module": "@jupyter-widgets/output", "_view_module_version": "1.0.0", "_view_name": "OutputView", "layout": "IPY_MODEL_2e3f0b9c919d4daf9165fd2168d88763", "msg_id": "", "outputs": [ { "data": { "text/html": "
\ud83c\udfc3  Finishing 'adjoint_power_adj'...\n
\n", "text/plain": "\u001b[32m\ud83c\udfc3 \u001b[0m \u001b[1;32mFinishing 'adjoint_power_adj'...\u001b[0m\n" }, "metadata": {}, "output_type": "display_data" } ] } }, "dff9ffbe73df4879841467550221934d": { "model_module": "@jupyter-widgets/base", "model_module_version": "1.2.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "faa6f5247a0841418138128c0f6d1851": { "model_module": "@jupyter-widgets/base", "model_module_version": "1.2.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } } }, "version_major": 2, "version_minor": 0 } } }, "nbformat": 4, "nbformat_minor": 5 }