{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 3-sphere: charts, quaternions and Hopf fibration\n", "\n", "This notebook demonstrates some differential geometry capabilities of SageMath on the example of the 3-dimensional sphere, $\\mathbb{S}^3$. The corresponding tools have been developed within the [SageManifolds](https://sagemanifolds.obspm.fr) project.\n", "\n", "Click [here](https://raw.githubusercontent.com/sagemanifolds/SageManifolds/master/Notebooks/SM_sphere_S3_Hopf.ipynb) to download the notebook file (ipynb format). To run it, you must start SageMath with the Jupyter notebook, via the command `sage -n jupyter`" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "*NB:* a version of SageMath at least equal to 7.5 is required to run this notebook:" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'SageMath version 9.2.beta6, Release Date: 2020-07-25'" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "version()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "First we set up the notebook to display mathematical objects using LaTeX formatting:" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "%display latex" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "and we initialize a time counter for benchmarking:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "import time\n", "comput_time0 = time.perf_counter()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To increase the computational speed, we ask for demanding computations to be parallelly performed on 8 threads:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "Parallelism().set(nproc=8)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## $\\mathbb{S}^3$ as a 3-dimensional differentiable manifold\n", "\n", "We start by declaring $\\mathbb{S}^3$ as a differentiable manifold of dimension 3 over $\\mathbb{R}$:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "S3 = Manifold(3, 'S^3', latex_name=r'\\mathbb{S}^3', start_index=1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The first argument, `3`, is the dimension of the manifold, while the second argument is the symbol used to label the manifold, with the LaTeX output specified by the argument `latex_name`. The argument `start_index` sets the index range to be used on the manifold for labelling components w.r.t. a basis or a frame: `start_index=1` corresponds to $\\{1,2,3\\}$; the default value is `start_index=0`, yielding to $\\{0,1,2\\}$." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "3-dimensional differentiable manifold S^3\n" ] } ], "source": [ "print(S3)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\mathbb{S}^3\n", "\\end{math}" ], "text/plain": [ "3-dimensional differentiable manifold S^3" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "S3" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Coordinate charts on $\\mathbb{S}^3$\n", "\n", "The 3-sphere cannot be covered by a single chart. At least two charts are necessary, for instance the charts associated with the stereographic projections from two distinct points, $N$ and $S$ say,\n", "which we may call the *North pole* and the *South pole* respectively. Let us introduce the open subsets covered by these two charts: \n", "$$ U := \\mathbb{S}^3\\setminus\\{N\\} $$ \n", "$$ V := \\mathbb{S}^3\\setminus\\{S\\} $$" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Open subset U of the 3-dimensional differentiable manifold S^3\n" ] } ], "source": [ "U = S3.open_subset('U') ; print(U)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Open subset V of the 3-dimensional differentiable manifold S^3\n" ] } ], "source": [ "V = S3.open_subset('V') ; print(V)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We declare that $\\mathbb{S}^3 = U \\cup V$:" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "S3.declare_union(U, V)" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "Then we introduce the stereographic chart on $U$, denoting by $(x,y,z)$ the coordinates resulting from the stereographic projection from the North pole onto the equatorial plane:" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left(U,(x, y, z)\\right)\n", "\\end{math}" ], "text/plain": [ "Chart (U, (x, y, z))" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "stereoN. = U.chart()\n", "stereoN" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}x :\\ \\left( -\\infty, +\\infty \\right) ;\\quad y :\\ \\left( -\\infty, +\\infty \\right) ;\\quad z :\\ \\left( -\\infty, +\\infty \\right)\n", "\\end{math}" ], "text/plain": [ "x: (-oo, +oo); y: (-oo, +oo); z: (-oo, +oo)" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "stereoN.coord_range()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Similarly, we introduce on $V$ the coordinates $(x',y',z')$ corresponding to the stereographic projection from the South pole onto the equatorial plane:" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left(V,({x'}, {y'}, {z'})\\right)\n", "\\end{math}" ], "text/plain": [ "Chart (V, (xp, yp, zp))" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "stereoS. = V.chart(\"xp:x' yp:y' zp:z'\")\n", "stereoS" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}{x'} :\\ \\left( -\\infty, +\\infty \\right) ;\\quad {y'} :\\ \\left( -\\infty, +\\infty \\right) ;\\quad {z'} :\\ \\left( -\\infty, +\\infty \\right)\n", "\\end{math}" ], "text/plain": [ "xp: (-oo, +oo); yp: (-oo, +oo); zp: (-oo, +oo)" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "stereoS.coord_range()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We have to specify the **transition map** between the charts `stereoN` = $(U,(x,y,z))$ and `stereoS` = $(V,(x',y',z'))$; it is given by the standard inversion formulas:" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left\\{\\begin{array}{lcl} {x'} & = & \\frac{x}{x^{2} + y^{2} + z^{2}} \\\\ {y'} & = & \\frac{y}{x^{2} + y^{2} + z^{2}} \\\\ {z'} & = & \\frac{z}{x^{2} + y^{2} + z^{2}} \\end{array}\\right.\n", "\\end{math}" ], "text/plain": [ "xp = x/(x^2 + y^2 + z^2)\n", "yp = y/(x^2 + y^2 + z^2)\n", "zp = z/(x^2 + y^2 + z^2)" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "r2 = x^2+y^2+z^2\n", "stereoN_to_S = stereoN.transition_map(stereoS, \n", " (x/r2, y/r2, z/r2), \n", " intersection_name='W',\n", " restrictions1= x^2+y^2+z^2!=0, \n", " restrictions2= xp^2+yp^2+zp^2!=0)\n", "stereoN_to_S.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In the above declaration, `'W'` is the name given to the open subset where the two charts overlap: $W := U\\cap V$, the condition $x^2+y^2+z^2\\not=0$ defines $W$ as a subset of $U$, and the condition $x'^2+y'^2+z'^2\\not=0$ defines $W$ as a subset of $V$.\n", "\n", "The inverse coordinate transformation is computed by means of the method `inverse()`:" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left\\{\\begin{array}{lcl} x & = & \\frac{{x'}}{{x'}^{2} + {y'}^{2} + {z'}^{2}} \\\\ y & = & \\frac{{y'}}{{x'}^{2} + {y'}^{2} + {z'}^{2}} \\\\ z & = & \\frac{{z'}}{{x'}^{2} + {y'}^{2} + {z'}^{2}} \\end{array}\\right.\n", "\\end{math}" ], "text/plain": [ "x = xp/(xp^2 + yp^2 + zp^2)\n", "y = yp/(xp^2 + yp^2 + zp^2)\n", "z = zp/(xp^2 + yp^2 + zp^2)" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "stereoS_to_N = stereoN_to_S.inverse()\n", "stereoS_to_N.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that the situation is of course perfectly symmetric regarding the coordinates $(x,y,z)$ and $(x',y',z')$.\n", "\n", "At this stage, the user's atlas has four charts:" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left[\\left(U,(x, y, z)\\right), \\left(V,({x'}, {y'}, {z'})\\right), \\left(W,(x, y, z)\\right), \\left(W,({x'}, {y'}, {z'})\\right)\\right]\n", "\\end{math}" ], "text/plain": [ "[Chart (U, (x, y, z)),\n", " Chart (V, (xp, yp, zp)),\n", " Chart (W, (x, y, z)),\n", " Chart (W, (xp, yp, zp))]" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "S3.atlas()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For future reference, we store $W=U\\cap V$ into a Python variable:" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Open subset W of the 3-dimensional differentiable manifold S^3\n" ] } ], "source": [ "W = U.intersection(V)\n", "print(W)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### The North and South poles\n", "\n", "$N$ is the point of $V$ of stereographic coordinates $(x',y',z')=(0,0,0)$:" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Point N on the 3-dimensional differentiable manifold S^3\n" ] } ], "source": [ "N = V((0,0,0), chart=stereoS, name='N')\n", "print(N)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "while $S$ is the point of U of stereographic coordinates $(x,y,z)=(0,0,0)$:" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Point S on the 3-dimensional differentiable manifold S^3\n" ] } ], "source": [ "S = U((0,0,0), chart=stereoN, name='S')\n", "print(S)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We have of course" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\mathrm{True}\n", "\\end{math}" ], "text/plain": [ "True" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "all([N not in U, N in V, S in U, S not in V])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Embedding of $\\mathbb{S}^3$ into $\\mathbb{R}^4$\n", "\n", "Let us first declare $\\mathbb{R}^4$ as a 4-dimensional manifold covered by a single chart (the so-called **Cartesian coordinates**):" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left(\\mathbb{R}^4,(T, X, Y, Z)\\right)\n", "\\end{math}" ], "text/plain": [ "Chart (R^4, (T, X, Y, Z))" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "R4 = Manifold(4, 'R^4', r'\\mathbb{R}^4')\n", "X4. = R4.chart()\n", "X4" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The embedding of $\\mathbb{S}^3$ into $\\mathbb{R}^4$ is then defined by the standard formulas relating the stereographic coordinates to the ambient Cartesian ones when considering a **stereographic projection** from the point $(-1,0,0,0)$ to the equatorial plane $T=0$:" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\begin{array}{llcl} \\Phi:& \\mathbb{S}^3 & \\longrightarrow & \\mathbb{R}^4 \\\\ \\mbox{on}\\ U : & \\left(x, y, z\\right) & \\longmapsto & \\left(T, X, Y, Z\\right) = \\left(-\\frac{x^{2} + y^{2} + z^{2} - 1}{x^{2} + y^{2} + z^{2} + 1}, \\frac{2 \\, x}{x^{2} + y^{2} + z^{2} + 1}, \\frac{2 \\, y}{x^{2} + y^{2} + z^{2} + 1}, \\frac{2 \\, z}{x^{2} + y^{2} + z^{2} + 1}\\right) \\\\ \\mbox{on}\\ V : & \\left({x'}, {y'}, {z'}\\right) & \\longmapsto & \\left(T, X, Y, Z\\right) = \\left(\\frac{{x'}^{2} + {y'}^{2} + {z'}^{2} - 1}{{x'}^{2} + {y'}^{2} + {z'}^{2} + 1}, \\frac{2 \\, {x'}}{{x'}^{2} + {y'}^{2} + {z'}^{2} + 1}, \\frac{2 \\, {y'}}{{x'}^{2} + {y'}^{2} + {z'}^{2} + 1}, \\frac{2 \\, {z'}}{{x'}^{2} + {y'}^{2} + {z'}^{2} + 1}\\right) \\end{array}\n", "\\end{math}" ], "text/plain": [ "Phi: S^3 --> R^4\n", "on U: (x, y, z) |--> (T, X, Y, Z) = (-(x^2 + y^2 + z^2 - 1)/(x^2 + y^2 + z^2 + 1), 2*x/(x^2 + y^2 + z^2 + 1), 2*y/(x^2 + y^2 + z^2 + 1), 2*z/(x^2 + y^2 + z^2 + 1))\n", "on V: (xp, yp, zp) |--> (T, X, Y, Z) = ((xp^2 + yp^2 + zp^2 - 1)/(xp^2 + yp^2 + zp^2 + 1), 2*xp/(xp^2 + yp^2 + zp^2 + 1), 2*yp/(xp^2 + yp^2 + zp^2 + 1), 2*zp/(xp^2 + yp^2 + zp^2 + 1))" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rp2 = xp^2 + yp^2 + zp^2\n", "Phi = S3.diff_map(R4, {(stereoN, X4): \n", " [(1-r2)/(r2+1), 2*x/(r2+1), \n", " 2*y/(r2+1), 2*z/(r2+1)],\n", " (stereoS, X4):\n", " [(rp2-1)/(rp2+1), 2*xp/(rp2+1), \n", " 2*yp/(rp2+1), 2*zp/(rp2+1)]},\n", " name='Phi', latex_name=r'\\Phi')\n", "Phi.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "From this choice of stereographic projection, the \"North\" pole is actually the point of coordinates $(-1,0,0,0)$ in $\\mathbb{R}^4$:" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left(-1, 0, 0, 0\\right)\n", "\\end{math}" ], "text/plain": [ "(-1, 0, 0, 0)" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X4(Phi(N))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "while the \"South\" pole is the point of coordinates $(1,0,0,0)$:" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left(1, 0, 0, 0\\right)\n", "\\end{math}" ], "text/plain": [ "(1, 0, 0, 0)" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X4(Phi(S))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We may use the embedding $\\Phi$ to plot the stereographic coordinate grid in terms of the $\\mathbb{R}^4$'s Cartesian coordinates: " ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "scrolled": false }, "outputs": [ { "data": { "text/html": [ "\n", "\n" ], "text/plain": [ "Graphics3d Object" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "graph_stereoN = stereoN.plot(chart=X4, mapping=Phi, \n", " ambient_coords=(X,Y,Z),\n", " number_values=9,\n", " color={x: 'red', y: 'green', z: 'gold'},\n", " label_axes=False)\n", "show(graph_stereoN, axes_labels=['X', 'Y', 'Z'])" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n" ], "text/plain": [ "Graphics3d Object" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "graph_stereoN = stereoN.plot(chart=X4, mapping=Phi, \n", " ambient_coords=(X,Y,T),\n", " number_values=13, plot_points=150,\n", " color={x: 'red', y: 'green', z: 'gold'},\n", " label_axes=False)\n", "pointN = N.plot(chart=X4, mapping=Phi, ambient_coords=(X,Y,T), \n", " color='maroon', label_offset=0.05)\n", "pointS = S.plot(chart=X4, mapping=Phi, ambient_coords=(X,Y,T), \n", " color='maroon', label_offset=0.05)\n", "show(graph_stereoN + pointN + pointS, axes_labels=['X', 'Y', 'T'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Hyperspherical coordinates\n", "\n", "The hyperspherical coordinates $(\\chi, \\theta, \\phi)$ generalize the standard spherical coordinates $(\\theta, \\phi)$ on $\\mathbb{S}^2$. They are defined on the open domain $A\\subset W \\subset \\mathbb{S}^3$ that is the complement of the \"origin meridian\"; since the latter is defined by $y=0$ and $x\\geq 0$, we declare:" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Open subset A of the 3-dimensional differentiable manifold S^3\n" ] } ], "source": [ "A = W.open_subset('A', coord_def={stereoN.restrict(W): (y!=0, x<0), \n", " stereoS.restrict(W): (yp!=0, xp<0)})\n", "print(A)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We then declare the chart $(A,(\\chi,\\theta,\\phi))$ by specifying the intervals spanned by the various coordinates:" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left(A,({\\chi}, {\\theta}, {\\phi})\\right)\n", "\\end{math}" ], "text/plain": [ "Chart (A, (ch, th, ph))" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "spher. = A.chart(r'ch:(0,pi):\\chi th:(0,pi):\\theta ph:(0,2*pi):\\phi')\n", "spher" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}{\\chi} :\\ \\left( 0 , \\pi \\right) ;\\quad {\\theta} :\\ \\left( 0 , \\pi \\right) ;\\quad {\\phi} :\\ \\left( 0 , 2 \\, \\pi \\right)\n", "\\end{math}" ], "text/plain": [ "ch: (0, pi); th: (0, pi); ph: (0, 2*pi)" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "spher.coord_range()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The specification of the hyperspherical coordinates is completed by providing the transition map to the stereographic chart $(A,(x,y,z))$:" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left\\{\\begin{array}{lcl} x & = & \\frac{\\cos\\left({\\phi}\\right) \\sin\\left({\\chi}\\right) \\sin\\left({\\theta}\\right)}{\\cos\\left({\\chi}\\right) + 1} \\\\ y & = & \\frac{\\sin\\left({\\chi}\\right) \\sin\\left({\\phi}\\right) \\sin\\left({\\theta}\\right)}{\\cos\\left({\\chi}\\right) + 1} \\\\ z & = & \\frac{\\cos\\left({\\theta}\\right) \\sin\\left({\\chi}\\right)}{\\cos\\left({\\chi}\\right) + 1} \\end{array}\\right.\n", "\\end{math}" ], "text/plain": [ "x = cos(ph)*sin(ch)*sin(th)/(cos(ch) + 1)\n", "y = sin(ch)*sin(ph)*sin(th)/(cos(ch) + 1)\n", "z = cos(th)*sin(ch)/(cos(ch) + 1)" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "den = 1 + cos(ch)\n", "spher_to_stereoN = spher.transition_map(stereoN.restrict(A), \n", " (sin(ch)*sin(th)*cos(ph)/den,\n", " sin(ch)*sin(th)*sin(ph)/den,\n", " sin(ch)*cos(th)/den))\n", "spher_to_stereoN.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We also provide the inverse transition map by means of the method `set_inverse`, which (by default) performs a check that the provided formulas are indeed correct:" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Check of the inverse coordinate transformation:\n", " ch == 2*arctan(sqrt(-cos(ch) + 1)/sqrt(cos(ch) + 1)) **failed**\n", " th == arctan2(sqrt(-cos(ch) + 1)*sin(th)/sqrt(cos(ch) + 1), cos(th)*sin(ch)/(cos(ch) + 1)) **failed**\n", " ph == pi - arctan2(sin(ch)*sin(ph)*sin(th)/(cos(ch) + 1), -cos(ph)*sin(ch)*sin(th)/(cos(ch) + 1)) **failed**\n", " x == x *passed*\n", " y == y *passed*\n", " z == z *passed*\n", "NB: a failed report can reflect a mere lack of simplification.\n" ] } ], "source": [ "spher_to_stereoN.set_inverse(2*atan(sqrt(x^2+y^2+z^2)),\n", " atan2(sqrt(x^2+y^2), z),\n", " atan2(-y, -x) + pi)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The check is passed, modulo some lack of trigonometric simplifications in the first three lines." ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left\\{\\begin{array}{lcl} {\\chi} & = & 2 \\, \\arctan\\left(\\sqrt{x^{2} + y^{2} + z^{2}}\\right) \\\\ {\\theta} & = & \\arctan\\left(\\sqrt{x^{2} + y^{2}}, z\\right) \\\\ {\\phi} & = & \\pi + \\arctan\\left(-y, -x\\right) \\end{array}\\right.\n", "\\end{math}" ], "text/plain": [ "ch = 2*arctan(sqrt(x^2 + y^2 + z^2))\n", "th = arctan2(sqrt(x^2 + y^2), z)\n", "ph = pi + arctan2(-y, -x)" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "spher_to_stereoN.inverse().display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The transition map $(A,(\\chi,\\theta,\\phi))\\rightarrow (A,(x',y',z'))$ is obtained by combining the transition maps $(A,(\\chi,\\theta,\\phi))\\rightarrow (A,(x,y,z))$ and $(A,(x,y,z))\\rightarrow (A,(x',y',z'))$:" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left\\{\\begin{array}{lcl} {x'} & = & \\frac{{\\left(\\cos\\left({\\chi}\\right) + 1\\right)} \\cos\\left({\\phi}\\right) \\sin\\left({\\theta}\\right)}{\\sin\\left({\\chi}\\right)} \\\\ {y'} & = & \\frac{{\\left(\\cos\\left({\\chi}\\right) + 1\\right)} \\sin\\left({\\phi}\\right) \\sin\\left({\\theta}\\right)}{\\sin\\left({\\chi}\\right)} \\\\ {z'} & = & \\frac{{\\left(\\cos\\left({\\chi}\\right) + 1\\right)} \\cos\\left({\\theta}\\right)}{\\sin\\left({\\chi}\\right)} \\end{array}\\right.\n", "\\end{math}" ], "text/plain": [ "xp = (cos(ch) + 1)*cos(ph)*sin(th)/sin(ch)\n", "yp = (cos(ch) + 1)*sin(ph)*sin(th)/sin(ch)\n", "zp = (cos(ch) + 1)*cos(th)/sin(ch)" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "spher_to_stereoS = stereoN_to_S.restrict(A) * spher_to_stereoN\n", "spher_to_stereoS.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Similarly, the transition map $(A,(x',y',z'))\\rightarrow (A,(\\chi,\\theta,\\phi))$ is obtained by combining the transition maps $(A,(x',y',z'))\\rightarrow (A,(x,y,z))$ and $(A,(x,y,z))\\rightarrow (A,(\\chi,\\theta,\\phi))$:" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left\\{\\begin{array}{lcl} {\\chi} & = & 2 \\, \\arctan\\left(\\frac{1}{\\sqrt{{x'}^{2} + {y'}^{2} + {z'}^{2}}}\\right) \\\\ {\\theta} & = & \\arctan\\left(\\frac{\\sqrt{{x'}^{2} + {y'}^{2}}}{{x'}^{2} + {y'}^{2} + {z'}^{2}}, \\frac{{z'}}{{x'}^{2} + {y'}^{2} + {z'}^{2}}\\right) \\\\ {\\phi} & = & \\pi - \\arctan\\left(\\frac{{y'}}{{x'}^{2} + {y'}^{2} + {z'}^{2}}, -\\frac{{x'}}{{x'}^{2} + {y'}^{2} + {z'}^{2}}\\right) \\end{array}\\right.\n", "\\end{math}" ], "text/plain": [ "ch = 2*arctan(1/sqrt(xp^2 + yp^2 + zp^2))\n", "th = arctan2(sqrt(xp^2 + yp^2)/(xp^2 + yp^2 + zp^2), zp/(xp^2 + yp^2 + zp^2))\n", "ph = pi - arctan2(yp/(xp^2 + yp^2 + zp^2), -xp/(xp^2 + yp^2 + zp^2))" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "stereoS_to_spher = spher_to_stereoN.inverse() * stereoS_to_N.restrict(A)\n", "stereoS_to_spher.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "At this stage, the user atlas of $\\mathbb{S}^3$ is" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left[\\left(U,(x, y, z)\\right), \\left(V,({x'}, {y'}, {z'})\\right), \\left(W,(x, y, z)\\right), \\left(W,({x'}, {y'}, {z'})\\right), \\left(A,(x, y, z)\\right), \\left(A,({x'}, {y'}, {z'})\\right), \\left(A,({\\chi}, {\\theta}, {\\phi})\\right)\\right]\n", "\\end{math}" ], "text/plain": [ "[Chart (U, (x, y, z)),\n", " Chart (V, (xp, yp, zp)),\n", " Chart (W, (x, y, z)),\n", " Chart (W, (xp, yp, zp)),\n", " Chart (A, (x, y, z)),\n", " Chart (A, (xp, yp, zp)),\n", " Chart (A, (ch, th, ph))]" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "S3.atlas()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let us get the coordinate expression of the restriction of the embedding $\\Phi$ to $A$:" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\begin{array}{llcl} \\Phi:& \\mathbb{S}^3 & \\longrightarrow & \\mathbb{R}^4 \\\\ \\mbox{on}\\ A : & \\left(x, y, z\\right) & \\longmapsto & \\left(T, X, Y, Z\\right) = \\left(-\\frac{x^{2} + y^{2} + z^{2} - 1}{x^{2} + y^{2} + z^{2} + 1}, \\frac{2 \\, x}{x^{2} + y^{2} + z^{2} + 1}, \\frac{2 \\, y}{x^{2} + y^{2} + z^{2} + 1}, \\frac{2 \\, z}{x^{2} + y^{2} + z^{2} + 1}\\right) \\end{array}\n", "\\end{math}" ], "text/plain": [ "Phi: S^3 --> R^4\n", "on A: (x, y, z) |--> (T, X, Y, Z) = (-(x^2 + y^2 + z^2 - 1)/(x^2 + y^2 + z^2 + 1), 2*x/(x^2 + y^2 + z^2 + 1), 2*y/(x^2 + y^2 + z^2 + 1), 2*z/(x^2 + y^2 + z^2 + 1))" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Phi.display(stereoN.restrict(A), X4)" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\begin{array}{llcl} \\Phi:& \\mathbb{S}^3 & \\longrightarrow & \\mathbb{R}^4 \\\\ \\mbox{on}\\ A : & \\left({\\chi}, {\\theta}, {\\phi}\\right) & \\longmapsto & \\left(T, X, Y, Z\\right) = \\left(\\cos\\left({\\chi}\\right), \\cos\\left({\\phi}\\right) \\sin\\left({\\chi}\\right) \\sin\\left({\\theta}\\right), \\sin\\left({\\chi}\\right) \\sin\\left({\\phi}\\right) \\sin\\left({\\theta}\\right), \\cos\\left({\\theta}\\right) \\sin\\left({\\chi}\\right)\\right) \\end{array}\n", "\\end{math}" ], "text/plain": [ "Phi: S^3 --> R^4\n", "on A: (ch, th, ph) |--> (T, X, Y, Z) = (cos(ch), cos(ph)*sin(ch)*sin(th), sin(ch)*sin(ph)*sin(th), cos(th)*sin(ch))" ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Phi.display(spher, X4)" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\begin{array}{llcl} \\Phi:& \\mathbb{S}^3 & \\longrightarrow & \\mathbb{R}^4 \\\\ \\mbox{on}\\ U : & \\left(x, y, z\\right) & \\longmapsto & \\left(T, X, Y, Z\\right) = \\left(-\\frac{x^{2} + y^{2} + z^{2} - 1}{x^{2} + y^{2} + z^{2} + 1}, \\frac{2 \\, x}{x^{2} + y^{2} + z^{2} + 1}, \\frac{2 \\, y}{x^{2} + y^{2} + z^{2} + 1}, \\frac{2 \\, z}{x^{2} + y^{2} + z^{2} + 1}\\right) \\\\ \\mbox{on}\\ V : & \\left({x'}, {y'}, {z'}\\right) & \\longmapsto & \\left(T, X, Y, Z\\right) = \\left(\\frac{{x'}^{2} + {y'}^{2} + {z'}^{2} - 1}{{x'}^{2} + {y'}^{2} + {z'}^{2} + 1}, \\frac{2 \\, {x'}}{{x'}^{2} + {y'}^{2} + {z'}^{2} + 1}, \\frac{2 \\, {y'}}{{x'}^{2} + {y'}^{2} + {z'}^{2} + 1}, \\frac{2 \\, {z'}}{{x'}^{2} + {y'}^{2} + {z'}^{2} + 1}\\right) \\\\ \\mbox{on}\\ A : & \\left({\\chi}, {\\theta}, {\\phi}\\right) & \\longmapsto & \\left(T, X, Y, Z\\right) = \\left(\\cos\\left({\\chi}\\right), \\cos\\left({\\phi}\\right) \\sin\\left({\\chi}\\right) \\sin\\left({\\theta}\\right), \\sin\\left({\\chi}\\right) \\sin\\left({\\phi}\\right) \\sin\\left({\\theta}\\right), \\cos\\left({\\theta}\\right) \\sin\\left({\\chi}\\right)\\right) \\end{array}\n", "\\end{math}" ], "text/plain": [ "Phi: S^3 --> R^4\n", "on U: (x, y, z) |--> (T, X, Y, Z) = (-(x^2 + y^2 + z^2 - 1)/(x^2 + y^2 + z^2 + 1), 2*x/(x^2 + y^2 + z^2 + 1), 2*y/(x^2 + y^2 + z^2 + 1), 2*z/(x^2 + y^2 + z^2 + 1))\n", "on V: (xp, yp, zp) |--> (T, X, Y, Z) = ((xp^2 + yp^2 + zp^2 - 1)/(xp^2 + yp^2 + zp^2 + 1), 2*xp/(xp^2 + yp^2 + zp^2 + 1), 2*yp/(xp^2 + yp^2 + zp^2 + 1), 2*zp/(xp^2 + yp^2 + zp^2 + 1))\n", "on A: (ch, th, ph) |--> (T, X, Y, Z) = (cos(ch), cos(ph)*sin(ch)*sin(th), sin(ch)*sin(ph)*sin(th), cos(th)*sin(ch))" ] }, "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Phi.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Plots of the hyperspherical coordinate grid\n", "\n", "First let us plot the chart $(A,(\\chi,\\theta,\\phi))$ in terms of the stereographic chart $(U,(x,y,z))$ (notice that the \"point at infinity\" corresponds to $\\chi\\rightarrow \\pi$, hence the $0.9$ truncation in the $\\chi$ range)::" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n" ], "text/plain": [ "Graphics3d Object" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "graph = spher.plot(stereoN, \n", " number_values=7,\n", " ranges={ch: (0, 0.9*pi)},\n", " color={ch: 'green', th: 'blue', ph: 'red'},\n", " label_axes=False)\n", "show(graph, axes_labels=['x', 'y', 'z'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In terms of the stereographic coordinates $(V, (x',y',z'))$ (notice that the \"point at infinity\" corresponds then to $\\chi\\rightarrow 0$):" ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n" ], "text/plain": [ "Graphics3d Object" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "graph = spher.plot(stereoS, \n", " number_values=7,\n", " ranges={ch: (0.1, pi)},\n", " color={ch: 'green', th: 'blue', ph: 'red'},\n", " label_axes=False)\n", "show(graph, axes_labels=[\"x'\", \"y'\", \"z'\"])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Of course we may use the embeddding $\\Phi$ to get views of the hyperspherical coordinates in terms of the Cartesian coordinates $(T,X,Y,Z)$ of $\\mathbb{R}^4$:" ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n" ], "text/plain": [ "Graphics3d Object" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "graph = spher.plot(X4, mapping=Phi, \n", " ambient_coords=(X,Y,T),\n", " number_values=7,\n", " color={ch: 'green', th: 'blue', ph: 'red'},\n", " label_axes=False)\n", "show(graph, axes_labels=['X', 'Y', 'T'])" ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n" ], "text/plain": [ "Graphics3d Object" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "graph = spher.plot(X4, mapping=Phi, \n", " ambient_coords=(X,Y,Z),\n", " number_values=7,\n", " color={ch: 'green', th: 'blue', ph: 'red'},\n", " label_axes=False)\n", "show(graph, axes_labels=['X', 'Y', 'Z'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Projection of $\\mathbb{R}^4$ to $\\mathbb{S}^3$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We will need some projection operator from (a subset of) $\\mathbb{R}^4$ to $\\mathbb{S}^3$.\n", "Let $\\mathbb{R}^4_N$ be $\\mathbb{R}^4$ minus the hyperplane $T=-1$:" ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [], "source": [ "R4N = R4.open_subset('R4N', latex_name=r'\\mathbb{R}^4_N', \n", " coord_def={X4: T!=-1})\n", "X4N = X4.restrict(R4N)" ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\begin{array}{llcl} \\Pi_N:& \\mathbb{R}^4_N & \\longrightarrow & U \\\\ & \\left(T, X, Y, Z\\right) & \\longmapsto & \\left(x, y, z\\right) = \\left(\\frac{X}{T + 1}, \\frac{Y}{T + 1}, \\frac{Z}{T + 1}\\right) \\end{array}\n", "\\end{math}" ], "text/plain": [ "P_N: R4N --> U\n", " (T, X, Y, Z) |--> (x, y, z) = (X/(T + 1), Y/(T + 1), Z/(T + 1))" ] }, "execution_count": 45, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ProjN = R4N.diff_map(U, {(X4N, stereoN): \n", " [X/(1+T), Y/(1+T), Z/(1+T)]},\n", " name='P_N', latex_name=r'\\Pi_N')\n", "ProjN.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let us check that once applied to an embedded point of $U\\subset \\mathbb{S}^3$, this projection reduces to the identity:" ] }, { "cell_type": "code", "execution_count": 46, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\mathrm{True}\n", "\\end{math}" ], "text/plain": [ "True" ] }, "execution_count": 46, "metadata": {}, "output_type": "execute_result" } ], "source": [ "var('a b c', domain='real')\n", "p = S3((a,b,c), chart=stereoN)\n", "ProjN(Phi(p)) == p" ] }, { "cell_type": "code", "execution_count": 47, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left(\\frac{1}{2} \\, \\sqrt{3}, \\frac{1}{2} \\, \\cos\\left(b\\right) \\sin\\left(a\\right), \\frac{1}{2} \\, \\sin\\left(a\\right) \\sin\\left(b\\right), \\frac{1}{2} \\, \\cos\\left(a\\right)\\right)\n", "\\end{math}" ], "text/plain": [ "(1/2*sqrt(3), 1/2*cos(b)*sin(a), 1/2*sin(a)*sin(b), 1/2*cos(a))" ] }, "execution_count": 47, "metadata": {}, "output_type": "execute_result" } ], "source": [ "q = R4((sqrt(3)/2, sin(a)*cos(b)/2, sin(a)*sin(b)/2, cos(a)/2))\n", "X4(q)" ] }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\mathrm{False}\n", "\\end{math}" ], "text/plain": [ "False" ] }, "execution_count": 48, "metadata": {}, "output_type": "execute_result" } ], "source": [ "all([q in R4N, Phi(ProjN(q)) == q])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Quaternions" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We consider the (division) algebra of quaternions $\\mathbb{H}$ as $\\mathbb{R}^4$ endowed with the following (non-commutative) product:" ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [], "source": [ "def qprod(p,q):\n", " if p in R4 and q in R4:\n", " T1, X1, Y1, Z1 = X4(p)\n", " T2, X2, Y2, Z2 = X4(q)\n", " return R4(((T1*T2-X1*X2-Y1*Y2-Z1*Z2).simplify_full(),\n", " (T1*X2+X1*T2+Y1*Z2-Z1*Y2).simplify_full(),\n", " (T1*Y2-X1*Z2+Y1*T2+Z1*X2).simplify_full(),\n", " (T1*Z2+X1*Y2-Y1*X2+Z1*T2).simplify_full()))\n", " if p in S3 and q in S3:\n", " a = qprod(Phi(p),Phi(q))\n", " if X4(a) == (-1,0,0,0):\n", " return N\n", " return ProjN(R4N(a))\n", " raise ValueError(\"Cannot evaluate qprod of {} and {}\".format(p,q))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that we have extended the definition of the quaternionic product to $\\mathbb{S}^3$ via the embedding $\\Phi$. \n", "\n", "### Distinguished quaternions on $\\mathbb{S}^3$\n", "\n", "Let us introduce two special points on $\\mathbb{S}^3$: $\\mathbf{1}$ and $-\\mathbf{1}$." ] }, { "cell_type": "code", "execution_count": 50, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left(1, 0, 0, 0\\right)\n", "\\end{math}" ], "text/plain": [ "(1, 0, 0, 0)" ] }, "execution_count": 50, "metadata": {}, "output_type": "execute_result" } ], "source": [ "One = S3((0,0,0), chart=stereoN, name='1', latex_name=r'\\mathbf{1}')\n", "X4(Phi(One))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As we can see from the Cartesian coordinates of $\\Phi(\\mathbf{1})$, the point $\\mathbf{1}$ is actually nothing but the \"South\" pole used to define the stereographic chart $(V,(x',y',z'))$:" ] }, { "cell_type": "code", "execution_count": 51, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\mathrm{True}\n", "\\end{math}" ], "text/plain": [ "True" ] }, "execution_count": 51, "metadata": {}, "output_type": "execute_result" } ], "source": [ "One == S" ] }, { "cell_type": "code", "execution_count": 52, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left(-1, 0, 0, 0\\right)\n", "\\end{math}" ], "text/plain": [ "(-1, 0, 0, 0)" ] }, "execution_count": 52, "metadata": {}, "output_type": "execute_result" } ], "source": [ "minusOne = S3((0,0,0), chart=stereoS, name='-1', latex_name=r'-\\mathbf{1}')\n", "X4(Phi(minusOne))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The point $\\mathbf{-1}$ is thus nothing but the \"North\" pole used to define the stereographic chart $(U,(x,y,z))$:" ] }, { "cell_type": "code", "execution_count": 53, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\mathrm{True}\n", "\\end{math}" ], "text/plain": [ "True" ] }, "execution_count": 53, "metadata": {}, "output_type": "execute_result" } ], "source": [ "minusOne == N" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Next we introduce points $\\mathbf{i}$, $\\mathbf{j}$ and $\\mathbf{k}$ on $\\mathbb{S}^3$:" ] }, { "cell_type": "code", "execution_count": 54, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left(0, 1, 0, 0\\right)\n", "\\end{math}" ], "text/plain": [ "(0, 1, 0, 0)" ] }, "execution_count": 54, "metadata": {}, "output_type": "execute_result" } ], "source": [ "I = S3((1,0,0), chart=stereoN, name='i', latex_name=r'\\mathbf{i}')\n", "X4(Phi(I))" ] }, { "cell_type": "code", "execution_count": 55, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left(1, 0, 0\\right)\n", "\\end{math}" ], "text/plain": [ "(1, 0, 0)" ] }, "execution_count": 55, "metadata": {}, "output_type": "execute_result" } ], "source": [ "stereoS(I)" ] }, { "cell_type": "code", "execution_count": 56, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left(0, 0, 1, 0\\right)\n", "\\end{math}" ], "text/plain": [ "(0, 0, 1, 0)" ] }, "execution_count": 56, "metadata": {}, "output_type": "execute_result" } ], "source": [ "J = S3((0,1,0), chart=stereoN, name='j', latex_name=r'\\mathbf{j}')\n", "X4(Phi(J))" ] }, { "cell_type": "code", "execution_count": 57, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left(0, 1, 0\\right)\n", "\\end{math}" ], "text/plain": [ "(0, 1, 0)" ] }, "execution_count": 57, "metadata": {}, "output_type": "execute_result" } ], "source": [ "stereoS(J)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Since $\\mathbf{j}$ lies in $A$, contrary to $\\mathbf{i}$, we may ask for its hyperspherical coordinates:" ] }, { "cell_type": "code", "execution_count": 58, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left(\\frac{1}{2} \\, \\pi, \\frac{1}{2} \\, \\pi, \\frac{1}{2} \\, \\pi\\right)\n", "\\end{math}" ], "text/plain": [ "(1/2*pi, 1/2*pi, 1/2*pi)" ] }, "execution_count": 58, "metadata": {}, "output_type": "execute_result" } ], "source": [ "spher(J)" ] }, { "cell_type": "code", "execution_count": 59, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left(0, 0, 0, 1\\right)\n", "\\end{math}" ], "text/plain": [ "(0, 0, 0, 1)" ] }, "execution_count": 59, "metadata": {}, "output_type": "execute_result" } ], "source": [ "K = S3((0,0,1), chart=stereoN, name='k', latex_name=r'\\mathbf{k}')\n", "X4(Phi(K))" ] }, { "cell_type": "code", "execution_count": 60, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left(0, 0, 1\\right)\n", "\\end{math}" ], "text/plain": [ "(0, 0, 1)" ] }, "execution_count": 60, "metadata": {}, "output_type": "execute_result" } ], "source": [ "stereoS(K)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Hamilton's fundamental relations\n", "$$ \\mathbf{i} \\mathbf{j} \\mathbf{k} = \\mathbf{-1} $$\n", "$$ \\mathbf{i} \\mathbf{j} = \\mathbf{k},\\quad \\mathbf{j} \\mathbf{k} = \\mathbf{i}, \\quad \\mathbf{k} \\mathbf{i} = \\mathbf{j}$$\n", "are satisfied:" ] }, { "cell_type": "code", "execution_count": 61, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\mathrm{True}\n", "\\end{math}" ], "text/plain": [ "True" ] }, "execution_count": 61, "metadata": {}, "output_type": "execute_result" } ], "source": [ "qprod(I, qprod(J,K)) == minusOne" ] }, { "cell_type": "code", "execution_count": 62, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\mathrm{True}\n", "\\end{math}" ], "text/plain": [ "True" ] }, "execution_count": 62, "metadata": {}, "output_type": "execute_result" } ], "source": [ "all([qprod(I,J) == K, qprod(J,K) == I,\n", " qprod(K,I) == J])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "These relations imply $\\mathbf{i}^2 = \\mathbf{-1}$, $\\mathbf{j}^2 = \\mathbf{-1}$ and $\\mathbf{k}^2 = \\mathbf{-1}$:" ] }, { "cell_type": "code", "execution_count": 63, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\mathrm{True}\n", "\\end{math}" ], "text/plain": [ "True" ] }, "execution_count": 63, "metadata": {}, "output_type": "execute_result" } ], "source": [ "all([qprod(One,One) == One, qprod(I,I) == minusOne,\n", " qprod(J,J) == minusOne, qprod(K,K) == minusOne])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let us introduce $\\mathbf{-i}$, $\\mathbf{-j}$ and $\\mathbf{-k}$, as points of $\\mathbb{S}^3$:" ] }, { "cell_type": "code", "execution_count": 64, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left(0, -1, 0, 0\\right)\n", "\\end{math}" ], "text/plain": [ "(0, -1, 0, 0)" ] }, "execution_count": 64, "metadata": {}, "output_type": "execute_result" } ], "source": [ "minusI = qprod(minusOne, I)\n", "X4(Phi(minusI))" ] }, { "cell_type": "code", "execution_count": 65, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left(0, 0, -1, 0\\right)\n", "\\end{math}" ], "text/plain": [ "(0, 0, -1, 0)" ] }, "execution_count": 65, "metadata": {}, "output_type": "execute_result" } ], "source": [ "minusJ = qprod(minusOne, J)\n", "X4(Phi(minusJ))" ] }, { "cell_type": "code", "execution_count": 66, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left(0, 0, 0, -1\\right)\n", "\\end{math}" ], "text/plain": [ "(0, 0, 0, -1)" ] }, "execution_count": 66, "metadata": {}, "output_type": "execute_result" } ], "source": [ "minusK = qprod(minusOne, K)\n", "X4(Phi(minusK))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Quaternionic conjugation" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In the comments below (but not in the SageMath code), we shall identify $\\mathbf{1}\\in \\mathbb{S}^3$ with $\\Phi(\\mathbf{1})\\in \\mathbb{R}^4$, $\\mathbf{i}\\in \\mathbb{S}^3$ with $\\Phi(\\mathbf{i})\\in \\mathbb{R}^4$, etc. In particular, we consider $(\\mathbf{1}, \\mathbf{i}, \\mathbf{j},\\mathbf{k})$ as a basis of the quaternion algebra $\\mathbb{H}$. \n", "\n", "The *conjugate* of a quaternion $q = T + X\\mathbf{i} + Y\\mathbf{j} + Z\\mathbf{k}$ is $\\bar{q} = T - X\\mathbf{i} - Y\\mathbf{j} - Z\\mathbf{k}$; hence we define:\n" ] }, { "cell_type": "code", "execution_count": 67, "metadata": {}, "outputs": [], "source": [ "def qconj(p):\n", " if p in R4:\n", " T, X, Y, Z = X4(p)\n", " return R4((T, -X, -Y, -Z))\n", " if p in S3:\n", " a = qconj(Phi(p))\n", " if X4(a) == (-1,0,0,0):\n", " return N\n", " return ProjN(a)\n", " raise ValueError(\"Cannot evaluate qconf of {}\".format(p)) " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In particular, we have $\\bar{\\mathbf{1}} = \\mathbf{1}$, $\\bar{\\mathbf{i}} = -\\mathbf{i}$, $\\bar{\\mathbf{j}} = -\\mathbf{j}$ and $\\bar{\\mathbf{k}} = -\\mathbf{k}$:" ] }, { "cell_type": "code", "execution_count": 68, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\mathrm{True}\n", "\\end{math}" ], "text/plain": [ "True" ] }, "execution_count": 68, "metadata": {}, "output_type": "execute_result" } ], "source": [ "all([qconj(One) == One, \n", " qconj(I) == minusI,\n", " qconj(J) == minusJ, \n", " qconj(K) == minusK])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The conjugate of an element of $\\mathbb{S}^3$" ] }, { "cell_type": "code", "execution_count": 69, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left(-a, -b, -c\\right)\n", "\\end{math}" ], "text/plain": [ "(-a, -b, -c)" ] }, "execution_count": 69, "metadata": {}, "output_type": "execute_result" } ], "source": [ "assume(a != 0) # to ensure that qconj(p) is not N\n", "p = S3((a,b,c), chart=stereoN)\n", "stereoN(qconj(p))" ] }, { "cell_type": "code", "execution_count": 70, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left(-a, -b, -c\\right)\n", "\\end{math}" ], "text/plain": [ "(-a, -b, -c)" ] }, "execution_count": 70, "metadata": {}, "output_type": "execute_result" } ], "source": [ "p = S3((a,b,c), chart=stereoS)\n", "stereoS(qconj(p))" ] }, { "cell_type": "code", "execution_count": 71, "metadata": {}, "outputs": [], "source": [ "forget(a!=0)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Norm of a quaternion\n", "\n", "The quaternionic norm $\\| q\\| = \\sqrt{q\\bar{q}}$ coincide with the Euclidean norm in $\\mathbb{R}^4$, so that $\\mathbb{S}^3$ can be viewed as the set of unit quaternions; hence we define:" ] }, { "cell_type": "code", "execution_count": 72, "metadata": {}, "outputs": [], "source": [ "def qnorm(p):\n", " if p in R4:\n", " T, X, Y, Z = X4(p)\n", " return (sqrt(T^2 + X^2 + Y^2 + Z^2)).simplify_full()\n", " if p in S3:\n", " return 1\n", " raise ValueError(\"Cannot evaluate qnorm of {}\".format(p)) " ] }, { "cell_type": "code", "execution_count": 73, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\sqrt{a^{2} + b^{2} + c^{2} + d^{2}}\n", "\\end{math}" ], "text/plain": [ "sqrt(a^2 + b^2 + c^2 + d^2)" ] }, "execution_count": 73, "metadata": {}, "output_type": "execute_result" } ], "source": [ "var('d', domain='real')\n", "q = R4((a,b,c,d))\n", "qnorm(q)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let us check that $\\| q\\|^2 = q\\bar{q}$:" ] }, { "cell_type": "code", "execution_count": 74, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\mathrm{True}\n", "\\end{math}" ], "text/plain": [ "True" ] }, "execution_count": 74, "metadata": {}, "output_type": "execute_result" } ], "source": [ "R4((qnorm(q)^2,0,0,0)) == qprod(q, qconj(q))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As elements of $\\mathbb{S}^3$, $\\mathbf{1}$, $\\mathbf{i}$, $\\mathbf{j}$ and $\\mathbf{k}$ have all unit norm:" ] }, { "cell_type": "code", "execution_count": 75, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\mathrm{True}\n", "\\end{math}" ], "text/plain": [ "True" ] }, "execution_count": 75, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(qnorm(One), qnorm(I), qnorm(J), qnorm(K)) == (1, 1, 1, 1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Hopf map" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We shall define the Hopf map by considering first the map \n", "$$ \\begin{array}{cccc}\n", " C: & \\mathbb{R}^4 & \\to & \\mathbb{R}^4\\\\\n", " & p & \\mapsto & p \\mathbf{k} \\bar{p}\n", " \\end{array} $$\n", "The coordinate expression of $C$ is obtained as follows:" ] }, { "cell_type": "code", "execution_count": 76, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left(0, 2 \\, T Y + 2 \\, X Z, -2 \\, T X + 2 \\, Y Z, T^{2} - X^{2} - Y^{2} + Z^{2}\\right)\n", "\\end{math}" ], "text/plain": [ "(0, 2*T*Y + 2*X*Z, -2*T*X + 2*Y*Z, T^2 - X^2 - Y^2 + Z^2)" ] }, "execution_count": 76, "metadata": {}, "output_type": "execute_result" } ], "source": [ "p = R4((T,X,Y,Z)) # a generic point of R^4\n", "coord_Cp = X4( qprod(p, qprod(Phi(K), qconj(p))) )\n", "coord_Cp" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Therefore we define $C$ as" ] }, { "cell_type": "code", "execution_count": 77, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\begin{array}{llcl} C:& \\mathbb{R}^4 & \\longrightarrow & \\mathbb{R}^4 \\\\ & \\left(T, X, Y, Z\\right) & \\longmapsto & \\left(0, 2 \\, T Y + 2 \\, X Z, -2 \\, T X + 2 \\, Y Z, T^{2} - X^{2} - Y^{2} + Z^{2}\\right) \\end{array}\n", "\\end{math}" ], "text/plain": [ "C: R^4 --> R^4\n", " (T, X, Y, Z) |--> (0, 2*T*Y + 2*X*Z, -2*T*X + 2*Y*Z, T^2 - X^2 - Y^2 + Z^2)" ] }, "execution_count": 77, "metadata": {}, "output_type": "execute_result" } ], "source": [ "C = R4.diff_map(R4, coord_Cp, name='C')\n", "C.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The restriction of $C$ to $\\Phi(\\mathbb{S}^3)\\subset \\mathbb{R}^4$ can be viewed as the map \n", "$C\\circ \\Phi: \\mathbb{S}^3 \\to \\mathbb{R}^4$ :" ] }, { "cell_type": "code", "execution_count": 78, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\begin{array}{llcl} & \\mathbb{S}^3 & \\longrightarrow & \\mathbb{R}^4 \\\\ \\mbox{on}\\ U : & \\left(x, y, z\\right) & \\longmapsto & \\left(T, X, Y, Z\\right) = \\left(0, -\\frac{4 \\, {\\left(y^{3} + y z^{2} + {\\left(x^{2} - 1\\right)} y - 2 \\, x z\\right)}}{x^{4} + y^{4} + z^{4} + 2 \\, {\\left(x^{2} + 1\\right)} y^{2} + 2 \\, {\\left(x^{2} + y^{2} + 1\\right)} z^{2} + 2 \\, x^{2} + 1}, \\frac{4 \\, {\\left(x^{3} + x y^{2} + x z^{2} + 2 \\, y z - x\\right)}}{x^{4} + y^{4} + z^{4} + 2 \\, {\\left(x^{2} + 1\\right)} y^{2} + 2 \\, {\\left(x^{2} + y^{2} + 1\\right)} z^{2} + 2 \\, x^{2} + 1}, \\frac{x^{4} + y^{4} + z^{4} + 2 \\, {\\left(x^{2} - 3\\right)} y^{2} + 2 \\, {\\left(x^{2} + y^{2} + 1\\right)} z^{2} - 6 \\, x^{2} + 1}{x^{4} + y^{4} + z^{4} + 2 \\, {\\left(x^{2} + 1\\right)} y^{2} + 2 \\, {\\left(x^{2} + y^{2} + 1\\right)} z^{2} + 2 \\, x^{2} + 1}\\right) \\\\ \\mbox{on}\\ V : & \\left({x'}, {y'}, {z'}\\right) & \\longmapsto & \\left(T, X, Y, Z\\right) = \\left(0, \\frac{4 \\, {\\left({y'}^{3} + {y'} {z'}^{2} + {\\left({x'}^{2} - 1\\right)} {y'} + 2 \\, {x'} {z'}\\right)}}{{x'}^{4} + {y'}^{4} + {z'}^{4} + 2 \\, {\\left({x'}^{2} + 1\\right)} {y'}^{2} + 2 \\, {\\left({x'}^{2} + {y'}^{2} + 1\\right)} {z'}^{2} + 2 \\, {x'}^{2} + 1}, -\\frac{4 \\, {\\left({x'}^{3} + {x'} {y'}^{2} + {x'} {z'}^{2} - 2 \\, {y'} {z'} - {x'}\\right)}}{{x'}^{4} + {y'}^{4} + {z'}^{4} + 2 \\, {\\left({x'}^{2} + 1\\right)} {y'}^{2} + 2 \\, {\\left({x'}^{2} + {y'}^{2} + 1\\right)} {z'}^{2} + 2 \\, {x'}^{2} + 1}, \\frac{{x'}^{4} + {y'}^{4} + {z'}^{4} + 2 \\, {\\left({x'}^{2} - 3\\right)} {y'}^{2} + 2 \\, {\\left({x'}^{2} + {y'}^{2} + 1\\right)} {z'}^{2} - 6 \\, {x'}^{2} + 1}{{x'}^{4} + {y'}^{4} + {z'}^{4} + 2 \\, {\\left({x'}^{2} + 1\\right)} {y'}^{2} + 2 \\, {\\left({x'}^{2} + {y'}^{2} + 1\\right)} {z'}^{2} + 2 \\, {x'}^{2} + 1}\\right) \\\\ \\mbox{on}\\ A : & \\left({\\chi}, {\\theta}, {\\phi}\\right) & \\longmapsto & \\left(T, X, Y, Z\\right) = \\left(0, 2 \\, {\\left(\\cos\\left({\\phi}\\right) \\cos\\left({\\theta}\\right) \\sin\\left({\\chi}\\right)^{2} + \\cos\\left({\\chi}\\right) \\sin\\left({\\chi}\\right) \\sin\\left({\\phi}\\right)\\right)} \\sin\\left({\\theta}\\right), 2 \\, {\\left(\\cos\\left({\\theta}\\right) \\sin\\left({\\chi}\\right)^{2} \\sin\\left({\\phi}\\right) - \\cos\\left({\\chi}\\right) \\cos\\left({\\phi}\\right) \\sin\\left({\\chi}\\right)\\right)} \\sin\\left({\\theta}\\right), -2 \\, \\sin\\left({\\chi}\\right)^{2} \\sin\\left({\\theta}\\right)^{2} + 1\\right) \\end{array}\n", "\\end{math}" ], "text/plain": [ "S^3 --> R^4\n", "on U: (x, y, z) |--> (T, X, Y, Z) = (0, -4*(y^3 + y*z^2 + (x^2 - 1)*y - 2*x*z)/(x^4 + y^4 + z^4 + 2*(x^2 + 1)*y^2 + 2*(x^2 + y^2 + 1)*z^2 + 2*x^2 + 1), 4*(x^3 + x*y^2 + x*z^2 + 2*y*z - x)/(x^4 + y^4 + z^4 + 2*(x^2 + 1)*y^2 + 2*(x^2 + y^2 + 1)*z^2 + 2*x^2 + 1), (x^4 + y^4 + z^4 + 2*(x^2 - 3)*y^2 + 2*(x^2 + y^2 + 1)*z^2 - 6*x^2 + 1)/(x^4 + y^4 + z^4 + 2*(x^2 + 1)*y^2 + 2*(x^2 + y^2 + 1)*z^2 + 2*x^2 + 1))\n", "on V: (xp, yp, zp) |--> (T, X, Y, Z) = (0, 4*(yp^3 + yp*zp^2 + (xp^2 - 1)*yp + 2*xp*zp)/(xp^4 + yp^4 + zp^4 + 2*(xp^2 + 1)*yp^2 + 2*(xp^2 + yp^2 + 1)*zp^2 + 2*xp^2 + 1), -4*(xp^3 + xp*yp^2 + xp*zp^2 - 2*yp*zp - xp)/(xp^4 + yp^4 + zp^4 + 2*(xp^2 + 1)*yp^2 + 2*(xp^2 + yp^2 + 1)*zp^2 + 2*xp^2 + 1), (xp^4 + yp^4 + zp^4 + 2*(xp^2 - 3)*yp^2 + 2*(xp^2 + yp^2 + 1)*zp^2 - 6*xp^2 + 1)/(xp^4 + yp^4 + zp^4 + 2*(xp^2 + 1)*yp^2 + 2*(xp^2 + yp^2 + 1)*zp^2 + 2*xp^2 + 1))\n", "on A: (ch, th, ph) |--> (T, X, Y, Z) = (0, 2*(cos(ph)*cos(th)*sin(ch)^2 + cos(ch)*sin(ch)*sin(ph))*sin(th), 2*(cos(th)*sin(ch)^2*sin(ph) - cos(ch)*cos(ph)*sin(ch))*sin(th), -2*sin(ch)^2*sin(th)^2 + 1)" ] }, "execution_count": 78, "metadata": {}, "output_type": "execute_result" } ], "source": [ "CS = C * Phi\n", "CS.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "On the above coordinate expressions, we note that the codomain of $C\\circ \\Phi$ lies in the hyperplane $T=0$, i.e. in the set $\\operatorname{Im}\\mathbb{H}$ of pure imaginary quaternions.\n", "Moreover, if we consider a generic point $p\\in U\\subset\\mathbb{S}^3$:" ] }, { "cell_type": "code", "execution_count": 79, "metadata": {}, "outputs": [], "source": [ "p = S3((a,b,c), chart=stereoN)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "we have $\\| C\\circ\\Phi(p) \\| = 1$:" ] }, { "cell_type": "code", "execution_count": 80, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}1\n", "\\end{math}" ], "text/plain": [ "1" ] }, "execution_count": 80, "metadata": {}, "output_type": "execute_result" } ], "source": [ "qnorm(CS(p))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For the only point of $\\mathbb{S}^3$ not lying in $U$, i.e. $N = -\\mathbf{1}$, we have as well" ] }, { "cell_type": "code", "execution_count": 81, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}1\n", "\\end{math}" ], "text/plain": [ "1" ] }, "execution_count": 81, "metadata": {}, "output_type": "execute_result" } ], "source": [ "qnorm(CS(N))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Hence the codomain of $C \\circ\\Phi$ lies in $\\Phi(\\mathbb{S}^3)$. From the previous result, we conclude that it actually lies in $\\Phi(\\mathbb{S}^3)\\cap \\operatorname{Im}\\mathbb{H}$, which is a 2-sphere: the 2-sphere of unit imaginary quaternions.\n", "\n", "In particular, we have:" ] }, { "cell_type": "code", "execution_count": 82, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\mathrm{True}\n", "\\end{math}" ], "text/plain": [ "True" ] }, "execution_count": 82, "metadata": {}, "output_type": "execute_result" } ], "source": [ "all([CS(K) == Phi(K), CS(One) == Phi(K), CS(minusOne) == Phi(K)])" ] }, { "cell_type": "code", "execution_count": 83, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\mathrm{True}\n", "\\end{math}" ], "text/plain": [ "True" ] }, "execution_count": 83, "metadata": {}, "output_type": "execute_result" } ], "source": [ "all([CS(I) == Phi(minusK), CS(J) == Phi(minusK),\n", " CS(minusI) == Phi(minusK), CS(minusJ) == Phi(minusK)])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "On $\\Phi(\\mathbb{S}^3)\\cap \\operatorname{Im}\\mathbb{H}$, the inverse embedding $\\Phi^{-1}$ coincides with \n", "the projector $\\Pi_N$ introduced above since $(\\Phi(\\mathbb{S}^3)\\cap \\operatorname{Im}\\mathbb{H})\\subset \\mathbb{R}^4_N$. Hence the map $H = \\Phi^{-1}\\circ C \\circ \\Phi: \\mathbb{S}^3 \\to \\mathbb{S}^3$ can be obtained as $\\Pi_N\\circ C \\circ \\Phi$:" ] }, { "cell_type": "code", "execution_count": 84, "metadata": {}, "outputs": [], "source": [ "H = ProjN * CS.restrict(S3, subcodomain=R4N)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that we have used the method `restrict` with the argument `subcodomain=R4N`\n", "to declare that the codomain of $C\\circ\\Phi$ actually lies in $\\mathbb{R}^4_N$, so that the composition with $\\Pi_N$ is well defined. \n", "We have" ] }, { "cell_type": "code", "execution_count": 85, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\begin{array}{llcl} & \\mathbb{S}^3 & \\longrightarrow & U \\\\ \\mbox{on}\\ U : & \\left(x, y, z\\right) & \\longmapsto & \\left(-\\frac{4 \\, {\\left(y^{3} + y z^{2} + {\\left(x^{2} - 1\\right)} y - 2 \\, x z\\right)}}{x^{4} + y^{4} + z^{4} + 2 \\, {\\left(x^{2} + 1\\right)} y^{2} + 2 \\, {\\left(x^{2} + y^{2} + 1\\right)} z^{2} + 2 \\, x^{2} + 1}, \\frac{4 \\, {\\left(x^{3} + x y^{2} + x z^{2} + 2 \\, y z - x\\right)}}{x^{4} + y^{4} + z^{4} + 2 \\, {\\left(x^{2} + 1\\right)} y^{2} + 2 \\, {\\left(x^{2} + y^{2} + 1\\right)} z^{2} + 2 \\, x^{2} + 1}, \\frac{x^{4} + y^{4} + z^{4} + 2 \\, {\\left(x^{2} - 3\\right)} y^{2} + 2 \\, {\\left(x^{2} + y^{2} + 1\\right)} z^{2} - 6 \\, x^{2} + 1}{x^{4} + y^{4} + z^{4} + 2 \\, {\\left(x^{2} + 1\\right)} y^{2} + 2 \\, {\\left(x^{2} + y^{2} + 1\\right)} z^{2} + 2 \\, x^{2} + 1}\\right) \\\\ \\mbox{on}\\ V : & \\left({x'}, {y'}, {z'}\\right) & \\longmapsto & \\left(x, y, z\\right) = \\left(\\frac{4 \\, {\\left({y'}^{3} + {y'} {z'}^{2} + {\\left({x'}^{2} - 1\\right)} {y'} + 2 \\, {x'} {z'}\\right)}}{{x'}^{4} + {y'}^{4} + {z'}^{4} + 2 \\, {\\left({x'}^{2} + 1\\right)} {y'}^{2} + 2 \\, {\\left({x'}^{2} + {y'}^{2} + 1\\right)} {z'}^{2} + 2 \\, {x'}^{2} + 1}, -\\frac{4 \\, {\\left({x'}^{3} + {x'} {y'}^{2} + {x'} {z'}^{2} - 2 \\, {y'} {z'} - {x'}\\right)}}{{x'}^{4} + {y'}^{4} + {z'}^{4} + 2 \\, {\\left({x'}^{2} + 1\\right)} {y'}^{2} + 2 \\, {\\left({x'}^{2} + {y'}^{2} + 1\\right)} {z'}^{2} + 2 \\, {x'}^{2} + 1}, \\frac{{x'}^{4} + {y'}^{4} + {z'}^{4} + 2 \\, {\\left({x'}^{2} - 3\\right)} {y'}^{2} + 2 \\, {\\left({x'}^{2} + {y'}^{2} + 1\\right)} {z'}^{2} - 6 \\, {x'}^{2} + 1}{{x'}^{4} + {y'}^{4} + {z'}^{4} + 2 \\, {\\left({x'}^{2} + 1\\right)} {y'}^{2} + 2 \\, {\\left({x'}^{2} + {y'}^{2} + 1\\right)} {z'}^{2} + 2 \\, {x'}^{2} + 1}\\right) \\\\ \\mbox{on}\\ A : & \\left({\\chi}, {\\theta}, {\\phi}\\right) & \\longmapsto & \\left(x, y, z\\right) = \\left(2 \\, {\\left(\\cos\\left({\\phi}\\right) \\cos\\left({\\theta}\\right) \\sin\\left({\\chi}\\right)^{2} + \\cos\\left({\\chi}\\right) \\sin\\left({\\chi}\\right) \\sin\\left({\\phi}\\right)\\right)} \\sin\\left({\\theta}\\right), 2 \\, {\\left(\\cos\\left({\\theta}\\right) \\sin\\left({\\chi}\\right)^{2} \\sin\\left({\\phi}\\right) - \\cos\\left({\\chi}\\right) \\cos\\left({\\phi}\\right) \\sin\\left({\\chi}\\right)\\right)} \\sin\\left({\\theta}\\right), -2 \\, \\sin\\left({\\chi}\\right)^{2} \\sin\\left({\\theta}\\right)^{2} + 1\\right) \\end{array}\n", "\\end{math}" ], "text/plain": [ "S^3 --> U\n", "on U: (x, y, z) |--> (-4*(y^3 + y*z^2 + (x^2 - 1)*y - 2*x*z)/(x^4 + y^4 + z^4 + 2*(x^2 + 1)*y^2 + 2*(x^2 + y^2 + 1)*z^2 + 2*x^2 + 1), 4*(x^3 + x*y^2 + x*z^2 + 2*y*z - x)/(x^4 + y^4 + z^4 + 2*(x^2 + 1)*y^2 + 2*(x^2 + y^2 + 1)*z^2 + 2*x^2 + 1), (x^4 + y^4 + z^4 + 2*(x^2 - 3)*y^2 + 2*(x^2 + y^2 + 1)*z^2 - 6*x^2 + 1)/(x^4 + y^4 + z^4 + 2*(x^2 + 1)*y^2 + 2*(x^2 + y^2 + 1)*z^2 + 2*x^2 + 1))\n", "on V: (xp, yp, zp) |--> (x, y, z) = (4*(yp^3 + yp*zp^2 + (xp^2 - 1)*yp + 2*xp*zp)/(xp^4 + yp^4 + zp^4 + 2*(xp^2 + 1)*yp^2 + 2*(xp^2 + yp^2 + 1)*zp^2 + 2*xp^2 + 1), -4*(xp^3 + xp*yp^2 + xp*zp^2 - 2*yp*zp - xp)/(xp^4 + yp^4 + zp^4 + 2*(xp^2 + 1)*yp^2 + 2*(xp^2 + yp^2 + 1)*zp^2 + 2*xp^2 + 1), (xp^4 + yp^4 + zp^4 + 2*(xp^2 - 3)*yp^2 + 2*(xp^2 + yp^2 + 1)*zp^2 - 6*xp^2 + 1)/(xp^4 + yp^4 + zp^4 + 2*(xp^2 + 1)*yp^2 + 2*(xp^2 + yp^2 + 1)*zp^2 + 2*xp^2 + 1))\n", "on A: (ch, th, ph) |--> (x, y, z) = (2*(cos(ph)*cos(th)*sin(ch)^2 + cos(ch)*sin(ch)*sin(ph))*sin(th), 2*(cos(th)*sin(ch)^2*sin(ph) - cos(ch)*cos(ph)*sin(ch))*sin(th), -2*sin(ch)^2*sin(th)^2 + 1)" ] }, "execution_count": 85, "metadata": {}, "output_type": "execute_result" } ], "source": [ "H.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Actually since neither $N$ (which has $T=-1$) nor $S$ (which has $T=1$) lie in the codomain of $C\\circ\\Phi$, we may safely declare that the codomain of $H$ is $W = U\\cap V$:" ] }, { "cell_type": "code", "execution_count": 86, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\begin{array}{llcl} & \\mathbb{S}^3 & \\longrightarrow & W \\\\ \\mbox{on}\\ U : & \\left(x, y, z\\right) & \\longmapsto & \\left(x, y, z\\right) = \\left(-\\frac{4 \\, {\\left(y^{3} + y z^{2} + {\\left(x^{2} - 1\\right)} y - 2 \\, x z\\right)}}{x^{4} + y^{4} + z^{4} + 2 \\, {\\left(x^{2} + 1\\right)} y^{2} + 2 \\, {\\left(x^{2} + y^{2} + 1\\right)} z^{2} + 2 \\, x^{2} + 1}, \\frac{4 \\, {\\left(x^{3} + x y^{2} + x z^{2} + 2 \\, y z - x\\right)}}{x^{4} + y^{4} + z^{4} + 2 \\, {\\left(x^{2} + 1\\right)} y^{2} + 2 \\, {\\left(x^{2} + y^{2} + 1\\right)} z^{2} + 2 \\, x^{2} + 1}, \\frac{x^{4} + y^{4} + z^{4} + 2 \\, {\\left(x^{2} - 3\\right)} y^{2} + 2 \\, {\\left(x^{2} + y^{2} + 1\\right)} z^{2} - 6 \\, x^{2} + 1}{x^{4} + y^{4} + z^{4} + 2 \\, {\\left(x^{2} + 1\\right)} y^{2} + 2 \\, {\\left(x^{2} + y^{2} + 1\\right)} z^{2} + 2 \\, x^{2} + 1}\\right) \\\\ \\mbox{on}\\ U : & \\left(x, y, z\\right) & \\longmapsto & \\left({x'}, {y'}, {z'}\\right) = \\left(-\\frac{4 \\, {\\left(y^{3} + y z^{2} + {\\left(x^{2} - 1\\right)} y - 2 \\, x z\\right)}}{x^{4} + y^{4} + z^{4} + 2 \\, {\\left(x^{2} + 1\\right)} y^{2} + 2 \\, {\\left(x^{2} + y^{2} + 1\\right)} z^{2} + 2 \\, x^{2} + 1}, \\frac{4 \\, {\\left(x^{3} + x y^{2} + x z^{2} + 2 \\, y z - x\\right)}}{x^{4} + y^{4} + z^{4} + 2 \\, {\\left(x^{2} + 1\\right)} y^{2} + 2 \\, {\\left(x^{2} + y^{2} + 1\\right)} z^{2} + 2 \\, x^{2} + 1}, \\frac{x^{4} + y^{4} + z^{4} + 2 \\, {\\left(x^{2} - 3\\right)} y^{2} + 2 \\, {\\left(x^{2} + y^{2} + 1\\right)} z^{2} - 6 \\, x^{2} + 1}{x^{4} + y^{4} + z^{4} + 2 \\, {\\left(x^{2} + 1\\right)} y^{2} + 2 \\, {\\left(x^{2} + y^{2} + 1\\right)} z^{2} + 2 \\, x^{2} + 1}\\right) \\\\ \\mbox{on}\\ V : & \\left({x'}, {y'}, {z'}\\right) & \\longmapsto & \\left(x, y, z\\right) = \\left(\\frac{4 \\, {\\left({y'}^{3} + {y'} {z'}^{2} + {\\left({x'}^{2} - 1\\right)} {y'} + 2 \\, {x'} {z'}\\right)}}{{x'}^{4} + {y'}^{4} + {z'}^{4} + 2 \\, {\\left({x'}^{2} + 1\\right)} {y'}^{2} + 2 \\, {\\left({x'}^{2} + {y'}^{2} + 1\\right)} {z'}^{2} + 2 \\, {x'}^{2} + 1}, -\\frac{4 \\, {\\left({x'}^{3} + {x'} {y'}^{2} + {x'} {z'}^{2} - 2 \\, {y'} {z'} - {x'}\\right)}}{{x'}^{4} + {y'}^{4} + {z'}^{4} + 2 \\, {\\left({x'}^{2} + 1\\right)} {y'}^{2} + 2 \\, {\\left({x'}^{2} + {y'}^{2} + 1\\right)} {z'}^{2} + 2 \\, {x'}^{2} + 1}, \\frac{{x'}^{4} + {y'}^{4} + {z'}^{4} + 2 \\, {\\left({x'}^{2} - 3\\right)} {y'}^{2} + 2 \\, {\\left({x'}^{2} + {y'}^{2} + 1\\right)} {z'}^{2} - 6 \\, {x'}^{2} + 1}{{x'}^{4} + {y'}^{4} + {z'}^{4} + 2 \\, {\\left({x'}^{2} + 1\\right)} {y'}^{2} + 2 \\, {\\left({x'}^{2} + {y'}^{2} + 1\\right)} {z'}^{2} + 2 \\, {x'}^{2} + 1}\\right) \\\\ \\mbox{on}\\ V : & \\left({x'}, {y'}, {z'}\\right) & \\longmapsto & \\left({x'}, {y'}, {z'}\\right) = \\left(\\frac{4 \\, {\\left({y'}^{3} + {y'} {z'}^{2} + {\\left({x'}^{2} - 1\\right)} {y'} + 2 \\, {x'} {z'}\\right)}}{{x'}^{4} + {y'}^{4} + {z'}^{4} + 2 \\, {\\left({x'}^{2} + 1\\right)} {y'}^{2} + 2 \\, {\\left({x'}^{2} + {y'}^{2} + 1\\right)} {z'}^{2} + 2 \\, {x'}^{2} + 1}, -\\frac{4 \\, {\\left({x'}^{3} + {x'} {y'}^{2} + {x'} {z'}^{2} - 2 \\, {y'} {z'} - {x'}\\right)}}{{x'}^{4} + {y'}^{4} + {z'}^{4} + 2 \\, {\\left({x'}^{2} + 1\\right)} {y'}^{2} + 2 \\, {\\left({x'}^{2} + {y'}^{2} + 1\\right)} {z'}^{2} + 2 \\, {x'}^{2} + 1}, \\frac{{x'}^{4} + {y'}^{4} + {z'}^{4} + 2 \\, {\\left({x'}^{2} - 3\\right)} {y'}^{2} + 2 \\, {\\left({x'}^{2} + {y'}^{2} + 1\\right)} {z'}^{2} - 6 \\, {x'}^{2} + 1}{{x'}^{4} + {y'}^{4} + {z'}^{4} + 2 \\, {\\left({x'}^{2} + 1\\right)} {y'}^{2} + 2 \\, {\\left({x'}^{2} + {y'}^{2} + 1\\right)} {z'}^{2} + 2 \\, {x'}^{2} + 1}\\right) \\\\ \\mbox{on}\\ A : & \\left({\\chi}, {\\theta}, {\\phi}\\right) & \\longmapsto & \\left(x, y, z\\right) = \\left(2 \\, {\\left(\\cos\\left({\\phi}\\right) \\cos\\left({\\theta}\\right) \\sin\\left({\\chi}\\right)^{2} + \\cos\\left({\\chi}\\right) \\sin\\left({\\chi}\\right) \\sin\\left({\\phi}\\right)\\right)} \\sin\\left({\\theta}\\right), 2 \\, {\\left(\\cos\\left({\\theta}\\right) \\sin\\left({\\chi}\\right)^{2} \\sin\\left({\\phi}\\right) - \\cos\\left({\\chi}\\right) \\cos\\left({\\phi}\\right) \\sin\\left({\\chi}\\right)\\right)} \\sin\\left({\\theta}\\right), -2 \\, \\sin\\left({\\chi}\\right)^{2} \\sin\\left({\\theta}\\right)^{2} + 1\\right) \\\\ \\mbox{on}\\ A : & \\left({\\chi}, {\\theta}, {\\phi}\\right) & \\longmapsto & \\left({x'}, {y'}, {z'}\\right) = \\left(2 \\, {\\left(\\cos\\left({\\phi}\\right) \\cos\\left({\\theta}\\right) \\sin\\left({\\chi}\\right)^{2} + \\cos\\left({\\chi}\\right) \\sin\\left({\\chi}\\right) \\sin\\left({\\phi}\\right)\\right)} \\sin\\left({\\theta}\\right), 2 \\, {\\left(\\cos\\left({\\theta}\\right) \\sin\\left({\\chi}\\right)^{2} \\sin\\left({\\phi}\\right) - \\cos\\left({\\chi}\\right) \\cos\\left({\\phi}\\right) \\sin\\left({\\chi}\\right)\\right)} \\sin\\left({\\theta}\\right), -2 \\, \\sin\\left({\\chi}\\right)^{2} \\sin\\left({\\theta}\\right)^{2} + 1\\right) \\end{array}\n", "\\end{math}" ], "text/plain": [ "S^3 --> W\n", "on U: (x, y, z) |--> (x, y, z) = (-4*(y^3 + y*z^2 + (x^2 - 1)*y - 2*x*z)/(x^4 + y^4 + z^4 + 2*(x^2 + 1)*y^2 + 2*(x^2 + y^2 + 1)*z^2 + 2*x^2 + 1), 4*(x^3 + x*y^2 + x*z^2 + 2*y*z - x)/(x^4 + y^4 + z^4 + 2*(x^2 + 1)*y^2 + 2*(x^2 + y^2 + 1)*z^2 + 2*x^2 + 1), (x^4 + y^4 + z^4 + 2*(x^2 - 3)*y^2 + 2*(x^2 + y^2 + 1)*z^2 - 6*x^2 + 1)/(x^4 + y^4 + z^4 + 2*(x^2 + 1)*y^2 + 2*(x^2 + y^2 + 1)*z^2 + 2*x^2 + 1))\n", "on U: (x, y, z) |--> (xp, yp, zp) = (-4*(y^3 + y*z^2 + (x^2 - 1)*y - 2*x*z)/(x^4 + y^4 + z^4 + 2*(x^2 + 1)*y^2 + 2*(x^2 + y^2 + 1)*z^2 + 2*x^2 + 1), 4*(x^3 + x*y^2 + x*z^2 + 2*y*z - x)/(x^4 + y^4 + z^4 + 2*(x^2 + 1)*y^2 + 2*(x^2 + y^2 + 1)*z^2 + 2*x^2 + 1), (x^4 + y^4 + z^4 + 2*(x^2 - 3)*y^2 + 2*(x^2 + y^2 + 1)*z^2 - 6*x^2 + 1)/(x^4 + y^4 + z^4 + 2*(x^2 + 1)*y^2 + 2*(x^2 + y^2 + 1)*z^2 + 2*x^2 + 1))\n", "on V: (xp, yp, zp) |--> (x, y, z) = (4*(yp^3 + yp*zp^2 + (xp^2 - 1)*yp + 2*xp*zp)/(xp^4 + yp^4 + zp^4 + 2*(xp^2 + 1)*yp^2 + 2*(xp^2 + yp^2 + 1)*zp^2 + 2*xp^2 + 1), -4*(xp^3 + xp*yp^2 + xp*zp^2 - 2*yp*zp - xp)/(xp^4 + yp^4 + zp^4 + 2*(xp^2 + 1)*yp^2 + 2*(xp^2 + yp^2 + 1)*zp^2 + 2*xp^2 + 1), (xp^4 + yp^4 + zp^4 + 2*(xp^2 - 3)*yp^2 + 2*(xp^2 + yp^2 + 1)*zp^2 - 6*xp^2 + 1)/(xp^4 + yp^4 + zp^4 + 2*(xp^2 + 1)*yp^2 + 2*(xp^2 + yp^2 + 1)*zp^2 + 2*xp^2 + 1))\n", "on V: (xp, yp, zp) |--> (xp, yp, zp) = (4*(yp^3 + yp*zp^2 + (xp^2 - 1)*yp + 2*xp*zp)/(xp^4 + yp^4 + zp^4 + 2*(xp^2 + 1)*yp^2 + 2*(xp^2 + yp^2 + 1)*zp^2 + 2*xp^2 + 1), -4*(xp^3 + xp*yp^2 + xp*zp^2 - 2*yp*zp - xp)/(xp^4 + yp^4 + zp^4 + 2*(xp^2 + 1)*yp^2 + 2*(xp^2 + yp^2 + 1)*zp^2 + 2*xp^2 + 1), (xp^4 + yp^4 + zp^4 + 2*(xp^2 - 3)*yp^2 + 2*(xp^2 + yp^2 + 1)*zp^2 - 6*xp^2 + 1)/(xp^4 + yp^4 + zp^4 + 2*(xp^2 + 1)*yp^2 + 2*(xp^2 + yp^2 + 1)*zp^2 + 2*xp^2 + 1))\n", "on A: (ch, th, ph) |--> (x, y, z) = (2*(cos(ph)*cos(th)*sin(ch)^2 + cos(ch)*sin(ch)*sin(ph))*sin(th), 2*(cos(th)*sin(ch)^2*sin(ph) - cos(ch)*cos(ph)*sin(ch))*sin(th), -2*sin(ch)^2*sin(th)^2 + 1)\n", "on A: (ch, th, ph) |--> (xp, yp, zp) = (2*(cos(ph)*cos(th)*sin(ch)^2 + cos(ch)*sin(ch)*sin(ph))*sin(th), 2*(cos(th)*sin(ch)^2*sin(ph) - cos(ch)*cos(ph)*sin(ch))*sin(th), -2*sin(ch)^2*sin(th)^2 + 1)" ] }, "execution_count": 86, "metadata": {}, "output_type": "execute_result" } ], "source": [ "H = H.restrict(S3, subcodomain=W)\n", "H.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We have $H(\\mathbf{k})=H(\\mathbf{1})=H(-\\mathbf{k})=H(-\\mathbf{1})=\\mathbf{k}$:" ] }, { "cell_type": "code", "execution_count": 87, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\mathrm{True}\n", "\\end{math}" ], "text/plain": [ "True" ] }, "execution_count": 87, "metadata": {}, "output_type": "execute_result" } ], "source": [ "all([H(K) == K, H(One) == K, H(minusK) == K, \n", " H(minusOne) == K])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "and $H(\\mathbf{i})=H(\\mathbf{j})=-\\mathbf{k}$:" ] }, { "cell_type": "code", "execution_count": 88, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\mathrm{True}\n", "\\end{math}" ], "text/plain": [ "True" ] }, "execution_count": 88, "metadata": {}, "output_type": "execute_result" } ], "source": [ "all([H(I) == minusK, H(J) == minusK])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let us consider the expression of $H$ in stereographic coordinates:" ] }, { "cell_type": "code", "execution_count": 89, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left(-\\frac{4 \\, {\\left(x^{2} y + y^{3} + y z^{2} - 2 \\, x z - y\\right)}}{{\\left(x^{2} + y^{2} + z^{2} + 1\\right)}^{2}}, \\frac{4 \\, {\\left(x^{3} + x y^{2} + x z^{2} + 2 \\, y z - x\\right)}}{{\\left(x^{2} + y^{2} + z^{2} + 1\\right)}^{2}}, \\frac{x^{4} + 2 \\, x^{2} y^{2} + y^{4} + 2 \\, x^{2} z^{2} + 2 \\, y^{2} z^{2} + z^{4} - 6 \\, x^{2} - 6 \\, y^{2} + 2 \\, z^{2} + 1}{{\\left(x^{2} + y^{2} + z^{2} + 1\\right)}^{2}}\\right)\n", "\\end{math}" ], "text/plain": [ "(-4*(x^2*y + y^3 + y*z^2 - 2*x*z - y)/(x^2 + y^2 + z^2 + 1)^2,\n", " 4*(x^3 + x*y^2 + x*z^2 + 2*y*z - x)/(x^2 + y^2 + z^2 + 1)^2,\n", " (x^4 + 2*x^2*y^2 + y^4 + 2*x^2*z^2 + 2*y^2*z^2 + z^4 - 6*x^2 - 6*y^2 + 2*z^2 + 1)/(x^2 + y^2 + z^2 + 1)^2)" ] }, "execution_count": 89, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Hx, Hy, Hz = H.expr(stereoN, stereoN)\n", "(Hx.factor(), Hy.factor(), Hz.factor())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We have" ] }, { "cell_type": "code", "execution_count": 90, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}1\n", "\\end{math}" ], "text/plain": [ "1" ] }, "execution_count": 90, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(Hx^2 + Hy^2 + Hz^2).simplify_full()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "which shows that the codomain of $H$ lies in the 2-sphere of equation $x^2+y^2+z^2=1$ in stereographic coordinates. This is not surprising since (i) the equation of the 2-sphere of\n", "unit imaginary quaternions, $\\Phi(\\mathbb{S}^3)\\cap \\operatorname{Im}\\mathbb{H}$, is $T=0$ and $X^2+Y^2+Z^2=1$ and (ii) for \n", "$T=0$, we have $x=X$, $y=Y$ and $z=Z$. \n", "Let us construct this 2-sphere as a manifold by itself, which we call the **base 2-sphere**. This will be the codomain of the Hopf map. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## The base 2-sphere (unit imaginary quaternions)" ] }, { "cell_type": "code", "execution_count": 91, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2-dimensional differentiable manifold S^2\n" ] } ], "source": [ "S2 = Manifold(2, 'S^2', latex_name=r'\\mathbb{S}^2')\n", "print(S2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As for $\\mathbb{S}^3$, we introduce on $\\mathbb{S}^2$ two complementary stereographic coordinate systems:" ] }, { "cell_type": "code", "execution_count": 92, "metadata": {}, "outputs": [], "source": [ "U2 = S2.open_subset('U_2')\n", "V2 = S2.open_subset('V_2')\n", "S2.declare_union(U2, V2)" ] }, { "cell_type": "code", "execution_count": 93, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left(U_2,({x_2}, {y_2})\\right)\n", "\\end{math}" ], "text/plain": [ "Chart (U_2, (x2, y2))" ] }, "execution_count": 93, "metadata": {}, "output_type": "execute_result" } ], "source": [ "stereoN2. = U2.chart(\"x2:x_2 y2:y_2\")\n", "stereoN2" ] }, { "cell_type": "code", "execution_count": 94, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left(V_2,({{x'}_2}, {{y'}_2})\\right)\n", "\\end{math}" ], "text/plain": [ "Chart (V_2, (xp2, yp2))" ] }, "execution_count": 94, "metadata": {}, "output_type": "execute_result" } ], "source": [ "stereoS2. = V2.chart(r\"xp2:{x'}_2 yp2:{y'}_2\")\n", "stereoS2" ] }, { "cell_type": "code", "execution_count": 95, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left\\{\\begin{array}{lcl} {{x'}_2} & = & \\frac{{x_2}}{{x_2}^{2} + {y_2}^{2}} \\\\ {{y'}_2} & = & \\frac{{y_2}}{{x_2}^{2} + {y_2}^{2}} \\end{array}\\right.\n", "\\end{math}" ], "text/plain": [ "xp2 = x2/(x2^2 + y2^2)\n", "yp2 = y2/(x2^2 + y2^2)" ] }, "execution_count": 95, "metadata": {}, "output_type": "execute_result" } ], "source": [ "stereoN_to_S2 = stereoN2.transition_map(stereoS2, \n", " (x2/(x2^2+y2^2), y2/(x2^2+y2^2)), \n", " intersection_name='W_2',\n", " restrictions1= x2^2+y2^2!=0, \n", " restrictions2= xp2^2+xp2^2!=0)\n", "stereoN_to_S2.display()" ] }, { "cell_type": "code", "execution_count": 96, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left\\{\\begin{array}{lcl} {x_2} & = & \\frac{{{x'}_2}}{{{x'}_2}^{2} + {{y'}_2}^{2}} \\\\ {y_2} & = & \\frac{{{y'}_2}}{{{x'}_2}^{2} + {{y'}_2}^{2}} \\end{array}\\right.\n", "\\end{math}" ], "text/plain": [ "x2 = xp2/(xp2^2 + yp2^2)\n", "y2 = yp2/(xp2^2 + yp2^2)" ] }, "execution_count": 96, "metadata": {}, "output_type": "execute_result" } ], "source": [ "stereoS_to_N2 = stereoN_to_S2.inverse()\n", "stereoS_to_N2.display()" ] }, { "cell_type": "code", "execution_count": 97, "metadata": {}, "outputs": [], "source": [ "W2 = U2.intersection(V2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We embed the base 2-sphere $\\mathbb{S}^2$ in $\\mathbb{S}^3$ by considering that the North pole defining the above stereographic coordinates is $\\mathbf{k}$, i.e. the point \n", "$(x,y,z)=(0,0,1)$ in $\\mathbb{S}^3$:" ] }, { "cell_type": "code", "execution_count": 98, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\begin{array}{llcl} \\Phi_2:& \\mathbb{S}^2 & \\longrightarrow & \\mathbb{S}^3 \\\\ \\mbox{on}\\ U_2 : & \\left({x_2}, {y_2}\\right) & \\longmapsto & \\left(x, y, z\\right) = \\left(\\frac{2 \\, {x_2}}{{x_2}^{2} + {y_2}^{2} + 1}, \\frac{2 \\, {y_2}}{{x_2}^{2} + {y_2}^{2} + 1}, \\frac{{x_2}^{2} + {y_2}^{2} - 1}{{x_2}^{2} + {y_2}^{2} + 1}\\right) \\\\ \\mbox{on}\\ V_2 : & \\left({{x'}_2}, {{y'}_2}\\right) & \\longmapsto & \\left(x, y, z\\right) = \\left(\\frac{2 \\, {{x'}_2}}{{{x'}_2}^{2} + {{y'}_2}^{2} + 1}, \\frac{2 \\, {{y'}_2}}{{{x'}_2}^{2} + {{y'}_2}^{2} + 1}, -\\frac{{{x'}_2}^{2} + {{y'}_2}^{2} - 1}{{{x'}_2}^{2} + {{y'}_2}^{2} + 1}\\right) \\end{array}\n", "\\end{math}" ], "text/plain": [ "Phi2: S^2 --> S^3\n", "on U_2: (x2, y2) |--> (x, y, z) = (2*x2/(x2^2 + y2^2 + 1), 2*y2/(x2^2 + y2^2 + 1), (x2^2 + y2^2 - 1)/(x2^2 + y2^2 + 1))\n", "on V_2: (xp2, yp2) |--> (x, y, z) = (2*xp2/(xp2^2 + yp2^2 + 1), 2*yp2/(xp2^2 + yp2^2 + 1), -(xp2^2 + yp2^2 - 1)/(xp2^2 + yp2^2 + 1))" ] }, "execution_count": 98, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Phi2 = S2.diff_map(S3, {(stereoN2, stereoN): \n", " [2*x2/(1+x2^2+y2^2), \n", " 2*y2/(1+x2^2+y2^2),\n", " (x2^2+y2^2-1)/(1+x2^2+y2^2)],\n", " (stereoS2, stereoN): \n", " [2*xp2/(1+xp2^2+yp2^2), \n", " 2*yp2/(1+xp2^2+yp2^2),\n", " (1-xp2^2-yp2^2)/(1+xp2^2+yp2^2)]},\n", " name='Phi2', latex_name=r'\\Phi_2')\n", "Phi2.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The unit imaginary quaternions $\\mathbf{i}$, $\\mathbf{j}$, $\\mathbf{k}$ and $-\\mathbf{k}$ as elements of the base 2-sphere:" ] }, { "cell_type": "code", "execution_count": 99, "metadata": {}, "outputs": [], "source": [ "I2 = S2((1,0), chart=stereoN2)\n", "J2 = S2((0,1), chart=stereoN2)\n", "K2 = S2((0,0), chart=stereoS2)\n", "minusK2 = S2((0,0), chart=stereoN2)" ] }, { "cell_type": "code", "execution_count": 100, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\mathrm{True}\n", "\\end{math}" ], "text/plain": [ "True" ] }, "execution_count": 100, "metadata": {}, "output_type": "execute_result" } ], "source": [ "all([Phi2(I2) == I, Phi2(J2) == J,\n", " Phi2(K2) == K, Phi2(minusK2) == minusK])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Spherical coordinates on $\\mathbb{S}^2$\n", "\n", "We introduce spherical coordinates $(\\theta_2,\\phi_2)$ on the base 2-sphere in the standard way (cf. the [2-sphere notebook](http://nbviewer.jupyter.org/github/sagemanifolds/SageManifolds/blob/master/Notebooks/SM_sphere_S2.ipynb)):" ] }, { "cell_type": "code", "execution_count": 101, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Check of the inverse coordinate transformation:\n", " th2 == 2*arctan(sqrt(-cos(th2) + 1)/sqrt(cos(th2) + 1)) **failed**\n", " ph2 == pi + arctan2(sin(ph2)*sin(th2)/(cos(th2) - 1), cos(ph2)*sin(th2)/(cos(th2) - 1)) **failed**\n", " x2 == x2 *passed*\n", " y2 == y2 *passed*\n", "NB: a failed report can reflect a mere lack of simplification.\n" ] } ], "source": [ "A2 = W2.open_subset('A_2', \n", " coord_def={stereoN2.restrict(W2): (y2!=0, x2<0), \n", " stereoS2.restrict(W2): (yp2!=0, xp2<0)})\n", "spher2. = A2.chart(r'th2:(0,pi):\\theta_2 ph2:(0,2*pi):\\phi_2')\n", "spher2_to_stereoN2 = spher2.transition_map(stereoN2.restrict(A2), \n", " (sin(th2)*cos(ph2)/(1-cos(th2)),\n", " sin(th2)*sin(ph2)/(1-cos(th2))))\n", "spher2_to_stereoN2.set_inverse(2*atan(1/sqrt(x2^2+y2^2)), \n", " atan2(-y2,-x2)+pi)\n", "spher2_to_stereoS2 = stereoN_to_S2.restrict(A2) * spher2_to_stereoN2\n", "stereoS2_to_spher2 = spher2_to_stereoN2.inverse() * \\\n", " stereoN_to_S2.inverse().restrict(A2)" ] }, { "cell_type": "code", "execution_count": 102, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left[\\left(A_2,({x_2}, {y_2})\\right), \\left(A_2,({{x'}_2}, {{y'}_2})\\right), \\left(A_2,({\\theta_2}, {\\phi_2})\\right)\\right]\n", "\\end{math}" ], "text/plain": [ "[Chart (A_2, (x2, y2)), Chart (A_2, (xp2, yp2)), Chart (A_2, (th2, ph2))]" ] }, "execution_count": 102, "metadata": {}, "output_type": "execute_result" } ], "source": [ "A2.atlas()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Projectors $\\mathbb{S}^3 \\to \\mathbb{S}^2$\n", "\n", "Let $W_{z\\not=1}$ denote the subset of $W\\subset\\mathbb{S}^3$ defined by $z\\not=1$:" ] }, { "cell_type": "code", "execution_count": 103, "metadata": {}, "outputs": [], "source": [ "Wz1 = W.open_subset('Wz1', latex_name=r'W_{z\\not=1}', \n", " coord_def={stereoN.restrict(W): z!=1})" ] }, { "cell_type": "code", "execution_count": 104, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\mathrm{True}\n", "\\end{math}" ], "text/plain": [ "True" ] }, "execution_count": 104, "metadata": {}, "output_type": "execute_result" } ], "source": [ "all([I in Wz1, J in Wz1, minusK in Wz1,\n", " K not in Wz1, One not in Wz1, minusOne not in Wz1])" ] }, { "cell_type": "code", "execution_count": 105, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\begin{array}{llcl} \\Pi_2^N:& W_{z\\not=1} & \\longrightarrow & U_2 \\\\ & \\left(x, y, z\\right) & \\longmapsto & \\left({x_2}, {y_2}\\right) = \\left(-\\frac{x}{z - 1}, -\\frac{y}{z - 1}\\right) \\end{array}\n", "\\end{math}" ], "text/plain": [ "P_2^N: Wz1 --> U_2\n", " (x, y, z) |--> (x2, y2) = (-x/(z - 1), -y/(z - 1))" ] }, "execution_count": 105, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Proj2N = Wz1.diff_map(U2, {(stereoN.restrict(Wz1), stereoN2): \n", " [x/(1-z), y/(1-z)]},\n", " name='P_2^N', latex_name=r'\\Pi_2^N')\n", "Proj2N.display()" ] }, { "cell_type": "code", "execution_count": 106, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\mathrm{True}\n", "\\end{math}" ], "text/plain": [ "True" ] }, "execution_count": 106, "metadata": {}, "output_type": "execute_result" } ], "source": [ "p = U2((a,b), chart=stereoN2)\n", "Proj2N(Phi2(p)) == p" ] }, { "cell_type": "code", "execution_count": 107, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\mathrm{True}\n", "\\end{math}" ], "text/plain": [ "True" ] }, "execution_count": 107, "metadata": {}, "output_type": "execute_result" } ], "source": [ "assume(cos(a)!=1, cos(a)!=0)\n", "p = U((sin(a)*cos(b), sin(a)*sin(b), cos(a)), chart=stereoN)\n", "Phi2(Proj2N(p)) == p" ] }, { "cell_type": "code", "execution_count": 108, "metadata": {}, "outputs": [], "source": [ "forget(cos(a)!=1, cos(a)!=0)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let $W_{z\\not=-1}$ denote the subset of $W\\subset\\mathbb{S}^3$ defined by $z\\not=-1$:" ] }, { "cell_type": "code", "execution_count": 109, "metadata": {}, "outputs": [], "source": [ "Wzm1 = W.open_subset('Wzm1', latex_name=r'W_{z\\not=-1}', \n", " coord_def={stereoN.restrict(W): z!=-1})" ] }, { "cell_type": "code", "execution_count": 110, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\mathrm{True}\n", "\\end{math}" ], "text/plain": [ "True" ] }, "execution_count": 110, "metadata": {}, "output_type": "execute_result" } ], "source": [ "all([I in Wzm1, J in Wzm1, K in Wzm1,\n", " minusK not in Wzm1, One not in Wzm1, \n", " minusOne not in Wzm1])" ] }, { "cell_type": "code", "execution_count": 111, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\begin{array}{llcl} \\Pi_2^S:& W_{z\\not=-1} & \\longrightarrow & V_2 \\\\ & \\left(x, y, z\\right) & \\longmapsto & \\left({{x'}_2}, {{y'}_2}\\right) = \\left(\\frac{x}{z + 1}, \\frac{y}{z + 1}\\right) \\end{array}\n", "\\end{math}" ], "text/plain": [ "P_2^S: Wzm1 --> V_2\n", " (x, y, z) |--> (xp2, yp2) = (x/(z + 1), y/(z + 1))" ] }, "execution_count": 111, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Proj2S = Wzm1.diff_map(V2, {(stereoN.restrict(Wzm1), stereoS2): \n", " [x/(1+z), y/(1+z)]},\n", " name='P_2^S', latex_name=r'\\Pi_2^S')\n", "Proj2S.display()" ] }, { "cell_type": "code", "execution_count": 112, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\mathrm{True}\n", "\\end{math}" ], "text/plain": [ "True" ] }, "execution_count": 112, "metadata": {}, "output_type": "execute_result" } ], "source": [ "p = V2((a,b), chart=stereoS2)\n", "Proj2S(Phi2(p)) == p" ] }, { "cell_type": "code", "execution_count": 113, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\mathrm{True}\n", "\\end{math}" ], "text/plain": [ "True" ] }, "execution_count": 113, "metadata": {}, "output_type": "execute_result" } ], "source": [ "assume(cos(a)!=-1, cos(a)!=0)\n", "p = U((sin(a)*cos(b), sin(a)*sin(b), cos(a)), chart=stereoN)\n", "Phi2(Proj2S(p)) == p" ] }, { "cell_type": "code", "execution_count": 114, "metadata": {}, "outputs": [], "source": [ "forget(cos(a)!=-1, cos(a)!=0)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Hopf map\n", "\n", "We are now in position to define the Hopf map as a map $\\mathbb{S}^3 \\to \\mathbb{S}^2$.\n", "To give its coordinate expressions, we have to consider that $\\mathbb{S}^3$ is covered by\n", "two charts, `stereoN` = $(U,(x,y,z))$ and `stereoS` = $(V,(x',y',z'))$, and $\\mathbb{S}^2$ is covered by two charts: \n", "- `stereoN2` = $(U_2,(x_2,y_2))$, the domain of which contains \n", " all points of $\\mathbb{S}^2$ but $\\mathbf{k}$\n", "- `stereoS2` = $(V_2,(x'_2,y'_2))$, the domain of which contains \n", " all points of $\\mathbb{S}^2$ but $-\\mathbf{k}$.\n", "\n", "First we search for all the points $p\\in U$ such that $H(p)\\in U_2$, i.e. such that\n", "$H(p)\\not=\\mathbf{k}$, or equivalently, $z(H(p))\\not= 1$, or again $H(p)\\in W_{z\\not=1}$.\n", "On the chart $(U,(x,y,z))$, the expression of $z(H(p))$ is " ] }, { "cell_type": "code", "execution_count": 115, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\frac{x^{4} + y^{4} + z^{4} + 2 \\, {\\left(x^{2} - 3\\right)} y^{2} + 2 \\, {\\left(x^{2} + y^{2} + 1\\right)} z^{2} - 6 \\, x^{2} + 1}{x^{4} + y^{4} + z^{4} + 2 \\, {\\left(x^{2} + 1\\right)} y^{2} + 2 \\, {\\left(x^{2} + y^{2} + 1\\right)} z^{2} + 2 \\, x^{2} + 1}\n", "\\end{math}" ], "text/plain": [ "(x^4 + y^4 + z^4 + 2*(x^2 - 3)*y^2 + 2*(x^2 + y^2 + 1)*z^2 - 6*x^2 + 1)/(x^4 + y^4 + z^4 + 2*(x^2 + 1)*y^2 + 2*(x^2 + y^2 + 1)*z^2 + 2*x^2 + 1)" ] }, "execution_count": 115, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Hx, Hy, Hz = H.expr(stereoN, stereoN)\n", "Hz" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The condition $z(H(p))\\not=1$ is" ] }, { "cell_type": "code", "execution_count": 116, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}-8 \\, x^{2} - 8 \\, y^{2} \\neq 0\n", "\\end{math}" ], "text/plain": [ "-8*x^2 - 8*y^2 != 0" ] }, "execution_count": 116, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Hz.numerator() - Hz.denominator() != 0" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "which is equivalent to $x^2+y^2 \\not= 0$. We define thus the subdomain\n", "$D_1 = U \\setminus (H^{-1}(\\mathbf{k})\\cap U)$ as" ] }, { "cell_type": "code", "execution_count": 117, "metadata": {}, "outputs": [], "source": [ "D1 = U.open_subset('D_1', coord_def=({stereoN: x^2+y^2!=0}))\n", "stereoN_D1 = stereoN.restrict(D1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "By construction, the restriction of $H$ to $D_1$ has $W_{z\\not=1}$ as codomain and we declare the Hopf map on $D_1$ by considering the image points as points of $\\mathbb{S}^2$ via $\\Pi_2^N$:" ] }, { "cell_type": "code", "execution_count": 118, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\begin{array}{llcl} & D_1 & \\longrightarrow & U_2 \\\\ & \\left(x, y, z\\right) & \\longmapsto & \\left({x_2}, {y_2}\\right) = \\left(-\\frac{y^{3} + y z^{2} + {\\left(x^{2} - 1\\right)} y - 2 \\, x z}{2 \\, {\\left(x^{2} + y^{2}\\right)}}, \\frac{x^{3} + x y^{2} + x z^{2} + 2 \\, y z - x}{2 \\, {\\left(x^{2} + y^{2}\\right)}}\\right) \\end{array}\n", "\\end{math}" ], "text/plain": [ "D_1 --> U_2\n", " (x, y, z) |--> (x2, y2) = (-1/2*(y^3 + y*z^2 + (x^2 - 1)*y - 2*x*z)/(x^2 + y^2), 1/2*(x^3 + x*y^2 + x*z^2 + 2*y*z - x)/(x^2 + y^2))" ] }, "execution_count": 118, "metadata": {}, "output_type": "execute_result" } ], "source": [ "hD1 = Proj2N * H.restrict(D1, subcodomain=Wz1)\n", "hD1.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We have $\\mathbf{i}\\in D_1$ and $\\mathbf{j}\\in D_1$; we can check that \n", "$h(\\mathbf{i}) = h(\\mathbf{j}) = -\\mathbf{k}$:" ] }, { "cell_type": "code", "execution_count": 119, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\mathrm{True}\n", "\\end{math}" ], "text/plain": [ "True" ] }, "execution_count": 119, "metadata": {}, "output_type": "execute_result" } ], "source": [ "all([hD1(I) == minusK2, hD1(J) == minusK2])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let us now consider the points $p\\in U$ such that $H(p)\\in V_2$, i.e. such that\n", "$H(p)\\not=-\\mathbf{k}$, or equivalently, $z(H(p))\\not= -1$, or again $H(p)\\in W_{z\\not=-1}$.\n", "The condition $z(H(p))\\not= -1$ is equivalent to $s\\not=0$ with" ] }, { "cell_type": "code", "execution_count": 120, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}x^{4} + y^{4} + z^{4} + 2 \\, {\\left(x^{2} - 1\\right)} y^{2} + 2 \\, {\\left(x^{2} + y^{2} + 1\\right)} z^{2} - 2 \\, x^{2} + 1\n", "\\end{math}" ], "text/plain": [ "x^4 + y^4 + z^4 + 2*(x^2 - 1)*y^2 + 2*(x^2 + y^2 + 1)*z^2 - 2*x^2 + 1" ] }, "execution_count": 120, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s = ((Hz.numerator() + Hz.denominator())/2).simplify_full()\n", "s" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Since" ] }, { "cell_type": "code", "execution_count": 121, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}4 \\, z^{2}\n", "\\end{math}" ], "text/plain": [ "4*z^2" ] }, "execution_count": 121, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(s-(x^2+y^2+z^2-1)^2).simplify_full()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "the condition $s\\not =0$ is equivalent to " ] }, { "cell_type": "code", "execution_count": 122, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}{\\left(x^{2} + y^{2} + z^{2} - 1\\right)}^{2} + 4 \\, z^{2} \\neq 0\n", "\\end{math}" ], "text/plain": [ "(x^2 + y^2 + z^2 - 1)^2 + 4*z^2 != 0" ] }, "execution_count": 122, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(x^2+y^2+z^2-1)^2 + 4*z^2 != 0" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "i.e. to ($x^2+y^2\\not= 1$ or $z\\not= 0$). Hence we introduce the subset \n", "$D_2 = U \\setminus (H^{-1}(-\\mathbf{k})\\cap U)$ by" ] }, { "cell_type": "code", "execution_count": 123, "metadata": {}, "outputs": [], "source": [ "D2 = U.open_subset('D_2', coord_def=({stereoN: (x^2+y^2!=1, z!=0)}))\n", "stereoN_D2 = stereoN.restrict(D2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "By construction, the restriction of $H$ to $D_2$ has $W_{z\\not=-1}$ as codomain and we declare the Hopf map on $D_2$ by considering the image points as points of $\\mathbb{S}^2$ via $\\Pi_2^S$:" ] }, { "cell_type": "code", "execution_count": 124, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\begin{array}{llcl} & D_2 & \\longrightarrow & V_2 \\\\ & \\left(x, y, z\\right) & \\longmapsto & \\left({{x'}_2}, {{y'}_2}\\right) = \\left(-\\frac{2 \\, {\\left(y^{3} + y z^{2} + {\\left(x^{2} - 1\\right)} y - 2 \\, x z\\right)}}{x^{4} + y^{4} + z^{4} + 2 \\, {\\left(x^{2} - 1\\right)} y^{2} + 2 \\, {\\left(x^{2} + y^{2} + 1\\right)} z^{2} - 2 \\, x^{2} + 1}, \\frac{2 \\, {\\left(x^{3} + x y^{2} + x z^{2} + 2 \\, y z - x\\right)}}{x^{4} + y^{4} + z^{4} + 2 \\, {\\left(x^{2} - 1\\right)} y^{2} + 2 \\, {\\left(x^{2} + y^{2} + 1\\right)} z^{2} - 2 \\, x^{2} + 1}\\right) \\end{array}\n", "\\end{math}" ], "text/plain": [ "D_2 --> V_2\n", " (x, y, z) |--> (xp2, yp2) = (-2*(y^3 + y*z^2 + (x^2 - 1)*y - 2*x*z)/(x^4 + y^4 + z^4 + 2*(x^2 - 1)*y^2 + 2*(x^2 + y^2 + 1)*z^2 - 2*x^2 + 1), 2*(x^3 + x*y^2 + x*z^2 + 2*y*z - x)/(x^4 + y^4 + z^4 + 2*(x^2 - 1)*y^2 + 2*(x^2 + y^2 + 1)*z^2 - 2*x^2 + 1))" ] }, "execution_count": 124, "metadata": {}, "output_type": "execute_result" } ], "source": [ "hD2 = Proj2S * H.restrict(D2, subcodomain=Wzm1)\n", "hD2.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We have $\\mathbf{k}\\in D_2$, $-\\mathbf{k}\\in D_2$ and $\\mathbf{1}\\in D_2$; we can check that \n", "$h(\\mathbf{k}) = h(-\\mathbf{k}) = h(\\mathbf{1}) = \\mathbf{k}$:" ] }, { "cell_type": "code", "execution_count": 125, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\mathrm{True}\n", "\\end{math}" ], "text/plain": [ "True" ] }, "execution_count": 125, "metadata": {}, "output_type": "execute_result" } ], "source": [ "all([hD2(K) == K2, hD2(minusK) == K2, hD2(One) == K2])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Since $H^{-1}(\\mathbf{k})\\cap H^{-1}(-\\mathbf{k})=\\emptyset$, we have $U=D_1\\cup D_2$:" ] }, { "cell_type": "code", "execution_count": 126, "metadata": {}, "outputs": [], "source": [ "U.declare_union(D1, D2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Similarly let us consider the points $p\\in V$ such that $H(p)\\in U_2$, i.e. such that\n", "$H(p)\\not=\\mathbf{k}$, or equivalently, $z(H(p))\\not= 1$, or again $H(p)\\in W_{z\\not=1}$.\n", "On the chart $(V,(x',y',z'))$, the expression of $z(H(p))$ is " ] }, { "cell_type": "code", "execution_count": 127, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\frac{{x'}^{4} + {y'}^{4} + {z'}^{4} + 2 \\, {\\left({x'}^{2} - 3\\right)} {y'}^{2} + 2 \\, {\\left({x'}^{2} + {y'}^{2} + 1\\right)} {z'}^{2} - 6 \\, {x'}^{2} + 1}{{x'}^{4} + {y'}^{4} + {z'}^{4} + 2 \\, {\\left({x'}^{2} + 1\\right)} {y'}^{2} + 2 \\, {\\left({x'}^{2} + {y'}^{2} + 1\\right)} {z'}^{2} + 2 \\, {x'}^{2} + 1}\n", "\\end{math}" ], "text/plain": [ "(xp^4 + yp^4 + zp^4 + 2*(xp^2 - 3)*yp^2 + 2*(xp^2 + yp^2 + 1)*zp^2 - 6*xp^2 + 1)/(xp^4 + yp^4 + zp^4 + 2*(xp^2 + 1)*yp^2 + 2*(xp^2 + yp^2 + 1)*zp^2 + 2*xp^2 + 1)" ] }, "execution_count": 127, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Hx, Hy, Hz = H.expr(stereoS, stereoN)\n", "Hz" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The condition $z(H(p))\\not=1$ is" ] }, { "cell_type": "code", "execution_count": 128, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}-8 \\, {x'}^{2} - 8 \\, {y'}^{2} \\neq 0\n", "\\end{math}" ], "text/plain": [ "-8*xp^2 - 8*yp^2 != 0" ] }, "execution_count": 128, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Hz.numerator() - Hz.denominator() != 0" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "which is equivalent to ${x'}^2+{y'}^2 \\not= 0$. We define thus the subset\n", "$D_3 = V \\setminus (H^{-1}(\\mathbf{k})\\cap V)$ as" ] }, { "cell_type": "code", "execution_count": 129, "metadata": {}, "outputs": [], "source": [ "D3 = V.open_subset('D_3', coord_def=({stereoS: xp^2+yp^2!=0}))\n", "stereoS_D3 = stereoS.restrict(D3)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "By construction, the restriction of $H$ to $D_2$ has $W_{z\\not=1}$ as codomain and we declare the Hopf map on $D_3$ by considering the image points as points of $\\mathbb{S}^2$ via $\\Pi_2^N$:" ] }, { "cell_type": "code", "execution_count": 130, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\begin{array}{llcl} & D_3 & \\longrightarrow & U_2 \\\\ & \\left({x'}, {y'}, {z'}\\right) & \\longmapsto & \\left({x_2}, {y_2}\\right) = \\left(\\frac{{y'}^{3} + {y'} {z'}^{2} + {\\left({x'}^{2} - 1\\right)} {y'} + 2 \\, {x'} {z'}}{2 \\, {\\left({x'}^{2} + {y'}^{2}\\right)}}, -\\frac{{x'}^{3} + {x'} {y'}^{2} + {x'} {z'}^{2} - 2 \\, {y'} {z'} - {x'}}{2 \\, {\\left({x'}^{2} + {y'}^{2}\\right)}}\\right) \\end{array}\n", "\\end{math}" ], "text/plain": [ "D_3 --> U_2\n", " (xp, yp, zp) |--> (x2, y2) = (1/2*(yp^3 + yp*zp^2 + (xp^2 - 1)*yp + 2*xp*zp)/(xp^2 + yp^2), -1/2*(xp^3 + xp*yp^2 + xp*zp^2 - 2*yp*zp - xp)/(xp^2 + yp^2))" ] }, "execution_count": 130, "metadata": {}, "output_type": "execute_result" } ], "source": [ "hD3 = Proj2N * H.restrict(D3, subcodomain=Wz1)\n", "hD3.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We have $\\mathbf{i}\\in D_3$ and $\\mathbf{j}\\in D_3$; we can check that \n", "$h(\\mathbf{i}) = h(\\mathbf{j}) = -\\mathbf{k}$:" ] }, { "cell_type": "code", "execution_count": 131, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\mathrm{True}\n", "\\end{math}" ], "text/plain": [ "True" ] }, "execution_count": 131, "metadata": {}, "output_type": "execute_result" } ], "source": [ "all([hD3(I) == minusK2, hD3(J) == minusK2])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Finally, let us consider the points $p\\in V$ such that $H(p)\\in V_2$, i.e. such that\n", "$H(p)\\not=-\\mathbf{k}$, or equivalently, $z(H(p))\\not= -1$, or again $H(p)\\in W_{z\\not=-1}$.\n", "The condition $z(H(p))\\not= -1$ is equivalent to $s\\not=0$ with" ] }, { "cell_type": "code", "execution_count": 132, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}{x'}^{4} + {y'}^{4} + {z'}^{4} + 2 \\, {\\left({x'}^{2} - 1\\right)} {y'}^{2} + 2 \\, {\\left({x'}^{2} + {y'}^{2} + 1\\right)} {z'}^{2} - 2 \\, {x'}^{2} + 1\n", "\\end{math}" ], "text/plain": [ "xp^4 + yp^4 + zp^4 + 2*(xp^2 - 1)*yp^2 + 2*(xp^2 + yp^2 + 1)*zp^2 - 2*xp^2 + 1" ] }, "execution_count": 132, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s = ((Hz.numerator() + Hz.denominator())/2).simplify_full()\n", "s" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Since " ] }, { "cell_type": "code", "execution_count": 133, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}4 \\, {z'}^{2}\n", "\\end{math}" ], "text/plain": [ "4*zp^2" ] }, "execution_count": 133, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(s-(xp^2+yp^2+zp^2-1)^2).simplify_full()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "the condition $s\\not=0$ is equivalent to" ] }, { "cell_type": "code", "execution_count": 134, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}{\\left({x'}^{2} + {y'}^{2} + {z'}^{2} - 1\\right)}^{2} + 4 \\, {z'}^{2} = 0\n", "\\end{math}" ], "text/plain": [ "(xp^2 + yp^2 + zp^2 - 1)^2 + 4*zp^2 == 0" ] }, "execution_count": 134, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(xp^2+yp^2+zp^2-1)^2 + 4*zp^2 == 0" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "i.e. to (${x'}^2+{y'}^2\\not= 1$ or $z'\\not= 0$). Hence we introduce the subset \n", "$D_4 = V \\setminus (H^{-1}(-\\mathbf{k})\\cap V)$ by" ] }, { "cell_type": "code", "execution_count": 135, "metadata": {}, "outputs": [], "source": [ "D4 = V.open_subset('D_4', coord_def=({stereoS: (xp^2+yp^2!=1, zp!=0)}))\n", "stereoS_D4 = stereoS.restrict(D4)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "By construction, the restriction of $H$ to $D_4$ has $W_{z\\not=-1}$ as codomain and we declare the Hopf map on $D_4$ by considering the image points as points of $\\mathbb{S}^2$ via $\\Pi_2^S$:" ] }, { "cell_type": "code", "execution_count": 136, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\begin{array}{llcl} & D_4 & \\longrightarrow & V_2 \\\\ & \\left({x'}, {y'}, {z'}\\right) & \\longmapsto & \\left({{x'}_2}, {{y'}_2}\\right) = \\left(\\frac{2 \\, {\\left({y'}^{3} + {y'} {z'}^{2} + {\\left({x'}^{2} - 1\\right)} {y'} + 2 \\, {x'} {z'}\\right)}}{{x'}^{4} + {y'}^{4} + {z'}^{4} + 2 \\, {\\left({x'}^{2} - 1\\right)} {y'}^{2} + 2 \\, {\\left({x'}^{2} + {y'}^{2} + 1\\right)} {z'}^{2} - 2 \\, {x'}^{2} + 1}, -\\frac{2 \\, {\\left({x'}^{3} + {x'} {y'}^{2} + {x'} {z'}^{2} - 2 \\, {y'} {z'} - {x'}\\right)}}{{x'}^{4} + {y'}^{4} + {z'}^{4} + 2 \\, {\\left({x'}^{2} - 1\\right)} {y'}^{2} + 2 \\, {\\left({x'}^{2} + {y'}^{2} + 1\\right)} {z'}^{2} - 2 \\, {x'}^{2} + 1}\\right) \\end{array}\n", "\\end{math}" ], "text/plain": [ "D_4 --> V_2\n", " (xp, yp, zp) |--> (xp2, yp2) = (2*(yp^3 + yp*zp^2 + (xp^2 - 1)*yp + 2*xp*zp)/(xp^4 + yp^4 + zp^4 + 2*(xp^2 - 1)*yp^2 + 2*(xp^2 + yp^2 + 1)*zp^2 - 2*xp^2 + 1), -2*(xp^3 + xp*yp^2 + xp*zp^2 - 2*yp*zp - xp)/(xp^4 + yp^4 + zp^4 + 2*(xp^2 - 1)*yp^2 + 2*(xp^2 + yp^2 + 1)*zp^2 - 2*xp^2 + 1))" ] }, "execution_count": 136, "metadata": {}, "output_type": "execute_result" } ], "source": [ "hD4 = Proj2S * H.restrict(D4, subcodomain=Wzm1)\n", "hD4.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We have $-\\mathbf{1}\\in D_4$ and we can check that \n", "$h(-\\mathbf{1}) = \\mathbf{k}$:" ] }, { "cell_type": "code", "execution_count": 137, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\mathrm{True}\n", "\\end{math}" ], "text/plain": [ "True" ] }, "execution_count": 137, "metadata": {}, "output_type": "execute_result" } ], "source": [ "hD4(minusOne) == K2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Since $H^{-1}(\\mathbf{k})\\cap H^{-1}(-\\mathbf{k})=\\emptyset$, we have $V=D_3\\cup D_4$:" ] }, { "cell_type": "code", "execution_count": 138, "metadata": {}, "outputs": [], "source": [ "V.declare_union(D3, D4)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Declaration of the Hopf map\n", "\n", "We construct the Hopf map $h:\\mathbb{S}^3\\to \\mathbb{S}^2$ from the coordinate expressions of its restriction to $D_1$, $D_2$, $D_3$ and $D_4$, as obtained above:" ] }, { "cell_type": "code", "execution_count": 139, "metadata": {}, "outputs": [], "source": [ "h = S3.diff_map(S2, name='h')\n", "h.add_expression(stereoN_D1, stereoN2, hD1.expr(stereoN_D1, stereoN2))\n", "h.add_expression(stereoN_D2, stereoS2, hD2.expr(stereoN_D2, stereoS2))\n", "h.add_expression(stereoS_D3, stereoN2, hD3.expr(stereoS_D3, stereoN2))\n", "h.add_expression(stereoS_D4, stereoS2, hD4.expr(stereoS_D4, stereoS2))" ] }, { "cell_type": "code", "execution_count": 140, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\begin{array}{llcl} h:& \\mathbb{S}^3 & \\longrightarrow & \\mathbb{S}^2 \\\\ \\mbox{on}\\ D_1 : & \\left(x, y, z\\right) & \\longmapsto & \\left({x_2}, {y_2}\\right) = \\left(-\\frac{y^{3} + y z^{2} + {\\left(x^{2} - 1\\right)} y - 2 \\, x z}{2 \\, {\\left(x^{2} + y^{2}\\right)}}, \\frac{x^{3} + x y^{2} + x z^{2} + 2 \\, y z - x}{2 \\, {\\left(x^{2} + y^{2}\\right)}}\\right) \\end{array}\n", "\\end{math}" ], "text/plain": [ "h: S^3 --> S^2\n", "on D_1: (x, y, z) |--> (x2, y2) = (-1/2*(y^3 + y*z^2 + (x^2 - 1)*y - 2*x*z)/(x^2 + y^2), 1/2*(x^3 + x*y^2 + x*z^2 + 2*y*z - x)/(x^2 + y^2))" ] }, "execution_count": 140, "metadata": {}, "output_type": "execute_result" } ], "source": [ "h.display(stereoN_D1, stereoN2)" ] }, { "cell_type": "code", "execution_count": 141, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\begin{array}{llcl} h:& \\mathbb{S}^3 & \\longrightarrow & \\mathbb{S}^2 \\\\ \\mbox{on}\\ D_2 : & \\left(x, y, z\\right) & \\longmapsto & \\left({{x'}_2}, {{y'}_2}\\right) = \\left(-\\frac{2 \\, {\\left(y^{3} + y z^{2} + {\\left(x^{2} - 1\\right)} y - 2 \\, x z\\right)}}{x^{4} + y^{4} + z^{4} + 2 \\, {\\left(x^{2} - 1\\right)} y^{2} + 2 \\, {\\left(x^{2} + y^{2} + 1\\right)} z^{2} - 2 \\, x^{2} + 1}, \\frac{2 \\, {\\left(x^{3} + x y^{2} + x z^{2} + 2 \\, y z - x\\right)}}{x^{4} + y^{4} + z^{4} + 2 \\, {\\left(x^{2} - 1\\right)} y^{2} + 2 \\, {\\left(x^{2} + y^{2} + 1\\right)} z^{2} - 2 \\, x^{2} + 1}\\right) \\end{array}\n", "\\end{math}" ], "text/plain": [ "h: S^3 --> S^2\n", "on D_2: (x, y, z) |--> (xp2, yp2) = (-2*(y^3 + y*z^2 + (x^2 - 1)*y - 2*x*z)/(x^4 + y^4 + z^4 + 2*(x^2 - 1)*y^2 + 2*(x^2 + y^2 + 1)*z^2 - 2*x^2 + 1), 2*(x^3 + x*y^2 + x*z^2 + 2*y*z - x)/(x^4 + y^4 + z^4 + 2*(x^2 - 1)*y^2 + 2*(x^2 + y^2 + 1)*z^2 - 2*x^2 + 1))" ] }, "execution_count": 141, "metadata": {}, "output_type": "execute_result" } ], "source": [ "h.display(stereoN_D2, stereoS2)" ] }, { "cell_type": "code", "execution_count": 142, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\begin{array}{llcl} h:& \\mathbb{S}^3 & \\longrightarrow & \\mathbb{S}^2 \\\\ \\mbox{on}\\ D_3 : & \\left({x'}, {y'}, {z'}\\right) & \\longmapsto & \\left({x_2}, {y_2}\\right) = \\left(\\frac{{y'}^{3} + {y'} {z'}^{2} + {\\left({x'}^{2} - 1\\right)} {y'} + 2 \\, {x'} {z'}}{2 \\, {\\left({x'}^{2} + {y'}^{2}\\right)}}, -\\frac{{x'}^{3} + {x'} {y'}^{2} + {x'} {z'}^{2} - 2 \\, {y'} {z'} - {x'}}{2 \\, {\\left({x'}^{2} + {y'}^{2}\\right)}}\\right) \\end{array}\n", "\\end{math}" ], "text/plain": [ "h: S^3 --> S^2\n", "on D_3: (xp, yp, zp) |--> (x2, y2) = (1/2*(yp^3 + yp*zp^2 + (xp^2 - 1)*yp + 2*xp*zp)/(xp^2 + yp^2), -1/2*(xp^3 + xp*yp^2 + xp*zp^2 - 2*yp*zp - xp)/(xp^2 + yp^2))" ] }, "execution_count": 142, "metadata": {}, "output_type": "execute_result" } ], "source": [ "h.display(stereoS_D3, stereoN2)" ] }, { "cell_type": "code", "execution_count": 143, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\begin{array}{llcl} h:& \\mathbb{S}^3 & \\longrightarrow & \\mathbb{S}^2 \\\\ \\mbox{on}\\ D_4 : & \\left({x'}, {y'}, {z'}\\right) & \\longmapsto & \\left({{x'}_2}, {{y'}_2}\\right) = \\left(\\frac{2 \\, {\\left({y'}^{3} + {y'} {z'}^{2} + {\\left({x'}^{2} - 1\\right)} {y'} + 2 \\, {x'} {z'}\\right)}}{{x'}^{4} + {y'}^{4} + {z'}^{4} + 2 \\, {\\left({x'}^{2} - 1\\right)} {y'}^{2} + 2 \\, {\\left({x'}^{2} + {y'}^{2} + 1\\right)} {z'}^{2} - 2 \\, {x'}^{2} + 1}, -\\frac{2 \\, {\\left({x'}^{3} + {x'} {y'}^{2} + {x'} {z'}^{2} - 2 \\, {y'} {z'} - {x'}\\right)}}{{x'}^{4} + {y'}^{4} + {z'}^{4} + 2 \\, {\\left({x'}^{2} - 1\\right)} {y'}^{2} + 2 \\, {\\left({x'}^{2} + {y'}^{2} + 1\\right)} {z'}^{2} - 2 \\, {x'}^{2} + 1}\\right) \\end{array}\n", "\\end{math}" ], "text/plain": [ "h: S^3 --> S^2\n", "on D_4: (xp, yp, zp) |--> (xp2, yp2) = (2*(yp^3 + yp*zp^2 + (xp^2 - 1)*yp + 2*xp*zp)/(xp^4 + yp^4 + zp^4 + 2*(xp^2 - 1)*yp^2 + 2*(xp^2 + yp^2 + 1)*zp^2 - 2*xp^2 + 1), -2*(xp^3 + xp*yp^2 + xp*zp^2 - 2*yp*zp - xp)/(xp^4 + yp^4 + zp^4 + 2*(xp^2 - 1)*yp^2 + 2*(xp^2 + yp^2 + 1)*zp^2 - 2*xp^2 + 1))" ] }, "execution_count": 143, "metadata": {}, "output_type": "execute_result" } ], "source": [ "h.display(stereoS_D4, stereoS2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let us check that $h(\\mathbf{1})=h(-\\mathbf{1})=h(\\mathbf{k})=h(-\\mathbf{k})=\\mathbf{k}$\n", "and $h(\\mathbf{i})=h(-\\mathbf{i})=h(\\mathbf{j})=h(-\\mathbf{j})=-\\mathbf{k}$:" ] }, { "cell_type": "code", "execution_count": 144, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\mathrm{True}\n", "\\end{math}" ], "text/plain": [ "True" ] }, "execution_count": 144, "metadata": {}, "output_type": "execute_result" } ], "source": [ "all([h(One)==K2, h(minusOne)==K2, \n", " h(K)==K2, h(minusK)==K2,\n", " h(I)==minusK2, h(minusI)==minusK2,\n", " h(J)==minusK2, h(minusJ)==minusK2])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Expression of the Hopf map in spherical coordinates" ] }, { "cell_type": "code", "execution_count": 145, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left(A\\cap D_1,({\\chi}, {\\theta}, {\\phi})\\right)\n", "\\end{math}" ], "text/plain": [ "Chart (A_inter_D_1, (ch, th, ph))" ] }, "execution_count": 145, "metadata": {}, "output_type": "execute_result" } ], "source": [ "D1A = A.intersection(D1)\n", "spherD1A = spher.restrict(D1A)\n", "spherD1A" ] }, { "cell_type": "code", "execution_count": 146, "metadata": {}, "outputs": [], "source": [ "stereoND1A = stereoN_D1.restrict(D1A)\n", "stereoND1A.add_restrictions((y!=0, x<0))" ] }, { "cell_type": "code", "execution_count": 147, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left[\\left(A\\cap D_1,({\\chi}, {\\theta}, {\\phi})\\right), \\left(A\\cap D_1,(x, y, z)\\right)\\right]\n", "\\end{math}" ], "text/plain": [ "[Chart (A_inter_D_1, (ch, th, ph)), Chart (A_inter_D_1, (x, y, z))]" ] }, "execution_count": 147, "metadata": {}, "output_type": "execute_result" } ], "source": [ "D1A.atlas()" ] }, { "cell_type": "code", "execution_count": 148, "metadata": {}, "outputs": [], "source": [ "spher_to_stereoND1A = spher_to_stereoN.restrict(D1A)\n", "stereoN_to_spherD1A = spher_to_stereoN.inverse().restrict(D1A)\n", "spher_to_stereoSD1A = spher_to_stereoS.restrict(D1A)\n", "stereoS_to_spherD1A = stereoS_to_spher.restrict(D1A)" ] }, { "cell_type": "code", "execution_count": 149, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\begin{array}{llcl} h:& \\mathbb{S}^3 & \\longrightarrow & \\mathbb{S}^2 \\\\ \\mbox{on}\\ A\\cap D_1 : & \\left({\\chi}, {\\theta}, {\\phi}\\right) & \\longmapsto & \\left({x_2}, {y_2}\\right) = \\left(\\frac{\\cos\\left({\\phi}\\right) \\cos\\left({\\theta}\\right) \\sin\\left({\\chi}\\right) + \\cos\\left({\\chi}\\right) \\sin\\left({\\phi}\\right)}{\\sin\\left({\\chi}\\right) \\sin\\left({\\theta}\\right)}, \\frac{{\\left(\\cos\\left({\\chi}\\right) + 1\\right)} \\cos\\left({\\theta}\\right) \\sin\\left({\\chi}\\right) \\sin\\left({\\phi}\\right) + {\\left(\\sin\\left({\\chi}\\right)^{2} - \\cos\\left({\\chi}\\right) - 1\\right)} \\cos\\left({\\phi}\\right)}{{\\left(\\cos\\left({\\chi}\\right) + 1\\right)} \\sin\\left({\\chi}\\right) \\sin\\left({\\theta}\\right)}\\right) \\end{array}\n", "\\end{math}" ], "text/plain": [ "h: S^3 --> S^2\n", "on A_inter_D_1: (ch, th, ph) |--> (x2, y2) = ((cos(ph)*cos(th)*sin(ch) + cos(ch)*sin(ph))/(sin(ch)*sin(th)), ((cos(ch) + 1)*cos(th)*sin(ch)*sin(ph) + (sin(ch)^2 - cos(ch) - 1)*cos(ph))/((cos(ch) + 1)*sin(ch)*sin(th)))" ] }, "execution_count": 149, "metadata": {}, "output_type": "execute_result" } ], "source": [ "h.expr(stereoND1A, stereoN2) # necessary\n", "h.display(spherD1A, stereoN2)" ] }, { "cell_type": "code", "execution_count": 150, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\begin{array}{llcl} h:& A\\cap D_1 & \\longrightarrow & A_2 \\\\ & \\left({\\chi}, {\\theta}, {\\phi}\\right) & \\longmapsto & \\left({\\theta_2}, {\\phi_2}\\right) = \\left(2 \\, \\arctan\\left(\\frac{\\sin\\left({\\chi}\\right) \\sin\\left({\\theta}\\right)}{\\sqrt{\\sin\\left({\\chi}\\right) \\sin\\left({\\theta}\\right) + 1} \\sqrt{-\\sin\\left({\\chi}\\right) \\sin\\left({\\theta}\\right) + 1}}\\right), \\pi - \\arctan\\left(\\frac{\\cos\\left({\\theta}\\right) \\sin\\left({\\chi}\\right) \\sin\\left({\\phi}\\right) - \\cos\\left({\\chi}\\right) \\cos\\left({\\phi}\\right)}{\\sin\\left({\\chi}\\right) \\sin\\left({\\theta}\\right)}, -\\frac{\\cos\\left({\\phi}\\right) \\cos\\left({\\theta}\\right) \\sin\\left({\\chi}\\right) + \\cos\\left({\\chi}\\right) \\sin\\left({\\phi}\\right)}{\\sin\\left({\\chi}\\right) \\sin\\left({\\theta}\\right)}\\right)\\right) \\end{array}\n", "\\end{math}" ], "text/plain": [ "h: A_inter_D_1 --> A_2\n", " (ch, th, ph) |--> (th2, ph2) = (2*arctan(sin(ch)*sin(th)/(sqrt(sin(ch)*sin(th) + 1)*sqrt(-sin(ch)*sin(th) + 1))), pi - arctan2((cos(th)*sin(ch)*sin(ph) - cos(ch)*cos(ph))/(sin(ch)*sin(th)), -(cos(ph)*cos(th)*sin(ch) + cos(ch)*sin(ph))/(sin(ch)*sin(th))))" ] }, "execution_count": 150, "metadata": {}, "output_type": "execute_result" } ], "source": [ "hA = h.restrict(D1A, subcodomain=A2)\n", "hA.display(spherD1A, spher2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Hopf coordinates\n", "\n", "The Hopf coordinates are coordinates $(\\eta,\\alpha,\\beta)$ on $\\mathbb{S}^3$ which are related to the Cartesian coordinates on $\\mathbb{R}^4$ (via the embedding $\\Phi$) by\n", "$$\n", "\\begin{equation} \\tag{1}\n", " \\left\\{ \\begin{array}{lcl}\n", " T & = &\\cos\\eta \\sin\\alpha \\\\\n", " X & = &\\sin\\eta \\cos(\\alpha+\\beta) \\\\ \n", " Y & = &\\sin\\eta \\sin(\\alpha+\\beta) \\\\\n", " Z & = &\\cos\\eta \\cos\\alpha \n", " \\end{array} \\right . \n", "\\end{equation}\n", "$$\n", "and whose range is $\\eta\\in(0,\\pi/2)$, $\\alpha\\in (0, 2\\pi)$, $\\beta\\in (0, 2\\pi)$. They are\n", "defined in $D_1$ minus the points for which $X^2+Y^2+T^2=1$ (limit $\\alpha\\rightarrow 0$\n", "or $2\\pi$) or $TX-YZ=0$ (limit $\\beta\\rightarrow 0$ or $2\\pi$). In terms of the stereograĥic coordinates, this corresponds to $x^2+y^2+z^2=1$ or to $x(1-x^2-y^2-z^2)-2yz=0$. Hence we declare the domain $B$ of Hopf coordinates as " ] }, { "cell_type": "code", "execution_count": 151, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Open subset B of the 3-dimensional differentiable manifold S^3\n" ] } ], "source": [ "B = D1.open_subset('B', coord_def={stereoN_D1: \n", " [x^2+y^2+z^2!=1, \n", " x*(1-x^2-y^2-z^2)-2*y*z!=0]})\n", "print(B)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The limiting surface $x(1-x^2-y^2-z^2)-2yz=0$, where $\\beta\\rightarrow 0$ or $2\\pi$:" ] }, { "cell_type": "code", "execution_count": 152, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n" ], "text/plain": [ "Graphics3d Object" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "beta_zero = implicit_plot3d(x*(1-x^2-y^2-z^2)-2*y*z==0, \n", " (x,-3,3), (y,-3,3), (z,-3,3))\n", "show(beta_zero)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We define the Hopf coordinates and provide the transition map to the stereographic coordinates $(x,y,z)$:" ] }, { "cell_type": "code", "execution_count": 153, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left(B,({\\eta}, {\\alpha}, {\\beta})\\right)\n", "\\end{math}" ], "text/plain": [ "Chart (B, (eta, alpha, beta))" ] }, "execution_count": 153, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Hcoord. = B.chart(r\"eta:(0,pi/2):\\eta alpha:(0,2*pi):\\alpha beta:(0,2*pi):\\beta\")\n", "Hcoord" ] }, { "cell_type": "code", "execution_count": 154, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left\\{\\begin{array}{lcl} x & = & \\frac{\\cos\\left({\\alpha} + {\\beta}\\right) \\sin\\left({\\eta}\\right)}{\\cos\\left({\\eta}\\right) \\sin\\left({\\alpha}\\right) + 1} \\\\ y & = & \\frac{\\sin\\left({\\alpha} + {\\beta}\\right) \\sin\\left({\\eta}\\right)}{\\cos\\left({\\eta}\\right) \\sin\\left({\\alpha}\\right) + 1} \\\\ z & = & \\frac{\\cos\\left({\\alpha}\\right) \\cos\\left({\\eta}\\right)}{\\cos\\left({\\eta}\\right) \\sin\\left({\\alpha}\\right) + 1} \\end{array}\\right.\n", "\\end{math}" ], "text/plain": [ "x = cos(alpha + beta)*sin(eta)/(cos(eta)*sin(alpha) + 1)\n", "y = sin(alpha + beta)*sin(eta)/(cos(eta)*sin(alpha) + 1)\n", "z = cos(alpha)*cos(eta)/(cos(eta)*sin(alpha) + 1)" ] }, "execution_count": 154, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Hcoord_to_stereoN = Hcoord.transition_map(\n", " stereoN.restrict(B),\n", " (sin(eta)*cos(alp+bet)/(1+cos(eta)*sin(alp)),\n", " sin(eta)*sin(alp+bet)/(1+cos(eta)*sin(alp)),\n", " cos(eta)*cos(alp)/(1+cos(eta)*sin(alp))))\n", "Hcoord_to_stereoN.display()" ] }, { "cell_type": "code", "execution_count": 155, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Check of the inverse coordinate transformation:\n", " eta == arcsin((cos(eta)*sin(alpha) + 1)*sqrt(cos(eta) + 1)*sqrt(-cos(eta) + 1)/abs(cos(eta)*sin(alpha) + 1)) **failed**\n", " alpha == pi - arctan2(2*cos(eta)*sin(alpha)/(cos(eta)*sin(alpha) + 1), -2*cos(alpha)*cos(eta)/(cos(eta)*sin(alpha) + 1)) **failed**\n", " beta == arctan2(2*cos(eta)*sin(alpha)/(cos(eta)*sin(alpha) + 1), -2*cos(alpha)*cos(eta)/(cos(eta)*sin(alpha) + 1)) - arctan2((cos(beta)*sin(alpha) + cos(alpha)*sin(beta))*sin(eta)/(cos(eta)*sin(alpha) + 1), -(cos(alpha)*cos(beta) - sin(alpha)*sin(beta))*sin(eta)/(cos(eta)*sin(alpha) + 1)) **failed**\n", " x == x *passed*\n", " y == y *passed*\n", " z == z *passed*\n", "NB: a failed report can reflect a mere lack of simplification.\n" ] } ], "source": [ "Hcoord_to_stereoN.set_inverse(asin(2*sqrt(x^2+y^2)/(1+x^2+y^2+z^2)),\n", " atan2(x^2+y^2+z^2-1, -2*z) + pi,\n", " atan2(-y,-x) - atan2(x^2+y^2+z^2-1, -2*z))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that the test of the inverse coordinate transformation is passed, modulo some lack of trigonometric simplifications." ] }, { "cell_type": "code", "execution_count": 156, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left\\{\\begin{array}{lcl} {\\eta} & = & \\arcsin\\left(\\frac{2 \\, \\sqrt{x^{2} + y^{2}}}{x^{2} + y^{2} + z^{2} + 1}\\right) \\\\ {\\alpha} & = & \\pi + \\arctan\\left(x^{2} + y^{2} + z^{2} - 1, -2 \\, z\\right) \\\\ {\\beta} & = & -\\arctan\\left(x^{2} + y^{2} + z^{2} - 1, -2 \\, z\\right) + \\arctan\\left(-y, -x\\right) \\end{array}\\right.\n", "\\end{math}" ], "text/plain": [ "eta = arcsin(2*sqrt(x^2 + y^2)/(x^2 + y^2 + z^2 + 1))\n", "alpha = pi + arctan2(x^2 + y^2 + z^2 - 1, -2*z)\n", "beta = -arctan2(x^2 + y^2 + z^2 - 1, -2*z) + arctan2(-y, -x)" ] }, "execution_count": 156, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Hcoord_to_stereoN.inverse().display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Embedding $\\Phi$ in terms of Hopf coordinates" ] }, { "cell_type": "code", "execution_count": 157, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\begin{array}{llcl} \\Phi:& B & \\longrightarrow & \\mathbb{R}^4 \\\\ & \\left(x, y, z\\right) & \\longmapsto & \\left(T, X, Y, Z\\right) = \\left(-\\frac{x^{2} + y^{2} + z^{2} - 1}{x^{2} + y^{2} + z^{2} + 1}, \\frac{2 \\, x}{x^{2} + y^{2} + z^{2} + 1}, \\frac{2 \\, y}{x^{2} + y^{2} + z^{2} + 1}, \\frac{2 \\, z}{x^{2} + y^{2} + z^{2} + 1}\\right) \\\\ & \\left({\\eta}, {\\alpha}, {\\beta}\\right) & \\longmapsto & \\left(T, X, Y, Z\\right) = \\left(\\cos\\left({\\eta}\\right) \\sin\\left({\\alpha}\\right), {\\left(\\cos\\left({\\alpha}\\right) \\cos\\left({\\beta}\\right) - \\sin\\left({\\alpha}\\right) \\sin\\left({\\beta}\\right)\\right)} \\sin\\left({\\eta}\\right), {\\left(\\cos\\left({\\beta}\\right) \\sin\\left({\\alpha}\\right) + \\cos\\left({\\alpha}\\right) \\sin\\left({\\beta}\\right)\\right)} \\sin\\left({\\eta}\\right), \\cos\\left({\\alpha}\\right) \\cos\\left({\\eta}\\right)\\right) \\end{array}\n", "\\end{math}" ], "text/plain": [ "Phi: B --> R^4\n", " (x, y, z) |--> (T, X, Y, Z) = (-(x^2 + y^2 + z^2 - 1)/(x^2 + y^2 + z^2 + 1), 2*x/(x^2 + y^2 + z^2 + 1), 2*y/(x^2 + y^2 + z^2 + 1), 2*z/(x^2 + y^2 + z^2 + 1))\n", " (eta, alpha, beta) |--> (T, X, Y, Z) = (cos(eta)*sin(alpha), (cos(alpha)*cos(beta) - sin(alpha)*sin(beta))*sin(eta), (cos(beta)*sin(alpha) + cos(alpha)*sin(beta))*sin(eta), cos(alpha)*cos(eta))" ] }, "execution_count": 157, "metadata": {}, "output_type": "execute_result" } ], "source": [ "PhiB = Phi.restrict(B)\n", "PhiB.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The expression of $\\Phi$ in terms of the Hopf coordinates can be simplified by means of the method `trig_reduce`:" ] }, { "cell_type": "code", "execution_count": 158, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\cos\\left({\\alpha} + {\\beta}\\right) \\sin\\left({\\eta}\\right)\n", "\\end{math}" ], "text/plain": [ "cos(alpha + beta)*sin(eta)" ] }, "execution_count": 158, "metadata": {}, "output_type": "execute_result" } ], "source": [ "PhiB.expression(Hcoord, X4)[1].factor().trig_reduce()" ] }, { "cell_type": "code", "execution_count": 159, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\sin\\left({\\alpha} + {\\beta}\\right) \\sin\\left({\\eta}\\right)\n", "\\end{math}" ], "text/plain": [ "sin(alpha + beta)*sin(eta)" ] }, "execution_count": 159, "metadata": {}, "output_type": "execute_result" } ], "source": [ "PhiB.expression(Hcoord, X4)[2].factor().trig_reduce()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Hence the recover the expression (1) above." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Expression of the Hopf map in terms of Hopf coordinates\n", "\n", "The expression of $h$ in terms of stereographic coordinates on $B$ is" ] }, { "cell_type": "code", "execution_count": 160, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\begin{array}{llcl} h:& \\mathbb{S}^3 & \\longrightarrow & \\mathbb{S}^2 \\\\ \\mbox{on}\\ B : & \\left(x, y, z\\right) & \\longmapsto & \\left({x_2}, {y_2}\\right) = \\left(-\\frac{y^{3} + y z^{2} + {\\left(x^{2} - 1\\right)} y - 2 \\, x z}{2 \\, {\\left(x^{2} + y^{2}\\right)}}, \\frac{x^{3} + x y^{2} + x z^{2} + 2 \\, y z - x}{2 \\, {\\left(x^{2} + y^{2}\\right)}}\\right) \\end{array}\n", "\\end{math}" ], "text/plain": [ "h: S^3 --> S^2\n", "on B: (x, y, z) |--> (x2, y2) = (-1/2*(y^3 + y*z^2 + (x^2 - 1)*y - 2*x*z)/(x^2 + y^2), 1/2*(x^3 + x*y^2 + x*z^2 + 2*y*z - x)/(x^2 + y^2))" ] }, "execution_count": 160, "metadata": {}, "output_type": "execute_result" } ], "source": [ "h.display(stereoN.restrict(B), stereoN2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let us ask for the expression in terms of Hoopf coordinates:" ] }, { "cell_type": "code", "execution_count": 161, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\begin{array}{llcl} h:& \\mathbb{S}^3 & \\longrightarrow & \\mathbb{S}^2 \\\\ \\mbox{on}\\ B : & \\left({\\eta}, {\\alpha}, {\\beta}\\right) & \\longmapsto & \\left({x_2}, {y_2}\\right) = \\left(\\frac{\\cos\\left({\\beta}\\right) \\cos\\left({\\eta}\\right)}{\\sin\\left({\\eta}\\right)}, \\frac{\\cos\\left({\\eta}\\right) \\sin\\left({\\beta}\\right)}{\\sin\\left({\\eta}\\right)}\\right) \\end{array}\n", "\\end{math}" ], "text/plain": [ "h: S^3 --> S^2\n", "on B: (eta, alpha, beta) |--> (x2, y2) = (cos(beta)*cos(eta)/sin(eta), cos(eta)*sin(beta)/sin(eta))" ] }, "execution_count": 161, "metadata": {}, "output_type": "execute_result" } ], "source": [ "h.display(Hcoord, stereoN2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We notice that the image point in $\\mathbb{S}^2$ is independent of the value of $\\alpha$. \n", "\n", "The expression of $h$ is even simpler in terms of spherical coordinates on $\\mathbb{S}^2$:" ] }, { "cell_type": "code", "execution_count": 162, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\begin{array}{llcl} h:& B & \\longrightarrow & A_2 \\\\ & \\left({\\eta}, {\\alpha}, {\\beta}\\right) & \\longmapsto & \\left({\\theta_2}, {\\phi_2}\\right) = \\left(2 \\, \\arctan\\left(\\frac{\\sin\\left({\\eta}\\right)}{\\cos\\left({\\eta}\\right)}\\right), \\pi - \\arctan\\left(\\frac{\\cos\\left({\\eta}\\right) \\sin\\left({\\beta}\\right)}{\\sin\\left({\\eta}\\right)}, -\\frac{\\cos\\left({\\beta}\\right) \\cos\\left({\\eta}\\right)}{\\sin\\left({\\eta}\\right)}\\right)\\right) \\end{array}\n", "\\end{math}" ], "text/plain": [ "h: B --> A_2\n", " (eta, alpha, beta) |--> (th2, ph2) = (2*arctan(sin(eta)/cos(eta)), pi - arctan2(cos(eta)*sin(beta)/sin(eta), -cos(beta)*cos(eta)/sin(eta)))" ] }, "execution_count": 162, "metadata": {}, "output_type": "execute_result" } ], "source": [ "hB = h.restrict(B, subcodomain=A2)\n", "hB.display(Hcoord, spher2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We are facing some lack of simplification: \n", "\n", "- $\\operatorname{atan}(\\sin\\eta/\\cos\\eta)$ should simplify to $\\eta$\n", "- the `atan2` function should simplify to $\\operatorname{atan2}(\\sin\\beta,-\\cos\\beta) = \\pi-\\beta$, so that $\\phi_2=\\beta$\n", " \n", "Hence the right-hand side of the above formula simplifies to $(\\theta_2,\\phi_2)=(2\\eta,\\beta)$. We enforce it by the method `add_expression`:" ] }, { "cell_type": "code", "execution_count": 163, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\begin{array}{llcl} h:& B & \\longrightarrow & A_2 \\\\ & \\left({\\eta}, {\\alpha}, {\\beta}\\right) & \\longmapsto & \\left({\\theta_2}, {\\phi_2}\\right) = \\left(2 \\, {\\eta}, {\\beta}\\right) \\end{array}\n", "\\end{math}" ], "text/plain": [ "h: B --> A_2\n", " (eta, alpha, beta) |--> (th2, ph2) = (2*eta, beta)" ] }, "execution_count": 163, "metadata": {}, "output_type": "execute_result" } ], "source": [ "hB.add_expression(Hcoord, spher2, (2*eta, bet))\n", "hB.display(Hcoord, spher2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The expression of the Hopf map in terms of the Hopf coordinates is thus very simple, which justifies the name given to these coordinates.\n", "We also recover a very simple expression when asking to express $C\\circ \\Phi$ (from which $h$ has been constructed) in terms of the Hopf coordinates: " ] }, { "cell_type": "code", "execution_count": 164, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\begin{array}{llcl} & B & \\longrightarrow & \\mathbb{R}^4 \\\\ & \\left({\\eta}, {\\alpha}, {\\beta}\\right) & \\longmapsto & \\left(T, X, Y, Z\\right) = \\left(0, 2 \\, \\cos\\left({\\beta}\\right) \\cos\\left({\\eta}\\right) \\sin\\left({\\eta}\\right), 2 \\, \\cos\\left({\\eta}\\right) \\sin\\left({\\beta}\\right) \\sin\\left({\\eta}\\right), 2 \\, \\cos\\left({\\eta}\\right)^{2} - 1\\right) \\end{array}\n", "\\end{math}" ], "text/plain": [ "B --> R^4\n", " (eta, alpha, beta) |--> (T, X, Y, Z) = (0, 2*cos(beta)*cos(eta)*sin(eta), 2*cos(eta)*sin(beta)*sin(eta), 2*cos(eta)^2 - 1)" ] }, "execution_count": 164, "metadata": {}, "output_type": "execute_result" } ], "source": [ "CS.restrict(B).display(Hcoord, X4)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The right-hand side should simplify to\n", "$$(T,X,Y,Z) = (0, \\sin(2\\eta)\\cos\\beta, \\sin(2\\eta)\\sin\\beta, \\cos(2\\eta))$$\n", "We can (partially) obtain this by means of `trig_reduce()`:" ] }, { "cell_type": "code", "execution_count": 165, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}0\n", "\\end{math}" ], "text/plain": [ "0" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\cos\\left({\\beta}\\right) \\sin\\left(2 \\, {\\eta}\\right)\n", "\\end{math}" ], "text/plain": [ "cos(beta)*sin(2*eta)" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\sin\\left({\\beta}\\right) \\sin\\left(2 \\, {\\eta}\\right)\n", "\\end{math}" ], "text/plain": [ "sin(beta)*sin(2*eta)" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}2 \\, \\cos\\left({\\eta}\\right)^{2} - 1\n", "\\end{math}" ], "text/plain": [ "2*cos(eta)^2 - 1" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "for cp in CS.restrict(B).expr(Hcoord, X4):\n", " show(cp.trig_reduce().simplify_full())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## The Hopf map as a fibration of $\\mathbb{S}^3$\n", "\n", "The above results show that the image by $h$ of a point of Hopf coordinates $(\\eta,\\alpha,\\beta)$ is independent of $\\alpha$. Since $h$ is surjective, this means that for any point \n", "$p\\in\\mathbb{S}^2$, the preimage set $h^{-1}(p)$ corresponds to a fixed value of $(\\eta,\\beta)$, with $\\alpha$ taking all values in the range $(0,2\\pi)$. From Eq. (1), the projection of $h^{-1}(p)$ in the $(T,X)$-plane is a circle of radius $\\cos\\eta$ centered on $(0,0)$, while its projection in the $(X,Y)$-plane is a circle of radius $\\sin\\eta$ centered on $(0,0)$. We conclude that $h^{-1}(p)$ is a great circle of $\\mathbb{S}^3$, sometimes called a *Hopf circle*. \n", "\n", "It follows that $\\mathbb{S}^3$ has the structure of a **fiber bundle** over $\\mathbb{S}^2$ with \n", "$\\mathbb{S}^1$ fibers. The Hopf map $h:\\mathbb{S}^3\\to\\mathbb{S}^2$ is then nothing but the projection map of this bundle." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can get a first view of the fibers by plotting the Hopf coordinates in terms of the stereographic ones, for a fixed value of $\\eta$ ($\\eta=\\pi/4$): the lines along which $\\alpha$ varies while $\\beta$ is kept fixed, hence the fibers $h^{-1}(p)$, are plotted in green. They are\n", "indeed circles (remember that stereographic projection preserves circles):" ] }, { "cell_type": "code", "execution_count": 166, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n" ], "text/plain": [ "Graphics3d Object" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "graph = Hcoord.plot(stereoN, \n", " fixed_coords={eta: pi/4},\n", " color={alp: 'green', bet: 'orange'},\n", " number_values=9, label_axes=False)\n", "show(graph, axes_labels=['x','y','z'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that all the green circles are linked.\n", "The same plot, but in terms of the coordinates $(X,Y,T)$ of $\\mathbb{R}^4$ via the embedding $\\Phi$:" ] }, { "cell_type": "code", "execution_count": 167, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n" ], "text/plain": [ "Graphics3d Object" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "graph = Hcoord.plot(X4, mapping=PhiB, ambient_coords=(X,Y,T), \n", " fixed_coords={eta: pi/4},\n", " color={alp: 'green', bet: 'orange'},\n", " number_values=9, label_axes=False)\n", "show(graph, axes_labels=['X','Y','T'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We may fix $\\beta$ instead of $\\eta$, in plotting the Hopf coordinates in terms of the stereographic ones. The fibers are still the green circles, the red lines being lines along which $\\eta$ varies at fixed $\\alpha$. Again, note that all the green circles are linked." ] }, { "cell_type": "code", "execution_count": 168, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n" ], "text/plain": [ "Graphics3d Object" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "graph = Hcoord.plot(stereoN, \n", " fixed_coords={bet: pi/2}, \n", " ranges={eta: (0.25, 1.5)},\n", " color={eta: 'red', alp: 'green'},\n", " number_values=9, plot_points=150, \n", " label_axes=False)\n", "show(graph, axes_labels=['x','y','z'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If we vary the three coordinates $(\\eta,\\alpha,\\beta)$, we get the following plots, where $\\mathbb{S}^3$ appears as filled by the grid of Hoopf coordinates:" ] }, { "cell_type": "code", "execution_count": 169, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n" ], "text/plain": [ "Graphics3d Object" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "graph = Hcoord.plot(X4, mapping=PhiB, ambient_coords=(X,Y,Z), \n", " color={eta: 'red', alp: 'green', bet: 'orange'},\n", " number_values=7, label_axes=False)\n", "show(graph, axes_labels=['X','Y','Z'])" ] }, { "cell_type": "code", "execution_count": 170, "metadata": {}, "outputs": [], "source": [ "#graph = Hcoord.plot(X4, mapping=PhiB, ambient_coords=(X,Y,T), \n", "# color={eta: 'red', alp: 'green', bet: 'orange'},\n", "# number_values=7, label_axes=False)\n", "# show(graph, axes_labels=['X','Y','T'])" ] }, { "cell_type": "code", "execution_count": 171, "metadata": {}, "outputs": [], "source": [ "#graph = Hcoord.plot(X4, mapping=PhiB, ambient_coords=(X,Z,T), \n", "# color={eta: 'red', alp: 'green', bet: 'orange'},\n", "# number_values=7, label_axes=False)\n", "#show(graph, axes_labels=['X','Z','T'])" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "## Fibers of the Hopf fibration\n", "\n", "For a point $p\\in\\mathbb{S}^2$, identified by its spherical coordinates $(\\theta_2,\\phi_2)=(2\\eta,\\beta)$, the fiber $h^{-1}(p)$ can be seen as a curve in $\\mathbb{S}^3$:" ] }, { "cell_type": "code", "execution_count": 172, "metadata": {}, "outputs": [], "source": [ "R. = RealLine()\n", "def fiber(eta, bet):\n", " return S3.curve({Hcoord: (eta, t, bet)}, (t, 0, 2*pi))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For instance, the fiber above the point $(\\theta_2,\\phi_2)=(\\pi/3,\\pi/4)$ is " ] }, { "cell_type": "code", "execution_count": 173, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\mbox{Curve in the 3-dimensional differentiable manifold S^3}\n", "\\end{math}" ], "text/plain": [ "Curve in the 3-dimensional differentiable manifold S^3" ] }, "execution_count": 173, "metadata": {}, "output_type": "execute_result" } ], "source": [ "F = fiber(pi/6, pi/4)\n", "F" ] }, { "cell_type": "code", "execution_count": 174, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\begin{array}{llcl} & \\left(0, 2 \\, \\pi\\right) & \\longrightarrow & \\mathbb{S}^3 \\\\ & t & \\longmapsto & \\left(x, y, z\\right) = \\left(\\frac{\\sqrt{2} \\cos\\left(t\\right) - \\sqrt{2} \\sin\\left(t\\right)}{2 \\, {\\left(\\sqrt{3} \\sin\\left(t\\right) + 2\\right)}}, \\frac{\\sqrt{2} \\cos\\left(t\\right) + \\sqrt{2} \\sin\\left(t\\right)}{2 \\, {\\left(\\sqrt{3} \\sin\\left(t\\right) + 2\\right)}}, \\frac{\\sqrt{3} \\cos\\left(t\\right)}{\\sqrt{3} \\sin\\left(t\\right) + 2}\\right) \\\\ & t & \\longmapsto & \\left({\\eta}, {\\alpha}, {\\beta}\\right) = \\left(\\frac{1}{6} \\, \\pi, t, \\frac{1}{4} \\, \\pi\\right) \\end{array}\n", "\\end{math}" ], "text/plain": [ "(0, 2*pi) --> S^3\n", " t |--> (x, y, z) = (1/2*(sqrt(2)*cos(t) - sqrt(2)*sin(t))/(sqrt(3)*sin(t) + 2), 1/2*(sqrt(2)*cos(t) + sqrt(2)*sin(t))/(sqrt(3)*sin(t) + 2), sqrt(3)*cos(t)/(sqrt(3)*sin(t) + 2))\n", " t |--> (eta, alpha, beta) = (1/6*pi, t, 1/4*pi)" ] }, "execution_count": 174, "metadata": {}, "output_type": "execute_result" } ], "source": [ "F.display()" ] }, { "cell_type": "code", "execution_count": 175, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n" ], "text/plain": [ "Graphics3d Object" ] }, "execution_count": 175, "metadata": {}, "output_type": "execute_result" } ], "source": [ "graph_F = F.plot(chart=stereoN, color='green', plot_points=100)\n", "graph_F" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Plot of the fibers\n", "\n", "Let us plot the fibers for three values of $\\eta$: $\\eta=\\pi/6$ (turquoise), $\\eta=\\pi/4$ (gold)\n", "and $\\eta=5\\pi/12$ (red). For each value of $\\eta$, we note that the fibers fill a torus." ] }, { "cell_type": "code", "execution_count": 176, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n" ], "text/plain": [ "Graphics3d Object" ] }, "execution_count": 176, "metadata": {}, "output_type": "execute_result" } ], "source": [ "graph= Graphics()\n", "etas = {pi/6: ['turquoise', (0, 2*pi), 30], \n", " pi/4: ['gold', (0,2*pi), 30],\n", " 5*pi/12: ['red', (0, 2*pi), 30]}\n", "for eta_v, param in etas.items():\n", " color = param[0]\n", " beta_min, beta_max = param[1]\n", " nb = param[2]\n", " db = (beta_max - beta_min)/(nb-1)\n", " betas = [beta_min + db*k for k in range(nb)]\n", " for beta_v in betas:\n", " F = fiber(eta_v, beta_v)\n", " F.coord_expr(stereoN.restrict(B))\n", " graph += F.plot(chart=stereoN, color=color, plot_points=150,\n", " label_axes=None)\n", "graph" ] }, { "cell_type": "code", "execution_count": 177, "metadata": {}, "outputs": [], "source": [ "#show(graph, viewer='tachyon', figsize=24, aspect_ratio=1, frame=False)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A \"top\" view of the fibers, obtained by projection to the $(x,y)$-plane (note that for clarity, we have reduced the number of fibers from 30 to 12):" ] }, { "cell_type": "code", "execution_count": 178, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAdAAAAHWCAYAAADHBNgdAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+j8jraAAAgAElEQVR4nOzdd3xb1fn48c+92tvytuPsBRns0AYoI4RdVoGySwulBUK/EErhxyrQslpaoBRToIWyC3SwWkgJUKCMhDBSAoGEbG/Zsqw9772/P64TEuI4sixZtnXer5deTizp6kiW9NxzznOeI2mapiEIgiAIwoDIxW6AIAiCIIxEIoAKgiAIQg5EABUEQRCEHIgAKgiCIAg5EAFUEARBEHIgAqggCIIg5EAEUEEQBEHIgQiggiAIgpADEUAFQRAEIQcigAqCIAhCDkQAFQRBEIQciAAqCIIgCDkQAVQQBEEQciACqCAIgiDkQARQQRAEQciBCKCCIAiCkAMRQAWhQLq7u/nhD3/IiSeeyCmnnEI6nd7m+iuvvJKTTjqpSK0TBGGwJE3TtGI3QhBGo4svvphrr70Wv9/PrFmzeOGFFzj22GMB0DSNiooK9tlnH1555ZUit1QQhFyIHqggFMDnn39OXV0dtbW1vPvuuwBUV1dvuX7FihUEAgHmzZtXrCYKgjBIIoAKQgF0dnZy9tlnA/Doo48yZcoU9t133y3Xv/XWWwAigArCCGYsdgMEYTQ68MADAdi0aRNvv/02N910E5Ikbbn+rbfewu12s/feexeriYIgDJLogQpCAf3jH/8A4OSTT97m92+99RYHHnggBoOhGM0SBCEPRAAVhAJatmwZdXV1TJ8+fcvvVq1aRUdHhxi+FYQRTgRQQSggv9/P+PHjt/ndq6++CsAhhxxSjCYJgpAnIoAKQgHts88+bNq0CUVRAPjkk0+47rrrKC8vZ/fddy9y6wRBGAyRRCQIBXT11VfT3NzM0UcfzZQpU3A6naTTaY466qhtkooEQRh5RCEFQSgQTdNIJBLYbLYtv3vuuec48cQTefHFF/n2t79dxNYJgjBYIoAKQoEcccQRvPfee7S1teFwONA0jf333x+3282iRYuK3TxBEAZJzIEKQoEsW7aMfffdF5vNhqIoLFy4EFVVefrpp4vdNEEQ8kD0QAWhQBYvXszixYuJxWL4fD723XdfLrnkEkwmU7GbJghCHogAKgiCIAg5EEO4giAIgpADEUAFQRAEIQcigAqCIAhCDkQAFQRBEIQciAAqCIIgCDkQAVQQBEEQciACqCAIgiDkQARQQRAEQciBCKCCIAiCkAMRQAVBEAQhByKACoIgCEIORAAVhCGiaRqhUAhRfloQRgcRQAVhiITDYTweD+FwuNhNEQQhD0QAFQRBEIQciAAqCIIgCDkQAVQQBEEQciACqCAIgiDkQARQQRAEQciBCKCCIAiCkANjsRsgCF+naRo+Jc0XyRirU3EAvAYj5QYj5QYT5QYjXtmIUzYgSVKRWzu6dStpPk1G2ZROYpVk7LKMQzJgk2UcsgG7ZNB/JxuwSzKy+HsIJUQEUKHoQkqGL1IxvkjGe3/GCKgZAKoMJoySRLeSJvm1AgQmJD2YGkzsaXVwmKOciWZrMZ5CvxobG2lsbERRlGI3pV+qprExnWBFMsanySifJaO0ZlIAOGUDaU3d7m+wtQqDkSMc5RzpLGesyTJUzRaEopE0URZFKAJF0/hnxM/fQp00935Ju2QDu5jt7GKx9f60U24wAXqvNKapBJQM3UqabiWz5d8dSpql8RAhVWGKycphTi/z7F4qjaZiPsXthEIhPB4PwWAQt9td7OYA0JZO8lqsh08TUT5LxYioCjIwxWxjpsXBLIudWRYH1UYzoP/dYqpCTFOJqQpRVSWm6T8/SUZ4LdpDWFWYZbFzpKOcQxxl2GVDcZ+kIBSICKDCkFsWD3NvoJWN6QSHOsr4hs3NrmY79UZzzkOyaU3l/XiYxdEA78ZCZNDYy+pkvsPLgXbPsPgSH04BdFM6wRNBH69GA9gkmZkWx5aAuavFji3H1yulqbwdC/JypJsPExEsksxBdg9HOsvZ3eIQQ+7CqCICqDBkNqUT/CHQypJ4mN0sDhZ465lmsef9cSKqwpvRHl6NBliejGKRJPa3eTjZXcWuBXi8bA2HALouFefxoI83Yj1UGIyc6q7m284KrHL+8wl9mRT/jgRYFO2mNZNiutnGDVUTqO3tzQrCSCcCqFBwISXDo8EOngt3UW008+OyOg60e4akN9KRSfF6tIdFkW6aMkmOdpZzflkdHsPQT/8XM4CuSsZ4LNjBO/EQtQYzp3uqOdLpxSwVPhFf1TQ+TkT4bXczUVXhmspx7GsbHkPYgjAYIoAKBfWvsJ8HetrIaBpneWo4yV05JF/aX6doGi+E/TzY04ZBkvhRWR1HOcuHNGu0GAF0RSLK48EO3k+EaTCaOdNTw3yHF2MRhlLDSoab/Zt4Px7m+55azvJUi6xdYUQTAVQomKeDPu7raeNIh5fzvXVbEoKKqVtJc1+gjcXRADMtdi4tb2CK2TYkjz2UATSiKvzW38QbsSATTVbO8lRzkL0MQ5EDlqppPBbs4JFgB9+0ubm6chzOYTA/LQi5EAFUKIi/hzq5J9DKWe5qzi2rHXbJI/9LRLiru4VN6QTHuyo5t6y24F/kQxVAVySi3Ny1kaimckn5GObZy4ZdT29pPMTNXZtwyQZurJowZCcxgpBPIoAKefd8uIu7uls41V3Fj8vqhl3w3Cyjafw91MnDwQ5sksyF3nrmO8oK1t5CB1BF03gi6OORYDszLQ6uqRxHzTBO2GlLJ7m+ayOb0gl+VjGWQx3eYjdJEAZEBFAhr/4V9vOb7mZOdlVykbd+2AbPrXVmUjQGWnkzFuSA3mHFXJdx9KeQAdSXSXFz1yY+TUY521PD2Z6aog/XZiOpqvy2u5nXogHurJnMblZnsZskCFkTAVTIm0WRbn7tb+I4ZwWXlI8ZEcFza2/HgtzStYkGk4WbqyZQlefeW6EC6H9jQW73N2GTZK6pHDfigpCiaVzWsZaWTJIH6qYNi7lyQciGKCYv5MWr0QC/9jdxtLOc/xuBwRPgALuH39dOIaRkuLD9S1YlY3k5bmNjIzNmzGDOnDl5Od5mCVXlDn8zP+/cwB5WJ3+smzbigieAQZL4eeV4VA1u6tyEIs7phRFC9ECFQfsgHuZK3zoOd3j5WcXYYZewMlDdSpprfRtYl45zVcU4DnKU5eW4+eyBtqSTXNu5gdZMkgXeMRzrLB+RJy1bW56I8NOOtZzuruaH3rpiN0cQdkr0QIVBSaoqd3Y3s7vVyeWjIHgClBtM3Fkzmf1tHm7o2sjjwQ6G03nmhlSCSzrWoGga99VO4zhXxYgPngB7WJ38sKyOJ0I+3ouFit0cQdgpEUCFQXky5KMzk2ZhecOISFrJlkWWubZyHN/31PBgTzu3+ptIaWqxm8WXqRiXdqzBIxv5Xe3kYbn7zGCc6q5iP5ubW/2baO/dZEAQhisRQIWcNaeT/CXo4zRP1ajcvkqSJM4pq+W6ynG8Ee3hso61BJR00dqzMhllYfta6oxm7qyZjHcUJtvIksT/qxiLUzZwfeeGYXHSIgg7IgKokBNN0/hddzOVRhNnumuK3ZyCmufwclftZFrTKS5qW1OUntHyRITLO9YxyWzjNzWTcRehlu9QcRmM3FA5nvWpBA8E2ordHEHYIRFAhZy8EQvyQSLCT7xjsBRgJ4/hZobFwb11U5El+NkQ90Tfj4e40reOGRY7v6qeiKMESt9Ns9j5QVktz4f9dIihXGGYGv3ffELeRVWFxkALB9jczLWXzq4atUYzt1dPIq6pXNGxjoiqFPwx344Fuda3gb2tLm6pnliQAg/D1QmuCuyyzF+CvmI3RRD6JAKoMGAP97QTVVUuLh9T7KYMuXqThdurJ9GhpLnat56EWrg5utejAa7v3MB+djc3Vo0vyi42xWSTDZziruKlSDddmeLNPQvCjpTWJ1IYtDWpOP8Id/E9T82wrrNaSBPNNm6rnsiXqTg3dG4gXYBEl8WRADd1bWK+w8t1leMxlVjw3OxEVyUWWebpkOiFCsNPaX4qhZz9uaedBqOFk92VxW5KUc2wOPhl1QQ+TES4raspr9Vzlici/NrfxJGOcq6sGDuqlgcNlEM2cJKrkhcifrqLmAEtCH0RAVTIWmcmzZJ4iJPdVSXbI9raPjYX11aO441YD3d3t+yw2MJASvm1pJNc37mB2VYHl1U0jIrCFIN1kqsSIxLPhDqL3RRB2IYo5Sdk7fFgB08EffytYUZJZIJm66WIn9v9zZzlrua8fkrQ7ayUX0RVuLj9SxRNo7F26qheqjJQfwq08fdwF0+N2RWPeF2EYUJ0I4SsqJrGS5FuDrZ7RPD8mqOdFVzorePxkI9ncpyrUzSNX3RuxK9kuKV6kgieX3OKuwqAv4leqDCMiAAqZOXjRIS2TIqjnRXFbsqw9F13NWe6q/lDoI13YsEB378x0MqHiTA3VI4flVWdBstjMHK8q4Jnw11DsnxIELIhAqiQlZci3YwzWphlsRe7KcPWeWW1HGBzc5u/ibZ0Muv7PR/u4tlwF5eUN7C3zVXAFo5s33VXkdQ0Xol0F7spggCIACpkIahk+G8syDGukb9lViFJksSVleNwyQZu6NqYVR3XD+Nh7u5u4TuuSo5zid59f8oNJvawOngnLnZqEYYHEUCFnVocDaABhzm8xW5K0fzhD39gt912w+1243a7mTt3Li+//PJ2t3PKBq7vrePa2N3a7zE3pRPc0LWRfawuLvLWF6rpo8r+dg//S0TEMK4wLIgAKvRL600e2t/uHpW7f2SroaGB2267jQ8++IAPPviAefPmcfzxx/PZZ59td9vpFjsXl9fzQsTPa9FAn8cLKxmu9q2nwmDkuqrxJb3WcyD2t7lRgCWiFyoMAyKACv36PBVjfTrB0c7yYjelqI499liOPvpopk2bxrRp07j55ptxOp0sWbKk79s7KzjUXsZv/M1sSie2u/6u7haCqsItVRNxiqzmrFUZzUwz23JK1BKEfBMBVOjX4miAaoOJva0iuWUzRVF46qmniEajzJ07t8/bSJLETysaqDGauL5zI/GthhzfiAZ4PdbDpeVjqBcZtwN2gM3D+/Gw2CtUKDoRQIV+fZyIsK/NJYYYgRUrVuB0OrFYLFxwwQU8++yzzJgxY4e3l9MZLrdV0pZOcnvHBoJBvdd0b6CNefYyDi3hOeXB2N/uJqapLE9Eit0UocSJACrsUFDJsDGdZDeLs9hNGRamT5/O8uXLWbJkCRdeeCHnnHMOK1eu3OHtb731VmaXV7H80qv4TyrCnIULALBKMpeW4E42+TLRZKXOaOadmJgHFYpLlPITdujtWJDrOjfw1JhdS3bnlf7Mnz+fyZMnc//99/d5fTKZJJnU14PeG+1ikb+NN2cfwBvtzRxUIwLoYDR2t/BGrIenx8wQ9YKFohE9UGGHPklEqTGYRPDcAU3TtgTIvlgsli3LXr5TXsvmWdDdrKJHP1j72z10KRlWp+LFbopQwkTBTWGHPklGmG11FLsZw8LVV1/NUUcdxdixYwmHwzz11FO88cYbLFq0aKf3TWsqt/ubqOldBvRC2M85Hk+hmzyqzbY4cMsG3okF2UVUxxKKRPRAhT7FVIUvU3Ex/9mro6ODs88+m+nTp3PooYeydOlSFi1axGGHHbbT+z7c08GGdJJrqsYB+q427ZlUoZs8qhkkiT2tTlYko8VuilDCRA9U6NNnyRgqsJvogQLw4IMP5nS/FYkIfwn5OK+slsmSDQCXbOAOfzO/qp4oSiMOwhSzjWdCnWiaJl5HoShED1To04pkBI9sYJxRrFPMVVxVuNXfxEyLndPc1Vt+f5G3nmWJMK9Ge4rYupFvkslKWFXoUtLFbopQokQAFfr0SSLKbhanOLMfhCeDProyaf5fxbht1tHua3czz17GPYEWepRMEVs4sk0y6z36tX1UehKEoSACqLCdlKayMhkTw7eD0JJO8nSok9M8VYzpo9rQxeV68fjGQMtQN23UqDGYcEgy60QmrlAkIoAK2/kyFSeNxmyLCKC5ujfQitdg5Ax3TZ/Xew0mLvLW82q0h6WiMHpOJEliktnG2pTogQrFIQKosJ2m3s2gJ5qtRW7JyLQkHuLdeIgLvfVY5R1/xA53eNnH6uROf/M2tXKF7E0yWVmbFj1QoThEABW205ZJUWEwYpbE22OgUprKPd0t7Gl1cpBdX+vZ2NjIjBkzmDNnzja3lSSJy8obCKoKD/W0F6O5I94ks42mdFIUlheKQnxDCttpy6SoFdWHcvK3UCdtmRQ/8Y7ZkoC1YMECVq5cybJly7a7fZ3Jwtmeap4Nd9Gc3nFVI6Fvk81WVGCjSCQSikAEUGE7HZkUtQYRQAeqM5PmsaCP77gqBzT8fZKrinKDiT/1tBWwdaPTRJP+Oot5UKEYRAAVttOWSVEneqADdl+gFZskc05Z7YDuZ5Flzi2r5c1YkJWiss6A2GUD9UYz60QAFYpABFBhG2lNpUtJiyHcAfpfIsLrsR7O99bhlA0Dvv9hDi+TTFbuD7QhNkgamIkmK+tFIpFQBCKACtvwZdJoIALoACiaxt3dLexqtnNEjptkGySJH3vr+CQZ5V2xrGVAKg0mukVBCqEIRAAVtrG5yLkIoNn7T6yHdekEF5fXD2pvyjlWF3tbnTwQaEMRvdCslRmMhFQRQIWhJ4rJF1BcVfApadKa1ntR9Z989f+UppHRNBQ0yg0m6oxmao3mnIYB86Etk0IGqo2mojz+SKNoGo/2dDDX5mbGIAtPSJLEj8rq+HH7l7wU6eZYV0WeWjm6eWQjQUUpWlH5jKYRVRWiqkJMU4moCjFVIaqqRDX994oGVUbTlv11q40mTGKZ2IgnAmgedWbSfJqMbrmsScXJdnWaDNvc1i0bqDWatwTUui0XCzVGU8HWaLZlUlQaxIc7W69GAzRlklxbOS4vx5tmsTPfUcbDwXbmO8qwFelEaiTxGAyk0YhpKg6pMK+Xqmm0ZlKsTsX4MhXny1ScDekEYVUh1c9ogQFwyAZkJHq26iVLQLnBSI3BTI3RTI1RD6xjjRZ2tzoxihrUI4IIoDlSNI316QQrklE+TUT5LBmlo3dXiHqjmZkWB8c4K5hgsmCWZEySpF+QMG39f0nCiP5h6VEztGVStGdStPb+bMuk+DIWpCOTYnOtGgk9cWIvq5M9rE52tzrz1mNtF2tAs6ZoGo8GOzjA5mZaHjd1Pq+sjjdbvuCZUOeAM3pLkUfWv8aCSgZHHj4HiqaxKZ3ky95guToVZ00qTqy3WEONwcRUs42jnRV4ZAOOzRdJxiEbsMsGHLKMQzJglqQtveKUpuLLpOno/Wx3KGl8mRQdmRRfpGL4ej/jHtnAPEcZ8x1edjXbxYYOw5gIoAOUUFWeDXfxdMhHUFUwIjHVbONAexmzrHZmWRyUG3Ib/vQaTHgNpj6HAhVNo1NJ05ZJ0ZpO8mkyyn9jQf4W7kIGpppt7Gl1sqfVyWyLI+eei09JUSe2MMvKK9EArZkUN1ZNyOtxa41mTnRX8lSok2NdFTm/n0qFx6B/jfWoGeoZ+HtX1TS+SMV4JxZieSLC2nScZG+vcozRzFSzjbM8NUw125hqtm15vIEySzINJgsNfWwuAPpnfF06zmvRHl6LBng27KfBaGa+w8t8h7fPTQmE4hIBNEspTeVf4W4eD3UQVDIc46zgUEcZ0812LP3UO80XgyRR2zucu6fVyTGuCjRNoy2T4uNEhI8TERZHAzwV6sQA7GKx6z1Ui5NZVkfWQ75xVcUxBM9npMtoGo8FOzjQ7mFK77ZaO9LY2EhjYyOKkn292zPd1fwz7OevoU5+7K0fbHNHtbItPdDsX9+UprI8EeHtWIh340H8SgaPbGAfq4uDHWVMNduYYrYNaS6CQZKYarYz1Wzn/LI6licivBoN8HSok4eDHcy02Jnv8DLPXoY7xyAu5JekiUVn/VI0jX9Hu3m0p4NOJc1hDi/neGqoG4Zng5qm0ZRJbgmoyxMRgqqCXZI50O7hcGc5u1sc/WaKfq/lC/azu7lAfGn3619hP7/tbubBumlM3EkA3SwUCuHxeAgGg7jd7p3e/v5AKy+E/TzdMKNoSWUjQUpTOWLTCq6sGMuRzvId3i6iKiyNh3g7FuT9eJiYplJvNLO/zcMBdjczLY5t9m0dLhKqyrvxIIujAd6Ph3HKBn5WMZYDemstC8UjTmN2QNU03oj18HBPB02ZJAfZPfyqrJbxpuG7Q4kkSYwzWRlnsnK8qxK1d572vzH9w7coGqDaYGK+w8thDi8T+ig3l9BULCKBqF9pTeWxYAcH2T1ZB89cnOyq4u+hLp4Pd3Gmp+9t0QR9aNQhyQT7WAvalUnzdjzIO7EgyxNRMmhMM9s4zV3NAXY3E0zWYT/HaJVl5jm8zHN46VbS3OFv5rrODRzvrOBCb/2QjIAJfRMBtA/dSpqrfetZlYrzTZuL66rGMdWcvySRoSJLEpPNNiabbZzjqeGzZIzF0QAvRvw8GfIx1WzjcIeXeY6yLfNsSU3FMsy/UIrt5Ug3PiXNbZ7CJvhUGE0c6Szn76EuTnZViS/KfngMxi1Zrqqm8XEiwvNhP+/Eg0jAHlYnF5XXs7/NTfUITpIrN5j4ZdUEXoz4aQy08r9klOsqxzGpgCdywo6JAPo1/kyayzrWEtMU7q6Zwmzr6NhUWpIkZlkdzLI6WFBez9J4mMWRAPcH2vhDoJU5VheHOb0kVEX0QPuR0lQeD/qYZy/rswefb6e6q/hXxM/L0W5OcFUW/PFGKo9spCuT5q+hTl4Id9GcSTHRZOUn5WM41F6GaxTNGUqSxHGuSmZbnNzUtZEL2r7kQm89J7gqhn1verQRc6Bb6cyk+WnHWuKayp01k3eYLTeahJQMb8R6eCUa4LNkDNAr4lxZMZYKUUxhOy9Huvm1v4lH6qczboDD+QOdA93sl50bWZmM8fiYXYblHF2xrUrGuLZzPd1KBhmJA+0ejndVMNviGPUBJaWp3Bdo49lwF3Ntbq6oGEvZKDpZGO5EAO3ly6RY2LGWjKZxR83kkkwZX5+Kc27basyShKbBfIeXUz1Vw3redyhpmsYP21ZTYzRzS/XEAd8/1wC6JhXn/LbVXF0xjsOcudXaHW0Sqsp/Yj08H+5iVSqOGT1L/c7aySW57Oe9WIhf+TfhkA3cXzdNJJ0NETFWh77/5cKOtSiaxl0lGjyBLV88Py1v4NyyWpYlQny/dRXX+NbzSSJS8ruELE9GWZdOcNIQD6VOMdv4htXFX0I+1BL/G3Qrae4LtHJKy0pu9zfhkY3cXDWBPa1OGkyWkgyeAHPtbu6tnUpQyfAbf1PJf1aHSskH0PZMikvb16IBd9VOGZbLU4ZKqrfSSpnByGmeap4csytXVoylJZPkko61XNy+hrdiPSVb6Pxvoc4tFaCG2umeatanEyyNh4f8sYeDbiXNvd2tnNHyOf8M+znGWc5j9bvwq5pJ7Gf3IEkwugdrd67eZOFnFWN5MxbkxUh3sZtTEkp6sDyiKlzavgaDJHFHzWRqRnB2Xj4kegPj5qILJknmSGc5hzu8LI2HeTrk4/rOjTQYzZziruYIh7dkMkNb0knei4f4aXlDUebVdrM4mGmx80Sog7n27Id/R7qAkubpUCfPhbswIPFddzWnuCpHVVJQPh3kKOO4RITGQAuzLHaRnVtgJf0ufCbko0fN8HD9LiUfPEFfwgJg/VoWrixJzLW7mWt383kyxtMhH3d1N/NosJ3ve2o5ylk+6pNbng134ZINzM9xv8/BkiSJ09zVXNe5gVXJGNPzWHt3OOpRMjwV8vF82I8MfNddxcmuqh1W4NEQPdDNFpTX82kyyo2dG7mvbqrYkKCASqP70IeAkuavoS5OdFWK4um90r09UFM/wXBXi50bqibwaP0u7GFx8tvuZs5rW8W7seConXeJqgovR7o5zlmRU4+7sbGRGTNmMGfOnEG1Y67NTbXBxAsR/6COM5wFlQwPBFo5veVzXgj7OclVyZNjduXcsjpRvi5LZknm+qrx+JQ0d3e3FLs5o1rJBtAngz4MwGnu6mI3ZdjYHDjTWQTCBpOFa6vGc1/tVMplE9d0buDSjrWsTEYL3cz80TKg+EGN6P/egZcj3SQ1leNzTB5asGABK1euZNmyZbm2FNBrpX7bWcHr0R4iah91XzUFMl2ghEBLD+qxhlpYyfDHQBuntXzOs2E/33FV8pcxu/JDb112xds1kEQfdItxJiuXlI9hUTTA4kig2M0ZtUrylM6XSfF82M9Znpqcd1YYjTYP3Sa0bHcxhekWO7+tmcT7iTD3B9pY0L6Gg+wezi+rGx7ZzJoCyeUQewtSayHT0ntphkwH2+7CagDJCrIVjGPAPAPVvCtNUQ8nW2dROQxGwo62W/mo+302tj3DTLkdMm29l1ZQfGz7fIwg20Cyg7EaLLt9dbHuDoZaKPLQu6JpvBTp5k89baQ0jRNdFZzqrhafyzw4wuHlw0SY33U38y27B2uJ5CsMpZJ8lz4a7MAuy5zsFpVdtra5hF9yAAEU9Pm5b9jc7GN1sTga4MGeds5p/YLjXJV8z1MztAu7NQ2Sn0Ls9d7LW6D2gGQD8xQ9MFp2B8fRYGoAQwVoKdASoMb1n1oc0k2Q/Awl+goL1W5IAEEz2A4C5zHg/DaYJxf++ShBiC6G+DsQf5eKxEfcSYZ4yoFm3RXJWAe2fcBYD8Y6MFTqvWk1pj+PzT8zzZBcAZHn9R43gKFKfy6uU8AxH6Shncr4NBHl7kALX6biHO7w8qOyusEV7xAd0G1IksQ5nlpejfawJB7iYEdZsZs06pRcAG1OJ3k50s0F3nrsYnJ9G5tL+A00gG5mkCSOdJZziL2Mv4c7eTLo49+Rbk73VPNdd1XWW6rlRAlD6AnouVcPFJIZrHOhfCHYDwHrviAPvEd8Tcc6pEwnv/ImIPExRF+GzivAdymYp4PjGHCdBLa5+evNaSmIvAyhxyHyImhJME0A2/7g+T4r5d35ScDKXbXTmD3QJXVZC2IAACAASURBVDWaCumNkPwEEksh/A8IPgxyGTiPB/d3wXEYSIVbT9mVSfNATxuLowGmmW3cUzuFmX3sgTsQo3P2ffAaTBamm228Fg2IAFoAJRdA/9zTToXBxPGuimI3ZdjZPMSTVAf3dWSRZc7w1HCMs4LHgh083NPO4kiAyyoa2D3fayiTKyHwBwg9AmoUnMdB1a/AfrA+fDkInZkUHyTC/LR8CtgrwH4QlF+q9+Cir0LkXxD+CwTuAMse4L0Y3KeDnGOGbHwJBB+B0DOgduvHrLxZD2qmsVtutoumURf5ghci/oEHUEkG80T94jpeP37yUwj/FcLP6K+jaSJUXAues/MaSNOayt9CXTwW7MAsSVxe3sCReczgFh3Qvh3q8PLHQBsRVREVivKspAbFfZkU/4n1cJanprC9oRHK1JuGMZA50P54DEYuLh/DH+um4TIYuLRjLbf7mwj1se3UgKU3QsvJsH6m/uXvvQQmb4CGZ8F51KCDJ8Ar0QBmSdr+zF12gusEqPsjTG6GhkVgbID282FNA/h+Bql12T2IpkH0Ndh4MGycC5GXwPtjmPgpTPwYKn66TfAEfVnRsc4K3owG+9zCa0AkCayzoeoXMPFzmPARWPeB9vNg3XToeSgvCUlL4yHOa13Nn3raOKq3CMIxroq8BU8FrbS+zAbgEHsZGTTeivUUuymjTkm95z5LxtCAb5XQQvSBkCQJiyTnPIS7IxPNNu6umcLC8gbejPZwTusqFkcCuS17UePQ9QtYtyvE34O6h2HKJqj65XaBZjA0TWNRpJsD7WU4+jtrl2RwHgFjX4RJa6DsPOh5ENZNhbYfQrp1Rw+gB8tN+0PTfFDDMOZZmLweqm4By8x+27d54+iX81lxRpLAuieMeQYmfALWvb8KpOFnczpkeybF1b71/D/feiqNJv5UN42flI/JeyGEsKrgkktuQC0rlUYTe1icvB4VATTfSiqArkrFqDGY8JZovcxsWCQp7wEU9F7Tca4KHqnfhT2sDm7xb+IK3zpa0snsDxJ+Qe9xdt0E3p/AxC/Ac05Bkl8+TcZozqQ4ciCFE8yToPp2mNIM1XdA5Dk9kHZe/1XiDkDsXdg4B5qP0QNpw79gwgd6rzbLkRGPwchBDg8vRvyFqY9rnQ1j/qoHUvNMaPkOtH4PlOy+hDVN48Wwn/NaV7EmFeeGyvH8tnpSwTYg1wOoGJ7ckXmOMj5OROhWRtbypuGupALoFyVQwWWwCtED3VqF0cT1VRO4tXoiTekk57at4olgB+n+HlNNQNv50HI8mKfCxBVQ/SswuArWzkXRbmoMJvbIZc5WtkP5JXqP1PsT6P4VrJ0C3b/Xr28+CjDA2Fdh/LvgPDqnBKRjnBW0ZlJbtqErCOtsaHgB6h7RM3jX76YPOfejPZPiZ7513NHdzCGOMh6qn85BjrKClkAMKRncIoDu0IF2DzIS/xG90LwqmQCqahqrU3Gmi9qQ/dIDaOFzGr9pc/Pn+umc6KrkoZ52ftT2JZ/3FQjSTbDpQAg9BrUP6fONlukFbVtcVXgj2sMRznLkwXzpG8qg+ja9p2yaBF3X6r8vvwrGvweOQweVububxUGVwcRr0QIvlJck8HwPJn6iLwVqmg8dl+jZwlvRNI0Xwn7ObV1FUzrJr6sncXnF2IInrmQ0jaimikpF/XAbjOxrc4lh3DwrmQDalEkS11Smm0UPtD9WWSahFq4HujWbbOACbz33103DIklc3P4lj/Z0fLXbS/QN2LC3XvBg/DtQ9oMhWfj/31iQmKYObPh2R1JraP1oPiTe453lve+9wJ0QuEdfUjIIsiQxz1HGG7EeMkNRRtE0Xu81V9+lZz43H7dlaLo9k+Jy3zru7G5mnqOMB+unM8dWuBGCrW2uyiSGcPu3h9XJ2nR81JbcLIaSCaBf9PZuxBBu/2yS3HeZuAKaYrZxT+1UzvTU8EiwnUs61tDTdbfe07HsBhM+1BNahsiiSIA9LI7Bb20XegY27EV9lQRjX2f/77bpv3d/D3yX6M8vvXFQD3Goo4ygqvBhYoi2OZNkfXh67CKIv4u26RAW9XzOua2raB7CXufWQqqeiSyGcPvnNRhJalresuyFEgqgq1JxGoxmsQ5qJyoNpqIkGhgliXPLavldzRT2iT9CWdclrHeej9bwMhiHrmJUeybFx8kIR/RmueZETUD7RdB6ql7xaMKH4Djkq+trbtd7cqk1sH62XswgR1NMNsYZLbw21ENzjnl0j3mVcHIDszqO4ERriIeGsNe5tZCyuQcqhnD7U9b7+vTkYxmZAJRSAE3GxPBtFioMJvxF/IDNij/O95M3s9T2I87N/Jgb/C2DX+s4AG/FejAhcaDdk9sBUmv09ZzBh6DmPqj/Cxj6WDblOFRPhnIcCS0nQecNOQ3pSpLEoQ4vb8eCQzb0DvBuLMgPuu1cbXucSoOJ84Mn40ivGrLH31q4d8TEYxAnx/3ZXFKzZ4hHmEazkgigmqaxJh1nmkUkEO1MpdFEV7FS3Xsego4LwPt/fGPcfdxQNYHliQjnta1iWXxohijfjAbZ1+bKrcxj9FV9zlaNwvglekGE/uZsDR6ofxoqbwL/jdByyrbLXbJ0qKOMuKbyXjw08DYPUFpTaexu4ZrODcyyOLh5zKFYJ7wHxipoOgoy7QVvw9cFe4dwxehS/0QPNP9KIoCCvkWXTRIfsJ2pNBiJayrRoT5LDT4J7T+Esgv1JBVJ4iBHGX+qm84Ek5UrfOu4p7uFVAHnbzozKVamYrn1PoOP6wHEtp++ptO6R3b3kySovAbGPAexV2Dj/pDaMKCHHmOysIvZXvBs3NZ0kv9rX8NzYT8LvPXcVDVB3zXFWK2vZSUDzd/WTyCGUFhVsEqyqC62E5t76D2qCKD5UhLvOEmSMCINTabiCFfZW2TCP5S90MSH0P4DPbmm5p5tem1VRhO/rp7EAm89L4T9XNK+Fl8m1c/BcvdWLIgRif36CKC33norc+bMweVyUV1dzQknnMCqVav0Qgj+26DtbL12bMMLfQ/Z7ozreH1pixqBjftC4n8DuvuhjjLej4cJF6h38Wa0hx+1rSakKtxTO4WT3VXbrus0jdWDaGoVtJ6hbyM3RMKqWAOaDZMk45QNogeaRyURQEHfLDot9mzYqYreANqVGaIAqnTrNW0tu0Pt/X1W4pEliZPdVdxdO4VuJc2P2lbzYQGGdN+KBdnb6uxzKPDNN99kwYIFLFmyhMWLF5PJZDjyyMNIt/wYOq+Cip9D7YODK75umQXjl4JxLGw6BOLZb8C9ud7p23kexk1pKnf6m7mhayP72FzcXzdtx5ns1j2g/hm9yL5vYV7b0Z/OTJpyUV0sK2WyQfRA86hk0taMkkRGpG/v1OYe6JDMg2pqb3m4IIx7Y6fbje1isfNA3TRu6trIFb51nFdWy+nu6rxUuOlW0qxIRrm8oqHP6xctWrTN///80J9Y/GgdxvBDUPcAlJ0/6DYAesbxuNeg+WhoOhQaXgL7ATu9W4XRxAyLnfdiIY4aTAbxVprSSW7s3MCmdJKF5Q0c6yzf+WvtPEofRei4UB/Odp+Wl7b0py2Tot44tHuZjlQeg1H0QPOopHqgGdEB3SmLLOOSDUOTieu/DaL/gvrH9UX6WfAYjNxWPYkz3NX8saedn3duyMu61bdjQSRgf1sW85+aiiWwgO8eCU3qr3cYPJPJJKFQaJtLVgxlMPYVfe1r0xF6clIW5trcLEuE8zJPvDQe4sK21aQ0jXvrpnKcqyL7ExXvBeA6VV/Ks6Ni+nnUlklRJwJoVjyyccu6WWHwSiaAGpHIIHqg2agwDEEmbuxd6LpO33fSefSA7mqQJM7z1nFz1QQ+TkS4sG0161PxQTXnrViQPa1OPSmmP5qG1n4hTuUf3PznaYybedkOb3rrrbfi8Xi2XMaOHcBuMbKzt/d5oJ6YE319p3fZz+Ymoal8nBh4Ju9mmqbxVNDH1b71zLY6uLduKlNyKX9Z2wiSRU8MK2DuQUpT6VTSIoBmKahmcIv1snlTMgHUJEmkRRJRVioNxsImEWlp6Pixvu9k5Q05H2Y/u4f766ZhlmQual+TcxZqUMnwcSKy8+xbTQPfQqTgA1x5ZwXnLey/qPpVV11FMBjccmlqahpYw2Sbnp1rPwhaToDE8n5vPsFkpc5o5t1YbvOgSVXlVn8T9/e0cZq7mpuqJua+NMRQAXUPQvRlCP4pt2NkoSOjZzbUD7ZqVInwZdLUGMV8cb6UTAA1SrLIws1SpcGEr5BJRIHfQ3Il1P4BBrm0aIzJQmPtVL5l93BT1yYe6mkb8PZeyxJhVGC/nQ3fdl0Pgd9x1e/KuOjqZTQ09D1fupnFYsHtdm9zGTDZAvV/A/M0fZlMav0ObypJEnNtbpbEQwOud9qZSXNpxxrejPVwbeU4zvfWDX6za+fR4PkhdCzMfoPxAWrL6NvhiR7ozmU0Db+SptogXqt8KZkAKnqg2WswWWjKJAtTdDrdogeisovAuldeDmmVZa6qGMuPy+p4LOjjpq5NA5oHXBYPM9lkpbKfM3Ot5xHw/5Kb/+ji3MveZ+LEifloenYMLn04V3boc6KZzh3edD+bG5+SZm06kfXhVyajXNC+Gr+S4e6aKRyajyL6m1XfAYZy8F2ev2NupS2TwgBUiSzcnepS0qhAteiB5k3JBFAjEikRQLMy3mQloioECpFs4LsMJAdU/TKvh5UkidM81dxYNZ5340Eu61hLIIthaFXTWBYP91/DNfY2mZZzeewFEwcc9wIul4v29nba29uJxwc395o1YzWM/TeoQX0jbrXvPUB3szpwSDLvxIJZHXZRpJtL29dSZzRzX93U/G+2YHBB1c0QeRbi7+X32OgBtNZoHnxvuQRsXj9dI3rreVMyAbTWaKYpk/1ZeSkb1zuftDGdzO+Bo69D+Bmo/q2eaVoAB9rLuKtmCm2ZFAva17Ah1f/ffF06QUDNMMe6gwCaWg8tJ/LOhyrnXZvm4IMPoa6ubsvl6aefLsCz2AHzZBj7MiQ/g/Yf95mcY5Jk9rG5dlrWT9M0/tzTzq/8TRzm9HJHzeTCraV0n6mv8/VdkfeEolaRgZu1jt5pmWrRW8+bkgmg08021qQSX+01KezQGKMFIxIbBjAMmJWuG/XEIfcZ+T3u1+xisXNv7VSskszF7V/2W3RhWTyMVZKZZXVsf6USguZjQfZw8JldpFIamrbt5fvf/37hnkhfrHtB3Z8g9Dj0NPZ5k/1sblal4jvcVSejadzub+bRYAfnl9VyeXlDYcvgSTJU3QbxtyHyz7weui2dpM4oEoiy4VNSuGUDNlG1KW9KJoBOs9hJaCqb8t2rGoUMksQYk5lN+QqgmgLhf0H8LfBeBmQKurQB9GGq39dOYabFwRW+dfwz7O/zdu/HQ+xpdW4fQDRNX4KRaYaGf+pZpcOF+3TwXqIn58Te3u7qvXp708v7WM4SVxWu7VzPK9FurqoYyxmemrwUotghTdMLZVjngO0g6LwS1Px8BjVNE2tAB8CXSYveZ56VzIKgqb1r2VanYkw0W4vcmuFvvMma3RCupkGmCZKffnXJtOol+tRA78+thhPbztAvSPo6QckKhiowjdPrqRp7f5rGgXkWGOv639GkHw7ZwC3VE7m7u4XfdjfjV9J8b6uAEVMVPk3GuMhbv/2dex6A8F/1DFjLLjk9fkFV3w6Jj/QdXCZ+pL9OvSqNJsYZLXyciDBvq4SggJLmat96NqaT3Fo9afB7d2oKpDdA6gtIfqH/zLSD6tf/7psvfK3QxWor+t/fDIbq3r/9eP1iHAemCXoRCWNVvw/vVzJENZWxYglLVjqUFNXiZCOvSiaAOmUDY40WVqXiHFHsxowA400WXop0b3+FlobYO3oFofi7esDcHCBlF5hn9ga/qWDwglyuX+//JXgvBds3QEvqFzUJWhwyHb1B+HOIvgKZNthct9hQow9bbrnsrX/JZhlUDZLEpeVjqDKaeLCnnZCqsMBbjyxJfJyIkEFj368HksQK8F2q7wzjPin3F7GQJBOMeQY27AUtp+vl/7ZaErSn1cmHia+GrlvSSa7wrSOhqfyudjJTB7o3rqZCaqXe442/Dcn/QepL/e8IINnBPB1MDWCaBtYKPfvWUKG/DzACaej6hf4eKr8ctBQo7ZDeCOlN+rEzLWwJuOZpYNv/q4t5+jZ/9zVpPYErp0IPJciXSbNHX1MVQs5KJoCC3gtdneo7e1HY1jiTFb+SIaIqOFW/viA+8i89wKlBMNSCYx44j9OLoFtm7TiwtZwCpsl6r0nK4i2npSHdrH9JJz7SLz0PgnKzfr1pIjgO1y/2eTtNSJIkibM8NbhkA7/rbiGsKlxRMZYPEmHqjWbGbN2DUaPQeqp+AlD92wG8YkVgrIW6J6FpHnTfBRU/3XLVnlYnz0f8+DIpupUMV/nW45IN3FMzhbpsemyaBsmPILq4N2i+A2oPYNRPYmzfAs+P9N65eRcwjulzI4DtSBZo+Q7Y5vS9jEnL6ME0sfSrxw0+DGj6e859GnjOAsterEnFccoGasSw5E7FVIVN6QTHuYbRVMQoUFIBdLrFzjs9QRRNE2nvOzHeaGa28hFq8/UQexHQ9Hms8svAeQxY9szuCzPdCuF/9G5TluXbTTKBeaJ+cZ3w1e8zbRB/X68NG3sFeu4HZL1X6zgK3KfqvZYdON5ViUs2cEvXJqKqQms6ye4W57Y36rhU7xFN+ECvBJQHjY2NNDY2oigF2OLLcTB4F0LX1eA8Qj+RAfaw6s/r+bCfZ8NdTDRZuaV6Yv+lCrUUxN6E8PMQeUEfFZCdelH48svAdgDY9tXXo+bKeax+ohW4B+oe2v56yQjmSfrFfbr+OyUEiSUQeQlCf4HAXWDehTrDMexrPKawc7ijxMeJCArsONtcyImkFWS1/PC0PBFhYcdaHqybxiQx7NM3NQGhp1ADdyMnPyZinIKz4lJwnaKvRRwo/6/1wglT2sGQw0bV/UltgNhivVcc/TeoYT2wu0/Xg6lpXJ93WxoP8fPODaQ0jUu9YzjeXalfEX1FL1RQez+U/Si/bQVCoRAej4dgMJhbVaIdUROwYW99TnHCUv0ncGbL57RnUuxudXJz1YS+sy81RT8hCT2qjzCoQT3AuU4A5/Fg/9bgtmjri/826LoBJjfru88MhJaB6GsQepxk6O9YiIPzRKi8Eayz89vOUeROfzMfJMI8MWbXYjdlVCmZLFzQh3AlYPUgC4+PSloGun8Pa8dB+w+QjbXcZnuAR7yvg3dBbsFT0/ThN+cJ+Q+eAOYJ+k4oY/4KUzp6S95Nhq6fw9rxsPEA6PkzqNv+vb9hc/MDTy0Az0W69O2d1Ii+ttI+Dzx52ppsqMhWqH9Mn4/u+gUA78VCtGdSGCWJWyr7CJ6pddB5HaydAM1H6nV2yxfChI9h8gao+Z0+RJ/v4Al6eT+A4IMDv69kBOcRxGof5kTra6zw/g6Sy2HD7tBymp7MJGzng0RY9D4LoKQCqGNLIpGYB91G7B3YsA/4LtGH2CZ+AWNfImU/nC8Gs5Ql8QGkPgfP9/PW1B2SbXrCz+ZgWveYPvzYfh6saQDfz7apxxpWFdyygaCicFnHWpK+q/VkptoHcs76LSrrXlB5Pfhv5YPAf/l55wZ2MdtIaRr+zRWltAyE/qpv1r1uMgTu1ofjxy+FiZ/q97fuUfjnb6wE13f04dgcrUsliEt2bN7zYdIqqL1PT2pbP1PfYzbdnMcGj2wt6SStmdTgs66F7ZRUAAV9kf0niWixmzE8ZDqg9RzYdIA+7Dd+qb6DhmU6ALta7KxOxXMvwh98BIz14Jifx0ZnweDWE03GLoJJX0LZD/QkpHVToOkYiL7KJ4kwe1qd3Fk7merUh5h67iFecaPegx2pKq4gYpyCtfMnHGhzcVO1Xq93Vdynjy6smwat39UzausegylteuCx7Tv0Jw3Ok3ozedfkdPc16ThGJMabLHovuexH+t+65m498Wn9bAg9ledGj0zvJ8IY0BPLhPwquQB6gN3DunQif0UCRqrwc7Buul4ZpvYBGL9Ez4zcyi5mOylNY306hyFvLa33MNxnD3rHlUExT4bq38CUZqj9k56I1HQYF4VO5jDtXcYbDPxCuZm18kz+L3m0Ppw7Qr0cjXCd/DNmqf/jGvN/8GrdLFT+wH5ts8G3EGxzYcKHMP5N/QRDznPd24FwHqUvfQn/Pae7r0nFmWCyYNo6kU226NMNkz4DxxHQejq0ngFKbtvcjRbL4mFmWxzYRQWivCu5APoNmwuHJPNatKfYTSkOTYXOG6DlRLAfCpNX6/OIfWTUTjPbkIHPkzkMeceXgNoNrmGyjlK2Q9m5MOFD1tU8S0YysH/3mbBuMub0Shy19+FX4acdawmOwCC6OBLgdn8TDZ4j0JwnI3dcDGsmckT6cf5r+g5MXgf1T+RtB5xBk+16EM0xgK5NxXe8/tNQDmOegvon9czd9bP1xKMSlO7dYF0M3xZGyQVQsyTzLbuH16KBwmzXNZwpIT1w+n8BlTfBmL/1W6LOIstMNttyC6DRRWCo1NcMDieSxHvyXK60PIJS/1xv0Qao9/+Ee91NBJQMl42wIPpmtIfb/Jv4tt3MQu1RpOi/9QIVll14tXY5vzJcQtLQ/96lReE6CRLL9HWfA5DWVNalE0zeWSa9+3SYuEJfp9p0uD6MX2I+TcZIaKoIoAVScgEU4FCHl5ZMqrSycVNrYeM3IfYGNLwAlddkNe+1q9nO57kkXUUW6cNohSxSnqNVqTjTLXYM8Tf1DNYxz4JkobbtKB7XrsCeXsVlHWsJjYAg+l4sxC2d67lM/icLew5G9v9Cn/Ot/CUk/8dMOYgCfDkc3+uOY/S59/DzA7rb6lSclKYx25LFelTTWBj7CpRdoNc29v8mx8aOTMviIbyykckmsWyvEIbft9sQ2NPqxCsbS2cYN71Jz7zUMjD+fXB+O+u77mKxsymdJKoOoAhApkOvYuM4MofGFt6XyThzDG0Q+D1UXK2veRz/LtQ/jT39OXfHv8NJseu5ueND4gN53kPsw3iYp9uf5c/pszkmei2S40iYtFpfglJxBZjGMS54E2ZJYuVwzDw3uMHae1I3AJ8kotgkOfsSfpKsF/KouBY6fwadVxd8M4PhYmk8zD42F/JIzCwfAUoygBokiYMdZfwnFhj925tlfNB0mJ7IM+4/WzJss7Wr2Y4GrBrIMG70Ff2n4/ABPdZQCCoZ2pUU82O/1svPeRfqV0gSuL8LEz9HqrqNI9RFXB06kueb7yA1DIPoysgaAs1ncFfq+9SabDD+Pah/RC/IDnrPrvKXyJHnOFz+gs+TwzTz3P4tiP93QAFtRTLKTIt9YNXEJEnfxL36DvDfCh0X6fkAo9iqZIx16QQH2guwBlsASjSAAhzqKKNLybBiuH6x5IMShKYj9Z9jF4NpzIAPMdZkwS7JfDGQHkz0Vb0iUC7FFwpsTSrOZHUV1fF/QuUN+hDu1mQLVFyOYdIqFMfhnBa7gpZ130JJrsr5MRsbG5kxYwZz5szZ+Y13RtPo6GpkQvMefFN9h3TN/cjjl4Ltm9vf1n0GWHbjtOSdfJEYhj1Q0GvqKp2QWp3VzVVN49NklFnZDN/2pXwh1D4EPffpgXQUez7sp9pgYq4tj1WvhG2UbACdYbZTazDzanSUprircX0z6PR6fQ7IPCWnwxgkiV0sdj4dSA80sazvL/RhYHUqzg8yD6CZJutLOXbEWEP52Kf5tOofWJQmtPW7o3XdpA+DD9CCBQtYuXIly5YtG0TLgdQGkpvmU9N1MR+ZjkKetAqT90c7nmeWZKi6lTHpJYxL/4fIMOxJY5sLyHovNAsb0gnCqsJug1nTWPYDqLgeuq7L+wbfw0VYyfBaLMCxrgpR97uASjaASpLEPEcZb8WCpEfjUI7vcj2QNfwLrLsN6lB7Wp38LxHJbrhbjej7Qg637NtewdgH7K+8hlR5XVbF7WdVnMin9Ut42ngmWtcNennA1JeFb+jWNBUCf0BbP5twYiW32R5g5oQnsZv63y8TAMdRxC3f4KzMn1ifGoZrnw1usOwBsbeyuvknyShGJHYd6HZsX1f5c30nodYzYRCjC8PVomgAVYOjneXFbsqoVrIBFPRh3LCqsCwe3vmNR5LIIui5Vy8gYN9v0Ifby+okpqnZDeMmlqPv3LLPoB+3EPaO3kmPYQK4z8z6Poe7xmCuvo2LLX8mkvbB+j0gcP/QJKJkfNB8DHRcxNumb3OJ7TnOrv8e3my38JIkjJVXMVtdTk/k9cK2NVf2AyD+XlY3XZGIMs1swyoP8qtLkqHuUX0evOV4fZpjlFA1jRfCXRxo91AutnorqJIOoJPMNiaZrLwY8Re7Kfmj+KH9XH0JSdlFeTnkdLMdhyTzUTyy8xsnPtT3fLTMyMtj51Mi/ilzMq/S5P5p9lur9TrFXcVMzzxONT1Bu+NU6LgAmo/TX+9Cib4K63dHS3zEn50PcYvxan5eM3vb/UuzYHIeS7M8lTGhuwrU0EGyzIb0uu2K/n+dpml8kowyO1+bQhvc0PAcZNqh4//yc8xh4MNEhOZMihPE3p8FV9IBFOBUdxVL4mHWDMd1cgOladB+ob69Ve1DeatvapAkdrc6+SiRRU898SFYdi/MLh6DlOi+Ez+VmPqb++zHBd569rLX8gN1IS01f4PEe7B+L32P0nzS0uC7CpoOR7PM4g9lL/GEshc3Vo1nuiWHoUtJ5gP7RUxKvQ6J/+W3rflgngGoO00kas+k6FLS7JZrAlGfjz1NH6kJPapvqjAKPB/uYpLJmnuilZC1kg+g8xxeag1m/hL0Fbspgxf+q36pvQ9M9Xk99F5WJ58lYyTUncwXJz/Rd/QYbjJduMJP8pzxVMaZc6vKYpAkrqkczwSThUuiu9DZsFQvlr/xAAg05mdIN+ODTYdB92+gS2iRkQAAIABJREFU6lb+6nmcv8aMXF4xln0HkU0Zd55Cu1SP5r998G3MN0vvHpWpz/u92UeJCDJkV0BhIDzn6lMOHRfr+6OOYB2ZFO/FQxzvqhQbjQ+Bkg+gRkniNE8Vb8R6aE4ni92c3GkZ6LxG347M/d28H34vq4s0+hKCHbdB07N+TcNwR5Oe+9GAdy2nD6qotlWWubl6IiZkrgxkiIx9HbwX6l++bWftdBiyX4kP9W3lUp/DuNd5z3Yh9/W0c4a7miMHmQwy0eLiH4bT9BOszDA7WTR4wVALyZX93mxpIsyuFjsuw8CG33dqc6GF5HLoeSC/xx5i/wz7sUoyhznKit2UklDyARTgKGc5HtnIU6Fh9sUyEKEnIL0GKm8syOEnmCyUG4x82N8wrhoANQSmiQVpQ860FPQ08rHlBMrNtYM+XLnBxK3VE/FlUtzU1YZSfRfUP8X/Z++6w6Mo1+/ZvumFBEILSFMEla4UpQuCIBZEsWABe714xaven733gg0b194bFiwgTaVpQkshZdN7srvZvjtzfn+8mwYJhJCGcp5nn2R3Z+b7dmZ3zve286L6CyB3Uq2+7iHB9q5YsvpuQN/tyNaPwgPlORgfEokrow9/zol6E1br54IaLWB787CP1+owHQ/4mibQAIk/3dU42dxGNY0hJ4slWnYXEChvmzHaGD6q+NZRiRnhMfs3UD+KNsFRAoUIzJ8fGY/VjiqUBXwdPZ1DBwNA+QNA+DzAPLxNhtBoNBhuCsefngMkEvmz5W9nI1DHKiBQhC90F6KPwXzw7ZuBvkYz/i++D7Z6qvGmtRiIXAD02QAE8gHLGMDzV/MORAJl/wcUXQJELAASN6BK2w13llrQQ2/EnXGJrSLD1k1vhEsTg7yQs4CqVzqfq9I46IC9QXd5nXBSxZi2FEWPfwRAAKh6pu3GaEOsdVpRpQZwVkRcR0/lH4OjBBrE3IguMGu1+Nhe1tFTOXTY3gX8mUDcPW06zIiQcOz1uZvuVOILEqixkxGo9Q2o5tHYzD5IbCUCBYAxIZFYEt0d79tLscZZJbWvfbaKFZkz4eBF+vQBRYuAigeA+EeB7m/BrzHi/8os8FLFQ12PaTVLQqfRoLveiM2mi4FAjnTL6UzQ95Bs2CawJSiKPrC5+rctmkNXIOoywLoCUI+scI6fKlbaSjAuJLLVFolHcXAcJdAgQrU6nBMRh1WOyiOrqTJVoOJBIPzsNk/eGWOOBAFsdtsb38CfDWjDAW0nKt72FwDOH2ANvxQqgMRDLAE5GBZExmNKaDQer8iTTG5DDyBxvZQR5c8DbCsbl/JTbEDeLKD6I+lb2WUZoNHg5apCpHrdeKBrX3TTG1t1rj0NRvyFwYBphJBEZ4I+AVBKm1R62uyuxuj2EEWPvk6kBas/bdtxWhnfVFegJODD4ujuHT2VfxSOEmg9nBN0fXxefQRZoe6NYn3GLm3zoeL0BhxnDMWmpgg0UAToe7Va+UyrwLYS0JiQHXIWACChlUlJo9Hg3116I9Fgxt2l2WKda0OBnp9ITK3oMlx/gbuhlF+gXLrjeLaLzGLkhQCkKfYX1RW4IbYHhrRBCUIvvQkFAT8Qdak0mlYqW32MFkOXAIBCXvugLOBHlt+Dk9ujp6XpOGk0b13e9mO1ElyqgndspTg9LAbHGI9an+2JowRaD1E6PeaEd8Hn9vJDa9/VkbB/BOgTg5qibY/xoZHY4q6GrzH5Q7VKMio7C0jA9jYQcR4K1BBoAcS3gTKLWavFA/F94SXxYHkOVFK63yS8WtdCq/SOujKXvDOAQKFYqqETAQCZPjeeqszDjLAYzA1vmwL4ngYTCgNeKBELAKiA/ZM2GadF0Actp0bcuFvcdmgBjDK3U1PomBtEGcnzZ/uMd5j4xF4Gp6rgslZINjuKQ8NRAt0H8yPj4SPxZfURkInHgJQlRJ7fbo2rx4dEwUO18WQixQpoO1H6vDcJ8O8Foi5GccCHrjpjmwlrd9MbcVdcIrZ7HHivpqa4toXWM0DlY0DJjfK66gT6rAfMJwAAHKqC/yuzoLfehFtje7VZ/V5PvQkKgBLEAGHTAfu7bTJOi6AP3vwbyWCuKV+JbO3ylaYQfiag7w1Y32if8Q4DVYofH9nLMC8irtVd/kdxcBwl0H0QrzdgdkQsPrCVolLxd/R0DgzXWnF5RV7QbkP2NZjQQ2/EJlcj2qGqFdB1IgK1fyzx2NDJKA74kaBvW3WkUSERuCSqG962FeOv+guM2FuAuPsB+zvyvPf3knUKkad7rDwXdlXBffF9YTpcjdcDoFvw85cpfiDyYnH/+yxtNt4hQReMmysNm9x7VRVb3dU4pT1bcmn0Uk/tXN1+Y7YQ79pKoQVwUVTnax34T0A7LemOLFwelYA1TitWVBVhWVxiR0+nadg/FNEC04h2G1Kj0WB8SBR+cVXhVrJhUodiBYyD220uBwQp1nnEOYDGgOKAD31aOYEITieQlwcUFsrDZsOi6mr0KCtARsCP46LiEWI0ASYfULkccIQAcANPLgFizwE8HqRVWzHA58Ti6Hj0CI8CYmOBLl2A+HjgmGOAhASglUg1Lui+Llf8QMRZQLEJcHwhPTI7GprgtWHDjjFbPNXwUMXE0HZemIWdLg0ZfFmAsV/7jt1MFPm9+Lq6AouiuyGqvazzo2iAo2e9EUTq9LgyujueqczHnIguOL6FCR1eVYVdDcCuKqhWFdiUAKpr/lflf7eqQgWhElDA2v9VEAqks4IKeQ4AZo229nFL9Sqkm8/BX9ZimLV1r4dotYjQ6hGj0yNWp0eUVt+qrsvxoZH4pLoMqT5Xw3PTmSxQ71+SXBX5MgDRUW1xDSEpRPnHH8DmzcDOnUBqqrxWH0YjtKGhmK7Xw+31QO/zg4EANMo+8fTHNgPYDBoMSDTo0ddggFlvAPx+wL5PgpbJBPTvDwwbJo9Ro4CTTwZCD10TN1SrQ5hGi7KAH9DGAKHTgOovOwmB6gAY9iPQX51W9DOY0bsVFz8k4aKKalWBI/h7rFYDqFaU2t+nLzAQ10KHH0o+xFbzQigAFBIKKH+Dv9ea5zqNBiEaLUzBR4hW/tb8Jk21v08NwrQ6xOkMiNMZEK1r+W/zLVsJInU6nHu07rPDcJRAm8Ds8FisclTgucoCvJQwcL8vuUqiXPEj3+9FQcCHgoAXBX4vCgO+WtL0NaKNqgEQodUhQqtDpFaPEK0WWgA6aKDVaKCDBgaNBloNoIUGWiD4OkAAHqrwUIXfn4dwtRQbeTx+c1bBHXy9sTG1AKKChCqkapD/tXp00xvRI/horkTaUFMYIrU6bHLZGxIovYCmk2QBVn8VJInJUEhY1UCtBdYs2GzATz8Bq1cDP/4I5ObK6336AMOHAxdfDBx3HNCrl7z311/Ar78CO3ZAC8AUG4OdJx2H4/tnwnSMCgx7UkpcZs8GXpgPZH+C7OxB0Kcp6L03E/DbgYgIYMYM4LTTZIxAAMjOBtLSgORk4OuvAYcDMBiERKdOBebOlW2beROO0xvEhQsAEfOA4qslK1jfCW7C2pAGBOqjit/ddlwQ2Xz3pBL8XZYG/ChTfCgN+FFa+9eP8oAfNjWAphSdwzSy+IzQ6ZGtG4aevnVYY1wAHTTQaTQwQAOzVlv7XAepsQ2Q8FCFlyoqFT88AcIb/E16VLX2/33H1QLoEiTTOL38jd/neTe9AcZ9chwyfW787KzCzbE9j6oOdSCOEmgT0Gk0uCmmJ24sycArVYXobTDXkmRBwIfCgLeWrLSQ8ogeeiOGmsIQo9PXEmSkTsgySiuvhWl1rWMNVu8E7MBNPc7GTYZetS8rlB+uXVVQqfhRpQRQqQRQpQRQpfpRqQRQHPAhxetEhRKAu142bYRWFyRTiXP2MMj/iQYTYrT62uQWnUaDcSGRWO+yYnF0Ql3SS3v0x2wunN9JLaZGD2vADwKIPdgCweUCvvoK+Ogj4PvvAZ9PSPKcc4BJk4BTTgG6dRNi+/FH4MMPgW++AaxWoEcPYPp04LbbgHHjoO/bA90sU+H1KyjquQZ9I0bWWZeXvo7fq+Ix1v0SKuJfgybsEmDbNmDDBmDtWuC++2Ts448HLrwQWLoU6NcPUFVgzx5g3Toh62eflW179wbOOw9YtAg46aQDfsR4XT0CDZ8D4CoRfIi+7PDOd2tAY5ZOQkFscVfDTRWTwqIabKaSKFX8yPV7kOv3Bh8eFAZ8qFD8DUgqTKNFvN6IrjoDjjWGYEJIFKJ1OoRrdUKUwcVso7/N8rlA5dM4qWufQ25/1xhIwg/CoSooD/hRrtQ9yoLP//J7Ua744ahXBaADkGgwo7/RjH6GEPQ3mvGRvQw99EbMbqOM7aNoHo4SaD0ESGT63NjldWKP14XdQeH0T6vLa0myp96E4eYwzNbHopfBhJ56ExL0BhjaKQu2Fp6tgK6bNASuB51Gg1CNDqFaXbNqHu1KAIXBBUFhwIdCv/y/y+tEueJHDSVGaXXoZwxBf4MZ/YwhGGgMwQ/OKqT73PVabBFiY3cwAiWAZxsQIz0eK1UhjCabC+/eDbz6KvC//4nlefLJwKOPCnH26VO3XU4OcOedwMqVEvMcPBi48Ubg3HOBE0+sswKpAIUL0D3wFx4PexO77WF4Lazutv6by4bHuAQrw6qRWHYdYD4GmDANmDAB+M9/xMr8+Wfgs89kHv/9L3DqqcB118mchg4Frr9eXL7r1wNffgm8+y7wzDPi5r36auDSSxt188brjMj2B0lK3w0IOQVwfNN5CJR1YvzrnFb00puQ6/dirdOKXL8XeQEv8vxeeIILP6NGg956ExINZpxgCkNXvRFd9QZ01cnfsMOxzkLGA+o9IhBiHHi4nw4ajQZGaBCr0yJWZ8CgA2zrVhVUKAGUKX7k+T3I9HmQ6Xdjk8teu+gN1WhxR2lWLan2N4Yg0WDaz1o9iraDhuxMZkP7wqYEsMfrwi6vE7u9TqT6XPCSMECDQaYQDDWFIdFgwgsVBTg9PAa3dund0VOuQ94MAEag9zdtNoSPKooDPuT4vcjyuZHp9yDb50ZBwFdLrBFaHUaYwzHYGIpzSk4AYm6AIf6/bTanZsG2Eii6DBhQAui7YrPbjjtKs/FRz8HoWrOoIMXie+QR4IcfgK5dgSuvBBYvFmuvPrZsAZ56CvjkEyA8XEhs/nxgyBAgJAQwm+V1XfBmXXobUPkM0PNz5Jpn4KqidMwIi8WVhkhERUVh9u4/MCyuKx6I6wVNwVzA/RvQZxNgGir7+3xirXo8QqY11u7vv0tS0Y03CoFG1bPM/H75HG++Ka7e6GjgqquAW2+VzxbEiqoirHVZ8X7PYLJX2b1A1fPAwLJgHLJjQBJqRm/kh12Mn0NuRqrXhW3eukzmSK0OfYOx0D4GMxINJiTqTeimN7adOpE/F8jsA/T6Dgg/o23GOETYlQAuK0xDnN6AseYIZPu9yPS7URjU8NZDg+NNoRhljsDokAgMNIa0WenWUfzDLFC3quB3tx1b3dXY7XUhLyB6l7E6PYaYwnBFdAKGmMIw0BjSYBXnUFW8WlWIORFxGNCWWpzNBQm4twGxN7XpMEaNFokGMxINZpwaWnezdqsKLH4vVlQVIcXnRJUSwNu2EkxXA/jKVoI/AukYbAzF8aZQHG8KQ0+9sX17Ezp+kP6OeiGOqqA0Y3SNC3fjRrH0Nm4ETjhBrLf58yXbNSMD+PhjYNcucav+8QdQVSXWJQlUV4sFunJlwzE1GiAmBuhiBOKLgYHjgMGpSByqx9iyAnw9aQzeXCbXS+fz4XZLKTQ/bgL2DAWSfweKRgIV8UBJOeA9gA5rcTFw111ilfbtC0yeLNbvcccBY8cCc+ZI3PTFF4Hly4HnnxfCve02IC4OUTpdQy3jsGlAxX0ifh8yqrWuwEHho4o0rxs7vQ7s9DqR4nXhbcWFH10u/KBW1gpe3BTTAxNCoxCnM7R/f0t9L8kO9u0F0DkIdIW1CB6qeCC+odSjU1WQ7fNgr8+NPz3V+NBeijdtxYjU6jAySKajzBGIb+NSrn8a/vYE6gqS5jqnDZs9dvhI9DeYMTIkHJcYu2GoKRQJB7nBnxMRh+8cFXihsgDPduvf8Y1q6QTUSsBw+G6lliBEq8NgUygWxyTg+uIMLIrqhpPM4WCGHmNDIlBiMONPjwNfOSoAiPt3mDkcw4OP3joDNBpVdHw1xtaV/iMB93qpcwyiUvEjQquDMX0vsGyZxDmHDwc+/1wSd9avB2bOlAxbl0t2MpmEyCIjgXnzgPHjpbQkMlLeMwRvRF4v4HaL67dgC5D1BlB+DJDsAj5/CKiuxj0AloWHIS8qEoMArBw1GZE1mbm9egEDhgB9/gTGaoBBDwPRXWQcs1lIXaMRq9ThEALPyBCrdOdO4O235Tg1x+vbV1zQkydLPPWzz4REX34ZuOceRF22EC6q8FOVsEPIyaJf7Pq5bQiUKgAFTsWH3T4/dnrd2BH09vhIhGi0GGIKxbyIOIS7FCyM6oUl8UPwQFkOPFRxdmR868+pudBopUzMt7fj5lAPSR4HVjkqcVNsz/1EE8K0Ogw1h2GoOQxnR8YhQGKP14ltnmpsdVfjiQorCKCvwYzR5giMCgnHSabwNq07/ifgb+nCdakKfnPbsc5pxWZ3NfwgjjOGYlJoFCaGRbdID3W7uxq3lWbhrrhETAvrYLk6XzaQ1Q/o/ZNYEB0Eqn7cVLABYw1WLAz1AsU3AIY+gLE/oFihKFXwK1WgYoWeDmihQIdGJBI1IfLQhgCaUEDXBdDHA7rgQ99NjmvoK63SDiQX6MsAsgYCvVYB4bMBAK8XZSH2sSdxzstvSBLQGWcAJSXAL78IKcXFSfxx9GiJh376qbg9H34YWLiwzjV7IPjzAcsIccP2Xg1k5gBffCHW7PbtAIkyoxFdfT7YAERGRwOnnw4sWCDzQRKQMxGIXgwkvNS8C1BQANx7r7ht+/YFLrpIFgC//SZuZ0URd/TMmUBREfDVV3AP6I+77v037pp/GbrUWCN5Z0r2a+LPTY/FAODPEbdmoKDeo0jqf1WrCOSrVkCtBhmABvsLw3thgqIxA5pQ6LWhMOhjodF1k2tsexsInwd3xPn4VxUwJWo05sd0cGef/LOka07v7zt0Gl5VxZVFaYjR6fFctwGH7La2KQFsD5LpNk81ypUADNBgdEgEZofH4uSQyKOu3hbgb0OgTlXBby471rms2BIkzcHGUEwKi8JpoS0jzX1xb5kFyR4n3ugxqOmElPaAezOQcwrQNxkwn9j245FAIBfw7pSHZ4f89aUBDW6SOpHyMw8XktNGS12oNhrQRsAHLQoCCiyBACx+P4oDAejhQ3dtAAMMQF+diq5aP7RqJRAok+4cSpnoo9ZLLoE2KiggMRQwDQn+HSrya7a3gOLFwMAqQBcF/P47qi5aiMjcPOgGDhT3ptcLjBsnJSWzZ4sLdN06iX/m54uVevvtQFgz63/pE/IrywV+uxF4/wshsJAQycydMwdPDzsW34fo8fPQcdj25WcYuXkbsGqVWJHh4cBZZwHndwMGPA30eB2IvrL512fnTuDaa4FNmyR56NlnhfTXrQO+/VaIvLQU6N4dPr0exrw82BdficinnhZLt+Ix6egz0ApABbx7xKXr2wX40oOPzIbXWhstCWz6HsFrHQWXJgJ5qhlZAT2yA4SLgEGjRy9jGI4xhKCPXoNYjR8aegDVBdAlgvaBErnG3m0Qp1i9cfQ9xNNiHAiYTgBCRgOmYbLYag+U3iYlUf071gp9raoQn9rL8XqPQYfdko8kLH4vtnqq8UswETBOZ8AZ4bGYFR7b6g0X/s444gk0w+fGB7ZSbHDZ4AdxvDEUE8OiMTE0qtW1IasUP64oTMfxplA8GN+341y51d8ABXOBAYV1ItytCQYAT5K4Ql3rAdcGcRkDQl6mE4KPISjR9MQdVQqWxI/BuIqLxFLs8U7zPoYSwF9eB/5wVWOzx45KJYAwjRajQyIwNiQSJ4dEisIKCSjlkg3pt8hfXzrg3Q34dgNqMNlE11VcwgwAca8DD/0EPP08AgYD9D6fEOUll4jV1zuYEObxCFm+8IJkur7+OjDoQPmRjWD1AuDVT4DvjUBAAWbNkjrR2bOB0FCsd1lxT1kObjVE4ayex2B+yha8M2ikuM/S0yU56X//k//7RAAL3MC/1gHdxjV/DqoKvPWWlLyEh4tVevrp8p6iiFX6zjtQP/gAWocD1OmgiYsDPnoBGJwEVD4MGI4DAlmyIAAAQz/AeKzIDhqPFRIz9BHi1IbW3og3uW3Y6LIhzeeGFsCxxlCMDonAaHMEBptCm2fZqG4gPRRIWIllruPQm/m4IdwZJO+9sljz7QnOTR8k0zGAeQwQOgUw9j20a9ZclD8EVD0HDCxtm+M3A+leF64t3ovLoxNwcVS3Vj9+mteFbx2V+CVYTz7GHIHZEV0wNiQS+qNW6QFxxBLoTo8D79lLsdldjQSdEWdHdsHE0Og2F1T+zWXDXWUWLI3thTMjOqgGy/omUHwlcKwP0LSSJezLBhxfiv6ne5OQksYsXV5CTpWblekEsfL2+VFdVZSOeJ0BD3lvlEzOXl8d8vAqib0+N/5w2/G72157Mx5hDsfE0GhMCI2qSwKqjxrr2LNDSnsqnwbSfMBVfqAEgA4oPnMA/rziAsyafQegq2dV7tkDXHCBENcTT0hma3NjQqQILTy0FFi/C+gdC1x/O3D55Q2yXh2qgssKU3GsMRS3m2IRHR2NyTs3YWHPY7A4pnvD423aBLzyEvDxh4ARwJLrgNvvArofwiIpLw+44gopg1m6VLKMDXXfkaryXfjj9bswfcUa6LOCC495AB4EEDZWWquZhwOmEwHd/vqzKok9Xhc2BkmzIOBDiEaLk0MiMD40CmPMES0TfffnAZmJKEv4Cufb+uC/cYmYsm+ohL666+zZAri3CqmCQvJhM+QROgnQtlI7uIqnJMlqUBMt/NoYColri/dCIfFq90FtSmhuVcEapxWrHJVI9bkQq9PjjLBYzA6PRffWlsH8m+CIIlCS2OKpxvu2UuzwOtHXYMbCyK6YEhbdrv77Jyvy8IvTite7D0LPjvhiVTwOVDwCDKpq+TFIwJssUm6OL+V/jUluPqGTgJDTJKlEc/AFyVfV5Xi+sgDf6h6BWS0BEte2fF5BVAT82Oi2YZ3LhuSgMPuwIJlODI1qXPuzugS4PAH4HAA0wLmjgTt7wBa6CVEskwVB6GSJja7WAItvl9jhBx9INu5BsH79ejzxxBMw/vYbllZWYhwADNUBN44ErtgE6Pef0/OV+fjBUYWVPY6FyeVBVFQUXs5Jx6d0YUX3Yxvv35i9Hnh8GvA+AJ8OuOYaqT+Nb2ZCjaqKG3fZMuDkMcDb/wIiNgHO7wFfKhRo4TCchKgtA4BlvwJ5ZUCUDnj2NOCyNfsdjiQy/R784qzCWqcVJYofMVo9xoVGYkJoFEaYww+/9tDzJ2AZiS9jv8frnp74vPeQ5h1TsQKuNbLwc6wGAjnynQ2ZKIuBiHPEld9SVL0IlC4Fjj1AZnQb4gNbKV63FuGlhIH16q3bHhk+N751VOAnRxWcVDHKHI4LI7tiRHv0ZD2SwCMAAVXlL45KLi5I5SRLEq8tTOdGp5WKqnbIfFxKgAvz9/C6wnQGOmIO5Y+SabEt29eXR5bdR2YcQ6aATIskCxaSto/JgL1Fh6xWApyZs4MpOVeQmUNaNq8DoDLg41f2ci4tzuAUSxKnWpJ4V0kW1zmr6FUVUlXJ994jo8NJgOzZjdy9u3b/y/NT+L+StWTFU2T2ZPJqjWw3N4bMvZ/0ZjZrHutee42p/fuTALcArHqhD5negwyUN7p9utfJKZYkfmQrJUnabDYCYJm1ipfkp/DGor1Um/r+VL1Jbgb5n/PJyEh5PPII6XYffKKqn6z+nvxyFtlNS3YF+WUcWbiYAdvHnJO9jt9W15vz/feT2uA5mTmTzMoiSRb4PFxZVcxFBSmcZEni3NydfLo8j0nu6tb/3jtWkyngtTk/8anyvJYdQ1VJTypZ8RyZM5lM0ZCpJjL/PNL+Bal4Dv2YVa/J76QDfue5Pg+nW5L5cmVBu49dA7ei8PvqCl5dmMZJliTeWZLFXF8LzuPfFJ3aAvVRxU+OKnxoL0V+wIdR5nAsjOqGYaawDi8l2e114qbiDCyKSsCl0a0flzggKp8Fyu4Gjm2kJ2djYABwfA9YXxOJO40ZiFwgbdBCJzXLyjwYHivPRaL9WVwQeAuaw7GMDwKrEsBapxWrnZVI87kxMLcQd/3fI+jz6wbZ4HQt8I0DqFeve3FBCk4NjcLVoV2Ayy4Tqb77FgKXe+R80A2YRgGec4CC44GccnGFFhQA5eVAZaXo0ZaUiJXZoweynbk4ZhCALuOBqL6S3duvn3RQ6dcPap8+uMmWD6eqYkXQ9Wa32xEVFQWbzYYMgwZLS7NwZ5dETHd4gb17JYGp/qNsA+CpApQhQF4hUFYGGI0iLt+rl2QPd+0qMoLHHAP0dAMJvwHK55J8ZRwEOE8HLl8DpFiA998HzjoLM3N3YEl0d5xbv0Rk/Z3AWY+A1TqoOh2++/dNePbyC2AyGDEhNApTw6Ix0hzRdi5E23tA0cU4w/w7nup+QosbODSAP186Ftnfl+YC2mgg6lJRqDL2b+a83gGKLgUGuQFt++k8+6jihuIMuFQFr3c/FuYOLjchibUuK16rKkK54se8iDhcGtWt/Xq0dlJ02k+/w+PAYxV5KAr4MCE0CnfH9WlXF8bBMMQUhouiumKlrRhjQiJwXHvOTWOsS/Q4EBSbuKCsL0vJgWkE0G05ELmw0fjW4eDMiC74ytYFGtUqGZbatjkf0To9zo6Mw9kRXVDx4guIWrYM3qDrNPeG4xBxswkGvRHh9fbxkwhxuIBzL5Zkmk8+EcH29euBP3oDm38EkpMA+zbZQQOgWxeg1zESP9y1S1pS6hD0AAAgAElEQVSXnXIKMGYMoNjRK/dtOFwJCFejhGy3bAEsFlEEgugj396vD8LHjoN+/KlSm1kjC7hqFUakpuKVPzaha/IOoLRe8/bISCHHnj2B7uMB7w9ASBUw5lwpuVmzBkhJkXIVtxtI2g7k5QAOb93c+0YDJ00Fxs+U8pyfH5AM43POAd58E+YpIxtoIANAzknT0OfLR1ByZQKiC8ox++GncNoPa2B+eyVMie3Q0k8phQ9mJBhjMNjYSt8dQy+gy23y8KZIP1brCqDqBSD8LOlCE3LqgeuQa3IM6APQfgT6SlURLD4PXkwY0OHkCYgM4ZSwGIwPicKn1WV4z1aKH51VWBTVDWdFxP1zk4062ALeDx5F4UuVBZxsSeKNRXuZ7W2Gy6qD4FdVXlWYxkvyU+hWlPYbuGrFgd1KgUqy9B4yLUpcWIVLSPe2Np2Sqqp8LOdtmZc3vU3HYmkpeeaZ4nI86SQSoOWxh5mbPow/pM/hzJwdfKwsl6keJ0ly4a7fWTpqBBkWRl54IXnCCbIvQPbpQ557LvnQQ+Rnb5Ob7yBTBpPJIK+JFdfmqBHknj01H5TMncncNeA3X73XcF6BAJmbS8+aNVz+xAP84/JLGBg2jKpORwK0ajQEQBtAxsXRM3MG37thCX9c+bq4nG22/T+r/TM5p7YP68Z/800yIoxMjCDfN5J7dOSO2eTaZ8k3XidvuYU87TQyJEQ+Y1gYOXs2OX48CfD1B+7k21VF9KoKV1dX8JrCdJ6RvYlMATfteoje0aPJiAg5NyEh5BtvtLkL01l4A3NS+/JLe1mbjkPFJW7ZzMFyXrNGkLb3SbWJ32/Vq2SKllQDbTuvevjVUcVJliR+3tbn4jBQEfDxifJcTrYk8ZL8FP7mtDUdjvgbo1MRaIrHyUUFKZxuSeZHtpKOiS8eInJ8bs7ISeazFS2M27QE1pVBAvU2fD1QTpbeRaZFkKlmsvgW0td+8ZPvK34nU0Cb/ae2G2TbNrJ3bzI+nlywQAjihRfkBp8WQUfpQ1xZVczz83ZzUvZffP6DN1nZJYaqJhjj69aNvPxy8p13yPz8xsdITSWH9CMNWvIWLbk7kiy5nfTlk9b/kSngrIngF1980eju71QV8bqv3+fG8eNYGiRqG8ANorYvBKrRkGPH8o8H7+F529eyyO9t9FgkyfxzyfR40l9GOjeQeWeRP4EcYRCCv+tW0ufbfz+fj9yyhXz0UXLyZFKvr104bJ89g5f++SsnWZJ4W3EGNzqtVPcmkiV3kFYrOWoUGRcniwuAvOQS0ulswQVrHixZp3NL2gQ6lXYiKlWVOHHu6UEiPYl0/Lj/duUPk+ld2mdOlLjz7JwdvKc0+4ggpL1eF28tzuAkSxKXFmcw0+vq6Cm1KzoFgfpUhW9UFXGKJYlXFaZ1aquzMXxuL+MkSxJ/czZiQbQFbB/Jjz5QJc9VP1nxdJA4Q8mS20h/UfvMpf60fDaxYgqfbZsB/vc/0mQix4yRxBeAfOwxec+XJ+fE/hVZWUnl6afpCib8KBoNfz53Ln/8+TtW+xshmvr47jsyKoo89lgyOVmOW3K7JFulGMgUE5k3j0AjBLpjB/2jRtIyUMZVu3en58Yb6fjpJ9oqKpiXlycEmplJvvUWOW8eVaORPoOeu8+aTf70E9mYJ8NXINc1vat8xszjxAvhrSbvu4/U6cgJE8QyPwAyyor55UvPMD+xp5wXrZbOefPIH38UQsmZKgk3JFlRQZ54ItmjB/ncc2RoqJBqYWHzrtUhwKcqtKQOZJJlUasfu1lwbiIt4+Xc5kwn3X/VvVeylMwc1C7T8KoKry5M48L8Paxur4VEK0BVVW50Wnlx/h5OsyTzu+qKjp5Su6HDCTTT6+LiglROtSTx7aoi+o+AVde+UFWV/ynJ4pm5O5nfHhlqzo3yY/fsEosk6wTJOCy6lvQf+Cba1rCl9eTnGVfS15RLrCVQVfLBB4UwL7+c/PhjseCWLq1zLTrXkT+DvPYicTsaDGTPnqTRyFs+foPXFKZxmiWZs3N2cEVlISsDvv3HePRROe6ZZ4oVVh8Bm7j7gpmdT98Bfvf1W/JedjZ5ww211t3WiePpWLWK9PsbnptgFq6tvqu2rIy7Hn6A2QP6yf4DBpArVpDeoEXq+JHMHinXOwVkxfP7uxs3bhSLvF+/Oldz7cdSud1l521BK2FB3m7Oy9nBPQvOI7Vasm9fGXfIEPKpiWTqCXU7FxWRiYniJl+/Xsi0Z08yKanZl645+KW6gq4UMytKHmnV4x4SVFUydTOPlWtccAnpLyYLFpGWce0yhRcq8jndklwbejjS4FMVPlGey0mWJC6vKDgiPIiHiw4j0ICq8j1rMadZknlZQSrTjtAvTQ2qlQAvzt/DywtS6Wrr1WONtZUzRf5mj2nzGGdz4bRM4/q0yfzJUdk6B1QU8rrr5CZ///3kjh1keLi4FmusNYuFvOhUUg+ySxfy3nvJJUuEIL79ltMtyfzcVsZSv4/LKwo4M2cHZ+Qk87mKPJb6vUJWF14oY9x1V+NWoHsbmQLm7biNhTuuoXUL6PvKQNesfhLj7NKF9qVLefG6b/i+taTRj9IogVJ+C4vy9/D5rz8i588XEu+dQD5wLJkE0jKWdPwslqdlYuPxyOxsIcGoKPLHH6mqKje7bLy+KJ2TLElcUpjGnx2V9KsqFxWkcHmJhZwzR+Kjr75Kzp0r4/bQyPMal/CuXVJCc+aZZG4uOXw4GR1N/vZby6/pPriz4Peg9+CzVjtmi6H6ycpXxGWe3kUWTblz2nzY9U6rxD1tnTfu2RyoqspPbaWcYkni7cWZR5Ql3RJ0CIH6VZV3l2RxsiWJr1QWSC3f3wDZXjfPaI/4RY0LNzVUkhw60/krvoklaf14dWHa4Z8DRSGvvFJu7CtWkFVVYmWdeCJZXU1WVpK33koajWR8GPmfcNLhIF97TcjwxRdJspZAa2AN+Pl2VRHn5u7k7NTNzJo+harRKJZtY1BV0jKRjh19qNOBcQBXGEBFAyoJoPvfejL/Bd5bksHz83bT00RCWVMESpIbgjfQPdW7yTUzyDNBakH26CKu65qYXQpI2yeNz9NmozpzJlWdjm8/+2htzfQfroYJHpfkp0htocMhbtnERHH//v4UOTOYXDVwIPnllzLud9/JNXjwQbHMJ0wQ4l2zppkXsmns9bp4a2aw1tKz5+A7tBf8pWT++TKvvX1If+OLotZAoc/DM3N38r9HSNyzOdjqsvPM3J28ND+FeX/jutF2J9CAqvKe0mxOsyS3X8ywHbHOKRl0TVkhhwXFTRZdFyTPMPm/s6HyJSopek7N3sqdbkfLj1OfPGsIZP58sbAyMiQTNT5eskXvv5/ce7FY4lu2CKFee23toaZbkvmZbX/XtsNmZeFpE+gxm3nHu6/wpcoCWgN+ESvYupV8913y4YfJK2eSp4EceoxYuDUJSTqdjBVpIONBb28DHSf0F2vt2mtl3/feI3fuJH2+OgK1WMgNG8iXXyZvu428+GKqU6ew6tg4qnEgozVkRIjEe2vGMhrJ/v3JUTHk9BDy1pvI5cvJH34gV68mvV6mepxcmp/Kby44m4pGw8xXX270hrwwfw9frSnOz80lu3YlJ00i7evlu7XlE3L6dBl36lQyLY285x6Zy08/STLR6adLXHTTppZfY5IPlln4duYyqqlmsf46E1RVkvFSQ8n0OBEbaWX4VIXXFKbxwiMs7tkc5Po8vCQ/hXNyd3Kbq2UiLZ0d7VoHqpB4pDwXG1023BvfF2NDW7cWsTPgtNBoXBTpxuvWIgwwhmB0a0lf+dKBggWALwXo9jJg/0S6lXQ2mI6HFgGM1hbi0+o4DDW3sCB+2TIRRF+5UgTgV6yQ+s3nnxcxhI0bpX3XE0+IVmzeGYA1ThpjDxsmUnZB6DSa/Zuo2WwImzULYTt2wP36CswpLkD1NTegfFcKItIzoA0EO4LExgIJTiAiGii0SXPt0aOlBVmNtJ7Lhe2l2zHA9hOi7JlAhQ/YlC3iB1VBUQm9HggN1jf27RucmE7+7xYGTZQFUaPs2N3lRMTHzUG30BipQdXppNvK558DmZnAoGMAQzbw5XtAng0I1HUusZ96Ck4dORz9zl0AjTEC/a65DjCa5XzVg0pAh2DdXu/ecl6nTAEe/RS4BMDgMGD1auC774CbbxYR/jvvlB6jixbJfL74Qs7BrFnAr7/KOT9EFAd8WOO04g1dDjTaIYCmk5WlB3KlzVv39wDH50Dh+YD7ZqDrk60yV5J4vrIAGT4PXkgYgHBtM9rmHUHobTBhecIA3F+eg9tLs3BjbE/Mi4jr6Gm1LtqLqRVV5SNlOZxiSeKvjqr2GrZDEFBVLivO5JzcnSxoDfeF7QMyLVyyAd3BBI7CJZJ639kQsJEpGm4rep5TLEkHLs9oCs88I9bPc8/J86wssXbGjZMEoX799ncfZg4n5/aT+JzF0uCtubk7+Z61uO6FigqJFxqNkhQDkHo9/cOHcefFF/DZB+7kf77+gL8W51Itfp68NmhtnnQS+ddf3BcWn5uTLUlcZSshK18it0aST0aRc8ZJvBYgDQbaunWrK2MByMHHkouHku+BzBxDxbWdlxek8rbijP3Pic8n5yU0lOwbSX4UTaurnO9sXs/3r7uS3196AYvPmEE1Pl6OrdGQCQny99FHGxxqft5uvlm1T5b2Aw/ItishGb41cDrJZcvk8w8dKvHQBQvkPZtNXMAJCWLJHiJerMjnnNydVLJGkIVXHPL+bY7qVWKR+3LEGq18kUzRSaZu4PBj/B/bSjnJkvS3z1oNqCpfrMjnJEtSh8oStgXahUAVVeUT5bmcYkniz62VXNLJYQ/4uTB/D6843KSi8sfkR1xwEalU171e+Yr8mJVOmHyVeRz9hddxbu5OPnOouqarVsmN/N//lueqSk6cWCcKcP31ErvbF0/FyPsffrjfW+fl7eLbFQXk2rXkokV19ZA9ekiC0tdfS0w1iDyfh/8tyeYlaz+nf7CBql4jiUnexhcDD5fl8ILMv+j/4H3RkjUY5PgngrxjFLn+J9LrrXPhZmSQK+8n50eSXYMu2t69ydtu49bf1nOSJYm7PU24v9PTqY4ZRlUL/nn9yZyTsZ3vWIvrvmOqSmZmShz4zDOF+ACyVy9xdefn86zcnXyn/oKCFBGIiRMliSj7/v3H3bqVHDSo7rN9Fkz4KS6WGOqwYQ3O4cFgD/g5M2cH36jIEbGPijYqfToclD8qpWH13eCOn8m0GFnMelJbfOhNTisnW5LqXOn/AHwSXDD8WP334YA2J1BVVfl0eR4nW5L4w998pbUvsrwuzszZwftKLYeeHKCqUs+ZArL0v/tnXrqT5D3n+tabcGuh4BIyewz/V1XM6ZZkVuxbMtIU0tMlxjl3bl0m7L33yg07IoL85pvG9ysuJqNAnjty//cKC/nprdfRnthbjhMV1VB8oSl8/TUDkSFkH/DeVU/wpcqCRov8S1L38P1rLqc7Lk6OO348+fzzYpFVvSqx6oy+pHNTHYFm3SGLn+yTSXealIhcd53EdAGmjxrO915+plHC3uNx8urc3Uy9eTBVHeg/dRxZcoB4u90uVqLBQJrNpFbL36dN5MaP3t2vzEYsfQ152fDGj+VwkIsX16kblQUTs5KTxdI+77xmKxa9a5XvhtURzMB1Hl4stU1QcIlkQO8L715RMkqLIh2HLhqyN3hf+G9pdoc1xOgIqKrKh8pyODNnxxFX698U2pRAVVXlC0HTfZW98Y4Vf3esDcpyvbvviv9AUP1k4WXBur/nmt4mNYwsf7x1JtqaqHiOTDXS7ndyVs4OvtKcVbbTKW7VQYPqajDffltu1rGxZE5O0/teuICMBpn5Yt1rGRnk1VeTJhPdYaHcdfEFInFXQ55NIRAg775btpseTmX3GXzXWswZOck8N28Xf6koopqURD79NDliBFWAPoOeSt++5NixkqE6ahR5yinklCnkrMnk1BhyKmibPkgIdCLIaQPJaVPF6hs7lhw9WvYdPpyeeCFjJTxcEqdWraIjM4PPBqXTFhekMr16N/mejowPFwuwEddyLex2yVxOTKTy2GNMG3KcfL7ERElk8tQLM9yXKO9t3Nj08Z54QrZJSJBaUZL89NMGmc8HgkdReHbuLj5ZniuWZ6qpZZ1S2hqZx5NFVzX+XsBK5s6UuTemYNQEyv0+zs/bzasK09pX/rOTwKUEeFlBKi/NT2n7cr92QJsS6PfVFZxkSeJXnVjTsT3wRlURJ1mSuLo5FrjiIfPmkil60vregbe1TCTzzmmVObYqXH8I+bt+52uVhTwjZwdtgYNkWF5/vVhIu3aJFfPww3WZrukH0Nb95RfZ7hFIIfyuXVLTqdWKRffww7wjdTvfXP2lWGE339z0sTwesaK0WvKeheQOkL+/Qz7zDN3nncuSQQMY0GprBRNUjYbWmGiWjB4pNZXnny/7T51KHn+8EH+NCzUY+2wQAw0NlRjsiBGy/8KF5NlnU5k2lTmD+tNnNtdp9gKsjghn6YRxVG66SbJ7ky4k13clR44QF/ennzb92XJzyYQEKqeczKl7t3LzhjUynkYj7t3ly+XzZ08hT4qVeO++Fmp9XHNNsHVcTzIlRV678UaJK2/ffsBLXVMnmO/zSKmIZfwBt+8Q+IuCJUPvN72N4iFzZ5GpIaRj7UEP6VZEaei8vN0sO5gi1t8YOT4p97u/JZ65ToY2I1CnEuA5ebt4f6nl4Bv/zaGqKh8ty+FUSxK3HCidW1XIggtlVVv93cEPXLKM3Nu9Q3oVHhCqT5Keyh9hZcDH03OS+fa+SSv18d13Dd2q//pXHXn+979N7xcIiGU1diT5G8glc4X8+vQRS8glupwPpSWxsldP8uSTm4xj0mYTvViTSVSFpkWTkcFYqckkVuKJJ1LVaFjeNZ6v3bOMD+Wl8fTM7bSv+oacNavOPVyTxFPzaIpANRqZb81zrZY85hjy5pv50e4/OSMnmc9s+plrZk2notVSiYyUeQQlCqVeE+RVp0sZikZDvv560+frjz+o6vV897or6krI9uxpSKTPDCO/mSDPly9v+lgOh5S/REWRMTHkH38IAQ8bJslGnsYtSo+i8Ny8XXykLJiYs7enSCV2NljfEwL1H8RzpLglqSg1TBTCmtpMVfnf0mzOzNnBdG8nzFtoZ6w5AgTzm4M2I9DXKgs5IyeZxS3Jwvwbwq+qXFaSyTNydjStulR6V3DV28x6M/tXwe4naa030dZC7hki1E3yuWC2ZaN1bjabWDEzZwohLlkixDBhglhwjXUoqcGKFbLtv66UGGhkGPnkkw1JMhBg7ilj6IyK3C87txYZGZLEo9PJQ6MhR4K8ayH5669CJLGxEod9/HHak5P41/ln0xoVSbWehVhLguHhQoQjR5ITepHTQV5wHG0XXSgEOiucnGokx55IDh5Mdu8ullu946gA/Xodc4/pw9RHH5RuLXPnBl3L08XF+v775PkJZI/gvjWJVjfc0LiaEsmKB++notEw64dvG76RkiLuYoA8OZo86ywhyAMlBtUIVgwbJudm0yaJh+r14gZvBA2sT292nX5xZ0Ph5SKR2RwoTjJnkiQcuf5odJPXKgs52ZLEjU5ro+//E/F8RT6nWZK55whWoWsTAi0MdlLfL1X+Hw6XEuA1hek8O3fX/uUtVa/LzeRQYpqKQwq9y59s3Ym2BsofkwJ01ctSv1ihbzX2fbjpJnFlZmdLIo1GI/FFg2G/8osG8HjqLCCNhjwXZNaX+283dCgJ8JVnHt7/vT//lKzcGivwlFPIV14hkxeSe3uTlqw6QYEZM8hTT21AdCpAe2QE/5xwCrOWPy/lMTVQ3CLMnqIlK18mWU+JqCJL3JapIaT983r7KHRv2cItt1xPS78+9BkMDQm6WzdpS9anj8zjiSdI6yfkHpAb3xXLPSJCtu3SRZKZ9lmAJDus3D52NP09e5DljeQlfDCNPMZct5i4666mr4HPJ3OZP1/ap4WFicRfjcD9zp0NNveq9axPMtgqTCfxxM4EVSX3Jko3o+ZCqZZrmh4vXXvq4dvqck6yJPEjW9upGR2J8KkKry1M54K83SJgcgSiTQj0/0qzeV7e7r9FkLi1URXw8+L8Pbwof0+doLljtdxIiq45dHds7pmk5dTWn+jhwrUlmF25gSS5vKKAs3J2NPyh/PmnkNeTT0rZCiBW5dKlUs9pb8Ld7fUKoQESa9z0SYOxapGfL8k4ej3n5gZv5qpKfv+91JQG6zMZElJXVxqwCvG/cLaQkdksLtz6RNarF7+7+3ZeY9nJCr+P/y7O5GRLEt+oKhQBbZ8lqBZllrhsEA2k/BQ3mT9fhMuDdZd5Pg+vKEjl6TminLTb7eCCdd+wYvYZ+8+hxl088TRyXfe6OkpFEcH9GhdxRITEJoPW9wanlef9vppKbCx5wQX7n9vCy8i0U6QuVKeT67N6ddPXefly2SY5WUg0JkYSmgYNkiSqet/nz4LWZ620W945nTP+6d0r16+6iazvpuAvFZe0ZbyEMSi9PadYkvh0ed4RH+9rC5T4vZyds4OvVbZ+l5/2QKsT6F/u6r9drU9ro8Dn4dm5u3hNYRrdnixplZV7RsukzKpeEyvH38liCWpAxLhL7yQpC4cz6mfkqqrEHAcPJp99Vm74zz4rGbgREVK83xgyMyXLFZD4p89HelIaJ9CzzyYTEvhdbianZP9F5ZtvpBUaIH+HDJGx6ie9FD5Djt3HLVsTq7zwQnL3bpb4vZxsSeI3wcxyRVX5jrWYUyxJvKNge13nFHtDi3g/LVxVIYuuJ1PAvcVPcHbODl6Sn8KsYE9FVVV5WUGq5BEEAuQHH4hruGZONfPTa8knjXU1waoqGccaDTlvnvT1NBrJG2/kD3t3cYoliUpNhvPPPzc8Z4WX1ZVubNpUF8f9v/+TOewLt1uOf9NNcu1OOknqa2uOH0xscgVzIh6usT5Vv5SBlDVSc9rRqHhK8hACLZCfc26SBMCSpdzssnGaJZn3l1r+EZ1JWopnyvN4Tt6uI/IctSqBBlSViwtSeW1h+j+qvqklSPM4eYYlmel7x1Pd26vlbqyabEHrytadYGug4BIy68Tap29USVy83O+rSxy6+24hp3/9SzZ68UWxfBprdv3VV6KE062b7Lst2IHGs0fOgWOtqMa4/iDfWybbvLmIeT8uYfHI4D6ju5MfzCXPG0ya9eSqK8jyR0RB6PErpaNLDTGZzUIeixeTeXWCEO9bS3h6TjId+3hYdjjymJ52Au0pkcyu2D8jtjEx+YCiMClnCZkCfp9z937HrBmrur5Qwtdf17qmWT9Tt08UuftJsvIFsvRh8rwTpCn4O7PJO8aRkSYqZj1TrhpOZt1Nju1PDuxBVvxAenbKd6lgEZl9St0EliyRmK5GI9nFjfUc/c9/5LpUV0tZS9++QqSnny6WqN/Pd4J1n7XKVDUt+ZqIGXYoskceXnZ7xTNkCnh/5lO8syTriGzR2J7Y63VxkiWJG47A+HCrEugqe/mBVVSOogGyS54lU8APCt45vAVH9slk3tmtN7HWQk3XGJ+4D6uVAM/M3clny3Ml8WTUKLEAzz5bXI+qKjfeefMaHkdR6hpoz5tDjh9Gjukv2Zt5Z4sqTI3VlwJpAdYd5DiQF+ipakH/AB19b/UgM4eSdyQEpQLjJYt5RTgZU48444J/JxvIH08QFaiy+8Qd68vjFfkpvLc0u+EcA3YyewyVtBg+lvclp1uS9/PC7EugDiXAfxeLdbwn7yaZe+UrDfYp8/s4xZLEb20FUjNZcoc0ec4+g3woTuZqBBlab/6TNOTWKHJPT3JCKBmjI9cPILf3o+uaSKpmkN205DItqQN5Cxqev1SzZJYWXU9uCC5E7r5JYs69e+/fDzQnRxZBr70mz5OTJR46ZQoJ0PnmG5yVs4MvVtRbFJUsE4F2tZOFebxpwUS+A5QEHQSpbgc3pE+nKyWcXm9mK07u74urC9N4R8mRd65alUCXFKbx//a9sRxF4/BmkalhzM9dxMmWJD5RnttyEi1/kkw1koFOJlYRsIo7q7KuHOJ9awn/89YLclPu25c87ri6WOe2bfL6qlXyXHGRVWvJ84bL67fEkl8ESeIpiMJPznQp/UmBEGr1d+SjS8Viio4mIyPpePIJTt27VTIgv/1W3rvrLrKgQAQMaognzECaIC3E3ltKlj0UdGkGk0OCBFOR0oUV2TMk4cu9PVjKME1c8e7t9KoKHy3L4SRLEl+rLKy9rvUJtNjv5RUFqZyds0M6VagqWXyjxERtn8i5s39GFt9MS/ow+lIMdQSX0Y/MnS1KVTlPkdfMJjUgE+qRqF4vKk7l5XKeR4wgXS7eWpTBZ7ZtEJk/gOybSJpNZPYqyYbNOoHM6B9cmAwRV+ZwiFt7nZkcGibn6cNbSW9GXYxzxgzJnK7BF1/I8U84gda+fXhm5p918W9VJTMGkIWL2/gL2AKU3SvZtIqrRbtne92cm7uTtxb8SWVvz85Zp90J8bW9nFMsSdKf9whCqxGoSwlwyj9YceiQoCpkzmTpMxiw8/vqCk62JPHJlpKov4RMMXROPdGcadL4OwivqjBl9HBWd4kVK2X37rpt/3UzGR9DFt4ppLVVT54C0gBy+XFk8c3kZZPI7vGkp158yl8cjDl+LdZQTabs+eeTRUVUVZWn5yRzVUqylKPMmSMu45rsW42mVkaPl/ZvvHRGVUlfPlcXvskPM66ikjNNko1SIIuXFK1ILgbjZqqq8kNrCSdbknh/qYU+Vakl0G2lRTwnbxcvyNvTUNLMvVtc3ikaOV4KyIxjWGg5j89lLKOt8t2mXf1rvyb7gjTqJTGqRsChe3dy5Upx9V5+OS/K38OXKgvk83zxhcQrAfKMM4LXa5IsSGo/d4B882nZZssd5N755PQw6VX6EMSCz59PvrpItvj3oOMAACAASURBVMnKqtt36VKqQd3hdSvrCdS7dwSTdJpR69yeUFXxZhQsatHuBT4Pz8vbxSsKUkU4xPpuMLTwS+vO828IpxLgzJwdB64X74RoNQLd7rJzkiWJWX8TjcM2he3j4A+rTkezhkRbnK2Xfx6ZNbTziSpUrQgmOQV/GFu31lpJOa8sl5hl5UtkziwRMr8Akny0ay45og8ZFU6uDSa6+HxCgHfe2XAMxS3n85s7JRYHSAlHvXNxae5u5p42QeKniUG5uuhoIc+QEDI2mnwJB6zBVVWVF+Xv4RPlwc4jikfivEGiEzI1iZKU/XNS9XKds4rTLcm8vTiTxVWVBMBpu37jtYXpohHsyyHLHhDLr6bPa3pXIWeHZAbbA35OtSTxy4MVnaeOIS/qWyf+EBNTt0iYPJkEeP/LT/GT+r1RbTbyhBPqFhy7Rkinn/pwueRYNQL/gQB51WWyz/1TSMs4cruONIO8PVayyau/Jd125g8/iR6TiYGTT647Xuk9Yq2rnczaqMkcr/7hkHct9ft4Yf4eXpy/p077WVXl3GQN7Xy9TjshHi/P5YK83UdUMlGrEej/qoo5O2fH0eShg0FV5AcVFBmoj5p6sWdaQqLVP3TOpIxAhVjHlUH92YULqWq1LJzWjzmpxwXdkjry6xFyQ/5hBVleJi7H2NiGGbI//CDb7Kv7qqrkf3SkViOW15J9CIDk1/feWSd0AIhwg1YrBDphArnrkYPWJOb43JxkSapT8bF/FqzdDdaYerMlgzN7lLyeHkeWLOVTnz3N0/b8zlO+/5gAeEP6n/TYvhAZuBStkGbBQsnaVdxkoEosoczjaueztDij8TZn9VH2oChAvfO21NbqdJLlHFwwqKGhtEZHclPmPsIbVVWyvV5P9jWSay/Z/9jXXSfHqfleqqpkSgPSZi1gI2efTI5OEBdwChhIDefvP46nYtDVJX2pqgixF1x84M/SESi4VOo/D5Hsyvw+XpqfwvPzdu8vHOPeJh6FygPoLx8FSXK3x8FJliRudh1APKWTodUIdFlJJv9dfOQFgdsdtk8P2H2iJhHruYpDJFFVEZdw4ZWtM8/WRO6ZZPZoMusBSVoxgcqmEK5JP51/lrwuhHH//VLbWFUlkntdukgySn1ceSU5YEBDK9vjqat7nNCv8Qze1FQqGo2IEsTEiFhCjYvziiukrrQZNYkfBjNi3YpCenYL8eXPb9zqd+8gi2+V1lcpWuZkz+GVSa8QACv/GiDfgezRYqErjaj9eFKlzCNvLqmq/NxexqmWpMbVnGrH/Cvo2fhZXOM9esgCYcQIcskSqkHxB/fIkfvP+d57xWodqCfDjbJYqY8ff5TzVT+BqD6JLl9OvvmmjFdczIB7Jz/PupmW9KHk0mBcdlZvCTO00MprU/iLxRV/iM0ZivxeLszfw/l5u+vqW/dF4ZXyPehsghGdDKqq8uL8PXz6UFsgdiBahUAVVeWc3J1HnP+63aEqEuPKmXrAzb4OkujzFfmHRqJl94nrL9BJ2sapPslczRohN83FQevvvotIxcn7Sy2cl7tLSGHcOMm+nTpVMnNrSlRqUOO+veOOutdKSmQ/k4l8vJuUcVx4YcP9iotrSz1STxpCZefOOlGCxx8XElCcMr/iAwjNk7ypaC//U5IlCSaZQ+TRGPnVh+JgdvHjrEyJpW2raOFu/3Mk3Y4NB96PlJhusCNPid/LSZYkrj1QM3pVlZhkyb/rPvvgwfJZp07lhm+/pM8Q1Pc9Z5/klpISiZ3eoiVnDJUFxksv1b3v9Yp7/L779h+zpua0Rtrvgw9qv8O7PQ7StVe6xuhA/gWxuov/LUlInQW1v53m16/n+zz/z955h0dVfH38sz1103sICR0EsfeCgiKo2MXesYOg2FHs/Oxd7NgQVMQCdkQRRRFEahoJ6W3TN9m+e8/7x2xIAgECBF7b93nybPbemblz596dM+fMOd8j48s2yPnl2VK5LeEpopiJcgz/aaHdwC3VBTL9b+SI2iMCtM20tWJ7ROn/Qe2LdTOH52fBCeiFnRGivhpFD1d7/47L7kn4qlWA/MZUdb+b9hfZYFHem1brZp7WWp9XxpSslZdKcpU59bDDlAPQjz9u3ebixZ1jPysqlAdvUpIiMn9NpejyLFsmdr9P6nxeqVm3RrSgQ5Ht5DEybtUPEoiMVJroK6+0t93wcjCEZNsTnCPoJPepvVaFd+SGiLjX73AoCurnS3FuHwnkII1rDxRAGlcgywvOEI+ndMdjWX2T0oxcf8jF5Tk7Xp2Xn6v23TZ33CGyv/JiXnvReXL9H0tEs1hEA3GPHCn1Xrc0+X3SGvCL/7wzRDIQre5DRYzQ5tHbRqAwfrzi990SgYAipDebRTIyxHPVlXJa6bp20gQRxdsLIhea1YIqL1qNeckoZZX5/9wj1Dwi+clq77abKPa65Kyy9XJxeU73PEfLz1Lp0f7b4touptuKdrxV8ReCnh7Aeo8DHTDYEtYTzf1z0fAshB4DYUfvsOi4yDgmx6Yxr6WOJxvKCYjsuH1jIkRfpa6jtfZAh3cS7lVQeTEUZkD9DIg4BTJXQ9Yq+OwQcPjgmqtBr167eKOJy6KTKPx5CWga/PYbzJoFxx4LgEMLUOB18avTTv43X+KOieHJjHie+ONnao88nHp7MxM/epNTUsKoe7cex75hjE4NY1z5BqZ/NpuY/Q8Er5fcYUM475kHeOOkc9G1tPDsA3dw2pgjuKgih+urNvJ5SwUAb3MyX7bWs8rVQqXP02nM13scaMDh2jJoehESnwTLPtseC28RdcWj6Ws7E58hnkDvP9D3XgxATcwj9PP9hBQNQWt4HiSw7XYSHgXzPlB1KQdazPzp7vxcXVqATV4XS53NfNBsY6nsg9+1kjuqs7myMo+zGoo49cPXKcvMYOh7czlg9lwuXzAbAMv332M78ABOL13HKWXreeLM4VAKL3zxJ2fdejXlg/oDsOy6q3istpRFo46BP/7gp/wNrHG3Uu334hdRz3PWLDjySLDZcH73HX4Rro5Oae/o+eeDNQzmecH6EvSrhJS3QZxQeTYU9oOGZyDQ0q1XrUdh/xAC1RAzqVvFC7wuJlcXYtUbeSa5LwlG844rRV8P3mxw/bSbnf1nI0JvoEXbzu/hLwZjTzSS73GRYbIQrjf0RHP/TPir1Y8n+fVuVzktMp4QnZ7H6suwawGmxWdg1u1gzRM7FRpnQtOrEHvzbna6GxAB11KofwQc34ApC+IfgegrwBCjyng88ORa9f81+3aqPjY8juT5CxHgz6mT+fyEI6iqyqfa78Xe4Yf01E9LWHvw/jRszOfWcy9FjEY++2I+B2ZmMqqhgbhf6vBNs3JXXAbJX3/D0PFXqooGA47Z7zH/wmuIstWyZNJ19J08lUTNj10L0Bzwk+FawybD/ix0uKgP2GkTmyZ0ZJpD6GMKweb3EYeX+NqbIGwURF+37fFofg2puRk/Vqabn+D23jdhMhhx+ewApCTcwAb9BdRVTeVU2ySwvwcpb3YtkPUWSJmFFB/EaPPLfOq/kOfqy6kMeCn0uqkL+DYXDdHpOZh9OBovA7QNpIQcTrTeSLjVwOrflxExeF+ueGomRxxyNDWTJ5H4/AsMWpfNwjHn8fuvS4kZ0Q/6w1mf/ol13CQ+/eUH+r3xFifdNg0X8PF1lzMKWLzoS5acfCIAOiDRYCLNZKHfK89y6eHHEV1SykVOjRjDFtPL6bHwjhNeXQx3HgpRl6g/95/Q8BTYboW6+yD6avXuGpO3++r1CCSgFnvhJ4Fl8A6L53qc3GbbRLLRzOOJfYja8h63hbDjwDxQ/TbDjt3NTv9zEaE30Po3EqA6ke6oNtvHCw0VrHC18HbaoJ7o0z8TjS9CzWToXwOG2J2quszZzP11JexjDufBxMwdL1SqrlDCrM8mNQHvCYioa9Q/BK5fwLIvxN0FkWeDbov+vfYacvXV0M9C03fHsiD6HQq8Lgp8LrSSEt4dcSqOiAguXvUj/ULCSTVZSDGaN/8lBCA+PgHd1Knw9tsQGgrffw9paar9mTNh4o3wkwaur+HEsWAyqXLnngs+H8yaRd4xR/D+vNncn5DZuX+FfSFiHCQ9jVc0bH4fVX4vJT43RT43RR4nDZ4irvC/wHGBb/jSciPJRhO9DBpJRj0GgjlTABxfgjeXbOPRPKm/kdtSRzMwJAoAu91OVFQUzc3NWK1WvmjMZX3DXCZprxMasEHEWDAPBbwgXpo0PdWahdKAkVjPz+wf+Im7Tc9QYDyMfqFx9DWFkmGykGq0kGYyE6M3oiMA+ZGQ8AjETtl8i40BH9cs/565I8ahF4ElS+Ckk6B3b1i/Hvr0gd9ugkemwGuhUFurxq9tfK+/HiZPhk8/xXfG6VQ+OgOb30eN30uV30u530OZ103qF1/x0DU389uIo3jg7ZfIMoWQZQ5huK6SE749DM4HrFYoL4fIyM7PwVcOjc9B0ysgXrVIibsdjEk98sp2iebZUHUR9F4OoYdst+g6dyt32IrINIXwaFIfInZWYWh4FmxToV/5nr2nvzFmN9fwob2Wz3oN/f/uSvfQE3bg2U3Vcmrpuh0X/Dej+FiR0pN2ufoaV4ucXLJWJlTmtWdx2RbcuUHX+Zm7fL3twvGzygCTgyIeb1m41d6OM+CXVa4Wea++QmqzeovXbJJl1x4lkoNcU7xAplQXyEu2Uqk//DDRDAZZcflFMrZkbdf7Sb/+qvbP+vdXuUPLttgHPPpokVEHiXyIcn4xmVQGErNZ5JFHVN3kZJlZUSAXlGd3rutvDnIJv6u+B5zKQ7r+aRVasmm4aLmhnajuAjl6acyNlYrcNCnPzRBbXpY489NFayM/6PRnVCEp5edIc/7liolo/XEi+Umdymk5OtV2bqg05/WWotw+UpbbS+py4sWVE7Z1u/nJivSg+mYVsO/Z2P4MNh3Qnp0liF8cTTKieLU0zn5PjUdsrMhNN6nwlSuvDLIGJYp8k6b+/+STzuP00kvq+PDhynGrC7zfVCOjCv+QgMkkAvLzGy/Lw7UlclVFrszLv0ia1kWJMyxU/Hq9/HDf3fK5vU42eZxbh775G0Vs96pY0dxQRV3o64KDd3eheRUjUtm4HRb91dksJ5WslZuqNopjV7NM+evU77LprV2r/y/Ap/ZaOb549d8mc02P7IHGGEy0aAF8ovVEc/88tJlvI8/Z5Sb2DYngmeR+1Ad83FRdSLXfu+3CloFgvQDq7u/ZvVD3OigfB6VHgdYC6V9Bxi8QcTJ2LcBSZzPPNZQzoTKPU8rWc3NNIaUfzCG+qAST14f1pBvQDAnMtHzNU0l9ue7N94n9bTm6QIChRx1HiF7PMw0VyJZGkV9+AZ0Oamrgq68gPb39nM0GS5fCiBFwIYDAokUwdy6ceircc4+q+9lnDIiKpdLvpbGD2RNPtvp0/Qqlx8HGaCg9EmrvAO8mCD2M+tj7ydcNxGPIgD6l6Ad6iRpQhydrIz8nr+Bby1UYAjVk6/fltsilnBjyO98l/gEp70PkaWpfr+UjaJ4VHMeflQYSMxVvr5+5OWIpp4et5oWQp3CJnjoJ4bHQ13g37mcsA6oJGeSAgX5ImgnAYvMVysxpiIPWT5QGtam/2nuuvBh0oeBe3WkIsz1OYg1Gos6/AM47Dxob28c1IQHGj4d1Npjhg6FDYd68zs/guuvg7rthzRpYsQK8nd+/Up+bWU3VnBGdjH6ffaBvX46ccht3uXS8lpTCmfI5/rgraT76KFzxcQx9fRbP2Yq5oiqfM8o3cLetiA/tNnI8Tvz6KEi4H/oWQ+wtajtiUz+ofxQ09y69ul2i+R3wFUD8A9sttrClnrttRRwYEsH/EvsQtqtbVYY4sOwHjsW7Vv9fgEi9AQ1w/V1kSU9I4V+dzTLib8hjuNewOXHw7oeXlHvdckF5tpxdtn77rE/eYsWKY7tnt68p/jqRqmvU6rmgr0jzHHH6vfKbs1lmNlTIhMo8Oa54tYwoXi0XlGfL/2pL5HN7nRR6nKIdf7zKyKHTqRhP2z0qfnL1L0pTvOIKpdn8/LMscTTKiOLV8n1rh1ACTRMZOFDVb8vZ2RGzZ6v6Vqvig/14Qnsqrbg4VW/SJBERsQVDQX5qrRdx/ChSdWO7N2hepNJE6p9V/LZau5a/vPYzkRzE3bQFwbimKVadHMRRcZW8Vl8klxbOk2/zxkhjTmxQs0QkxyKSGybNK8OUBrrSojTTHMSfY5SC3AHy3MZb5KKS3+WPhl9E29hL5ZV0rd7qejWFh0txbl8JBDpYIfz1ygpQM7WdxCEHkaIjFU+yt0ymVBXIPTVFqnx9fXsi8oMPVrGxTqfIIUEKxAMPVOe3TF8WCGwmiJf33mu/vKbJDVX5cmF5toqRHT9eaampqYoisPZxRabhrRCZMUNROIK4P/xQVjrtMquxSqZUF8jokjUyoni1nFSyVu6oKZR5zTYp8bpE89qCPMFGFevcPGf3vVkDbkWaUH7uNotomiavN1TKiOLV8kx9Wc8w5FTfLLIx/T9v3G1geVCWbEVI8RdFjwjQXLdDRhSvlly3oyea++eh6mqRTcN7rLk6n1euqMiVU0vXyWrXduIQa+5QJjBvF6nBugPNr2j28mJE8qKk0faEzGuqkFuqC2RUsZrszi5bLw/XlsiXLfXtqarakJe3OQZRhgxRx3xVItlmkYMzlGCcN0+VqVB5QqfbimRc6bp2OrTXX2/P39kVLr+8Pa5zeqZI+QUqbCMhQR1PSRFpDWYH8hTKxwVXS0teshIwG9OVwMlP6CQwO4+BJhUFB0th3j6dJz0tEJzUEdm0n2gb0yUQNMO2Cc5Ajk4cOWHizI0T/8YMaf4zUwCpXZUsrblR4skxBQVsex1/jkWkcLgy0eZGijiXd+rOmsYfRXKQpobtmAEbZwVDRE4UybWIlqOTP/IOl+WVj6tQJxHFj9sx5+mbL4psQKRPUvuxjixQbQgmKZfoaJW6TEQ+bLbJccWrZU3bu3jXXYq1aMECVfbxGEXKL9JOyLD//oqAvgO8WkA2uFvl/aYaubm6QE4IvmPjyzbI43Wl8lvj7+IrPbV962DLBcbOoO4xFY/qzu7ytFcLyMPBhABzmmp6zqTYslD137OxZ9r7h2FhkFR+y7R+f1X0iABtW9n/+jeiYNqrKDpMcab2IFoCfplSpQTZVy3b0Gz9TYpOrm3y2hk4fxVt034iOciGovFyfelSGVG8Wk4oXiNTqwvatYPtTSy33660myOO6Exw8NixahJd/JXI888rTTQYG9ro98kZpevlzppNoq1Zo0gQQkNV3tAtoWlqDw9ELrxQpOo6kY+zOguGWW+qLCMlI0VyEFdupCwpPF/E+asSghUXiRQftXXbbQhSJN5a2J5RRhy/KuG7hfAL5CCujYNF6l8UCbRIg98rrzVUysiCP+SY7GVywGMPCCBHrftZrqjIlSWORrX/584VqbhMnLmRHbTWtj+dSPn5Ij5FoFDhdctveUeKo2A7MYWuYFJv5+8i/mapqn1JVucd0N5m9URFO3jIIUrTNJtF9gumhKv4SY03dCat6DjmVqvKETp6tJS6nTK6ZI081zFV2YsvKlrAQEDkzENVyrWaX9W5ujrV9lVXqdjf4MKpy9sIBOQ3Z7O8UF8ul1bkyIji1TKyeLW8VPauNG8cKFqOQZFGBHYyfaK3XFlBqid1ebol4N8swDtZQ3oC/mZljWp8Zcdl/4WYUVsiEyrzdlzwL4IeEaBeLSAjilfLl9uayP/N0ALqx1r3eI837dM0ebyuVEYUr5ZXGiq65iFueFFNwq6VW5/rAl5/i1SW3yhajk7y84bIdZvelbPLNsgTdaXys6NJnN1dGWqaSqM1YYISog89pI43NYnEx4qcplOOOvfeqxyDOuBnR5OctGGZtAzoL7LPPluZDDejzbGlVy/1vfEVkXFBwZmYKDI0XSS/f7vG0vS2LGwqkZHFq9sdQUqOEykfv+37KD1RsnP3kXFFq5T5OS+2XRDlWUXyYkTL0cnX+WfIW7aueYgrvG6ZUJEnR637WQB5tji3y2fV5PPKw5teEFtu36CjUEowM0tQkBYdKv6WH+XmwjeDdHgLu+6zr7ZTTsv3mqplTMla8bV+r1LA5UUr7evDYzon5V5gUqQCP/+svptMIr4uCA7231+ZZkE+uP9Ouag8u/N78emnqn5VucjSTJFQg8iUKe3nk5NFbrtNXfex7lPn1fg88om9VqZWF8joohXy6saJ4smxSEteulQ1zu++llh+niLs92/N6mQLppk7pXSd/Lk9687uYNMBIpWX75m2/+a4oDy782LsL44eEaAiIqeWrpPZTdU91dw/B56NQX7Sb/dI85qmyQdBE9o9NUVbCzjNq+gDN+2/TbYXrxaQZY5mebfyI6nIzRBPjlnmFN4ib9SXSr7HsWvmq+XL1STaZqL9+GN1/Pbblda48mxFO3ftBJVcewusueBccYaFiu2T+ar+0i2o75qb1QQPIjk5wWPLRIyIhAbp6l5F5bXswDtc4XXLiOLVstQR5CUtHKg4a7uCO1ckB1mbe4D4c8xBQRb8LBweFMxHyMzKr+SMNkrCLbDK1SLjyzbISSVr5ami3M0a6AO24i7Lf9FSJ8cXrZTymqeUoMtPUpN9h3ygttwUacjvpzy7u4KmdSLwn1y1Ue6q6ZBmLNCqTPOFA0WOQiQhaAI/Jb69zMiR6tjZZ2/d/llniYwcKeuuu1o8ZpNsWr6s8/mffgqmP5uh+nz/DUojLQxyZR99tLJInHWW4j3eBbQE/LKotUGerfpRVuYdIZKDLC04TeY25EvF9mj1WhcHva63NoHnuh1ydtkGGV+2oXOauZ5G+VmKgek/dILN55URxavlx+3RVf7F0CNeuADJRjOF3h70kPunwBMkELDsu/1yuwidTse51gQeSshkhbuFm2oKqfV38DLVmSD5NfCsUUwvQYgI69wOnqgv49zSVVRUXMcFzediMCZRnf4747Me54rYXvQ3h6HT6Xa+Y598orw72zxmMzOhshKeeQZuuQWGPQr+WqhdAdHRnesuXsy+73/I+9Pv4E1c6lhcXOcyI0eq+M7oaBg0CMQPDz0MfiDJD0Nj4ZJcSJ8PYUdsrpZqstDLaOE3lyI1INAAhvit+69pUHkRAgyTVfj10RA9GfCDPlp5bya9zJ8JX/GBN4WLoxLxi+DWNDQRAiK81ljFzTWFJBvNzEodyJWxiplnalw6y112rqzMY73bAYBXNFq1AIeGRJJljuB+/8kEMtdByMEQsKnnaB4OEecQJzVEBwrAtQTsH2zdd50ODNEQaMKlBVjvcXJQaIeYS304xFwHWdlw/4NQ64Eo4Os6aPpdlbnxRvU5bx58913n9tPTcZeXMXXyVbQOGEDWZVcqsow2RKm4V0pfhIjTYepj6l247z51vH9/KCiA006D5cvVe7GTiNAbGBkew6TkYxnW7ycKYmdysP97RthG8FjZe1xftZGP7bU0dPS4Fh/U3AihR4D14k7tfdfayKSaAuINJl5M7k+mOWSn+9RtGNPAX7Hn2v+bYp1HRQwMCwn/f+5J99FjAvS4sGiWOptpCfh7qsl/BnwloAvb44HTR4RF8XxyP5oDfq6vzifP42w/GXqIoimru5daVy7vNNVwcWUuk2oKqHCs5XXfpZypfYwu4UmS+vxKRsTwXROaHfH11zB6dPvk2KsXPPqoCs6/5RYw94HoCdC8AUJM7fXcbrj2Wjj6aI6ddAvO2lp1PLYD+cSrr8LKlWpSPvxwcHwL2UPhxS/ADBQD015S4Txd4NDQSH53tahwGa0F9FsE9Ld8AhtjwbMS0Vl4wDSDb+O/xdv8BhpCGancFvYRJ7ccwc21RQA811jJGeUbGFO2jlGlaxlTuo737Tb6mkI4MCSSCp+H1g6/jWPDonBqGhNrChhdspbRpes4tWw9Z1fkUOhzs9HnYlRVPWfKDN4JfRC/+BDvWsoDBu6yrmStcbRqqPI8KD0R/PbO92CIAa2JVe5W/AgHhWxxjwA6PRw/DQ4/QAlQP3DToVB9HQxKDbZjgLPO6hS24o6MxNHczABrDFHvz4GNG+Hpp9vbbSNIaC6H+OkQFqbCid57D7Kz1aKqshJOPlm1v3Bhl8+puzDrDfRLvBZL1joSQvrxtHcC53me4I2GEs4pz2ZqTSHftjbgr3sEvHmQ9KK6dyAgwszGSh6pL+W4sGieTe5LnNG0gyvuJozp4C/fs9f4G2Kt20Evo4VYwx4e/x5EjwnQ0RExBBAWOZt6qsl/BjQX6PcOR3A/cygzU/oTbzBzU00B37Y2AIov9bvQKTQQS0nZZcxprmGoOYy3wn/jKdd44vQa+t6/o4ubsjWL0K6gpgZWr1ZMN1VVYDSC368E35Qp7RpK3DTwBEBf2l53xgwoLoaXX6ZfSDine1Q82E+W4Kvq9SpGnLAwMBsV21LZaHjHC04gOQbSdXDmuG1279BQK7UBH4XeFhB3uwDVnFA6Eqk4E02UZniL5X1+1J/IQbVjMUsLK41jeDf6EzLDhzMqXFEVnhOZwIMJmTyYkMnEmFSi9UZ0wIEhEYTrDbxvtzHVtonxFTkAPFFfzkp3K8MsYfQ2WfAiHBoSyb1xGTyUkMkDCZn0NllINJg4PTKeuojLmGn9EAeRpLvmku58n8mmR1luPJUAJsT5HVIQDw3Pt9+kPhK0FpY6m+ltstDLtB1GqusPh1IUp+1cAxTMBjkRQk1w2jhoaYFLLlFDJMJig58Qh4Np8RkYhg2DSZPgwQehrCx47aA2ajkeQvZT/195JaSmwuOPQ2Kiit+NiYGDD4bFPRQXac5En7EYXcJjHON5iwUygbutAQIizKv9FuofYnnYjRTq1cLKHvBzh20T8+y13BCTyu1xvXZMldkTMKaphdv/B+/vXxjrPI6/lfYJPShAYw0mDgu18lVw0v4PQYhLBbbvcADA9QAAIABJREFUJcQaTDyT1JcRYdHMqC/j8spczi7P5pHGRuaFPcBB2nI+C1/MHb5p9K67Fp31XMhcCSE9aGL+8Uf1OWoUNDUpM+vMmUqQTupA2G1KBWMm+DaCrxTy8pQAvf12GDIEgP0emAHAY/ZqKnweNZG7XPBgUDgnVUH4a/ByvWqzugXOFvD9uc3uDQ8Jx6o3sNRRB4BgoKxhNv78WMS5mPW64SzWjaRS35eIkH151nsFKVKJZr2CQ/ou5K7EAVwfm0pdwEcfUwjXxaRwVFgU/cyhzGupwwCMiYjB5vexwePAHQwK7/hjswV8rPU4iNcbGRUazXJ3C+u9To4ItXJ0WBQ3xaZjC/gYFBLGzXHpTEw9nYi++Yg+ihv8TzBK+4mcsAsw4ONl4xScmBHbJOoLD6HJZwcMaBLgF5edY8KitxqDTjimGtLMSrCJHuaeC9HnQKYPLEugby/48EMoKuIjey25ZiNhrQ4S2zSF6dMVPd8tt6jvLa+pz4iL2q9hNqvF0+zZSuv0+aC5WSUOWLKknQpxd6EzQNxU6P0bBs3O8bWjeDp8Ay9qD9JkHMiTXMZVVflcUZHHpZW55HldPJbYh7OtCbtvdekuTMFtjf/MuJthD/gp8rkZZvmXClCAsRGxbPS62Oh17rjwvwXiAv3eE6B+EX5z2akJMhUV+zyE6vQ8n9SXq3tdAZHnYa67GVrmQ0qQxFzfwy/t8uWQlQVJSWqStFrh5Zfhssu23u8M6QeaSTH/TJumtJS77tp8Wjd2LABRBiOv/LoY+fADyLLA8E9BAw6YBW9Xg9OpNChfAM6MgdYF2+yeSafn6LAovnMoDWBD7Quk2y5CQ1gY8QzN6d8zUvcbqTHnM9EzlaGyBl/oCPSpb6j9RaDK5+FXl50zI+MREWY31XBxRQ5Vfi91mp/PWhso83sQIFynJ9lgIjmYtSPOYMSMDodo/OFxsMilrDbzW+q4pDKXAo+T/Szh9DWF8FlLfYeOJ6HL/APBwB2eyVwWlYjoozk3IoQbwpexWn84sb4VWAqTqfY2kOdppVULcGxY1LaflXjB/R2cd4RiJ9Lp4I3ZoH8Iso6GGj88UQ4iOE8fx6tNVQxPSEYnAg6lpWO1Ks3yo4/gm/eh/iV13LwFGfzVVysTftsCq7VVCdDqamUG7kmE7K8WhqFHQsXpmHy5xKe/x/u9hnOeNYESv5smLYBX0/jB2USB19Wz198edEFrgGyHTexfhpXuFgTY998sQA8LtRJrMP6nhXaEtnc00Hq/j7ebqjm/Ipv76krwI0yLz+C5pL4YdTqm1RaT1/gNOBcBRjD2UsTvewK//QaHHqr+dziUtlFb2+6Y0hHmUNAPgOVzlMPKPfe0k5gDDBsGViv3xvXixusvAwF5OQ3kVXU+KQOeegoGDICQEBg7FvqdDq2fdtk1vwg/OJrI8TixB7OjDA38jseYhaFvOaem38RR+kJ0WjN4sklwfYaDCPyp8zu180VrA6Ho+N7RxIll63i9uRo/KjuJHjgmNIoPUgfzfe/hLMwYxpz0IbyWqkyH76QN5pve+7I4Y18eiOtNqkEJVh1Q7vcyoXojZ5VnE2cw8qvLjq0jbaO5LyusDykC+/JT0YUcRJz7W97qtS/7D1iGM/EVLPhI0goQzwZ0KCq6om05+Dl/Bs0Ol01WjkBer9IQn3oK0gdDU1846j7kKB2ha9dz45J5HBc0XdNRY7vwQjjsMLhzIvgi1LHQLd77yEi4+GL49lv13e1WJlyAP7dtMdhlGGJUdiJ0gIZWeydv1Ocx117L0WFRvJ0ykPOjEvnd1cKEqnxurilkmbMZrae04W1BCwrrvbiw/isjIMK7zTb2D4kgdXtbDX9B9KgANeh0jA6PYZGjCe/fhctwT0Pc7SvOPYCNXicP1pYwviKbufZaDgu18lrKAJ5P7s/I8BiGhUTwSsoALpTP6VNzCtWGAWjpX4O/CGrv7PkOaZra/zzooPbvjY2Kq3ZgF049Viu4o+GlGMgwwUXndj6v04EWYOCPI0jcYKP2oEQ+PfRHqA9O0kuXKi3X51Na6PjxEHEaeHPBtXJzM80BP283VXNeRTYP1JWQpZXwoXeMSl0WcgghfQowmBJUYediwAyt89EBM023oBmsm9vKczv40G7DifCnpxWjTkebKDky1MrctMHcn5hJomn7eSJ1Oh1HR0TzXtog7k/oTazBSNsOdKsW4Hd3KwI8VFeCV2v/PRWEXcpG3WBAD67fwP0HBJoBCI+9Gn2fAkDPYFnPo/57WeJs5oqqPKZUF7DcZe/MNdy6AIypsM84OCSYjeSYY+Cll5TjVlU1zti7eWTmu2CA0+98CH1DcDFh6fBe63Rw+2nwZwNkB/eftxSgANdco94HUAI0Pl45Fa1evXXZ3YXfBlUXQOhR1Cd/itvxCyfUj+NWK0yP702GOYRLo5N5P20w98Rn4NY07q4t5tLKXD5pqcO1p9JqSVCA7sWtnb8yFjkaKfa5O+eP/Zugx3fMT4qIpSVILP4fUKnLAj2rkYsIq1wt3FpTyNVVG8n2OLk2JpWP0odwS1wv+plDOxYmqv5OznHeTUHoBVykf5a7nJk44x6Bxqeh9cse7RtlZWqPMriHSXOzMtVdemnX5a1WtZe5qBGu18D+eOfz3mzQHDBVhQN989qnvNDUwKaGoHfu66/DKadAYaGaxE85BcJGBPsymnq/j5mNlZxXkcNcey1HhkbxXnQ101pPIRQnPkz4IsdvTvINqATLeMGUicO0D18bxuERjUa/j0nVBVxbU4APyDRaODUiFo8IZnRMj+/Ng4lZ3Uuw3AE6nY5jwqJ5K3UQxwe1Oz0wIToZI7DO4+SUsvXMaa4BwAN8YLkFpBX0wXALZ4dEzebeeHQJNBHDwb7Pmee/mHtj03CLcIetiKuq8vmutRG/5gf73GAKOh2ccYb6jItTi5HiYqS2lhl1pSyz7ovj9DPQVQIrPlZKHR1+45oLhr4BwyJg1ip1LLaLtH3DhqmwI2gf8/32UyT1PQkJQOWFIH5+i3mFS+19uC9sNr0MHsbWj0Xnab+eUafj+PAYXkrpz4vJ/ehnDuWFhgrOrcjh5cbKzhaAHulbmwa6d5wL/8rwisaspmqOCYtikOXvNx49LkAzTCEMs4SzsKV+66wa/0a0xXz1wFgERFjiaOL66o3cYttEY8DPtPgM3ksbxNnWhK3zE4ofqq+Ahicg8VkG936bh5MGkOdxcZFzNI2hJ6lJxluw233bjNxc9dk2SRYVqUn57G2Yi+PjVW7IQYPg0jug/n/g2QCiQe10cL0BbmCDD449lguGH8ahoVYW1ZQhFosKizj5ZKXpHnig8uw0RCE6C36tlfPLs/mipZ6zI+OZkzaYKeZVpFWpfdWGlC+p0yVS5u7gBewtBM9qMPYGXzHVUbej6QzMbqrh7Ips1nkcJOiNhKHibxe0NmDVG3gjdSAjwrt21nnxxRcZMmQIB7eZK7eBCL2BO+N6cXV0Mh6Ej+y1XB9clZt0Ol5tqubc8myqfF4KTEeoJM36oNZce+fmd0xEEGnll9DrIOIs9J4/Oc52OC8lZvB0Ul/iDSYeqS/libK3IVCNFnmhauOUU1Qbq1ap/5ctQ+f382trI3fHZxDx6utK6H0dHQwXOhBcK1Td+gchUAr3zGjXJreM3W3D8cerT3fQrNy/v1oA9STqHkSci5kf+Rx3Nno5KDSSe9PHYspcDsYUKD0aWr/ZqtoQSzjTEzJ5P20wJ0fEsrClnvMrcnikrpRSXw/FuWtBH5H/NFAWtNRTG/BxZfReSJ6+B7BHfLbPtSaw2uNg8X8hLUqAigu0xl1uwisaX7TUc3llHvfVlRCi0/NoYhavpQxgZHgMhq68BzU3VJwNze8pZ6FY5f16aKiVN1IH0NcSysVyF026GLTy03su7dmmTcrbtndv9b2kRIWcRER0Xd5kUhPpzTdD4j1g7gtVl0P5KWpSzjxfOQsBzJqFQadjWnwGcW4vPoTAgAHtYTGnnIJDC/BGYxV3m5/BiJcp4ZXMTR/ClTEpRDsXQMXpoDND5p/ERZ2EV59IlbssGBPqhvIzAFGpp8wDqQ09BYD5rfVE6g08mdiHdFMImeYQHm8ox6zTMStlIGnb2bu54YYbyM7OZsWKFTscPp1Ox/lRSVxqTaJJC/Bxq3IiujU2nXERcdQFfCxyNtGqaRB7G/hywJgF3g3Q/AYAG1wNhOJgcFgapM9Tial9BeiK+rOfWc+jSX14LWUAJwa+pEyXwYRGK7867ciQIWosi4qUw0+pWlhcERLDEWFRSqMcPRpsTRASqWKbS44E2x1Q/7gKSzrrekhJUYumLR3G2nBEkNhiyRL1mZWlQpe0Htr2cXyL1D/A55aJvOwZzKTYNKbH91YLTGMyZPwIoSOg/GSwz+myiSSjebNV5/qYVP50t3JZZR4P1pZsez+5u9CaAcMe3dr5O8CpBXiv2cZJEbFkmPYgcUUHNDY2MnnyZG688UZOOukk3nzzTdxuNxMnTuTGG2/kwgsvJDs7u/sN7imKo/tsRXJq6Tqp8+0g+fM/Hc5lijrMtXanq3q0gMxvrpWzytZvpurb4O4Gcba/WSVbzg3ZJl9qQNPkw2abXLFpvrhywsRRelrPpFiaNq2dm7ayUqXMslq3Xf600xTtW36++t6WSSQ3TBG5f/edOp+V1alay+23SUCnk4VTJ4rv+utEQBYt/kZOK10nJ5askdfqyySwMU2k6lpVwf6Z4pPNDVUUfUFUFp0sv+UdKXOaakRsd25OMyY5esmvfkJGBtO0TanaKIFAQPyaJieWrJHjg8d/2AnasebmZpXOrHnHSRc0TZNrgmniTiheIy8E+UGLPS4ZFbz2ZWUbJFAwUGRjlkhenOJc9hTIs1WLVHLu1h/aG6y5Vd1XQZZIwKcSDeSGS3XV3TKpaqOMKF4tE6s2iuPII0RAltdWSnOUVQREq+/AcV1Wpp5HeLjiza26NsjbGycSCGZjGj1aldnUgT6wIz74QJ0/4wz1vS1rS/nuc6Bqrmzx5Fpled5RcnHZesnbVoYozSdScaniBG5Lpr4deLSAfGavlfFlG+S44tUy3VYkBR7nrnWy6nqRwiG7VvcfhLcaq+SE4jVSs5dSl3k8HjnvvPOkIpjAoLi4WHQ6nYwbN042bdok33zzjRiNRrnhhhu63eYeixqeHJuOER1PNpT/u025xjT1uRMxXwERvmpt4JKKXF5orODAkEjeSh3IA4mZDNmRm3fADmUngPtP6PUdRJzcZTG9Tsc51gTuSBvNyyGPEub4jJzKu3f/WVVWKg0ElLeliNpP66pdrxd+Cu7dFRdD61dgmwj6OLWHZUpXoREAF13UqWpEWTl6ET4dM4rS35ah6XX8LyOOI8OieC91MFfFpqOPugzss8HxPVScqVb8Wes6MRQlhWSRIhWsavoZ6h+DCOUA48PEFNehGILuQSPCo9Hr9Sx32fGKYETHcEv49kNEdgM6nY5b43ohgB9hkaMREaG3OYQUg5leRgvFAR+vcjriL1HaszEJT+UlVDkUYYPe3Le9wcTHFBuVrwiKD4CmWSAekuKu55mkvjyamIVd87NwsKoza8VSqg7cX/Ul0MGZJj0dwsPVMw3oUUYsEwQaoeJcZckIDVWevK++2vXNNTQoDfWHHxTBRmKiOl5Xt1tjVuepoqF0NJXEszLmFV5JHcSAbe2r6YwqhCvqcqi6BJre2m7bZp2ecZHxvJs2iFti08nzuLiqKp97bcU7H7bnWQeWYTtX5x+GpoCfD+21nB4ZT+JO+gzsKl5++WUuv/xyUlMVy1ZISAgiQmZmJllZWQQCAfr378/555/f7Tb3mACNMhi5OS6dX112vnHsuvnybw9jipq4vbk7LKoFQywur8zjsfoyBlnCeDN1IHfGZ3TPxKE5ofxURVeW8T2EHbXDKv3NYVyTcR3LwqYwuGUGc8qe3hxDukuoq1P7mqAYZjIz1SRZX7912QULlEem2QwrX1N9DzsO+uSAuR9UjId5QQE6dGjnuhs2IAYD1iH7YC2vxGG18lL6YG6N60VCGxVb9LVqTMpGAzrI+EWZiDtAHzKMXlLGla67cZsGoln2Q0PPD4YTiDDGMjdtMKlGM2U+Dx5N49kGtRDyIlwclbRHg+/7mkM5MtRKiE5HkxZgfksdARFqNB/jIuOYGpvOd4YTEQRwQOLTWNzLGK19h+jMyru2I5KeVRyw3nVQdxdEngWmVHQ6HYeEWnk9ZSDWkaMAGPbL78h+QRahvLzO7SQkqAXRjAnQ9BIkPQPpXypu3pJjIXc9DB4M77wDgS48WWtrlXm3qUlRMrY5GzXsurPdD63V1JScglEcNKV8wvUJQwjd0idgS+j0kPyqopSsvgKaXt/hdUw6PSdHxvFu2iBui+tFoc/F1VUbudtWRFF3YklF/hOgwOygQ9yFUYl77ZoxMTGceOKJm7+vXKm89E866SQAxowZQ3Z2NkceeWS329yjvFVHhUVxQngMLzRUUNvTnmx/F+hMEHIYOJdss4iI8KvTztVV+TxQV0Kqycwryf25LyGT3t3dG9A8UHGGCmlI/xJCDux2F0P1Bo7o9SS14RdwrvN2ni17e9edwBwOtd8pogToYYep41VVW5d9910VBzgwDlZ9pARe2idgTIC0DyBnIzQEBWx+/uZqgUAAf34+AZ2OAp+LKLudpphoFrQ2dO6zIRb1igcg/XMIPWDrPpiHoiPAQHJ5xXIfvzWvRI9GacgpvJ86iBijiT6mEDb53LzYWEl9wIce6GcK4YCQbezr9iDOtSbgCt7TK41V/OJqxitCX3MoJ0fGMSPlMAp1ymHrI08KS/SjOEr7Dp2pb9e0jKnvgGW42peXzsKtLuBj/sBMAI7YWMSXMeEI0LTg885teL1g0MPMdyD8ZLXHGjEaMpZCSyXkFcCYw5U14qef2AolJdC3r9JUf/mlXYA27vxCuzng50FbMb6qCQzU1mNM+5T9rDvBqqXTQ9JMdQ/VE6D57W5VM+p0jImI5Z3UQdwVl0Gxz81VVfk8Xl9GXcdkDlvCXwFa079agP7usjO/pY4LohKJMhj32nUvvrhzAoEffvgBg8HAUUftWNHYFvY48ePEmFRC9Xoeqy/795pyw45VYQZdxMaudrcysaaAu2qLCNcbeC6pH/9L7LNt01NXEB9UjldCOv3zTtlHug2djoT0tyDseKZ7b+bTuu+5zbZp57VRh0OZ+CorlXftKKXRsGlT53ItLYpwfmwIZFZBSS9Ier590rfsA+8qEyKD0yFHmSUrfB6e+H4BRpcLo9/PO+EpmNwewtLSWNBaz0uNle3vWfEhQHAy0xxd99fUB4Bm0wF8GhhATKAQDR1XpV2MPhhm0dccSq7HyYLWeoZYwtGAsZFxe4X6bZglfDNlXqrRzPNBDbhvcGE1wBJGStQYAH605/C2+VYM4lYLt64gAoQpR6rWecqUi2JWmlxdgDdIBL9fTT3nma1oBgNV337NnGYbARGlNVZWQv8wqNLA8kQ7oULIfmB/GQQ4bA5kpcGcLpx0SkqUZeLgg2HZsvZ4Um/33zUR4XtHI5dV5DLUfh8nBhZiTH2L8Iiju93GZuj0kPQCRF0FVVdC69fdrmrQ6TghIoa3UgdyfUwqPzububgyl1lN1V3HkXrWqc9/qQAt9bl5oLaEg0MjOc+697TPrrB48WIOPPBAIiO7SLTQTexxARppMHJrXC9WultZ+G9lKAo7BrQGFZ4RRJXPw722YqbUFOIX4bHEPjyT1HfnyZRFgj/6LyDtYwg/ftf7qTNhTJuHxTyAl/w34fQUckVlHp+31HWfncXnUxrjH3+o7yecoDTSDhokAAsXKOabo5fCAadDbtPW5r5FBWA1wcAyZMOfLGip56qqfHr99DNacNKNWq7Sb8VlZDIpNo15LXU811iBVnGR8ky1XgxhJ0D9/V0uYLC/hwAbRGXLSZIadPqYTjF6QyxhOEVjoCl0s3A+bkf8sj0EnU63ORXZxVGJ1Af8ROkNWDus3CMi1DMfqv1JJUHCB29+1/HHzh/B8yskvwP6CKi+ihrHOqbUFGLU6Xi89z5KIJaXk2pvQR8ZyYD1ObxbUcjE6gJqVgXJKc4Oem2/8H7n9tdVKi/socPgOBt8/vHW3rUbN0KfPiqTzvLlar8UlKm/G6jxe7mztoiH6kq5Ud7mDP/bkPgcWLu/d7UVdDpIngkRY5X3umvHHtMdYdLpOcuawOy0wZwRGcecZhsXVuTyeUu9Wni0wbEIDElg6r3rff2bolULMM1WTLzRxLT43l1HD+wlNDY2smbNGkaMGNHp+Ouv79iM3xF7IfUAHBJq5eSIWGY2VlLl8+y4wj8NoYcDJnAtwaUFeLOpiksr88jxOpkWn8HM5P4cHBq5axpN/Qywv6tMc9twGNopGCKh1xeY9eE8772GcSEOnm6oYGJ1Qff4Qg0GJQhXrVJ7Zb16KZq9oAYJKEE2/14YBBz0Lpx4q9JIO9K5lZSofdMTT0brHwW5ubxmW8+o8GjGr1yP/oCgOXZtMN9qTAxnRMZzS2w6jY3vo2uZjZiHqHFJuB8866FlXue+ai6k4TEq9X1JD+QwIiQCK404dNZOxdYFc3YeGBpBTcBHuE5P9F40PR0cTEVmDwQI1elp1QKdtkR8erXXeRAF7C/Z6FD5SGl4tnNDIlB3P1gOAOu50OsHBCGk7FgsEuDppH4kmMxKANbUQFkZut69Mfj9vFhUR6sWYPWSF8AE2nWPqHJtTl5tWLVKkWj0+xbGDIWaBvhpZvt5u10922HDYPhwqKhQx2CHAjQgwif2Oi6vzKPQ6+a1kO8Z6XoC4u+H2Im7NrgdoTNC6lylHZafrGKCdxIRegNXx6TyTtogDgqN5OmGcq6symOZsxnRNGj9BCJP35xO7d+CgAgP1JbQpPl5OCFr65j1PYza2loOOeQQ7r//fgC+/vprNE3jkDb2rWCZZcuW7VS7e+0pXheTSpTeyF21xTT923KG6sOQkIOx2b/h0so85jbXcl5UAu+kDmRkeMyumwJb5kPd3RA3ffdW31vCmAwZi9Hr4JqWi3ghLhSHBLimKp+ZjZXbpzhrS12WkwP7BLWZ/fdvF46iQeWV8EMhjDkVoi5SprzwcOWV2YZnVPLvlRNv5Ol9b0HnEWbn3sYtMckYVq1q31ttYyAKaqSnhAa41zcNLxaejJiLX0QtYMJPgrp7OhN422cjgTrm688kQ4qZHr4JIwHqNOPmpORNAT/zWupINJjI97poDPgJ28s//uSgCXeNx4FTNEJ0et4KOmEAfOdUDlr76su5NzSbBuKYbzgbT8Mzyiu7Da0LlaNPwoOg01Fg2Ic5phuJopE33Se2O19pmmKPKilRi5/4eLJ+X8nrMU5OyF6IvZ+V2/Xn4B80SBFnOINeqCKwaJGiAtRHwLglYDXCJ1PAuVSVWb9efQ4d2u4Y1vZudEX9F8RGr5NJ1QU811jBCeExvBvxO/0ap0LMZIi7Z/cGuCP0YZC+QPHolo0G/655BicbzdwVn8Eryf2JNZi4u7aYx6u+VF7QEaf3XH//JnilsYo/3C1Mj++93ZjpPYUlS5awYsUKRASXy8UHH3xAamoqra3KkuJwOJg0aRL3tSV97ya6tYwWEVpadj933bTQOO6oKeKmljU8nJjVyQz1T0ah10VOy6Gc6HmewVG3cUHsIFL0FnytDrbjbrB9uNdA2UUQfjqYJ7ev4nsM0RD1OZSNoVfrWJ5M/4JPAuHMrSzm2+pyro1J4bBQ69bC32RS9H0FBXDAAapfQ4bAW28prcZ+N/zxFtQDx1/d3u/DD1dhL9deC4D2zTeI0cCU2BCOjT+BZtM96H74HXv0FcqLc//9ldDMy1Nar8ej2tp0JPh9rI17k4U2O2X2tdwZn0GY5V6oORL0T0LsDSBCfdEM8uVIqiLGYG99AireglZw6DSeKt7AgwlZzGqqxt/aymhrIm/XVqMBYjBj78Z4ezwePJ52i0vbb6g7dTui1t2Kv6WVNU43Rk3jNGsCs6tKOV0XilMLsKCigKN8gL4A7C48llHMdp/FKM8cKkpnEh93ndonL74ZjCMgcCR/1lTwcF0p6abLOLn1BXRUQ+FkSHig3ZReVKQ0xWHDYOUyyJsFfxipO2IMuQ31rAw1MwRgwgSVrq6gQIUjHXNM+3M94nhYthxyx0LaZ7B0hTLxp6W17522EUzodFu9x/aAn3eba/i6tYF0UwgPx6Qw1DEfr20iXuslEDJdWS96FGawfgRlx0PeuZD+8S7nyU0GpofEsxILVdUvUeULZ15dGuP9TYTo/x1a6HetDcxpqOCa6BT6+2RzEofdRWRk9612o0eP5sorr8Rms3HNNdcwY8YM7HY7d911F0uWLMHr9XLnnXeSkZGxU33QSTc8e+x2O1FReybe7T/8h//wH/7Df9hZNDc3Y7Vad1xwD6JbAnRLDfTggw/uFi3ZtsoVep3caSsmw2ThwYRMQvWGbre5M9e32+306tWLsrKybg10T/VBRAW+v95UjSZCzRvvsXj6IxgrLwbfJuj9S+dUUDvTBwlA+WlonjwGj7ax4s+9cG/eQig7DRDo9Tli6sNvLjv3rV+BOTmJkyNiuSAqSVkUJk9WsX3r1imi93POAb8fT3IclquA2x6C29cq0+vixe3XWLMGjjmGlW+/wbORJt458xJaLjgf68yX1fkHHoC334ZLsuDVFZD9Okz9lsaPPiImOhqOPgTu+Q4MUZC1aTNReZHXxX21JeiAmrtv5atp67CHHMMKj5tBWg4xfVYRZjBB4xtQezMYsiBQysjF0wgfewICvJU6iDijiWsq86kI5vicl94eZ7itsd1SA62qquKQQw4hOzubtLS0bj+Hj5prmd1cjQ+VReSQMCvvN9Uw125DB7wR/gvRttsxGgBdCPTdBPpwVtZ9xEENVzEz5Emu89y8UnINAAAgAElEQVSDWC/kPctU5tprOS48mpti0zC17cXZ50P15eA4EEb80d6JRV/BsolwbwE8fSdMmaGeXXw8AREkKYmapATOuftmvp/zOaEi8HmHsJeVK2HkSPjuc0i4C07YwMcmK2flBPmHR41S9IGLFimHokGDyHY7eK2pinyvC9ePvzDvwiuJNZig4WWou12FOyX8b6vf0J6YQ9yVjxDS+ijOmLcISzhj19v1ZEPJ4ZD8NhWhY3ipsYLVbgdHhVmZEJ1KvHEbXtM72d/ult0bc2Ot38vk6kLSTGYeTsxqf9d2s9027IwGusewK5RIgwcP3u1yOW6HjC1ZK5OrNoorEOh2mztz/Z2hTtuZdrdXtsbnkduqC2VE8Wp5uLZEGvze9rItXwRp/Vbueh/qZojk6KTVtmDv3pu3TKRwkEh+oohrtSq37zB5v6lGxpaslVNL18nHzTYJ3HOPSEKComb7/ntVt/kDkWMRObq3+j5woMiNN3Zq3h8ISFOfLPnynNPk+TGjOtcXUf+30b8NjVWUe9MvER+IpKSIHBGuxrZ16VZdt/m8MqEyT47NXS6rq18WyUHcOWZpqL6nvZCvRlH9FQwUyUGOO26QnFC8RkaXrJFGv09ERO6u2SQjgjR6GzvQuHV3bMvKygSQsrKybpVva/d/tSUyuniNjCheLQVBaro5TTUyoni13G8rEqm5TSp+Mqj7Lz62vQHNL015KVKVkyz2vGS5v3qNHFe8Wg6cfodoXdE2lhwn8hlqnNVSTSTvVJG5ZnXs1FNF9t23c50hQyRgNsuoJQvFbbFI5SMPdz7vcokYjSIvvCCy5kcRkIqHjSL+ID3gWWepNkEqaqrkXluRjCheLRMq82Stq1WNgaaJ2O5W91czdZuUk3tkDmlqlM9eRLTcKBFP4a63W3GpyMZ0EU1Rm2qaJvtfe6WcUbpexpaslXnNNvFvh0qzp+9tT8+NpV63nF+eLePLNkiDf9t0rnvime1N7JIR/oYbbtjtcoMsYfwvsQ+5Xhf31BZx7cQuki3v5vV3FjvT7pZlRYQFQcL3TT43jyRkcVd8BjEGU3vZ8NGK2m87jCfb7YNrBdTeA7G3E7Ac0+2+7rDd7pQ1pUPGT2DqBaXHguNHbrj6Gs6PSuTdtEEcHRbFC42VvB5tUXuUAElJ4PwFqi7BNrQXLK8Cm02FMQwfvrnploCfO2qL+PyUExj5zQ8M+GqRytPZ0cX8mGNUwP2aNdD3KEW5lzVHbeLr3VDrgIgzIHzroOgEo4nnk/qRWdvEZNeh5OqGYMFLjPXU9kLGRNCFQUARPlw2+TR8CCadnntri/FoGiadjrDgKnqDuz2udE+/j2s9DpTeC07RWONu5Y2mapINiiEJTzZ6c7qqZBnU3oDOgNUymGSq+Z/hdpa54eGELC5PSO965Z6+EBrbNaFAvAm0L2G/V9SBJUsgyNqyGYcfjt7r5YCx52Lyepk64iC+bO3AOhUSovZQ//wTvl8FIRZiRln+j73rDm+qbN93krbpHrTQFihLhqLiHih+VpYgiqggKi6GooK4BVEEB04URVCc4ED9HCCCojgYAiKzLbTpbpKmTdomTbPnOffvjzfdLUOm/r77unqlOec973nPyPu8z7ofwDBGBHQlJUGyWhGMVON2twn5PjeeSM7A0rQ+ODMyBvdPvwcwTQEs84GOr4i/drSOI37H24JCidtnAVQmARXjhC/5cPsNVAD2z0XAUyg/V6FQYPIZ5+CTLqdiaEwSllgrcZ+pCAW+tmkBj8m1HQYOp8+bnpyJ+01FiFAo8EZabySp2teuT/R1HTFOtATf63HwSl02Z1WV0C9LR7Xvw11l/V1U+r18yFTMTG0WXzHr6ZCC7TeueUaQvPsPkzhbcpDFvcmy80nZd9yurRWCNlI3hNSEk3UfN9tV5HPz3W8+a9BgNPt+FCTj2v+Qhbli+8svi8+//iJJ6v1e3mrI42j9Pu7fs1NoIgDl6OjW5544kYyIIKdNIyUvWTCEVIBMBRkNMug94NC/Cmltf+ZfyqBGRZd+THNtJj86RCSv5h/lT/GG8v3M8Tg4QpfD2VWlfNhY1EC8Pt1YeNi37nA1UJKsDfiZqc3idfr9zNRm8eu6ao7S5fAhUzF/ddYyU5vFQFEPsqiHeCbVTzYcK3tyGNREkBrw3tJPOFyXTY90kN/YkvENz4+XgKxbQQYCoigAQO7e3bz9l1+KZw3Ql5nJV816Zmqz+JbF0KhRTZhAXnopOXiwIJp3bSXzIxiomMj90++lIz6WZf16c0Wdid6m45OcpP4qYW04BML3Y4H635mjZgOpUZE1zx9+J1WPkQXx4rfTDnK9Tk6uyOdgbRbfqa2g7yjPhS1xrOaPbS4br9Rlc7qxkLaQ5ebfjBMeBnZ2ZCye79gTuz1OPFejh7+tZPe/CbVajblz50KtPjZh03IoL22SsRCVAR9e7dQLjyVnHDjHKekBQBkjSnUdDqpmAEEj0PlzQBFxzK+tXajigYx1QMLtgPEOUbMz5EbvHRGFuy/ObGgaZb8XNYyDJuUzoE9/kdayZo3Y2bcv9nqdmGYqghIKvJ3WB6efcz7ks85CqlIJdmqDpeT66wVbTUQEoFQDvb8HYhWiXqgbgLn98nk1QT+W1hmRAAkXIBvbw0Yi2vUdNMZnG5mL6AbCuoFKNeDZiczoRJwZGYtnOnbHXx47SgNeJCpV6BoWgVyfG7bDTMeqf1aH88yWhdJVJicKooePbCZ0C4/E8x174JKoeKTBgrCgFghqAVVHUdgaQG3AjurycdCjKzyKJDwUvgt+Eo9XHyS30dADCFEZ45xhQMItIjVJrRYWgHPOad4+xBt6KgDF7bfjkQ5dMaNDF6xymDGruhQuWRK1XnNzgY0bgRtugDfyYmyPfx1h9mXwKLIQ6fWj8xln4ZaEVKjrI1MDekA3CPBsBjJ+EOlOJwD1v7PwuIFAh8cAy7PNCFEOCskO1L0rqAJV7fsa+6tj8G56X0xJTMe3djPuMxYdedm0A+BYzB9rHRY8VVOGCyPjsaDTKf8/sixOtASvxzaXjcO02ZxaWUDTcSpvcyQo93sbtJHXzeV0HUjrbAnLa2I16ztELcYpylPR+sHfG+yxgCyH/LEgDeOFtlC/PTaWBBjcFcMn9WuZqc3iI6ZiGuc8KTTIDh241m7mEG0WHzUVN9fYFy4Ums5ll7U+p8cj9g0dKr4HasgeIMNCGtPPc9sd7gRDHjO1WSypFX5oj2snt2vvZVCj5IMl7zPb4xDXYpxOakCrJpF73faG4/9w1fEKbRbH6Pc3aH6PmIoP65Yd7qrfGPBxiDaLo/X7+LtDnHOCIa/Zyv6/5UtC5cS6kKVnU66cyl8cFm4sHEmvRs2d1i1k5USy5DQ+bBRWknUOS9snlJzkyDSye+h+vtNXbPd6SZWKPO+8to8DxH5nY6m9XW47R+lyOKkin7ZPPxFl0VQqri7V8Dr9fg7RZvEv7TTK00AqFaIMXj1cf5CFHcniHn+rDOAxg+QhS04jyy4Q5dAOBTXPC8uAv+KQT1Pkc/OOCg2HabP5ta2a0tEoM3gMIcsyl1mNzNRmcaG5/IC+3H8bTrgGWo+B0fFYnNYbdVIQdxsLsdtztHO7jg5IYpXDjCnGApilABamnoKHkrseXnJ94n2iSkvNISSA0w9UTQOiLgMSJv39gR9tKBRA8iyg8zciQV93MeAvFtszBB2hquNSPNv1KsxL6Q6rFMTDwwYCfj/qYqOxoNaAUbHJeKlTr+Ya+xVXiE/vAVbf27eL/ZU3AV0ABAGoFMAfzwC1r7cqnbairgoVQT+ujElCr+AWQNUJkVHn4qJui2BRD8LT/sfxklGQ/QfCT4dd1RuJqMPpaOTvHRSdgP4R0XDIogxTLJTY7XVi/TGipwySmFejhQTgHHUsXrCIqNXpSZ2brewvC/4IAPB2fAE+En96nTCYZuNyaR2CaR/j/MRLgZhhgF+DFztEIwIKLLQY4G1Jrxc0AfpMoKgKkEIqaMdCwJsr2IYkSfDXtoQnxE4VEyP+QjgvKg5vpfWBS5bwSqQ4l+bcAXhT6cNFUXH4pPOpuLDbIigCPQCZwNkharu6DwD9YCCiP9B9JxB5EnHGKiNFCTTvbqB24cHbB/SA5QUgaRoQ3vng7UPoHRGFd9P6YnRcMpZYKzGzurSB2ONkg0RiQa0BH9uqMCUxDQ906HJCKfqON04aAQoIYux30/uiX0Q0Hq8uxQpb1aFzsB4HOGUJ88w6LKqtwMjYDvggvS/O/jsVOZSRQMo8wPFfwLvnwG1rXxeCKXVJu8ETJxTxNwA9/hLVYLTnA+YXga4hlhz1MCgVClwek4j30/ti6rmXwp6YAIXDgRRVGAa0RZhfWSk+9+8XbDhN4QoF7jidwFfvA+7fgd4dBJFCSieg+Ayg+hHANLUh2MMeDGKZzYQYhRKPd+gKuLcBUYMElZoiDJ0yvkV8eEcsDU6DDOBjuwnvRzwBAAi3zG92+q7hanQPj4RNCiKgIBQAFlgM2O9th6j+b4IkXrcYUOT3QAFgk8eGC0N0folNAzLkINK861GLDnjWdymqA3WIDpbjzuC7QMp8xCSOF+2iBMF6hHcbHknuCj+IuTXaxn58eYD2YsBaDpQAqLKJ7TEATHcCb70FJCW1zRS0fHn9oFvtSlCpcElUPPwhIWsadAk+7XwqZqZ0Q+dwtXgGllDllK5vAZW3iYooiZOBbuuBsJRWfZ5wRF0MdHhIsFr5Sw/ctvphkVaV8sxhn0atVGJ6hy54tVMvaANeTDYWYJOrfRfFiYBHlvBUTRl+dtZiZnIGJhzj8n4nI04qAQqIOqIvduqJCQmp+KDOhKdrtHAeiDruOKHA58bUkGb8TMfueKBD14PXGzwQEu4AIk4DTPcAbMeXFtAD5udEIeSTaSXeEurTgR47xeRing30D/l6mhDI+0msd1lhT0xAgtWG87UVeN5Sjtsq87HSXgN3/TMuLxefPh+wbFnz89RTxg0YACyaA4BAnwlCgHo8wD4CaR8BtuVAQQTgL8Ecs9DinkzpBqVCArw7gKgm1WrCUqDK+BnxigAUUKGrog5rcR7MilTQuRIM1DQ0TVaFwy3LeC+9L85Ui1JfYQoFnqwuhfYo+quW26qwzlULAlAAeCy5K0bGipJfHZsIUF/Vo1AggM/C7sJOrxOdYMdZ0h9Awp1A8hONHYZ3BcJ7Ap4tGB7bAX3Do7DD68AejwNwrAF0lwj/XFVIew+EtJ2MgcCOXcCOHUC3bq2rpQSDwKuvijzOQKOGVOz34EWzHuMNGqxzWXHbhj8BADsy0lEcaMGnXGYAwlRAwj7A/iWQ/okgdVccnyLLfwspzwKqZKDmyfbbOH8GHN8CnV47oO/zYDg/Kg4fpPfDuZGxmGfW4UWzXviVTzAMAR8erCpBlteFFzr1xIjQ+/n/DSedAAVEiaBJiWl4oWNPZHmduNdYeGjFaltg3rx5OPXUUxETE4OkpCQMHToUf/3112H1wVCg0P2mYsQpVXg/vS/+czQqcSjCgPRlwhxkebntNlUPhVaw85ptDgQCmDlzJs4880zExMSgc+fOuP3221FZr72dCChDJYEUMcCAkPn9Z0E07pIlzKwuxR6vE8nqSCAyEjO/Wot30/rgtIhoLLFWYpwhD4tqDdi9UfDh/qJSoXzGDGRv3954jrCQ6fLqIcBuG7C3B9DjIjGx2+0iUEUaLbhMAaC0N4LubTgjIhoDoxMEoTw9QtA3RUQPIONnKEAMDXyJONqwRj0dCkjI016P35y1CFBGSlg4zFIAMUoVXu7UCwPU0fBQhosy7jMVobCdFIQlS5agf//+uOCCCw54C0likcWAT0KBQwTwTEp3XBWbjBo5iDAokKQKQ3XQj//WbIPKthg+qLE7cgLGKrZCTSsU6gFA2vutrRWRFzRYO17q1BNhDEJb+RBQMRqIzgS6bQF2lggqxk6dRMBQny+ATwBkRACdO7cSoJpnnwXKypDrdCLg9WLBhvV40FSMu4yFyPY6MSUxDV/FdsaZX68EAZwpKfBMjQ4/OCz1FwyU5gOxkqhQgqDgoD0J8OKLL+KCCy5AXFwcOnXqhDFjxqCgvrC4MhpIeQ5wfNl21RbZB1RNF8Xh42464rEkqMIwN6U7ZiVnYIvbhimVhQ0FDg4X77zzDgYMGID4+HjEx8dj4MCBWLdu3SEfTxLfO8y4y1gIpyzhzdRTcGHUiWUDOpE4KQVoPQZGx+Pd9L6IUChxn6kYv7kOr+Bu3759sXjxYuzbtw9btmxBjx49MHz4cNTU1Bz8YAiT7VyzDousFRgdl4xFab2RfjSJkKMuApJnigoZ3uzm+9zbAOdKoOOrrVawbrcbe/bswZw5c7Bnzx6sXLkShYWFGD169NEb2+HC+gbg+lmUVLsgVKHj5yVwWz/EI6ZilPg9WJDaC1E+P3DeecCHH6Kvw405Hbvjyy6n4Yb4FGx02VAJMUnnv/oi0gB0bFpPMjJUXDxjgwj7fC9ZcKoCjZ+//RYq7rwFRcoz8KZ/Ml4NWyVI7BtqMbZRcFl9BhBxOhRSHd7wTcaNqeMhIQqnS1uwu+otjDdokOd1IQiiIuiDUqHA3I49EAkFUsMi4KGMe0xFWFJb0Ypsf9q0acjLyzsg40qZ34OJlQVY5bQgAkCkQomRMUkYFCMWa1q/B0mqMMyp0eI2Qw7Orr0bKhBy4t24O2wrJrlniI46PCYWZ62u7yzAlw2QSGI1PpJm4NrAMmTHzRFFzFXxoj5rMCiKXXfvDhQ5gR8BTPIDnrrGup0A4Pcj46OPkN+3D8LOOwcqhQI/9EpFEMTclO5Y0eU0jE/ohLiPlgE+HxRxcRgph2F0XDIW1BqwsjYX2DUCqHMDaUlAryJRnNs4CQhWtR7/ccamTZswbdo0bN++Hb/88guCwSCGDx8OV70bIeEOIOJ0oPqx1uZry/NAQCtqjB4lk6ZCocCVIbdRSlgYHqoqxiq7+bBrLHft2hUvvfQSdu3ahV27dmHw4MG49tprkZt78MhiSzCAJ6rLsLBWEPp/kN738OoW/xtxIiOYDhUeSeLzNVpmarO4yGL42zlS9VGQv/7660Hb5ntdvNmQx1G6HG521f2t8x0SJC9ZeiZZOoCUm0Qf60eQJf3JQ7zWHTt2EAB1Ot0xGugB4M0l89Wk6SHx3WoVUZcRSjIL3Fn4H5a6QhGrqankrFlkdDQ5Z06zbnyyROOYaykDIufxlhvojotlnkEnmHPcbhHx+YqCXJwm/l+zRnxOmCByFSdMIEl+a6vmkLKd3Km9V0Sp6oeTlfeQRd3av47y61hRdD7N+WlkcS/ScAuZr6aUH83PqtZzpC6Hmdosji/P5XKrkfu9Ti6rNXKoNpvr7GaOCeVqDtdm83VzOXe67c1ym1tG4dYE/FxrN/PeyoIGhqOnq0q50FzOEboclvrc3Oi0cn6NjoND+++qLGCpfgplTYh5yPQwqQH/KLhcfHdtbfvaHGvFfvMbZEEi5cJ0Plb6IYdrs+mTJPHMlErBGnT55YLxaexYsltnMhvkWQnklCnicUsSC16eT0mp5JR1X3HzVcMoA3xv3drm53S7ybQ08s47yZQU8oUXKMsyfzEup0XTgf5nosWzu+km0T5QJZiu9Fe1yzZ0olBdXU0A3LRpU+PGemYxR5Prdq4XjFY1zx2zsQRlmYstBmZqs/hSje6Ic0aTkpL4wQcHjvDf6LRytH4fr9Pv5zbXcc49P4lxUmug9YhUKjE7uRtmdOiC7x0WTK4sOOwoXb/fj/feew8JCQk4qwkLTkuQxLf2Gkw3FSMhZLK9LPoYEukr1UD6xyKQwxwKNvDsBFw/ASlPHXLdQJvNBoVCgcTE41PouQEMiHzQ8J5Ax1DQTUIC5NhYKPwyvt59D85BIXoazgdsn4hSWXFxwNSpwKJFQG1jFGuEQok0dSQUAF5iLF6Mi0OUw4mkiy7G7ZX5+MwbCqLwEpiwSJTDeuUVIDkZSEsT/Lfffw85GMT7dSaEKSNwdsZioOtP4v7aPgCU8W0GvIgB9EOkXImPE74WZjrnaoA+KFXJmGCfglVpKYhVKhGpUOLr0DvytaMGKgXwbp0RdySk4uLIOPhB/Oi04LHqUlyr348HTUV41VyOZVbBcvSiWYc7K/MxriIPC2oNKPB7EK1QYlJCKuKUKqx2WhClUGKSsRDzzDoU+txQQYHr41LwXtRW9HR9AEVYKqDqDFhfh6PD01ijGiuuITyj7WtThQJyah4EYkZA0Ws/LksZDT+IhbUGYN068WyuvVaYwjt1Ar75Bnj6WSCmD+i0oSpShQWWckzM2YL0+S9h24QbMebSwRjYqQsUAFLtLcyK774rWKmeekqY3wM2KCpvwtC6O+FWn4u89aciqFaDPXuK9mGdhFvD9SNge//w3sNjDJtNBFZ16NDE1xczUphpqx8XFo5AJVA5QUQ9J88+ZmNRKRSY1qELnkjOwG+uOjxgKmlWH/ZQIUkSvvzyS7hcLgwcOLDNNk5ZwgtmPeaZdTgrMhYfde6HgdH/f022LfGPEKCAMGFcF5eC99P7ooMqHI9Wl2K+WYda6cDh3WvXrkVsbCwiIyOxcOFC/PLLL0hJaTu6zyvLeMasw2JrJcYcC5Nte4g8R0TqWV4QNT4tzwERfYG4Gw/pcK/Xi1mzZuGWW245/tUJLC8B3r1iEaAUUZo1UhD67l3hTIjHqPW1UPXKFcW+jXcAsAE+EzBrljAXvtzC/6sSgVmpUGHPu8shR0YircKIIfsLscJhBuOBQF0EPlf8B9WvvAT88YcQnlotMHIk4HDg+++/hpcypiSmI0ypFCbdnvsFgYV/v0jXaGkyBwD1qeggVyIpIh3o/icQG6Ktk2yA7IO68joMVCsQq1JhdcYZWJLWG7ckdMLpETGokyUsslZgu1cs7OrDwjwgsn1u/OiqxTcOUVtyi9sOXZPC8jIERd9Htir86LIiWqHEJVFxmJ3cDV91OQ1PduyGAIirsF1EqUZeAgQrAckMpH+K2I7z0J1a+BAJhLVIl6AEWJcA+uHie8IUoMsXgKoDrolLQSdVONa7rJAWLRL7J08GzGZgyxawTx/8NW4Mvot8EAoXYOFW7PU68dSSZYiBAoMWvIlRcckIC5U/k8OamI4dDuDFF4Hbbwd69QRkN2B5U0ROp69A15gVOHN7NpR+Pzandmg0RcZeBSRMFqbRgOHg799xAEk8/PDDGDRoEM6or2EKCPNsx/mAPw9wrgEqbxZUfemfHZeC2cNjO+CttN6wSAFMNRZhn9d58IMA7Nu3D7GxsVCr1bjnnnuwatUq9O/fv1W7LK8TUyoLsNVtw6zkDDyT0v24FpL/R+AEa8B/C7Is80eHhaP1+3i1fh+/t5v56WefMSYmpuFv8+bNJEmn08mioiL++eefnDRpEnv06MGqqqpWfVqCft5TWcgRuhxuclmP9yUJU61hHKmJFGahJjR5n7VzbSTp9/t57bXX8pxzzjn+tH7e3Fb0cTUBP28zaPjnVcMY6NmTjIoi7SFCAsdPZJqKvE9JVj/JfddfQzfAflFRjdd1++0kwLKSEgJgzubNgiz+vPPoMX9F9gErbz+VI0Lm1N3DB9MXG0tfRgaDeXmUAWZfeC7H6Pc1H6sskwWxZOVdZEk/UqMkjfcJMoYQAq4/SQ24yfxb4zGmB0JEBR3J/GhWl1zCUWXbW1HifWQ18gptFn+0W7jf6+RvzlrOrirlEG0WR+lyuMhi4F9VlQTAewv3MFObxRvK9/O92kructuZ73VypqmEV+lyaGxBJPJfWzUfLl1GOT+aLD5dmAjzY8T9D2Fb8TWsKGpBdOD8jSw9V7Q33k0WZZBVs5o12e62cVT2ZsoKBdmvHx2rVjZQ+T316VJmarN4m34/5XBQejKC8tatwtS7YEFjJ9dfTxngqlWrGrfNnk1GRpKFP5LaS8hYkHPObbzfCxcKczHA6d8s49u1FY0E90ErWZRO6q8+KUy59913H7t3794+BWPZhSEqRRXp2tx2m2OI2qCfM4xFHKLN4mp7TduFAprA5/OxqKiIO3fu5KxZs5iSksLc3MZ3ySdLfLu2gldos/iAsajV+/g/NOIfKUDrURcM8OUawb15j0HDDUUFLCoqYlFREd1ud5vH9O7dmy+88EKzbVq/hzeV5/H68v3MD1W7OCGQXGRBkvgh+ht/rHa7veG6ml6b3+/nmDFjOGDAAJrN5uM7VlkitZeRJX2FH5ekOSQ8x5Xn0vb0HDIpSUzG777beNxpp5JTLyLzIyjtTmOwYzwdI65svK6JE4UALSggAO7du5fcvl1M2o+nkoNAjrmGXkniVlcd3/1rMwNhKhLgxG0/03BKD0oKBb/WFTafSIJWIQhtXwpfs3kBWRAnhGr102SwjpVeC4MaFcuq3mx+rfpRgo9VE0ZZE849+edzh7M5l3FQlvm4qYTX6PfR4G/k5DUFfJxfreUV2iz+Z98WAuDVudu51m5uxtiyPMTk8kcb/vb3DR/Tr4kQ49UgVHWmuR+/qqA3/yy9TXzx7BI+Xw3IsotI93axXfsfsuLmZsd5JYnrbr2RBPjmh2/xq8kTKCkU3HHVcH5kNbLE56ZcXi6e40KQp3QmL75Y8OPWY+RISk0FaFmZEJ4PhoR3yelkeBi5ZEno3ZHJ/v1FPwDXlgkf8IfWysY+7atCz+vzVvfjeGL69Ons2rUrS0tL229kvC/kj37g+A2sBQKyzDct5czUZvFVs/6w/KJDhgzh3XffTVmW+bvTypsNeRymzeZ/bVUnPQvSicY/xoTbFhJUYXg8JQNvpJ4CjwJ4LtyDX5Oj0aVXT0S1lfQNYY5pWqNxr9eJ6aZiRCmVeDutD/qdyKgyegDZJfxvFWMBWeQWxsXFoXfv3g1/UVFRCAQCuPHGG1FUVIRff/0VycnJx3estuWA5w8g9R1AqYZVCuCR6hJ4KGNh6imIP4igHesAACAASURBVO98wGoFhg0DFi9u9DsmJgH+/kBPDZSpl0L1mB2xP/2M3prV4pmF2GyUIZ8TAOCii4AZ9wBvVgGxyUBlFdRKJS6JTsDdF14G5aOPAQCmf/czFj/5MJQkEqfPwA2GPDxdo8UKWxX2O0M5qWFdRI5h8iNArxIgcSpQ+wpQ0hNhtS+gFKcg2d8kdQYA0pYAUAJRFwIKJc7mbvStuBAIlDc0USkUeCqlGxKUKjxeXYoyvwcbXXV432rEVo8dBJASyuGsk4P42lGDT2xV2O914QeHBcttVZiYkIZBLfztvtq3MMkxEWHwC5+nMhGInwDEDGlsJDvRUS6BnRFA+QhBaBHQA11WClN01EUAAKo6wRuoxi9OKxbVVuBeYyGuK96DK75eDVtiArYOH4xrV/8EhVKJC5Z+gImJaegVEQWFTifO8xuACpOoy9rUXOvxoMGrLDmBu64EEn3AbcVAp4VA6lYgEATq3QvbtgF5eUBGBtClC0b16Iupien41FaNFaEUHsSNAeLGAVUPANLxJxAgienTp2PlypX4/fff0bPeT9sSznVA3XuAIgqQji6hxuEgTKHAjA5d8XhyBtY7rXjIVALzIbIXkYS9YwdMNxXjWbMOPcIj8UHnvrgxvhOU/8+IEQ4X/wqD9lmRsXg/vS++sotJaaOrDndHp+DXBW9g9OjRSE9Ph8Viwdtvvw2DwYBx48YBAH5y1mKBpRznRMZibsceByaBPx6wfwFAFvR4FdeKgIQuXzaUQKpHMBjE2LFjsWfPHqxduxaSJMFkMgEQQQ4REcc4CT1oFj6q+FuBmMFwyhJmVpfBIUt4M7U3uoSrRaoKAAwcKIphb9okypMlJQEWCxDRC+jyDXDfRmDlNcB9jwJ9foQnuQ+iABh/+QUAGnLvek/xI/Y7AHtkIFgsBHLox6189lngzTdx+tIP8MSO9fCkp2PIj7+g0kfsDQ/ic1s1tgfz8BaAx8y1UEeWoWu4GhlhamTEz0PX+PuRaHsTSXXvIxkOwFUBeP4EIi8W5wjvDnScB9TMgaLrauirF6CbfyNY0hPo8BjsSbOhkxQoCXjRLyIaG911mGQUArtneCRujO+IzJhEJHn8WAlRFHtHmIxvQ+8rIAgSvLKEDa469IqIRGqgAJFVk6D27YEPavhSXkR8sBCwfyZKetVDsgI1s6EAMdz/IaA4C960FTBGjUaVLEPvqIEu4IMu4MXVXqCnZMQLFj26hkXgNHUMHln4GtQ+H756bAYGfPsdIswW4bfMaBKMpNWKz7UAZhPo3QsA4HQ6UVxcjD41NYgAEC99iuCi2xH2qwNYdg1w1jJBOFB/fKogxMdrrwH9+gEmk3g/ANyU0AleyvigzgS1Qomx8R2F8C3tJ4LrUg+BOu8oYtq0afj888+xevVqxMXFNfy+EhISGhfnnj+BihuE31Z9LlD7EiC9JK75BGFkbAd0D1djbo0W95oK8UqnU9AzIrJh/+zZszFy5EhkZGTA4XBg+Q9rUHXDCMijhiMOxGudeuHcqLgTNv5/HE6wBnzUUeH3NhS0HvrrdzzlquGMiIhgeno6R48ezR07dlCWZX4UMpm9atYzcLKYKUrPJcuvFf/bvxf+RcPYhiK89SgrKyNEnn2rvw0bNhz7cRqnkgWJZKCKXkniDGMRr9bvY4mvhdm8Z0/y/vvJM84gR44U2+66qzUpeVERGRVB3p5ELhX+t4Xdml9X3a54crVakNEDZAt/lHzHHZQBrp44gVy+XLS5VtxLSZZZZRUmwWXVO/iYqYQ3G/J4RSg1JFObxSu0WbxB+yfXFo5pMJNaCnrwT90M3lH6La/R7qapsD8rC/vzgcpcPlL8Nu2aeMoa0KOJ5DeFN3NK6TecVJHPp6pKOUKXzTsrNA3FuMnWaSy/O2s5RJvFiRX5fMJUwgn6XXym+CXuzj+/YQy7Ci7h9WV/cnn5clID/lb+LBfVFHJlxXLuL72efo2akkZBryaSjxUv4VWhwtv1fyN0Oby7soDza3TUlY0iNWgkozeZhB8yLo67C/PojI0R902rbf58ZswQKUKZp5K5IC1vkCQ3bNhAdQRojgalGDC4EfTEgDmndG5+/Pbtot+9e8mCAtHX0qXCP97ElyrLMt+prWCmNotr7CGXhPkl4dLwtvBpH2O09/tatmyZaODdL9wt2v+QkpsMVJP5EQ335kTDHPBzUkU+R+v3UdPELTVp0iR2796dUSnJPGP+U8ws3sVrinbzJ4flf+bav4F/nQAlxQ9xq6uOd4Xy6x40FjHL4yApHOTza3TM1GZxRZ3poA734wZPtpg07U0CMeyr2xWiJwzefSIAx/I6A7LMJ6pKOUKXw/1eZ+u2EyeSZ51FfvGFmEB37CCfeYbs1Kl12zfeEG2WThWft0IEZ9i+IX36UC7nVWLCBcSk3gTrfvq+sY7l55+Tycni/99/Fw1sX4g+go0VVnyyxDKfh9tcNq6xm/mYqYTXlW2kpFFwc+lE/lkyli6N8DuW5ffiruKrGNQouaX0do7U5XCKIYvasutJDSiH6m6ypB9ZNZMVdb/wRt1u3lGhYXVAPLumAnSt3czB2iy+bvqLAetHwjdZEBvqK4yB/Fj+XPkRB2uz+ED5NjryO7CyoDf3FA6hVxNFakBTQU9+X/YozQXduaX4RvFOW0381VnLHI+DxoCv+aRY2EmMsR6jRol79Oyz5NCh9KkjqO3di1LTACm3m4yPF8Ku2iR8wcV9yWAtWTNf9BkDslsMefVg8WxbBun997/iPBaLyAlNSyPXrxfbdu5s1lSWZS40l3OwNkvkX0tesrgPqbvipAgoIkl688miLmTpWWSwic9aP0oI1JME9mCA04yFHKnL4Z7Q/OeXJX5tq+Y1+n0cqcvhp3Wmg9eI/R/axb9SgNZDlmVuaSJI768s4uSKfA7TZvM3Z+2JHl5zmB4SkZ4tBeXJJkT1I8ji3pQkL5+v0XKoNpt/uduJ/v1ElLGiwUD260dedRX58cdim7OFwJUkcsQIsmNHsf/qgaQuU0z4+fGhhPVfxCQaESE0py1bGg4fo82muWMK5X79yJgYct480U9GBulykdb3RR8HmIQ/rTNxjH6/mAT1V4fG5RWLmsopZFH3Bs3QWdCZvxeOoKd6Pml6jMxPJDVRZNkg8RxDQjW/4Gyu1tzA1xf046x7OhIA/8idxt8LhtNaUN+fgiw5U5TKqg/8Mb/KPP00/pV/KWVNeGPwkPYSoZV588S1+LWkBsypXs5MbdaBy+rVPC/ORTYKtZgY8r77SKWSQbWa7z82nV/UhQSgLJO33ira3X232FZ6dmgs0YI8wziVVCnJXr1Eu9WrW593/nwRUJaXJ4LBFi0in3hCPOs2Jm9JljmvuozDtNnM8ThIx4+tF5cnCu6dZGGKCIwKGJvvs34o7m/AdGLG1gbcUpCPmoo5VJvFpbUVnGDI42BtFheY9bQET4L55B+Of7UArYcsy1znsHBYyLx1d2WB+GGeLJBlwZBjnN72/nohWj5GROqeKDjWhSaylVxiEWHuvzsPkPJjNosJ8733GifsJUva1DxICpNiaqow8Z19ttjm/ovUqMV5C2LJysnkpWcJZpukJDI3l7vddpHSMvE2sksX8swzyd69RfqLUikEhPW95tpXG/jQauSN5bkiQjc/spm2SlI8J2+RqLupiWB+fn/682MbhVvTv3w1mR9FWaNo2GbbKcyAtp2gHNI0qYkQz7bF8bJGSVN+V9YWdAsx28wng20sVCyvkflqbncIq4o5cIBJ0bKIzI8S9zkpSdznG0UELu+8kwR4x6a1vE6/X7R/5pkmWv10UQezfoy6oUJQuFxiv0JBPvhg2+edOJE8/3zyhhvI7t1FfdGzzyZvuaXdofpkiQ+GXAOlPo84X0l/Uj6MurtHG85fxDuoHUgG26ipGqgR1hnre8d/bO3AK0lcaatuYNGaXJEv7uf/cFTwj47CPVTYZQlf2WsQp1RhRlIXBEnMqCrBo1Ulf5uU+agiUAIE9SLhvy3EjQa6rgRc6wUJQNB4PEcnQBmoeRyIugyr5EH42lGD+5O64IqYAzAfJScDl10GfPcdMG6cCBhZulTsa4t7MzUV+OorMWXn54tt4d0A+IDoYUCHRwHXr8CAbMBvAdLUwIhh+G/eXigA9Js8FaioAB58ELDZRPktWQbefhtYvfugl+injAiFAogfC9ALOFc1b6BQAOreQLcNUIR3R4rCjQei1kE6pQrosUeQ2HeYLViZ6APCukKROA2B1I+wIuYtzA97HgCQn/Q2FB0XQhEzMhQgJgPRg4G05UDGr0BPDT5NLcV7YdOQJOtF0FDK7Lareti/AGJGQaESz0FqjIdtDUUYEAwAt9wiKtskJQGrVgnyBIsFOP98nNb/TFjlIPQLXgLmzgXG9BbHdlks2IzSVwJQArIVCEsFfvhB7O/atTUpRj2ys4GUFODbb4HnnhMVd7KygOuua3eoEQolnuvUE51U4ZhZXYraDs8IwgL7Z+1f37GE/RvAMEqUwsv4BVC1UX0kLAWIvlxUYTnBsElBfFxnwviKPCy2VuKCyDgMjIxHScCLrEMkXPgfDgEnWoIfa9iCAU6uyOd1+v3U+sXKS5JlbnJZOakin5naLD5kKuYfrroTV0m99h0RKNGWhtEUnt1kUWeREO/JOj5jq4fta1IDZtf+zMHaLC6xVBzacW++SYaHC220PpgkJaV9bYUke/QQ7RYvJqtmN897lCXyp9fE/vfCKKeDnj6RXLPzPtJbIDSb0aPJXbvI2Fjhv0tIIOMiyZ8P/LovsVTwNoNGfNFlkroh7Tf2lTBQ0JG5+Wdys73FvZBl0v4tWXoOqQGtRafz1eJnOHb/bwTA1XvHUcqPF5qn8V7Sr2/V/cMlS+nTRFCuuK19s7OvIJQr+TW3u23M1Gax+kBJ77VLyakhbREQpvArrxSBPUolufRtuu0/cffLF4j9k0COjSH7JpO+ssZ+ivsKzdntFlo+QP78c9vn9PvF809PJy+5RJhsn39emI5dB7em1AT8HF+eyzsqNAyU3yAsNdJx1KBkWQQGaRTCTy0fhFSg9i3hJw6eADIWkuV+L183l/NKXTav1GXzTUt5Q16yLMtcYhFBWp9YT6L4j38w/tUC1B4M8K7KAl5bbwZqAUmWudFp5X2VhczUZnFceS4/tpoObAY7FjCMFWahQ4HfIKJ1C2JJx5pjO656yBJZegad2iEcocvhnOqyQ4/Yq64W/sq33hLf775bfD/33PaPmTGj0XT4VhchaJrC5xNk9C/O4+8bHqe3YwTlngpyI8jn0kilgiz4jPxpdQPbDZNjyFNA1rbv+363toK3GPLEl3p/lv8A5PzunfRqoplTdDnlYOv3a7/Hwfnaj7g7/zzKGrBup4IAWLkzll8UTuKa2r1tLtpK69bTrYmkqXTIgSfsqkdFJKjk5p8hAVpzoHf300mhe5FMqlRCoNXuI2cMJxPCyb1J5EugrAKLb+xDu+0PsnNn8uGHW5z3MTIH5IiLhTBWKNr0ZZIkd+8W51QqyT17hEA67TTy5pvbbt8GdH4Pr9Hv48sV6wWJ/vGKdJWcQmhqIO71oZAT+EpC/vofjv34mmC/18k51WW8QpvF6/T7+YnVxLomEeD1kGWZn9aZmKnN4mKL4X9C9AjxrxWgDinIqZUFHK3fx+KW6RVtoNDn4qtmPUfocjhEm8W51WXc43Ec+xdMlsjCZLL6qUM/RnIKf6hGQdY8e+z9QravSA04s+wz3ltZePhRe9de2ygwrVYyLk5MqO2wRXHTJjHpnnkmGQ7ys16t24wcSXnIEF6py+Y9m38gu2WQPVLJX68hYxTkFAhNYGlfIVBVChEtOnSw0IrawIfWSo4vD1GaSQ6yIL4V9V1LFFhW0atR01o2pME/HQxY+UfVF/ysaBI1+f1DfsMI2rL6NPhA/Zoobiv4Dz8ve5ql9t2Nk7N7Bz2aGOYVXshg8AAamuQR741JCLdtLtuBfaB//UVGhZEZSnFvT4kn93Qj94JMADk5nXx+OAnQfMdtHFyym59u/Fm0/eWX5n25teRIkBFKoeEnJ7c/zlmzRB/1FofNm8X3Q6iI1BR7PA4O0WYxt2ysiICVvAc/6EjgKyRLzxCUibb/HvpxskwWdCBrnjl2YwvBJ0vc4LRymlEoALcZNFxjNx8SC9FKew0ztVl83Vz+PyF6BPhXClCnFOS9lYW8Rr+PRYcgPJvCIQX5ra2ad1RomKnN4u0GDb+xVdNxoOjGI4Fnb6gM1cbDO06WyOq5ImhBe3mbZsCjAlmiVHI6cwoH8RZDHmv/TuTe2rVi0ty2TXx//XXxvaVmUw9JElrNRacL6r7YCJEC0xRLllBSqXjt7t/5Ua1R5C727i2CiO68k4yNJotfJQ3jyYUJ4nyxIFUgb0wnKx8QQTWONSKFKFDD5VYjbyjf33gO04NCSEntvEOSg7Inlz+U3s+AJoxyYSpdxf0paZSkBqzL70h3+TiRQhO0NaaxVG0hzS/RWXYZA5owUgP68mMYKD6dkiachvyuzKn5StA5trc4qvtEvDe+QpLkH646ZmqzaA14RHSo+y+ybgVZM4/cei2ZHEZmhLT6jiD3nk6a7idfuasx0AogH3uMlGWO0uXQmNFFbPM2EVaSRE6aJO7jG7Fi/5B2TN1+vwhWiopqXCzdcgvZp0/7GusBsMZu5u2lK0VglvXA5beOCPbvxOKppF8zvuFDhn44WX7N0R8XhQap8bq40FzOa/T7RHaBsYhbXHWHnce51m5mpjaLy63Ggzf+H9rEv06AuqQgpxkLOUqXc0S8trIsc6/HwXnVZRwSSkh/xaxnntd1dFdsdSJBnlIbeZSHAtcmsqirMOXZVx69cYUg2VeTGvCR0k8afMiH34kkJs1x4xq/R0UJ82p+ftvHdO1KxoSTu0BefK7QWpuSRFRXM6hSceFzs0U9S5KsrBQkDdHRwr/3VEirl2Vy7gQx2SeqxedtCW1Gv5rzOwnNQzuILLs4lNt5BqkbRmovFX7N4l5CM2lynEsTzaBGyVpNEr8pm81SR3Yr32VLIgWSDARt3Fj9DTcWjmggRGg+JmUobeJUMR7t5aR2KJkfRxYkh8Z5AR1FfVinSWgdDbwhmcxQkx0jxXVHK8iqEAmFyyWinnv2FPtefrlhXC9WaxvN6E2f47RpYnHzxhnka6H9Cxe2/QwffljsnzxZfDcYhD+0KRH9YWKxxcDNBYPpLup99C0vQTtpvEfct/LrDx6T0B6qZ5OFaUc1b7Um4OfndVUNC/ux5fv5bm3F3/9NhlBvzl1rP85c2v8S/KsEqFsKcoaxiKN0Ocw7iqTw5oCfn1hNvLE8l5naLN5syOO7tRUs9B0FYVr9pAgMOhIELeIHr4HIy5OOXopOZcml3J8/4MiL6C5eLDSdkhLx/aabSLWaPP100tHGeG++WUy+m9Ri/7Bhov1335EkXVKA2zMvZeGFLViNXC5y/HhxrFotgpdIoWVeFZrwY2MbzYq+cqGF6kdQY3icy4umUjZOJytuF/6voi5CWBrGkhV3iKCfqsdJy+uk7XOabOu5wLSTmWV7eW/pCnoLUikX9xBMNS3QlgClLIfYdsAdJWM5pGwnb9Dt4DrzFvpsq0VKRM18kSdcOYmsmCAEuQak9gqy4jay8i4W6e/hB0UzhGZm/14EnBXniICshJAGrlSQa89qPHe9eTUykvzyy2Zjrd3xFwnww0/fFxu8XpHyolCItCTLEvKy0P1sqwrQ902ILeqtBw89RCYmtt3+EBGUZb5VsZLUgNW1K/52P63g/I0s7iGede2SIxN+djE++g0Hb3sA+GSJvzlrOdNUwsHaLA7XZfPZai3/ctuOWsBjU+KKrW0UMvgfDox/jQCtzxu7SpfD3LZYcY4CgrLMXW47XzXrOTpkPrnVkMcPaitF1Yq/81IbbhRaxZFClknruyLPr6jrUUk6323dLMp7Gd89eOODoV7bmTRJfP/qq5BGFC0005b3bsMGsf+ujuK710uOHSuCX5Yv5/u1lXz+jfltU8/JMjlzptjXrZvQTP0G4e87vbsQrPXBRXffTQaFJvO708pMbRadTc31nj1iMqz7tNkpcr1Ozq0u42BtFm8sz+WnVhOHarP4pXknWTpAVE6xfd3smFYCNGgPlbAD/VWzOVa/n4+ZivlyjZ5DQsEgX9RVNXcfyLIIONNe2qzvBhKIehQWChKJqKhGQfZsH2HSJoXAVCiEDzMnp/XzmjGD1o7JHF68m5LFQl5+uRC0K0NWjoCVjAOZom59bF6e6LdXL/HMJYmsqRGRt08dhq+/HTilIHMLL2ZxwZlH7lqRHI3VVLSXiyCgI4U/xJxlb4NU4iAIyjKzPA6+Zi7n1aE5ZpqxkN/bzcfMjRSUZc6pLuOVuuxjNnf+W/GvEKCyLPOFGh2H67KZ4zk+L0BAlvmX28aXa/QNL/odFRousxoPz6xSeq5guTla8JUKyjsNyPLRB44iPdCwfB7+UngNrQWdKUtHKSp54UIhAIuKBBNRVBQ5IWRanTu3eVtfIRkBsnt847ZgkJwyhQT43X2TOSb7D6FNPvkk28SkUNRpYiK5aqVIFcqZL4JeunZtFCwjR5JuN3eGCBla1T8sH02W9GNQ8vMPVx3vNxYxU5vFCYY8fmevaQja+KC2ksO02azw1ghBpQFpmtEQSdtMgHr3CeahgljS9k3DsZWhlINKv5evmvUcqs3mCF0O37CUU+/3iuhODQQ7TxMsbRpBvGWLEGAqlbg/4eHCL1zcjyy6t/G+qFTkvjY4Zn0+MiWFudPv4Y1b19F+2qlkhw7k1q2NbYqLRR+jopsfazaTp5wiypV16ULec4/Y/tBDYizV1W0/q8OE2foNqQGXVKz+exyusix8ncU9yfxokX5yGCXADtq3JkxosocAlxTkRqeVL9ToGhbm48pz+X5tpXjmxwE+WXBaj9bvo+4IzcL/n/CvEKBf26qZqc3ieseJoefzyxK3uWx8oUbHUSHGj4kV+fzQamSOx9G+uUWWhaZifrnt/X8Xsiy0n6LOwiRlXnDw/LUmsAUDvFe/iQFNOP01rxy9cbndYlIdO1Z8HztWcOU+/7yYjD/6qLFt9TzyHJAKNDfxyjLdL7/MoFLJwkEDBTl9cnLbEb1er/DvpaSI/q+LIXNnCH5clUrkQMbFiX19+7K4RAjGghbm/xrHdlIDvls6tyFoo628YY8kcXx5Lh83lVCWJLJ2MakJZ/WOrhx9ZU/27dtXCNCy+YJ4vOR00qthic/NIdosftRGMIcl6OdHViOv0+/n4LLdNBb0pbV0EH0ttJFXzHreU1lALlsmrg0gL71U0OVdcom4F8tjyIxQUI9CQb7SzrNdsYIE6F+0iLbEBFZndCE1muZtQsxFXKVq3OZyiXMmJzf0wS1byNJSIcSfe67t8/0dyEF6CzO4tvA6rqg7TOo87z6R46uBCPjxFR+9cdWjKF0E+bWD6oCfq+01nGkqaWBIm1iRz/drK5nndZ0QYnd7MMA7K/I5vjz3wOlQ/0MD/vECdJfbzsHaLL5de4iJ/ccYPlniFlcdn6vWNqwmR+lyOKeqjKvt5gYNg2SI+gsi6f5YIGgTkZYapQh8sX1+0FW2JMucVVXC5cUPUs6PPPoJ4Z9+2kjyXh+du3OnMKWqVI0mQt1g8s2Qhjh7drMullgMfPDz9+nvmCKIyRWK5kW7m6L+HHfdRSaEkQkR5Ntvkx980EhKP2gQCVBWq/n0kle4w22nWwryN2ctHzUV8wptFn8pvIau/GQWug8csbg1FA27zhGievPsFoJSE05b8fSGNBaaHiIlD4OyzKmVBbyjQnPA9AOfLLHY8DCpAaeWfsbR+n1802JgQSio7QldHvOHXtGoWT77rOAf7t5dkEqMu17sG9iPPOcc4XtuK51HlkX1nBCZxd7hg3lt1iYGWkbNJieTcaEgLJ9O9DVqlDDJ//mnoO/r1Uv0N26cIFJoyX98pKiZz4AmkqPLNnOX237w9kEzaZwW+j30Eb7vYyWoSgcI03AIsiyzyOfmx1YTp4a4uQdrs/iQsZhf26pZcZw0zYOhKuDj2PJcTq7IP3aZB/8i/KMFaKXfy9H6fXzUVHziWIQOgKAsM8/r4sdWE+83FnFwqMTUrYY8vmkp5y5bTohlZ/2xHYh3nwir10BEkTp+anfi+KKuiplle0WUY8WEoz8WWSYHDhSTdL1GOnUqGQiIIJXwcPKHH0TwTkGi8Lt17dqsi3HlubxSly1Kml0cSuZvTwslRVBRUhL5y0jyxlQhSM49V0SHAiKt5oMPKEdEUAaYd+nFvD57c4P/6UeHhW6vVviXq2Ye9BLnhywR9VVYGLCR2kGNXLhlLza0/bKuildosw7uewqaGyJry3weLq2t4PXl+5mpzeKCT5fSGScCo+QBA8isLHLAALG4uP9+oXGmpZAvgnw5RFKxaVPb56lfWKhU5Ouvc2VdFTO1WVxtq2lss2OHaHNTZihw7RUhJMPDyZ9+ElVXoqKExrlunWj7yScHvW+HjYCJsiac32mf5LX6faxqj4UpWEfWPCci1QviD9si83cg64bQob+eK+01nFtdxjF68ayu0uVwXnUZ1ztqaW+D6OBkQKnPw6v1+/iQqfiQckr/P+MfK0DdUpCTKvJ5iyGvsb7hSQ6HFORmVx1fN5fzZkMeJ5SKFJG39J/x/dpKbnXVtckectTg+kNU89BAlIdy/t5MkO7zODlYm8XVpu9Cgv23YzOO3bvFBP3cc8L3GRMjJl2/X5AuqNXkYpWo/DF6tJiA94sAGYcUYKY2iw8bQ2Y3n6/Rp5eR0TpflBR+ufR08opeZEGq8OUNHEgCDHbpTAL8ad5sjt27kfvPPpMyQCksjLZZM5vTzVXPFaZXr6b1OZrAFgzw+vL9nGkqpmz/TuQTasJoy7+pUQOtuIPl7lIO12VzseUQ89n4HAAAIABJREFUojVN94fyhRsFX3DfPjrOOZsEGFCpuOTJhzkpZytNZw1gMDqKckKCEGozZ5KGD8nvINJ7Hnigdf8+H/nCC2IxolYLLZKkT5J4hTaLd1cUNLYdMkTcb10xmQ1yRGdxnlCENBcsEOcpKxMm9CFDjp2mZxjPYEl/jtfv5z2Vhc0n/GCdIDQoSAxVjplOBqra7+sIIMkyS3xufmur5pzqMm4qHMm9BedxqDab042FfL+2krvcdvr/IQIp2+PgMG02XzUfo/zyfwn+kQJUDpU7GqHLaV3E+R8CWZZpdAoShXcNX/O60Aq1Pjhlfo2O39lrWOhzHV3tWpZFmkPpgFDprPNJ21esC3g5rjyX042FlConipD+Y/ljnz1bTLobNogJe/58sd3nI2+4RiTqvzmoMVhl+HCS5CehQuibWlaBGThQ9KNUko88Qta1CMn/8UfRzxxwl6OUi83lfO2TpSw447SGYCL9qJG8pyybXy9b2ugbrY8cra4WhArFvUXu5UHuTa75a2YVnBtarAwmPTmNQUS6RZQLk+nVRHJNyV30+A+Sg+feKVinzAvE89u4UaT1hMYdvPRSjt79O1euX0NXcgfKCgX9YWFcc9t4vrj7D/7XVk1L6SOUe4cJzdTTIkhk61ZhEVCGWIpapLTcYdBwiDZL1An1eMTip08f0m4nL1WSEQpyTYhW0u8XZuNbbyWnTxcWhIICHjOEgqrKbH9ymDabb1oMwjVSMy8kOCNFIJf/6Lp4HFKQu912fllXxTlVZQ3ummHabM4wFjFPdwddxWf8o2tt1hMtbDxQxaX/5/hHCtAVoeTff/yD9WSJCda9QwjUgI+/Omv5psXAqZUFHBISqCN0OXzQWMT3aiv5m7OWpT43A0cqVGVZmHJ1gwWBQEE3vlPyJKs9ehF4dKypyLxeEak5YIDQIFNTG02wtV+SN4T8n88/L6I6VSrS5Wo+mTfF3r2i/Zgxwg+XnEx54UJWuRzc6LTy7doK7rjjGjIcXPjNLI4rz+UrZj1/d9TSuWqVOAdAX1QUf3rwPmEGvf32xlJdEREiYnjNAjIXgpi9Lbi3NZha6woyOLv0bRaHgpKaRuG+U5PLFUV3UcqPFhN9zfOiSHVLyAERqb37dPLtxYLesH5MHTqQ333HqtWruHvgBZRD2+Vbb2VxSRFX1Jn4iKmYw3XZrBjfhZJawcWbf+Yqew0LvC4GCgsFMxAgyo317StM4i3erY9Di5Y/nHUimhYg33lH+FJjFeTHMY2Nly1rXraungP5WEH2C6KJqsf5W82v/LFwNCWNOiQ4HyQDlUd8irpggDvddq6oM3FudRlvMeQ1LHZH6HL4gLGIH1mN3ONx0NtA6jFZFIT/B0OWZc6tLuM1BzKP/z/HP06AbnfbeIU2ix9aj/yHccLh3ikmW8/eNnd7JIk5Hge/CK1yx5Y3aqlDtdmcWJHPZ6u1/LTOxC2uOlb6vX8reu+nmvX8rfBKyhqlmHg0IG2rjp3ZrR7Z2UJDuekmISDrGWpMj5J5IOdMF5Pwf/5DApTuuouDtVmcUtE2e5Hv1gn0d+rI73du485bb2JQqaQ/PIwbRw7lLaVZfK48l/K5Ckqp8ZQr2tBI5s6lrFAwqAppYuedJ9h0zj23URsFyC6x5JQIcuO3IrVGlknnz40FwAsSSd0V9AbcnFSRz9sMGrqlYIMAXW/UM1ObxZW2GlFT0zhdmBgLYkVwUX3qkcVCvjeWHAIyTNUoyNVqIfjuvLMhwjioUjKYnt46WpZkYPFiEmDFS5dymrGQN237iWtuvp5BlYrWtFRueO0l7ntjgTAF/7mt1fG2gDCbP15ZJO5BbKzwXXfpQv58fmOR7kBAaKZXXikWRCNGHPt3SPIKlihNBKkBaws6c3nxg7R4D5+eziEFqfG6uN5Ryw+tlZxTXcbxIfKUev/lDGMRF1sMXO+opdbvad86ZLhJuEn+4bAHAxxXnssHjEUnZZzJiYaC5AEKCJ5cMAR8uMdYiAGRsXi+Yw8oFYoTPaQjg3c3oD0f6LELiDzvkA6xS0GUBbzizy8+S/0euCgDAKIUSnQNVyM9LKLFnxqpYeGIUDQvAZvnc+F+UzFuiu+Eu2L9QPkowF8IIACozwYS7wLib2q7/uHRwHvvAVOnAldcAeTkAKWlgG084PoJ6CuJ+qATJwLBIGSFAsM0f2J8UjrOi4qDIeiDIeBruB/hOj0+GTwGK+++AzuenImBZQaMuyRTnKdDB+Dpp4EB7wG3aIGeZwEbNgBqdbPhbFu7CmfceifioqKhOPNMYPNmwOcTtUq9XlFnNC0VcFUBDgDJMcAgJXCOAxh4BnDRPCD+OiB0n/UBL6Yai3BZdAKmhScgMTHx/9g77/AoqraN/2Zbstn0npAQQgcFK/aCCFhAxV6woWLDggUVX/Wz966vDexdUVFRRHkVxQoCoUkN6T3ZtO1lnu+PsyH0JJCQGLiva65NdmfOOTu7O8887b45aeUfHJCYwoNJvdCavsOBCih8Eua/Aouc8Hs8LLGDLpAeBQ0CDgf06KHW4HBA796QkYHMn8/fxx7JwZ99iRa/xec0dy6ceCJcoMOVd8E75cg77xCMtLHi5hv55sJzyHc28PjRJ7LwmCN44pmH6WkOI9McRpY5XP1tCuO2yg2Me+E1Ln3iBTAaYdgw+Pxz4H6ofwX6VsCbX8KVV8LQoUpfdNEidd7aGyLg/h0a3oWGT5Q2KUDiA9TF3srl5bn0NofzWHLvza4RIoJTdKoCfsoCXor8XoqaHv1eavXAxn0TjSYyzeH0t1jpb7HSzxJBD5Ol9decolOUfmzGV+35zjsFOR4HN1fkcnlsKuNjOuDz/BfjX2NAdRFuqFhPXTDAK2n9iTQYO3tJu45AGaxPhx5fKtHsnYSIUB30h4yph+KAl7KAj/KAj4qAj2BoPw1IMJpJN1lINJqJMhj5yVWHzWDk2th0kg1B+hZmocffisl6MNRNA8csdaRtJESdA1HjwBjXHu++afHKQH74IQI4b5qM+YovMAWLmZ1eRGXQj7ZkCWedPZ6omloWHH0Yt7+rRLmNQJrJQrbZSi9LOL3N4ez/yBPEPPY42sKFsP/+ao7Zs+H99+HjjyFCg+Mi4VuHEnT+4ANlEEJY7nHyyMJ5vHn1bYTl58PDD0NWljJEP/wAa9c2r90KJADBCKhwK2MXHQ377QeDB8OgQdCvH3/G2HjC4mdcUk8uzh7AVT98wZPWRCLzC2DdOrUtWaJExEXAaoYUwOmHGkAPzRcWpgTKhw+HI4+E556DmTP59ZYb+GDyNbyUMXDzc7t6tRIx75kI5vWwCEhPh0mT4Lrr1FoBbroJee01Vi/LYXVyHPk+D0V+LwUBD/agMiq2unpmHjQCUzDI3+PPZeETDxMbEcl+7rcZXHcbFRHvkjTsFrSYGLSCAnXjceih7fs98f2jDGbDe+DfAKZMiB5PMOoCtJJTcEWcQGHC0/ztbuTN+goOCo8kyWimKuinKuCnKujHLfrGIcM1A5mhG4RMcxgZm/wdsavXl8IRYEyBHh/u4hvvGpheW8ZHDZW8kNqPQWERnb2cLoN/jQGd1VjDU/Zinknpw/7hkZ29nPaB6LAmDFKeg7hrO2SKoAhVQT9lAR9lAS/lAR+lfh81QT/r/W4cevMF5fDgzzzsu5FLwj6n2tiXCIOBNLFzeHAuwwLf0TuwEMFIoeVoCsNGUxx2HG5jT4yahgkNowZGNAQIIARFCCIERf3vF8GtB3GJjksP4hYdl67jc7uZet4Eeq9cgyngx/21FV9WGOdY55JgNJFktJDpcnPz4GGE+XzUnDEO78svk5KUgnFLj8Dng4MPVkZxwQIwm5tfKy6Gxy+Hd76H+tBzhxyiPKkePQBw6EFOKVrBXeHxHH/Pg8pDPu1UeO4yCJsD6z6BpTUwxwZ/+KDGv+0TbzDAJucW1JSxocfopic1TRmHbcEI9I2CkW44PADDDofEs+CnKJh0N/j98MYbXHPIIHqZw7k9sWfoQw/Chx/C1VcrrzkYhIOMMOU9OOPMzc/Jzz8r7//xx+HWW7dagkMPUvPdbFLPu4CwxkYWjD2RT6e/SEXAjz3op0dwGa96L2Tpcwewz7RlmIJBnnvsXv684ByijEaiDEZsmhGLpmHRDIQZNMI0w8b/twddwKf7SPD9SZZ3DtneH4jTC/EQyTLLifxqPpXF2oHUi+DQg1zne4wj9XmcH/YtaBoaIEB2yItOMppJMplJNJpJMlpIDf2tdVQUK/9QCBsCadM7ZvzdjIAI15evp0EPMC2t/67fYHQT/CsMqD3o55LSNRxljW6+SHQXrO8F0edD8iO7ddq/3A3cUZnHjfE9GBMZT10wiKX8MiyeBfyc+gcNegCXrgycS4K4dB1jsIz+3u8Y6vuWvsHFGAlSqvUix3QUS4xHsNxwIA4i0DYxqOpRw4iGWdOwGgxYNQMRBiMRmgGrwUCEZiTFXsvxI07EWloGBwcJvjcYei/HFLrA1Qb8PD3tee6/9lY0s1mFZJ99Fs49VxmhTbFokfJ+7r0X7rpr89d8a2H1AFh5Nzw9G/7+Wz0/bBiMHg2jRzM+M4bRUXCJeTl8/jrc/DMYBaYmwIWXqpB2+EFAEH49DN5dC7OjoLi02QPt1QvS0tTYTie59ipW1NkZN3suJRddSHp0jNrX44HCQli+HNavV/sf1gfOWAcXTYPkKyDYAI4voPBD+L8f4AsdRkTDc1ci2adxWnUEEzxmTl+0XIWlv/hChVBNJpg4EU5bDoNtkPnd5ueioUGFW3v2VMcZt7go2u1w++0wfTpoGo1Rkdy48k/eyBi8cRdPwEPYt1Y4HTQd1t12C4vuvI1GPRja1PfIJzpeEXyi49vksQkCIEKGbGDf4EKGBBcwNPgnkTRQqyWzwnw8qywjKTIfjtFgJcpgJNpgIsqgjHRP388MqTqTooy/CQ8fSpTBwI0Vubj0IK+l9ce6uy/46zMh5iJIenj3ztuBKPF7mVi2lmMjYrrfdXhn0VnJ17bgwSrF6tOhPZKdhfyjREou3K1T1oX6FKeU5zYT4OtBkbVJrSIKEBHVY9fwmUjZlSLrejZLb204QLG91H+gimHaUniQm6sID0DkoUGbvdTUvuIcOFC93tTGMWrUxh7RzTB1qmqTycnZ/HldF1mb0iyU/eijapwBfUXiVetK0GYQOQyRyxB5Nkvky/NEzhjRXNC0KX+sr1BkbbJI3tEiC35XepqDmltjZMgQ+WvkCHnqvqly/QVnCyBv3TxJ/GPHNr9Xi0Xk5JMViUH+LCWzVnZd8xx+v6pqjY9XHLePXyryybEid4eLnI0Es7Xm+fpmKvWV9HSRggL1ua6JVcLrW2LCBFUQtGHD5s8HAkpxJSFBtfMMHSoC8vwrz8rI/KWb7xsMivQKzX3xxW37vINOEedvIjXPKu7gtSmh75FJkeVX3qMK7VozZtCtOG03ocUs9Hk28gjvVgRqQoV4H+7eeXcDZjfWyPD8HPmfo3NoU7saurwH+re7kSmVG7g9IZMTIzuokKUzUXI+BEoh6+fdMp2IcF91AYs9Dt5IG0CiKRTO8yyH/KGQORdsx7d1UPCtAfd8Vdzh+g3869RrxgQIGwph+6ktfAiY+4IxZttjLf0dhh0JQQ1ylsKQIQBMKlvHKp+LuZ5wDIMGQXa2ygFOngx5eXDFFfB//6dyfKAKfw47THlZCxcqjxVA90LJOPDnK8/fvRBenQcPOeB0YHwiVX+lUr9U6LumHgqK1XEmEyQkqPE8HuW5HX+88jItFdDwDJgOh/Az1dzFxbB0Kf7cXPSaaixeH41ADFAHhEVGEtazJ1ooT0pcHIQHwPkYSDJEXANeP6xYAd9+q7zBxETlbVdVqTWZzbj7Z5I3JIJ+R2mYY9fCbV7lzn08EPocAqY0sD8GPWZC1GnN5/mzz+Css+D11+Gyy5o/x2+/hTvvVAVdl1wCZ58NY8fCkCG8MO9bPm+s4dXUfvRvyoNdeKHKLx8ZAT83bO3FgkpV+AvAtxp8q8C7Ejx/q0eCoIVB2AEQcSzYRoD1SDDY2vYdBCg+VXnrWfM2PvV5QxUv1Jbu3tSPcx4UHQfZKyFscIu7/5sgIjxQXcgCdwNvpg8gyWTp7CV1Krq0AfXqOpeXrSHRaOaZlD4dl6/oTFQ/pC5w/eygmTp8uh8ctTxcU8jdiT0ZYdukGMj+HFTdDv1qwWDd9YkCVeD+A7xL1eZZCv71za8bE5UhtfRRxSCmNLUFa+Hbq+BiDcKt8M8/kJXFyYXLiTQY+SRjsCo6eustuO8+uOMOeOkluP9+cLlg4oUw+TxIBdYvh+Pugv0T4PV+EMyFQCGhgCEY4sE6DMKHwZdOuOYFOPlkfnr9Ze53VvFlxj5E19WrAp9161SodcMGlVstLFQ5TosFAgH1twlV6BNmg6govKmpLI6LxJ+awuF9B+M2m4m5/XZW3TyZvKI8BlXWkFVZg9bYCE4nOOvAJ8pINo0bDILNpgqiBg9WNwgDB6obi/79ed1RzTcOO59tqEY7/XRIj4MPL4PEAvAuAc8SaCojMyaBpS+si4fTvoeR+8K794ApBb5fDo+/Dn8sgGOPhUcfVfnh9HRlsPPyKEhN5tKyNZwamcBNCRkqPP7QQ9DHAF/FQ9b76nMPFIG/UG2BQvCtB3GrNWhWsAxUIfDwg9X5D9sXtHa4ENe+AhXXQb9qMMYCqvjwpopcqoN+pu+uUG7Tb6m/Y7f8pnc3HHqQi0pWc0RENFMSMjt7OZ2LznR/W8LrtaUyMn9p95bXaWq8d/3Z4VNV+n0ypmCZ3F+Zv/WLRad0fN9asFHE9ZcK71Y9oASq848KCRmHbSQgkFUo3lYQiUSCX0ZLzaoEqVuTpuSn1vYWiTWIGBCZl6BClAs0kRsQiUbEjMgpiMxA5PVwtd+NA1XYtnaaSO0bIUmw7zZf37ffilit4jn0EDnrjzmycEcE5fX1ioowNlb1ZV56qcj35ynJtMZvpCbgk/OK/pFLSlZtpJrclEjh+0a7DM/PkVfsJYoMoPBkkWU2kTceaO47PeIIxSW7gxDmzeXrZeH4kID4cceJ1G5BLlJwnDrH9R+oMO7Ss0V6hIkMMov8bhB5EJEBoXO9HyKvIbIqTPHGnhnSEr0qRokRrO8t5avTpH5VrMjVIT3VOEQWs/lntyZOZMN+6jtVNkmJjzfOFvHldyy7lXd96HP9ZrOni30eOaFgqTzfGsrE9kDpZYr8ohvj0/pKGZGf072vza1AlzWg+T63jMxfKq9vQ+KpW0H3hSTHHml5313EXRUb5IyiFVuTWOt+RbJd1Y5yU22Frismnoqp6iJYcbfIdScpkoAwk8x57WQpKJmijGDFFJFvLgqRGsSIVD4qYn9ZpO59keKPFGF6Vo9mhp1x49TfM2Y0z7UuU1G8bYm//hI9I0NqE+Plu69mtLzu2lrFIduzZ4ikPk70R83y9MrpclbRCinfhMFlS0HtGfWVMjxviRT+cJLIxYaNOVg5/nilVtNC7i/g8ciPp53cnP/0bsEWE6jbXJfS61XKMwkJiv0pLk6RM5x4tMh3z4rUzxCpnS5S87zIV1eqMbPjRCqnbty+XnG5rB/bX70WZhZZ9KS6qVllUQYy2ImCzE357cqt9WE/qa+U4/JzZKm7cRsHtjM27CdSemnHz9OJ8OpBOadopdxbmdfZS+lUdEkDquu63FC2TsYX/7NnqAEUnqh0CTsQv4Rktn7aFv2ha0GIqPy3rV/b3WgyoO7lqpjlxBMlYDJJECT4n/+o55oweXJz8cqW8PtFvvhCZOxYxfHatP3nPyLl5SJl16gL/7aMVGWlrDvqcAkaDCKPPda6Iha/X2TmTAkcryTFdAviGnuM0sVsUJ7sRgNaVyeybJnI/feLc98kpb0ZH6kKkFrLG5uXJ+5hB4vPbJLqSy5SxTxbov6TkNxYnsjixUp7VQsVHCUnK87g9dvQwqyvV3SIJpNSvNlkzvIh+4rfZFS0gbNnq+fzD1eGuiug6PRtRlICui6TytbK+OJ/Opaf1psbKiD6qOV9/+Vo4srdUj93T0KXNKA/OFR4q1Uaf90B1Y+rCsIOklhyBANyVtEKmVqxobnqdlPY/6sqP4NdQJOw7Fp1AWpSzWhokLyB/aQxJlpd/I87bvOLelNV7ttvb3/MkhJFExgd3eyt7ZstMgGRr1/dpk7l21VF8um1IbmzkSOVskgLcAeDclP5ernq18/EOzVdZGgozGk2ixxyiNSPHasMaFZWKDwdJnIysuLlM+WENQtaz+386acisbHizOop18x8V1xb6jbqusg//4g8cqjI2BilRNP0vo84QsnF+XdQ0T54sNr33Xebn/vgA5HoaPHHx4uA/H3f3c2vFYxqpvPrbFQ/Efotbf3+CnxuGV2wVP5b04HawdWPKTrM4G7wdDsZAV2Xi4pXyW3luZ29lE7D9juZOwkiwicNVRwSHsVB1qjOXs7ugW0UiAucP3TI8NPrynDoOjfG99h2IZZnMYTtA4awrV/b3dBDxSYGRTWg22zc8frzBMPDVeXtqlWw777w7rvKJPzxhyqymTBBVY5uC+npcMstUFSkinEiIqDXYPhGg1OugqgoGDBAVZw+8ADMnMlBhWW8c+XFlH/1JaxZQ2DQIF4cNIikhAQ0TSMnJ2ezKTy6zp2VG6jK28Ct/hgsfe+AI2Pg6HCwhqvCo1mz1M6FhZAdD8O9cNDxDMycwNhaF08UrGK+q34bbyCEoiIYN06tc8QIpv3wNeFZvbDO/xVefRVuuglOOglSU1XB0V1/QYkVMkOFHi++CL/9BiefrKqKt4ULL1SFWxddpP6uqVGPF1wAQ4dirK3l80vP560rLmw+xhDFxsKszob1CPVb8m79XehpDueymFRmNFbxj9fZMfM3fgq2k8HQTchedgCjpnFZbCoLPI0s9Tg6ezmdg8624Ftimdshw/Nz5E9XfWcvZfdB10XyDhIpHNPuQ6/wOOS4/Bz5tL5y+zttOFAVPnQFFF+gPNAQ/nY1KEHnP+ap3N2BByrhbRAZM0b1ji5apMKzNptIRQt6j7W1Ki8aHy/y9Ykic/qo/ssbb1TebcjD2igVZrGIZGSIKyRv5rFa5VeQ+iOOUL2bRx0lwcGDpT45abPjBEQy00WOiBCZaBOZ8bzUr1+vPNB7Riq1mYMzVR/mJse4rOHi6pWlVFGOO055v6NGqd5So1F5s6mpIvHxKsTcdKzRqNRUTj1Vham/fExkISKTQufqmWdaPvcPPrixd1UCAeV1JiWpQqnJk1VI95xz5Ky8pXJK4Sa9sCUXbfaZdSqCbhVNacr7boGArsvE0jUysXRN+5Ojezd02/7P7SEYOp/Xla3ddnSrm6PL1Vh/0VhNhsnCsPA9xPsE1bYQey2UXwG+PLBkt8uwftF5qqaY/hYrp0clbnsn8YFvBcROaJc5dxni3ezfJo/sgAMPhe+/hxEjVK/hO+/Af/6jPK077lCUe1dcobzT/HzlZW4LsbFqnLFj4bx58IIHLjwUwi4PzS9QWgp5eUxfvYT0ajsnOwNYy8shLw/zH39wBODLy4OhQwlkZ/PboL4URNk4ySsklZQq0vr+/ZVnHKiEotHgvxds+6o5TpkLNzwKCber+QoLITcXvbycXzasprakmGOdPtL8QdVPumIF1NUpD/yIIyA1FWdcLK9qXkb2HsDQ/Q6CPn1U60sTCi+DmyPhs09Um8811+z4vL/zjmpLSUqCV15RPa4//6y83TFjFKPRqafCe++RWVNIjteBrusYDAYUy3IXgSEcwgaEeky3hlHTmBzfg0nl6/naUcO47f0udgaNn4AWDpFj22/MLg6DpnFFbCq3V+bxp7uRwyOiWz6oO6GzLfimqPL75PiWvKXuiqBTtWO0lgmoFXi3rlxG5OfIuh2JjruXdJ0CIhGRolM382auKFktx+dvwia0eLGS8NpnH5F16xTjkMWi5LNOPVV5UL16bV2RuiUcDpETR6uWl2dP3OYu0+ylMq5wxWYScXlr1sgkEF9cnOjh4TL3uqvk7GW/yrJtVHd6PB6pr6+X+tp88a87SOoWmpQHmvfwdpcV0HV5sCpfbv5gmtgPGabez9FHi/zxx2b7NbXB2AO+rQeprRQ5yiRiNoi8996Oz4OIyOefq/xyRITIWWepvwcPVkVCb7yhvNszz1Ri2SLyhl2xQi1zh3LHJZeoz6yriEcXn91iS9YT1YUytnD5ts/fziDoFlmXps7FHoamos/LS1bvlJzivxldKgf6laMGs2bonoxDLcEQATEToH466J5dHq7E7+WdugrOiU6ir2UHxAhNuaLwobs8Z/tg80b30oCPBOMm5OcHHADz5ytJr+OOg3POgTVr4IQT4OuvITJSeaD9+yti+e3BZoOvZsG5+8Dk72DKrYq4YBMcZI2iTg+Q63c3P2mx8F9g0ddfMfvqyzjy9bf58PATGHLrHYpsYRM88sgjxMTEkN6jF9//bxFIaHxLn22vKRjEOGsWd557GU9dMJEKj5P5n3+sPMHDDtts18WeRnqbw4nb9NyAUos57ADICcBX02H8+O2fA4Avv4Qzz1Tk9x6PypG++CLk5Cie4Msug8svh48+2khCf3TIy/jd3ZSvbfJA9a3H7wxYBoJ31Q53mRibhga8VlvWPnPWTVPRhsS7Wt63m0HTNCbGppHr9/CHu6Gzl7Nb0WUMqE90ZjXWcIItrntIle0M4q6BoF39GHcRr9aWEWs0cXFL+n3+PDCmdp2ih02YW3RdxyU6Pc1bFDcNHAh//gnJyXDUUepi//bbipB93DgVEi8oUNR3WxT7bAazGV59E24Hnn5GGeGKCt5//30iIyM5Ji2DoMvFJ6uWb3ZYWGoyz6ZFMu3mayle/Q/GW25RuqUDBqgw548/gq4zdepUGuyrqV+2HycNj8QdF/pcS88D+wvNA1ZVKeafPn3g1FOgxBGzAAAgAElEQVTRGhuRzz9n3k/fc8+BA3ijvgLZlHhdhMUeBwduSU331VeKPShQB1/uDyfuICwfCKjCqnHjVBg5Ph6eeQZyc+Hii1Xh0N13K4anV17ZrOiob1gEGrByYyFOFzOgYYMgWA7Buu3uEmM0cUVsGt85a1nh2cWCIt0D9kcg+kLF9LQHYt9wG73N4fy8oyK47ojOdoGb0BSSyvPu2cwWUnalCuX6WyiG2QEWuxtleH6O/NAawufSS0XyDtvpudodmxQRrQgVlL1h3w6ZhsOhQosgcvPNzWHb/HxVKNRUYHP44SLTponU1Gw9hq6LbBgi8vHRqjcyLU2cM2fKunXrZN26dXLDhuVyfUlzb+bveevlsF+/ldNzl0ihb5O2H7dbFSPtu2+I4KGHyA0XicxIFlnbQ8Sd09wHuv46VeDzygkiZ5+pQtBNbEYLFmyyNF0+qKuQ4fk58lhVofhD4bENXpcMz8+Rv5oK7dxukeuvV/OeMkpkASK1r2/7vS5dqvpNQ0VRYjCIPPVU87lbvVq9B5utmXhiGxhXuFzGNRUSNX1mXSWE25SWcP2xw90Cui5Xla6RK0pW71pBUc3zioHKu27nx+gGeKO2TMYULBPfntC7H0KXMaBXl66Vm8u30dS9p8FfpajQSi/fqcMDui6Xl6yWa0tbWRVXMFyk+LydmqtDsEk+rSnXttK9A3YbXRd5+mlVIXrooSJr1za/9uSTykhomtrMZpETThB57jm1X9P5sb+kLoD5C1XVKyiD5HDI5w1Vcnx+jjiCAVnibpST83Jk2JwZ8lPOku2v59dfRa4aK5IQIi3I7ikyZYrUv/66MqCjR4tYQj2iQ6JEHvs/kerq7b7FOY01cnx+jtxekSuuYEA+qKuQEwuWKZKRBQtUPthiEXnhBZGKu0TWRDb3IbpcInPnKtKE3r2b1V9AVdcWFzev++WXRaxWVc27LYWbTTCpdK2MaMpNF43rOlW4IqqeYBUidTvoDQ5hlccpx+XnyGc7W3cRaNhjc59bYt2WN3Z7ALpECHeV18Vqn2v7laJ7EkyJkPQQ1L8O7gVtPny2w06u38Ok+PTWke/788Hcq83zdBi0UL5Wr2OlT4XWBu4oh6tpqv/xt99UKHS//VQoMhhUIcqZM5sVQsaMUaTvU6aoHGnPnnD++fCOAxZbIDgD5sxRKi/TpsG++3LML38SBP5bns+t5etJcnpYfNalVKxeQ05ODuXl5VssSIf+38FVs2D6kXD9NWAOh6efVrlEUOHno4+F52+BZ8ww7g2w5W/3LY6OjOeR5N4s8ziZXJHLL646DgsasNwxVeVGw8KU4sw1V8Cql+HXI+Guh1XFclwcjBwJ770HxxwDWVkqNzxkCJSVKSHxggJVlXzNNSp8u3gx7LPPDj+mPhYrOlAV8IHupGtV4kaAIQYCFS3uOjAsgrGRCbxRV449uB1x9B2hcjLojZB4b9uP7WboYw4n3WThV9eekwftEmosz9uL+c3VwAc9BmHsjoorbYUEIf9glQ/M+hO01uWEm1QShlmjuLM1grcSgDXhkPJfiLtqFxfdTqi8G+wPQq+lnFttwqkHmdVzSOuOdTqVFNfzz6tc4AsvqMfcXPVot8Pw4fDpp4qAYf58+PVXVSzjD108MzOgT1+VP/37b8jPZ83+Q/jqvNNZmZtH7hsfoAWDmIBw4PIzzuDMkSOhvByK1sP6OZBbA6WhNZlMqrXmyCNpSEsj5q67qD/1VKIXLlQGDCDCAFkCfYZA3xGKCCEpSRk/q1VtmkaJ183rFQUM+PlXTpvxNeEOh3pfaWlK0m3NSnCG2oDS0tRrw4erlpS6OkWy4HQqUoT331fv+bnnlAxcbKzKdZ5ySqtO9VyHnYdqirg1PoMx9tPA/ScMDLR84O5Cbn+IOhWSn2xx1/pggAtLV3N8RCyTEzJaP0fjl0oaL/V1iL1sFxbbffBybSk/OGr5NGPwnnEt72wXWETk6tI18lBVQWcvo2vB9bsSqG4Sfm4FXrGXyIkFy6TS30pKQF9JSL1i1k4usgNQ84JaU8M3Mip/qVxavKrtY8yfr3hfQeUVCwtVnvDYY9Vz0dFqnyZ4vSILvxR5DJGbThY57zyRYcNE79FDAibj1gQJW25Go0hagsgQk8goi8jN56r2j7/+UvOGsBmZvK4risHvvhN5/BGRi4eIHIlIn0iRuNiW5wTxR0SIDBigyOcvu0zkznSRNw5qDsuKqLzkhAnqGJNJ0fPpumpd6d9f5UBvuEHx37YBdr9PhufnyONVhUpEfZWl7Z9TRyL/KEXw0Ep8WFchx+fnSJGvlXSW/nIlQF90attExLs5lofqFrbV1tUd0ekG1KcHZVT+UpmxJ/Z+toTqJ0PMJh+3uGuxzyOj8pfKW21Rr/GsCvWAzm95392F+k9FViH+mmkyPD9H7qrYsHPjBAIqp5eYqHJ+11+vDNYLLyiDByKnn755v2jRaSK5A0X0oJT5vXJZyWo5KX+pfLF6qXw48SIJRESoHOGVVyrjWFws0lAjUn6zOo+Fo0X82z//W6qxbIWGz1UB2boeIrWzRaqqRAoKRN56S3HYgpQNGiCvTH9R7i9ZK8Pzc+St2jLVe+eYu7VE259/KtYiEOnbVxVXffutKqoCkdGjRZZsJ5fbChyfnyNXl65RpPxrond6nA5B0RltEmjwBINydtFK+b/WqIvoupJqW5u0S8V+3RFBXZczilZ0LN9wF0Kn50A3+Dz4EQaGbYc5Zk9G/M0QfQGUTVCC1DtAU9vKudHJrR9fD+UqDF2I9cmUBkCNrxiA3uadFPc2GuHqq5UA9j33KO7c7GxYtAi++07lAL/4QrVvTJ+ujomfAr7VbKidwdVla3GLzn/T+nFa/yF8cc8dTM/5AyZPVuHPY46B/1wLvw6D2hcg+SnImA2m1J1/71GnQ/Zy1cdYcBJ8PB7OOgMuvRRcLrwff8zF335M3Nlnc1daXybEpPJ2fQV3VeUTqH4Iwg4E22hwOBTf7WGHQWUl3HqrEh8fN049r+uKjWnOHMUNvJOINBipCPjV90iz7fz77giYUlqVA21CmMHAhNhUfnbVs8rr2vHONQ+A42tInQ6mNvze9gAYNI2jrDHMd9Vv1nrVXdHpBnSNz40B6LOzF8ruDE2D1Glg6a9yLcGabe623ONkvrueibFphBva8JHqjeqxKxlQywAAGr15AAwJ38ULc1SUovzLy1NE8XPnwqhRKud30UWq2GjiRMjORhbpVJkPwVd1P73N4byc2o9sixVN0zgmIoY54UaCDz0E+etgyuEw+ys4eQNcMghmREJD466tVQRWVMFz+8HxNrjue7D8AzMfhcWL+W3MKPwaHBMRi6ZpXBybwsPJ2fhcv2Ny/0SFbbIy8PHxMHs2DBoEV12lemTHj1d51R9/VPnfUaN2ba1AitFCgx4A3QXG2F0er11hjFc91W3AaFscvczhvFZbuv2Lf+2LUP1/kPSwyrHuxVY4OiKG8qCPXP+uE8J0dXQBA+oi2xzetgv/ngRDBGTMBN0BRWMhWLvVLm/Wl9PbHM7xtjZexLqiATUlAhpaIB+AfcPaybOJjYXbblMe6UcfqcrV995TNylZWUhBARxzDProAgb+vZInbKuJMTaTB4ywxVGrB9hQ+zXUHwvjf4Oc++CTDyExQ1WwJieratY331RFRa2BrsNffynSgn32gQMPVLy0F02EZbPh/WEw4A4ov4IFjgIGWKykmpo5bw+zRvOA/h6NT8YQkzVRFVBZLNCrl1Ku+fBDVTS0apXyOo87Tr3ndkC62UIQEPGBMaFdxmw/mIC2FTUZNY0rY9PI8TpZ4NnGzVD9B1BxPcTdDPF3tM8yuyH2D4/EjMbyXSWo+Beg08nk13hde8O3LcGcBRnfQtEJUDgCMudsDB3leBws8Th4IKkXhrZeGDca0C7CQtQEzUJYsAKjifa/sTKb4dxz1VZYCO+9h+ezGYQXFKBrGskbKuBCMMafDnc9DjfeCAYDAw31POj/D/0qvwHrMeqmJmwwnA2cfR6UlMBnn8GMGapdRQSGDoWRI5ldX89jP/9MWdN7Wb5cMST9/LPaKitVxe2YMfDUU6rtJESbh4yG+ulI5RSu1r9gbcx/QCaryuyyMrjiXKxz5kMQJPT5+0XHcMghGJ95Bk48EcLD2/cchpBtDucXvQYIgrEFxqvdDc2kqtnbiMOsUQwNs/FabRkHh0c1V5I6voWySyD6Ekh+ot1uQrojTJpGjNFEnd6FqrI7CJ1qQD26Tp7fw6l7+z9bhnUY9PwZikZB4bGQ+QNi6sGbdeX0s1g50roTKghNyidax1xgdxqGSCKC9g6ndJTMTD6/biKvjh/LgVW1TP1zGTFzvofvvwN7AG6+WfWSJkeiHelm2FALX2Rdwtgh12E2REGcQxkno1H1U153nQoH5+bCN9+ocOmbb3JSbS0nAQ1GIzGg6AeNRujXT7WWnHSS8gzj4poNJ6h+zYYGaBjJovyXMK96mkOKb4Vf/g+WB8C9iXJNejqccw4Lhx/FA4MySYiM4Z7ELLItHffZ9rNY6c061QFqGdRh8+wUNCPQdgOqaRpXxaUxqXw9c521nBAZDw2fKOMZeTKkTQdtb7SsJcQajNQF9xrQDsV6nxudFhrl96IZ4UMgaz4UjoTCo1mRNJNlXng4Kbt1pAlbQmsKBfoBy4723L0wxGMNFhNn7Livpz3o5/HqIv7yNHJGVCJX9dwXy8HHwnXXq7DqD4fAUyvgVx9UNMLnYP48wOm8Dby9+WCapgxiYDsXjMRESEhQPaErV0JGhvI6V69W29tvbz5W06PezC178GYDhkJjPcLgIi9M+hAyzkMDhgHP+zzcV13ANeVruT6uBydHxu/c96MF7GOxMTgYEiOwHtju4+8ajDvlgQIMDrNxdEQMb9WWMtL9HMaa+yH6fEh9YzOu5r3YPmL3eqAdjzU+F2a0Dr1L7naw9IOs+UjhSLLLhnOO9VEOs+6kkooWImnXPWDsQgbUnEmYfz1JWyqNtBP+cjfwWHURAI8kZ3PYpt67CLjmQD8XPO+FsKHgfAzufwPthx+QujrlcZlMkJKiCnWGDFEVvjabyq3abKpgJylJERpEhXLMDQ0QE6OMaFQUVFcrvc+aGqUu09CgyA0cDkXisGoVFBQgtbVoqBCtNmAAXD4BxkdC/WQ1rvEXCAzfWAHcy6IKoF6sLeFJezF/eRq5JT5js5xueyDaZKKvrFX/WI9s17F3HTvngTZhYnQ0uXVXYnT+AIkPQsKde8O2bUCs0URlYCeYnf5l6FQD6tCDRBqMmPeGRNoGc08Wp3yPp3QC17iuhsp/IOkxJSbcFjQZ0C1ErDsbHssQwl0/MohiYDvSXzszrq4zra6MzxurOSQ8itsTM4lvMtIi4PoJqu8G9+9gPQoiRoJ3OQw6Ej45EYDZy/7G+/TTnPrXEowbNqjc59y5aoyoKFVIlJEBffuqx4wMFd612Zo91HnzlHRYdbUK9+bnQ1GR2mpqmlmRAKKjqTjmKN47ZRTXXDcFW3goWlP3OtT7IfYaaPgQGt6C2KshYQqYVDX2rQmZDAuP4ml7MRNK1zAlIbPdBY8zpRAdDUOXa+cIstM1kr58MkvPJCW4iqfDn+fGhOv2DFaddkSswcQ63d3yjv9ydKoBjTAYcUsXkUD6F0FEmNbowxz1KkeEfYdWNQVcv0D6RxA2oPUDNeU+u5gBLTYdRF9gv+BfwLHtMuYKj5PHagqpCPiZFJfOGVGJquhKdNXTZ38M3H9A+DDI+E71UwaKYEN/JVWV9DAAR+yzP2fddzvBuHTOik5S3uTMmYqLd9UqqKhQLTM//7z9xZx22tbPmUyqUnjffWHwYFVQdNppiNXK7aVr6GuxNhvPYD1U3QnR4yH1JUh6EOzPQu3zUPcSxFwBCbeDOZNjbbEMCbfxeE0Rd1blMTYynmvj0rG2U345VcrwYqXLJWGCtaqVpS2QINT+V51bYwLlPX7ka7uVIc46RkXGdcw6uylijKa9OdCORoRmwCM6QZG9d3htwB/uBtb43DyV3BvNegNEHKM0JvMPhMT7Ie46MIS1PNBGD7Rr9WstNx1KH6BnU35tF+DVdV6vK2dGYxUDLRE8mJ5NljkcdC/Uvw/2J8C3GqxHQ8YssJ3cHKoz91TtCjUPQ/TFEDaQWKOJI6wxfOewKwO6zz7bJl6vq4P16xVRe2mp8jgbGuDBB+GRR1RoNyFBHZuVpQStt3UuPA4KA97NOVprHlBtTUmPqv+N8ZB0vyLeqH0R7M9A3asQfTbETSbeegiPJGUzy2HnpdpSFnscTEnIZP8t9UR3AvFSTbmWSiuYl3cvdHvbDKh3JZRdDp6/IHYSJD1MT2M0h7o38EFDJcfbYtte5b4HI85gokEPdvtre6fGTiNCd8F7vdDWQ0R4q76C/cNsHGgN5dbC94deiyBmAlTdBnn7QOPnKiy5IzS1r+hdSz1hQ9BKECOxgTW7NM5Kr5OJZWuZ2VjNlbFpvJDalywphcrbITcDyq9QrD9Zv0PWLxA5Zus8V8iTo+K6jefzxMg4cv0e1vl2wFgTGwsHHwxnngnXX68UYKZMUa9dey1cconqGc3O3q7xBJjlsNPDZGH/pn5Y7wqwPwcJU8G8BfG5MRYS74I++YoZyb0ACg6F/MPRGj/hlMgopqf1J8Fo5qaKXJ6qKcKh73yeEN2DGQ8btC4oIh20g6EVBlR3QdX/Qd4B6nfQ81dIfRGMKtQ9PjqFfL+H391d6zfS1RFjNCGgiDa6MTrZgKrp3bvyI97DsNjjYJ3PzUUxW/TdGWzqh5+9LMRcdKZqd3H/vf3BzJnq0V/ccQveCZQHfDQQgymQt1PHu/Qg/7WXcEP5eiINRqal9eI8wx8Yi8fAhr5Q9xpEXwi9V0PGF2A9fPuDGayQ8iK4/geNHwNwqDWaRKOJrxq3zQzVXmgIBpjnrGNMZIKqohUdyiaCpa+iHdwejFEQfwP0XgM9vlTvofQ8WN+DHvapPBvrYXJ8D3501jGhdDW/uup3boHOOWjAcsMBOLrahTJo3zG5g+6EmqcgtzfUPKJuSHotgYjNi6GGhNsYGmbj/frKPYKarr1gDdW1OPXu7Rx1rgENnWTXXg+01fi0sYo+5nAO2F74LWwfyPxW5fGCdigYBsWngfN/W3ukxmTVyhIo7PiFtwH2YIBCQ2+1/jb8AEWEX1x1XFK6hlmNNUyNKOZF7Wmy8rNDVIhVSnqqbwmkPKNuNFqDyJMg8gyomAzBGoyaxtjIBOY663bNg2sBPzhr0RFOaMq/1b0Mnj8h9bVWhuiNim6u54+QvQKiL4KGdzHkD+G0mrF8ZJvH/iYXd1flc29Vftv1MJ3fA/CbcTgFvq6VR1cGdBseaLARah6F3F5QdQdEnqJupJLu2+45HR+TzGqfi8UeR8euuRuhwO/BjEaKqWMq6bsKOtWANhUyuLv5XUp7ocDv4S93I2dFJ7Xc1xd5AmTnqN41fx4UjYS8faH2lZAAMqoh3JQJ/q5lQJ16kBWGQwAB9y+tOqY84OOuyg18VPE11wVe4Gv/OEbWjMXgmAWxE6HXMui1EGInKHrEtiL1RVVsVXEjAGMjE/CLzhxH2/hWWwsRYZbDzlERMapS2F8MVVMh9kqIOLrtA4btAylPq5uH9BlgjCeq6iburDuMz/QbSG18gxtKfueLhmqCrfW0PH8jGKkw9KDQ38UMaKBEEco3wbsKKqeGDOc9EHUW9FkPadPA0nuHQw0Lj6Kfxcr7DZUdu+ZuhLU+N70t4d2+w6JreKB7Q7itwmcN1cQbTYxoLeetZlIGo9dSyPxJ5fsqJsH6HlBxA7h+BlMG+Is6duFthFt0FlhOUv84Pt/hvoGgg58r3mNJ3vlMqTuUl7wXc4x/BibbcZD5I/QpgORHFQnFrsCUBinPQ8P70PglCSYzR0fE8GVjTYuhvf/+978MHjyYYcOGtXq6xR4H+X4Pp0YmqMhB+RUqZ5302K69D80C0WeqKEXfcrTUV4g3WrjK9zDvuEbQp3w0X+bfzLr6X1XIeEfwrSYYovArDXQhAxqoVtEGYw9VVJV/COQNVoVVMRdCn1xIfVlRZLYCmqYxPjqZJR4H/3i7P79re2Cdz02/PYAgp9PbWACce0O4LaI+GGCO086F0SlY2npXp2lgG642fwHUvgwN7yoZLi0MDDHQ+BXYRql8WSfDKzp1xr6ACVy/b/6i7lbtJq6faHDMJcK7iGPxU2fMxhZ7CUSdjmY9PETl1s6IvhAaP4XyqyDiKE6LSuSmilwWexwcZN0+If+kSZOYNGkSDQ0NxMTEtGqqzxur6d0Uqq97CZxzlFxae6qemBKVdx47ES1Qjeb4guyGr+nvmkZ42bM4yxMxRZ5AmG0kRBwB5n7NRVaBBtAb0GzHgU7XaJoXAf96qH1V/V9xtXqMHAM9PgPbmNaFvreBoyJiyDSF8X59JQ8lZ7fTgrsnvLpOvt/DuD2AorVTDWi0wUii0cwidyNHR7TuwrKn4muHKlg5NWoXVS/MWcojS3oYPH9D5S2KOKDkNNAiVHgw/FCwHgbWQzpFZSMgQpTBqLw+3yqoews8i8C7CDyLQbw4tTiWaAdRbb2TgxPGkWXbr+OZYjQNUl5RofCyieyXPoNe5nBmNlbv0IC2FSV+L3+4G7g1IQPNtwYqp0DstRB5YrvNsRVCxjQqdiK67uUP+xxK6r9if8dv9Gn8AA1R3wXrEWrzK7UZY/RZaHVg1zvBgIqoUK3rF3DNVXn+QCEbA2vJj6ubHlPSLk9l1DTOiU7iaXsx5QHfZoo4e7E5cv2KorX/HuCBatLJpWWv1ZbyjcPOjIzB3T5evrPwic75Jas4whrNLQmZ7Tu4YzYUn6yKjrw54JqvClWatEfN/cB6qCILt/QGc2gzJrSPwRJRc/nXg09tP9QtZCDFZAZXAKHohKU/PsuB/MFA3vMPxm0ezNXxGRxpje4QntcdonEmlJwOKS8xy3QOT9uLeSd9IBnmHXs3TR5ofX090dHbZwR6wV7C/5y1fNKjH5bCo5RqTq/FO5e73QU0BAO8WV/O/xryOUJbw3nm9WQFFqN5/thEySeRHHpRZxrI8LgjwdxLtdeYMsEQ3U7fkSAEq8G3TjFDeVc0P+oheb+wIRBxPNiOB8cscM1TxUHtCLce5OzifzgtKpGJcWntOnZ3wheN1bxkL+Wbnvu2PVr2L0OnMyOPssXzYUMVf7kbOWqvF7pN/OSswx4MqMb99ob1EPUYrFY9jwm3h0JhueD+C9x/gmcBOL5pvliB0hA191KG1BC9xRYJCEgACDQ/6h5lLIOhHFWwWm2bMCGJMZUUSaPO3J/MyCOg/hWCcbfwhfV23qmvICjCRfEpnBGd2Hk/zqhxyiOsvIkTso7gDYOJTxuquCkho+VjW4BDDzLbYees6EQsVVPBk6P6VHez8QSINpq4MT6DUyITeK0unQnugxlkuYxrkpIZUtQbxAfx19NQ+xv9An9AxYdsxj9riFQ5dlOa+r4YotRzhsiQBq0Z8Kvvh/jVhh+CDRAsh0A5BCogWMnGGylMSnQ9bF+wnaCKo6yHbeQBBlSfrGVwu58Pq8HI6Mg4ZjvsXBqbsveGfztY63WRbQnv9sYTuoABzbaE089i5Xtn7V4Dug2ICDMaqjg0PEox6LQ3jAlg7quMZMx49ZymqV5DS9/m5wCCdaqi17dBPfrzQK9TFzx/oWpE1xtC3okhpFxhUo+aSRWwGBPAmKRaSIyJKrxmTAvN14f8gJEby9ZyfnQSg6NT0OqnUVQ/i5c9F3FyZDwTYlOb+Ws7E8lPgns+5tLzOTt2Fm+FLqpxu7i2bx12fKJzFr9A7TOQ/JySsutE9LZYeTS5N4vdjbxSV8Zt5f/wrW7HYx2BNfEeHnctJ9po4oP0vhAoUxXDgaLmx0C5Yk7yF6vvhjjU/+IDzQyY1aNmVt8TQzQYU1Wo2JSqNmMKmLOV8dxRHlMC4FmoWJk6AKdEJvJFYw3zXfWMsO2l99sW1vrcDNpDNJ473YACjLbF8WptGQ3BANEdKGH1b0SO18l6v4er49I7bhLrIcrbbAnGWDAeAOEHdNhSqoIqNGgPBrisfB0PaBlk6Hm8njaAXl1JtcdghfSPIX8YZ7ru5B25k5mNNUyITW352O3AJzqfNlRxdngd0ZUTIepsiLu+HRe9azjQGsUr4ZHkln+A5oUnAqOJqinGqGl4dV0ZQHNPtXUWPItAr1dCAB2AbEs4Q8NsfN1Ys9eAbgM5Hgcb/B4u3pLopZuiS/jYI2yx6AjzXHWdvZQuh1mNNWSZwziwHXhLt4vwQ8G7RPHDdiJEhKVu1aw+x1lLislCZOQYTPjoFVzRqWvbJsIGQdpbWBwf8x/DJ8xsrMazCz3N3ztqcQQamOC8XoU9U6d3OQktg6bRz/MVgoFBCZcyz1VHgx6kUQ9S1RUqcZ1zVXi4KTXRATg1KoEcr5MCf9fikO5s6CK8XFvKQIt1jykK7RIGNN5oZpg1iu+dtS3vvAfBoQeZ76rnRFvHCCJvRMRxKpzm+rHj5tgBRITF7kYmV+TyQaNqVp8QncLjKb2JTwqF4uxPdsraWkT0WZAwlSOdjzDAP5/Zzp0jVgiK8FF9OU/q92Hx54bIDtpXeqxdoOvgXY5mGcDZsSl80GMQMQYjfoTxJat4zl5MVcDXeetz/qC+zx0ofH10RAyxBhNfdzCV478N/3PWsdbn5pq49D2GeL9LGFBQYdyVXhd5vr13dU34yVlHEGFUR4eKwvZVedDGzzp2ni2gi/Crq55ry9dzS+UGXHqQMaH3Ojg8RJ5u6aPyps45u3VtbULiA2i2E7jPP5Wfahfi24m+5nmuOk7yPM1g3xxI/2DXiR86Cs45QEAx+QA2g5FUkwUTcHFsCj866xhfsppnaoqp3N2GVHeqlizbqA6dxqIZOCkyjjnO2l2KOLRJU98AACAASURBVHQnKNWjMo62xjC0I6NlXQxdxoAeFRFDhsnCg9UFe7+UIcxx2hkWHkVCR/NJapq6IDpmhipmOxYBEb532LmsbA13V+Vj0TQeTc7mtbT+JIf66yI3VSixjVHFSp6VHb62nYJmhPQPMJmSuc19FT/Wr23T4boIeVWvMj7wBlrS4xC1Db3QroK659Vj3A0bn7JqBoLAhTEpfNhjEJfEpjDPpQzp0zXFFO8umj/XPMDfYfnPTXFKZAJOPciPrr1RM1DEH9VB/x7X3tNlDKhFM3BfUi9KAl6esRfv8coHRX4vK70uRu8uId+oM1WLiWsHQtC7CK+u80VjNReWrOKRmiLSTBaeT+nLc6l9OTTUz9kkbWfblEko4U71WPNwh61tl2GMxZz5HbG46VN5Lv5gM/F4S1R+/9TO5hLP3dREXgLxt+yuFbcdug6un1SPp6mZZWZTvccIg5HxIUM6ITaF+a56Li5dzV2VeSzzODr2d13/jmpfsbRBVH4nkWYO45DwqL1hXKAuGOD9+gpOjUoks4Ve6O6GLmNAQZXL3xKfyffO2o3MO3sqvnfYsWmG3dfaE34QmLI6JIxrD/p5t66C80tW8aK9hH3CbExP688jyb0Z0hSqDaFJWCDKsEkOK2yA0nZ0ftfua2tXWHrT2ONLMvR11BSdtdGbnzRpEv/88w8LFy7c6hDdvZg+leeywTSM+PRXu1zR0GZo/FT17MZcttnTRsVTtBkiDEYuiEnh44xB3BKfQXHAy40VuVxTvo4fnbWtJ6xvLYI1KoISe/luO4enRCWw2ucm1+feLfN1VbxTr1ipLtlDKm83RZcyoACjIuMYF5XAi/ZSVnl3IFjcjaGL8L2zlhG2uN3XjKxpygttnKEID3YRIsJKr5OHqgs4t3gVHzRUcnREDO+kD+TupCz6bIfmyxvyQCO3FJmOHAO6HdxbG6GuhLTII/gi6iWSPHPRy6/Zsai5dw2BohPI17LwpX+GtpM8rbsN9icADRJu2+xp4w7slUUzMCYqgTfSBvBocjY2g5EHqgsZX7KKTxoq208Orv49da6jL2qf8VqBQ63RRBmMzHPuud0D8131fNlYw/iYFGL2wBbELmdAAa6JS6evxcq9VfnUB7uYUO9uwBKPg8qgv1kHcnch7irFDNTw3k4P4dV1ZjvsXFW+juvK1/OP18WVcWl80mMQNyVk0KOFEE9TCNe0pQFNDIVvq27f6bXtLhyedB5Pmu/BUD8dKidv24j6C5GiUVQRw0fRbzEkoovnjnSPanUKG7oVK5KRlj0+g6ZxqDWap1L6MC2tP/uFRzKttpxzi//heXvxrnlxIlA/XeWO24H3trUwaRpHWWOY56rbI1NOc5213FuVzzERMZzdESxp/wJ0SQNq0Qzcm5SFV3QeqC5o/3BPF8ccZy2ZpjAGW3Yzm4elP0SeBvanWpay2gLlAR+v1pZyTsk/PFFTRLzRxKPJ2bybPpCzo5OIauXdqb69z9qSAeYBijhc78Q2iVYg2xKON/oSpoXdA7XPQ+WtmxvRQDkUjcYtGpMtL3FBfPvTzrU77E8COsRtzfDTGgO6KfparExN7MmHPQZxelQi85z1XFG2lmvK1vFNYw3utnqlnoWKFzfm8rYd1w4YbouhOOAjdw/rCf2msYaHqwsZZYvjrsQsTF059dCB6JIGFCDZZOHuxCyWeBw8Yy/eqdaAfyOcepBfXHWMjozb/STpAPG3gm+14r5tAR5d53/OWm6v2MAFJauY5bBzgi2ed9MH8mhybw61Rre5H8ywo4txwp1AsGsXE4UwITaVjwxnsCj6Yah9WolhNxnRwpMQ3cHUsNcYFNGfAf8G2rPaF0ALV+omW8C4k9/TRJOZK+LS+CRjMPcn9SLGYOQpezFnFv/DUzVFrPG6WufZ2R9XvMwd3L6yLRwYHkX0HhbG/byhiiftxZwSmcBtCZk7/fl3B3TpoPVB1ihujs/gOXsJa7wu7k7KomdH8MF2IfziqscnwujOogmLOBKsh6t8V9QpW72si7Dc62SOo5afXXW4RGffsAhuic9ghC0Wq2HXdDh3+FuMvlBpPNa9Ckn37tI8HY1McxinRCZwr+sUPk20EF59KxgqQ68GmJswk+UNZl7fBeq/3QbnD4rQPfpS2DK0Duyq8qpJ0zg6IoajI2IoD/iY7bAz22FnlsNOX3M4Y6ISGGmLI3Jb3y33QlX4lvZ2x2jAtnLt81x1XB6b2jk3vbsRH9ZX8lpdGedEJ3F1bFq3f78toct6oE0YE5XAS2n98IpwVdk6vnPYu3W+Yb6rniFhto39kJ2C+Cngng+uXzc+Vez38kZdOeNLVjO5Ipccr4Ozo5N4L30gL6T2Y0xUwi4bT2jBAzUYIHKcUupw/bbLc3U0Lo5NISjCm8bzIf4OaHgTAE/6l7zmtDLSFkd2V+L33R4qbgE0SH5mmy83he8C7dC/nWqyMCE2lQ97DOLhpGySTRZesJdwRtFK7qrM40dn7eYh3qqpYNkHosdvf9AOxrERsZQEfKz3d99qXBHhzbpyXqsr46KYlL3GM4Qu7YE2oa/Fyqtp/XjeXsJjNUUs8jQyOT4DWztcsLsSPLrOIk8jl8V0slcSeSqEH0ygfBKzE+cwx9XISq8Lm2ZguC2W0bY4hoTZOuQH1OIdXcqz0PgRlF8DvZe1+/ztiXijmXOjk1hQO49g4E2lMEI5VeVTcEU/zKUxfTt7iS3DVwC+5WA9Bkyx29xFC930BGi/C4pR0zg8IprDI6KpDvj50VXHT846HqguJEzTOMwazemGHPZz/Q96fNkp3mcTDgiPDIVx6+m3u+sWdgOqAj5eqS3jR1cdE2NTuWAPbFfZHrq8B9oEq8HI7Yk9uSuxJ7+7GriybC1rulmbyxKPA58Ih0V0Hgdqsd/LRw01PG6aisG3nKKqJ4nUjNyd2JPPMvbh1oRMhoZHdtjd5w49UABTMkSMUBd1T9c2oPD/7d13nFxV2cDx373T+2zv2U0lBSSUgCAIQsQgRUW6KAhRKSpFkCbFF6WKiBhAFLChgIi+oMALQQRCh4BCerLJ7mazbXZ2er3l/ePOxoRks212Z3f2fD+f+WySnXKSzM5zzznPeR44XX6TO9Pn0inVQKMxo6/IvMqv1IuplSdB4knXt42vVfcMeJdsLj9hrNZMys0WTvVWcF/NbP5YO5ezfdW0Z1LYA9eyWt6XHyU/wWuJcMHyJHZcxi2m1bGkpvJQqJOvblvL+6kYV5U1iOD5MZNiBrqjo10lzLU6uSnQwrc7N3Kev7qwzZXz6M1khFqzlWnm8TsPqOk66zJJViTCvJYM05JNY5MkDrTvR5vrXC5I/BKp9BKwjM+ebH9c1jQNeTf7bQBUPwjNTdC5FJreHpdxjUjw59i6L2Gb/TiWci03a0bRiFtt93Cn+n1oPcyYPVlnFHigA1CCEH8GLDPB/okB79Z/dnfA/688qrHYOMNXyRnqYxBdzXMlf2WTkubFni24JJlDnT4Odng40O4Z13OJn3H6+UcsyIZMkjmTISlsD1Rd57lYkIfCnURVlVO8FZzpqyy6Fb98mHQBFKDOYuOe6lk8GOrkl6EOHo/0cIKnjBPdZWNfN3aM6LrOm8kIn3L6xnxvIaNrfJCK8VoiwuvJMAFVwSubONThZam/hgPtHuyyDOqd0PwP6L4U6v48pmPq1/8RrLCHGY210Uh0Sr4BmU1GwfmJRFeh+zLjCEvp5fzliWnEPhHkgsAmAD5Z+lmk8tdg64mwZRHUPQ6uows86N3oOBvQoPqXe7xbZrxnXelV0HMFlHyHJZVfZAmwOZPipUSI1xJhXoj3IQF7WZ0c5PBwkMPDXKtzTLNFF9rd+GQT/0qEJnUAfS8Z5d6+bTRnUxzt9LO0pIbqQuZjTHCSPsnXHFqzKf4aDfBcrI+srnGk089J3nLm21yDP3gCac4kOa9jPbdXzmCRw5PX587oGmvSCT5Ixfh3Ks6qTJyMrlNjtvIph5fDnD72trl2/wET+RNsOxNqHwfvKXkd1+7cEWjjmXiQZxv2MYL4QNJrYPN8Y2+ucezq9w6b0m38eyX+BVW/gJLzAXgrEeby5o9Ysc9hBEMhSnw+UIOw7QyIvwiVdxoF2idKYkZmKzRPA+tcmLF6j3e9vGsTK1Mx/tm479iPS0tDy0HGRUrTO0Zj848JKFneSUV5OxnhvVSMqKbikU0cYHdzkMPLQWPUoOHO3jZWpmI8Ujcv78891rZkUjwQ6uCNZIQFNicXltROus/QQpiUM9AdTbPYubi0nvP8NTwXC/LXaICLOjcy1+rgJE8FR7h8k2J5941kBLsks6999G/agQKmWzaxr83FN/w17G93M91iH3y26zkdPE9BxzlGke49LOXlgyU3nqSm7jmA2uaB/UBIvgLJleDYf0zHNSSJV2HbaUYRiobnwXXU9m/Fd9if275XZyqF+n8YmaTdl0D6A6hatkuln4LoOAvQoeZ3g941o2vDLKUwCoFrjXPKjW/vNniCsWd6rLuUY92lqLrO2kyCt5NR3k5GuaO3DR2YabGz0O5mvs3JPKuTarN11Cs/Bzu8/D0WpFPJTIpZW2s2xauJMK8kwqzPJKkxW7mxvJFPj8MqWLGY9AG0n1s2cbK3gi95ynk7GeXJaA8397ZyX5+ZEzxlfNrpo8lin7CHft9IRjjQ7h5RsA+qWZozKVal4wMGzIW5gDnsv78kQc2D0HIYtH8BGt/ZqRNHvvWf9evTFEoYZJZQ+wQ0T4dtp8DMTWM2pkHpmlGpp+cacHwK6h4F839L86U1jQf6OtjP7mIF8Gi4m4v9uT1lyQyVd4BtX+j8BiTfgto/gX0cZnMDSa+D5MvGBYrjwEHvntX1wZO/8iH2jFElq+InQ/73MUkSC2wuFthcfN1fTVhVeDdlBNM3khH+Eg0AUCKbmWdzMs/mZL7VyVybE+cw9/w+YXMhAR+kYixxlw73bzfmdF1nUzbFK4kwrybCbMmmsEsyBzs8nOat4DDn5JhsTCRFE0D77Zj+3pJN8ddIgMcjPfwu3IVLkllgc7GP3cXeNhfzrE5s45D4MJiwqrAmneCy0vo93i+ra7Rm0zRnUmzKGl0gNmVS9GlGveC8BMzdkZ1Q/zfYcqARrBqeB2ls9pq9ucSPoKowaGqNtRE8Z0D0jxD6LfjPHpMx7ZHSCR3fgPjfjbOeFTcZQXEHvw93EVQVbiyp4x7gb9FevpRN7VwUxHcW2Pczln9bDoKKW6HkYijEB1p7bqm+Zmg1kTO6Pvbp/InXoP1kcJ8ApZeO+Gl8JjNHu0o4OleoJJT72VuTibM6neDRcDfx3Iy6yWLfHlD3sjmpM1v3eNbZazIz02Ln/QkUQLXcDLw/aG5TMrhz+Q7n+atZZPdMiM/AyaroAuiOGi12Limr5/ySWtZmEnyUjvNhKr79h8SMxByrg73tLvaxGUHVX4COAm8no2jAJx3G8ZWkptKjZulSsmzOGkFyUyZJSzaNkmscVW2yMtNq53hPGTMtdmZZHdSYrcMunTdklmlQ9xdoPQq6vgNV943Jfp0/9wEVUrNDe0DNwxB7Erq/Y3TiGK8PA12HyB+h67vGGcT6p8F9/C5325xJ8Wikm6/6qqjNdVspN1u4J9jO7ZUzdl4qsy0wliZ7rjaSkOLPQc1vdprNjrnQw8YRIfcXjTZyQ6DoOvJYTkBTH8DW48B+ENQ+lteLCr/JvP2CG4yA05pNsyaTYHXaCKrPxYL0L8CXm8zUmW3UW2zU7/C11mLFKskstLt5JRFG1/VxXQbVdZ2AmqU1m6Ylm6I1m6ZVSbMld4FdIpv5lNPLJU4/C+0uLGKmmReTPoloJFRdZ3M2tT2gfpSO0537wK4xWyk3WSg1mXM3CyWy8bX/z/wm84jegJquE9IUepQsATV3U7Isj/cR0VQqzBYCSnan/TKbJDHd4mCm1c7M3NcZVsfuy5qNh9BD0Hme0ROy+pe7zLZG6+1klCu7m7mopJaTh9rhofdO6Lkc/BdC9bK8jgcgm83ygx/8gGeeeYbm5mZmT3fz0M1W9p+z1dgjrrpnt8vamq5zSdcmQqrCr2vnkIrG8Pl8PN/Rys3pIP9T0cThA/V7jT8P284GPQOVt4Pv62M/G9VSsKEEkGB2EOShVUk6s30NYVXhH9P2yf+YMuuh5XDjAq7hRTCN/xnppKbSnE2xNZumXUmzNZthq5Jmaza9vXuQBFSaLLhlE5uyKU71VFBrseKWTbhlE57c1/7bUJdKdV1HQSet62R0jbSmkdQ12pXMfwNl7mv/WCxI1FtsTLPYmGaxc4DdPXCSoDAqRT0DHYhJkphldTDL6uCLHuODr0vJ8FE6zoZMkqCqEFSztGXTBFWFsKbs0jDYK5soMZkxI6Ggo+mgoqPqeu4rKLv5/U7jAEplM0FNoc5s4wC7h3KThXKThQqzhQqThWqzdWK98f3ngmQzjjioIaj9I+Sxj2Vp7sJgWG3syr4HfXdB6D4jiNoX5G08AIlEgpUrV3Lddddy+Cc2U6HdQiQa5IqfzeCO+/804OOejQX5MB3nrqqZWCWZ/rIJBzm8HCxnWRZs50C7e/fLgq5jYPqHRieXzqUQfgiq7gf7GASpfu0ng56Cmt8POXiCkUQ0Jt04Mhug9bNgKoP6ZwsSPMEo4tK/j7ojXdfp0xTasuntwXVLNs2mbIqnY72kdY2BSjtYkPCYTLglI6BKkrFXntZ10rqWuxlBc6DncMsmGi02plvsHOn0M81io9Fin3ifGUVsSs5Ah0vRdUKqQp+WzQVXI8D2qQoqOmYkTJKECQmTRO6rtMNXo1qJCQm/yUxFLkj6TWY6lQxnbVvLrZXTOdhRuApEwxZ9GradCo7DoP6vILvz8rR9SpaT2lfzBXcZl5TteU94J6mPYMsnjHJ5M7fmfyk38bqRKZt6B7xnsrL9HA446BhaWlqYNm3aLncPqlnO3raOwxxeriw3vh+JRPD5fITDYaIOG+d1rON4dxnfLq3b82vH/wVdFxgBpfQyKL8B5DwfMYivgLbDwbYQpr8/rIce3/ohbtnEo/V5bMsWe9Y44mOuhoblYBnGe6HAzu9YT73ZxrXl00jpGjFN3eFm/D6qKTv9GsAmydhkGZskYZVk4/cf+7VNkrHLMjVmKyWyWWTLFtiUnIEOl1mSKDdbKB8sK3QE1maMcoRzJ1sNTc8J0PAcbD0BWo+E2kfBOvrarr7cbCw23J6Q9r2NVmzBO4yOLTUPjHosAGRboPtKiD4Gtv1h2svg/DTB1cuRJAm/f/f1Ye/r24YMnF9Su9vv11lsnOuv4f6+bRzp9LP3no4vuY6E6f+G3p9A703G2dzy68F3Tn6SuTTFyLBGNo7VDFN/xnde6DoEbzMyml3HQe0fwDTAMvcEtdDuZnm8DzBmrw7ZxNRsN138xE5yga1NJ6gxW8e17FjeOI+Aaf8ylnI37wuhB3ZuHD0C/eXg4sMNoGDsFVqmQ/hXxnGQ0VB6oPtqaN7LOGta/bBxcN/5aVKpFFdddRVnnnkmXu+uqwbvJaMsj4dY6q5AiieIRCLbbzv6sqecuVYnt/e2DV7HVbJC+TUwfTU4D4fOb0LzPAg/YhQVGI2tx4IWhIofg2X3AX9PFHQ8+QigWhy2nW4kUZVdC/X/O+mCJxjF5XtVhTYlXeihCGNMBNACW5tJTL7Z547s+8P0D4xjGJ3fMmakSueonlJm58IDw9LwkvEMbceClhn+47OtrH3lcyQ+qiTefiu3/UrjtY6HwX8OSDLZbJbTTz8dTdO49957d3l4UlP5aXAr+9pcvHv3ffh8vu23hoaGne5rkiSuKGugU8nw21DX0MZnnW7sOzf928ja7TjLuHiJPmmcRx2u4D2QWG4sxZddNeyHa5qGDqO7ANR1iP4VNu9tNHKvfSJ3HGhyfjztY3MhY5wHFYrb5HyHFglV19mQSTLXtvuKKpOG7DYycuufNvYIN+8DoV+DPsSjKB9jQiKmDSOJaEfWRqi4BbQ+aD1i6I9Lr4Zt58CmmexV9TYpx3focr/Nl89fzf4HfhowsnFPPfVUNm/ezAsvvLDb2ecDoQ561SzfK2vgmquvJhwOb7+1tbXtcv/pVjtf9VXxaKSb9cPpLmT/hDFDa3zTOObS/mVjthy8y1gRGNLfeY2xryv7oOGFob/2Dnpz/09lIw2g6XWwdQm0nwTWecb+q/fLI3uuCcIpm5hrdfK+CKBFTwTQAtqcTZHW9ck9A92R+3iY/hG4PmtU1WmeA6EHhx1IHbJMZCRLuP3Kvm/sn6XehM6LBr6fFofw76F1MWxeYMzEKm9Hmt1G6V4/Z8bsRcyaNQuHw7E9eG7YsIHly5dTVla2y9O9m4zyt2gv3/LX0mCxYbPZ8Hq9O9125wxfJdMtdu7obUMZ7hK442CY9gI0vg6ORdD9fdhYB53nQ+rDPfzdFWg9HNCh4Z/Dyrrd0bassUxZbhrmXqzaa+wtb97HSI6qe8rYf7XOHtE4Jpp97C7WFFm7RWFXIoAW0Lp0AhmYbZ3kM9AdmStyS4z/Afsi4whGfyDVhrYn5JZNJLRR9nasewosMyB0L4R2qOeq65B4BTrOhY3V0PE10BWjYMGMTUaVm49lFCuKwsknn8y7777LI488gqqqdHZ20tnZSSZjLBPHNJXbetvY3+7mC55dg+uemCWJ75c10Jw1ii6MiOMQ4999ViuUXQmxp4ys5C2HGOdkM5t3vn/rIUYQK79pVHWEO3Lnp6uGUvtV1yH5tjHT31hndKspv87Y1/WcMHEK6edBk8VOl5olOZoLQWHCm4SZK8VjTSZBk8W+x/Jgk5Z9H6NNV+pDI3O0c6lRXcf9BfCcYpxzHOD8qF82jveMiixD43uwqR46vw5qD2Q3GMcjlFYj2aj0cvB+zdhX3IOtW7fy1FNPAbBw4cKdvvfSSy9x5JFH8vNgO0lN5cqyhhFVg5pjc3K6t5Lfhbo4xOFl5kgvqsw1RoZu2dXGvmLkEaMAe8/lRhax5ySj+0vqXXB/GcqvHdnr5PTk/p+qTXsIoGoYon8xLmZS74GlCcp/aBTjMBdnfuo0i/HebsumJ3V7M2HPRAAtoHXpBHsVy/LtQPoDaXodRB+FyOMQ+T3IXiOYuj9vJCJZZm1PGqkwWVjNIE21B6LroHYaPSMTK4xeoen/GAHEPAPcJxpt2RyHDTlJpampiT0dl34lEeKFeB9XlTVQOYouHGf7q3gzGeGmQAu/rJ4zuhqlkgW8pxo3NWo0xo7+BQI3YnRbtRjlc3rvNGav9v1HtIwbyBW8qN2xCbyWgORrEP8nJF40giY6uI6F+r+Da4lR/rCI9dc5bhEBtKiJAFogKU2jOZviBM/YdTaZUGx7ge0GowhAehVE/gzRPxvBFEByGR02bPvxGbWRrGolEO2m0lZpJLmYfCA5QIuCFjZuau6r0m48Z/9NCxrPKZeAazHYDzaOtqhdUHoFWHctfDBSQTXLT3u3cpjDyzG5AuUjZZVkritv5Fud67mvb9vwCknsickD3tMg22z8m5tqwPsVSL0FgetATwIWsC80lr0tDWCeZny1NBjFKXZ3saFG8Kfe4nhlA/6+xyG7BTLNkF5plCA0VYLzKPB/A1yfM8rxTRFu2US5yUxrNjX4nYVJSwTQAtmYSaIBc4tp/3OobAugYgFU3AhKwOiDmXrf+Jr4J5/OrOMINOgY6hNawDYXrAuMpWHbAuNmmfnfmY7zCOj4qtGEe/pasI4+OOm6zk97tyIhcVlZfV6qwjRZ7VxYUsvPgu0scnj41EC1cocr+AujOIGpAmZu/G/PUT1rzNCTb0DyXVBajOVdZSvog+9Zfx1QkSFcZyzNWmeB9wyjF6p1QVHtaw5Xo8VOizgLWtREAC2QltyVaZN1ZNmPRcNcDubFxkwxZ1UyyPVdH/A1t40vuiz/nW3qCWPpt39GKuduJv/gRe19XwF0I2loyzxoWjPqIPpMLMhryQg3VTRRMtws1D040V3G28kot/e28aDVSbl5lM/dfS0EbwbZb2RJ79iwW7KA/QDjtuMEWteNfWOlDZQu2KUaNCC5+FYgQ69UwRPT9hvdGIvQNIudlalooYchjCERQAskoGYpkc2ige1uNNm89EllrKcEHHlc9vOdZVTt6TwHNs8zzlCOsPD8pkySn/e1c5y7lMPyNUvMkXJZued1rOOW3lbuqJwx8jZ1286ByG/BXAdNH4F596UHdzMIMFcatz3YEvgPtaPY9y1mjRYbT0UDKLo+NsX2hYITn94F0qNmqRjtzKJIuWUzEmxvMZdX/rOh+jfGbHbLvhB+bNhPkdBUftjTQoPZxndKBikEP0I+k5mry6bxfirG45Ge4T+BpkHb54zgaZ0PM5qHHjyH/BIaGfQ9Z+BOYY0WOyrQLpZxi5YIoAUSULLDP3w+hViQ6B2LAApGEG18PdeW7XToumzID9V1nTt7txJQs9xQ0TSkTNlly5Yxf/58Fi1aNKxhHuDwcJq3gl+HOlg3nEP5ShC2LDB6ijqOgKYPQc5/kGvPHWFpsOSvnV0x6T/K0iISiYqWCKAF0qNmqRABdEBu2URwOD1Bh8txMMxsAXOj0Uu05XCjOs8gno718s9EiMvL6occOC666CJWr17NO++8M+xhnuuvZqbVwU2BlqF1qIn+L2yqhcxa8J4Njf/Kf2u3nDW5TkKzpmIi3BCUyGY8sonWrJiBFisRQAskIJZw96jabB1+S7PhMpcbS5uuJZBcARsrjCIDA1ifTvCL4DZOdJdx1CiPrAyVRZK5vryRkKpwS6AVbaDzqJoG7V+B9i8av697Emp/M6Zj25hJArBAnHPcLUmSaLTYxAy0iIkAWgBpTSOiqWIJdw+aLHY0jAbbY0qWoeFZqLgdtBi0LYa240Db+UMvpqn8MNBCk9XORaXDb/k1GnUWG9eWN/JGMsLvw7vp2pJaBc3TIPpHY79z5jbwfGnMMwPQugAAGtFJREFUx9U/s6oRe6ADKjdZ6BvLlRShoEQALYBAbm9PLOEObH5uVrMyPU7HAMqugFntYDvAqNqzoXR7gpGu69zR20ZYVbihvLEgmdOHOL2c46vmN+Eu3kjk+ooqIWhbAlv2BmUblFwOM1aBuXRcxtSlZrAiDb9a1BTizEddZ2HCEu/8AujpD6Ai/X9ABzg8AKwaz44W5kqY/i5UP4RxZvR02DSHV3ue4JVEmCvKGqgrYMLMWb5KDnV4+XH3ZqLbLoCN5RD/P7AthBnroOqOcR1Pn6rgKsY6znnklGQSo214LkxYIoAWQE9uWbJ8NE2Ii1y12YoENGcKsH/k/zrM7gX3iejZTRwePJX/TR/PEdpL4z+WHch6muv1+3gidSieyP1opgqof87ooVmANmAxTRXv4UE4ZBNJMQMtWiKAFkBAzeKWTcXZhSWPnJJMx2i7soyU7GRL5WOcZn+F/1iOw6N1GE2fN9RC761GwfTxkngDWj4N613Y+u7AKsk8YLmcH/rfQHcdM37j2EFAyaACs4u9GcIoOSSZhC4CaLESAbQAetQsZeLKfVDlJguhAiVghFWFa3s247aWM2v6/yLNiYD360YPzZ6rYb0bNs2Bnv8xko/yLfkudFwAG6qg9VBIvgrWeVD7GPJeUebV/IBXEmH+NNL+oaP0Wm4f9sDcUruwe05ZJqGpe+zmI0xe4lO8AFRdFyX8hqDBYqNFSaNoGuZxTFTJ6hrX92whoWncWTMzt8/nhNqHoPrXEH0MQvcYQa73BuNmrjcCnOOT4D4ObIuGfv5Sy0D6faN3Z/wFyGwCctnHktPonFJxO1j+m/17uNPHWd5Kfh3qZJbVwUEOb97/Hfbkg7Rx0XCwwz3IPac2p2RCAzK6jk2U8ys6IoAWgEmSUMUV6aDmWB2sSEZYk0myj901Lq/Z32FlTTrBnVUzqf54opcsg+8M46ZpEHsS+u42OpokXjBuvTcBEsgekJxEYmmCfTGCodwH6JbDwBnMFchPAjsmmVjBOsfoKuM7b4+1es/xV7Mxm+SHPS3cXT1rXAsabMqksCLhlMVHyJ44chdRCV3FJhb8io549xeACVB3191C2MlCuxvCXXyQio5bAH080sNz8T6uLmsY/DVlGbwnGzcwAmrqLYg/C8k3IbMe9CReF3idNkp9uVllZi3YPWCuBnOV0XvTOgs8Jxk9OYfIJElcX97IJV2buLK7mWXVs3cN+GOkR81SJgqBDMqZW2lKaBolIuWh6IgAWgAmSUIT8XNQ83IJKv9Ox/nqOLzea4kwvwx1cKa3kmPcIzhLKcvgPMS47U4kAvhgTgC8+Vlydcgmbqmcznc6N3JlVzP3VM/CO8b76xlNI6VrTLdM8VZ8Q9CfKJgUiURFSawpFIAJScxAh8Asy3hl07gcZdmYSfKjQCuHOXyc568e89fLp1KThVsrZxDSFH7Qs4XMGH9Y9/e4/IRtfFYFJjNnbgk3OdZlKYWCEAG0AGQQe6BD1GSxE9IUtDE8S9eeTXNldzMNFhtXlzeMvPdmATVYbNxSOZ31mQQ/DrSO6fvr7VwAPXScE5cmIwvGeykjft6LkgigBWCSJMT16NAcYHejAx+k42Py/D1Klsu7mnFJJm6rnD6pz+bOt7m4rryRFYkw9/ZtG7OjE+vSSWSgwSqWcAcTyc08vabJ+74SBiYCaAGYkNDEEu6QfMZpNIF+ORHO+3OHVIUrujeho/OTqhmUFEFt4k85fVxcWseT0cDIGnEPQbuSxjuJLzTGU38heb88+d9bwq5EElEByJJYwh2qBqsdM/BRnmegMU3l+93NRFSVu6tnUVlEdYlP9JTTpWS5P9RBudnC0XlsvablOgktEBWIhiSU6zHrFzPQoiQCaAEYSUTCUFWYrWxT8teUOKVpXNu9mQ4lw8+qZg65MfZkstRfTY+a5dZAGzZJ5jCnLy/P+0Yyig58Uux/DklIVfDIJiyicEpREv+rBSAKKQzPXlYHKV0nooy+rF9W17ihZwvrM0luq5zOzHEsPjCeJEni+2UNfMrp5Yc9LazI0xL4C4k+AD4/kmM+U1CfquAXxSaKlgigBeCXzSR1jbhIbR+SQ3KznX8lQqN6HlXX+XGglfdTMX5U0cT8Ij+GYZYkflDemNcguiodxynJlIgiCkPSp2UpEXWvi5YIoAUwPZe9uCVbgFZdk9Cnc4lE/ccnRkLXde7s3cqriTDXVzRu7zc6HpYtW8b8+fNZtGjRuL1mv3wGUUXT6FUVZors2yELqQp+EUCLlgigBTDNYlTF3FyIXpeTkF2WcUoy6zPJET1e1XV+GtzKs/EgV5VNy9t+4FBddNFFrF69mnfeeWdcX7dfvoLo68kIOnCoY3z//SazPlWhRCzhFi0RQAvAKsnUmW1iBjoMTRY7ATWLMsyCClld48eBVp6JBbmyrIHPuvOXkTqZ5COILo/n9j9dYv9zqEKaIpZwi5gIoAXSZLWzWQTQITva5UcHlg9jHzSlaVzXvYUViTA3VDSyZIonvow2iK5KJ3BJMl6zCAhDoem6kUQkAmjREgG0QKZb7GIJdxiOd5cB8FwsOKT7xzSVK7ub+Xc6zs2V07fvo051Iw2iiqYR1JRxbZk22XUoGTSg0lQ8Z4yFnYkAWiDTLXb6NIWwOvqjGVOBVZapNFlYl0kMet+QqnBZ1yaasyl+UjWDA8cxYWgy2DGI3tizhRdifYM+5uWkMfMf7/3jyey9VAwZxq0VnzD+RAAtkKZcKyixjDt0ixweUrrOpj0kE3UrGS7u3EhAyfKzqpksKPKjKiPVH0Q/6yrh5t5Wfhfq2mPt3Jfixkx1yRTdQx6J91JR5tmcuEXZw6IlAmiB1FtsmJFEAB2GUzwVADwZCez2+1uzab7buZG0rnFP9ayiLZKQL+ZcsYWv+6p5ONzJ7b1tKAME0dXpBG7JhFtklA6Jquu8n4pxgF2sfhQz8dNQIGZJYprFxhaxDzpkjVY7dknm7VRkl+9tzCT5flczXpOJOypnUiEO+g+JJEl8zV9FjdnK7b1t9KhZbqxo2mnWFFAy9GkKnxTBYMjWZ5JENZUD7e5CD0UYQ2IGWkCzrA7+nY6NWdupYjTP6iSgKqR2OM7yZjLCJZ0bqTBbuLtqlgieI/BZdwm3V81gbTrBxZ0b6VYy27/3h3A3AGf6qgo1vEnnvVQUpyQzT2whFDURQAtosauElmyaNUNIjBEM/Xtwf4/1ous6fwh3cU33Zva1u/lp1Ux84sjAiO1nd/OL6tnENZULOzewIfe+fDURxi7JIhlmGN5LRllod2OehM3ZhaETAbSADrC7qTJZeGaIRzMEOMrpRwKej/Xxw0ALD4Y6+ZqvipsqmnBN0GSNQpbyG64mq517a2ZTZrJwcecm/i8aJKgp7CeC55AlNZWP0gn2F8u3RU8E0AKSJYkl7lL+GQ+RFIXlh8ScO86yIZvk7WSUmyqaOMdfjTyBr/QLXcpvuEpNFn5WNZP97G5uDbYBcIZXLN8O1X/ScRR0cXxqChABtMCWuEtJ6Rr/ylO7qWL3djJCX+7s7AX+WnEucYw4ZBP/U9GEDePC5NlYUFzkDdG7ySjlJgvTzMXXZ1bYmQigBVZttnKA3c0zsd5CD2VC03WdR8PdXN29mX1sTgCei4ul77EUVLOk0ZlpsfNSIsQFnRtoHmFB/6kioio8GwtypNOHNIFXRYT8EAF0AjjWXcpH6QSt4kzobiU1lR8FWvllqIMzvJXcVjWTJouNtZkEmWEWlxeGrj/79tLSeu6vmY0JiQs6N/BUNCAyxwfwp0g3KnCGr7LQQxHGgQigE8BhTh8e2cSzIploF23ZNN/p3MjryQg3ljeytKQGkyRxhrcSDfhjpLvQQyxarybCOCSZBXYXjRY791bPZomrlLuC7fww0EJMLOnupEfJ8mQ0wCneCkpN4ijVVCAC6ARglWQWu0r4v1jfgJVgphpV13k80s3SjnWkdY1l1bM4wvXfgvCLnX6sSPxDLH2PiZ5c8YT9dsgktckyl5bVc2N5I+8moyzdto7V6XgBRzmx/C7ciV2SOdVbUeihCONEBNAJ4nh3KSFN4c+RnkIPpeBasyku7trI/X0dfMFdzq9q9mLGx8ryybLMQQ4PAVWhbRyqOd14443MnTsXl8tFSUkJixcv5q233hrz1y2U7cUTvLsuRR7h8vPr2r0oM1n4budG/hTuRpviF35t2TTPxIJ8xVclat9OISKAThAzrA5O81bwYKiDdempWVhB1XUeC3fzjY71hFWFu6tmcWFpLXZ592/Tb/prAHgg1DHmY5szZw6/+MUv+PDDD1mxYgVNTU0cc8wx9PQU5wXPi/E+XLnl292pNlu5u3oWp3kr+VWog6u6NxNUs+M8yonjoVAHZSYLX/SUFXoowjiSdJENMGFkdY1vd24koak8UDMHxxS6km3Nprgt0MaaTIKTPRWc668eMHDu6JStq4ioKs827I08hPvnSyQSwefzsXz5co4++uhhPSYcDuP1esd4hCP3YjzIjwJtnOIp58LSukHv/24yys2BVlR0zvPXcJy7FNMUykBdl05wfucGriir5/NuEUCnEjEDnUAskswPyhsJqAq/6NtW6OGMi/5Z59Jt64log886P+44dxkZdJYnQmM80v/KZDI88MAD+Hw+9t133wHvl06niUQiO90mg4dCXcjA0twMfzAHOjw8WDuHQx1e7gpu5YLODayaInujuq7z61AH08w2PucqLfRwhHEmAugE02Cx8e2SWp6JBXk5Pn5BoRBasym+27mRX4Y6+KLH2Oscbr3VM72VyBjHB8ba3//+d9xuN3a7nbvuuosXXniB8vLyAe9/yy234PP5tt8aGhrGfIyj1ZxJsk3JsMjuwTqMGX2JycKV5dNYVj0LgG93buS2QGtRL+vqus4DoQ7eTcX4Vi47XJhaRACdgD7vLuUIp4+fBLfu1BWjWPSpWZYF20c869yRVZaZa3WyJZsmoih5Gd8jjzyC2+3efnv11VcB+MxnPsMHH3zA66+/zpIlSzj11FPp7h44cF999dWEw+Htt7a2tryMbyzdE2wH4OIhLN3uznybi/uqZ3NZaT2vJyN8rX0tT0R6UItwp+i34S4ejfRwUUkth4qKWFOS2AOdoKKqwnkd66kxW/lp1cyiuLqNqgqPRXr4SzSACTjFW8Fp3soRBc4dvZuMckV3M593lXJF+ehnedFolK6uru2/r6urw+HYtTn37NmzOffcc7n66quH9LwTfQ80pimc2LaKRouNh2vnjvr5wqrCQ6FOno710mSx893SOhYWSYH1P4W7eSDUwTf81aLN2xQmej9NUB6TmWvKp3FZ1yZu7W3lstL6SZtUlNRU/hIN8FikB0XXOclTzmneCrx5aj12oMNDiWzm+XgfF5fWDWvpcXc8Hg8ez+CFwHVdJ51Oj+q1JpL7gh3owPkltXl5Pp/JzKVl9RznLuXuYDuXdm3iKKef80tqqDBb8/IahfBEpIcHQh18zVclgucUJ5ZwJ7CFdjfXlk9jRSLCBZ0baJlkpf4yusafIz2c2b6W34W6OMZVwiN1c/lGSU3egme/80tqUNBZNgbJV/F4nGuuuYY333yTlpYWVq5cydKlS9m6dSunnHJK3l+vEDRNY3m8D79s4mBHfmfHc2xO7qmexZVlDbyfinFm+1puCbSycRLW1X062suyvm2c5q3gHBE8pzwxA53gjnaVMNPi4MbAFs7v2MD3yupZ7Cop9LD2SNF1nokF+X24i6Ca5Vh3KV/1VVE1hrOOY9yl3N/XwTOxIBeV1I56Frojk8nE2rVr+e1vf0sgEKCsrIxFixbx6quvsmDBgry9TiE9Geslg87ZY1RFp79132FOH8/EenkyEuD5eB/72lyc7K3gEId3wm9TPB8LcldwK1/ylPMtf40oFi+IPdDJIqmp3BVs54V4Hye4y/h2aS1WaWItIPQoWf4Z7+OpWC8dSoajnH7O8VdTbxmftk7Px4Lc0tvGie4yLi2rH5fXHI6JvAf65bZVRDWV58bpPK2q66xIhPlztIdV6QS1Zisneco51l2Kc4JtVbRn0zwY6uSlRIjj3KVcVlo/ofvPCuNHBNBJRNd1/hEL8vNgO01WOzeUN1I3TsFpIDFN5eV4iBfjIT5IxzAjcZjTx1m+yl3K742Hk3KB4B8Ne+d1FpoPEzWArkxG+V53M4udfq6taBz311+TTvBEpIeXEyHskszn3WWc5C2nusD7pEE1y+9CXfw91kuJycI5viqOdZeK4ClsJwLoJLQxk+SGni2EVYVj3aUsdpUwx+oYtyWljK7xZjLC8niINxMRFHT2s7tZ7CrhcKevoLVAJ/IsdKIG0FO3riagZnmybgF+c+F2dXqUDH+L9vJ0rJe4pnKow8shTi8H2D1juvz/cXFN5bFIN3+OBDBLEl/xVvIlTzm2CXZBJhSeCKCTVExT+W2okxfjIfo0hQazjaNdfo52lYzJkqmq6/wnHWd5vI+X4yHiusZsq4PFrhKOcvopN0+c9k0TdRY6EQPoXyM9/LxvW96OAOVDUlN5Id7HM7Eg6zNJdKDebGV/u4cDHG72s7nx5DkJDYwLw6eivfwh3EVS1/iyp5wzvJVj8lpCcRABdJJTdZ2VqRgvxvt4NREmoWvslQtsn3H6KRtmYNN0nU4lQ0s2zZZsis3ZFFuyKVqzKdK6To3ZymKXn8WuEqZZ7GP0txqdiToLnWgBVNE0jt/6ERLwdP3emCfQxUa/iKrwfirGylSM91JR2pUMMjDH6jACqt3N3nbXsPMB0prGpmyS9ZkkG3K3zZkUGjrHuks521c1qY/aCONDBNAiktb6l1b7eCsZRUGn1GTGJZlwyyZcsgmXLG//df/XlKaxZXugTJPSNQCckkyTxU6T1U6jxc7eNifzrM5JkX04kWahy5YtY9myZaiqyvr16ydMAL0t0Mpz8T4uLanjRO/AJQknkk4lw8pUlPeSRlANaQoWJHym3Pt7D+91Rde3B8uWbAoNMCMx3WpnttXBbKuDA+2ecUt6EyY/EUCLVFRVeC0ZoUvJENNU4ppGXFdzv1a3/1lMU7FKEo0Wey5Y2oyvFjsVJsukCJa7MxFnoRNpBtqjZDitfQ2VJguP1s8v6FhGStN1NmdT/CcdJ6wqO7+v9R3f58afScBMq4M5uWA52+pgutU+4bLZhclDBNAprv+/f7IGyj05uW0VQU3hkdq51EyAWcVECqAXdqxnTSbJsqpZzB9mAf/JSNd1dBAZtEJeiUuvKU6SpKIMngA/rpyODlze3VzooUwoK5NR1mSS7GtzTYngCcb7XARPId9EABWK1l42J0tcJWxTMjzc11no4UwYNwdakYEby5sKPRRBmNREABWK2hWl9XhlE3+IdNFZhK3hhuvxSA+9msIJ7rKCnvkUhGIgAqhQ1GRZ5paK6WjAFV2bCj2cgkpoCg/2deCQZL6bp44rgjCViQAqFL35dhefdfrZqmT4fWjqLuV+p3MTGXQuKa0bl3q3glDsxE+RMCVcVdaARzbxm3AXXVNwKffnwa00Z1Mc6fRxjLu00MMRhKIgAqgwJciyzI+3L+VOrazc1+Jh/hrtpcpk4bqyaYUejiAUDRFAhSljH7uLo5x+2pQ0fwx3FXo44yKgZLgx0IIFifuqZ4ulW0HII/HTJEwpV5c14JZN/DrUyb+T0XF5zWXLljF//nwWLVo0Lq/XT9M0LuzciILOTZVNlEyggv+CUAxEJSJhymnOJPlmx3oAflUzh+nj1Ld0vCsRXde9mRXJCKd4yrmwtG7MX08QphoxAxWmnBlWBz+pnIEGXNC5gZ4iTCp6KhJgRTLCHItDBE9BGCMigApT0kKHh+vLG0nrOud2rCemKYUeUt5sziS5u68dpyRzd/WsQg9HEIqWCKDClHWky893S2qJaSpf37aOjKYVekij1pZJcWHnBnTgrqqZ2EXSkCCMGfHTJUxpX/JW8BVvJQFV4Zsd69EmcRD9MBXn3I71pHWda8oamGNzFnpIglDURAAVprylJTUc6yqhRUlz6STt3PJqPMQlXRvR0bm9cgaLRbEEQRhzIoAKAvD98mkcZPfwn3Sc67o3F3o4w/K3SA/XB1owI3F/9WwOdHgKPSRBmBJEABWEnFsqmtjL6mBFMsJZ7WvoU7KFHtKgHuzr4O6+bbgkmd/VzWWWWLYVhHEjAqgg5MiyzL1Vs/i8q5R2JcOp7Wv4Z7yv0MMa0G2BVv4Q6abMZObR+nlUma2FHpIgTCmikIIg7MZbyQjXd28hg86nHV5uKG8cdRm8fBVS0DSNK3s2824qRqPZxgM1c7CKbFtBGHfip04QduNgh5e/NMxnpsXOK8kIJ7evoS2TGtFz5bOU3z+ivRy/dRXvpmLsa3PxkAieglAwYgYqCIN4sK+DRyLdSMAFJbWc7K0Y0fOMZgb6YSrGjwKtdKtZrEic66/mNF/liMYhCEJ+iAAqCEOwLp3ge12biOsaMy12vllSy0HDzHYdSQDtUjLc2LOFtZkkErDEVcIlpfVi1ikIE4AIoIIwRBlN49qezbyXiqEDLklmsauEpSXVuGXzoI8fTgDNaBq39LbyciKMDuxrc3F9+TRKRaKQIEwYIoAKwjDFNIUHQ50sj/UR0zUkYKbFzjm+aj7l8g34uMECaEDJ8Hy8jzeTUdakEyjo1JmtXFfeyF7ieIogTDgigArCKLydjPJwqIN1mSQ64JRkPunw0mSxUWW2UmO2Ume24pfNxGKxnQJocybJ/8WCrEzFaFPSpHM/ihJQZjLzLX+NqCgkCBOYCKCCkAcJTeHhUBfPx/uIaOpu76NFY7yyz2EsWfUGisuJgvGjZwIqTVYW2Jwc6fRzsMODWexxCsKEN/jGjSAIg3LKZi4qreOi0joiisJWJU2HmqZLydKjZgkqWboyGq8AdknGb7ay0OHmc64S5tpchR6+IAgjIGaggjBO8lVIQRCEiUGsEwmCIAjCCIgAKgiCIAgjIAKoIIyxfJbyEwRh4hB7oIIwTsQeqCAUFzEDFQRBEIQREAFUEARBEEZABFBBEARBGAGxByoI40TXdaLRKB6PB0mSCj0cQRBGSQRQQRAEQRgBsYQrCIIgCCMgAqggCIIgjIAIoIIgCIIwAiKACoIgCMIIiAAqCIIgCCMgAqggCIIgjIAIoIIgCIIwAv8PhQ832iBMRVEAAAAASUVORK5CYII=\n", "text/plain": [ "Graphics object consisting of 36 graphics primitives" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "graph= Graphics()\n", "etas = {pi/6: ['turquoise', (0, 2*pi), 12], \n", " pi/4: ['gold', (0,2*pi), 12],\n", " 5*pi/12: ['red', (0, 2*pi), 12]}\n", "for eta_v, param in etas.items():\n", " color = param[0]\n", " beta_min, beta_max = param[1]\n", " nb = param[2]\n", " db = (beta_max - beta_min)/(nb-1)\n", " betas = [beta_min + db*k for k in range(nb)]\n", " for beta_v in betas:\n", " F = fiber(eta_v, beta_v)\n", " F.coord_expr(stereoN.restrict(B))\n", " graph += F.plot(chart=stereoN, ambient_coords=(x,y), \n", " color=color, plot_points=150)\n", "show(graph, aspect_ratio=1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The same fibers, but viewed in $\\mathbb{R}^4$ (via the embedding $\\Phi$), in terms of the coordinates $(T,X,Z)$:" ] }, { "cell_type": "code", "execution_count": 179, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n" ], "text/plain": [ "Graphics3d Object" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "graph = Graphics()\n", "for eta_v, param in etas.items():\n", " color = param[0]\n", " beta_min, beta_max = param[1]\n", " nb = param[2]\n", " db = (beta_max - beta_min)/(nb-1)\n", " betas = [beta_min + db*k for k in range(nb)]\n", " for beta_v in betas:\n", " F = fiber(eta_v, beta_v)\n", " F.coord_expr(stereoN.restrict(B))\n", " graph += F.plot(chart=X4, ambient_coords=(X,Z,T), \n", " mapping=Phi, color=color, \n", " plot_points=200, label_axes=None)\n", "show(graph, axes_labels=['X', 'Z', 'T'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "or in terms of the coordinates $(X,Y,Z)$:" ] }, { "cell_type": "code", "execution_count": 180, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n" ], "text/plain": [ "Graphics3d Object" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "graph = Graphics()\n", "for eta_v, param in etas.items():\n", " color = param[0]\n", " beta_min, beta_max = param[1]\n", " nb = param[2]\n", " db = (beta_max - beta_min)/(nb-1)\n", " betas = [beta_min + db*k for k in range(nb)]\n", " for beta_v in betas:\n", " F = fiber(eta_v, beta_v)\n", " F.coord_expr(stereoN.restrict(B))\n", " graph += F.plot(chart=X4, ambient_coords=(X,Y,Z), \n", " mapping=Phi, color=color, \n", " plot_points=100, label_axes=None)\n", "show(graph, axes_labels=['X', 'Y', 'Z'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In this notebook, we have used 18 charts on $\\mathbb{S}^3$:" ] }, { "cell_type": "code", "execution_count": 181, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left[\\left(U,(x, y, z)\\right), \\left(V,({x'}, {y'}, {z'})\\right), \\left(W,(x, y, z)\\right), \\left(W,({x'}, {y'}, {z'})\\right), \\left(A,(x, y, z)\\right), \\left(A,({x'}, {y'}, {z'})\\right), \\left(A,({\\chi}, {\\theta}, {\\phi})\\right), \\left(W_{z\\not=1},(x, y, z)\\right), \\left(W_{z\\not=-1},(x, y, z)\\right), \\left(D_1,(x, y, z)\\right), \\left(D_2,(x, y, z)\\right), \\left(D_3,({x'}, {y'}, {z'})\\right), \\left(D_4,({x'}, {y'}, {z'})\\right), \\left(A\\cap D_1,({\\chi}, {\\theta}, {\\phi})\\right), \\left(A\\cap D_1,(x, y, z)\\right), \\left(A\\cap D_1,({x'}, {y'}, {z'})\\right), \\left(B,(x, y, z)\\right), \\left(B,({\\eta}, {\\alpha}, {\\beta})\\right)\\right]\n", "\\end{math}" ], "text/plain": [ "[Chart (U, (x, y, z)),\n", " Chart (V, (xp, yp, zp)),\n", " Chart (W, (x, y, z)),\n", " Chart (W, (xp, yp, zp)),\n", " Chart (A, (x, y, z)),\n", " Chart (A, (xp, yp, zp)),\n", " Chart (A, (ch, th, ph)),\n", " Chart (Wz1, (x, y, z)),\n", " Chart (Wzm1, (x, y, z)),\n", " Chart (D_1, (x, y, z)),\n", " Chart (D_2, (x, y, z)),\n", " Chart (D_3, (xp, yp, zp)),\n", " Chart (D_4, (xp, yp, zp)),\n", " Chart (A_inter_D_1, (ch, th, ph)),\n", " Chart (A_inter_D_1, (x, y, z)),\n", " Chart (A_inter_D_1, (xp, yp, zp)),\n", " Chart (B, (x, y, z)),\n", " Chart (B, (eta, alpha, beta))]" ] }, "execution_count": 181, "metadata": {}, "output_type": "execute_result" } ], "source": [ "S3.atlas()" ] }, { "cell_type": "code", "execution_count": 182, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}18\n", "\\end{math}" ], "text/plain": [ "18" ] }, "execution_count": 182, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(S3.atlas())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "corresponding actually to 4 different coordinate systems:" ] }, { "cell_type": "code", "execution_count": 183, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left[\\left(U,(x, y, z)\\right), \\left(V,({x'}, {y'}, {z'})\\right), \\left(A,({\\chi}, {\\theta}, {\\phi})\\right), \\left(B,({\\eta}, {\\alpha}, {\\beta})\\right)\\right]\n", "\\end{math}" ], "text/plain": [ "[Chart (U, (x, y, z)),\n", " Chart (V, (xp, yp, zp)),\n", " Chart (A, (ch, th, ph)),\n", " Chart (B, (eta, alpha, beta))]" ] }, "execution_count": 183, "metadata": {}, "output_type": "execute_result" } ], "source": [ "S3.top_charts()" ] }, { "cell_type": "code", "execution_count": 184, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Total elapsed time: 378.99746379299995 s\n" ] } ], "source": [ "print(\"Total elapsed time: {} s\".format(time.perf_counter() - comput_time0))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For a follow-up, see the [notebook devoted to vector fields](http://nbviewer.jupyter.org/github/sagemanifolds/SageManifolds/blob/master/Notebooks/SM_sphere_S3_vectors.ipynb) on $\\mathbb{S}^3$.\n", "\n", "You may also visit [Niles Johnson's page](http://nilesjohnson.net/hopf.html) for a very nice \n", "animated 3D visualization of the Hopf fibration, also constructed with SageMath." ] } ], "metadata": { "kernelspec": { "display_name": "SageMath 9.2.beta6", "language": "sage", "name": "sagemath" }, "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.7.3" } }, "nbformat": 4, "nbformat_minor": 1 }