From 2ce5ca32f0eeb211bb368079c412aabf8646d33b Mon Sep 17 00:00:00 2001 From: "Ryan C. Cooper" Date: Mon, 6 Feb 2017 23:06:31 -0500 Subject: [PATCH] updated lecture 07 --- lecture_07/bisect.m | 37 + lecture_07/car_payments.m | 17 + lecture_07/falsepos.m | 39 + lecture_07/fzerosimp.m | 41 + lecture_07/incsearch.m | 37 + lecture_07/lecture_07.ipynb | 1195 +++++++++++++++++ lecture_07/lecture_07.md | 388 ++++++ lecture_07/lecture_07.pdf | Bin 0 -> 68853 bytes .../lecture_07_files/lecture_07_14_1.svg | 146 ++ .../lecture_07_files/lecture_07_22_1.svg | 197 +++ .../lecture_07_files/lecture_07_24_1.svg | 182 +++ lecture_07/mod_secant.m | 31 + lecture_07/newtraph.m | 29 + 13 files changed, 2339 insertions(+) create mode 100644 lecture_07/bisect.m create mode 100644 lecture_07/car_payments.m create mode 100644 lecture_07/falsepos.m create mode 100644 lecture_07/fzerosimp.m create mode 100644 lecture_07/incsearch.m create mode 100644 lecture_07/lecture_07.ipynb create mode 100644 lecture_07/lecture_07.md create mode 100644 lecture_07/lecture_07.pdf create mode 100644 lecture_07/lecture_07_files/lecture_07_14_1.svg create mode 100644 lecture_07/lecture_07_files/lecture_07_22_1.svg create mode 100644 lecture_07/lecture_07_files/lecture_07_24_1.svg create mode 100644 lecture_07/mod_secant.m create mode 100644 lecture_07/newtraph.m diff --git a/lecture_07/bisect.m b/lecture_07/bisect.m new file mode 100644 index 0000000..9f696a0 --- /dev/null +++ b/lecture_07/bisect.m @@ -0,0 +1,37 @@ +function [root,fx,ea,iter]=bisect(func,xl,xu,es,maxit,varargin) +% bisect: root location zeroes +% [root,fx,ea,iter]=bisect(func,xl,xu,es,maxit,p1,p2,...): +% uses bisection method to find the root of func +% input: +% func = name of function +% xl, xu = lower and upper guesses +% es = desired relative error (default = 0.0001%) +% maxit = maximum allowable iterations (default = 50) +% p1,p2,... = additional parameters used by func +% output: +% root = real root +% fx = function value at root +% ea = approximate relative error (%) +% iter = number of iterations +if nargin<3,error('at least 3 input arguments required'),end +test = func(xl,varargin{:})*func(xu,varargin{:}); +if test>0,error('no sign change'),end +if nargin<4||isempty(es), es=0.0001;end +if nargin<5||isempty(maxit), maxit=50;end +iter = 0; xr = xl; ea = 100; +while (1) + xrold = xr; + xr = (xl + xu)/2; + iter = iter + 1; + if xr ~= 0,ea = abs((xr - xrold)/xr) * 100;end + test = func(xl,varargin{:})*func(xr,varargin{:}); + if test < 0 + xu = xr; + elseif test > 0 + xl = xr; + else + ea = 0; + end + if ea <= es || iter >= maxit,break,end +end +root = xr; fx = func(xr, varargin{:}); diff --git a/lecture_07/car_payments.m b/lecture_07/car_payments.m new file mode 100644 index 0000000..9d5b2a5 --- /dev/null +++ b/lecture_07/car_payments.m @@ -0,0 +1,17 @@ +function amount_left = car_payments(monthly_payment,price,apr,no_of_years,plot_bool) + interest_per_month = apr/12; + number_of_months = no_of_years*12; + principle=price; + P_vector=zeros(1,number_of_months); + for i = 1:number_of_months + principle=principle-monthly_payment; + principle=(1+interest_per_month)*principle; + P_vector(i)=principle; + end + amount_left=principle; + if plot_bool + plot([1:number_of_months]/12, P_vector) + xlabel('time (years)') + ylabel('principle amount left ($)') + end +end diff --git a/lecture_07/falsepos.m b/lecture_07/falsepos.m new file mode 100644 index 0000000..d5575d5 --- /dev/null +++ b/lecture_07/falsepos.m @@ -0,0 +1,39 @@ +function [root,fx,ea,iter]=falsepos(func,xl,xu,es,maxit,varargin) +% bisect: root location zeroes +% [root,fx,ea,iter]=bisect(func,xl,xu,es,maxit,p1,p2,...): +% uses bisection method to find the root of func +% input: +% func = name of function +% xl, xu = lower and upper guesses +% es = desired relative error (default = 0.0001%) +% maxit = maximum allowable iterations (default = 50) +% p1,p2,... = additional parameters used by func +% output: +% root = real root +% fx = function value at root +% ea = approximate relative error (%) +% iter = number of iterations +if nargin<3,error('at least 3 input arguments required'),end +test = func(xl,varargin{:})*func(xu,varargin{:}); +if test>0,error('no sign change'),end +if nargin<4||isempty(es), es=0.0001;end +if nargin<5||isempty(maxit), maxit=50;end +iter = 0; xr = xl; ea = 100; +while (1) + xrold = xr; + xr = (xl + xu)/2; + % xr = (xl + xu)/2; % bisect method + xr=xu - (func(xu)*(xl-xu))/(func(xl)-func(xu)); % false position method + iter = iter + 1; + if xr ~= 0,ea = abs((xr - xrold)/xr) * 100;end + test = func(xl,varargin{:})*func(xr,varargin{:}); + if test < 0 + xu = xr; + elseif test > 0 + xl = xr; + else + ea = 0; + end + if ea <= es || iter >= maxit,break,end +end +root = xr; fx = func(xr, varargin{:}); diff --git a/lecture_07/fzerosimp.m b/lecture_07/fzerosimp.m new file mode 100644 index 0000000..05c7a9b --- /dev/null +++ b/lecture_07/fzerosimp.m @@ -0,0 +1,41 @@ +function b = fzerosimp(xl,xu) +a = xl; b = xu; fa = f(a); fb = f(b); +c = a; fc = fa; d = b - c; e = d; +while (1) + if fb == 0, break, end + if sign(fa) == sign(fb) %If needed, rearrange points + a = c; fa = fc; d = b - c; e = d; + end + if abs(fa) < abs(fb) + c = b; b = a; a = c; + fc = fb; fb = fa; fa = fc; + end + m = 0.5*(a - b); %Termination test and possible exit + tol = 2 * eps * max(abs(b), 1); + if abs(m) <= tol | fb == 0. + break + end + %Choose open methods or bisection + if abs(e) >= tol & abs(fc) > abs(fb) + s = fb/fc; + if a == c %Secant method + p = 2*m*s; + q = 1 - s; + else %Inverse quadratic interpolation + q = fc/fa; r = fb/fa; + p = s * (2*m*q * (q - r) - (b - c)*(r - 1)); + q = (q - 1)*(r - 1)*(s - 1); + end + if p > 0, q = -q; else p = -p; end; + if 2*p < 3*m*q - abs(tol*q) & p < abs(0.5*e*q) + e = d; d = p/q; + else + d = m; e = m; + end + else %Bisection + d = m; e = m; + end + c = b; fc = fb; + if abs(d) > tol, b=b+d; else b=b-sign(b-a)*tol; end + fb = f(b); +end \ No newline at end of file diff --git a/lecture_07/incsearch.m b/lecture_07/incsearch.m new file mode 100644 index 0000000..bd82554 --- /dev/null +++ b/lecture_07/incsearch.m @@ -0,0 +1,37 @@ +function xb = incsearch(func,xmin,xmax,ns) +% incsearch: incremental search root locator +% xb = incsearch(func,xmin,xmax,ns): +% finds brackets of x that contain sign changes +% of a function on an interval +% input: +% func = name of function +% xmin, xmax = endpoints of interval +% ns = number of subintervals (default = 50) +% output: +% xb(k,1) is the lower bound of the kth sign change +% xb(k,2) is the upper bound of the kth sign change +% If no brackets found, xb = []. +if nargin < 3, error('at least 3 arguments required'), end +if nargin < 4, ns = 50; end %if ns blank set to 50 +% Incremental search +x = linspace(xmin,xmax,ns); +f = func(x); +nb = 0; xb = []; %xb is null unless sign change detected +%for k = 1:length(x)-1 +% if sign(f(k)) ~= sign(f(k+1)) %check for sign change +% nb = nb + 1; +% xb(nb,1) = x(k); +% xb(nb,2) = x(k+1); +% end +%end +sign_change = diff(sign(f)); +[~,i_change] = find(sign_change~=0); +nb=length(i_change); +xb=[x(i_change)',x(i_change+1)']; + +if isempty(xb) %display that no brackets were found + fprintf('no brackets found\n') + fprintf('check interval or increase ns\n') +else + fprintf('number of brackets: %i\n',nb) %display number of brackets +end diff --git a/lecture_07/lecture_07.ipynb b/lecture_07/lecture_07.ipynb new file mode 100644 index 0000000..0c3c2ca --- /dev/null +++ b/lecture_07/lecture_07.ipynb @@ -0,0 +1,1195 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 25, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "%plot --format svg" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "setdefaults" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Roots: Open methods\n", + "## Newton-Raphson" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "First-order approximation for the location of the root (i.e. assume the slope at the given point is constant, what is the solution when f(x)=0)\n", + "\n", + "$f'(x_{i})=\\frac{f(x_{i})-0}{x_{i}-x_{i+1}}$\n", + "\n", + "$x_{i+1}=x_{i}-\\frac{f(x_{i})}{f'(x_{i})}$\n", + "\n", + "Use Newton-Raphson to find solution when $e^{x}=x$" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "error: 'c' undefined near line 1 column 1\n", + "error: 'x_r' undefined near line 1 column 21\n", + "error: evaluating argument list element number 1\n", + "error: 'x_r' undefined near line 1 column 5\n" + ] + } + ], + "source": [ + "f= @(x) exp(-x)-x;\n", + "df= @(x) -exp(-x)-1;\n", + "\n", + "x_i= 0;\n", + "c\n", + "error_approx = abs((x_r-x_i)/x_r)\n", + "x_i=x_r;\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "x_r = 0.50000\n", + "error_approx = 1\n" + ] + } + ], + "source": [ + "x_r = x_i-f(x_i)/df(x_i)\n", + "error_approx = abs((x_r-x_i)/x_r)\n", + "x_i=x_r;" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "x_r = 0.56631\n", + "error_approx = 0.11709\n" + ] + } + ], + "source": [ + "x_r = x_i-f(x_i)/df(x_i)\n", + "error_approx = abs((x_r-x_i)/x_r)\n", + "x_i=x_r;" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "x_r = 0.56714\n", + "error_approx = 0.0014673\n" + ] + } + ], + "source": [ + "x_r = x_i-f(x_i)/df(x_i)\n", + "error_approx = abs((x_r-x_i)/x_r)\n", + "x_i=x_r;" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the bungee jumper example, we created a function f(m) that when f(m)=0, then the mass had been chosen such that at t=4 s, the velocity is 36 m/s. \n", + "\n", + "$f(m)=\\sqrt{\\frac{gm}{c_{d}}}\\tanh(\\sqrt{\\frac{gc_{d}}{m}}t)-v(t)$.\n", + "\n", + "to use the Newton-Raphson method, we need the derivative $\\frac{df}{dm}$\n", + "\n", + "$\\frac{df}{dm}=\\frac{1}{2}\\sqrt{\\frac{g}{mc_{d}}}\\tanh(\\sqrt{\\frac{gc_{d}}{m}}t)-\n", + "\\frac{g}{2m}\\mathrm{sech}^{2}(\\sqrt{\\frac{gc_{d}}{m}}t)$" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "setdefaults\n", + "g=9.81; % acceleration due to gravity\n", + "m=linspace(50, 200,100); % possible values for mass 50 to 200 kg\n", + "c_d=0.25; % drag coefficient\n", + "t=4; % at time = 4 seconds\n", + "v=36; % speed must be 36 m/s\n", + "f_m = @(m) sqrt(g*m/c_d).*tanh(sqrt(g*c_d./m)*t)-v; % anonymous function f_m\n", + "df_m = @(m) 1/2*sqrt(g./m/c_d).*tanh(sqrt(g*c_d./m)*t)-g/2./m*sech(sqrt(g*c_d./m)*t).^2;" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ans = 142.74\r\n" + ] + } + ], + "source": [ + "newtraph(f_m,df_m,140,0.00001)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Secant Methods" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Not always able to evaluate the derivative. Approximation of derivative:\n", + "\n", + "$f'(x_{i})=\\frac{f(x_{i-1})-f(x_{i})}{x_{i-1}-x_{i}}$\n", + "\n", + "$x_{i+1}=x_{i}-\\frac{f(x_{i})}{f'(x_{i})}$\n", + "\n", + "$x_{i+1}=x_{i}-\\frac{f(x_{i})}{\\frac{f(x_{i-1})-f(x_{i})}{x_{i-1}-x_{i}}}=\n", + " x_{i}-\\frac{f(x_{i})(x_{i-1}-x_{i})}{f(x_{i-1})-f(x_{i})}$\n", + " \n", + "What values should $x_{i}$ and $x_{i-1}$ take?\n", + "\n", + "To reduce arbitrary selection of variables, use the\n", + "\n", + "## Modified Secant method\n", + "\n", + "Change the x evaluations to a perturbation $\\delta$. \n", + "\n", + "$x_{i+1}=x_{i}-\\frac{f(x_{i})(\\delta x_{i})}{f(x_{i}+\\delta x_{i})-f(x_{i})}$" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ans = 142.74\r\n" + ] + } + ], + "source": [ + "mod_secant(f_m,1e-6,50,0.00001)" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Amt_numerical = 563.79\n", + "ans = -160.42\n" + ] + }, + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t-5000\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t5000\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10000\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t15000\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t20000\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t25000\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t30000\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t3\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t4\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t5\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\t\tprinciple amount left ($)\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\ttime (years)\n", + "\t\n", + "\n", + "\n", + "\n", + "\tgnuplot_plot_1a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "Amt_numerical=mod_secant(@(A) car_payments(A,30000,0.05,5),1e-6,50,0.001)\n", + "car_payments(Amt,30000,0.05,5)" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ans = 3.3968e+04\r\n" + ] + } + ], + "source": [ + "Amt*12*5" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Amortization calculation makes the same calculation for the monthly payment amount, A, paying off the principle amount, P, over n pay periods with monthly interest rate, r. " + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Amt = 566.14\r\n" + ] + } + ], + "source": [ + "% Amortization calculation\n", + "A = @(P,r,n) P*(r*(1+r)^n)./((1+r)^n-1);\n", + "Amt=A(30000,0.05/12,5*12)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Matlab's function\n", + "\n", + "Matlab and Octave combine bracketing and open methods in the `fzero` function. " + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "'fzero' is a function from the file /usr/share/octave/4.0.0/m/optimization/fzero.m\n", + "\n", + " -- Function File: fzero (FUN, X0)\n", + " -- Function File: fzero (FUN, X0, OPTIONS)\n", + " -- Function File: [X, FVAL, INFO, OUTPUT] = fzero (...)\n", + " Find a zero of a univariate function.\n", + "\n", + " FUN is a function handle, inline function, or string containing the\n", + " name of the function to evaluate.\n", + "\n", + " X0 should be a two-element vector specifying two points which\n", + " bracket a zero. In other words, there must be a change in sign of\n", + " the function between X0(1) and X0(2). More mathematically, the\n", + " following must hold\n", + "\n", + " sign (FUN(X0(1))) * sign (FUN(X0(2))) <= 0\n", + "\n", + " If X0 is a single scalar then several nearby and distant values are\n", + " probed in an attempt to obtain a valid bracketing. If this is not\n", + " successful, the function fails.\n", + "\n", + " OPTIONS is a structure specifying additional options. Currently,\n", + " 'fzero' recognizes these options: \"FunValCheck\", \"OutputFcn\",\n", + " \"TolX\", \"MaxIter\", \"MaxFunEvals\". For a description of these\n", + " options, see *note optimset: XREFoptimset.\n", + "\n", + " On exit, the function returns X, the approximate zero point and\n", + " FVAL, the function value thereof.\n", + "\n", + " INFO is an exit flag that can have these values:\n", + "\n", + " * 1 The algorithm converged to a solution.\n", + "\n", + " * 0 Maximum number of iterations or function evaluations has\n", + " been reached.\n", + "\n", + " * -1 The algorithm has been terminated from user output\n", + " function.\n", + "\n", + " * -5 The algorithm may have converged to a singular point.\n", + "\n", + " OUTPUT is a structure containing runtime information about the\n", + " 'fzero' algorithm. Fields in the structure are:\n", + "\n", + " * iterations Number of iterations through loop.\n", + "\n", + " * nfev Number of function evaluations.\n", + "\n", + " * bracketx A two-element vector with the final bracketing of the\n", + " zero along the x-axis.\n", + "\n", + " * brackety A two-element vector with the final bracketing of the\n", + " zero along the y-axis.\n", + "\n", + " See also: optimset, fsolve.\n", + "\n", + "Additional help for built-in functions and operators is\n", + "available in the online version of the manual. Use the command\n", + "'doc ' to search the manual index.\n", + "\n", + "Help and information about Octave is also available on the WWW\n", + "at http://www.octave.org and via the help@octave.org\n", + "mailing list.\n" + ] + } + ], + "source": [ + "help fzero" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ans = 563.79\r\n" + ] + } + ], + "source": [ + "fzero(@(A) car_payments(A,30000,0.05,5,0),500)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Comparison of Solvers\n", + "\n", + "It's helpful to compare to the convergence of different routines to see how quickly you find a solution. \n", + "\n", + "Comparing the freefall example\n" + ] + }, + { + "cell_type": "code", + "execution_count": 84, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "warning: axis: omitting non-positive data in log plot\n", + "warning: called from\n", + " __line__ at line 120 column 16\n", + " line at line 56 column 8\n", + " __plt__>__plt2vv__ at line 500 column 10\n", + " __plt__>__plt2__ at line 246 column 14\n", + " __plt__ at line 133 column 15\n", + " semilogy at line 60 column 10\n", + "warning: axis: omitting non-positive data in log plot\n", + "warning: axis: omitting non-positive data in log plot\n", + "warning: axis: omitting non-positive data in log plot\n" + ] + }, + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t10-14\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10-12\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10-10\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10-8\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10-6\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10-4\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10-2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t100\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t102\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t104\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t50\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t100\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t150\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t200\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t250\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t300\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t350\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t400\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\tnewton-raphson\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\tnewton-raphson\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tmod-secant\n", + "\n", + "\t\n", + "\t\tmod-secant\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tfalse point\n", + "\n", + "\t\n", + "\t\tfalse point\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tbisection\n", + "\n", + "\t\n", + "\t\tbisection\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "N=20;\n", + "iterations = linspace(1,400,N);\n", + "ea_nr=zeros(1,N); % appr error Newton-Raphson\n", + "ea_ms=zeros(1,N); % appr error Modified Secant\n", + "ea_fp=zeros(1,N); % appr error false point method\n", + "ea_bs=zeros(1,N); % appr error bisect method\n", + "for i=1:length(iterations)\n", + " [root_nr,ea_nr(i),iter_nr]=newtraph(f_m,df_m,200,0,iterations(i));\n", + " [root_ms,ea_ms(i),iter_ms]=mod_secant(f_m,1e-6,300,0,iterations(i));\n", + " [root_fp,ea_fp(i),iter_fp]=falsepos(f_m,1,300,0,iterations(i));\n", + " [root_bs,ea_bs(i),iter_bs]=bisect(f_m,1,300,0,iterations(i));\n", + "end\n", + " \n", + "semilogy(iterations,abs(ea_nr),iterations,abs(ea_ms),iterations,abs(ea_fp),iterations,abs(ea_bs))\n", + "legend('newton-raphson','mod-secant','false point','bisection')" + ] + }, + { + "cell_type": "code", + "execution_count": 75, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ea_ms =\n", + "\n", + " Columns 1 through 7:\n", + "\n", + " 43.43883 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000\n", + "\n", + " Columns 8 through 14:\n", + "\n", + " 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000\n", + "\n", + " Columns 15 through 20:\n", + "\n", + " 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000\n", + "\n" + ] + } + ], + "source": [ + "ea_ms" + ] + }, + { + "cell_type": "code", + "execution_count": 101, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "warning: axis: omitting non-positive data in log plot\n", + "warning: called from\n", + " __line__ at line 120 column 16\n", + " line at line 56 column 8\n", + " __plt__>__plt2vv__ at line 500 column 10\n", + " __plt__>__plt2__ at line 246 column 14\n", + " __plt__ at line 133 column 15\n", + " semilogy at line 60 column 10\n", + "warning: axis: omitting non-positive data in log plot\n", + "warning: axis: omitting non-positive data in log plot\n", + "warning: axis: omitting non-positive data in log plot\n" + ] + }, + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t10-14\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10-12\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10-10\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10-8\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10-6\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10-4\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10-2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t100\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t102\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t104\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t20\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t30\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t40\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t50\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\tnewton-raphson\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\tnewton-raphson\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tmod-secant\n", + "\n", + "\t\n", + "\t\tmod-secant\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tfalse point\n", + "\n", + "\t\n", + "\t\tfalse point\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tbisection\n", + "\n", + "\t\n", + "\t\tbisection\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "N=20;\n", + "f= @(x) x^10-1;\n", + "df=@(x) 10*x^9;\n", + "iterations = linspace(1,50,N);\n", + "ea_nr=zeros(1,N); % appr error Newton-Raphson\n", + "ea_ms=zeros(1,N); % appr error Modified Secant\n", + "ea_fp=zeros(1,N); % appr error false point method\n", + "ea_bs=zeros(1,N); % appr error bisect method\n", + "for i=1:length(iterations)\n", + " [root_nr,ea_nr(i),iter_nr]=newtraph(f,df,0.5,0,iterations(i));\n", + " [root_ms,ea_ms(i),iter_ms]=mod_secant(f,1e-6,0.5,0,iterations(i));\n", + " [root_fp,ea_fp(i),iter_fp]=falsepos(f,0,5,0,iterations(i));\n", + " [root_bs,ea_bs(i),iter_bs]=bisect(f,0,5,0,iterations(i));\n", + "end\n", + " \n", + "semilogy(iterations,abs(ea_nr),iterations,abs(ea_ms),iterations,abs(ea_fp),iterations,abs(ea_bs))\n", + "legend('newton-raphson','mod-secant','false point','bisection')" + ] + }, + { + "cell_type": "code", + "execution_count": 102, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ea_bs =\n", + "\n", + " Columns 1 through 6:\n", + "\n", + " 9.5357e+03 -4.7554e-01 -2.1114e-01 6.0163e-02 -2.4387e-03 6.1052e-04\n", + "\n", + " Columns 7 through 12:\n", + "\n", + " 2.2891e-04 -9.5367e-06 2.3842e-06 8.9407e-07 -2.2352e-07 9.3132e-09\n", + "\n", + " Columns 13 through 18:\n", + "\n", + " -2.3283e-09 -8.7311e-10 3.6380e-11 -9.0949e-12 -3.4106e-12 8.5265e-13\n", + "\n", + " Columns 19 and 20:\n", + "\n", + " -3.5527e-14 8.8818e-15\n", + "\n", + "ans = 16.208\n" + ] + } + ], + "source": [ + "ea_bs\n", + "newtraph(f,df,0.5,0,12)" + ] + }, + { + "cell_type": "code", + "execution_count": 93, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ans = 1.9683e+23\r\n" + ] + } + ], + "source": [ + "df(300)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Octave", + "language": "octave", + "name": "octave" + }, + "language_info": { + "file_extension": ".m", + "help_links": [ + { + "text": "MetaKernel Magics", + "url": "https://github.com/calysto/metakernel/blob/master/metakernel/magics/README.md" + } + ], + "mimetype": "text/x-octave", + "name": "octave", + "version": "0.19.14" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/lecture_07/lecture_07.md b/lecture_07/lecture_07.md new file mode 100644 index 0000000..020699b --- /dev/null +++ b/lecture_07/lecture_07.md @@ -0,0 +1,388 @@ + + +```octave +%plot --format svg +``` + + +```octave +setdefaults +``` + +# Roots: Open methods +## Newton-Raphson + +First-order approximation for the location of the root (i.e. assume the slope at the given point is constant, what is the solution when f(x)=0) + +$f'(x_{i})=\frac{f(x_{i})-0}{x_{i}-x_{i+1}}$ + +$x_{i+1}=x_{i}-\frac{f(x_{i})}{f'(x_{i})}$ + +Use Newton-Raphson to find solution when $e^{x}=x$ + + +```octave +f= @(x) exp(-x)-x; +df= @(x) -exp(-x)-1; + +x_i= 0; +c +error_approx = abs((x_r-x_i)/x_r) +x_i=x_r; + +``` + + error: 'c' undefined near line 1 column 1 + error: 'x_r' undefined near line 1 column 21 + error: evaluating argument list element number 1 + error: 'x_r' undefined near line 1 column 5 + + + +```octave +x_r = x_i-f(x_i)/df(x_i) +error_approx = abs((x_r-x_i)/x_r) +x_i=x_r; +``` + + x_r = 0.50000 + error_approx = 1 + + + +```octave +x_r = x_i-f(x_i)/df(x_i) +error_approx = abs((x_r-x_i)/x_r) +x_i=x_r; +``` + + x_r = 0.56631 + error_approx = 0.11709 + + + +```octave +x_r = x_i-f(x_i)/df(x_i) +error_approx = abs((x_r-x_i)/x_r) +x_i=x_r; +``` + + x_r = 0.56714 + error_approx = 0.0014673 + + +In the bungee jumper example, we created a function f(m) that when f(m)=0, then the mass had been chosen such that at t=4 s, the velocity is 36 m/s. + +$f(m)=\sqrt{\frac{gm}{c_{d}}}\tanh(\sqrt{\frac{gc_{d}}{m}}t)-v(t)$. + +to use the Newton-Raphson method, we need the derivative $\frac{df}{dm}$ + +$\frac{df}{dm}=\frac{1}{2}\sqrt{\frac{g}{mc_{d}}}\tanh(\sqrt{\frac{gc_{d}}{m}}t)- +\frac{g}{2m}\mathrm{sech}^{2}(\sqrt{\frac{gc_{d}}{m}}t)$ + + +```octave +setdefaults +g=9.81; % acceleration due to gravity +m=linspace(50, 200,100); % possible values for mass 50 to 200 kg +c_d=0.25; % drag coefficient +t=4; % at time = 4 seconds +v=36; % speed must be 36 m/s +f_m = @(m) sqrt(g*m/c_d).*tanh(sqrt(g*c_d./m)*t)-v; % anonymous function f_m +df_m = @(m) 1/2*sqrt(g./m/c_d).*tanh(sqrt(g*c_d./m)*t)-g/2./m*sech(sqrt(g*c_d./m)*t).^2; +``` + + +```octave +newtraph(f_m,df_m,140,0.00001) +``` + + ans = 142.74 + + +## Secant Methods + +Not always able to evaluate the derivative. Approximation of derivative: + +$f'(x_{i})=\frac{f(x_{i-1})-f(x_{i})}{x_{i-1}-x_{i}}$ + +$x_{i+1}=x_{i}-\frac{f(x_{i})}{f'(x_{i})}$ + +$x_{i+1}=x_{i}-\frac{f(x_{i})}{\frac{f(x_{i-1})-f(x_{i})}{x_{i-1}-x_{i}}}= + x_{i}-\frac{f(x_{i})(x_{i-1}-x_{i})}{f(x_{i-1})-f(x_{i})}$ + +What values should $x_{i}$ and $x_{i-1}$ take? + +To reduce arbitrary selection of variables, use the + +## Modified Secant method + +Change the x evaluations to a perturbation $\delta$. + +$x_{i+1}=x_{i}-\frac{f(x_{i})(\delta x_{i})}{f(x_{i}+\delta x_{i})-f(x_{i})}$ + + +```octave +mod_secant(f_m,1e-6,50,0.00001) +``` + + ans = 142.74 + + + +```octave +Amt_numerical=mod_secant(@(A) car_payments(A,30000,0.05,5),1e-6,50,0.001) +car_payments(Amt,30000,0.05,5) +``` + + Amt_numerical = 563.79 + ans = -160.42 + + + +![svg](lecture_07_files/lecture_07_14_1.svg) + + + +```octave +Amt*12*5 +``` + + ans = 3.3968e+04 + + +Amortization calculation makes the same calculation for the monthly payment amount, A, paying off the principle amount, P, over n pay periods with monthly interest rate, r. + + +```octave +% Amortization calculation +A = @(P,r,n) P*(r*(1+r)^n)./((1+r)^n-1); +Amt=A(30000,0.05/12,5*12) +``` + + Amt = 566.14 + + +## Matlab's function + +Matlab and Octave combine bracketing and open methods in the `fzero` function. + + +```octave +help fzero +``` + + 'fzero' is a function from the file /usr/share/octave/4.0.0/m/optimization/fzero.m + + -- Function File: fzero (FUN, X0) + -- Function File: fzero (FUN, X0, OPTIONS) + -- Function File: [X, FVAL, INFO, OUTPUT] = fzero (...) + Find a zero of a univariate function. + + FUN is a function handle, inline function, or string containing the + name of the function to evaluate. + + X0 should be a two-element vector specifying two points which + bracket a zero. In other words, there must be a change in sign of + the function between X0(1) and X0(2). More mathematically, the + following must hold + + sign (FUN(X0(1))) * sign (FUN(X0(2))) <= 0 + + If X0 is a single scalar then several nearby and distant values are + probed in an attempt to obtain a valid bracketing. If this is not + successful, the function fails. + + OPTIONS is a structure specifying additional options. Currently, + 'fzero' recognizes these options: "FunValCheck", "OutputFcn", + "TolX", "MaxIter", "MaxFunEvals". For a description of these + options, see *note optimset: XREFoptimset. + + On exit, the function returns X, the approximate zero point and + FVAL, the function value thereof. + + INFO is an exit flag that can have these values: + + * 1 The algorithm converged to a solution. + + * 0 Maximum number of iterations or function evaluations has + been reached. + + * -1 The algorithm has been terminated from user output + function. + + * -5 The algorithm may have converged to a singular point. + + OUTPUT is a structure containing runtime information about the + 'fzero' algorithm. Fields in the structure are: + + * iterations Number of iterations through loop. + + * nfev Number of function evaluations. + + * bracketx A two-element vector with the final bracketing of the + zero along the x-axis. + + * brackety A two-element vector with the final bracketing of the + zero along the y-axis. + + See also: optimset, fsolve. + + Additional help for built-in functions and operators is + available in the online version of the manual. Use the command + 'doc ' to search the manual index. + + Help and information about Octave is also available on the WWW + at http://www.octave.org and via the help@octave.org + mailing list. + + + +```octave +fzero(@(A) car_payments(A,30000,0.05,5,0),500) +``` + + ans = 563.79 + + +## Comparison of Solvers + +It's helpful to compare to the convergence of different routines to see how quickly you find a solution. + +Comparing the freefall example + + + +```octave +N=20; +iterations = linspace(1,400,N); +ea_nr=zeros(1,N); % appr error Newton-Raphson +ea_ms=zeros(1,N); % appr error Modified Secant +ea_fp=zeros(1,N); % appr error false point method +ea_bs=zeros(1,N); % appr error bisect method +for i=1:length(iterations) + [root_nr,ea_nr(i),iter_nr]=newtraph(f_m,df_m,200,0,iterations(i)); + [root_ms,ea_ms(i),iter_ms]=mod_secant(f_m,1e-6,300,0,iterations(i)); + [root_fp,ea_fp(i),iter_fp]=falsepos(f_m,1,300,0,iterations(i)); + [root_bs,ea_bs(i),iter_bs]=bisect(f_m,1,300,0,iterations(i)); +end + +semilogy(iterations,abs(ea_nr),iterations,abs(ea_ms),iterations,abs(ea_fp),iterations,abs(ea_bs)) +legend('newton-raphson','mod-secant','false point','bisection') +``` + + warning: axis: omitting non-positive data in log plot + warning: called from + __line__ at line 120 column 16 + line at line 56 column 8 + __plt__>__plt2vv__ at line 500 column 10 + __plt__>__plt2__ at line 246 column 14 + __plt__ at line 133 column 15 + semilogy at line 60 column 10 + warning: axis: omitting non-positive data in log plot + warning: axis: omitting non-positive data in log plot + warning: axis: omitting non-positive data in log plot + + + +![svg](lecture_07_files/lecture_07_22_1.svg) + + + +```octave +ea_ms +``` + + ea_ms = + + Columns 1 through 7: + + 43.43883 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 + + Columns 8 through 14: + + 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 + + Columns 15 through 20: + + 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 + + + + +```octave +N=20; +f= @(x) x^10-1; +df=@(x) 10*x^9; +iterations = linspace(1,50,N); +ea_nr=zeros(1,N); % appr error Newton-Raphson +ea_ms=zeros(1,N); % appr error Modified Secant +ea_fp=zeros(1,N); % appr error false point method +ea_bs=zeros(1,N); % appr error bisect method +for i=1:length(iterations) + [root_nr,ea_nr(i),iter_nr]=newtraph(f,df,0.5,0,iterations(i)); + [root_ms,ea_ms(i),iter_ms]=mod_secant(f,1e-6,0.5,0,iterations(i)); + [root_fp,ea_fp(i),iter_fp]=falsepos(f,0,5,0,iterations(i)); + [root_bs,ea_bs(i),iter_bs]=bisect(f,0,5,0,iterations(i)); +end + +semilogy(iterations,abs(ea_nr),iterations,abs(ea_ms),iterations,abs(ea_fp),iterations,abs(ea_bs)) +legend('newton-raphson','mod-secant','false point','bisection') +``` + + warning: axis: omitting non-positive data in log plot + warning: called from + __line__ at line 120 column 16 + line at line 56 column 8 + __plt__>__plt2vv__ at line 500 column 10 + __plt__>__plt2__ at line 246 column 14 + __plt__ at line 133 column 15 + semilogy at line 60 column 10 + warning: axis: omitting non-positive data in log plot + warning: axis: omitting non-positive data in log plot + warning: axis: omitting non-positive data in log plot + + + +![svg](lecture_07_files/lecture_07_24_1.svg) + + + +```octave +ea_bs +newtraph(f,df,0.5,0,12) +``` + + ea_bs = + + Columns 1 through 6: + + 9.5357e+03 -4.7554e-01 -2.1114e-01 6.0163e-02 -2.4387e-03 6.1052e-04 + + Columns 7 through 12: + + 2.2891e-04 -9.5367e-06 2.3842e-06 8.9407e-07 -2.2352e-07 9.3132e-09 + + Columns 13 through 18: + + -2.3283e-09 -8.7311e-10 3.6380e-11 -9.0949e-12 -3.4106e-12 8.5265e-13 + + Columns 19 and 20: + + -3.5527e-14 8.8818e-15 + + ans = 16.208 + + + +```octave +df(300) +``` + + ans = 1.9683e+23 + + + +```octave + +``` diff --git a/lecture_07/lecture_07.pdf b/lecture_07/lecture_07.pdf new file mode 100644 index 0000000000000000000000000000000000000000..4216be6e0844ae02657decc5b169f0f1569b11c0 GIT binary patch literal 68853 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
    1yR$Gk*Xuv}mr$C2m$WO1$QS{47rGuh zW)FokSRoz0Y0C5}g)D=Olk3%yGYK=6nCCeXCrHh%5 zSee7D@qOpv9ngN3w$c*P^rpb*RSk-?#*EtqY8Y3EpBIbI7ooqS9QA4b>BG)5&ghV* z=1fDuT;gGWYDWOp+i8TNWvFg9ta+YastW%~|L)1}^v5Ve?_*U&+#y*ao4j;Kc7(8~l+q>Vpj}wnm8d7j4*C+2xv?bqLCI*hHCUCEI>fAbY z3&xj{wTx*ZsUDDrQ{SfyQ9n~fYhP$%psI^~X|cv@uIn-5OEM-FRrv=p9QxeY4+aCB zy3k~HmbaIaw;C_cAg@PgO|W7W+Te?sXP-`{*RgVF79u~ww({uCD!s6FzY+6(Dg(CG zcXoDee!a?KZ|V}5QPI@1Cif0<+4z>MrM~ zt#47XL5S4-lmWb1++MSqnPKDW*q?8B<=vvX=3>18MT=F2I8g)YiXz(^u*t0bmxRA3 zwIu;s@Jn7r+;(u4&zSl{qEOs64^OjptvX|O%DlKYYL3C|cHY{><>Q7mOX@L8gX|I< zcO)x=IsrJHLUU~5ZNk3z^EKDIyg^}OVz;~pr3$0>JvcU~z=EaAbXL5u-Io9t85G2) zwTQ0qhdEt&K%{cZ0BOJ}k5SAca@y(Nzg39RXfst-|TG z1sh-P>qVU~;uJ;?{APJ)M;I#rYMO*IfgVQI-*_6y75)&Brh2%=XXUSuFm2d#S|dbA z2&(db=@(ERen6%SWX4>vO}f^7*hi&(&`0gj7vA!uV-yUj(S zMUx&eN=YI}lNv!gv4=7*H>bg8X0{ees~E!6E;k6WIzuFdfJfeU2reQKs)emp$eXn& zmpH5a%j)4&KJNl7*k!<1BDtVR#I8*^pC?ZFEM`-3CN^K7t4Su5zy!^HjSbJP4bP7B zWFE92v%8Wrzk&G?KTBAtXgegG>J;&eFdWW`b3hzXfM5r(7|;*y3?SSd2x@A~QO@V7 z*-$YY(EzJV$vsH8B!@)B1iD6uJ5BLpcT+n0>%<_}W_d8gio^DM{~inUh&uh*<)x0! zJN*Im{mJ@aYj~x0Fq4t0S+(m$Jkqgq#>jV+h=5_K%V{O3mr31NB1OY7c`NVB?mRJt z^I1X2Jp*%2zhb*+?y*Eqw?0hA9f#w{VRJ!A#kh6j1l|$E|5D{IfL(4OC~bEff!xrY zeVX+d_4oS((DU^`_(jHSOOrf>5;d}KBiPq|)4=DwHdChK-(Og>k^_ zVJJc-;<7?WG`NvMA@b4-iLA&iszfan_Qv_VnxmW0$0z~?H`m;@@Hjp@+namtlOO7d zNflc`ZI%II8|uJSkl|hC7pryN+94B64sU68X_jk>Zi;P+Y0By$AazZaz9j7hPi@d&kXQ^%I2+}aPd_YUT-Vz*`pJjrCsSu>vOc11y4nzA4#SnVj{2zbxic!mI zXLPVIr+E-FCzxfpGR{Q7WbYgW<>u}zsF|%V+(gPo@A5QPT;xBuSJ!^Mg_eh!qT;5v zcuhxP|6tF0zkD8u(7UQiNci;lN@X?AmQ-wTLqLEvG(eI>O+Kz8uu|=IECS69(oxHJ zWbh-6EG`O?;sH}839@F6mDH22)vh%T!0#j4Ca`XEE_E`}^mJ-|QiBIv>8J=@OL}Y$ zmT`ZIeDe09P2WRoPFbw0Nc8VG1uf8*d`B2xe$y1ZqQl0sdRU+ah|S2AIELTRp1$wu zLYjF2)bBwjN9T72&*+fU1?KF)z`<8#1t2ED@^ddWSSwMKT(~PC zBDoAosPQp}u0x1$5-eK>QrczoR0Scb(E?&Zr7J<*iHiHdru>a&5@8WGS?5p(w(nXa z+o5C$M;%tAQ=>wb4Hq^bpBzdp8ed?USbwY03q6E`lD@)98qoQ|V5}GJ5^Ne^=L&wd z^EZJv|3Z|5ah4NlU|Z87L!AinEI%o8f@D$5ki0G(laNhx@?3{xgPP4Jiwdc}qT1*9 z;~R*aMw^r3=e7Rr$x z<3R73P-j^#g{iGZ zhEnhGra`s9Eo9hRiC@5u8SDumPv0b`Lq-{7j;0x|OjN#t0aWT_ILve*OL&$7XW`eL z2GV#|4eioza~8`iCruc9HxXFeD?h7o?>L|}orCfNT6za77Hn|OU@r|N_&I!QolO-^ zMt63qi~+ox#uw;2fOK0Q(Dw8FlYge{v;#V3S;uv5eQ`6BNzhRg06MS`~lY6dRT_uCo zp^;ACkn#vLbRo#{wO{KS)%Ejre^}F51rj1#R>u7DM$mD2a);)C z{52ZONva0racQeV(=cbS&jnlrz9!M0@Nk-BNw%s0D+b#zQ(vb#79yB{{Sq-uC+ms2 zdH#;%=LSFFL|XO(I92$fodysX{1+d_FyH@Ub+J*#%3pK12fy2V6+1~%tj%d68kj2n zDzQO~N16-eV;iT47hsG$DKN-ShO^@x*wRUsWv(;+A}VNENhm$Xq=K;(eg6i!CAUR>?swr8S#(f{{&Fqh$O6yqxs*>`WP|Gt*z zYbRoNc@G)ar}Km5Tr(!s@=gJ!#r1$S`wcZl_wR76$ewVFuE}0-OZY-ChE?I;O_GCm z+J&OW>^ETypP75cm{W#3UhFq>7@vXrS(mRxgs(%MFQCzXJBG2Td+Us@5~itp>74gZ zqBQ4Bqp@0V_@jT>dS>rmv1FI`#u0JOiAE7|yl8=99l075l4IKLx9zNs-O>&@vHsd~ zjorIq{k7Ygtq(rriSbmns<{)N#>(8;A!WAr@|4Ygdg1Z%EN?q) zi$Bz4Zp%E(#KL6j>9KzaItwJx|nw>FKk-L}AR{v5Q2v%#BU30DAi}5%%DLWTk8y51X~$QZtNa zaj2@_1HEX<2VJdgl(z3rC3o3KM7H*Qm1o)WE7Eit~B-XX+k2n${j>vYBeuootc&k!$k9DhZM-y{c zW{fpjZ-``Wg%%TDFJ_2@W!=xo9#hdD&+G;^x*7blaGlL&fV;y2`;Fzu4%@p-1LL|^ z&CYVJ!g&JSD8~L{g9+QXCl|Ah6$gTO+t$>SLvO!P0PFlPbGR`CQkX}TD z`5~1yM(=Of1#<{)nuXo{C+b@0FaI4d-AI6q!QAxxa`-$UT?C{&79kKCzm%{Ybg9g~ z{Mpgj9@@yf4DK3xMUXPK{{%u4$lS!d0c|JC-z7G$aPw#W^FlXg1I>K*SPR z0tj2YMf{>oo|u5I5hS4K$`BxBu8H?AHqF~F%AT$c{V$Bj=)vcIBO9~)Z?Z8X6a9aq z8vmzIteqfj6G#Ua{K_*-wI~eCR-P>eUM|5(^-;KhvEy7#lj#DmoiD{nxXIt%LRdX#VRh9zCsqfUTP*-M`UhVq$}2WMt8%mDYE1Fn80W z|JO%{_di-~S_NZATW1GDW5<8)Sz$LPQAMYJ*4cltKHa}YkpEvELw!7Yo`2WB+%``C zI!&nQsOcaXSpVfv_^^>WC8x*F(2l*_T=&qPlQ+(^*?*ygqn@ZSgS#n(&bX9)M-4YI9P2^m zv7|Zbaid1N!aT+z*Kkj?J824kx^e-mRTO#i8r1-OhaXTr51&qKPF=7VKReG&8lh&| zuS35#&r`ple#Mce;zd$_Fxp!$1}FaM3lxw zuE3ffwG4j7-1pqCYpAe^>X1zOY*hQ$Df}F-ocY37h=KCgu4e!AYm1B75%k)y4!|o9 zz-tPtO+-EfQd+9r33*Rfc@dJh5jKRtlIL39ngpt*(C&o;WUB9rNbQLjA!|+0R{X6^ z#?7vXO*tqmemR3Yhc7}c7FAubxv`#>>F(q%wB2`(iqEux1udNZZEOV))+C^M3o(Ur znbpIRR8dKI`xTZ_3k5vR-gQPFaN`M+VNrSI66tRL* zA$V{+pe0zq5Q6M?DAk~Yo%OrQ;b%{&8Y}`pxkD(?4Scsk=`)6r%{9@|=AONr5U#5G zL9;WA`L{~vwB!0iAX)&#^q4u?Ztv=2&;-njqZfsc za8dGwnbi-kq?su13H|m6@oSZ%Dj%sV_&V*bvh-MKQR9S`eXVT5?&uD_gj88C414_b z6Re?=`DjUUmllYK`}}Kgu3RIqL@Bwh@|FUQwL1tx%F`VrgFxWei@24vib9`unMO#G z2oaqGtGOQ(e&n2sOg02mq$8sE>b3YX4u@VUs03rW^bhbxLe;Y>V#7{9D;-c_@h!bI z{z6@O=c1Tp&NLvHxGsF%4Vy%NDV$k6iNyN z-oov{VI+M+T80oRjW7_2mcq`FK*aa*42C-$k;~3QGYz-FzHc1xYLL3)!bdw^obR-E(Lx~kK z_^!usq#&UO8G7XjjiaspCQhO`uNDbN$Dv@BN;YPP(afm-B#L4TfjQX8jeRD#k>JLY z;IBOU3i1mta~car5uH&x&4@$Z$W?nQic6K>@^(`TbutsY)VoJ+CD9?8O= z5`PJDn5*q4+^Ev!j{gSV*#9BMe_1O3VaWfFPoIwM|KroIR@<~WWP$U(RXr>A>%xq6 zCtW7sQ*0vNDBT{gz1-%rJBpqclQAk5e!1jCaK^Vbb*{Gt!z*sLH*s@I+hfoB(@zV- zG>8kaV$Mv87ufr27W%%rw`yG1X8ea3E}l%y=5D$xt4z=Rm;8${bDCIrzjXcdShxRn z($Ic{PeOILi`v3Zq~`227egH(i9b6`L@cjHqNB5Slk}2}Qf2>yrrQF>&+K;sgkw=L zvWN<>SZk0ey>iE_%&4!+jRXvj8Es!9p=h@|!mlB+Z56Odl?4!(w}};0WSAdPrBT9s zrzgCx?m{~2+WJ##RxT$p4iZ$ui6?}m2!ZdoE#yjx%~LVukwHn+g-=u>K+?|HX5oOw zQ#{eDGX}SI8}!>4c}LHs!f(~y=M|~9L|o|pqS517;{gX5pU-~wQ>9h2JD7d56%gkpkIsVPk=(458%fot)1rC z8Nm(w$gn;TGyp68Z{W)J%sl{r27X%Jv}VEam*=v4|Rj%M?}M1OGD zLqM%jM9_o|0B_Lg@uCgIU`Jk6j*+?+4fh`Xbtq!4Rmc%q>u$pF%3)8D?D?AjzOnW? zASz>kI1Abu*cJ1f#r1OnW7g<&j8(w3Sy+0swn~WJtWmwHdItZZirbltWYfgJ9(s>P z5^{Zc*(cG>B3{-qk@0T0hW?0ZEMcYHQz^KVh!gTvM1rEj-!1O!z8K@u0iKjeqRVqo zX-cObao2Ad+e>n*s938|v8+0GySUeXqo8hLzaXw6++W#$Kb&!i9r`A8W25{PXP4XO zkx5KEpxC;40NQs-MgALG`(h50?1E6*nF{>}QD2#r%TQ-j%|=LmIE-TRijqcFXy1l$ zu-WFS=%J4YBKN_%Wrv4*WpTxd{hh9GDoC~YqgUJp*ROXDvbhRdrb=ew;Y*P1-0 zC;PeyNChDh(dWR%*#!`WH~(M1f{zv>W_+qT%WdyT82q^<`m}x@=@ZtvB#&H-za3Z zqnrguD4u5yV_K6#g0fpZ9biSEJ|J1NSrl%>;f&23!-sFZlLNBj%JtMLp5anC@JV5; zz&f-kg03YQ85%V4#!oxUZZkCM4!P|0+-rFYyT(HM)O)u2M3F+R? zwWob-)NmKL&lT8=2v=DXCDn0XAU_4~>7%k3piHt4jAUeB><-g8h9^XKnJm~Yt7v9e z%xP(3#tj>uSt_*g6k*DoOOA^9su|sBHZAdOwKAdr4^}JN&zWjFe2tQ!zxI3z{UBqB z=YX8_jgRk8j0rYRqVGm=f55WPCdvPI^kMwJJ0--(#Qq=anT=spN!x$u^Y4@pcuy6= zTGLKU;L9A%0YN0mx=nVlKM|Nl0kr|~JaKuKk2kq}S!(iC0XLGm6`2Futzn9-`5#=( zm_u8k1%uk&Ow21j$nJ@7DRqJ;uwdzQ1b_o)zc-t(EV2D^zbhRGQ$jQE=7%U~wqT3) zNM~$Xu;7){-Av-$%QAQG*g?2p4vSPs#WRtYYCV6-Rn_m0nb7#6ATr1ig$3n< zZ2VW~pb;ms9*>hONNgLeZ;hs|CEcv!k2Zs_odWc#lj1$ccmtV}Dv~2EK3Ip7_bhCp z>2t~&q-o0}vReJAuYbLEo=oEQMQLc;;mIXm=*D40nA3i}QJiZDJF_AtH4I}5$bBY{5 z=$h8xBj?BR6?#gd65&Vd3@O?wkQwn^M7<5T@F2c;(X8Z&Uc*?Hm>yCE6_fCkodlh& zBgD-3sH37dkHh$(hJGJB`t5Fjoic|$#ReTp*`fkJUQgl$ zKp-Qa@`Xh-3?-reBUk@MYJUXQ_F+9JN%4okE7d=nD#go(p$q~rmzk!1GkSAwREml> zC$9ZR^f>Y(^za6%CX4!?w{qg}P>WJnssv5*^FIX~Lgp`^Gs^cWOPJ}N+_*bvIX|(`v&XI>r+_o;;p;tlwIuBnQUgtlFkf1@QcG)Z5sk6r z;l0v%RwS&&TuBbdsEF6oRC2e~#;c*@8OE6qM|uvyxwORl)85b3OFCskk>LsFaP&1Hg3>IptYBo4f4tMPzs} znfX*aWeDyi?u=_2RPF$hH;23oGwKfM?gHTT0qt4HX_&|-D_dR z&yn4t2_Q_M-vrKtO-`IBvd`SAk~J_+S=Z>L48gAH7!4K3*WwGee@hbUtFUl?^RO}U z3=pO#u{Z?MZJ*;T)&-DnFHW)8Y}Ho&5>1_`Pz?)ws;o+pl5d&-*asXY5n=2@10zpW ztZ8I5-Uj6}01rl|fdTEaQzPjo>}$3lnSeHS0FL6nzohbvrSuSin<6oPHuY%ZN0P-k$ldkeu*ttCDx=>y&y2I0x10KRZpfl_l$mh z^@Jn?psOpni(e3FFj&>ll_ymfzN~k#7+w&y7!OVP>U`&d$FXUvHPbkQU{1`gPHf5{ za_1CsIud^GlBW=mWm<3WC^#KK^ka{k6Y2-_ z{N`;pv3}uR-K{lW7NzQWT2!4nd*1kxhU*8Xj`Jz)ImXx`>u^&=#X!lLQQr)^*?Yj@ zQG{7qHp->))Y>As)*{K{{bBSuuk5olSJ^>RQ(KdhlLL^b0YI6msehj)WN`v+YHl+8Lf)s6Pr;6Y!}Gc5@19Y|14d&`f>E z0S0CW4Y-8idh4n=Z`YAujHYn+^v_a@2^i`d4xc7I14lalUf_$CSSVRv43t)zFu!rr34AP~ zHkuOieF!Tb8Uy5?3C@rM|b$c4xwUkM96g9-a8p$L^Z z&ZT@n&>Ocb%E7n*G}c=UIN%mM9rWXI>g%Eir+ zeVkb9fk{)QjQg{0--p*$IJFiyUKdB$@Ow;Rlwnu*4^+VJc}y zoh}Uvfxjmea%O#J`kUMgGeavYDGikJ8#R%Wm;4)AUSG<)j;pcQlFB6IHK;BXwBa*N zG01~;Frn2TV!V!bSBZ)+(qbV|J}Tf^N;a%)HGU72*TO)+Cb(7+6-F$(UM68gdfa; z{bFbg*?`DFhv`%>Fz_0vn0Zf?Dz+95VC}H8MYH8JPN*A0npEsvyHVAN^?(`+lva@K zSP)uoTkp7gFr~YDCM@dTbvGIw873l;u71=jEdmVMh`YG7fl0FMms_K0&79% zIa#*~0_*P-`QT=jYgEX*qYmrMDvU`1+jW-88(Rhz-!db3g%xgR4Y@2XyO0AezF@L! zw^7oO!lA}unUz=|zq;t4Y#bME-QH0~Aw5Fpxf}OBVd`tJYzzZ{ZS7K;i25sFs(-gn zO!X#6mF!~$B+x!o{#!ygr|Gxp{a|7z7culQ86NADHxRV5GbSEk--Nl`KfOC(;v$oZt+>n%0cv@w)FI-DI7PG;&&z*3j!E1+t0RD_LfsaX&@aX}7 zk@~}-BSC-)flIkTLx5wz!2sen!NCCr!lPgD38BS>;xqE}*{V6qK@=DQJIQ6i*}N!) z;?3Ml`Rw|9dVgN49J?%gFLnQOp!}X@RR9115K@5x-!7%Q2ji}&p8pv*1rSRt;b9+z z>Wvu(w)=nByQd({+H76eX;j*FrEOc4wr$&XW~FW0wr$(CRcY<~zFxg|uhqRH{=D3FOO?}%FS!Qn(Q(d3@)jSQchYv-W3?7Fm1!9fL;*w93GBh3*3v=9>6HnihT*Yig#_Li6 zw?c;Wvj@c|R37@un(iyCw#ZKiUm0-7A3{NzJ>_ERIF5Jehv_*RhVI&gqcQgHmiOE_ zSynvj8JO1L^)GvtcAyLmsJZ12aV0ZqKF^Pk#2DzFKk#Mtj(=HnZ?nS#*CFpnIKtDN z7@)8UP%)O8h%N*lN|xmJes&?HM>o$6kWZQ|Homd$$T&Dx@yrT#w@`E@q5hj+Y6UO39p2 zFrBQ~Od~d4#_VRsdthD{4T7q=7p;fd0FY;dpCg901D%YXvI=1>Oq*VLCQ4*3#ZF{S z%?=maI$`|WZ@rQpsn5&$wZV{uQqyV)NMn*TO1IjxN4J@DC0Rqfvd18cfQW>#x6wM^jC<6z z6uz>O)};WVdPP6;rviU9B))P}_E0A5>Y$ITIdWWgUlX^a%g|#B(Y7Ly0N>9%A!Qb) zG!HSqDXPRN4iJp>IBxh{faRva@?@qYC0neYo4W(RvXzwX`&zMH+W{ z_#AZv>N&ou&NLI+zF|Ym+3pG3RX%mSbcA`h6Inbz*;)Ne{cH=8Q;S7@TvTNG1jg&i z2&0pObbzug!b8nH?ZT0a19V0F)b#w@u#E6`5Z-!rRf>%duJ;f7f!q&a)bW3m(glAhRvQ{4Vxkli5pq|uj-H;2 z&5;xp3!Cb@r_2+O4v-rEIm6ka_eG9Xu3YW%noPr4AABsd$i1XR8(1TrwnAdH-hgK< z3#rm-a@=ey9A6T*v7(|}Zz*lC+;_e18m#WTpRx#la@&_l$o|?3zds~Z-O4DGIF^OH zEzWQ(gE&oqKza||{h=x@Rt`bD6SYzWHbJ?++@|t2aSP_sK)MlWS4)G35cXJ3E>v2y zL?VSEADMIF!o&w`k$_n%XT1XxR<%|?O(bO;f2|zP?ok)$3fYJQSPYEVf%&mFM_6!% zqR~{5(+5q&8p-wGt@`B^?LF4g@|fE4-N>{&!fb_n!`pbB%N3-x;wGDfBXLIE4lD0Y zp{nwJXnnT$9iy<~3>R3VF6@4YG_Aj*=i|R2WmK?(QM z8Fo}h><(?V%h6B3N5(c7O9H00aO=i*9+9p>VFU2GEwFLS{J7}=!i6n|Xl-+~yloc2 zLN<6 zrK{=<#9Jj{x!-PN5+z~Ms zdI6iceD+)i^$ognu&O<>|>%(S7m(QfnCrsL89IXXT*{!z^7^KCLUdM8FS{a6;mD%)KvTI%X z2AN9ku5-Kbo$i;HYncy5BB)bWXn1%!-99#n#^bjD;=vhE#*c|U=y=7p0kingjF`3= zvxW&n^rMCh6fBwA!&VH-=T31j#Eg+mfGOaZt${!K(n&g34Vg|*Xz~XnIciLA*M8a7 znc;3!eFR$Y7Qwgi?Ss(|Z{QY*ERr+G*=%$oM()(C!+|ft?C}cGPN@9s49m?`69} zCqtKvkXSFILp#!Q7Me!HaM~qr8QG>}7~?&w`X>b1)kP0e-g0E~jK-KoFcPOQ);4cw zWSdDh!o~*g!LQQ79e58`-=BkHfMI~AzAJY-aYdNy7h1Y8;pIon8l4Yg+DGh5Dv&?Q z#2fE0xq)TpPRwvyk1%rUXBlNeIjnk`A@C5>?m;CW8u?WTJtcT|bk{FkLO_%LD-mY!jEEw_>a$omkpwUuJuC|HdpBy~>fJQb9|+GhtjMAL1|d$>o~>0?+r5Xo+?y@i))s7@7I^Hr{-qfqmhzG;r~Ky_z2FZC zN`q;HFv=?^r3-3STXQP`S8ahgR!#*Ng!JO~LA50=&{vYq91cmpQN+pQqgb_UhyyYq zjL@4TC-JzmFyqg}BBdURh6;yFh+qECWQ57Ep+}uTedns(>g}pnkl47v7?)A4(Nn`>#1p%pSn!2A0nAz_Ee4 zX1^j(Y3J5r7Yc--e{7a|3s#xblJ2|=5Y>-%akdNniv6Xygexe3Swpy1s}erVr?H;8 zr&8EO%lou3uD@ra2 z)q2^{#u>Nz8UCw?&05JUH)1Js(HTJ|PAhJw&c}CO(qW8(i#Xvrp0b2}|oFH~EYcs}t)J>mSxf)(6(~jvb>=c{Bqwh22Nt7p2Y1HJq_JzxgTZwu#Jg9P#6f1Ijy4Q0;IRhsdM|J45U|J8e6mFq(o!X;Kr~P%Ca<9^Yhz(NKR#sNlKK&Sc zW)dSI=Ei?Qib;$~QAw)Apl4o;_ksqRgn%!-O}jH)40d=6m`4Mmsk{ztH<291T^6|M zuTycHoYWfc(JqD(p|anv7-2AJmCR>i%9^a*9W=;R-3-V2@Vu^n_7x4`+`Z#$s9C|( zJ)rAP0uN;O(i6aC6tTA)!R}$39>bVJNOenDktfs()wFL(*;>%8TrUQ}Sj{Ze+$?I4 zhSGDoAX?n`{<+yscR4z)<(HH>&f(g<$bp$Z=o>d&HyycahsdWiv?w(SlIu79sn-xc zW$l+6)tkAnRMZePf?s73Bl(ctr&(rEYY|Dgv!^b<=ocC_LGk&R4yujY$o|%dM5;Z$ z#dX$u8E+E`rwUgTu})!fak_M=Z?HdTy=jh!WCmO@G4)Cu_{bF$@hJFv9O=WlilN>+ zxo=FjQ>m0ye3xSeqh$-x81ry>uu)zp|H(T-(}c{upuRAF30;b!wrF2p%r zQ&g}eXt*1_98!P zw-P&5_m2le6L*Z@6Y_)R;YQ`Okpj&3U`xTO+?k&B;#nTV8O7e53=hT}wl3%wgFZ#( zNfYy7rIQ17DRVs zc9w2=Z*kk*T3M~J(nHkHQzgHmZC=3@e@<|Ie7);742fD2l^ZHKf>~#io^TCHn`N(j zp2kC5z8m)R0t^VQVTtd59h!e-3Kl+PK-dP`(*kfh{%91LeT$Bz60`w;7x|8ZQlI?V zFaP3YR|Nyf^_$9<1x~aCU;I(x#?lB<;8lZtBtK5S)T1oUU19~U8SrFgh{2>A32n(% zpg`HHvou!m&Bo68+;})nL!KNqSL=0yC1yKYo42GpP`9cO!%u?i{Be1TI9b z{c=~g5I$WdYnztkO8t*?Uxy5admG}#ZaY|X&GP6!cj zYX_x68#B9#Tw@dmOqXf1FsWr}XOfvRV!kQNC{Gt~=q@x9vbahfiV*>ol`+c7i0Ow~w9#I)t5<KR$1JT-HCiQnDc4u6bAgI)U6$K-zbA{0b>kS#+}?XkTL3 z#-uG#qRYM*WuFBT)ca#u>9F9QqU%BHpKj-B1S>jc3(!|Fc}KzF~bW69wx zW8pPKHApjg3Mo~_HwI)}Fe?lIs18QLsf%ckZdrfb+9C-+x&HJNFO+P9cyU}52TfE` z94l3nD?M;#BV+BiG(w3O1`&85PKoRs+)VJjs>P9ow6Ph%oQe7TJNMj+NK>7^5@bX84&GX{oQOg`#;`)?SweL zHw(Ld!hfpmfHS=Z2)kZg0Kab#a=ig`ePxAr)825Sby42n`1v3{i~2>PxEA&HPeWMV z?5vx)s_%pzvUvAJ+6eF1`3-}7^6$v`iGp;I-_-Q5f-FIC{k+M6IT!cpkk-9<5ac4e zc>s=oIS;vc7`*e_etY&C{bb?VN%pz!{{Ye{@9_fCK~bf=LGkmrzjaaGs9zs`I@rI$ zs%yntpk@lm7+90rP$0-N3UN=8npR+AT(HR>CfPqxpLG@EgpX?CdF=kY@ z4m(PGX)((mV-?;PL19I|74|!)r1I?S`2p3%2iGa=s{Ru6xg}Zqrk(B>er|8ObHXDe)jDlKw)bE0*CC- zIqSW)>Gcb_=|VU`OCi45%3gixgneK2rTb*${I=@5!0%RiE8G4bAjUr~)`xrFnsl?b zD6aQ=wlGMxGzOuO9`AJ9K1QBLWkWb*zX=bE>FMzBH%B}Fr!s)2+DuJkvAgmEg zi)N1?m>`+TOyNt4_1yh9z$sqH6pAGwYzZ6la!PXSOTigX`0=6Y-Vdj1tiRA;pSQo6 zJ1+efY*?;E>VK$F|9d(LBNN+yC{h1Qi#bCpZqm9RAA0zj3v~EOmRL%oUR$SabIPIL0 z(S2+OYEI;tBb`r5Hze?M-VmH(CJcWQgRu>zeBTR`ceQtjhw61+F|VNVFjVUiCWDy+P5_q-3aUrF4yk%f088Oo zy9W585I%Zddw*zjftTtWzJlN4r3k}ebRDc)-8tR2w@lA!%jY2+4ab`dD_{X_ZL4Gu znjBuE1sPSM{)ZRzF9_hD+MSX8KgQSmKcL;2n7&&c|EAq5)kdv1*x);tRc=;znELms z&H(}dfhGtTy%_Cpemd{krJ`#O=`JPW3!e3CDKC-?E zTMJfOJT<)bS73|w) zk{AraTzfnLgdn@)9~%;8F+^)@Z7I3L2t;rBb5PdyD`}5#o0-Pk!`^SozTEB)Kt6G+ z=~{hw5qEpe_9#~!U|9H?wx*$klb@=uG1@9TH{ZIp<^t?!(0#mH!W#&|HXn{o`n;{x zxon$se;j@EucZYnS-Zu$?Cbl$;UOSr%S|-6lv1N2T+778TyLZiwFUqxJt|5*8Z|(R zL#Rrg<_nt`HHo2(ccRb?UO?4+R)o|}Lao4&n4{BZd zp`Od;aK^3o`j@>_F4|SxDMwS|jo?VPm9w~#_Qw>LjqLrBp&7Tq)WyY(tT(-LO7P~z z&jp7J(6^eS1w7q+p5=+aqAr_*V}5FDZK~|Hw#%J-e_w^zZA%vD75b@8RuJd%u?0CB zw2H7P`$kHz+lAOI%t9Ckm3c2~vgv6Gaiq~S!c9X~t(64zi-Oe#Y9fu{F1H@8l~bMF zgDBP)qkw>&L06CTQ7G6?H^;onrkTq}$#3-;(jorj}iN|S6W0pm* zqYQ@!5kl^nHz9^4ubyfIem|`^a;*IUk*H;~=Qo#x#?X=9kMp-)#oE}l?TxKqfKvHm zF?9Z@cS7WpxqBPz5>78{!k6V=FBEqE;}bEX4I2(_c*t)00)^wsV_SLtPvQbs=8a|2 z!SoRqxk_Ze>qY}!?nbT+p?OZTiD0Qw)h*2}VmhG6U@{Df4ok$dcnFVY7CJZdwBxQ| zny#xf==TV!UTp;YFioa@%z+q=NN64$iPfNbGZ&f!Frx;=#9Sd#QGR2XsP3b%0)@K< zN}Zn?6^e0f1l=%=7oE|`F>HT=*K7ihGC9ncp(!7U;9v@;qk!W`BRfznZJaoPOH-s_ ztzyg|Lmqa!W0e&J$^?Q|S=TQL)&ciAzf@|N3CmJCiDc=NB|A=Rzg4u!P9m38`OaoR z$M}j_TNj~_Hd^=j1?+CYmKayX6=rQ~BmnmXPHb(L&Ah`}_MhixyY!w%3j~Rgz#meFkqlb_lv|OW7vq zGU)OVk%3jd+GV@urr`7$Yo`*ykcJ>$y08$~jbC-a{=h*;ux3R|!C(v{*z^SUqrqzj zo79alK^YgssicRgyYu~4EPQtYf*B8Rsx=Z_DML*or!N zR(Y{k!@46WX5w@SF_XP+U7R{zPgaMjHh$M+xe8cXC^6Ui9td6UPF zpdPgmCt72Npgfm+eo+&|i>E-04@9XcTuLm!yYer=QVTQ?1#yt3MuvRI1*;^T?mDB$!ozWA(cOUMq*jIfW_jBfv}CyjY-Jk^wi{Vkyv;X)(CZoksehK zUrVS9wW@49vj$oZiu&FJ*`iW?R@%4TU1Zcf+Ow%Rum126&~zWOF_KF#Wf+Z*tm5y> z>_T@=Sdhkxe4F~BR!{#gK)%oAv;T04{L3`k|9z%_iSb{X&ufc{5;hrhf1%z9I|tn* zn||?00-3_*$`;|+Am>pq$Qz!KrkAIO0IN`6jlweYQG=s&8=h$H9zZg9Rx;BgZJ=~8 zYkO55x*QP3IR4MGjZhu3k>=@eyusSawaqh%SViiv>_zevcfIto^9<4|^>q>tkFvHi zO_7tPldzNWHMZp@@N0{8t^^l*Z~5fW}bZkydUq&`s!4#-qjwiU1rd2~P`Z$9YZ^cylj z9iqtJK)ltodO$jAAcf;{P_zBV`k0Dc$K6Te$xeIFgnVG&L&t!b+*!a|U|bqQW>oL4 zE={*xY;Mz|;>d)H1a*I+(s0WtEVDjbezfV@~_n*~sa#PH07-Bk8LA!Y!ryVEo z;r$P<{r}r22@}hI3*}x^v$EM2g8!VVzCjZTh|}9%ruiX&&xdb^DB7(hp1>k)L0&6p zc?Iju-L75TslgekV=wT>J@V2u%gs4!HS?C^nXv~@{>v6W^i{ZbpWyk5=J`w%Q5OUu z%)ec$hrdQQcUsuC*~{hLtLf`J=BOTYc#mWO@2<#|$H<49JKZ8>bL#5a8?we10vw7E zFgX|^<};NV0xsnmAZodr^6Mt=tcUnUSEg*wkDAA+7Wm)oTPW0!oD`2SedaYx5yu_+LnQjNHE7t)Pb~4VH7iVHOihDP}$i8!>p_WKB84ah3+^ z0_Xvvz!9Lg^_`akSJuQGPPVj~(=*AZtl{b2<74F`o8E7bMAkW`0cUrcVdY^_+$LdG=z-2TZyw_}w&*+`RGtfVqP(st z)`WS@yoeje z3S1jKU%c1qLV2uOl~Gh_o`m)|T6%@Hm04FIOWogLiJdTN&a!NLcHo^__UbG@XysI& zZsTIGj#~z+M6U%;fM0=Y@-hf0*C;8}*NAzUeTKQ))_su?%vW-}5n2c4_J^;LSFIfu;Z9xQ*!Sl93$gOLTGN+D&!7NIy@|m^v{YXqp~60d5VFF? zK2El*Z)Z(X>L+;E(^LWFb8{(^=`%~R=9kIAg^p~wdojacgWu_ZcVOMj)#%YJ!K#Uj zj}FbGlAMd><{TH^8qseEy4xKVIJavn=;$Ew*ZLP%7N;^81BLJp|H!grg%vs~!0=v6 zbS1AQ%X+!+cVw0fy&iiytf}#J4a)@vW(OATki*KJ*UnHgvTTl`-qg?KT8C`?pGrQq z55=1B9h6BBLzh=8{O@_4r)x+p4(`l7rK`#8>~9RTBPrmZ3sU><8)ljl#i0GxpxV5c zu^`!{XKZM0^@q3qzo(*WT<|UHJv#Z|d-3 zw!Iovw3W*0WD~`W$OTpqk$^x<$q{0tIQVh^Ih}zB=ExACf5V^DFhL?P;bVdbkP+Z( z7zklf!Xu=O=>KYla!r%NLV>p;%8Aquv1R-!hwsfg&2l)JV0SRynyh@fy1V*FzSg;d zq647o)91U9&P-K#*7It_#rK5uWpX=X1dTs?RNU$*a(Q zQ>&(M?<-sl^cz>?lAZBBiy~n>adn}pxT*Oj)GX-3X?w=tk0^jA$1hoYibEi6!G*J& z_-(3fkVBIBdqlC|gkZ+WCtvrX7fA>67V4>^@cKcNks0;CswIg$d6SRbb)7S!XSmT`6>&EXlzzH zd9HQ5V79f2><77=HDz=Kl3mQT#|GFk9d(dt$lHY+KJ}rnff;}BW zT@+(Guz!b<%4?)oTQul&Y*lEB8QsQ7H5M1IT9qXvfU%$;?ltO|87&q`{b@FvmokQD zwcbKzP4P1cC9z90N0KO>3ois0iX}ra%KOdT|9wJVV94Vf)Zfd8Hbfj4a{?&EP4Fr6 za^N7Un6t@c)3#b`#U(A8{yB>GH2=kesHz*v8>}`1^gD^)mqg2#QB(h~WJ{Dz%ce5C z$O>ko=!!-|UZFjPW}H*b(+S_;BPI7pn??>ocg8g|sfgzxCO3 z#m_a-n2Jr=%m1d&3jRx<#r}7FR^fyQhp-A4S>Y6j&L8$9PH3NwrUpwAj}U)+K9 zWIFZ7e|j$-!6PnGrltmp44(e}C37z2`09?>7Hfx2Yjuig`Zn%XYdq?pF&K%(IuMzrXOTp$)$V*+$2_NjH8#d#NkzR**V}G$ zYjNFizqaSK^}LUA-1WStIcS%}YH~Wqt|<7Zz|W-=>?$4@`Z-_=N>w0+Q+F)j)w{Mv@jP#Ru|#;p9C**|Z479z4j%)F1JHI|j44Re|& zI-%eG%J{$Z8FQrXJRqd@_ZZ%WwGgu!J^@^9{ci3jP7V zSSmiBHL|Z)xXlt#y1n$?I{NbV2BzLRw_Kj6H!5${q&$z}c|-j|J|OK$GbCWa1Kf+}Agd*zHZ!b?=UK zEygXYS}ghezH-<-(5 zFa>xdphzxzy0@a<5B%tZ=>1Y$^s5GM{ODp}62LgX+gx3=!gvN}Hrb$zYt`ncj;WFf zOju?wBA_6vqvyxgZe{cr&75;j4&s))j*6B|GEx{GGDQcS?EHzFy@wq6&DO(UoRm*@ zM?+-(oHaIExGW`OsIj%{cy4@`Ejc=))(xwc&wpZx8>d+T)4?&=L!tz-O1amMn$A#aiiD;*>dx*p#sV13bG2x_ zK`whs61@8cV+bU)a!W>5D6O|Mt7b+mbZ`onHjGT*b+(svYrSN8yyYKVt+yZ(2;aCG z1lzSRWxz4NM#71~-QEsS?eEX+cl5Aj16_J*_l*}k%!R+Z8FVU6f01SO@ZO@+V93Tw zZIrNLoESTc&!Q8!?9p_N@6fSN^4!#dkVEbp;zg_MIq`VK5zL~Sh|`(q+q5?G%x9S6 zP{8!(*6H95e1z#7FT=4wv%s>vRC=F-r1X&dQoBRvQN}1ApNnQR#2QX7lE26%nd~vU zgXR%T&Gp!bF>xQ@8s|Ves(YCu^c2?~KqDg_1JVk;BLDCd49#76E-;I2l~nJgtT@-j z@z7QeSGp7V%)868?%c|jH`}t@gk4vQR19c8-1IE2Q)t%EG4LLI^*B}X6yzBQ2xhH> z`Sxej|HGdJ{^ifS{`O~2-~Q}iV@W(Cck$bwS^jT-CiS?qjAwQDO1A;YqFhbOnDz%u z{Li1V&9c>XU$9q+ap=M0^Gh*Nrj>X|ra6a3UF^&ye`?G7W~ zxcf8EZ+1|&BH={*4{=Uu5nayOgX-Z+JwJX3h}Xb;0^6n2G82yY*PP(BP<26>=QI^=i- zzhLK7$q7I2LRHW`6ZIFNj_px{@%vkSA8Uw37MWp>OKa{gYy{2@kHv8(rw>>fxa-rQ z4`+@2U5&R9NEFFKuAlMxabj?5(-1r*#T67w$YwQtQ@;wQ%O6JfWc{mt4 za(CGO!5vf^wAI%#m^D}%-Wk51cNKNZYv2Wec(4M2)#+Y5yovKbSkQm`M3vguMT3s5 z+O03MUzslH?xuC+cVQMn`gNI>pe@T)c(U<%AlIC9K{3MFb{I+Y7?;THaV7o@&7Ot&|TI z=T=@i-j>U6Cue(H8C71jG^)^Fjr|SKC?4D{%7@02u}b?gRg2h0n%qB_k}BV(4b&V& zsn(O%tyNq^8PH%`_`QD%4D{(Xh@j44K^Y zjYt#f>{sQ^sG`g2N1b?pl+dDQk(erc#gk))x`zI*QpwqpI{ zdRZ|59llShN^4s0ejAkeRISm$ZE2QBzOekdVY66%I8*{hM1(all*D9Y7)MKb?wdQ~ z&cb^r3nzFP>NoT;8MOZW1DIIkm??SCmHwnGT6t6=@bp1ENeVCNFlx>PGcAX_wXw0W z^&^nccP=RgZgJoQPDW}%oJvwN6Fuk7c<<#ee`dy8U~{~Q{tRa(br(Y@*SwmXgDv z9M$uByT040htO>FqT$)%(DQj_{;0yt6XLuJ(q1uzzg^DFEuOk^*_KSCvejqP{I8WG zcpB1AIK&4gN!#G}bV8gE=lf;VtiA%{&YDX$rt4j4Xb+ZK`pB4Th_PY7P=>eDnV~n_ zRKPdil@Dv)DHbF$PL0sZiet8Mm(|S(;>~Zc>Y!VL1%PdIMBaY!Nq`2}UrqY%Ju@6c zLn<&gWR>D5sG7hsE(o)$1c7Ru=k;3q;Ez?r&~MxhHPbu2lcuz--)t}F8p_YR!fyUgtmzbSA08x zH~jT7Xc`^80;W7zRtjRByss!-7r#c@slLL+cUGTR*v;NAID0GkpVH0dc z^Tpu^a?d|`H~2X^0}0Rvah@bw{o>>K^hJs`?u*YP&;Fx5C(No?8PI9ED9g72E~#Jh zjC}}Gt#u*bwW*)kHQP9epXe&iFVffX43uq{xMiwNkGC>bEY+k)I+h=o`Z{@djQ^!> z1H|iquvKg-FhQ7A~pM7B}4%O*2o+P`w+0 zA_pui6cs!jlvuu&Dal>>hGd1$2sM%wL42F^4EB5d5URG28YbA{1=Z~$#CAW!M3Oi} z+NnI?tdIYadEOH%Uo7-H6{CMln;f2;jE5BD$B-_ZH;ZCbY$A#v%L3Vfvm<0fI7#j0 z1-gauk^sQgu+E<4dkl3l(gDsLU5RNjz>xrGWhcLfD7o%^s7ocXMY+WNfo2m_SAv6+ zg6U;5Qgk^wwI$+}&1^SC1 zuNh#lVVhd?RRolxZRB-n|{h%b)IN1IzNHAPN@G1A}sOyn?P##_^zotBV@S&Z2L?PZlgVCL2aWv zNA>VRzUTK8iF0k9>=uKvxZhkdaS`7<+hg%w4K)+i@bA$3`M|p>?jZQt{NSRxf$@6) zf`jBT?QfIEt42ci{D6o1;rYP_>+=EM)uqaF3A=NOhafk){*KE+ZxGurmcL( z7gFiy?H$5u@{4+(k&O?_$0?S=C9mH!10_>8-WmZVui1w73<61jysmrKn<9Kg_6UdD z>hYkOaJtpPp+RKO-jGvHG498UWKh~lL!mbAAW^fmgF=B$AwIYC4Da2@`7v4sJV)3) zTlmeR?Gi1J!Lv!}cJ-736+=v%hqO{Z*I+n+eCxBi9x|gpUp(mD!L4N1=E(IP!RKEe0XG>T=)we#& zO=K%T1c&-Bea8Q-&tgx|*kpG)dF$^zaGvV{_1;aKv1hjXz@OLqYPvz+ASaMlnxg}r zta^Dmm9~ccIvFK9n!_+iE)IJgp^7#Q_RN5;>GjORLcfy+2Lri1&|PIvJkV=AFrClO z_BZcpE$T8|9`x#P+JC;dCcn{*hGcq?Y_UUokw_w^;M4Iy@Bf}=<8;5LZvy2W@F&GH zpgJLeYy)jmubIb>C=zMtDe;W>DJJ|QA}5(JZDDn{PM>sVgk2NVTfvpX686sfE(U^ey>of*URVA6x*KRf^zA{(qZ@KKY_LUq#_U9l zw|l=$+ol`spT_I9BWLo--Sc?;7^2~gGze&7F#dXFqBq`lR$pVp-At+nB~BKWU!mcSoRByy z(0wJ}4kKBVh4T~4Jq@fRTi`|;=)~=o|S!ExWx5A}i4&_TI{8{s;1&D)=J# zfRkuis)X}9XeVv7!f`2zRFGdW{n^Y9XswJIc4k|N9L{v~M|B1^acEBX0%?NaODK6# z#C~W0h0uW-L#25tUPcyV@CbPQ#2zDGRa$$+I*Di1l$UF^^vr);vtDf2(_scf5KQU~ zZgbOyCO|op0%C9%#t^POs0%a>yb}_f51GtICwHkchNG+(zl!e1#wIE{IxSBOmVNi( zBV)#aI4MS&2NvDMUf-&(oz#${5c&ZIIP{$dgE{=O)*18l~CuojT(Q3 zaI$_GiH36PH!-xOzSvk8n_|MGPRvePuuc3dcjHKwPf-IpPfb;2&P;`A-o$D16J4s- z9h;`^KUXPnIBHTyG(y?LxC^F=mYnw#Y*IP^Gk}u&UXs51a*|DL0Aaz0fis6p6<4Ge ztB7I|&u;(>QT=$v=IjF`Pi#9&o=ThBB?Xq~D9zTbB8DxGNZM&MN@ymIDyCG& zf}wy|$!;jdTu{JJ^Dj?@cf1vNwzhS9 zyLq?h=u|A8-JZQ|%k1{|e|#_ceXFB`fa-s49Mc9h^TMSci2t*KGZma;hq_@Op9L_k z#wgYn1;ome$8XA+eRZvrR}juZ$S>}R!a?tM%;H20m(nH+aZ#c z3wU~<;t^LhzPQhpTc|3*Q_Y1;;vm?2lnI!qHM?XRlw-MCDMh^IXc5HUh^GcVIYLZrTpb!|vd%BH zIE~S>U_}Yco59zlUJY~~^7y{6ED50{U|4bfC+=&qtASYM9l2Mgf&r_oVNrtmSkwn9 z4j8kd#cg~Mxbc;7-MlqE0Il0kBmdrTX8D)Ilm9z2W2XOa+^AAf$_9xay7Qj$s09Is zvFW&9ArvaxUt@M_?FVQa6L{RrOjvici8JeHk}yAnRi0(mc6~NCQMyOK&}jfktarvs z8~qblor~h_6-+NyI8a>svz#z=Mx+sROf85`$9jxgJ)_D4`A_g(Pj?^J&Fxf`$~mU; zfQvda70lWU2KaPmyG_rPDa)P}&1viP=p(B)&TI$)bhDXRyw!}}VT89wdwfoX3@Ozg z2yBr;<1fdwyk*jtglOQPTQojA7suPntdnQ@wQX!amttYI=RQWaOCj;Wa~MV>V+u%? z^fH}7{d{eIzL|g%_&wJK+&>TnB!4OJ8uMWm3UJu)X}SPLm!+#Itr7^~3Q0@XY*i*F zBH^14CjeNyKU}Tv8?Q6gycZnlb#8NSRdP}}KY<~TWu7pAz?!{m+)m^fSXYD~`|GHO zpxj0h^9=w(_A(=6NXr0zFH6oMChtr17w1R&1-R|iKt!L4Jl1w&P$ykb301oVEfPFJyS>)jwS{+knS7F z3X_q54Del_C_Yp8i>_{@bOv-#ods+pY|r>TvXGshzjf&fqv1r968PCQl$1JmK+s93 zL5WQeD`0QY^lzy81N?suXqzWH>fqU&nmK<^iVZ4xBcCd$hEYSj>!Xq0B4g0=1J=vB ze{Q%)U&XkmodAK){gHiYh0HN$O3edome|VEH%`dOMg^V zU45oGo7i+&=9PeY1dW^)3e4G$+X+BncBl2mIEN`PYFmBgZ_WC$jh)BJ?J%N zBr+7RlU6vM_LH_ln6JNq4(p@x|If2x|1Y%je^uQ7CkenH^#A5O@L8Fdng09ivNa&o zkyd+h!^fqyL?)fDikgY5tEHaXn^sgSQQYK(wc!P{)d7W500dA2>V(Glg8A24{Q(WY zP?Cq6ZJQ}ID_1I2mMpDwY`dFl&Cc$6UT6H(Kc9BodS65AdW>f{exF}=VF?Y-dTF^6MZx82`q;;SmfKTF$WMb> zD&o%Qi*x!OnT~bmA4;hnLLi$L=+t>p{UYRnD+B|P`}Y%%D^Val+Ij_VDxsCf z(5mcRo$NIU@p^~GMS6r0s=yzilep}jA(cHRagui;^_vX?x71Kb;jrHbUR6Op$p@1w z^q-C2xtq6?YG4)IsqP6xl3EFc)zgUK6oNr0mMy<@YLq9x2e^Xz zLT+$tLA@%2Rvzz1me~iyrV8E^Du)4kiW>E#DT}8y=ml3>n$+#)Zjp@-BKzhT@CHD- z@agnZ`dyIu$y&|E#r2*2G*RW{!%tSLB3KF643Q2fNx};Ni*yNgNkWrVMIa1`AGi#J=0&i9 zhoXygNz?@=xktHY){z_yc@2FIu^$K-GBSjuNlFv(lJXLm!sjBm4tYy^5Y&S!=?ShG z!AeD#1QXR~*%PY5&kRW#qSR-o3$?*pL8uwx?2EP`T}E&KvWCI4iKrI57Z@uPmnk_b zIJ=FJ2|-rtHdEqJ;%JhkM6x6pB#=u49U*h1e&u{be;g*m)cU?%)UOuRHp50?(c#I>g;yphc(| z9C)Yz+(n@x?b3^HrFPEDaR}t+3-mANH#f5^H>bcyNt(u7c%h|>$hFZ-)kkr4X4+an zYV^JdUw5o6%`U@U_L9pQSI<``wpPs{_|i1)$(pO3ZHL<-^#*0y6Wt2Fr(a;PWTV-M zsx%srdQ~e(gEy~I2e;$bVs5hhYai-A{Xj$J{j0jwz&Qp+e>%Iwx^nw_VE|MB024%& z0hPZU8K$fE_nm_>sryYLMr>L7aiJ^Z4r59@3#%UAS@Y}z1kV64a~__@HEK_a4+EY|v#6kC*~m%KBMH~iW&Fkr^NL3UykE^XQf<-%jx!)REjj=<@i(@cZ}ZmG zMRkQo?oujj;&wjgj6$HUIgjoPe9?%}OQAEY`B}DD&ZixpJRkSEv@zwWNjTGXA06lL z;*w^J!YyfHx@S{2u8+k6o z#R;|cjUOgmxv;zG+EHry<*xNy*_xAYf@IGkw+_`%R8egmCyUQUS7n!7`XDZ5x{$h( zuMyYKn|*nnm*&nA7umUOlWxqvIhL;BS1 z?AeHs2PDo-9)Ok4s5LJD&*O1H>OCc?6o}G+=MJW{Mq1p7xaflI&L3ys(1;!_LgC`_ z0G=|{>BYD{uDim$o=Z>)+WqLmCHN`^>sT?@qZ#Q9GSLDk8mXtpHj3?*+WRoqidrWn zrHr0sKV;aArsiaqY#B=%va?x4J_9`M9U*&}q51f5hpd@W3r%;4zo!vNlGys|nE%yW~f5tUrK8gQNJ zbNw5xa@{W62o!wF%@i1zV|2`{#B;~r)MkP__Urr_s2XBgr3Jf@2m<=MQmT-Rb69dF z8(jcUFiLfqfz~LqKT|C)O){@9>8Sf*6lZCwfNU=G7ol1m3V8uh4NJAFs)>DnL(jhanUv(8Xfa7{C)n@xewsdQu#eFT=V>BW1x~Yt2paxF-87L^`uld z<_(p+)8Yv~j$fHlb1lY+yTcwX&Tpq+K2xRVk>Y1`!2Uy%)Ae!qgl%Uqp5FBX5TfZ!I6HT-n0=Hv-s$K|{i#c~=g;V5EeGuIh@AmSCj%=0m! zYfGn;X?-(MTTW*ScHRocMw=Mm=IsBdNcNcqFE1z`-$7eZ5FSGzM-z-_PEGy&b1>bj zavf;2biKZPyJ-vfThyG7?1R+3u=*>E<^$t3K^nK60H8r@`lCCAx{`GP|%G6M!ijKndp3H zTyB;Enotx6pNN>UKaY3mYCg31SbaP@Lj{ws0a5(3EA>fQ=!Py_7&I2jN8WPd62-m1 zzP*6b-WWrbQ+lCb}VMV-A*7zEU+?mGjC*vw;t%J=!aife0Bvr`8DuP zkHZ^P_qtE=LbU_*V-pD{jCXIO&~**drtR7TVsvcpXZqm@SFwwvY!(!{TUuJk?;KNa zymG#|kGNz$nILUYHLsyfHor62kYZ5Ze+Pv^Ea9|FVv)FzSUf*YSqEi;i?WicyB&Ahns# zLON(|kqZUUxR}6ZzWSRv?kNg;jFhl)h*j_nfw7?%D$owjMPMikDh22}@RSig~r^>)xRNUb-4^MlJQOL2l5w^ z4}^@4!4u9#VA9VskauwX#DT9bmL)HU3k=||q+h;SUf+&_bYnSdC4`&QkVC7)VitDk zB;mi0$5PVi=#4nlLi+s#SMRpaAnp`L|6&8PHV`wX-nO<5J!_yrrT@lxAmR0fYqbQ> z;}2UADx4tYHA&n>_Qoy9r9e8QUq05Si6!GQ1S1bekMBs*JC%oI3ZO*ZeCbHzJEo9l zKneLsTn<(&wugRW;yoD&83h-GT+scT#n@mBh6vk<;d~G37m|MX_)5}4yg8p&QyFKk z!)Lzg%ncA zexI%FG|ydQXh|P->yi)NUnqi40l{WE#DlvPSD)hictIs%)G@h*%0|=1XT*#Uru5F} zQPi^*e@M3ML!UZ0!+-<61meIb-~60{brR3R3TZrb%IZ{O9hAkxXRZe)nzoGUUTLNTk)MZu!3zv_pmrnQ_ zh;PUv$~8`Qc5><;4TTlIA<}fO(sYq-0|{x>`h0Oa=A-lrX_hm-HdEG4YPwd&Mg#s5 zVd`1pAm;F`YMYgl(sQGtJdkSH$wnUs>R*i0_UEFNq%C5YIAQADmU)!ayZA2-SM1XQ znz>`49AwHzM=Qq9L>Rk5nLl#hXz6JgB3hL+;$zQ=1*;#BkZJ+6c7;#=#I5~Jg3L1ILM{TH{3~JF5jW?QXq#mx^%P+_^QWD{bFCU2v+G&YR6eK7+ zJ5Aior49_@ZUQf|A`kR>OkP=-cm1P~3$ARttSJP^VlwzFGw;Z>)-`>r>20qtuT80?TlkSS# zF%0+m_#t{uzQAkK&QjHw>mx<^5CJ88+26Nh_(9e8;<0Z1Zbul(LRt>Sv63HHBhc2_jDB`|g8b=F~s=54AHi9fQ z;s6MBN!1vWp01(c(P6D^`Z}=x(6aF| zGO=xsKD9A$1R1I45Y4e#?>VA48zam3!FSDu+u>N;{M}U5I2$5xptCQ~a+uT*J+Z4N$TvT|k> z5}Jo<>3kZTw)-|^`D6UK{;lV7>-0I0VmIv7%XkKs5k_de{}>q39o)TcuNkQ={xp$c z^xYRO9ub~%*;nA@7r2Od{rPA(d4k%Iu_dHNU?$s7Y*HO%AETA|amur}(%a^;pQq)d z=X?pepHqHE@+ytlGrVpCTbG_2NxUTul#S^w1P&y zcBsKc<%(;5L(T=GM)6TER!fD1jaUF#15v-EqPDsmstR`a<-op^<=@=ku^_}{=NAzH z#+=6K4s&Y#hiD7qtQ}OwT53U5c?1h@DY7-u5}X#M?9^uNvP#cMkRZn-ZPeOKN=5+b zpJ3>y!2~zc8}O8?aVr#!nrck`e%54-+k7|@t@_OyvHmB>8!}tGaeCKFKJHEoYohHn zU3GkN>+q>hA3(d{+!RXrat8eE{)@_27S}?DZ8b&jVbv(;fw`AhJ(n-k;FKA>)6_un zQ+Dn0-ntg;{WZC?WbH%9UeS4Ki^RH5qc&rB4~p{3>7Mb0RAQ6Y=_A)6AQ>whnukqe za_(;sHs&vl{x0eHf*isfDsG@t9$=NItL zHWv~?5NRPnZz0_LCK4`Ws=roR?o7;~*yB+LNFymbcOTC~T@4eTJ~{6}=7oHNyl}lO z-%H-h=F?yoU-t^wY^Gn|8(saEWCLvnK{1YHK4&K}oCIxsXC;?k$RhIJ{LQwP&pA*zNUbj@Y6@t803s6Xelc#Ey;KQ7pIA^MsN8qxiX2>e`*}Yf_QRce9X}9_~ z;nFJg@8x1=K9xgtPFY0(*>b$G)z19;b5P|mSI!CZAc%IdyO@htX(HtmjF`-wb7KAt z#pe0uZ^6qr%nYiRZt&%YXCwLq67T%ZJ=psBXB+PZSkr8zzlfcC(Mz#qHb&p8LSBz2 zbHiJ+(*i?rAo-&lLW~9@H5M@w32FfkJR}@k?W*rbV)4R3JoDH3nAfJs;(G)RV}Wk| zbz=@46xAvyp&QO-GkGDPG==Tf=TRK=Sz@zrDqlqll9x7H1JN)P_JY6hm`dxz`&GaX zPNOYk32*h5eyNt`aq@m(Vf(N=#HwUm->0~NsDSjxeyV-#W#|E1UY^!AGURQ|d-VjU zfpq~>C+1i4sciHD!EEr(=BR7LpQ>f;ZsaPfX0WP+nVOcB2C|5k;pCf9IeG`*DfaHR zDAFyVZgkF&6DN1J!YGJ2AR-js2N_r)YK-IO0DMdP2k|%gl0OHnK`e0YqfhGbrj*z^ zMkyq$Qu&Vq?;c#mSK32cLXzj2SU&B;@OPtxdJ>L0swzek(@PpXd+Xp$K}N-m5;gFp zVG}MgPdOHtLw((oA-tATsp1r2O^8;X`WOnvdj+n#&!0n-o5(ntxa1=KxvN^Yi7!EWxj<`{(gQusjbv!~m>y^^RyC<6;0v{0U1 z)|)?ZCvz<(Fl$d-PZi;RCr}`a(h)jFjksu?mg_zdN^~>;y6M%zAu3F^R;bF0h!B+bAw# z4wRDX63NGi2_=p7(>djqn$EnY1$mmej0g*e3cxAmCn>FBs>m>N3S#4-Qj0Bjj?69= z4n}=axq@zMZKX(#c2F>p{FSciP%JwM=FK_BrBFxoEHhJ+(<8Iwz@{-qr9iM`5GMqZ zl58U?B*ag`;#T zZhh|~(-VdvCjr|`lDTBQd8ZKjjZ^(C;zM0kSks#f4u)y?>S!inWbrqSW-B;O+pzU^ zdL57FFC%lN42=vO>d$tZ-A2tW#o5Qc(ky^C`I+WFA;oBsp&td}{csA2#|0ysMVnGz zDK9Q$oZ)F^3yKnE#6}HwJ#jU5(RN*{$*E0K#G{$puez?1NgX(|8DHbBb$}_$i--c^ zkOTn<5e3ivdABnYnN3SRRonBHV98(YB!nU*fLgXXj7#VH@~Co7iT?JgNXA2wxB`ZR zaGK2lp`Dk8u^s%QY26CmvJae~iTe;>!o+8NvlX1Q0O0TQ)2=H(I)*n$KN!d6S#AeQv$J zKe}6YDvH!A6}{emzkhe@;5?T0`jvHccdF^=)R{Zm-r_|XQR#l3gUjXaa%E5pwAC$sIdKFE@YKHQdQy}yQyZ3^9@D!zMo1g(#fM&~{W zns_9uHNN^taJ(RzSH>;EXK5@dYUgyb)l7|KAaqNGrALWM`|*i zxyW-S6g-sYFVS1Fvjld8Q09p$wkozNge3WQWFsmTmT{F4S~9zkJyTuKUf4z!vtQs| z=w9$%{J9XY#D1oKMrXZ&d3m!DapypDat7*kyk1=D?eX?wj_P#eg=Fdd`4u6 z%8;4Pk1TIrqFUnqm#7x(mZZr;Rg5YdUP82_XpYvDtsD z_J#3TLPH+1pNTxc*=j%#`?F4dJwOQ3{NGLZWYE+OLlpGzc=U2#^jM9C> z>>=F;UN|s-9?S@`cEo8H3~G)%+%`zu9y3Pt9qrq;7c7)t_)x9R_>X!0cSGMxkGF6< z2(xM-s^!1Ohqmhd`^m^1eW;ZmTGhyN0Xp5V5i&B5vkYeQrT=yI))Oo1!+q54PAhy( zZEid5UGP{f*yPSmsgNMy>e1L%gcOfLUR6DXJSO$uy0BUeC_uVU-m%UzmbJ!io|#Ik zsc*ts#TLm%r6Oj6lN@Lwk8lRmpbyLbHr#E!D0&)LW)6Djk4a!mzy26* z$Ps-NgjQnr`bLw`2Eir))Dj4^0Qf<_d2kR-CJ>{ZOC6~q4gjpFo3WXv8}U&@n?cqQ zA*B(Eyw%)F^0=gliJ}-2A51s{{T{d=pST5)qADzlWhP(`=qhs+2#8-w-Y`Z}nlLF* z{P^6z?pk1))rzFZaMpo*33o;sxQfDgee#iladSeXhz}zL8}X6-adSqT#b9K}7|j{f zy?n$YlEo@fYhFt?$V*n`Wm^^VDM_d#K@)M5`eA)e^k=tb8$Qt3AR`vB)B0jk4Vo%| z%?vBI23m1l*MzfojLs(cJR#%;$Ys<*P)mR6JgNG!Y*`RM1=!GNgJK|kKAJQQuozdO zT>i|6ECtEH&=XgBW;~WW1Ht-oK_IrkhLs7}6`4})Yk@Ynt1?R}6Q~m@Tj6(9gsd@M zAefJy=K|&nGw8R6moG;b+GJ)&V?ND2CALpvyR{q zzi?7*;aIQ?AekRiw>h)`0eo@MB?1yEb^+1#s-hzo9u2)%8BO;hxa%7vY{3?+cR_B^ zc6dHG2LkV9wqA?zm((4P8_F)=*(c{G+gae*{@1H7sjWyK?5!~{>FO%#>L@7bb{{+wHj7q-8OkR&2x~lnWQVi1ICQ2LQD~AVWmK#I z`hc=@MX4G?HWGcXzCif$v(5W~cXD>X_QCbHzT#ytqM?b8s*D`})3OO?xG<`!b>nq- zU*jc!!1cos{|(8@33yDYBCoe*rF$NPi8H1!1Tr)4U%mC~^8A2uLgkyR4x;)h-kgpR zZJid{fcNC~J!@r=Ffs(EWL`Fu&eyZ)dH^bzEr`!bW$10K=qyT}o%Mvsh#&t;u;=|l zTpsp1?@Tb0IT_Bv*}hdP;Yem4V9j^ca1)ltu{}2e0b87ei@}9x!O zFKE6%>bwo#%oi-28CxGrM>S*Lt+^juM#eaoF9wOY!H!_x=<tFzyt1 z_S7dD+*1QyztJ#^lYfqf#ktdL!{XiuuM1p0XXfYy37Ohns`0Gxz!7uKIZ~F``#O;z zatVxP_Dt31&Bkl+{gi( zc|R_MbFdYD8LPQvn@KdgarkIKjjCcg&)9sB?j$muS_yz+NX)y^~InyWhY&8Ce~uXTkB0+CDpb=WDZ@ z@tz2`3i%t7^9E)fl6H^d8_x?jcPj-uj^@?#9H1$8qa`dC6zc7=HYrkweCga^R%h4e z(Ych?398&~M>tKuaA&lcd!C?@m;7mZ*P*dl>SH7J2CZ_mR}B6P4LrFTODOx9L;MTy zbU|5>C`Ea;Z*d74&pnAJ>~_!%xfs-)6#H*IM4Ip3!#8*xnSq<l4dSH3r)r`ntB z8oAeBY^rn!I1y@&&0jCcit(8*Iw^>n-$g?;5)GL3XZ3%3Ykk-fSXXRwn^>FJ)=|$_ zl#p%-yzmYPyb&uZspND!>tc-YKeF z`2COIq0)z*hT1Y?x$zveS4(cp+6@_WN0*aI>7CB?(Gbc?QLzpk+?Anq(S~JFaQKo# z0zYbs*9i76CLJ&dU7NmWJd_G*7tMj&Tt;B~6%F$X}u2l`>C*Ur6Kq6sS zk4Ubl65LEr?+Jx!u}h`+i}|t$&IHnD1EJfIf~k|K6Q<0-kvsxrFvzKNB#fr)u4A0D zA00N&{7hwCRZ`_Q6Wj=(rTN&J0gpsd+>!TPN8FFBN-89d!%Kf0d$Kp#Fx36hyQI;3 z>8X7$-!QYh^P(%+(vBC8En2wpCDM8&ku@p0RC6n3l@Ull%MhmdZErIlzo*&WT_l%L zEJJ%bZfaN>pf`msd356$XK%-c2Dse{U4k5S=?o#~>K}lBYh1w1S>pzy2>msuZZYu& zNnHOcWR z@aX1WalV|spoV|Hv`3ic2TAwxdq2;)F}Dhw$J=D)bWBmL(5kh$zz*VbSj-W>5POh3 z&0gCVqt@Gx`Y05Z80cvd;k3FX(laxmO^G!Vu6}= z)y3+KBodDlWhjc1fE92N&y5z*wz*;nP2xV6pDTEfJdW&;WKA_d>MNY%)U=0AN1H<- zjveR6ANQSHB14u10cOMKP_0glG#X(Sdx@H0EK4FA#`~B%dj$Ic-u;c+yk6O|B{2}n z5JLKp3$u>W3ZIzEe(LQ_J7 z-@Mc8!l<@6{LO*(NNg{diDCK~Was7KFH)gmM@(TZlWXj9T{3-$3n%}hKs!U0?&|?( z`Of=jm59wLAcnI8uTY_&Qy0pTKrzlNXWYDM!M4s9PcPHY&s_o~&h8zkst#jWK!@Th z!*m&dTVUSbN9cEcn0%+_SXpI4?Ae^a9&JjiB|MsS10D^VbRZ_Z0FO#h^qlNRCjx{q zTl5`(j$qh~og*vdVp+UUDw|MvIbPxQFymG@H2(G2-i~2-GsccTZ+_H}N89fsLMFj^ zc;TPKbR0RBlZ?tSA-L&%T>mc#e=o9AL72Lvv<|zOUpk$9*MiETXWgCDwghhuz7h12 zxlr(XorGUW5;$W*M3xB+3Q_h}yaniq!;D2qDsCEODrL5OdEp}5t7U;+_PY96d@ACT z&=W~Fz2gE;omY&REsaa8xRgwF@l!H`yMK9KX{)?Qv-ZBsj}f`d>3CxjtdLNpf6C9| zlWvs~9C{~5A~WDbxji9ze8zTrJ0R3~R|n*NX6|Pq-x$>jV-r&ko(j{<;2nRA$Qght z3|1kOP+5`vE#jgix%x?M+_>38qZ!-B$sF8u>54r5a;{GSTsx;&EIL{&!DIJZ#6$DJ?DuxSY^^!?$GLc~Ilmff+pze*4dE6H5f*!iddG z#mFi_z1|)QXia@JYn6(Oo~14z+5iabvzdz*w%5fgGyw4wz7;I~v`-+>FZACEUwiHW zvcx4SOhGcj9b>^`B&T9?UQF5F{YyA`-uO_GRXoUxE6p;Z&dQ=<%5LR>!%@6?mGCNa z_C$u)nouYI5bobg<|9ltYWMVy4Xz%pBkt29|z5%^N!6d)Px zzyJcS`_#MegX+~yZd<*=QJAq+*IRM7{?>lE!x`R*12hYS0F$4lb~}f1_+(e6>bl{T zs@>A9W{eu59P5pu3XUqkiR%e%{4WYTzNnY1X|cfxiKwPBQ82`?2938jSu`YsB)ovSr~De3!4tCL>#`a`~rDCO}3FN}D( zM18IN#%YvUfhqMTbBU6=Vz`(CKVUK6+0RG?wq_`c2vw@ocNZFL&%d@a&((S(G*g!I zWgtU#_ssF&9}B^x)Cwqah-|k7B*AiR<50gM~(H0qNav0}1 z%&P%(i}Jw3!l2aKb$P%keK4iXWK$GrffoL>zgSGjz$EL5|LCC^2w$_D<^9z!s|;LQ zkD~Mar$Uh!$5=*#KQ>ReYiZ7Gzr0*kA zWb6b`2{ZPm^cF;>t@~b+cWIs$+31q)#8NB87f1zsYVoNKtq!feY;XZxxJ1Ey5aM9( zCRKYw0D`=-EmFh)dR8?*h^KBoly3LV2R02>rFuv83}vGi6Msu>r=x zW7k`}MaFnQ9#kbH#&`>Hyu;1&nGRYoJK&qrHYY3dABCI`j4WEOwoZT)Iwo}$(}qei z@xH~b$p*#k6Uq=&rwBLZg-Qf^fyUAUD5s1mM8+0=BSQ#A3EyCEsKoP$JOgy|4Sahh zLeap?(S`~|wEYB;vLW5&s_{bO;a?Z zB+44oEO~?qcqW6+&?Bi}Rv9bIwYIv4b?g@gJOQ+Y>O?CNlxRsbWt#GKb!E)(V;1qM zWR;Ry1zTuM`r81r!-HLx5)acusL~|&JLI3dOXjY8575RK^s6AQLDA z!U*=R-fo}})t3Fo1-xfR?Y)xMZ}wqsq>x8j26qoz9HBm0H&X4Q0v0tfc!aXhw&crl z9(eELv04%07^N!`oJd?iAbXFvjSWG{jy^A90_$J9P~s~kQHAxvp18UlMjUKbYAObP z_%}ERJ?Q53IFUp8kYl+`{{Zch)-l_@_j5X}v;WeeUld(AbV}v}r$rS!(0KzZ!clf4 zZH42g$l5}rIh%Uf+|C~cVA^PpjcGR8Er90fp;X3+3TeWb6Iae@4kDYCjK6kI4~mS5 zPNrO|_xyMbVr8Z;QID8w8z%;51{N`@98Bj*K$|}=>a}zfPyyaX;OXe zwK-r~-bML=9swgwzITFf3;(b$)Kh|#Yf{#h!@A5fa`ZnI5Ve%Df6H>eKb^&tz z8faCk{6tROr-^oJ$ku`5TZU4MXWpT}+HIY191xdzxgMtO2^3b_N$%OmAJ?-7-rPqy zvG@8z_M`hfB|4q{fe2-mKpo6p$xr2U0>;g0TJbS+64|{OKA|ZHlXBR$frC`{aDr>* zR{k-259R+%X*haaaUq&mbo?KiBKAe@_fSr27WUhvEx<&zz~46J5%4%AnFBkh zusJEOJv+@Vr(@3!Hxo8mN;}V zh+A@PuNIzt?NJehdwCP35$b<7vX!bNVp>DJ;GYW=oVnp6o5V4buzQ*_d0pw($02)c z14f>`A_`=MH`_W2E44HCsP5VshpD456VS-}8kEk86H8_DT}m;FL#|7Ue9R4Yca#G8 z&U(b?plqTg4Jz=5G|v-5ELSBa(FRojn9RM;NnV`7eVa$0iSFpZ_x7um)*+s(B8M`w zqUt-dZNoZc=55y?`jf59!W-5N)(GrupHZ$IS>TJ&!wL`SQJsnVw6K8e>P+gE4k)euo@h(66@6Gy$QfCSase>nHa=d`fnY zX7;?{3YbFvJdIiNy7s$$Po#hk@l7skaxi$vU}sD*$uO3{jM4*R{4&LQcMve?g<`ioRdQ&V&p_YJevjmUW z_*T=)5~i$5rud-(aRU%Tb|@B>H=CYyf9K!CpxoahPE|~bK+y#Jx_iyhlNpbpOv#&z zDJXwt#fk7jtYk@7KOATsZ5w}|o+V5*oML%E`nH*ZyOc`NlqV3?IbZ!1yVu!kJPNsa z6m!t);Xy;Agh^7w(rxJ|8YtI#sGE@*a3mLa`&QYQb^4tmi>QFG2r9A#5LGAv{Jp*E zNfhIn!_(*6=8hF+LMd9o9C`e+g`-pP+cx|wXS6gWF?g!9CUfUfUlk25w|!GxuV^UH zN-=!!hgfsr@s+gAKW73Jl1RF7g2*J7wEw)g9US-;ces1fLg4hbbOn7cC-FA_$?JVA z!$%}Mj7rxN_&|Vvux-TGnGO>oAXk(~@bniP0pv@1TW*#BGEvR}AqC1Hs5;*MPK=DN zdtl?dax}-=cOxM}&dJm>!|Phi1r1_H#cb{{*q{^bmqzo`qo0jgk%M52{&Z%sPU__r64 zsoWyY(742Ms3mJ@=f%W7!DJPw1v=*sFSqv;3O8`f-cIN(bMY%6wh$a7&{XNIc6$!T zj+Xd0!u%5ktmLFIKUnW{`@|jtFwUhV&aq0Y?9-?)b3%_N`f(uw^*b+t zaTq(b9FlJ2=)&l!SE~bw{RS4w11HHj@gmbkjS#l_h!;KVmDcT!p!6u#0*NRHPiY78` zyLc@^z01@^bHX$fvK_8*JS@-nkmAhBRuD8wd}(8E-ewYQh_r^_${Dq{9-ue zIwlYFO2v<5i5qlXIiU!ds^qBFs#RNmejz)DCEz^={{`tr0_AC0k`4(vmAhCcsDgy6 zJLw%Y=EQ1e+p-VG1rVb4`Hs2Gd)H&$ z6O08L1Pop4nG?5p?2m}30R&mG#Z7R$WEvG%p?7~N_=7+WEWnRR z#$vhczBwE&Sr#L#0G9s?Pf?@d#Im$F;2q%t)k~H!YaQuB{AJkn`z@{Q{pCf5Y}aQJ zN0-Rmx3h>}P#>o;5;iucJhCv$pFIiEmCt)M%Y7|K_r;Xbf##y#MyW$y4r$hbwHd;N{a46O_pwsJR+;4{_wj-plv^#oI(`h@a z({1FqDmG>^usfnK`1l~o{dT2&>jFlScT+T? z1nt7d5}zT=Bg7*$U7(w9s^nDG{vZ6|nX=hmQ=Fy%RY|IBwY+$V(GsLNK~n@pzOr1< zlBW5ur!ji67)+t>WM(=VF01ES|2~vhG%f=6_+Ma8LObSLnI%`LbDD95Mll_99;YWg zJCtqKpO(RQm{vYEQTh?47X7Wl!>ccnui4u&)M%8f&PMOAp?f~4%*WJl->4|10|$4W zoQ8`h$}em`^3CT>!GN^_v~%Pwaa#^ChsrjDtwdDjvGm8D?X=LS@ZI@p zZuP0VSX-hOW#5H{2m0-#w1RO*|5!wBx#9#`?wC9uB&%^HQY}jrcIbWKT>dFeiclU9B9qzxi z{ZjQRd36^_dBTx-jN|$w*^r_K)PAap7*%F(m^9`#nh#BA=0DVq+#EyTq?zNPj>S^p zj}6~Nnu<|13Z+$4<#g3_`|ewSH>$R{<=cYI(zJg#62ed%Mr0vT$AAq}@7VWa|JjZ2 ziz?qDjPSsH_SK;e$V(z8Fcj$(A(Lux#y~+I?zV;4zjp4f276)9?ByicGo1dg0ntP{ z4(OrN#XJW2_0PWUecdtm(P4|79>4wlOkdP)=bu#=-YRQX8gf~NS@vI%00Yxtzv9DW zPy1Nh`NibKxF7X);4dAdt2Ph-Qv)zP9g>V49z_MPxeB zuTY4Fgg+itxl$d%NG@dqC(&h?x|U8gbJ=!R`ll-!`135!E8LI!6Vg|We$MfP$sG@- zn&TI^u-FX4)Ve0!ghew(Ul=uq*dUxi2SCEE>fB!M)q=nCMM8DP-C~@|nnefBvRfm# zirYdxQNQDyDZN@G(UjWPSIokj&FWO3Y#dG|yw*HX4D+8nsM54s<&EHEUqS6o9Tc_# zR@tS%+qV0xmFj@oTbW3{dbLWaw$Xfwat>cZJ>GbuFZ0EC~%RWd=9hYS+J{Vnjv^YAGjzL2*)_&Cu7`r-fR z>>YzdX_|HIv2EM7ZQHZPwmoZX+qR80wr$(Cb=KYyU&OQHJh8tMZ%6;==;&Wn*_ByY zdFNF^3@6V4rD(Q@7hE_?yj9z&x#aTN4fu&ec>x{xNz9R43@U!xAO9yzZV2eiv|fAK zk*FOl3MQX0ui1APWHye%K| zjug{DM60B1b-Xw7OY|l~A#51lI~M=*NocK9zRt3JSjntv;ZUgW1N=J--!og}ejnin zxoV&Xs=en6T5JdKez4kec^Eib2wG|Ir-iOu>MF{$Ih*cAv)}#&2(x3P#r~jJTD7*% z@X>K)(CW1YpE2-(Ux$??TN7T}q_`P^{wPl1r+@wfAGAs8N0B=7IQYl?^Pb($Q=8q| zuuq0!SVqI}tCyYKeIG?PJ)1;9D;bMvDj}>Syw7eyHeNpxYRia@9z!6 zRtRgepMyX_1BOZ&M^Z7y@Jf;$1D>f7cG~ZF9}3(A=*+%4nAX9&7KF6_|Bxe@$GY1_s+=rvO4PhA<&X4(AnX}kzx`H9mNzmNz?K3 z{veb%x>vzMN&Aiy9dYo^;pA^?d2c$;R2wu@*svjJ7$0B^^uhwK!Uoz_zNoq__J?>C z*>;U{_RDpo&0f1|X~qAtNz^tW{Rm#qSHXN~jm1(xORGR_ltfV{>nlxe7`QyM^w@04 z_I8zrA)gYd9rIDl6V{x1;v{v7I$Mu*q=?m`itF%Da6CDLg=K>|&i^0!$*xgY5l4Tlz>Z9zYrg48KXr6~1dTwFCZ(ik}yZ?@UfQ>b|4zHWQH z+qgIYDipv)nU6lR7vS+rCbarb;<}Ow04RN{rq47$k27WQZN7vgP~%H5h^{8!xUpl0 z#<=HJPo*&5(G}Fw5L@$w)(EDXrrdWNK9L)1Jokh>vN^-(zl5?gWNU79!m!6+xe$3U zI0)Pz)Iz`Kg^_0!RJm-mIzQ5-ChENx8xFWy9(eb!;Fx7@+<~b@#zq zn#XXtS~;Tc<~Q1fsuuX!4Pf+8IkHH0#ykR=DuE|Sr>NekgJw~C9jXf}SsnIW~ z62zt_Pfb;6Rcqut@LcatLA2!(X!-EFa09!39&~!p4N4t<6 z8#xn&n&%13pTwXDCkT>4wzg39yKe8e-;Jw68D~(dU&e3=5n)O3{#r&#i)QBs8)0Q{ z11z?8zaLy>zY?wjvg=bwxWZw91}39%Za@{~j5PslRCCrx`iuE^j-`ez-29MdwF%xLudAYooO`dl0kv<6@kaubB6Ha706)VW~N7aAe*!bBkH2#Pf*C4 zAq9B%rrFS@Yt6L}hz3Wtq?^_QH*sek<%dwb5Wi2cP9HqF_#g^`Nb>a;^Oh{1u&LCr z)PdKVNWN2he8T78t)cou(#~I=jYr@HRTS(H`0904b|hR_2SuHpv<|cG~y9tO1-Pk3OHd2T|SZ!n*E5idnKj z>`_WuD1_@8ICF9j$FfEfE#f9|S(?~Z#Wi4n*SdrDM-HFZqn@Lln-KB>X*crYD_uZr z(9Gtsk~&TS$dC)&VS<4Zzz|xFTQdApuBJS0?4@ia{gd!Y1=Ll&{vOe8bBtQz*dK`n zn+Ix)URG4paE1-Ij|uEv4XhRPB6lyAVWhd?EL3+B_gdf$S5zb;zCvnkzCS3DQ5Z)u^b$4-_96BY zQ5OW3;@tGS(IoloOY;wG0TFUUUQ{_iIcND?vkBmhfy0RdzmE>DXWDkeHvH))LzWAP6uFcAs1!3ZDpS&3M$mmP=ujJeU0Ll zezmyg_WglsmyDm!#DZ5*@eDFjJ5bRsA<6;>HYRWvFwF)G(@@O0O|hQ}6hER>xqB!* z>IVK6`Ud`JkoIMDneRZ&(j;t~c*+##S zmYn`0q0kvj5?<#A8pv{SvB@WJV-{;Lfkq3>!Zt0m`8cqz#Ff{~Tk^Ih2>r?N@D*{$ zDaXdFs#;KVtM@dw-P`g-?CUskLwMvtkwpX2!orC@T{8qiA1P&0Iy!I_Jd#wtOv(7lk8Y7x?r;Fh zwF#F-QhMZ0Z5DRVe!DnuRoTJBH=!D1>JoYVtJty!p z2ojBNz*XgC0Nz>LGZ<$w`C{-qd{Fmeqb0AEUM`BtHN~21%S)O7$1>GLDIfe99-QeI zI zeF7!Hczq@WnReyx-~Dnt`xv?o$$tpAY;Mc)5RK9574x-dsguw$lF5=){hKx07O(W1?&n#7H!R$44xKn& zNQSBpApCry+D7Ch*~VR94Jqnm3?ZM%aKsT6XpW;L3|EIQT`IcvgM5b0+&291>D?VU zU6QT-QdbRrb80bQ5aqCuto=>`ux4!j~q@8g%+I#%cTK3`^eR0kndb^bE-z(Xxa}9oZ!fx`^?G zD(L1qlq*UOI6@>T0cYf_I>h6bSIxtr07*1btq%mwN#KX!3DODIGz9l_MET;YY72qRrb_AG`gH4(L z?-*B+O++)2xB6L3=aUo>CA@fMR(*38w#9AwrbFGXGP@*e=$yn*a>S$`qg(=o1!605 z!;UMZQ;mxAfn$+2(d%C*IT8-q`XuF%uG%>Zj~z z;ma7w?^!F%cR2HDlyaYGv{$lXu59?1gq2IBM5jC5Hu*lGElS#88?*N{obIbriq`}5 zYzK-p&eL3luF7`lB4mjSY&pV5b8*0^Jlf4Zq4{Esf?a}5qPn_W>CSyJwJuT}`tVt! zSu&6B%=v2OqT&-T)rPji?AMv>YOn)=)}9|Sg{ui} zF0|I2-OBB&I`dd%x9jc@Y!K+cTg`0>gW@xY=U0<1iDF1a<$8R$`Aw3*1==Eop|jFy z>C!BOHAVZe5XmPsKj8G410+z;#zc&>Y*eH^r{tL4X5RvuYS;YEE)Ie-`~?va*j@rw z0_SX~EDXvnN0Fo0zr`3WQgKFd_GBhUF8{6_fN4$~G11xK>Py%OGht?lww*^roe=Uk z)rOuyX_v^3Dl=q=7dv|Z=NYCA-_~4I>oV`C6YX5>Oj{*X>qhq-W6^3Bkj~&gzRRWP z`be;Ly$1OTEqE6aKzq@GVoRl^u9T-<8FnIeUse*n2I`+k?&wv&wEkaf)0wp7p#2!{*de2b=xP;`H7T?L#8~M zYNoXgsia-W{W$mm-T;01noKYi ze#K+Dc)Kgzy1n1!lJvDar!Jn2F-5bnU8ic8^BK$i4KCE@{4b44Ihppz9D*efUY5;5IlXjrPqO{qiJaXdBZho^ z6uGlA>~p#46Iq?vZeEx#4lvkH>jRg(ZaiM-@&azwZ0)ivpoW`@7~ltvI9YC-E1a!4 z>FmC9G9Zjr(^+kOP$n@_DQQKByp6_VNQ%E=POl@(qeWapB$47($Wp@s*n@lixEht2o1PBa6evh$h>)g4_A~DvHn=OM(dZ_Wq)Z}7qEf|w zrs5a4i)sbP5GxmzpM>WqM-CD-D{GAg&L`!1n^l43ZrcT!y50a7 zd7V3W7}m>(W7zu&eE{;F-A(q`jkR0!tm#{W?uPtC0_%0LXJf_%ixY?PhV4f2VWj6E zZc`|T1!Fk?XT;+$ucoeaR$JlB6aX%pYd%>_Qry|q(#|J^F9MLwCpl_^U7UVRz`3PC zj4VAdMkP5xvh<#vHqo-LQ`IA49mb@jl&hih161>aBOEOW5CZ@hgbhNMZy?cq=v1_wADJikwrYJe4e=P_dht#p58b5oa9kB@{J6+Z##xA3l4p+a*beZqNm zeR`CDABG0@21{8Kz<{P~0JMG1KG2>-(+87FECwk;a%0;gpygIKgkd9KpH81izd!)2 zzd8m}@UJnQwICV|k+Pp$G!v4usgt5vTguB0!Qa=Py)Qw2Kk1+#(NE6g!rSS_2j0VmSl%|=P296jPWDO?_sn0`w+2hj3jvEhmXfwA&oP*>k$(28UpWC$-+rM@FZTHaOu^BXi@hsEq|EtJ}HR zW3+UCrL7K~=vT$mrMOVnL0B03XM#EFTauv4zfjVS_g8;thz(C2HMNfAubGAoJ3iAI z!OM^vY|~VNuBEEUpsGovY9uRHXb!R5PQI|rs!f7d2KZlWdUXTj(o_h2Ql>18jG*kt+d}4k@3_)g!&)(Mbzb-Dqm2c9Qf0L4?iL~x3WJw(ykH}UArHjC?^zISL~1dW}lxCE)6d0E))lWm_TxVnR^v> zz5&od_yOIQiS+B}ilOe;nal6@fn4mYJywxkgajDijeZ_clBO*7c*Fq$uWq-VOW?dB zy;q$=GkCR4+UJ<}FJS$1wIAC-%A=UVT04;6*})td`b=V}Qm`nPNU@2ry$)qWm*VkI zYq3gTG0X^uowmO$qg&ExcDb%HBLiouV{|iDq&)7(VE|C_p#931o8k&4fnXcIqzcMB5kM`b~D zX9Bzw-m~?spg4ssqw6s*X`YF2EN{x%in?iLs%yN$S7$2uO`SaGkpYGA4?U&gFhY58 zKHBB)xG-UJ@wCQg4pIG$oq~?w9g3?&#@b#42Cf77{Je2O1Kr44OIWD4y;8`m_}7$8 znRA#}1IX4}jYyDTW)uJ%1>=(O00$X3occmd*iKk#d&G!|6}NqyBAjrhpM&!SKGfi= zPnbPTp`f(k3Ik%9NGAPonKv#Bt}3h^aU(yaI61B5n%8`s)gqyb~l^##?Y4NVHX zVXG&uHrojJASc`0&ZNY8dcos*H-F3et;S&~H2tpAi&#zbo8ExTB{+F^6~zBhQFeOT zeop1C=-g$vn|k*lQ&0d{6fl)yr)4xDK(a)o$e6Ugu!HOOu7-eVl*;Wtn#K$9NTXkz=wpZQOq)?3pYDm22@sLC}9a zu^V4^FH2ku+aPa;6k`CqQtAMTXj`7I<3u>gJ|E!+Ne(&SLh;1(+Qj{8(dmg2cNcYk z--;Xz6gZFlByX`k=zPx~`Wg9%{(`y;J)`iKm7*g}c3YI-k^NkyfgWX^giQ8)%XpvM ze%q5aI;2ovyX)Is!b~Xjg<0hq7vH;`|5h0?KODZ$cK17*UQeIyBLcBPLpvb*6?1d`^_=Cl8J~F#$WdO@pKc5N5CNEdsG^Kf6e94WckbW?JmB2umogoLM7 zx1H)c+Jf~YUC76j&%HnGfa=bmy5go(`UGu=e|5mOk+^-B7NSgBrnuQ*@EBOKEkX!# zJL%DZ5(8v9#zu^y(;Q9kCbNu7d!NLkiKB3{=iY5C9d8=q+RDE2C#d$pem<38r4UF0 zT7n6N2XIv5J@t)^E#L_1F*cq`66dAERXWjGQst_6B81Q@-QYiWx+&zdkz8}$J4SW6 zHyn01H2hjhlJV$nOUCO+{vZ@miyeiBivgoa=zT%~kXXMUN}=BUTR+{U2N)|xNjI|d z<$)ioq66bT4Sjb!4Cqg%8!X4!U_U;dl#`{q=FL@)u-5GNPmj|b)g$P@z2zxS|;^@d1=S9hm5tjgIt{E-*a*Jl9` zltL_pfVlxkb}}s`*pcm1@R4b^+R2WI2D|xh$GrlG^QbGCQ?7!;LXW;~!-c) zI?ss)kV*U>kxXox0<<#YS|BGyV|<%1rjfG1bXVS{hmlo$T%0{E6?yUsdt=y^;y2lJ z67M(w@sF~>x?+@7K@wM|>5tC*=CjP?7?qcOS=@2~O9h=eO~?X@)}Aju&aqV%5D9fP zF1ZJPez4&NLd}F*=+-M&b9l3_))>)>HMLFc7ls{?v63NJ2<3XW%%rj}V5pRF@^0Xo z_@+y(tGdP3VMI%ogvJzr_&JEXI5bc?f?mn1ORcobc~ee#0JU;T5Y z3+2SyqCqB;I3IWu(8cCprYf=hr}>RjiTU{kn*iZ>Sb zLEE{p)-Sm3nwd|R#Ch=dtFV~z=f*3Q(V<>g0MBMh$qYhJV-87B$4B>INW?PCj`T_H zc$OXf^i4)G{N{IduobzMPp3=ZPQ;_G(CijXt_e1>^zDoL47M^)(Z2fsV4V5Z85@yonU ziUyABHf-#k+`eEp2}Uvbt1+_P^HO{R5|xhY<3Y2lkNZECaFS7884qEwUwI=0>65l( zqj7{a7{6{D3y?Gbvj(+N^uwD^ad%N*-F6S5ae1>tL1^>ndZe~43ohgI%r}hIV9h~C zr&9;JniAi!%sNIHhC;s~a|3*QZhQ6!b|8U~ERSL&Sb*iVx~?P%H8x0n)ITi9T&nWa zpcBGQ2N!7r%;SD#?=R^UA-R)ICM{@o4FUUw_^;4yBLzq+-7x2nx~K?w*utI?w7;}w zp*RN?t}WB7m_E}gd!edQCMBp(-$!0FLP5{vNr|5`itGKx=Yzy@z-_ETuLMBE2Vzanu7gDfYzKD$$0W66NZW;IOb#y+Be2vpcXPWHt~tu@PLSz34Rl$ zx1uA~!WTPL!Fza&mK~Hnuxt9<(s8fQ`v} z0FUKkS*AW&^4s(#2 zGNWpUN)zBl?_p?Pteobxhef#o$7ZZ0NY2tUAnc-RY4D zIlTQ#=^V>{kY8ZqVEAWx;kVL^JhC9lHZ6Zu9T7tGpaiBJLOrQ@0bxc601~WF_--s7 z!^E{Scf%zex3a|@K>}4MV~dgi&^@zZ85T0HK!ye~X9gA>nHX{{**m;*JsFp_sGV+i z=cL!o$F|qQ-7f>ek%v!zI$x&^(I3QIj)Git$=g#+q6&!yW!=hzMmWeU)hTVdP*vsK z_x5*XdkxiKo3_K3zzt#1C7cuUin_Z&UF_Io=EIncy;iB3(Z0K1jBaW2_mtn!Fsek$ zQZ9L@f}-HvaYW03!yzFdJZ$aS&cud9q!PWp5v$x}WasdR6oGMM!pLz1AXnL4dAOFd zD5}c~Gsob#5&>8td2AA4bBA{@@bDd|w1>;GL&S`fs9<5@j4JGqiCpaF!vY|yen^HW z3^am)1Ui-AU@YK>!!%$Jz(Xjk+UchN7717hgo$Q1fI7sz3@$17#+YJ93yf_9>7xV! z?EbY+Fc1VwHE57=&ajQF470#hO3THw1jb+7oJ2&hz(50o%V(hiVyg;65DO+MA>sGL zK@9UrzUNQ9K@sNTRD&M6A5>A&V$WEswkkh3A}lbh2{%g*s=iN%eG0IDY={9iAa`4l zU8DLKrAJ|gIl*VRb5b;a7g|(agZ|tKvt>}$akX@Ph?~mIWGs46xi?paJWs>%oZ)ov zqD61FExN7IKh^Er&*7QX5V0mX*vzI%pFNF*ix4rsQGGoVe~I)^)XudhocqYLXH7uI z=5!=DpB;~z8}eZ0FqZDC-nFfsF9tA^e=SV=|f)Fx)39Ke|wcenEkCS!(i|zj>KoTYfmj3~B$yTwjM?S&Sean!&{S%HmRkcoJ zvrrO@MS(dFGM^H%o>n-FVa;$R^_&&Xia~0DHD`9c$;>bMlpQ!kc5~A)$oSe{cuV_5mH) zifVSfp`ApZGBI>iMCEn`SFM2uu4m-ySI2)?Ppyoomew1Aq)8+BdbYb#4p~1{&)#GG z=_q|K1tMwwo2?tG8(nYA><{W2VryP*5%Cx#1ia+2%Wcga-#)Lq!`8cA&3=%YnQ6_K zQh79%l3MXy3NE!s2y=qkQmL#gNuoyQou<9l8_`~r9-(?-~_(!E>dzs)?xw`X*1l8(4JwI z5;9T(w}^@~gbR*FU?pU9KoP|?E;;3|5=81|5zZRby&@%|mE@75w%_GaF8xu}ZUwMM}>izhP?#jSXenvhwimhCA+y_&&K+BbO}O?&dU?3d`)C zBxyxQi!X8}cYiXW!1sPwVRIr!bcCh8-H-*{DHBML6bZCMVpW`$N5xu*I7iuxxf_tj zgr5mTM+J>VH_0F+C~q)zt%OVsJqx(Y$<7Xp)yHqHq@zhfb; zYFpDjRjhK!?5TFJ!~t71O6extFjo1i&u06Nm)S#<2ptHU$wyE9dXwqEE0o5j&WD;( zxadlWV*mlpJ{Ymn>#f>T@~B=?u>f4|NlCNCB6@`TvVz;H(uA}bRPYbF5TQt7l zn=a1eo2k;vy1ozA5w?dafHh(@$D+H{r_Q&C**o3Sf%(~y9hNCj1*5`iDR3@G1f4Cjli?z#R zj943k*NN^##Jz-!afSoHg2kp1RnT(yBT-n9JSSddj>U`=**)dsm@+b1hxz$j*U?kh zF&4eVT?W=(i~&-Tq)SHmx_A4?10mNN$0_i(&Zs`iz90SvC~b`PW)=vx#MBE})NXu1 zi7Q)F@P_pVi<%kZ5=*-ft|Qx!T46AvsGdhBrZ=rNZo-dypY3^x%|Ld2T{xP}&M0pU zo_z0ebh3ZwsM~5KeI`3Q$6|(MCF5AbIqkP?5+=5MsxFpKDy8?yt>duzrR6iG&*&Z? zeNgYp`px6C!4z(VXP^;&>V4i)<=q)CRw~~3uD;7zJy5+Pym4XXiIgoQ?=HBn6{dgs zWD}xg-+4&~ZO_u^loDro1synK#_#H&Jw|UbkGB{EvZq9Ga#wo8Lj@g-{@trv(EjP? zGn(XBkM#F#jy6G8!>ilFs`!C-CEiNcONt^ zL=<+4Y$~=8D@QKx#aLAelXh^>;QEbkzAl#Wsw%`ZtBW~-m)T#viEf)cbh=v89yGkl zrr_~dj2|+BxZ=+BHe#7-nNHrMju@4Y8DOJeL`uOY3A-q+3|`~;Zu0MUJ~=XDT87s; zzwK6S8KiMCnK8^7-(`hJ5r#Vp+r+7;BAnzHsOz7@m;r2Atgl!gQ56cPQBo7YzNTS~ zq5!PmTR`)WVK=y}f;|ZywVx|tR^6x`JE~0)aVR3Ms3X5tC5?RH9>1*oByrvs+Mom0 z-rA4{{Mt9Jej!si*C#b-q*!nt7u14z_CRdo^*C56+F$R_4^rgerB0CmRkW$SBv7`R zwk9`~XH*D;TIMuGIDLe+K*V~aeDU=Vu&pWW?3=ehV5z_{Yv7H@_KF;SwE|~r)J?2A ziPW%QRIxxuSq6Gh&L`YUEO zH!3WIi~I>qSxqHAmUy2sDLGLZ#&JshLfz53y1M1+BEW#MB&}EFkL_y6*WmNg1c5i@ zYo94{IAB>l&rr<+a>$&wuoz;pWo=>;g4XCg&cn7^YO1P1xRQpPY8OWQ0f6}Rw||4> zUDKa@XivgbuG1*eVWlDLJ+sr}w|?n<&1wG!a`bJE-zJBaJ4&ZeoiV1?JbErlWL3b@ ziCcI*#*Ze)eN(tMMP{G*FE`!{9Oqb6xG5>eDer!~tBa6E49K{ef5v!%-<;ZYujz9^ z1o5Ln#0n!z8MHM@X47N|7=*KDur@9t~7RQhHRW1 z*^>Q4S}xG%g{t(0QYZF^Q~Af+)j_Aadm%dv0CMl^5iDdJHFrcyX`F%cCCJegKrcp$7gXn)nAI z_O=SkUdVkn> zxiH!auMObUc`tDXi#~{+x5LZdym%&QA>H3xp94Gr@yn@2PQ_s3=rm{F74GK?7}mc8 z36-X0B2v5Ybr8e$kFOX%h}e)FxA@hmf>D$mXFp7}E31sy^sZ;84paCZ?|*A#m~yFM zdL2Widhga+x{Ofc^?=+^*tDt9`7_3ytHSvW&}(C(_%Flt4`A>Avu1~x^M7nSjEwaS z4D^kS4^AYr-@!>Baisu z6KQ~f2kZn9-lFkEd=LQQEd>G?WyAcF9i0`iNC+hPLZ{r!srjBG6xO&tw$0_+SW#Vl$GY5wdc#(zTSz^9&Ldm6Y_0 zYxQ(>Yf{s+t5WrnY)i`v6>>Ba@)44>vb0oEG75H6a@7lVQ`0gl0Pg(pf*hx3XenqV zX_aoL_dkA9ZYguBq0mjoPu$d0 znNxmFeT^s=bToG5cSIH%SWFnVg>UixMmDp*MWz3?=!v^(ePnUvq(ggnNV;#1s&89zBo` zZJZ5sL4GUDF8xfdM6xNizx6%zJ{;r^nv*0cX}8w4)>igRZ=6}7M2brLm2ZrF{!a8s zIvpv~HJbI1<2SA%4En65x$o#2twj~Zqwlq^kHGlb>orO?(y&n+C9`ube@?@kfdaZl zpn7(7d0C5|CEPI6o{eTm2+&vL^l?Iv@-h{AFJ%@PHi*PS#XcKq{C;*U1WZ(s=liyf z91ELAN1L94kdxxI$biyS8w+7toVa232wuAX+H8idYwmV7jAkfk`qU345+>0}T942Gl4G3(N-uSW298wL#tUgu`EfQlV|=Y@?2M)1R7`DFD@t43Pw-|s0FZyP&3^zp z|DTr~CKk?rF53U!vV#Kg>>BHMzXazB4avw-#{wFj{uyWbN;vQ+obndRF>w>L<7=X^ z<*RF$Y@)A!iU<;){YlWE3Ls+X7Zxh?-#@iuJDBJ2^jjNfF=@FdRQDTYxu^#eVKQj> zk!ZRAA`2#1p3b?z6ef&JRFn*$_YQx`?;TCLN8XR_1&clK9WP&|uoSmNHRn_(2))y% zjNPT1CGF*uwi>VBZWqVfs5t%bWH_gMv%Yy|hA&0ek~oQL+-PdkR2SC(eROc$!xsEm zCEjjn!_OVwL>)Nj4=i4I(~>;DczHH&+MXRJKuwd2RGP5A&;bE#cC@_yZ8ZOpJ^Igl zUIK@3M_O;ZRqw2o^l$M-u9gHWtPPIoxE{MpXm;l~0r?wAPbw^*{bdmfzCdLlVwmA` zzeeod(VK`K z`pE5kkW4;+U*NWJ__y);Pcjb7EdTEGA|al`Azl_;pIxFE{yM!h^a*duI0Ky*C$I~6 z%nzal+JyF5WJ)w-~#NHIe*rT`&DD@RKuEvslhF+;6* zD?KTz>h~%DFT{Crf|it0ghu&#Tv~*71gJBr0YS2knTCO>`ODY&_NyZPt-MYk)vn-pW9?rP9|+>YiEm?v)V(d>zAyX zmyQ=MxZayLTl!A&!awcHoVEtdPwM?wc|DyuyN=sXLLjuj`MEy}aPiePXucSn2h!lZJ z0Aqs?1_d4p;zuE(c7}87w*bX(I)n_xbdl-& z-d>t(#$Ir11m#eGi;O1OA4nN!vY;awt2mA5bQuofG(hxPT4u1#B(q^=$|hqq1`A{T zG%8vUeTjAbbSM&O2ARGEL#7;{{&ISlu-l|8%=5r$3QsUoh9$}=oGEbT$nKL6LD4hR zL;s#oAGFV|m#9lfAx3B)z;W(d=(NMK8(JrYVC)eb8I%m>lk^0r2Ot`BclcyghDkt3 z+}oj~J_Z&QGV^25I6zJoRXKgSceu{Zpkn>f(S3j%eSE)Qbs49$Lf)J-ki(`~1wA0h z>+}(XOEWwOYWO?bT!`q!M3aJ@nZfW1l?Bm*!EWTx9v1wp(y6f`giaj?Sfd4LMi34L<_S(ht% z+#hQcrQitu2d>;7MUK|J&jo-d6j((v*6!wr*a0-OnTMl`-Y+#yT+=mP7Cvj7TN^iz z3q23hd%}*X*J!cXf3?a_*IQbmf$6*HRLmZ#j0u6XXFTsx<}RYAzZu#xdv6Ycva>I5 zCS={A%rbA;%)wfbl*THj4RT<>S2hYe494Bfyd1M*9BJZj;@mCmq)fOv#tuTA?cH+4 zE9B_q@uzp8>+k%r6r=kXL@6rz&ogMVw-;8jxW4X`v39OW5?NxJ(pWI$@3%gTWzO+Q zO|&KE{DKp(1;2cpv$tTx+_LEd=bp`(${y|RKgNn9pauEW)*6b1?kK%n`L>_;_zy?= zQO^fvIl2~2ic>%$WC)wKrLbI>O@hXCya|8et48;7I#b^8kxYS`!J2ZDgloyK4T@zFy~m zth0j6w%%dO_G@y6)e{S@c9|}?JVx@Q)qc_z7g_4>TZI@( zMchKKWoH3(@T7X}KUOj$6~ccOYzWCB2{j<;XULtYGe_nL@JlYp&-6Ul)-TCoUlOgG z=GKNKYMtVq8mIB{2v!prgR7}Yask}hlm03T<}W}JV-`O7I?`EIM@8964<6;)52iHR z$tH{jH?Ih~3`lQ6M?3noXpL;BtG<9PNbt$@c4Sts7EZbFX;!OK9b8ar^2c1*z1(Gn zfqO?Aw3jDBd`k|p&C)~lVb!p>5QOAAxP zxB77WNv46_7rh=&e^D%xyHpsh8lQkkgIc}5QoyO^DYJX zyL?>rgrf_S#5pMAdV_8>Vdt7d)*eNZU+Vpg^TR4`r_n16BX&XiIqlaEbOM_>d8bFa z+{ncV<PF3UZwCY#t)FlUsf_w28SLm+$m~yN;tA8S$U5^gCa@`3P%8Akb|Sifg%Sr zW}&7tp|JVB*u+Eyoww)f?aK=g4$4<4(~6X_QRU{I?NL4LSi<|uC+Ev28DyI^C2tsF z5+lg5450b4j6THeDn03F-}wjF?XK?3PHxffK9_%e!=U=2R{He1O=R3B&svG+N$yxb zsBuO%_Q*aMA%4YZ3d|2{KVB3Uj7QhX2sN79d7G-3#wR8=1pCU6;aUGqzc62a0E^2@ z(;a6K{(Tf_Sd?}o6zb_XThv!Gz#}NxATwEOJUEG+j*uiTmI zEm{QwGXnqjGB*d0_r}J}3n;uPVn-d5tB`E{fJ0S4w)M#LE!riC99Sk)sYX7`7g_vD z-Gj>|R(ma&rn%6uF4UUc7W~&1a~Q96sLbt3h_&)5ZB6DMPF+Aa@iEzoOh^+OGq?LWOs7#dM!;^(Tkm-Nemr&XbNS>swicNx{75@q55>qVP*6I>!!E^OpPI{F}qPm(#9j$R|~{i0FMqr&*23E+=(+$4>KvQA5!~L|)rO zrp_41rp+{yhXf(Q}eJr_m(P5 zGxzbpcH&r@vQbK5u@ZtLkifXuH1`-P>ym`kR$k(ikF(ae$o>r0+Iq%;t5cdNz1D^s zNBs3cIkCW4E|=W?1C+C`7x*ucB;!BGKK~s`YABhQ(kt27ITQR>nna0S($>_D;J>Q; z|2~Rn^B9;i8!@mk|2<+iFk#gd`{J$x*?t zluD2WK%2Nfbz2lGM>Kmpb#j<-e+hZ+S+3`CZ$ZAJQb>sIpI*!XD{2WQ$aAO-2}Igq z-Q3i2YgCOUaExg63o7Z-)^Alsh#PZ*>aI*xMH6g>D+WWP8z%lVB+urhmN_tZjnrhQ0JZ=q$efw+%Qs8#p? + +Gnuplot +Produced by GNUPLOT 5.0 patchlevel 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -5000 + + + + + 0 + + + + + 5000 + + + + + 10000 + + + + + 15000 + + + + + 20000 + + + + + 25000 + + + + + 30000 + + + + + 0 + + + + + 1 + + + + + 2 + + + + + 3 + + + + + 4 + + + + + 5 + + + + + + + + + principle amount left ($) + + + + + time (years) + + + + + gnuplot_plot_1a + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/lecture_07/lecture_07_files/lecture_07_22_1.svg b/lecture_07/lecture_07_files/lecture_07_22_1.svg new file mode 100644 index 0000000..502c4c4 --- /dev/null +++ b/lecture_07/lecture_07_files/lecture_07_22_1.svg @@ -0,0 +1,197 @@ + + +Gnuplot +Produced by GNUPLOT 5.0 patchlevel 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 10-14 + + + + + 10-12 + + + + + 10-10 + + + + + 10-8 + + + + + 10-6 + + + + + 10-4 + + + + + 10-2 + + + + + 100 + + + + + 102 + + + + + 104 + + + + + 0 + + + + + 50 + + + + + 100 + + + + + 150 + + + + + 200 + + + + + 250 + + + + + 300 + + + + + 350 + + + + + 400 + + + + + + + + + + + + + newton-raphson + + + + + newton-raphson + + + + + + mod-secant + + + mod-secant + + + + + + false point + + + false point + + + + + + bisection + + + bisection + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/lecture_07/lecture_07_files/lecture_07_24_1.svg b/lecture_07/lecture_07_files/lecture_07_24_1.svg new file mode 100644 index 0000000..a8b614c --- /dev/null +++ b/lecture_07/lecture_07_files/lecture_07_24_1.svg @@ -0,0 +1,182 @@ + + +Gnuplot +Produced by GNUPLOT 5.0 patchlevel 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 10-14 + + + + + 10-12 + + + + + 10-10 + + + + + 10-8 + + + + + 10-6 + + + + + 10-4 + + + + + 10-2 + + + + + 100 + + + + + 102 + + + + + 104 + + + + + 0 + + + + + 10 + + + + + 20 + + + + + 30 + + + + + 40 + + + + + 50 + + + + + + + + + + + + + newton-raphson + + + + + newton-raphson + + + + + + mod-secant + + + mod-secant + + + + + + false point + + + false point + + + + + + bisection + + + bisection + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/lecture_07/mod_secant.m b/lecture_07/mod_secant.m new file mode 100644 index 0000000..a3caa10 --- /dev/null +++ b/lecture_07/mod_secant.m @@ -0,0 +1,31 @@ +function [root,ea,iter]=mod_secant(func,dx,xr,es,maxit,varargin) +% newtraph: Modified secant root location zeroes +% [root,ea,iter]=mod_secant(func,dfunc,xr,es,maxit,p1,p2,...): +% uses modified secant method to find the root of func +% input: +% func = name of function +% dx = perturbation fraction +% xr = initial guess +% es = desired relative error (default = 0.0001%) +% maxit = maximum allowable iterations (default = 50) +% p1,p2,... = additional parameters used by function +% output: +% root = real root +% ea = approximate relative error (%) +% iter = number of iterations +if nargin<3,error('at least 3 input arguments required'),end +if nargin<4 || isempty(es),es=0.0001;end +if nargin<5 || isempty(maxit),maxit=50;end +iter = 0; +while (1) + xrold = xr; + dfunc=(func(xr+dx)-func(xr))./dx; + xr = xr - func(xr)/dfunc; + iter = iter + 1; + if xr ~= 0 + ea = abs((xr - xrold)/xr) * 100; + end + if ea <= es || iter >= maxit, break, end +end +root = xr; + diff --git a/lecture_07/newtraph.m b/lecture_07/newtraph.m new file mode 100644 index 0000000..94ca667 --- /dev/null +++ b/lecture_07/newtraph.m @@ -0,0 +1,29 @@ +function [root,ea,iter]=newtraph(func,dfunc,xr,es,maxit,varargin) +% newtraph: Newton-Raphson root location zeroes +% [root,ea,iter]=newtraph(func,dfunc,xr,es,maxit,p1,p2,...): +% uses Newton-Raphson method to find the root of func +% input: +% func = name of function +% dfunc = name of derivative of function +% xr = initial guess +% es = desired relative error (default = 0.0001%) +% maxit = maximum allowable iterations (default = 50) +% p1,p2,... = additional parameters used by function +% output: +% root = real root +% ea = approximate relative error (%) +% iter = number of iterations +if nargin<3,error('at least 3 input arguments required'),end +if nargin<4 || isempty(es),es=0.0001;end +if nargin<5 || isempty(maxit),maxit=50;end +iter = 0; +while (1) + xrold = xr; + xr = xr - func(xr)/dfunc(xr); + iter = iter + 1; + if xr ~= 0 + ea = abs((xr - xrold)/xr) * 100; + end + if ea <= es || iter >= maxit, break, end +end +root = xr;