{
"cells": [
{
"cell_type": "markdown",
"id": "edfa5ba5",
"metadata": {},
"source": [
"## Trajectory of Light Signal using Jacobi’s Elliptic Function.\n",
"\n",
"\n",
"This workbook describes the: Trajectory of Light Signal using Jacobi’s Elliptic Function. The light deflection arround the sun is determined. \n",
"\n",
"The theory behind the method is found in paper: 'Equations of Orbits, Deflection of Light, Mercury’s Perihelion Shift, Period of Revolution and Time Delay of Signals in Schwarzchild’s Geometry. Some closed-form solutions using Weinberg’s approach. New Version (19/08/2016) Solomon M. Antoniou'. [Researchgate](https://www.researchgate.net/publication/306379858_Equations_of_Orbits_Deflection_of_Light_Mercury%27s_Perihelion_Shift_Period_of_Revolution_and_Time_Delay_of_Signals_in_Schwarzchild%27s_Geometry_Some_closed-form_solutions_using_Weinberg%27s_approach)\n",
"\n",
"This project was started based upon a topic on: [Wetenschapsforum](https://www.wetenschapsforum.nl/viewtopic.php?f=85&t=212427). \n",
"\n",
"Here follows a summary of the result found on forum Wetenschapsforum. The mean set of formulas required are found in article. Where $r_s$ is Schwarzschild radius and $r_0$ radius lightbeam from center mass and $\\varphi$ is the angle following the light signal. The radius $r$ with angle $\\varphi$ are computed with $(6)$. Finally the startcondition $\\sigma$ and $\\varphi$ range are computed:\n",
"\n",
"$$e_1 = \\frac{r_0 - r_s + \\sqrt{(r_0 - r_s)(r_0 + 3r_s)}}{2 r_s r_0} \\tag{1}$$\n",
"\n",
"$$e_2 = \\frac{1}{r_0} \\tag{2}$$\n",
"\n",
"$$e_3 = \\frac{r_0 - r_s - \\sqrt{(r_0 - r_s)(r_0 + 3r_s)}}{2 r_s r_0} \\tag{3}$$\n",
"\n",
"$$\\tau = \\sqrt{ \\frac{ r_s (e_1 - e_3)}{ 4 }} \\tag{4}$$\n",
"\n",
"$$h = \\sqrt{ \\frac{ e_2 - e_3}{ e_1 - e_3 }} \\tag{5}$$\n",
"\n",
"$$\\boxed{ r = \\frac{1}{ e_3 + (e_2 - e_3) \\mathrm{sn}^2( \\tau \\varphi + \\sigma ; h^2)}} \\tag{6}$$\n",
"\n",
"Start conditions for $r=r_{0}$ at $\\varphi=\\pi/2$ determine $\\sigma$ substitude $(2)$:\n",
"\n",
"$$r_{0} = \\frac{1}{ e_3 + (e_2 - e_3) \\mathrm{sn}^2( \\tau \\frac{\\pi}{2} + \\sigma ; h^2)}=\\frac{1}{e_2} \\tag{7}$$\n",
"\n",
"After simplification:\n",
"\n",
"$$\\mathrm{sn}( \\tau \\frac{\\pi}{2} + \\sigma ; h^2) = 1 \\tag{8}$$\n",
"\n",
"Property elliptic integrals:\n",
"\n",
"$$\\mathrm{sn}(K,h^2)=\\sin \\left( \\frac{\\pi}{2} \\right) \\tag{10} $$\n",
"\n",
"Where $\\tau$ and $h^2$, are given and the startcondition $\\sigma$ can be solved with standard form complete elliptic integral [Wiki](https://en.wikipedia.org/wiki/Jacobi_elliptic_functions#Definition_as_inverses_of_elliptic_integralshttps://en.wikipedia.org/wiki/Jacobi_elliptic_functions#Definition_as_inverses_of_elliptic_integrals). In the simulation the following integral solver was used from scipy: [special.ellipk]. Definition of complete Jacobi elliptic integral:\n",
"\n",
"$$K(h^2)=\\int_{0}^{\\frac{\\pi}{2}} \\frac{d t}{\\sqrt{1-h^2 \\sin^2(t) }} =\\tau \\frac{\\pi}{2} + \\sigma \\tag{9} $$ \n",
"\n",
"Not all solutions are valid, the root of $(6)$ van have zeros. The $x$-range is found by searching the roots of $(6)$. \n",
"\n",
"$$e_3 + (e_2 - e_3) \\mathrm{sn}^2( \\tau \\varphi + \\sigma ; h^2) = 0 \\tag{12}$$\n",
"\n",
"$$ \\mathrm{sn}( \\tau \\varphi + \\sigma ; h^2) =\\sqrt{ -\\frac{e_3}{e_2 - e_3}} \\tag{13}$$\n",
"\n",
"$$\\mathrm{sn}(K|h^2)=\\sin \\left( \\phi \\right) \\tag{14} $$\n",
"\n",
"$$\\phi=\\arcsin \\left( \\sqrt{ -\\frac{e_3}{e_2 - e_3}} \\right) \\tag{15}$$\n",
"\n",
"Where $\\tau$, $h^2$, $\\phi$ and $\\sigma$ are given and can be solved with incomplete elliptic integral [scipy: special.ellipkinc]. The maximum angle $\\varphi$ can be calulated with:\n",
"\n",
"$$K(\\phi|h^2)=\\int_{0}^{\\phi} \\frac{d t}{\\sqrt{1-h^2 \\sin^2(t) }} =\\tau \\varphi + \\sigma \\tag{16} $$"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "7448a161",
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "a4d79ae8337042308ccf0ffda151f4e2",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"#Version 25.0 Schwarzschild, Jacobi Elliptic\n",
"#https://www.wetenschapsforum.nl/viewtopic.php?f=85&t=212427\n",
"\n",
"#Open pyplot in separate interactive window\n",
"#from IPython import get_ipython\n",
"#get_ipython().run_line_magic('matplotlib', 'qt5')\n",
"\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"#import matplotlib.gridspec as gridspec\n",
"import scipy.special as sps\n",
"from scipy import optimize\n",
"from matplotlib.widgets import Slider, CheckButtons\n",
"import matplotlib.ticker as ticker \n",
"\n",
"%matplotlib widget\n",
"\n",
"fig= plt.figure(figsize=(9, 5)) \n",
"\n",
"ax1 = plt.subplot2grid((3, 3), (0, 0),rowspan=2)\n",
"ax2 = plt.subplot2grid((3, 3), (0, 1),rowspan=2)\n",
"ax3 = plt.subplot2grid((3, 3), (0, 2),rowspan=2)\n",
"ax4 = plt.subplot2grid((3, 3), (2, 0),colspan=3)\n",
"ax4.axis('off')\n",
"\n",
"plt.suptitle('Schwarzschild, Jacobi Elliptic', fontsize=20)\n",
"#fig.set_tight_layout(True)\n",
"plt.tight_layout(pad=1.5, w_pad=1, h_pad=1)\n",
"\n",
"# Draw slider alpha\n",
"axcolor = 'lightgoldenrodyellow'\n",
"axalpha = plt.axes([0.25, 0.01,0.4, 0.04], facecolor=axcolor)\n",
"s_zoom = Slider(axalpha, 'zoom: ', 0, 1, valinit=0.9)\n",
"\n",
"axsm = plt.axes([0.25, 0.06,0.4, 0.04], facecolor=axcolor)\n",
"s_sm = Slider(axsm, 'solar masses: ', 1,157280, valinit=1)\n",
"\n",
"radius = plt.axes([0.25, 0.11,0.4, 0.04], facecolor=axcolor)\n",
"s_sr = Slider(radius, 'radius: ', 0.1, 5, valinit=1)\n",
"\n",
"rax = plt.axes([0.75, 0.01, 0.075, 0.14])\n",
"check = CheckButtons(rax, ('x=y', 'sun'), (True, True))\n",
"\n",
"#Set constants note G is divided by c^2 \n",
"global M\n",
"global G\n",
"global Ro\n",
"\n",
"M=1.989e30\n",
"G=6.67408e-11/((3e8)**2)\n",
"Ro=696340000\n",
"\n",
"def e1(sm,sr):\n",
" esqrt=np.sqrt((sr*Ro-sm*2*M*G)*(sr*Ro+sm*6*M*G))\n",
" e1=(sr*Ro-sm*2*M*G+esqrt)/(sm*4*M*G*sr*Ro)\n",
" return e1\n",
"\n",
"def e2(sr):\n",
" e2=1/(sr*Ro)\n",
" return e2\n",
"\n",
"def e3(sm,sr):\n",
" esqrt=np.sqrt((sr*Ro-sm*2*M*G)*(sr*Ro+sm*6*M*G))\n",
" e3=(sr*Ro-sm*2*M*G-esqrt)/(sm*4*M*G*sr*Ro)\n",
" return e3\n",
" \n",
"def r(phi):\n",
" sm = s_sm.val\n",
" sr = s_sr.val\n",
" \n",
" e1v=e1(sm,sr)\n",
" e2v=e2(sr)\n",
" e3v=e3(sm,sr)\n",
"\n",
" tau=np.sqrt(sm*M*G*(e1v-e3v)/2)\n",
" h = (e2v-e3v)/(e1v-e3v)\n",
"\n",
" sigma = -tau*np.pi/2 - sps.ellipk(h) \n",
" sn,_,_,_=sps.ellipj(tau*phi+sigma, h)\n",
" r=e3v+(e2v-e3v)*sn**2\n",
" \n",
" return r\n",
"\n",
"def alpha():\n",
" #Determine the root of solution\n",
" sm = s_sm.val\n",
" sr = s_sr.val\n",
" \n",
" e1v=e1(sm,sr)\n",
" e2v=e2(sr)\n",
" e3v=e3(sm,sr)\n",
"\n",
" h = (e2v-e3v)/(e1v-e3v) \n",
" phi=np.arcsin(np.sqrt(-e3v/(e2v-e3v))) \n",
" angle= sps.ellipkinc(phi, h) \n",
"\n",
" tau=np.sqrt(sm*M*G*(e1v-e3v)/2)\n",
" sigma = -tau*np.pi/2 - sps.ellipk(h) \n",
"\n",
" alphav = (angle-sigma) /tau-2*np.pi\n",
"\n",
" return alphav\n",
"\n",
"#The following function updateplot runs whenever slider changes value\n",
"def updateplot(val):\n",
" \n",
" #Solar masses/radius and magnification alpha\n",
" zoom = s_zoom.val\n",
" sm = s_sm.val\n",
" sr = s_sr.val\n",
"\n",
" #Find x range for all valid solutions \n",
" alphamax=alpha()\n",
"\n",
" #Set angle range and calculate radius\n",
" phi= np.linspace(alphamax/2,np.pi-alphamax/2,500)\n",
" phi=phi[int(0.5*(1-zoom)*500):int(0.5*(1+zoom)*500)]\n",
" #phi= np.linspace(0,np.pi,500)\n",
" \n",
" rv=1/r(phi)\n",
"\n",
" clearsetplot() \n",
" \n",
" #Check if results a biggen than photon sphere\n",
" if sr*Ro>sm*3*G*M:\n",
" x=rv*np.cos(phi)\n",
" y=rv*np.sin(phi)\n",
" \n",
" #plot lightpath curve\n",
" ax1.plot(x,y)\n",
" ax1.grid()\n",
" \n",
" #Angular Deflection\n",
" dx=np.diff(x)\n",
" dy=np.diff(y)\n",
" dydx=dy/dx\n",
" da=np.arctan(dydx)\n",
" dam=np.max(da)\n",
" ax2.plot(x[:-1],-da)\n",
" ax2.grid()\n",
" \n",
" #Angular Distribution\n",
" ddy=np.diff(da)\n",
" ddydx=ddy/dx[:-1]\n",
" ax3.plot(x[:-2],-ddydx) \n",
" ax3.grid() \n",
" \n",
" plotdatatext(sm,sr,dam)\n",
"\n",
" #scaling method and draw sun\n",
" plotoptions(x,y,-da,-ddydx,sr,sm) \n",
" \n",
" else:\n",
" #Plot Text No solution\n",
" plotnosolutiontext()\n",
" \n",
" fig.canvas.draw_idle()\n",
" plt.plot\n",
"\n",
"def plotdatatext(sm,sr,dam):\n",
" e1v=e1(sm,sr)\n",
" e2v=e2(sr)\n",
" e3v=e3(sm,sr)\n",
" \n",
" tau=np.sqrt(sm*M*G*(e1v-e3v)/2)\n",
" h = (e2v-e3v)/(e1v-e3v)\n",
" \n",
" text=('$r / r_s$: ' + str('{:.4e}'.format(Ro/(sm*2*G*M))) + '\\n' + \n",
" str( '$r / r_p$: ' +'{:.4e}'.format(Ro/(sm*3*G*M))) ) \n",
" ax1.text(0.98,0.98,text, horizontalalignment='right',verticalalignment='top', transform=ax1.transAxes, fontsize=10) \n",
"\n",
" \n",
"\n",
"\n",
" text=(str('{:.6f}'.format(dam)) + ' $[rad]$\\n' +\n",
" str('{:.6f}'.format(np.degrees(dam))) + '$^{\\circ}$\\n' +\n",
" str('{:.6f}'.format(np.degrees(dam)*3600)) + \"$''$\\n\") \n",
" ax2.text(0.02,0.98,text, horizontalalignment='left',verticalalignment='top', transform=ax2.transAxes, fontsize=10)\n",
" \n",
" text=('$e1$: ' + str('{:.4e}'.format(e1v)) + '\\n' +\n",
" str('$e2$: ' + '{:.4e}'.format(e2v)) + '\\n' +\n",
" str('$e3$: ' + '{:.4e}'.format(e3v)) + '\\n' +\n",
" str('$h^2$: ' + '{:.4e}'.format(h)) ) \n",
" ax3.text(0.98,0.98,text, horizontalalignment='right',verticalalignment='top', transform=ax3.transAxes, fontsize=10)\n",
"\n",
" \n",
"def plotnosolutiontext(): \n",
" text=('No solution') \n",
" ax2.annotate(text,xy=(0.5,0.5), xycoords='axes fraction',ha='center',color='red', fontsize=20)\n",
" \n",
"#This function set scaling axis and drawes sun\n",
"def plotoptions(x,y,dy,ddy,sr,sm):\n",
" i=0\n",
" for r in check.get_status():\n",
" \n",
" if i==0:\n",
" #Set scaling auto or equal\n",
" if r==False:\n",
" ax1.axis('auto') \n",
" \n",
" #Set y scaling plot ax1 \n",
" range=np.max(y)-np.min(y)\n",
" binsy=np.linspace(np.min(y)-range*2/100,np.max(y)+range*2/100, 5)\n",
" ax1.yaxis.set_ticks(binsy) \n",
" ax1.set_yticklabels(binsy, rotation=90, va=\"center\") \n",
" ax1.yaxis.set_major_formatter(ticker.FormatStrFormatter('%.1e'))\n",
" #plt.setp(ax2.get_yticklabels()[-1], visible=False) \n",
"\n",
" else:\n",
" ax1.axis('equal')\n",
" \n",
" #Set y scaling plot ax1 (equal x=y and 5 bins) \n",
" a=ax1.get_yticks().tolist()\n",
" ax1.yaxis.set_major_locator(ticker.FixedLocator(a))\n",
" ax1.set_yticklabels(a,rotation=90, va=\"center\") \n",
" ax1.yaxis.set_major_locator(ticker.MaxNLocator(5)) \n",
" ax1.yaxis.set_major_formatter(ticker.FormatStrFormatter('%.1e')) \n",
" \n",
" if i==1:\n",
" #Draw Sun yes/no\n",
" if r==True:\n",
" circle=plt.Circle((0,0),Ro, color='orange',label='$r_{sun}$: sun')\n",
" ax1.add_patch(circle)\n",
" \n",
" circle=plt.Circle((0,0),sr*Ro,fill=False, ls='--')\n",
" ax1.add_patch(circle)\n",
"\n",
" circle=plt.Circle((0,0),sm*3*G*M, color='gray',label='$r_p$: photon sphere')\n",
" ax1.add_patch(circle)\n",
" \n",
" circle=plt.Circle((0,0),sm*2*G*M, color='black',label='$r_s$: Schwarzschild radius')\n",
" ax1.add_patch(circle) \n",
" \n",
" ax1.legend(loc=3,fontsize='8',markerscale=0.25,facecolor='none',frameon=False,prop={'size': 8})\n",
" \n",
" i=i+1 \n",
" #Set x axis ticks\n",
" range=np.max(x)-np.min(x) \n",
" max=np.max(x) \n",
" binsx=np.linspace(-max-range*2/100,max+range*2/100, 5) \n",
" \n",
" ax1.xaxis.set_ticks(binsx) \n",
" ax1.set_xticklabels(binsx, rotation=0, ha=\"left\") \n",
" ax1.xaxis.set_major_formatter(ticker.FormatStrFormatter('%.1e'))\n",
" plt.setp(ax1.get_xticklabels()[-1], visible=False) \n",
"\n",
" ax2.xaxis.set_ticks(binsx) \n",
" ax2.set_xticklabels(binsx, rotation=0, ha=\"left\") \n",
" ax2.xaxis.set_major_formatter(ticker.FormatStrFormatter('%.1e'))\n",
" plt.setp(ax2.get_xticklabels()[-1], visible=False) \n",
" \n",
" ax3.xaxis.set_ticks(binsx) \n",
" ax3.set_xticklabels(binsx, rotation=0, ha=\"left\") \n",
" ax3.xaxis.set_major_formatter(ticker.FormatStrFormatter('%.1e'))\n",
" plt.setp(ax3.get_xticklabels()[-1], visible=False) \n",
"\n",
"\n",
" #Set y axis plots ax2 and ax3 \n",
" range=np.max(dy)-np.min(dy)\n",
" binsy=np.linspace(np.min(dy)-range*2/100,np.max(dy)+range*2/100, 5)\n",
" ax2.yaxis.set_ticks(binsy) \n",
" ax2.set_yticklabels(binsy, rotation=90, va=\"center\") \n",
" ax2.yaxis.set_major_formatter(ticker.FormatStrFormatter('%.1e'))\n",
" #plt.setp(ax2.get_yticklabels()[-1], visible=False) \n",
"\n",
" range=np.max(ddy)-np.min(ddy)\n",
" binsy=np.linspace(np.min(ddy)-range*2/100,np.max(ddy)+range*2/100, 5)\n",
" ax3.yaxis.set_ticks(binsy) \n",
" ax3.set_yticklabels(binsy, rotation=90, va=\"center\") \n",
" ax3.yaxis.set_major_formatter(ticker.FormatStrFormatter('%.1e'))\n",
" #plt.setp(ax3.get_yticklabels()[-1], visible=False) \n",
" \n",
" \n",
" \n",
"def clearsetplot():\n",
" #plot lightpath curve\n",
" \n",
" ax1.clear()\n",
" ax1.set_title('Light path', fontsize=12, pad=10)\n",
" ax1.set_xlabel('x [m]', fontsize=12)\n",
" ax1.set_ylabel('y [m]', fontsize=12)\n",
" ax1.tick_params(axis='both', which='major', labelsize=8)\n",
" \n",
" ax2.clear()\n",
" ax2.set_title('Angular Deflection', fontsize=12, pad=10)\n",
" ax2.set_xlabel('x [m]', fontsize=12)\n",
" ax2.set_ylabel('deflection angle [rad]', fontsize=12)\n",
" ax2.tick_params(axis='both', which='major', labelsize=8)\n",
" \n",
" ax3.clear()\n",
" ax3.set_title('Angular Distribution', fontsize=12, pad=10)\n",
" ax3.set_xlabel('x [m]', fontsize=12)\n",
" ax3.set_ylabel('angular change [rad/m]', fontsize=12)\n",
" ax3.tick_params(axis='both', which='major', labelsize=8)\n",
" \n",
"#Display plot n startup.\n",
"updateplot(1)\n",
"\n",
"#The following code checkes if slider changes. This line is looped automatic by pyplot\n",
"s_sm.on_changed(updateplot);\n",
"s_sr.on_changed(updateplot);\n",
"s_zoom.on_changed(updateplot);\n",
"check.on_clicked(updateplot);"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "402b17ba-f09b-483f-9ebf-5480a3030e62",
"metadata": {},
"outputs": [
{
"data": {
"image/jpeg": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEABALDBoXFhsaGRoeHRsfIi4lIiIiIjElJScnNS4yMDIuLys1SFBCNThLPS8wRGFFS1NWW11bMkFlbWRYbFBZX1cBERISGRYZLxsbL2I9OT1dV1dXYFdXV1ddV1dXV11XV1dXYF5dV1dXV1dXV1dXV1dXV1dfV1dXYldXV1dXV1dXV//AABEIAWgB4AMBIgACEQEDEQH/xAAbAAEAAgMBAQAAAAAAAAAAAAAAAwQBAgYFB//EAEUQAAIBAgMDBwkFCAICAQUAAAABAgMRBBIhMVGRFyJBU2Fx0gUTFDJSgZKhsRUzctHhFiNCQ2KTwfBUonOyggZjg6PC/8QAGgEBAQEBAQEBAAAAAAAAAAAAAAEDBAIFBv/EACgRAQACAgAFBAICAwAAAAAAAAABAgMREhMhUVIUMTKxBEEzgSKh8P/aAAwDAQACEQMRAD8A+fgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7Lk3xfXUOMvCOTfF9dQ4y8J9NAHzLk3xfXUOMvCOTfF9dQ4y8J9NAHzLk3xfXUOMvCOTfF9dQ4y8J9NAHzLk3xfXUOMvCOTfF9dQ4y8J9NAHzLk3xfXUOMvCOTfF9dQ4y8J9OMAfMuTfF9dQ4y8I5N8X11DjLwn00AfMuTfF9dQ4y8I5N8X11DjLwn00AfMuTfF9dQ4y8I5N8X11DjLwn00AfMuTfF9dQ4y8I5N8X11DjLwn00yB8x5N8X11DjLwjk3xfXUOMvCfTQB8y5N8X11DjLwjk3xfXUOMvCfTQB8y5N8X11DjLwjk3xfXUOMvCdz5cp3ySvfLm5kqU6kJbNqjslufa9GVcRVq1KWIjLzsJOi/N0VC8bOlf1kruWZtbVsWm8OQ5N8X11DjLwjk3xfXUOMvCdliKmKpqUYSnK81CMnTi3HPBJSskk1GWvde5XxGPxfmMyjUjN52kqd7OCjHK0oybzSzSWzTp2Acryb4vrqHGXhHJvi+uocZeE7PE168Y1ZOdZN1FCnGFNNJOMXd81vLfNd9ltppLE4mEmoyqVn5vm/u8qzKnfNJOKvd7pbWlbRgcfyb4vrqHGXhHJxi+uw/GXhOwrqrJxnSq1m40qrzyppNy5jUWnFL5X2mtWVdVKs4wkpJVHG0P/ALdHW38TvmtvtYDkeTfF9dQ4y8I5N8X11DjLwnceS61p1VKVSWeraEpwyuSVOLb0SVtHrZIhxtepGrWVNzTc4RvFXy/u29VlluXRtaA43k3xfXUOMvCOTfF9dQ4y8J2eHxWIkk5+cjU81GUKfm7QnJwu80nHmvNpa6tZbyvKtWk4XnWdONSD846Vpxk4VFNZcvqrm6tOzk9dNA5Tk3xfXUOMvCOTfF9dQ4y8J3PkmpVlUk6kXrRp2k4ZXJ5qu3Ra2ytrovsVzz8LSl5m2V+c85TbtSnGVlWi3eT0lpuA5bk3xfXYfjLwjk3xfXUOMvCdX52rSj/HTT83HMqeaWtapmSunfS3de5piJV3TqyzVpN4aqqcXSTVRpzy5o5dJNZdNL7ugDl+TfF9dQ4y8I5N8X11DjLwnfYOrOVaopyqJqUkqeS0Mt1lkpW1bX9XS92noAfMeTfF9dQ4y8I5N8X11DjLwn04AfMeTfF9dQ4y8I5N8X11DjLwn04AfMeTfF9dQ4y8I5N8X11DjLwn04AfMeTfF9dQ4y8I5N8X11DjLwn04AfMeTfF9dQ4y8I5N8X11DjLwn04AfMeTfF9dQ4y8I5N8X11DjLwn04AfMeTfF9dQ4y8I5N8X11DjLwn04AfMeTfF9dQ4y8I5N8X11DjLwn04AfMeTfF9dQ4y8I5N8X11DjLwn04AfMeTfF9dQ4y8I5N8X11DjLwn04AADSpVjG2aSjmdld2u9yA3BgyAAAAAADVST2NbL+42PHn5OrRoU4KSk6cFBRV0pWVrvVW3+5AeupLf2GTzI+S2nB5k2pZmnezd327mzFbyfVnUqyzqMZNZVq7xtTuty1jLo/i4h6WZXtfXcbHk0vJEk7upeW3NZp5ssFd6/0fM9UDIAAAAAAYAyAVsXiXTcUlF3vtk1a1tye/sAsmAZAAADAvrbpMnnY3ydKrU84qmVqOWOmy6alrt6Vs9lAegLq9uk8mt5NqZ0oTeV31u+Yuds11bv8AJGcT5NrVIz/eqM5dKT5vrWs+xtP3dAHqTkoq8mkt70NIxhBSklGKbzSask30tv8AyVqmCbhZSTl53zl5XafOzJcNPcVl5HlqnUvFr1dkVreyjuvs10sgPVjJNXTTW9DMr2ur7jzH5LnmbVV26FsW2+W259/SH5LleTjNRzNScVez0gsre7mNX/qA9QFLB4GVOSlKo5O1nt3QXS98X8ReA1lBO10nZ3V95kyAAAAAFTH4t0lFrLrf1pJfV/PXuAtgwZAAAAYT+QPK+yJXk/OvntylZW51ppbPxR2+xED1Qmns1PHXk+vnm1Uy6uzbfOvn2pPozq34Vs6NpeSql1ataPPvZNN5nN/WSf8A8QPUdSKaTaTexX1ZspJpNPR7ClicA5yVnFRyqLurtWlfTtIY+TJ5otzUsri9bu7St7unf+YelmV7XV93SZlJLa7Hl/ZU1ktU1jFK7ve/NvJO+28b67zL8m1G03UTai4p66Jq19u3QD1AeYvJk9b1X022+t0Seu3s2aI9MAAAAAAFDylTu6bv029Vy2226bNPpuL5S8o05yUFG9k8zalbZ0e8BXUHOo5JSywi/nIqenUOq+SLdfmyrSUU2oRdrbWsx5f2zW/4vyf5GWSuSfhbX9be6zWPlG3qtUFlvGKzK606NNvFcTMo0Em8sHlTbsr2t3GK1WGSDqU1aSvLS6WzTvu1p2EVSrGm1CnQTbSdkrJJvp07Gaw8HncNKyiottaWj22295a9GpexHgilLF6O2HklZ/w2eluz/dPdLUxuWDm6MtL3VtbKOa/+O8Cx6NS9iPBD0al7EeCKqxsunDzs3ZWXRba7ljDVc7lek4Wtttr3AZnhqVnzI7NxlYal7EeCJJxVnothlQW5AebiqtOE3FUoWVm5P3tpLsjFv3olo+blZSpwjP8Aije9rq6V7K7saYqvUUpKFNPLeytrK0b7d12o8SXD1YSk0oxzJ2m1GybV+n3Pb/kCGu6cK8YWp5WnfRXjpe+3Z7rdpWhVclK1OEWqsYRUqbu4tLbe2u16dBeqVGq+VZsiheX7u8eyzS2+8qxrVFf13FVYKP7u94v1k+anZbb92r2ARSxEUpJqjn85ljZJxad7LNfRpK73bndEixcHGbWGTyyUbJxb1k1qtLPTZ2rtIquJxOWVoSUlN7IXX8Vorm9kddjv6yLSxVdxqNUVeM0krNaZrPatdLarfxCvWxCjUlHJTilb1o6wV4c6Wtrc9/D3lzA2fmpKKi5Um2lp7JBXq1lUkrSUdL2p5ssbw1i7c56z012bN9nCOT8y5K0nSd9La8zoAvFHynJLzekG1K/OTdktrVl2oukOJpTllyVHBJ85WTzK6012fqBUx1060moyywi43je2sr9JWnWSoZ7Us6k1bL6yUpJNK/SlfS/ZcvYiWWVZ87SnF81ZpbZ7F0sgw+IqZ6eZ1LZHKd6bt02Saj62/u2aoCsqk26kVTppxnGKeS6blJq2kuhJSb3PYbYiTgpyy0nGM7epaUko3air853svczevVxMWsrm4uq0rwV8qyqztHpeZq9tLarpxDEYnTM5O00tIetsulzdI9r4gYnNOGJcVSap3UXktrrdNX2LTXp1FbExhJLzMHebirLnNKWRyt39F9mptiK1R0qi58n51xSlT0lDTT1bNbVfTvPVpxaVm76votpfRAeRg6vnZr93SUHJxVlmvzFK99N9vcz0vRIezD4SZwTadldbH0o2ArSwkLPmw+ERwkLLmw+EnlsYjsQEPokPZh8I9Eh7MPhLBgCD0SHsw+E1hhIWXNhs9k3qV7PLFZp7uhd76PqaQoOSXnJN6erHmx/N+8uk21qQox0l5tPdbXgaWp9FO/8A+Jr6lynSjHSMVHuVjYdDqpRpJtLzFlvcY2/9rm1Kko1YWSV4SvZW6YFsrr72n+Cf1gRVko+U6zhGOVJyv0pvmr1tnRsJ62KhB5ZZr2vzYSlp7kzSup1YRdKeVPbeOrXv2AaVaWarPNlaUI2utmsr9JL6JD2YfCYl95P8EPrIsgV/RIezD4R6JD2YfCWABVqYWGV82Gz2Tb0SHsw+Elqeq+5m4Ff0SHsw+EeiQ9mHwlgir1ckbpXb0it7ewCtWp04vKoRlK17Rirpb227IUacJPK6cYyte0orVb007MsUqWSL6W9ZPe94qUs8V0SWsXue8vROqvi6cKVOU/NxlboUfd7l2lWjVUpWlClG9PNl09q1819U1rsLtTFSVGU4wvOOjitbSvZ966e1Fejiarms2ZcxtrI8l783K7XvbVq+l7EVLi6ShTlKNOMpdCUL6vS7S1strKPpCthv3cLVIpz5mqfM5tm9vPv3Jnp+UJSjQqODkpqLccsczvbSys7leviKv7nzUJOLlHO8trLm6WlZ7G3dbLAU6Ve6gmqPnHPK0o8yWkW3GV9ivx0NMPjb5FKjBubWqWVRuoXjq9ZJy2f0smjisTnirTlTztZstm1zLL1dFrN3svV2kkMZWWSKhKd6k05Sg46KfNWiX8Lve1tAIq9VqckqdNW6JRs1G0W57bW1atvW0s+T9fMzyqLlCV7K19Vbpf8ArNK9evnkkpRW7LdKFottSSfOvmVteh2JsHKclRc1aThK99u1be0C+UfKM4J01Om55m0tbW2fMvFHyllXm3JxXOUdb6p6tad3SBjGTnFYiVOOapGknCO28lmsuJyn295c/wCDD+3LxHX5n52pzXshu11kWcz9l/ICvGvNQpuUHdxTnZeq9NLd7+TNamIqRmrU7xcU9E9HfW7/AMJXLWZ+y/kMz9l/IChPF1lGzoN813ael7X2bezvNvTatk/MPVXtrdbOzbq+BbqSeV6PZ2G2Z+y/kBSeKrW0pdGm26e5mViquRy8y766a30tbv1b4FvM/ZfyM5n7L+QFB42rzr0JWs++9tC5hqjlBOUXF66PvMzk7PR7OwypPc/kBuYUUtisYzP2X8hmfsv5AZewxD1V3GHJ22P5GISdlo9nYBuZNMz9l/IZn7L+QGxXj95T/wDHL6xJsz9l/Ihg/wB5T0/ly+sQKXlm8LVLwStZ5s1r6tfxRWpZq13RhCMYp83+Kb0tbps7rXa+JF5WcZZYtJta65o6dkop63WwY2rHzdJxUdqklOMnaK220uujaBvjFJ+fUL53TjlttveZUjSxGVK1RSUZ87PpK7lljZt2drO+r2K71L7UvO1NVbLC2nbLtLFpb1w/UDy1TxCytxlKmoz5iqWm75sqb32ypO+mpI4VfN0o5ambMm5ZvVV29dedZaa32p66noWlvXD9RaW9cP1A8bE0sW1PbrUuss7q2TZ0WV+/tTJKlHEZnkc7ecvFye97XzvVS2LpvsPUqKWV6rZu/UzaW9cP1Ap4OhUu87naMrxu9ZXttV3on3dxfNLS3rh+otLeuH6gZlsfcI7EayUrPVcP1EVKy1XD9QNyCrUcpOEHZr1pez2L+r6fVXqSVoxazy2abF0y29H5G9Kk4RsmuGre967So2p0lBWirL/dW+kzT9Vdxi0t64fqYgpZVqtm79SKkBpaW9cP1Fpb1w/UDcrL72n+Cf1gTWlvXD9SCN/O0729SXR2wAr+WJtKmk7Xlrra6s/6o31t0+4lxeLdKMLZNVrmklstvfz195B5dajCMrzWtrKTSaaa1s0ttmZxeJVKjRyuN5WtmTV42V9nu0AtS+8n+CH1kWSpJS87U1VskLadsu0sWlvXD9QNwaWlvXD9RaW9cP1AVPVfczciqKWV6rY+j9Ta0t64fqBsQLn1W+inovxNa8E/mzerNwi5NrRX2fqa4elKMEm1fa9Ol6vp3lRLLY+4R2I1kpWeq4fqIqVlquH6kVVxkp023SScpqyT9pdPw3+FENOVbzkLt3yPMt+vNdr2v0OyWvT0Fnyhh51KNSEWlJxeV7LPodyHC0JuEZ522k8qb2JyurvfayKibykqjo1FTTzZHlyu0s/8Nuj5kFfzsnSyKaS26pK94O8lfVZc6/1FrF0qk6cowmot6Xs9nTsemnT0FL0SvKnh1nivN5My151st3e/4tHtIrGGoYi0VOUtKi52Zp5VFOTav/FJWt0ZjEPSoz5qfm3UvztWo83TVt29fW+22xaENHydiYum8ytF6xbus3MTm7/hn287vJaODxMMijNRgpbHaU2ubrJqyeyXFdIG9eGIc5esvwvm5bLmrY8zlm1tezJsGppUfOevklfp6UQ1cFWlObbjLNF6q8brKkoWvosycr9pYw6knRUrXUGn383pAulHyjBPJfzl1qlBN7La9j/U2xeInCSSy2a05spSb6dIrZs17SLGyq/ubNpv11BNq+ml+O2wFj+ZP8MPrIslb+ZP8MPrIsgADAGKnqvuNjWp6r7iOeKgna93uisz+WwCYFWpiJpZsqhFdNSSXyVzy6/lWrL7uSS9pwtwTd+NjPJlpjjd509Vra3xh7k/VfcZRznplZ7asn7or/A9Nr9FaS71F/4Ob1+H/oa+nyOkB4dDypUWk2vxZbr32enzPThiJtJ5FKL1TpyUlbfrb5XOnHkpkjdJ2xtW1flCw9hiGxdxHHEwlpez3NZXwZJDYu40RsAABWj95T/8cvrAsleP3lP/AMcvrADTH4x0VFqDneSTtfTgmb1oVJpZZZNNU1fXTb8yl5boqShaMXLVLmKUtn4ZaJ6k1TEToxpxlaUne8tmit0LZtWuxATfzZ/hh/7SLJW/mz/DD/2kWQAAA0qeq+43NKnqvuNwAAA1lsZrKajDM9iRtLYyv95NL+GFm+2XQvdt77bgkt8PB6zl68tvYuiPu+rZOYMhWDFP1V3GTFP1V3AbAAAVl97T/BP6wLJWX3tP8E/rADTHU6knFQWi1upqLvqrNOLTWptUpVJxhz8jus6VpXXSrtfMq+Xot04WTupp36FZNr+GXds6eO0sZKnRpvIo6NNTmk1l02u1+/5AWZfeT/BD6yLJWl95P8EPrIsgAABpU9V9zNzSr6r7mbAQV+dOEOi+aXctnztwJyDD86U573lXdHT63ZOWUhiWxiOxCWxiOxEVkgoc2c4dF8y7nt+d+JOQYnmyhPc8r/DLT62ZYSU5rT9Vdxsa0/VXcRW5gyABWX3lP8MvrEslZfeU/wAMvrECv5SoyqSivNSko6prI1d6aqbWvb2jH1rKjeKUnJScZN83frHTRtFnF4Z1VFKcoWd7x0l7ns4pkOJi15uLqx75JZm+jsXbs9wG+V+dqc57IbtNZdhZyv2n8iD+ZP8ADD6yNpQqSb5yhH+nWT972cPeBmpUUPWnbdsu+5dJHnqS9RNL2p2X/XbxsS06EYapa9LerfvZIVFWeFbi885S02bI8Ft99yWSjSg3fLGKu7JbO5Ikqeq+48ry3Xu40l+OXHm/NN+4yzZeXSbT+nulOK2oUsViZVZXley9WO5du9/QhBiUkld7D85bJfJbc9Zl9SKxWNQyCjW8oqNruMU3a8nYUPKClreMlvi7nT6PNw719Mufj37rxPg8W6L0vkb5yX1XaV001dbDJzUyWxW3Hu1tWLRqXSShGpHapRautE01vIoYZpLJUlHTY+dHg9V7mVvI1a8JU3/DrHufR7nf3WPShsXcfpMWSL0i0ft8q9OG2pV/OTj66lb2oc5cLX+pLTmpq8Z3XZYkI6mHjJ3atL2lo+KNHnq2yv2n8iGC/eU9b/u5fWBtCNSLSzKcd70kuGj4I1j95T/8cvrAioPK+FlVppRlGLTveSi+zTMpJdPQY8pVVBUU8jlmVsy45fkaeW43jB2babeiUuh6NOMtu+35O3WpTmoZZuFmnJWTutNOz3bwNbPztTVerC2nbLtLNpb1wIP5s/ww+siyBraW9cBaW9cDYAR1E8r1WzcbWe9cBU9V9xsBraW9cBZ71wNjAEGJqSjHSzk9Iq21/wC6+42oUnCCimu9rVvpbI6fPbqdFmod3TL3/RdpYjsRUjuWlvXAWlvXA2BFaWe9cDFNPKtVs3G5in6q7gFnvXAWe9cDYAa2e9cCvG/naf4J/WBaKy+9p/gn9YAVvLcW6cWoOdpXtZNWs1qnGW/cbY6u40oNJJ6N5k9Iq2a9lp0GPKtHNkbzuKb0jCM9bOzcXFk9SjOcIpSdN5dVZPW2x9ncBiSfnamqtkhbTtl2lmz3rgQS+8n+CH1kWQNbPeuAs964GwAjqJ5Xqtj6DTEzlGDs1mekdOl6Ikqeq+5kT59VLopq/wD8ns4K/wASLCS3p03GKimrJWWhvaW9cDJkitJJ2eq4CKdlquBmWxmY7EBiz3rgaVKblFxbVmrPQlMAQ4acpQV2sy0lp0rRm9O+VarZuI1zKr3VFf8A+S28VbgS0/VXcWUhm0t64C0t64GwIrW0t64FdX85T/DL6xLRW/mU/wAMvrECyUcfRzTpPXSVtIZu2/ZsLx5/lODlKkrpJTvq7NvZbg3suBNnXnamq9WHT2yLGdb1xIGv3lT8MPrIsWW4DGdb1xGdb1xM2W4WW4DSpNZXqth4PlCV69TsaS7sq/y2e/USyvuPA8oxtiKnbaXuypfVM4fz/wCL+3R+N81co+UquVN2bUU5aF4peUaOZa7JJxZ878Lh50bdOffBOnBznVq1lOak25Lodkr7EZwtWrQq54xla+qs7NbjFXDVaFaMZ39ZWfQ1foM4PCVK9XLHNlvzpdCR99853uBndNdG1FsqYGFk30bEWz8/+Zw86dPpYN8EbWvJkrV12xkvo/8AB7sJKy1Ww8PyXG9ddkZP6L/J7kErLuPp/gfww5PyPmznW9DOt6M2W4WW47WDGdb0QRf7yn/45fWBYstxXiv3lP8A8cvrACr5Xpp5ZPNbVc2MZXdtNqfbxJcXiZU1TSajmXSs2unat/b3Fby0nKUIuLUdqmva3bexFrGZlGmqeZW15sU1ZdGr7fkBJ/Nn+GH1kWSpaXnamq9WFtO2XaWLS3rh+oG4NLS3rgLS3rgBmp6r7jYjqJ5Xqtm42s964AZK+Ied+aXSrze6O7vezibV6jitLOT0irbX+Qo0XFesm27ydtr4lRK1o+4R2I1kpWeq4CKlZarh+pFSA0tLeuH6i0t64fqBsYp+qu4xaW9cP1MU08q1WzcBIDS0t64C0t64AblZfe0/wT+sCa0t64EEb+dp39ifR2wAi8rVKkIRlSUnJS6NlrW10enTs6DbE4uVOnCWVaq7zSUbaXtqQeXKcHCLcFKd2k8t2lZt/wAMtNNxmtiU6NJwcZN21cWlZNKXRpu1AtS+8n+CH1kWSo1LztTVWyQtp2y7SxaW9cP1A3BpaW9cP1Fpb1w/UDXETUacpPYkzGGpuMed6zd5d7/LZ7iGtecnG6yw1lptltS923gWrPeuBUbA0s964GbPeuBFJbGZjsRpJOz1XARTstVwAkBpaW9cBaW9cANMTTco831k7x71+ez3mcPNShFrY0ja0t64FajeEkrrLPVabJdK9+3iVFwGlpb1wFpb1wIrcrfzKf4ZfWJNaW9cCBX85Tv7MujtiBaPO8pTtUpK0Xd63zbLrdpa9tp6JSx9RRnR9a7nZZUnfR7b9AEj+8n+GH1kWSpd+dqadEOntkWMz3fMDcGmZ7vmMz3fMDNT1X3Hl+WqHq1F0c2Xd0Pj9T0qjeV6dG8TWZOMo3TVmnsaM8uOMlJrP7eqW4bbhzJiUU1Z7Cxi8JKi9buDfNk/o+0gPzl8d8VtT0l9Stq3jcKk8Cm9Hpueop4JLa9Ny0LYOj1ebh1xfTPk4970JW0QBZwWCdZ3s/Np6vZm7E/8/wCrDHitltqGlrxSNyu+RqFoSqP+PZ+FbH79XwPShsXca6pWUdBCTstOjefo8dIx1isfp8u1uKdykBpme75jM93zPby3K0fvKf8A45fWBNme75kEH+8p6fy5fWAFXy1QnNRyq6TvopOV9q2PY9C3Vw7lGCTlCytZPRbOOy3vLJTx+JlTcFFxWa+2N92zVb+19gG/82f4YfWRZK382f4YfWRYAyDDkltdiF4yn0SzPdBZvoDaSp6r7jWtWUbLbJ7Ira/yXaRTlUmnZZFbbLWXuS0X+6EtKioXtdt7W9W/eVGKNJpuU9ZvgluXZ9SUGSK1lsYjsQlsYjsQGwAAwYp+qu5GTFP1V3AbAAAVl97T/BP6wLJWX3tP8E/rACp5daVOGazWfVZXJvRpWtGXS10frbcJSpx83KMU1ty32rathNUpRmrSipLc1dEGMxPmYrSHT601BaLtAzL7yf4IfWRZK0vvJ/gh9ZE8pKKu2kl0vQDYgr1WrRhrN7NyXtPs+pr59z0pLT22ub7va+naSUaKhfa29sntZU92FTUKbS3PV7W+lslNanqvuZuRQAAay2MR2IS2MR2IDYAACF0lOmovctVtT6Gu0mNKfqruAjoVW7wnpNbdzXtLs+hMaVqKnbamtU1tTIlXlDSotPbiub71/D9O0qeyyVv5lP8ADL6xJ4TUldNNb07og/mU/wAM/rEirJTxkLzhzM2u3Na2qdrdOy/uLgAqVqmScm1KzUbNRb6Xu70Sekr2Z/AyaV7O2j6OkqSo1bWUrPzmZPM/V3PTZ2fMCX0lezP4GPSV7M/gZAqOIcEpVIt5Xeytd3VrPo0utnSSYOhUhm85Uz3St321/wB7AM1cUlGTcZ7H/Azb0lezP4GTMp1cPVallqWbkntdkklp2Xd38gJZ14yTThNp6NODszza+Ai3en5yPY4Sa93Si4qOIcbOrG9pbI21dstn0W1NsHQqwlJ1J5k0rK7drbdv+szyYqZI1aNvVbzXrDxamGqxTbptpatpPd2pGYYWq/5bj3p/4TOkZ57w1fLFKolJX1bbV9Nu/p0/q7Ec3oMPb/bX1F1ehgIJ3qecn2KDUfetr+nYeisRFKyhNJf0MhnQruLXnI3yrYnHW7u7r3dHQTYSnOKlnlmbldd3+O7oOqmOuONVjTK1ptO5HiVb1Z/AzFPFJxXNnsX8DLJRqYetpkqW5+Z3benQu7ZpvPbyn9JXsz+Bj0lezP4GQOhXcbOpFu2tk43ea/rLZppsJMFRqQzecnnu7r/ejuA39JXsz+BkdCeecJJSsqb1cWtrjbb3FsACn5Qc7QyZr3u7RUtF0atW2/IuFfFYfzmS0pRyyTaUmk1dXTtt2ARVpuFScnfK4wStBvplpp3o1kot3aqcJ24XL0r2028SpKhVtZSs1UzJ5n6t9jVte6+7UDRQprXzeu/zTbJlX7Jf25ESo4jKlKpFuzvZWu7+0tmmmwkwdCpBy85Uz3tbsfS/93AYq4m0ZNqVrP8AlyN/SOyX9uROynVw9VqWWpZuSe12SVtOy7u/l2gSekdkv7ch6R2S/tyI1RxGVp1Y3tLZG21c3XosZwdCrCUnUnmTSyq7drd/16QNp4nR6S2dXIRxOi0ls6uRZZ5/o2IUIrzqzLpbb101a6dj0/q7EBY9I7Jf25D0jsl/bkRToV3Frzkb5VsWXW+rzLs7CbCU5xUs8szcrp36NOHcBj0jsl/bka08TeMWlK1l/LkWinUw9XTJO37zM7tvTXTu2OwEnpHZL+3Iekdkv7ciLzGIcLOpG9tbK13mv6y2aabCTBUakM3nJ57vT/egDPpHZL+3I0oTc5wkk7KEtXFx2uNtvcy4YAyUvKdfJBNZb3/ivbKvW1WxbC6Q4inOStCSjo73jf8AygIK83Cc5O+VxilaDexyve3ehzc2Zwk3vdOTt3X2Fx3tptKkqFVqylZqpmTzP1dz02dndqBv6R2S/tyHpHZL+3IiVHEZUpVIt5WnZWu7q1n0aXWzpJMHRqQcvOTzXSt321/3sAxWxNoSbUrJO/7uW429I7Jf25FhlOrh6rU8s7OTTWrsrW0W213cCT0jsl/bkPSOyX9uRH5nENWdWN+dsjvXN7re8zhKFWEpOc80WllV27cfr0gbTxOj0ls6uQjidFpLZ1ciyUFh66il5xXTvdt9m1dOx6f1diAn9I7Jf25D0jsl/bkROhXcLOpG9lsTjre75y7NNhNhKU4qXnJZm3dd3+O4DHpHZL+3I1pYm8YtKVml/LkWylUw9X+Cdv3mbVt821svd02Ak9I7Jf25D0jsl/bkReYxDglKrG+V3srXd1sa2aXWzpJMFRqwzecnnva3+e4CPm5s2SSlvVOSv322maE884NJ2Slq4uPSt/cy6AAAAAAAAAAAAGHsMgDzo4WqqdNTfnJRqKTd+jo27tO+19rIKnk+t5qonN1HKDjZzbV3CK6dPWUn3P3HsADAMgAAAAAAAAAAAAAAAAAAABgyAPNjhaqpRjUfnJKrGT1/hTW+2z52vtZFPyfW81JObqN03Fxc2024W2PT1tT1wBhbDIAAAAAAAAAAAAAAAAAAAADBkAea8LV81lm/OS87CS1vaKlF21tsSfft2sjq4Crllz3O8WnFzbUrxkmknpty8H7/AFgBpSVoxT2pI3AAAAAAAAAAAAAAAAAAAAAAAANZSSV20l2mnn4Xtnjfv7/yfADNasoK8thUj5WpNqzdn0tWsy260NmaO/athjzlP2o7N62Aa4bFQq3yO9vd/u05zyv5dxFLE1acHBRi1a8bvWMXtvvZ08JRd8rXbY4/y5Kh6ZWzRquV43cZxS9SOxOL6LGuKIm3WNss0zFek6aftJivah8H6j9pMV7UPg/Up5sN7Ff+5DwjNhvYr/3IeE6OGvi5eK3kuftJivah8H6lnyf5dxNWvTpylFKTs7Q12M8rNhvYr/3IeElw+JoUpxnGFbNF3V6kH/8AyebUiYnVXql5i0bt0dpkn1r+GP5DJPrX8MfyOd/ab+mp8UPCP2l/pqfFDwnJycrp51O7osk+tfwx/IZJ9a/hj+Rzv7S/01Pih4R+0v8ATU+KHhJycpzqd3RZJ9a/hj+QyT61/DH8jnf2l/pqfFDwm9H/AOoXOcYKNS8pJK8odLt7InFlhYy0mdRL38k+tfwx/IZJ9a/hj+RDkrb/APsvAMlbf/2XgMtz3aJsk+tfwx/IZJ9a/hj+RDkrb/8AsvAMlbf/ANl4Bue4myT61/DH8hkn1r+GP5EOStv/AOy8AyVt/wD2XgG57ibJPrX8MfyGSfWv4Y/kQ5K2/wD7LwDJW3/9l4Bue4myT61/DH8hkn1r+GP5EOStv/7LwDJW3/8AZeAbnuJsk+tfwx/IZJ9a/hj+RDkrb/8AsvAMlbf/ANl4Bue4myT61/DH8jWTnFxedtOSTTS6SPJW3/8AZeAxlqKUM7vHMv4lt6P4V9SxM79xYq4uMHNPbGKltWt21/glo1FOEZLZJJ8SOpXpxbTaurX02X2XMem0rXzqyTd+iy/1cUaosAwZAEWJm405NaNLQlIMZ91LuAean1suEfyHmp9bL4Y/keJlxGf+fbPvd73+HzfzPWbxCTdqbtm0V7v2V9LgS+Zn1svhj+Q8zPrZfDH8iWnfKs1s1tbbL9JsBBSzKcouWZZU1dJbW93cTkMfvpfgj9ZEwAAAAAAAAAAAAYMgAAAAAAAAAABHWpRnFxkrp/4dyvLyXRe2F/e+76FwAQVcHTm25Ru303fZ+SIfsujZLJolZK73Jf4XAtzTaaTs2tu4o/Z8+vqbEtr47dv+7dQLVDDQp3yKyfRfTgcj5dw8HjKzdenFtxvFqd1zI7otdvvOtoUHC/PlJN6Zm3bs1OU8t+Ta88XWnClOUZONmlo+ZFfVM1xfL30xzR/j7bef6ND/AJNLhU8I9Fh/yKXCp4Tf7JxPUT4D7JxPUT4HVuPL6cmp8ftp6ND/AJFLhU8I9Fh/yKXCp4Tf7JxPUT4D7JxPUT4DceX0anx+2no0P+RS4VPCPRYf8ilwqeE3+ycT1E+A+ycT1E+A3Hl9Gp8ftp6LD/kUuFTwj0aH/IpcKnhN/snE9RPgPsnE9RPgNx5fRqfH7aeiw/5FLhU8JJh6VOFSE/SKTyyUrWqdDv7Jj7JxPUT4D7JxPUT4EnUxri+ljcTuK/bo/wBoKPt0+M/AP2go+3T4z8Bzn2TieonwH2TieonwMPT4u7bnZPF0f7Q0fbp8Z+AftBR9unxn4DnPsnE9RPgPsnE9RPgPT4u5zsni6P8AaGj7dPjPwD9oaPt0+M/Ac59k4nqJ8B9k4nqJ8B6fF3Odk8XR/tBR9unxn4B+0NH26fGfgOc+ycT1E+A+ycT1E+A9Pi7nOyeLo/2go+3T4z8A/aGj7dPjPwHOfZOJ6ifAfZOJ6ifAenxdznZPF0f7QUfbp8Z+AsYfyl52OamoyV7XXnNvwHKfZOJ6ifA6L/6epzo0JRqQnGTm3bK3pZbu4yy4qVruvVpiyWtOrRpd9Kn7C/8A2eAx5+UpQTiorMtef/mKXzLHn1un8EvyNJzzOKUZesnrFr5s54jr7N0ssJTc3Nx5ztd9zTX0XAj+zaNmsmklZq7tq77N/b3GKuCcpzln9aNrW7vlps7XvLFGnkhGN28qSu9rt0myNzIAAgxn3Uu4nIcWm6ckld26APD+1aue3nFbPa+Vbb+pl236M2w9T0ypqlQldX2uydnvsWPSY7p/BL8h6THdP4JfkBKZIfSY7p/BL8h6THdP4JfkAj99L8EfrImK9KWapJpSSyxWsWtby3lgAAAAAAAAAAAPmPKRi+pocJeIcpGL6mhwl4jjQB2XKRi+pocJeIcpGL6mhwl4jjQB2XKRi+pocJeIcpGL6mhwl4jjQB2XKRi+pocJeIcpGL6mhwl4jjQB2XKRi+pocJeIcpGL6mhwl4jjQB2XKRi+pocJeIcpGL6mhwl4jjQB2XKRi+pocJeIcpGL6mhwl4jjQB2XKRi+pocJeIcpGL6mhwl4jjQB2XKRi+pocJeIcpGL6mhwl4jjQB2XKRi+pocJeIcpGL6mhwl4jjQB2XKRi+pocJeIcpGL6mhwl4jjQB2XKRi+pocJeIcpGL6mhwl4jjQB2XKRi+pocJeIcpGL6mhwl4jjQB2XKRi+pocJeIcpGL6mhwl4jjQB2XKRi+pocJeIcpGL6mhwl4jjQB2XKRi+pocJeIcpGL6mhwl4jjQB2XKRi+pocJeIcpGL6mhwl4jjQB2XKRi+pocJeIcpGL6mhwl4jjQB2XKRi+pocJeIcpGL6mhwl4jjQB2XKRi+pocJeIcpGL6mhwl4jjQB2XKRi+pocJeIcpGL6mhwl4jjQB2XKRi+pocJeIcpGL6mhwl4jjQB2XKRi+pocJeIcpGL6mhwl4jjQB2XKRi+pocJeIcpGL6mhwl4jjQB2XKRi+pocJeIcpGL6mhwl4jjQB2XKRi+pocJeIcpGL6mhwl4jjQB2XKRi+pocJeIcpGL6mhwl4jjQB2XKRi+pocJeIcpGL6mhwl4jjQB2XKRi+pocJeIcpGL6mhwl4jjQB2XKRi+pocJeIcpGL6mhwl4jjQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/9k=\n",
"text/html": [
"\n",
" \n",
" "
],
"text/plain": [
""
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from IPython.display import YouTubeVideo\n",
"YouTubeVideo('0xngLoNqM1g')"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "bab2372a-dfe9-4c9b-8434-42a57ea2c444",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.10"
},
"widgets": {
"application/vnd.jupyter.widget-state+json": {
"state": {
"04a87474071e48a09ae13bd21a6d9dde": {
"model_module": "jupyter-matplotlib",
"model_module_version": "^0.9.0",
"model_name": "ToolbarModel",
"state": {
"layout": "IPY_MODEL_5a4b6230142d483ea3109c4f124a665b",
"toolitems": [
[
"Home",
"Reset original view",
"home",
"home"
],
[
"Back",
"Back to previous view",
"arrow-left",
"back"
],
[
"Forward",
"Forward to next view",
"arrow-right",
"forward"
],
[
"Pan",
"Left button pans, Right button zooms\nx/y fixes axis, CTRL fixes aspect",
"arrows",
"pan"
],
[
"Zoom",
"Zoom to rectangle\nx/y fixes axis, CTRL fixes aspect",
"square-o",
"zoom"
],
[
"Download",
"Download plot",
"floppy-o",
"save_figure"
]
]
}
},
"076caa1a2eee4b62a80fcc1d14dc57ce": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "1.2.0",
"model_name": "LayoutModel",
"state": {}
},
"095b29e578584867928d445c70c40d2d": {
"model_module": "jupyter-matplotlib",
"model_module_version": "^0.9.0",
"model_name": "ToolbarModel",
"state": {
"layout": "IPY_MODEL_a4c590be5dcc40b6a0569eee10823759",
"toolitems": [
[
"Home",
"Reset original view",
"home",
"home"
],
[
"Back",
"Back to previous view",
"arrow-left",
"back"
],
[
"Forward",
"Forward to next view",
"arrow-right",
"forward"
],
[
"Pan",
"Left button pans, Right button zooms\nx/y fixes axis, CTRL fixes aspect",
"arrows",
"pan"
],
[
"Zoom",
"Zoom to rectangle\nx/y fixes axis, CTRL fixes aspect",
"square-o",
"zoom"
],
[
"Download",
"Download plot",
"floppy-o",
"save_figure"
]
]
}
},
"13186ebf73ca4d509de1c0c70c640010": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "1.2.0",
"model_name": "LayoutModel",
"state": {}
},
"19d2819f6e294dc882110001c1236811": {
"model_module": "jupyter-matplotlib",
"model_module_version": "^0.9.0",
"model_name": "ToolbarModel",
"state": {
"layout": "IPY_MODEL_2c113d2882754782959903f51dc47ce4",
"toolitems": [
[
"Home",
"Reset original view",
"home",
"home"
],
[
"Back",
"Back to previous view",
"arrow-left",
"back"
],
[
"Forward",
"Forward to next view",
"arrow-right",
"forward"
],
[
"Pan",
"Left button pans, Right button zooms\nx/y fixes axis, CTRL fixes aspect",
"arrows",
"pan"
],
[
"Zoom",
"Zoom to rectangle\nx/y fixes axis, CTRL fixes aspect",
"square-o",
"zoom"
],
[
"Download",
"Download plot",
"floppy-o",
"save_figure"
]
]
}
},
"1faa548b3f6c41e79e308c3f4cb1a681": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "1.2.0",
"model_name": "LayoutModel",
"state": {}
},
"2148f7fc1ee54a57bb7f8f8934eb8c44": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "1.2.0",
"model_name": "LayoutModel",
"state": {}
},
"2c113d2882754782959903f51dc47ce4": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "1.2.0",
"model_name": "LayoutModel",
"state": {}
},
"2d74b4245b5e454bb8e38e790c141bfa": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "1.2.0",
"model_name": "LayoutModel",
"state": {}
},
"407d1906153e4eb999f08e56a34541da": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "1.2.0",
"model_name": "LayoutModel",
"state": {}
},
"449eecf81cce4e92a32f350c97f8a724": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "1.2.0",
"model_name": "LayoutModel",
"state": {}
},
"551805b2255d4143b2b8d941e0893f8b": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "1.2.0",
"model_name": "LayoutModel",
"state": {}
},
"5a03548beb1a4fb7be405029af49d5b9": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "1.2.0",
"model_name": "LayoutModel",
"state": {}
},
"5a4b6230142d483ea3109c4f124a665b": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "1.2.0",
"model_name": "LayoutModel",
"state": {}
},
"68c416ffb48e470d9577335f2a7ec153": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "1.2.0",
"model_name": "LayoutModel",
"state": {}
},
"6c44351932264a97b8c8a9d2667724e3": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "1.2.0",
"model_name": "LayoutModel",
"state": {}
},
"70eefb89f9c7431db23202d6188f8121": {
"model_module": "jupyter-matplotlib",
"model_module_version": "^0.9.0",
"model_name": "ToolbarModel",
"state": {
"layout": "IPY_MODEL_68c416ffb48e470d9577335f2a7ec153",
"toolitems": [
[
"Home",
"Reset original view",
"home",
"home"
],
[
"Back",
"Back to previous view",
"arrow-left",
"back"
],
[
"Forward",
"Forward to next view",
"arrow-right",
"forward"
],
[
"Pan",
"Left button pans, Right button zooms\nx/y fixes axis, CTRL fixes aspect",
"arrows",
"pan"
],
[
"Zoom",
"Zoom to rectangle\nx/y fixes axis, CTRL fixes aspect",
"square-o",
"zoom"
],
[
"Download",
"Download plot",
"floppy-o",
"save_figure"
]
]
}
},
"716b44a8037548559371350a9ff99fc2": {
"model_module": "jupyter-matplotlib",
"model_module_version": "^0.9.0",
"model_name": "ToolbarModel",
"state": {
"layout": "IPY_MODEL_d931b624bee148ad89d2ea2e3108fc11",
"toolitems": [
[
"Home",
"Reset original view",
"home",
"home"
],
[
"Back",
"Back to previous view",
"arrow-left",
"back"
],
[
"Forward",
"Forward to next view",
"arrow-right",
"forward"
],
[
"Pan",
"Left button pans, Right button zooms\nx/y fixes axis, CTRL fixes aspect",
"arrows",
"pan"
],
[
"Zoom",
"Zoom to rectangle\nx/y fixes axis, CTRL fixes aspect",
"square-o",
"zoom"
],
[
"Download",
"Download plot",
"floppy-o",
"save_figure"
]
]
}
},
"7c9874dabbe3437f8aa1ccc7104ccce8": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "1.2.0",
"model_name": "LayoutModel",
"state": {}
},
"9b5dc96c3220426796655b8c721f9cc5": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "1.2.0",
"model_name": "LayoutModel",
"state": {}
},
"9b9f6565fd0a474dbb135f264ba551e6": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "1.2.0",
"model_name": "LayoutModel",
"state": {}
},
"a4c590be5dcc40b6a0569eee10823759": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "1.2.0",
"model_name": "LayoutModel",
"state": {}
},
"a4d79ae8337042308ccf0ffda151f4e2": {
"model_module": "jupyter-matplotlib",
"model_module_version": "^0.9.0",
"model_name": "MPLCanvasModel",
"state": {
"_cursor": "default",
"_figure_label": "Figure 1",
"_height": 500,
"_image_mode": "diff",
"_width": 900,
"layout": "IPY_MODEL_076caa1a2eee4b62a80fcc1d14dc57ce",
"toolbar": "IPY_MODEL_beb8c9bb165b4baa9a387d1291ef8bc2",
"toolbar_position": "left"
}
},
"a70cdca027ac4881808c9aa2f041342e": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "1.2.0",
"model_name": "LayoutModel",
"state": {}
},
"b09c31148fbc49619a262a8e0ec2647b": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "1.2.0",
"model_name": "LayoutModel",
"state": {}
},
"beb8c9bb165b4baa9a387d1291ef8bc2": {
"model_module": "jupyter-matplotlib",
"model_module_version": "^0.9.0",
"model_name": "ToolbarModel",
"state": {
"layout": "IPY_MODEL_9b9f6565fd0a474dbb135f264ba551e6",
"toolitems": [
[
"Home",
"Reset original view",
"home",
"home"
],
[
"Back",
"Back to previous view",
"arrow-left",
"back"
],
[
"Forward",
"Forward to next view",
"arrow-right",
"forward"
],
[
"Pan",
"Left button pans, Right button zooms\nx/y fixes axis, CTRL fixes aspect",
"arrows",
"pan"
],
[
"Zoom",
"Zoom to rectangle\nx/y fixes axis, CTRL fixes aspect",
"square-o",
"zoom"
],
[
"Download",
"Download plot",
"floppy-o",
"save_figure"
]
]
}
},
"c00dd2ac301b42ae9f752a7f1584909e": {
"model_module": "jupyter-matplotlib",
"model_module_version": "^0.9.0",
"model_name": "ToolbarModel",
"state": {
"layout": "IPY_MODEL_a70cdca027ac4881808c9aa2f041342e",
"toolitems": [
[
"Home",
"Reset original view",
"home",
"home"
],
[
"Back",
"Back to previous view",
"arrow-left",
"back"
],
[
"Forward",
"Forward to next view",
"arrow-right",
"forward"
],
[
"Pan",
"Left button pans, Right button zooms\nx/y fixes axis, CTRL fixes aspect",
"arrows",
"pan"
],
[
"Zoom",
"Zoom to rectangle\nx/y fixes axis, CTRL fixes aspect",
"square-o",
"zoom"
],
[
"Download",
"Download plot",
"floppy-o",
"save_figure"
]
]
}
},
"c6f4c7b7533c4ab09b69acf9e00d66e8": {
"model_module": "jupyter-matplotlib",
"model_module_version": "^0.9.0",
"model_name": "ToolbarModel",
"state": {
"layout": "IPY_MODEL_2148f7fc1ee54a57bb7f8f8934eb8c44",
"toolitems": [
[
"Home",
"Reset original view",
"home",
"home"
],
[
"Back",
"Back to previous view",
"arrow-left",
"back"
],
[
"Forward",
"Forward to next view",
"arrow-right",
"forward"
],
[
"Pan",
"Left button pans, Right button zooms\nx/y fixes axis, CTRL fixes aspect",
"arrows",
"pan"
],
[
"Zoom",
"Zoom to rectangle\nx/y fixes axis, CTRL fixes aspect",
"square-o",
"zoom"
],
[
"Download",
"Download plot",
"floppy-o",
"save_figure"
]
]
}
},
"d25f5ea1f4ed40bca27e72efc3d9a087": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "1.2.0",
"model_name": "LayoutModel",
"state": {}
},
"d6325cfb5eea40c6843169f38b5fdae0": {
"model_module": "jupyter-matplotlib",
"model_module_version": "^0.9.0",
"model_name": "ToolbarModel",
"state": {
"layout": "IPY_MODEL_5a03548beb1a4fb7be405029af49d5b9",
"toolitems": [
[
"Home",
"Reset original view",
"home",
"home"
],
[
"Back",
"Back to previous view",
"arrow-left",
"back"
],
[
"Forward",
"Forward to next view",
"arrow-right",
"forward"
],
[
"Pan",
"Left button pans, Right button zooms\nx/y fixes axis, CTRL fixes aspect",
"arrows",
"pan"
],
[
"Zoom",
"Zoom to rectangle\nx/y fixes axis, CTRL fixes aspect",
"square-o",
"zoom"
],
[
"Download",
"Download plot",
"floppy-o",
"save_figure"
]
]
}
},
"d931b624bee148ad89d2ea2e3108fc11": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "1.2.0",
"model_name": "LayoutModel",
"state": {}
},
"d9cc69478c2a4ff7901bb45dee1fc3d0": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "1.2.0",
"model_name": "LayoutModel",
"state": {}
},
"e9381ac511874f3aa07344d7aed7ffcc": {
"model_module": "jupyter-matplotlib",
"model_module_version": "^0.9.0",
"model_name": "ToolbarModel",
"state": {
"layout": "IPY_MODEL_b09c31148fbc49619a262a8e0ec2647b",
"toolitems": [
[
"Home",
"Reset original view",
"home",
"home"
],
[
"Back",
"Back to previous view",
"arrow-left",
"back"
],
[
"Forward",
"Forward to next view",
"arrow-right",
"forward"
],
[
"Pan",
"Left button pans, Right button zooms\nx/y fixes axis, CTRL fixes aspect",
"arrows",
"pan"
],
[
"Zoom",
"Zoom to rectangle\nx/y fixes axis, CTRL fixes aspect",
"square-o",
"zoom"
],
[
"Download",
"Download plot",
"floppy-o",
"save_figure"
]
]
}
},
"fb656b5dfe92484597c17ab902e41854": {
"model_module": "jupyter-matplotlib",
"model_module_version": "^0.9.0",
"model_name": "ToolbarModel",
"state": {
"layout": "IPY_MODEL_7c9874dabbe3437f8aa1ccc7104ccce8",
"toolitems": [
[
"Home",
"Reset original view",
"home",
"home"
],
[
"Back",
"Back to previous view",
"arrow-left",
"back"
],
[
"Forward",
"Forward to next view",
"arrow-right",
"forward"
],
[
"Pan",
"Left button pans, Right button zooms\nx/y fixes axis, CTRL fixes aspect",
"arrows",
"pan"
],
[
"Zoom",
"Zoom to rectangle\nx/y fixes axis, CTRL fixes aspect",
"square-o",
"zoom"
],
[
"Download",
"Download plot",
"floppy-o",
"save_figure"
]
]
}
}
},
"version_major": 2,
"version_minor": 0
}
}
},
"nbformat": 4,
"nbformat_minor": 5
}