From 44d0db8bfda93b4861b29529f078d96ebeb9802f Mon Sep 17 00:00:00 2001 From: bpmcgeeney Date: Sat, 11 Sep 2021 17:18:12 -0700 Subject: [PATCH] initial commit --- .vscode/settings.json | 6 + .vscode/tasks.json | 52 + build/debug/LQR.m | 30 + build/debug/main.exe | Bin 0 -> 141130 bytes build/debug/simOut.csv | 4318 +++++++++++++++++++++++++++++++++++++++ build/debug/simPlot.m | 81 + build/release/LQR.m | 30 + build/release/main.exe | Bin 0 -> 80786 bytes build/release/simPlot.m | 81 + include/sVars.h | 70 + include/sim.h | 10 + src/main.cpp | 48 + src/sim.cpp | 403 ++++ 13 files changed, 5129 insertions(+) create mode 100644 .vscode/settings.json create mode 100644 .vscode/tasks.json create mode 100644 build/debug/LQR.m create mode 100644 build/debug/main.exe create mode 100644 build/debug/simOut.csv create mode 100644 build/debug/simPlot.m create mode 100644 build/release/LQR.m create mode 100644 build/release/main.exe create mode 100644 build/release/simPlot.m create mode 100644 include/sVars.h create mode 100644 include/sim.h create mode 100644 src/main.cpp create mode 100644 src/sim.cpp diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..77113c8 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,6 @@ +{ + "files.associations": { + "array": "cpp", + "iostream": "cpp" + } +} \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..e4bb9db --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,52 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "type": "cppbuild", + "label": "Debug", + "command": "C:\\Program Files\\mingw-w64\\x86_64-8.1.0-posix-seh-rt_v6-rev0\\mingw64\\bin\\g++.exe", + "args": [ + "-g", + "${workspaceFolder}\\src\\*.cpp", + "-o", + "${workspaceFolder}\\build\\debug\\${fileBasenameNoExtension}.exe", + "-I", + "${workspaceFolder}\\include", + ], + "options": { + "cwd": "${fileDirname}" + }, + "problemMatcher": [ + "$gcc" + ], + "group": { + "kind": "build", + "isDefault": true + }, + "detail": "compiler: \"C:\\Program Files\\mingw-w64\\x86_64-8.1.0-posix-seh-rt_v6-rev0\\mingw64\\bin\\g++.exe\"" + }, + { + "type": "cppbuild", + "label": "Release", + "command": "C:\\Program Files\\mingw-w64\\x86_64-8.1.0-posix-seh-rt_v6-rev0\\mingw64\\bin\\g++.exe", + "args": [ + "${workspaceFolder}\\src\\*.cpp", + "-o", + "${workspaceFolder}\\build\\release\\${fileBasenameNoExtension}.exe", + "-I", + "${workspaceFolder}\\include", + ], + "options": { + "cwd": "${fileDirname}" + }, + "problemMatcher": [ + "$gcc" + ], + "group": { + "kind": "build", + "isDefault": true + }, + "detail": "compiler: \"C:\\Program Files\\mingw-w64\\x86_64-8.1.0-posix-seh-rt_v6-rev0\\mingw64\\bin\\g++.exe\"" + } + ] +} \ No newline at end of file diff --git a/build/debug/LQR.m b/build/debug/LQR.m new file mode 100644 index 0000000..fe52f0c --- /dev/null +++ b/build/debug/LQR.m @@ -0,0 +1,30 @@ +clear all; clc; + +syms R11 R22 R33 +R = [R11 0 0; + 0 R22 0; + 0 0 R33]; + +syms I33 +Q = eye(6) * I33; + +syms F11 F22 F33 +F = [F11 0 0; + 0 F22 0 + 0 0 F33]; + +syms G13 G31 +G = [0 0 G13; + 0 0 0; + G31 0 0]; + +syms I11 I22 d +I = [I11 0 0; + 0 I22 0; + 0 0 I33]; + +A = [zeros(3,3), d * eye(3); F, G]; +B = [zeros(3,3); inv(I)]; +P = [-Q, -A'] * pinv([A, -B*inv(R)*B']); + +K = simplify((R^-1) * B' * P) \ No newline at end of file diff --git a/build/debug/main.exe b/build/debug/main.exe new file mode 100644 index 0000000000000000000000000000000000000000..94e4e51cabccc0fa44ae916db07c12361149f0b0 GIT binary patch literal 141130 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�HtWvCwx`7%0|Fao9B zgwwUu&7C4XqYs8++Cw4 z+A{wjiCi9RGUfS()4vr8!X~o{^Sx)_m1O`nnU$DtL$&Q7Y%-(xf;2VdVc292Wqf^_ z$`yo7=G2|9R(&4hM+KYASsJ(c1meT6$pUCB&pd*#$x;)VAf{ssY%=NGA>`3L*ks0V z&yb1nVUrot8;J2>lNrHnMMeY>1~!>dA2U%Uyh6+3I30jZW<%jFBvm$)Fp50bWTyTM zS){(pI39vcrVuwSiJ&lrV3S!LxSvTzw?Kv0P6@y!lfoTOz9E&CAZ#*?aW_=hmp;i++C$o;KL?UmbzGp(P$=uGR5)^<t!2EdC#Y(FV!6uWF8^u)BQC5Pm$&BX)GC$ENu*od%AZ#)d!yRU#Fa(=S zRoru?k|H%H44X^_Zbnn7mWryM=@`6Yz$TN4JJnQzbbJstnG9Si;pa#{Kk}iB0h>%N zE~HRg^ouCOeQ6LjnOt0E5lxW~n@k=q!3ZbFgJ=e9GC8<7BgK~YSWD{yY%)2y>&o}G zVrooqsa#`%d(;|u$;|=sDv7YkvTmG|#smkG#st^cH}H~6=7o*0$tvzyNUuw9OW3-E zy5^>{Mor-gyj(84Y)ssA0e?wYm*ArGbwXK};0pLgp?I*#71I(89hhGpwki@iG(*_r zibNhS37cGzDBz`mO|HliCIg#XkyXf81DjltHJd?!O|HlmPJvCX$j&ESV3RAdXY$&E zO|Ec-&x1{_a3$V@O|Ed~lHY?(uE-I74>q|XNBBM1a}y@&sU$D`rRvJ=o-m0uc(pCRY@Q9UnHiqCgB; zA=u=KLXk@t=;EQVHsbwO6iPPo!?4K}g^QVtQV;#us+cL_cPMjogL6ZUjoGX&(ZT zvXVIr4twy(8aBD2RJ0xT=o&V;qEz^g2yAl2Y+<@fV3RB6NZ_bJNwzBH3gH1mP_W4r zbEOO(3d1H>%$2>Jj|5?pE9O=)X(u#na>YDR_qc{lu9zo{@RYzNSIm>LIW4fs74xLF zKPRxs74yW+FCx1dHo2lq^t@~+*IE^2QaZ01$_`MZUYu31$ra@y@rHs;t|*tvZ3&>U zRZ(8dLW7>@?n!J7KodC*yM@@lB*zWa>XLK zZLST$CRbF5rZ8-BMTPh$0GnKKp|AyElPfAk-L5cfaz%X$JI#GD?^#0Q_RS5};^T$v zjjxdPc)&oDCSCG5bA6{O|#u5Np2JG=_l?MS`+T=?X@^IWoY-bdFi?8S~wgZ z8#rXkus|QO&`XG2}bOSpzRU6+Su+r%*2fPrf)a|%lV9=0VZ(h;Fx??2ecJ?gqC2MTI?%T4b8_5L`4g4Be+XozyAKj#+&fzoqjB> zuwOwUm#<18>$LV;hnA>BY;#Q_{t7k*B@wSI(rMTOd#_X}a|vsI=hgL={UxYfi7TzC z*ZOg#()9kg(RA5Pqv=bfM$=wM8fOn3y-10?h%ECM{x$|S`yXX)5Ics)OZx{7jMR4z z^jP*SFtRbEZ#C#TRbpm*>_0Ii6499wgWeyxbM`#hY&<% z_#GX506~0-;@vuU^tJ=-{A$HrI(!$x{BFg2b@&Lv{Bp(JI{e112R4!a{W^RWVe)@K zhhIgQ{2$cemv23=c_sLd>hOyQFGu__9e(cC1HG1guMVBQ^}t?&n%lpp38!v7u$AVH z>+s_U)7&R@_yoc<_bDBIgy9;?{sSF;i1Mo~`|~>dz^%&rkLmEyTdn=-3nU$V1AX`$ zCce06w@F<}A$xV{=W|qfJgbY-K7Q-lOnI~g>r$JkO9%L}-@ZzlJaOBB-AR7VM1Q!X zGa(yTj{OnoL8F$vPe*&L;M&jBczwh>^^=Bb#Wg;G7FC%Lsi^|FT*rwLDal`dn|jC4x-|Pa$?!dI_B)H zLwD+&5W0g0y|Yq#=l$@`2nJTm&SYZ_46(x{wZcu5a~?pmmmVS0wBrM4#|g0#JJxo< z>!M2Y*$2gsoqfm9NNKHzepG&87&%`khGWOjN-gkNG3&Kl+`ZU8D#F6E_FCb5O`rSG zjeHXSZ{XiP@&ZQG3~SnSa&KiAz z_zZ1#`O>}SuN6_|f6w61QVbx2W93Wt>^|6!7a@atmk#vr-rLgy3L-I;=(%C(@W{{@ zsy)8mms3@>EciD%(z6WAOU3>&C89(DX&gkXxPxMeB{F48 zO=MpUVjMpPgQt~o5Wi~Ug1vP~0faO3PCm=tU7Dn_Sf<*}65OC;#WINIZ^aLiBSR@A z!AURyPJ%7YNvPP&6iJo1FwstUVaZ1pfQ_DCbrr)>5@R`~avU=Yd!)Iz!BjkN+ z44B44{q}LjJ7-?bn4#e@c-V3lPN(-6U$>-Mf<{Tbav>9*2OFcpAU%efaqn{&V;P;&*V$Ros0CtjyJUXFzZg z|AJqa+50bC2(J>D=IKoi51|F(>%*B(6#PDzR7~FipZ;|I^Po@1Ye95EL&M4LfxT8{ zhSZCB)4u0eR^H$c?v_+6Lg-(5@I`EVUT&msm;=_H{=>=T$=x@N^;xkXtwzz}LE2hH z%g7rTf+;QKNXVL&cW{s&i0kXc!jhq30KwiU{izBi@&>RhM^cw%#jBC7#DAise~OEI zEB?)L|8<&_6j(f+fRB&>}CT;>E2vB?~d0^z@D5JHhxo_~_WEb(fv>O5z_d z>n`ZVol@2hb5+{#=~*l5RS9GijPC2-gTVq_e%6nKl+Yv$Z}@6>*1rfbr(plVfiYQ& zV`cp~_ciFuSESwe@^jX|3e%zjY?8&WXJ!3VI4TQ($vg_DoXupm*E4uCg8weT+JXTz z+dk+Vg=bz94I9bQmxO2ghpeoh39V7Yb`PLTyOD{X3$eKXRa8@ck(-%=1?)n>8ov?P z|4$)ZSFmR|DX`F4zY?i^Bq%j+3daBmTIRoma(L$c{fD)XWsB6ELQ-P3ojVuC?h=v~ zj4RsFnTPl9*OHEsd|>8H0a6LQe|+Z69%-6AjiiTWj*j-}WM$goxrc>xa8Rm^RBmQH zOGQ2|k=l5+qCJ};pks4X?8{6pjf@S!-Ke!_+*!FQjjvOZc@Dddt4;O+e;g5WrEb|pcsDkN&chQaP$C(Aj3-oJ&!bSnE*e;#?CI{= z*Qe|JOeK?ph!vrTA{CKu7qJuJ$8(drv7+n-E2~(=%!HYKR@LsozM+Go($|o!Z`8^v zQ7ol)(QbV94x(%%K(|ojxpvVWX(h8&xEx_9vVa>ewO|p#+ykC9SA{FdzZ+`jsqhkn zd-fq*roz<-j~>7myR$A(gc>9bMSxx^Yk{JywTobJ6fz4HVZB`hlO!xsgjz*F*;gpS zMrhsNO^(Hi(5MLDxKI(A?II+T9F>aDrU>A;ND(@b5G0H&7b{Aarhw-XMY+x{0%icZ z5`I?fRw{_5qhECzbRb44-3L>(yPB69_kK zYi++axvi;VTU}>;V^RrB^BFd6N1E!lwI%CXHYPW;*R_CY%XU>L4@SC$??xXiRPsH(7Z;nfjYiT8Opsee%ZE?Hdev zhEF!!t!-9;Pc_V-7W&k-x{b+>#@6=EvBYTe$R z+_D|z)ZDbKsnaU0*fC$={r zLEBn4Hf_4rn&p$}tfrRwjScnIY@gcH(%G=Np*^{A6C@g>06MHWetc_NXR>bdc5ALr zs=K!m)F`#ic>Iy&3o6O_VyKMF0PuDNM*O9S(MH5#<=z=y3#Q;RyR1wKFB(NWj9 z$yyku)i-x;v=)VF8#=8DpP~}Fsje9s&@D(xH*9ON76({1ZrR?^ncUuj>fLNz=ts1o zt7+PltZ!|(8imo(VpaNaOi^Q#6vL(_WbUGHR7W7{;&9ZaP3;X0ZPq0|wV|ssxwd-c z+BGzVKBA?w!&>4;Z$@ouS3O%tvV)#LLuddz{r_&dzJw8k!qAkTB}&u$G6TnU?D0hHH~;U9Iib3O|xn zxgCi{Kg$}>k?d?uUX9wmasrl3?XBB{sU|HG%c-Hg15LWaTIF-7&OB6AH?>KjHnhXh zt9?$EDbj$9B!e7l(sC$kP_WjImiE%t(YSrn2J2FvtmUGp_{*LEZ~VN}Byi2Nl{#jOoKgKBYX{LKw5R=pq5(b%-9 zbGfzAr|f88*U;68VLhpAwQRH+{CM;n+gjmX-6YwiS)2UmO?7DC%JtS}pB(6Xlh?F2 zbv9Uyex!6v+mo6QyTl^R^Mc^bv4fb0Dkvff6N#9^K zM`IeB)TCpZAEh%y_gO7ISyk%hRy_=NSgn2>t5a8fy0fr_*WzEJ^c|y(Cu5RAnEAcJHPQH$qm{x>zyuU6Sk_!oB=K-ky&1^(Aq?*_TxO z`}gz>_JH%+SnemF!$};%Z}CXq-eeD+?0D1Yi=AnNSI=u{Rkh5@!@Pyr+{jZbub!uP z-UgmB@;aJ$cJemLd0HOE6c9QvH?7A9mp3$^>=hxAca^%xg65W_4rJ$bHg_a9w{~u* zLv<8MH?Ikk@-7v~$!l)dT!)T9qH^Uc=R}PYDSZN>V2C7F`M3lu@F%k$7o0i zKVQ-;Q48`gF{PPgJt|!XhL?p_{4=Npa@Y10N?qz+n-%{YuCsf09|p9}USJ903B>+x z+@fBdC?FSOus<&xcZH4{y>X-_85O-!MHl-|)yDV%d-b3b59_A=WG*Tl8h$;d2^dxN~UfL~Zqnnh^w4-Uzt{&q94- zODk$s9jdfXs>dv51#Yi=N=rjyT{GszSpixH?$@r}(B8BW3*fQ?^v1f5YZ@>&a|5&u ztt~C2G3Y4edxD?u-Ian6NeDrpTvkZs4#`9H4Anjr$#+ z0b>?MD62F;+PW5ZIRTDs8#mQ$TV9Qu9G|#hBWy3neN75!1@3E7NGowOlR~P&4NQR4 zDY`C5C9SZ^1Ed|CI4;KxiZ95g)C&S5jFn|)%`KU29$&Ecwz6VDlJwdmBX|rcZ!MF% zhYk+*c8}n}O;%QsJoJ|b9Q}j%02$r~M7XjQSAu=?5SFf+7MsL%Hd>_g<*K#jX3Zl9 zUP5w7WnXW(yu-`bepQn+J@*|lV#Gf}o_xUO;n@@>cDT+o*X8E*A71sv`9-vWzQg6} zMPDr6Bbax9^V5tgUz#e@q2N80baNzZUEzZ@So2&T{2T|ZbH|ev~rfs zxCL}jH*)@NsMSI(rAY3jS=m|f>fTzsCcrxFkCAj4NnM&G^xysjJz&qUD-wlnJTWJ+ zy<~=+j}awysU1&T=B{(?Lc9{Z)RKU6srz0V^)}-&3sDG_BGM@Yr|XjUQsJJKtGE$t zD!g*m`dI@I$tgc4Qum9vzAOWnalQ{nnqy@fQDW*={f7X4C{yynfc)Y^J!tC(=AK zf|p9hEh?)sV<|R@f_Y!d$DL85Dx)RLC@N^!5ylO(!eT326EQm+(NyS1%?YdWBj$!9 zluVCy_`GzHbV^x*g^WUEAzu*YdXEinu(bbV)!QfYqW&SC>Uz zbpe4YDnvC48iYYelekz{7m%p;LeISLu)2_|GAwGy7gbrha(UcX{eo&Uow_d3MTj_5 zW~y1@X-9HZRU>&R%F?T{EXyiMy5raMWqvNDT~tfE&@Nk!x}kHkf|pViVRQvFt@JEP z3jLz0(e(#pQ{`5vgqOjqcp~h3n{Hm?=Y=U=8%(jPu$Ox7mZG?9k>$Eqprxb3&ch`g zvcAUJjML=|tCn?zE>%edKr+32gFrjAg|^8JgLT0~(@`6AIz*m?`Va@+;BG9`6{W$p zo221ynveFd47{6}4$ErH*U4*I2UcuJ-Jru;gHBMHY!159)PikQaJs5hhSXAuUavJ+ zI~aqvrC{|+T2-y97K63j(+lSrB^{o;CIU8MKA5*-NfprdYpQi-#KKzm>pI0Vn5aR+W9xhy3oVBHyuHR6Ol&S>FPPMqSmCuxU*Zi- zx4wjy-TE@qvU;lE)tXr|?1IeN(hqNd6ME^d0EKDna{?8P*7j7{n+uiD{Trn5>?NgF z)1ZiA`zXe4oFe^R_9Qo+MKWF=EK4%qKy9jl^%j;(Wg9Tcu&}VoUS2qu2w1}sLC0Dy zj<9|^iUkVmx1*S9C%+xVbYHBx67&+k9mRe-iU9@be`ORigBC_FGiaId3xk#!zc6T- z@e6~N8NV=S?T!puJ!uB5UOi~Z;LAa!FEVKDNgdbDV-$m0&Jja{pc%(JlNiT>Q_#?$ z#{o@GcbjD7!mt*+8459Dc=M+w%*>FBajpQ)7{=J?Oh>IXHgG9iTr|jH}zLjPPXNF%!sXLBncBmRV$7h&e^V%@HjLil-E> zTV!82OHBfE)J+j?=WsKZf%(W4F6XHJj61IqV;tu?`J8gi2u^M}pC|~;o4{7+O@U^#bsD9I{Lq0wzqHh!M*?Ny0BSAy6lL932}-4tMvDKpLyd z0YFG%-{GDvK&4e(OJ>#Os0M1S>K_~+o64Pz zLr#a(We;7fF7;b19l%bvzV2QXKx(jyGkIuegar6XIYmY8mjtV8l}~lOp4*DXmi7-` zAp?Swz)OQuyK5y-axzwl9yKF|Ej(GVwjxEHmDuCB*E+dR9XsaCxEDV~_dfB2Q}~oK z>k~iwnN#?4XT~R-(w{jCZg=L~?#$TYEWX3J2qKr9cCOswY*1G-PCBJ`_$-M#oq{Kw zoJ6%_Uz?HP%!fbB%~v^^wGi_bo)$zx-;$BLP@xRc4W^{BMPAGd91 z{?DB9Eza_jv1vZTk#jLvhGDhsT=ayqBvBrV`QqiNu~ibgms_!|uD5dZ`R(X&=)ZB8 zT=v`1<9}lGnCjHYAAS1w%ZOu}5eGw$H{#$rIN~4}7;(^LbHo8Lb;Lo88F4Ty=@AEf z;SmR1!4ZdJlOA!%sz)4N>Jdj@V#L8!%7{Z<`?2wYQK6v+;lR*CHa+yH2o62CiVQtq zOdWdA%SVPDj*{NcgR#jQdT?!q9$bco9)@LL#i*dKIrQMt3_ZB?haLvJp$CER&;zG= zLk}Xop$FGyT7jXCo>3;e@dym5<53xUceBH|)X7d9bY^0NN$hp9&p0!GfDt1%ambl_ z(usFD?p7!3MJN9$C+`Vodg3mp5L`Jwbc#5DJm}2j>2?)@D54UVJBcTpnNT?$mvO|$ z5}$GMzY^bn5<}0-lTLnopo>?DF=zEdu>G^|Iyv_$4P%b;kaNMuodtWGio_P@!qd*W zEzT8S#8vhdr|j#_d;}Jrc8a$;Aab=%lj(VwW6sR&8&PtxI_;;sBl2iD~gmFb@obuP4 zIk80rOnde#PSMw$@-xn?GtLqO&p1WLCJ27$>tA_owffAvk&*sad&Gc2wd@cYUw&eAi^MMs@Q2sCVQ>RxcxR+qEzjB~+JII6%|*X68v zL5j8Es59qFPSaMWkX5pPhLJTyR-Zvd{g5PP`VX8ruTfV47;3tlsx!{TM^Uc}oK0QM zh8G;Hy>g1LbqZbpcY(9)LFb|~PQ_8D9D%lLoGXtxYnh%VC#S`^-~~Fb2-Pf6u=O12 zs+4ps_=Yq0j8l3Pu0tj4a&o$y!edU(87CjV6XvVrEs@XurZea3&P=$j%c*{iSzFlU zT)M@{MK%8c>GQjs#U~lGf8bOmK94fFgH0j##h-DSi2j_> zOFQW-KJ65pbf!PW4q(=Uj)QJtuT%0MGCE(H%!5u@6+4TCd!4xtIwe)kil0wa5`7}l z2s?A&#M~{;%qPO(k|&(1SVe(T%b#_L*POyFPEn%JDLKg+1%aHWompRJKU&b`%tE)o zizgiWb!Yi2P8^w@u@@O!muPn8J?PAct$>oxrMoOW;aqsqS#{E>LTa{fj*pH3%23JS zko8SYX>*9OuE{BBcGiE%$!~OKKkZy}(phuTsXpl}*y7CI$|i;0r3MY;q*L4E%)T>3 zf$S`iEogLRJ?&JUbXK2qmYsCwZ*gYb!7gl`k-b7VgA~XjC9sQT6#sK4XYUhE?l({i zenx|E3OrJqC~@ZK%x;p*7Bb)UpJQPa@G|d&GYft?=`6b4sX>o;)VX4dv+bm_>8P`2 zi!&Eh2tDz=KF><&e=pzSY(DDLBDEe5Zk>#ts-tw^`YlfLNe4|AJ+jiX@@dwb+}ILy z7?OsgZ||m-eu|U=%T6Sc(s*%@G@N0UgKQUjFLU-tY+wA&IL`p zX`B8ui>(BtDj5_QdEpkP@Lf*cQ*>-8!ppWe>rr61sze3airyWf?{Y4E+9`d|nNAN~ z`8j9ygHFD#FK7dKyev7vK?qgS|9z6zsCRH?=@V>Iv!7&VKlcf?Aav>&jORSb-+51P z*irQ2C!M^bPVo~?9tI!vt0>2WF26+|a;9U@Kjut7s($$R48}~5YLcvRstQyD^B6TE7X;im&x$|y&PQ+0u+edyi1|0#h?s_$qb9<; z)sD%nwmccYPnuip^JPf6)lLyNvFcX)5KP9bR{TaD^ak-(aGe%%MLj}V*3V_UR?kg) zfoxIL!G~K|w-qyRGV#|fd%=Re*H$0gx_58&<;@Eg#B7-R6xd?c$M735jT;?#vJ21_ z^O$x#{1)%At_UnMw>m)$;glN=ojpDZ=3_t4UYMH?ii4RPpHqXxOu}oy`v~OTo73ak zo73akzb!xj0P4Wyz`PzeFoej!6{v){z*0&@CQ!gqq!p`B2gmq$4EHrG7+m4Tj8{vc zLO*L$sa=6M+*Rz|J+PE8JB&ln#P#rD*Kd#iKYCy$GEF2%w9~`oIhl!vP}z9Ys1v?z zS}Rwd)bzUP`R|Txp8i~-F=yIynVav=h`-nVZrxW4GT);Z7HPTHij~|P9TvIz+-X;T z6-Gcae7PF@YJCddp%lI*&4)F;au|KrYQBl`aT*fl7Wk!LKI*2I-VxtC{X_;bb0Qx9 zy8Rc-$(Lz>`KMeeIGM5Ad4J-8X&=dm-xK@07mf7$~X@tfl&(I%g%(1eEnDxJ^OZaAMTKiYX_O)Y*c%it;+x%iJW#3_a^6(7>@ z#kMNn8NO5m%klV9fj|vkuzoRpsSu=wFId0Gmx^<0_|8?o=gOwQPyV_|$X91zJ!Ma=NG?v1@1BJGFyxP%Ltd->?ddJ@fS`29o{}5Q^Gr*o79Pk| z^6Kt^gMHS>ZfqwTw174v8#^ojjqDp4Is`nf;r_m!zC-=kwkU!l2YayX!@@q4QJ~mx z^NO`+1REQzWamgXUwNzN#oR#_dctf0cgK&y=U)JRG&FKK6!E)oz5RP3i+w~2ohK>ysT(kS*z5`s#}5+ z<08L!by0eytjaJ_X2ySTrKil4hbexe9R3g03Dk!3DMnRU)0N#MZWn_0AIrRZtp6T} zOX7Ogb(F8DT3P)T^(4Pl^Z!NP&o!Q_MX4>z6D2wvM0bIYs?%gXigiDuFx4cl{vuU%$o^0voSB`wsU3TQ_thb;!2L zt+*+y5C^`VfN(zkg-7D<#_uk?l;p%TZYLy8BJhLf8*+RBzr*L?`7U^loP+28fT!&o zJY`6EEuM8ul%DnEIftGd;9+j~*o3<9vYb9Shtxa3^Bf+#Ol18t;Hk#H@59GPnLsn3 zZ-NfBkIS0>Yz|%GX4_D}o0B;Wvb^+^Oh197Dr0Bbsz;ogp zJg~Xg^uu))eM4ZX;nSN7ZhCp6CNk1J5E8^v+d>eMK+=9ySyG^#aXRHSF`yN}Qh&vWj%9 ze|it{#rDqs)PBrx9b?`n;4wYzb>PuG?M-|6FnTF^T$!htLk0a*zvE?T!w`64Jy9>vr{*)#R9T-%P@5BcuWoY8t1VX>-4{FbXqhjk))d;=*w3^Gng5BqojFnRw+L=J#V z$0;6aR0nxXPjV-&l^)iy@L}paZ7DrWPuLzMUWbCmah@nWbKvzyz%yQYsAmIso;in} zUEq1_9C~gA&vTxha9cM1`3vxzI)|PFYQc-=(6bIa&rYDHN?uK2FFQI8miTx*?I85< z;1lz>{nuTV^;0OPFFeEejh5-BH4pZ& zK@U9|HTMP0g9Xpv`CPO@gZ?CVj^ba{=PN;p9$!QJFc|Q04(O@HuPG(}>igQ3;yDeT zaJhnD{Tq1rymlfzb0NlOvJ>&tf`_BgL_F^U&)Erh%vewfuc)yA(ABbhl_~WPjs9tQqd-uX5?+6(erPZ9yCDFGfuBQHw*86@Gp8q^JNJA997PzTn);Xk#V20 z50oF51}TR?IW#v&xfhgYE(}us3Y5o|1S$UnO2*P4g(HYM*gx~&=%5Zmk)B^jhQeOm z=P|u{r`D`I#$J6WL^%uVf9O$6udcibui4iwM(RQ}*!1eBKxOLE-65J@y%zCOUUo=@ zB-8ZjUMbtd5hl|czYGaxFK)kz-!Pl$joBm7O>z4ueiz~2KTK~^JBi+geT?dDif|+R zabJnPVsFDfM)fvJ5Q-k`ZH|DfdK>m6^g{SxZ^M{;{KxHG_zlljL9p1{u#d^bb=ux6pf{W33kJ7%S8CkHb}$ zu3THQ+VVy;k-h*@!$wLd%h^GrHy&>;!52cjvwS%u)dHzDCCDC9_jM{g&}IJ>;^-;= zh>ozxa_Xq3pNe>z(>*!S_wT2XXEl0;dvsbfqvt;G!1+keBK)HH1r9T3+vxduuzO6N zEcs84O}?yUx}B!+v&q+Uh(oc$7V{N8%*3P{p4?Pe*&L=(BdFkQ1ZM^RFlOsxZu>OdD%G2k|JTdcp$a(>#fy4Ol?0Ka*O}=#9 zVBS^TNW-I_n7to7j7_~?X0od4+dCI^HPu(*nx&cUKF-vi>!C-r)7}Ao2I zOQlTH+#M&AhkKLVmW5j))w=Pt5R{uyH#`b1taZ?H!qXh}&!2!NT&(9)H}XCIu)M;D zsT&D6S=Ej4$2i^_sk*TUN>au+>BpKkHX>%+eoXPy*G|NvpH-fME#*~eOv$_G*|=j@ zNDl&mL-ng0>pah=8!J_McCCUyQ<<-L9fYt6*|sjs8d#5_$qs?W_+$J#fp z9_^p+c>dWBbdA)O3}{TYO4FLao9=iUc)Yv|!wsP1V@ay&)iD+2N9;z*JxbK`oUcp| zDLaa*NsP1K`WQ!ThtX3N^E-$#t9b!ZmJJ;TeZ zea|9@&q?%+m9NzP0dMM|SuBsoALB%d?Sg3tALrw->WS*A_89N}R6jC)!d){E%<2dRc#v9~O-WVS3JJ>sfk3?gmzvm3=lgR0b4pleOjnvfm z1@N?KZ>W0kHBdI1GPTg$__f~AMvp?N?|`R#m1&iv{3|H6A)Yru;TWfCICJV(Pb6H9 zr6_8)xbb*Q>sBdb>AVkaU8JSe>3mAZOQFn>LTbGCal4Qhm7a97b<5g;G%K$%J^fIE z45S?W;A!(pne{n(+ypY$l#E;Fb#38uB-M5*BT7td;gbrbXZ+g2?_aCha(L|USo*o& z%WG6ArK>IHz-|?mmaJhz*mq5dk6Z0!^V5zAC(@=>-?${^1-LTbL7%s zJ^T_V`;2wrJxv~Tt}G>%t7ZKSDIuPhKpDQw=rOg<_r@VOcj|WmyNoUSA>=uHn3>+4 zh*70n9%ewulro>rsZw49YRXJck12fHrD|_@JfTw4Z`667$Mgql-~$gB$Y%Wv-q?k0 zJREb=)dcbs=Az{y3BFh7gTh4llx3hir}e0eH-nN0@gzZMyWDu5nr{Q;tVc0rq0++^ zcRf^HNJj5CpPK2V&~EhP&4nq8hhagL1?NWL!;}T@Mpapm2M!Ay#?MXQQ7sOB-j7=D zcg^0o^Bh38Sh>^rIhrq83?JsMf0yxUnwDbHbCs7K>bMtv_7CId$)tzl4*t@oS>OHn z=^p-RvA_3+EAE#gCS_xC&~`FI)RKL_|{PW=m}A3dJ!L@tbQJb zG)4FP?}C(S7kltEU}ZJ<%heID{F!-QS*0}wIV_9sD_=t?vgM_lvyq$c8GnSOa9{(^ zJMbHB944oyOipdwR-_znRq0SI-=Chv8E!;+*l)lQDF@$s_M?vEfgZO%ni8vme5c7B zd#q}4>Bqu)O#3?K`PttlZ4{ckTlLB-6ZJp8Y0acfmg&sLO_}~Zs$8@$W0_7vrc{}( z3Ky16IDJ@-80EuqP@`-t_g;KoPnA2@BZm*;pHF!H;YYLsoio_wd*2ij|D>ORM18ne zr_8taR@EQ#lfUx!3OwPs?ohvFJv50lD;}o#R%qlL!av@!H0!#`HPWg~clk#2 zmFd}fCsC%IlPFW}Em6G$Hm0uddo-F83eM%N=PpylL;vj4DfLfpnSXSd7JF$P=tUYs zg(?)7K01jsD;}o#X-I^Jqqi*0x*y}ZTofy8g-1nt$@F8pCQ)Ah=;wWCZ%TP#PdL?C zZEY$y(*WYLpPO~8E}udvP<9Dr;?c_JiQAM2A8(m|^csd!I)%6c(u?=Kd4d(06?pee z2|NkKloYK+uPt2FiGDsrshNxR8ltQ&M-ga>wtjj_)-xj3ns)ji z%Gaum5$ib->p2nYFHXt&n~^)#^%3iQ?+{Ai>R813%Tu!cM#Oqe#QK|P&|&LuAgC$2 z++UrN_17cTmqe_;9D=NcI8XSL#Y z^-B@!)>W#HI=}Y*YQ*}?i1n8u*8e7AJuxNgXCl^fBG#XeSU(-Ho2P46S4lqi1qR*S${EN{q=}-uGR>pXZ7bJ)+?uE{rQOX zpG2&4CwAES!x8J%Q?mYC#QK?t^+zMtk4LPpos#uuBi3JvSmzq5aNh5WSg)Ou_0tjS z&qu5uk66DuV!d%n)}M)3e>P(MzKHc(Bi7rdWc|sA^(Q0N?~GW#K4QIVO4c8bSbr>H z{g#OJT@mZMreyuGi1kM!*2f~&+auQZP09MB5$nez)_Wt?Ya-T%r)2$+i1qs-)~}0L zUl6f=cuLkEj#z(x#Cm7MIzK#zKhDGT%<9OLtRIh9za?UQW5oI!crp4`Sbrd5eJo;q zeZ=~!5$ktNDew11tPe!2*F>y8=Udlz$Nvf`bw}UL*Z=)PyOVnk4*H8%p2Aa_qmsgj z@BS1I?^yYS4~7Fr+YD|z=Q|s$>Fcan;-Lp>epW0 z8PgGdOascdkoOZh@9Ca->a`M<_sm=j{ChwOw=_8Nq4|{2Bb1r|CFZpPWs7Mh)~S*e zcKjG0R)fqK^#m`4N5Av+(v$A#fquepWD-84pOp{OJSo-nCl3s&{^0poGTGg;zjq+` zG;|0#eQtvK!~DGiJY1W>Qc7Ln&m5XwLg^t7Zf3`+W3`@taPyeTqy2Ma5^rzs^87;& zgb(us=BVeN@$1+HVgKw2ulKR62axxd&*7g>foFIU{!w}+_D|be7}}v*JVA3YQf_rtR$V@}7ogGIc}U zpRTBcxLB7pibzV}&`*|X{4|?qO%tR!nnJHX^y;d4X0_%-r00Lw_l8Pg%|N8*Z$yH} z@z{A;e<))8&WQEqi1iHLy6!i)!(8&0Z!M&G)sl#HzBLW;tlko_zIIC1dn48tMXdiM zVtsYQdhL{~?}}KT8?k;SVtsDJdgGL=Ul*}HGh+Rvi1kFodfSw&cSWq{M65p_vHlt+ zB;i`uH6`nv5$hQd>(554zZkK;Yf9GJBG%tDW0RQ!)I1Zhekx*p-;}I3N36ddvHoPl z`oj_H!&9=}7_t77i1o)J*6)j0KRhMt8za`a#v|0X)I1uoesje7kttcPjaYvvV*TNW z^?ecRcTLIq`iOO|2ny%@c*Hutw;OJ8N2g?cZN&Ps5$pFwtZ#@|e_%@1Ya-U4iCBMs z#QKtm^@pZpy*gt3$%yqkBi2hJ)*qRY^(7JOk43EC60y!(zi_#qn3DC%i1kM!*2f~& zU(N8W>${0JKpF3D!rVprddyv9z?PmHpE9|?d@A*LtM4LbntV-g7wMlM6#xJ%$Re>%8{-QqS{%*f;pAz|A#FjQ$+YZOS`&4_lu8xy1iqt)u_G-uv%(o6KF@~l{&N?A1t{GXbEh}6TWw${u{tv@yQrShzL*6*WK zn%6X&Cj&$|=po7hGApZ|A&jFkkatDd42qcpD9YPFQ8;FJ8ZT16OCGq3{!x@qfMVK? zqC5o(4~7)wSx~xk=_tzo1Bz({it;L@s#NV&l;RoK^BJ}8B=J}wQdI(!R3dLHz8!gvTtH47fLqCO`pzu&B zN~7l}C=ZAH^PuP{4@f-@3R|SF=Xp@Vd4B~IGdgJhpiwkJ%J)yK z5K?dhJpmqUha=86<9*Lx2p&4e&)4Oow5#4i`EUy;d?(;*z77=gj9T#=0Oiq8zHSF4 zoaPUK@??nTz*8D3i+eyR4^bWh#q@qEr(Xnx zho9zWKzTA$=VRERHQ;%b-19)GL=l51DX^?sP-;WAt^p-n!-qgI_YTVX?Vy|u`S8P_ znDt1C=M$jhhkBbIfMT9_D4rPh5+y>`XMj=-&3?YhLFq!0{F=D}lz~uAH-PdcRQl!h zHc%9ToGFVzQbKxe0mZzlRp~hfN}E^8V7C4cl%Iq&KMl$eFYn#E0n7xxwO&o2)IWkJ z-{T=At0XlSvp_LOvuxeKxJo9;8t4?~81FN0#n zN=11Q6tikkQT`c}=R#?I4HVRlKzeL+5vTO{uB2vw(ikeig`kA%&!wO|kJ%R`VpdQ0 z|1Is>LL|A$a1$jD!9XBBBq3D_I&cXl$}v)QbXvo%%KJ>^t) zb*idork5yrNW6qZ7ZnT|G@yb69|DFvC6E_I%u7(wc*A|nOTdSPyae?7&wnm;s=9lJ zO_MBBU;XFypa1-qb55NT<17XAg~PGOKyw2$Rx-Z|>@2AX+CHr@w9QfVdgLm>Qh zrLVc69f^A2 z0r(_Nf1LoL<5SLg3kaWAsd@M$5Sj($ey1DSJUDf{Z&}myKy%%+6cwv|6A1lm?_39> z=K=1(jl1c zoC5Nw!;LdQh^y8scml{Low5#q+;GO=cY!?Zke`Qh~6v9HT(bw{pg92J0FDI z!IS0Ky+H19WaBsxJ`YxN>?=Sh16${>0l5jpO6E6!9Lf==%X%KjFP$3x8pt!wsC)y+ zt|L+J0=emMI;l2*ybT(Fs!zK>e&e)jAIPea7JVWj6=chL5j5uv$GQh8PJTlx4T9`zKL*VU zPR{QDX*tN>fjkUaJ92LVp+{T8PkauV&Ga(f*6s&FKPyoS734G!SJQ40@<`DxzX(L1 zazI?G)qVoxCC3uI2IM;q@<$-gIQ>=S;Xgog-Ovbp+(j2JtvdYq05sO0=a?2Pb!h$v znt7+~$3D+JXWPCCgnkye4CF_q-v#2YL4wibrr%FksWZ#!l6fVkS`00^IKuiN!KAkUgQ?<+@>ziT6!ZW=)Oq z{vN5WqICR+|KG#YToCSzdcsS+K`+eoV>IX{`fqP%2ltrjr#QlAe=1QorTtav0j$-3 zs=VY4w!H&4HirvOhj}{3#}v?;IM0GK z$wfCweH0}p{icwO2S=dFM#-(H)al6O!f+F9-|K~9$HOJOqWqR?>lbFQ(q#e71}lQ?CRojmZGyUk^i2=LW0 zpFfSTFQ+rWF)`4lo7YCw+6kPU9qr?&IDRh>JMC4PP$mK~l_B zVwSqG?x1!HF7^f^VQ-Yy+kDH#sAD+PA*l7WHGNz){t^O*#fuadU1u0Ef=3#I0WO4g z;VbRDwQy>}<<~VquTFwj2@4M`7#tHPVY*Hd!^dV$aD_s+_Wl zZwqN}ziSFb+5M>t}v+e$0EkP_WSI!KvjkQ2ocvqbW7m?#g_cIk<`ZICi zC;ed@_QOGrs-+>_Q6PF**Nfs&8rIIXMLj`d5A&_iPtt&Z#-Se$W#?3(O_)TOR@qGD zo=~%?)dg>*B2j8l1)fw4Gptgu;{uZe*HByaEZ@$;^a9SgZlshe)8Lfn5nxROw8+&r9-!#2wx8Z!)|#gi){9Sw2_Et127 z^Qc`1aL=fV=1wgyoLH)~OKfd#beb0$Vzb@YUcV@|8m)_U?%Kx2dez|-GZMf%rhb?k z4dQ4ojK}KQ%EGhM+V)vL^lK5r4MSbT!O9YMBxT?QfyqEulyILJU7_bi zyGjz#X|;_{Ts#2!5h@jXLBu5rpWtFQDF8W*_`}q;@}?%vM1x?np#-AzczV1+5u0ZB z*%0bWDz7t1x)uaDgq(&0OR9ZYPasUCoEnEADh8U(hN)FeG_#FlKqBhx#9?z#AEhZq zt0XY_hJ#Tbp_ClGIL(Xffh14J;e zy>SK){U~Sx(d4v1t0w(|H=gb>+_w+9CpQnhxNZx2`j1;(zNiDJm8s`HVHS(kB_ zEQSVtq8lv*g!>lFp@3O-l~lewF(M|1-a^4`wYxbwm0~ z4Hi4U#x(z@rctVZ%%s5mgxo%A`3OGx@?R%j9W!K3D?{2KPqxPZnJZ zMbf1<`Fmu{aafdmp}!f{Y&4_5O+i;Aq?nqZzV3Tphmk-4l*!hKeHe0zkE9%sTEONW z%{y+?I{dUetV1_N;JHzcvJ>cbrx{~fw^%stj*^bYMq!G054wv=jZCRFQDMX?{(Aka zhxq}_d)ainPNN8512O+u$^tdSoHZsqtYj#T$#n#+w;`-FJ0ap>y&tsXY@O;cc-<5Nq+XT`CPrEJi#A{&N&)I}(ueGHU0ojdFjK}WRU zvW|vl@Wng1nTOXWOo%N(0pQb0ANjj1kIe&X(jk1&s!$AY;lR_HNOfqp1 z0DUX0L}W@;l@NpBIUE6{7R)TBmd;^?+pHiEV94>)3cda6&{A4t^UPK|fh!JLmWv?? z2A(GHT(iRpke-Y+GS`XxJ$6VmvCg+5r;cI|`hpV&r}_(-K~0r3B6-wlXU!s)3Z$ydz%paKKo2^DYEVYKn6KcIASrqqYW>oFsTTibK*h*bGywU12@Q z$CyGK1#i*hPTECIuB+zJoa|BD)LUwMOcT*ECugg6k7_lk{ewY!H#vZdpp^blUWR7t zHYI$fDxQqMIa&r=YC@AMpP4>sDCr352BP3ep^9R2XNZVcnmadl3#oV<^id((L+o<8>Rb=>k|3(QkfZk41gSXJAyu2gx!9@dl3&k? zJ+w5j#;~^gs0=6sBeJ>BL$@ir{ipHg*%r7T`2=hc9x3% zTby{9Vi(=m!$rB|gmg#qMK$qp97b$u*~{`h(Wj}flF3w7nFqO6;k(TNbP6nsjPrTL zo+n?d$eG~GHB*of6e8OW-3s2zEgF-i%#f3A$_3iB)0o!K3tt;4WYiYNYR8-m8IvV}?nVFMw zC2OyfvBotFK+0N zU58tD0neV_De!n5QCH5dS%-wEofX*gdj#H{q>Ej+soYlFx{Kp&?(Qbgu5|qD)@ACV zy(C|Y;Ky|xL1qSSs*mmhzes*@C253lkwy@qdXr7)E<3YF@&m2BTr0sxaTDIHxOErd zEh-WKF9k<&6J9TF-DPLq)r$&OaESRr3Sd(<1h-RMyX?%mdeM?X4sZj7+3-XBzOUg> zjN=t8<-j?VUjRJP-+dgU{&2jdm+`cVe(jRq11buS*qMFxqRR?+{BHX7O1yvJAoYj% zsfklW_E|10VXP_Na$!HmaP_^N=L(yg+ZZc6bbx^|L$VY}HR0ALGW3aegJ88|dD+H5 zEr?#-%2+7--tRINW&@GH(nqQ4(Z53T(WYyNZT4-z2u}-Hqj%)8<2!7M@b5~B&j*q4o0xKv;34XqB4^?EU z<&GOCCMLo=PasivXy7T!KkXfB2E;X(IS(xsoq-=&N?%U^=xdQ#67G$1eCI%f2rdIG zQ9sL3w+|qxXVCQQcOds*_HTHQIf5X}LZ%0J()2wFLM6F2;12-5By5gmq9Q}6+j7*c z7ez5gjib6|{kkgGj<@fkq9c!HB5(~>gDmuizqo$n3a`A26I-09#lYiGqTdxZ&ZXve zg=ha7PNVS8u5hQ>6Q0}fQ>ZD+wc<%je-ZE=jiR$UCZ2bNqDNhppDu9?M1rrm!b>0E zG~u+q69!8^8DuyO_3i&0Vh2p)-{$5H7|+fDaNy6D{z8PP$A6-exxx&b0vXQ2$YX%A z!lx!iqR%fTsWWFU$1sxp+uekfZ9_S(P)aoCGM@L9|D2eJdMcp&A3%68ix9Jr$?yY! zN&qi>O0W*j8uuyo*ncRnpzl>f;1X^KuD*!D@`$zfr0v!>9ifAczN3cTlXD!Fl7r)K zH1U?|KNQRwKToq~px!n`k|FOX$_w33Z7~UL9GH2$BzKcx5BWyRzOA8@S7_MPx6d5CiQp?<3O;-FV9DGQt^;5}Y!~){d$jaY z#KWeabWxDq3{W_;i;9KnLsn1NRKpY5>j*i7E)veX0@09Z1%6>B{rkWyoc$R}9STl~ zwxh7HX%>>M9s9}7uD#CpS;r>FXZKltUXoikW`dy${lPp!DD~f|+X)jGcp2^XD7nGt zB4WesVjv12M7xDcnAwCN`jLlBTXeXt;NZZk!K_pM5+rF+?4UoQ6Ho zpVe@D2*#rG34h>p_|Z#HCQRINXTBBtvt&6(l*nNvGO9#eO2n%~YGq_#2%MET zHK!8ah4_JiQPL%@V-~Av!Sxho4V;kaT$#=R4&~31X&cf9259smV#=8;a|nR6!eLOP zHw_b4GxB(?OwFKt>|Bsi1wVxT9z&cb&O>cMU!cQNvVNn-JB9@CaBn)=WXXGy_~*&8 zr3`~2eH|~`s+5fa(W4;$kUTkRSd)x8r&^vY3hXdRO?=f2xH&C(#m=+BKgH2~bvj`G#EU`qbA(1*8qa+fV7|fe4PzZ> zETxw3=AtawS$~W8`1!8TJ_WFsGDC-{b{&`_4#BXfJ+GDKv*YbusG4P7aKtk2meCT+ zJSTjAnHB9?mg5RL5wY6sNI4J6W^zUjIN_Kf$u0NfSiXD@6e40D02X%MgCWm#mn&QY zwSIwm8RUZ!cmt!78zp-w{2pO`NQ^W}`ZRY^7+2WkUqzpMX6cIA*y{_H=7m&M`|Zb!+GDan;==mF;d~tH|~X zB**M~16;vK&k-r-?qik>&OHP_sFd^o!SREpkTHn?0fj8P2#%jDXQa=0k6~=% zCleDYXowS0zXIzr&MfCImRqwQ^OFg$-wP&SbRC*Gk5_Cb;e)8wxl@RnWw%PXxfH!a z5MBa!9LzG?1T!$W&IuJ|IeQh1oxm1_*Ov8ywW$)QkYrdg=Ur*Yk_S7?BRkB49q!n_ z3pNEqt%3t=Ry+`FH3C~j$0%c=8Z+^l%6XwNzzj^SJ4rT#HBh6~bfS?GwIec<%z49J zs`@XHK~<+7Z21PdE+^)d0bOQYyCN=Ki59KHK0Nrtj_i}I{x zT&MSe0?qjm^m-!fe4KY=_#m~%-{;izrUOWT14(-T>Uz@hjeW9Yg{i4p@H>IZ+_F0v z!zw+)t+5P`TD}pv=k9(ErG!BQWU^4B5@x>F#)&kyh0SSI`b?_LAqV!%tZ!Mp&9J zVU(eOG*7K6ldf=Y4^n`d=4}=|s>x+(k3?TzCR3QGiH6y5LZhJ}m1sVw*VFt&(ooLp z$kDogEu7tkCsh%$dQX6Xnmm<6--zLU%~?s*5JNLtC($*hmx$(mnnXKEM^ul`2!8KD z{-a6iUl&vVr9=}`Pcyg@n>T<+{%g5bL~mS)0+srn(oj1|OVo{tvOt5!X>Vr|O5&|h zVnajW7+*M@V{15u1r`dagI!IpZS)L^ygeoPFa}Ht|FlvLVX{( zP|ZP#9~5zNRAmJK^6DYiYPvsx$0i+*-8vo*>UiWSJkZ;%rp*aFa&$aeb#$nmDElbU z&EYwloRG*`wp_`IBIP7CWTuFGF14CHN|cP}WH}F0;(VDHA;J+F!+v-jR|AIn_3vpd zu}4~l6NN8`e6w(59w_EVsH9yWh&C+Y3RC(V;Jtz(4*4cRUM7*LOf*IuikDEP>rhas zIFyBia&$2-(rIqOa2e4=O3?#}9>yXF* z7573&iQ4!ol~aRq&Pu9Q!oGy0D&aG&WcsiZPAYM92#FvS+8`ydg(7 zk*w>nj!?UkXcDp_Ync`Gz}UW_MpwU`q94+rDtZ((urQ0Sa&CFa%t9%EW|)eZK(@Fx z+YScNE3uEqtE$j|M0Dyn>?*>Zs$i28ISCvuA)L1gbjlk|z)2;XCkY1=${cDFy*`o_ zJ#sBbzD6Xllwqm#T0NPlq@sIaE@r6n1PZxDr_SV-*h&1C2$4Wxr4cl)_GN@(1xmaT zB^CG*!hUU$P7jH?`YRqfM1KLC7$bTK&}2rm=SAhGM9B1x_EGm847H*5%Eo*83r zieAvslT~#yahgkl#r5K(RlSn1Kg9O4+Fuf@Y9*ZC0w<=b$2KIdDrUAZ;wH4kFbJdl zR3vJNN^EdOlU0?(RjLY^lDUR$#OZPpEUv0aJ>@loouRKP3Xijsxr7s47+2LvfF^6z z2OySdG0)6$?$Xu!0VZm95D1yi)l%ZRVN^zM^Nf$}8))rAhJT%oL00b`Wa{|smi!{b zZ-?X;PZI$R%?|CD9b)>IN7KJNO#gQ5r=rx|9WT~9qnIHkEX#M^#U-+ua!>%@gy_O} z4zI>{>Us}yk+k%POhY8T7efu1Lj*MOKOBcV8kdg7rH>*#c9_q=_!faw0FO(#t{aZt zhK+R6BB_1fdah!1x#!XmEAeozolk@2V-boym02X63c~;=WF_qJt3=AWGnV$l!!#(z zQwyk`UQ+i`8z`KFIwAH!-6S+4PHeAEY$dLWcv`UuTN68$_H4vfD4@*UB&s4dDS#Aw z{W_uG=nCOkF?$#KQVb!UkQfqSp+d;w2o;OLnnN+QpVf#K6%)pe`8VoFFi#30QD68aSeaB8b7 z3Q0C7fUI7{o`KyfB+z9hGj8gbqv)7Nv263k^u^eHGQRJc!){wjMJrt|Pa27mE{IDn zM|$jc@DW55?ychuF(1xGNN<(sQ0WQO5IyKQ>P155Kd}JfvfN6$6;@YhNGU6k4ej!A zq%dDa#Ik9QW21hfv3V>F#+HWDXQQ! zI$0&|5Vc8MIcmA5s+&&MUMZVeH%X(fo1BL7{UGk2^RzO1$@eO<==8l)UuV5ub@KMc z>orN)`gTartG<4U4ybN4UW#;9Zvo`%y9IrsfgrLEaEWEyZq{YkdvuB3Ug%r!v8rPd zwL>j<>dV*(ys;6JKu)w-vs4j!5Vdlw&Hj5vY!9M3QJINstQs3?fLJzL3%{zfuPmW-ka1@y zsgf3<<76)YC+>DYSZkM5L((MTi#TOddQmBAN}Y*%mn$_^>`|$Ru7+MJKA{vc1VT<| zJiCj)uCTo)R^Pvz9Mk&Vg5=a*LCtFs%iz{H23+>U;%g-X5-^s*$~XpGlZgy+r2GZ3 z)D!73@}q{yDsPj-w7a7lJod&CdwEApEILn8+heKwK#%Au9Lp#EDT>T24W;<%j8VD?WW?&p)>V!|SD|CKTa zv->3OwMlTvHFLgq2;B7&cTo~t^28i>qrkmX;-)6SCBMsY^9An28d0}D7!gWENj0pd z;f>>_2;ARF+#e<4-rkG0SI~b;`GeW_N%WhOpzqY7-zU(661^-D{RYhML3V$O;`=|BOrWtrtX zEk7F$P`%WJ{nTC_ew_g|qrjPJ~7RD{vOq7TVhvHMj<6J?EOY*EJY;?gX9W zoS5$F8#lXF{3ZASRB|gF(gMe8uN$lSJ)Ok7@DO&ERq3&i=_eK_Ab=*hKBWN+`I+6E|Ej;JHF ze#<*d)^?}~$5mZ>mPoEP-kcPh|g;Gd6t!EP^k+g`=C^41j7+x{;9s0KMr60)$P!D5Mll zE`?3|MD)Z&c93`sX1-=8Np~VKk$r3j4weu(CNLA(jete3wGju5VIk8H6*7o}LLt*! zM8|G|PL=j1YwSCj8aQX*P+&TFD^g+JKJ~nE^l9uTXz(G$eocLFEq%*V0%-?m3eEaX zrUa(o3YDKTm_`5=x z>EJcy!6J$JAFpqZWnLf`r)qA_rDHWXFy6N!&GPx@P)ZmbHv3~c3U4sp?lO!_jJgJA zA6$iW_;Y4jnL5Z1Z->LQe$Fah06CAAUnL|%fjjgb%m?z^4Eq?&-bs8yQ!;8*C(Ga?aD+Rq47mDjaapPZB&fgEt4k0~uGuoKsNB$V4Teb90DZNQc zZ>O|JOTSC$E0HD}dGYmFf8YuoM62rcbub1&^%q`O!_wE`%?FOVLQlIwzw?9+SiaN* z14C>525^{vUnFP96}Gxo{I+X`2Y%Cu+hf>^wB_~?>ee@G08ZYD_ku^z{h|)o1=`ph z+HdKv6pZcwBiCTjBd*~$Q(cCmo=~0b09Q-2BokgH?8(I`-s)VNV^0C;%78sZQzg-a zJOw!u+1K92Ia>PPL~ghww`9=!ao=ly4Ve3)_P)_y1~>PaE(ErrZ^GO?&wl)X(ZZi> z4on2BmPecnkd&RNmVs{&Z>&V5(+i#Gd)MF!SDQ|N4%U}?qU+VZKbG!aS-m#q9aRC2|~W1T=NJU(_1r^P}Oc)?-iCryBVGFA&X6mSj7 z1B35hMH;Hk#fvi~1v$}s!3fY+KwY61qIV)Wgq~O9SnpUzFX_-bI(=_1SB{y5XQzP8 zz>9$_*Pwq7YEExcIIeT}KD+OL>2-J+awXBJc#{xE`38->xSs$^=xOw5bPXB@uj>q< z&Ie470hunmdGTdCf_eL0gBVrdtR6s)2gAU;qprRalWzSwey4AGyLVGu}1o+XtI{GVhAnf9k+{de4o$j7C6t^y<z;t9s|oMqtu9jWniJefg`mHEP@JAn{T0^3EBNiNQ`$>sj9&TQ133+STDF+ z?x3Yf-$|RLALfjR-7+wW2qqVfJ!V8ap${>m@ECrDwebU<(6MMOUj87CTzAu`#ByUe z&GN`P^u95VA=-Bmuh^J__m^0HZU8>$%R+nIJAOr_H=)jD7S~?)yhxehpa)8G>>>Xj zO$F2O9}b1HfbI^Bc+yV-(`|8&NL9y3@cX|`OpH;h4fUNg2bY#u9*HdoInMrsa=1y| zO{7-=0mi!RN>uZJlNO3NuW>#SgPE5C7X3ZqVuYjdEo@l%6~-dl8deS>=)P$sw1Pq0 z1b&v!KMmTIs6nr#|9y&@C~sgNqJ@VZh554RPjjdN=v^^t5kCH3i3rb}7*Su<6aIMR zot*d2K)CI)m0#tFdx-DX5Dj*KCpAg*vyx|^gGQ}d4pe!q{3qZBT2_9YNUj74*=lsY zD#lJExfoOm&s0f=R?a5cr&oTFf{WF06~mm6kDpl;G8{PvTxXr+uPKQahe~**xqy!& zlUI7+TIgCwbuTgsBV&^QrSV1NZ~;Ri=g+W7ZF~^F>Vo?{ z;p#hJcFl{1ia!pmMdA}%U@^Vb7EI$Z1fOsX91k7CyMtUE&>zH|hw|N_DExL02GaGU zJ}Pqj4U&(XC|rD2I0eIEXn4n~$hPhHsJM6y`Y-ixVXDo-RBx81x*Hjm&vW|}rutpN zBvTDusF>;GnJAr`={3?!2P_l`n|f~G!dm+IhGOUl#wy#ju8C2SM{lpS++G8v!d9PD zZ1tzv3gcH$Drx>l(q8vKcv_Fxu2t>p_-Z3u7ri*D%M=Fv4mW7a!1c&fjJihU{cnP| zrJr6zl}623jDJVi^sl*1TLvyg{`mJ5dsc+ZP#DGA>tAMI{tA+bu`2uw$zCfU4nSbb zmm^U4=`8(GP)0vK4$49x=nQ!mGWrfqjHRexVgC|54zpIK*F*f>R$B25X8shGIFY?- zE49h&elkl8pG#cfg^zR4N+*J$@RW()xk67)`~e+cDvT?T?g|&f5Z|L!=CxLk1pf$L zej?`!LEmRx6LS}XRE%#*d12FhpcEb-h=iVjjR&XT6-pg*$ zArdl!7>9by6WL!6A{I8iNX9dm`91}q+0XEx7?YA;B3sAv7tqDT__v0*eTPjy1|Euj zI%whkksC-aN+ni5MBYU9WrF?9#1JNRUf8V*w~%j&}_XydOSX7}>Fc-VhHM_7z5&c5Kg?l7hE6 zY39CT1zt~2$1+NkH~uVXN%Pk(L2voFV+N*Sh8)Y!-D#-OyuLB4bTUGoLC?XwlCV9) zy<)@@8s26mFS+8mZS;z9o@d3u;OoR$w>}WlMjIB_(fTY>;tBJ%8}LTl{$;S(9haAF z41U%XdM@fj1yJd0Tn$%4{O3gRo2YmP-pvlI;5#G6Uf1Bw`|`%&toP-)R{S+EM@(>B zp<}c@_{hqKjo0YqH1bK;`5;Ll8bD2AzD4r^yg%%u;vMv=zAN;r;CfUgx)+U(qSm?_ z>{mi0&%9x`A>y$7+?$3U`;37@?!gk46S%bREofrKSD}fKyrv=2g=fVu_FcNnso4Hm z@m!Z)7u4rs^g-pL`cEun47& zugPCY@}~%@Qa8R3;4uuxw_v_(L9B@n=4tJH+ME_QuE%IW*_S_FghNBnCGBHYP^%we_y%h36x+}^yIzmqcYdtWhf5n6r_TX_h z6hohf!$U);E%bB+zPW(D;W5KF?PQ$uRpTrfM&Gyw_Hd{yG}4t`lIk#fR_yJ9K*P}L zaPT#$9gpFK;MDPB)bkwFEPZ=tgs;XLAvh_#Is+UJ<5LH>{RiSGmkX^9C)n3~6AOzW zEX{;|ukpH8()Utmt0SlDT-S~^=!kAhRIh5t>JB%r;vSsT|~AxnEfCUDB(r9iSp8)F&V|n z)VgA#8)7&RvP#_!YN~@RdLI#@YWv1ks=k$4fyR$c(pMd+igwXSUr}t{&LzQjyhb`p zew_d)y@TLFzxTOHKa zdF?(d8P`O=pAld26N_{ee;o;3#ou^atGMJM#O+7g&he-%r%M_FH3WkNu$e zM=5_8jmTJGFC055%Kq$GWB-!TK%GE)6}1L#kIEIbZDv0$7d$2(LwGXAdC|JARL3_)IM zS2XV9xxGj{#_U|-x9+2o575suuHkW8=y2$WzGs{WJ)8byAamfU$5;ti46MbF?Fzj^ zmic8IHg^rbV+$P(y{9LM!pS(&hb{fI%SBrQ_ak)dA$pKy*Mbbiwf_m->a`owEd3SG z_KuS@7qImI2&jldHcLOv?;Sf%;Nwq7(3Ti7C_Zol;sY;Qc1~cmz&Fu}-4oI8qE*P; znxlRiERF*K+(^=w7LxT)KM|Fu{z50mNh@-7CHkM}pO6(ISq94au#FU#z>X9Z^e*In z=SEZDA==+SPqZ#=0(;BOU0@b{F{##-72(T(9I_z3?l5Lr1OTFW@K0 zU*J0|++~DLM(^dT<&y+~+i-<|Mi?(YMF>$R)~5q6>KsY{emHa6q_sic#$g(SN}PkRmNDNYRcVnlZU7k4>!N%EJ@S z-@%xVjm-y#LQg*dTc(LA@m_eebE1&)4zp;PG5D9k@iOOz~C{I zOl^3;a(4tXpwO}5w=TrDdd&S1%fP>&*w8TtpSFK^2pJsjTNn_W2m7B281WsRS@_(9 zxgUFfx6v%)cu$d1qYhrab!iEt8M{8V{85-ZmH)s=PV;Mp=5mxrc55b@WuTEJw0_|Q zfFN;eR6_C>&I07d4Z-!iev^Ug3f(L$hY#6!L}Cr(7K|N56{7`cG2**xp3-H6N!%nf6WWjjwDxa|7JZwIoPs2W8cY6m8VUXNgl0M={e>!-1 ze*|@XFE}SO(l=_r7WB@ys3QUR?(sk-_HDP*=)2U5;uM|OF^1M+{)U-p@CHf#dT4|i z9$kN_6R48a7r}}i1YUf6FLr_!2^|Ly-Xb5ZB`6rV85Q+THmry5Oqqy~} zcqH%D4_`o^eiO9skJSS-5Fy;{gxi0syDsC_L16L2VF|BI3|-}{fdUm1PGX?wHx6H{Q-k;oaR zaDN=bobc$8=*z=L{_`a~xzkSve@G9D1ICvQA9*J>Lva}7FAB(IMd*i5t!d@4V-%9! z=D;!ple@WO;IZ@So2d6;8A9JG;7gI~5r;+0$N2zE=P?x7&=7bGk60eWgJ76r+FW7! z!3F`%;KgR_ZRtnAS{AX_{G2j#pNf_MGT0x!F%zE@n-0T1z~;~>Kph|5qu^Sst&qlb zbk&#levr56%ZFCIWWq#dg0%R`=#j{Gx-L8X+L6eSSN}NsMSx!!?R~=;n1)&NN3q&~ ze(?NHuecizK;k%MlFlaPeyM@hgA;Ram0`OKuajZ946l-5z6>vr;ZzxZvRUwXM}{xU z@L3uDLWU2?@H;a6k_>N^VUrBk$*@$0`7*pfhErwuPQ57iWghbVxzN+mYG@HV)q^wK zuHn~=c(M)!V;7O0zdgF1F?GM0wDft?{RHABg#1u0+;aF7Y3PfWqxhGJx$9*4r7~P5 z!;57&Q-*0WJYFZ{eN%?Nm*JB#d_;!#%kb+myhDatW!NOcbuuiK;W8OsEW?>HOq1bp zAC<4juN;cvXJ2vh+Qq*_M&ny1_IP(0=uyN$I@UUcx-%*9voSjWoL-)r<;O*aM~(ao zQD9{lk!Qp7`GYf_V7P!Q5R{H9!x(vR7MJ6N5kiC^n0&khr^D|}g0DPNvdr-lawM`|sXw+ue0o;14g8_%E#5N5jMF752y687Y^3{^eC|RLr!??Duu9 zocxD-M_28+U|{^3!$o#5pY!5JudTZD^D~b;d(IL&FUR=iDlT?!p&g}w)A*`yeG}IT zrTn9-9zF;`U&yz+UcGU~Lu>xB%EJX+Xg^W)`aj>j|M;r&7rm65=2&PqKR63j`*0Nx zZ(3wuwe&iObYfK{3GkJL_J#lY?RS6hUC-FX zg{}qm;a`2v`N&^V?dKeM_QR@sFSTW}B!xn4dn+o_b4AI-N1dBzk` zPTG7a&lG$4W^3(=hv(Rj9V$a?iXD}B^~O7=+j%{|ImNCtTiqG@9rZ&6m%^9?(kc2( z%8$bzs<+2r?3U?>3`gSfN8{4UVM&F_Gx9W|lKw~dKdgb$miCtJW`Cm;V+p_hvg(h` ztYe4q)m10|JRVu`nST-eanD1mSa(ZXMKF-x(7ly8ySh5MY>oa_f1ss(i>;}p)z3=t zW9tq!H2Ax_n}V&a+eN<0Kd`{ov%t1}f$hcxwylV5MRY6T^@!IaUXS?p`fUqroh^Ze z<^{H{j@DKVY3u+g2l5!fd8EqUwY8&gfsKcY7uebs*aFR6!ERu04tBLWTkAW!{f!H3 zrC{v2rV_>AcRO2P6BWJ?Zf4JSJ`>?7`*-aE%6ere0{fTkAOG+@^hB@lJDA_fe7gv( zG8|p?%&Z^IXnVg>=5LU277=)6nI4hzE}zHL>~2^;P3c5JhC)wgf)E94dHoRy`X ziuLoDx4tXTQr~K8?da~dbu`(!Teh^fG_~M=2Q>I?d0tONRTbw{-4Qq?R<(-7Saq}C z*5&UGwgznYR|J8M4qJCyeQPUX{2vkcJCTX%_#16`HRUCW6gBNPw0CTiwc~R8+Uf(% zsBGT6%WZSJ>Ax4u?arIKWr1z(mU%W?UY9?xwZ3&F5*R>#{mY4oOx!o){vz&sa6gFq zaolCl%eIBvmKD)IK?t<8`E5=0Ev>;W|K(!jbu>0YqHf#VPFr(*x2?Uy*3wqL#lNuI z-w^<~HUl^M%vV zZEgvm9dGpO@fEq0|2LqdyFb?zP~r%CMf}8s2#?+-L)o7gYv||}ApU#ew$6@i`n04w zA?Xx;M=e>0u=3QuxCiw(Cew+~)H^q80_D)I*U+ z^&7ncLzPF$r_P&I{*sf#M|(LXL#-Bx@Q ze8ytaH}8v0-xrtOAD6C^{)oxzu190(hvL#K&Tm=c(m8SIg1GeP=VJML%6#HFoq={3d0m)r7smM`-yD_Ypu(cRJmSJ1q$%fGc?fo*lL z1%7Swb{o9Pn)M6U!>gc=UXSiQ&$c|jFu#DY|5JJ3{O1WMeM`aVx@kxSJ6# zKzJqYPQ>j99k>ICdl4R+$yh()6lR{o*qw+|=*GPZaSFHKeh~3agr0Lz4&oGkfbEQo z?}>02hv{<>r*IrQ=F1VMa2p;PRwGW~{>vZ_;uJoNW6`~cQ)t9f@-HGzVKwf%5T~#M z_kD;{_#@oA5vTAe+>aw(a25Xd2JVB1cOv{f?h(XC5l-O#BjRioW0P=?B5p-E9rqiE z+Ylbd9VHw)V<+gQxP!4pxXs@Oe}wnqwj#b8;lJUYg?I#^VKsOlPXEzm7VbR6Z4@tN zYyrg)eg=05;spqcaJvw<6AZTpaWBHzPW*o(!bkYx8vF|%#77bKy3sC(Q`mYn^n-XO z!u1};?m@f`;jeJthxiD>iZbXDaWBH7xc4JY;jhXuA0ixt@8Eu(;0RMH7(0x(6=5~* zKO$a-@XxqM2?t@Lm$A1I??m_z?)MSjjqt*282cD;8^ZOtjrW2U;d{6<5NDOJPuw#o zUd7nO)zAy#1qgF%pew>hcpP^T;j9CnYhj}VM_9dyv0B7;A-uo`IS?O0SY8KNC|=Ll zPjL4jz8m2l+`WiL5I&8&AMp`{FXG;b_$b10++QS|&8P?No?R%n0d>GVf;fc^+=mhO zBHW6558}ND@5j9#@!bf|ZA3oR9pPNuL-(@3>16;ngVDf@t7QmT4Hh%A7^X9G!KAvh zPLtOdNf}9(I6F}_OWj=*!8B`wK=2Vk;u`$(v_BEW7HgHaJ zF|($c4fyJkHzrSycQ$cjiix-yWO#0tX&@^#-B8R@3aG3R^yP^OL)MoKMU4HyaLDlU zRQBuCG)M$FaweN{cBZrGJ*a>4BsRq`gK=In%>y%gOl(@Skxfla+e@4bb20|z++|_2 zcTQzFJ(+Aqa|V~+M)F%HnXElVmeHKb%wLst%uY9D?=&(iUW(6XPSN1;b($ve39gST zx{AkF;7S{&rLwfukgyK*p*kryKI<^KGOfT=XY5S%rbG;rO{U3*(o$0kQtEgcoQj^{ zus_acW;&a>GYxexu_@3++G|P5q4GCNIF~4VzTS`ICxY^KOwMl zWVk?vt7TX#!)6)YD8oBtc%KX-GCVB9V=^>9DfrKl;W8OsEyHFRcFM3{hF_K8Lo$rW zP^sI9Oh;vSLWafz0%MvC=g6=~hVq|0u}Yb)li~F;49M_S8Gb>AcgpY{8Qv$uhh+GO z3?ni;C`0`JHh%q4hHuL7s0>fYFy)}Y%aGwr8QNqha?##0ZI_`(hP5)>CBx@sXnaag z7Rk^n!&Vvg$Z(Gg-;%%kP{A6*P(u6E z{$lJbnDclN@U%N>>H2+ZpV1w>Nb-*f@u5?+*Ces2IK2WS@|xi_OR=_wsd2e z;Pc_hN5J2{l~q%`W3#Ub8o_a2q*@y~+PCt2#_Eyo_6L0Rot?hG_D)z+gMb9PQ4_IC z%vd+`)i<;?wzjjI5Nqq+;`8^kK)yldYY?%gm=F8O?H!E$C-XJY|G{N!t$`N;1+}q; z6kkU>N1bG>-`s(1(W%CIzP)&!5eAE0S;j6g3SO5Rn>xE%+5=6@VQlL1gHxHYX&X!% zv73#w;Z4~6#x{RjLnqqn3&u{qanIOSjGe&%wot!m?DDsDYz6-JjkM=p-^$p}jopE+ zR)0Ir3{b4Sp{VBD${#hy;{Z7i?qXzg}-ODn57s(enyo>O6s?0Gfb!p=)4+(6-y z&8S0zuL=D8^=$`k`uKJchx4XgVEb8d=w>!OSDQ}6--O=r<06-{+U2yh% zmNwuaf*)@Y=AJ!GaUt+8J$w8T!mrEXbz9y7QBggA5p_?_3H?4<9;d>;kDcb*SQRL0 z=m-W_pNRX>S&}NHQqx_B)Lpf&y1?hGT85P=WAAeM)^2wag(jhGs0QUyACwH*6Eo2l zdU|}YiS7=xJf7LW!kY_-FNo-{BY!pioi zEk35S|1oI?1Y3do%eW1_zrO&x?`#I*X2Y8D8e4JUW#Yl3ZDCs=*zRB1(9z{zj6{7` zL-WdZ93E(|w=LYF{8b=JxtrQM7Pd5Eb!A)Fv>DGe8*xx#p_q99g3RtfeZvh4@qCje z`W;;?BR_wU{;#{MVG*V&3;Bc3MS@ZWi}M>;@#UMa%-FJRd11jO`8X9({Ug@GBTQoJT*udM!}Q-CNl|O zGFR|lkvl1lQV16dG?>*iuSbg2$OUce2+~S0#cWh!Mk9{y)CX7^)<Uf#3V53Wzs!(Lr6}-@?#|Zw04=gv%9Vz5FHR*% zzpE3VqZ`L(Sc*gBDP-85;Na2(a9jQLu=bR-i5V^Jl;IT_X;@`$ZoL8LY*^~jbErVH z5>5>T=?Ipu0ju^FKQrDkVZDcmZ?cVnCWt! zG?_Djllm9bE6vwfzrD3(OEWCu#+jVd*VrA{+*04o(r!9u2l4XJ8K)bukY#B%a|pML zVxzPS17Y0QUXNXlv|G+y0`O#w=S%}lQZ2 z$n9cw+RG-qoz&jpQ*x1lf1yP_p1pPXJAF8%*3{DDEA-I`FP5T*6$x0X9=2S-jF#38 z6eX!lJjK#1!FD<<>2LH=E}LZ8%KfQGnJul@qvFz~v(y5}W&Q{){SG2lmijt^$#53f zO_8#8GjpxsJj#~vty;!IA|p$w73E-?XUle$k^YkPhBU^ek>f~z*>W><%chY^(qEZP z$}moA@4z~AOFK&+O()HpS!yl_G+sdNW<}{Qm>(oQL2+KsN2knK`XA3H9&DOOy=r2I1}nnL0a5SRh`bXsw(u=Ls0c06z|yS({&BX1W0S?_Z-oI^4YRmy8M3<@ z>H}~dD#KmH<(&lFfnhaztj>*Ut8CF9!IT1e&QTsMy zH}D3QK2zk(Krt<3s`c&uj$k+UHH7BxX6fe$lpI6$W}MdrDRmN-ey#w|GGsULUUHsD z+mHq$mVUlS=OPXBX6ds;I*;%-gY9gQUVwB%Gtw7`bOF-*{Ac=w0#F3e&;;;O>2m~R zxgi@RV(&fuGXij>Asa;!AXfnF0syn0D*z?n+Ez~(7Yl$(0Dy6c0C)`95R)+S1i&i* zz?dfh)er;+Qwe3hfYeF|a4r>)O@?f2X~LB>kioF@1p-{Bftyf|1%~se0UI?a+^<4# zF=aK!W(lIpD5n)w6C1ecOAO~;gih7TA=r&(fXpFCk0BdgsL>awzro+`i)pnYAyBWx zXzvIl!&)Y=`VA~~7!J}*1(WaMUem}@UqhS&$%AlU3QPS^0a8!rK#*r3ZZda*$>bKA zaSPkI+;H*bJcFF9$RIy0bFVPWCHPEEKr0BSrm+PcS`L=!-!NdRf$^~x46AF(oxZAK zm$RhC>Ac!{e)TuJM&Py-pnLE-&7Iu~eg~a{5kzl@g0p<@LC$iBlCz)p8Wt zQjcQ|FQ%&6;qfq|hEZ0ru9lf}X=hnQ2YWdPmQi9Hd)Jd6c^W&)p#7$PG3b$^_mKI z`5K?25-g@@INr(%PsN%Vr>~}pvQb+n%h0l&UUx!vrj|`r^*9}%nW_Q3HB~NO8CMgt zXkg;+L2DtGSv7D;Ma^mjoTY&k>BSsdpWyM z%MomW?yK;^bcuH{w+EYsBb%kFx)M4;D_o>yp+`78ctONTbzg@L&2gZ^3ZG&{Rcwxi zPwJ?0xJub)VqwLe>JpY43tL^y=4ucjXsN>k4sZ)x($!^dcCikn(&_ZFOEsvow%WJ6 zV9D~!s3`b|^6DzKK+9eOYpN8Ut;$zLnm|YMu!R~10c*+?je06zQZNN~8SF3rR9IEj z6|haJoI#9~%&@H#!tDhNjWs#sxcHpx=pTfM>Ot*xkJi?vKL ztg6ho8-2FtZ<-krQvuA0)-Y=s6EHdwTJ1Dq?l33n|Nb-9*L<*sp5 zyPTEm3Jof#3KuUgEpzyaU3k^1ie0JCu3fxz*{Pa+#i@XbSXju-=ddG$;Unxd4jDe`14<^o5YY3vpQRnwK%UQ9OQRQ-%Ru{4o z4YJWmuA#OX!@5tDRbIlJT0T5SSq0Q9yCk_ZR;p!}I?%y|>e(6%taHA;^_A{wC%)vU zj=bD4l@(u3O6~uOM&Xb+{`X7>?N0T8=VBph<`r?APitrHt2b-@rVHIWD)D zbd+gXvO=UjR<41CQF|)nFkHndv^+AW+G5w5)yx|UM2!mAH5!cSA?%&}7^~EBgzd?` zfI*0|tF&x6Q-MND+=Oyz~p03G&(IdO4HiGsY%=J)K&?T>ZO-nKW4xvq{>5j-O4=Nl7cjO9h;} zqY@J?8n|N9UQ(Z&I!Y7{TD}_lFk~PcSWEUU=7&7Jx@x_{E2o1Tz{SR~RTA5QBIR^i zOn|v)n%E0cW|CBsd%#^?v|%B{(yvIFNes^MHR4E)4+lYGT<(*J$(CwQm2XW&^=b#qkyB2w zxG^cO6^RUs$GOG<$H22PE&4$Y6GZsm>IyGqVp@nq6>Jb)pVC$f-Wqkt>3Nog#=cT_ zCHgmIP7}4O<>Mr0J)L9l=nRW<9m*#Pp3b(c7Cfskqr+5Q%Q?qVRwf0_QDjlc&eaK| z0?(6Dsetn(03Ab=HVf6S){2;|%U6jmu#`Ef*7~@ZT*M0nfX8hXbkib@!$n+Xo;AmU zi76H1D~8ckVR-orOZ@??fUnyA9j(r7&&yJOjQHfn%{@Mt2e#$01JPEGCF)A^G{T~s zWkqp$SINBYtzAXFMAB6vd#1Ll#!pCzjZSRVrM->kg%))DVoVb-wDOjA7stTdOO`K# zA!;WNfr>GU zS&ZeC1}S&C93ISz({->atk*WIu5_2Iabgjr;kq1E>z$aJP0_(tSCr#qiw7$u4X?`W z!BmCIo~Z+`E%(6oHMF(mWiWp&UA1-t)frtN0p@e8t6f^Sm}Tj*iXG+Xk(^?h4(u*= z5)7u|hElOO(wHe(RnAJthn0~o3llaE7DXCljgy9jnL5bYWmxZM2pF?4La`hjXzg;W za&#DFC8dtC!U8OEG~ntIlwF8*O&n-3)-`dUC0NYFfr_wz(SfQtuM6WrihmIp-?d@wjudbOW$T3+-$7JNy+r|^lZNA z&o?+)+8a9PfnoyIWPxQSAKfuq>#;t>C!@D=UoLuUX8LTxz(Yv+tdT#%GuB+==3Q^f zO?<>i{U+g9O?1dHfQcRAla#pnbP)e3Q$T42N~%! zrjMS)Wz4ru!vi<-4M6-nZYw?M;xl!R8?N8SG8Sds3^<@AG=Ep11ss|~B$+GHC#R<> z?>gsvn?RQnsJ79LCkOvOz6@E+nwDjlW=NfS{?xfsr_+NJLzZE#dHR%8^Z8~g#*vg< zHf73HNa8Wz#mqe&4_9WgRP*Iiu9&i73MEYzAW$T&NC#ha?v=3SN!jcY1ZIQ5Jsq!< zvGj|;VG(TwN?a515V%va4VRoN&@xQCpv;RQ&Qzlz)qK?yDngV=d@Ok=Y8LodF9J%| zbf8R`qGeCZ)Jd`&Xwx}{NyC^SF?jieksSko9%jar3p^_KoO8gKDwb2k){s1ar_leC z_&dF}LGBcWmoJ&Y@YkuC_%&d{Nw0eu^oK1FPkP=0d(TZRTNbs@7|t5DZ^2{j{3`yk z7(AqMmL&CkW|%W)%Z7sB+AUiOR(j^lNim?Hdr?RV`!*F7Uv%;1iWTx@F)&)4)EVkK8FWcBC_$!V~WyGUQjQ}dN4M9xBM&{S8T(cjda-%P5) znNiS+xH!5k;&M_Y5;(h#hw_NS6Vmf>0i|c$@S_4uPYDz3ASt9>j07xw%jVXFbjF7AkW}&-820l2as5B70XoY?A2dOS?6GA`GVg*x(zQSY z>Ul8bJfLH$_4X9U)STYb_Nms0W2$+tMEpnacd3E1a94W&w@CHz|2^mH=un}f%CuHwxHSnsKx*g=ROg|&cbx&p4jfEPbn;vcNWmGX zJ_nrMGvIs^INsCX&})JCq#MIQ1zqX%k3A!&p(5Qq3!L3&z@1C{g{H-M|D39 zj^b(Ykr~C)Zr?(yoQ3eXo3SI?E`07F_|QR2u6b&rB-i(WV^?sPqE$gf5@vxWmQ>Ly zc?qG_M7D}n3y>wWngmB`m2@ezN;-+X6s?jjg;o_$q~R&r_!dB7+@U_0-_S{nb=RY) zDP0tZ=<^6v33=Y@fJ7=4iz)(4^bX2YVjrqF=sU5h;XJ5xig;D6QpyDJM**Rd15;zK;FPF1D4iIyMnHPcK(#}~QK;?$guZY@C8Qc`_|-0@tUsza3e|b2 zflZ~lNFzZ^q4KCWMCJ1Z8k&3sjQ(eh=I8O*7nX_MtwA0D#H~UUI}|!33C{uh=`rOg zc4(7jry6!?>XMj=c9?*|^1HO&En0_cBJp}065=zL(pJg8YnM{@=YZ1+Fext8Ksdxv zT!f=|l77U23LLVr*h{f_DogMod1A{WiZ{Vv4?@8wHeZn^6Iy=&IH!___!I$W{~7pH z0_Wi~@aY83h{`9nFDvr=3^O|b^>BtsE3e85|`p7$lJt1xF_Kt1&6$ZhNF0iYRQ@EkKP8Hju^-{Q2LKlh~g!L zR-rY+hKnIxOfxH9A_6FBFxiSj@e+3A^Y${tumBW2S9%Gxl?|N1-|H&QN&`= zl-^AiE_&qC;Rwp5n^Wg-}B?+7#PvG32z1!sC15F^jh`w}>}CUEv9a6XzKb5R24dlEP|CU7oF;Cv#1b3p=U zdf6$a7Dby9I2#i<)2qE?`ZB5`@l)%}Zz&S60 zb4~*1#stm_5;!l=ILkevnJ^47p5m#9n67K?53z?qQNT;bcoFMBIbLV}iY3d7mNC_< zbLf+x>QtyW;yqM8TOW;~`T$g3K}gmstxm`TUWVTwkMyfuiK7e^94ojo z%BY-^tw!aVh;~oJ2!bIy?ovjOX5c{ikS79g=FjML%RQ$he=%_C)OyAC9YqsY0jKi}IQ3+Q1!P(9hs2l#0O>`@wLt(jKxM%&G{{|m z>_RQL_f!3tkeS-zF!FG;Mt6Ohw&(?&XbYOB$6m@zIEoU4t=eJ{kW&2EeZUd6O1_Rb zYL_zWR%^jOFfKHpU@5+(5qyNL`r7^5=%Zg+Ybkcf3eW88&c+T&Oi}kFeNfuZ7gTuy zc*`)@sYxRw|1q^Gm&b;-P-+t!J`S7$i6d(LG$0YE^wc9-Pou9MU!evg-n+2_1IUfA z4HZIVyaqnIRnCd}`8VLiHtVOc4XdgjD-{-VDYjuog@kRKdW?G> zQ{n>Xlzxo+I#03vbU1Ql7eQGR!B&tmgFkDRvOm>2cf};WE#J;~?uhB_FAuAFKLl!}l%XdosRq00j&EB%iO6 ztVTRAQ0q%A%O11Q4mMKS1o7yX>$HiWX z#~y_gr|gxoHxVDvo9w`jn=MPNQtuX4hi>6(>MShKG>attf2DwJiPR5p<1dNAR2*%L z<5biyNQT(!(`c;VbhaurMyo&J$4Do!m!dHvaD>KapEgz|W&C9dNe zO6dPX6`V#JRPqYo*cBXA8-j|oF(Xzyr2cE#NK#X&4VS77>Qk|oq7AF64eEO|j%t^p zjki>7i2o*q&nw~E1FABZ8#UcsC2ZqVqh~E}yiyxN=k0)$C~eBn-RL_v-7XbEa@+_U z+ft=h668)m>@hg^0zzY)uyCrWW}c`Vzn&*Pr@>Krw~&xpCk(abN@@{&n$}Sz;4rO~`ZV@#1RW^sdm`VI3gNO6gor9fSktO06U;d^SgZBXui zeHBorlx5h3I>%nhOs`*UWm_x)Qc5e+?wn|4>H#!g(Jo~b&NXfS!*4+wbyo^)B(nrUdJH%=h@ffpARr`^2KhZ8Ba)A(_+J1q$Ka&F@VzS) z%@gN~0XeEdl(rD^P>;JFtS%u$_4+iHsY+;Ysq{)jX^Z<%g6MHHH;TQKwxHFhXbZxL z?cs`^KLZ?L;m~s%eeAYDWv0|?8*5@RoA)nBJ*H5nh-<1SU@As+Od z5bgRj^3d3XzvME@vm%;2gc*A&`dOpO(}`(JgI+zHpd1nk{n(P0MM(HZFzhJTp|a|~ z2@v{UP})Ag7XYb?fqa*!VjzzL(rMRIJrBt47|5Rhu{rcO9|BSr1Hp?9jICC161Dn! zbWSvt?owL$Y_!^Wx>lCs#q-dru-+sVF89934+-n-fh2f8M|UYQ@8-2YE2~e$tQf7y ztEiBr_kd3fq^J@3F_2}?qaX>9c6cqQM89alcXV_`%jh!FAue(#sRnF2b9#bk*J_D_ z1^`atoQ*KO5{H6R1AR;~wsR;ojVLuWU|A7&{jFMu*lv>YK#h=x{00;ecikXyEP$sP z?vBe9$*mHHRynEMkHzv)`qvGrp0#%j6oyLOS+UT{>HN?Csbx}`)TY#uqD^0b$tC(S zYEx=S(WXmd8;h9WA{~)GNtsP2y{rk0l=(*9S+rN~S+v);_4;Y0cTxRa_+lSk5ffJ*^&Ka* z*BSJ~aj5Rp(_*i`nSNxOKBUTw|KuCjrd0CRAak9RIayn%|B<*<)=OQ{3o5F`hv*C! z##G~PRtwqViqsa&jVXr`N{=g0TQJEQP1#>nt)(}SkJQ*NRE^=^mBeXG`TxjuYtP)u z0*CbT-`@-DXaQ6oWu3Yg)T%l>wbyc~I^<(SjE)qqeo(KUB)#B!WKo{8&=1EUnK8YL zyZ&bOBir<_Dl`2*>)1wB{>SyMvyfTfkj%G&Bh4YS>u)Brv{gEHD%!M8D@4W=&(?Sr zZCZU6ZTgz3AAe8hV$GvbaU6osR&nMw6*#1yW+|x_{LSL3LD55J zA+x|CnSTL_*x~4JCbRToooai4%u z+eZJqiPdTlq5`CjLry=*5qm8qvP=nNUL?WVKw2NmK+|m@- z9boGLmfgWYwyV2uXWs6PcYb+(EW4Ciq^7Bxq6RrcaU|sW52RWyitLs~X+@ijglf0l zHZ*Ztr{xbU(UdBvLJf6Yi(388J@>x*?wr|Sd3G~GXx}&I-tXRX&pr2?``+C5Gxtyl z|MQ{g$2`NZWLk&}$UG1o#R(}96-0T{S_HjbPBfTdNW{KI zuxAB(uVDWfn~43IU|%QL-xTa`2=<;t>{kW*8o|CS z*p~$R`b6wk1p95QM5r8*ig~U(eMzu?OR&?s&ml&o?!wQ%CD?BXcDkSIwP)y?f_+mW zcDk45)jW7ZuwM}D=LCCyBKFII{hDAuFWAot_U(z-mj(M3!A{RmdHNYTBiMH)Vt+%h z(=S^*uJl>K{$;_wFA@7C!M-fm&j|Ks1p8Pb_KSl3qF_HM*q;*YM-s7rTd-dc?8gQB zq+p*+#C}1rpBL;+!9Fh7XA`lX7wl&RdqJ?L1$!+K`^$p;j9`CKuzyOhFC=0=C)iI3 z_MBjUK(L=k#C}$=9~bN+g8g0G7)1kUO)+s@GWHh)dsDFQ5bW0l`*VrEgpaFiv#hFzM|x`o}dKbE2Fn0EL;9Q%m1yX{O25*1mSUxlvC z?q)2Y&Dit+7ZQZFkIjxr8whwHvyT4vr0fpW52L=**L(ek)qs2#eSg*Tz0;njea&*T zXRcZPHC75K4L)m7^OCJcBb#Cf-YaPAkh!SMpM(^b)#CWi>aZU$eZxC=Z8GMbZ`7Vn z`Y}5UCsv_D(lhI@!%nHOpMQ^Zi2X5T-Uc0656=8TPcL_|AL?HfGW2W)sxo8h2A_Ip z^~3d$43gOuY;0$wAF>Ts4=y4bJF$wpx6eiTAr1H+Yh$M){j6+b|KsaNzX3a@p42Jy z{pua`^L5D7R-qrRr@MZ}J|z8+pXWKavVLeCywe=~1O!&P2R*Cbn1)|{V;I?EPd8`r z5-j{~9X0zt{HE3+_1zyUy0UX;GU|H=88dgf+6L#RTQ{M&X4m(-(UjQ7W;d?Q1{v(q zX4yh%t2S@i_Nwsw=bSdUh3QhHF~dHz4-H;HV|T^=l3+h6*t3Ftjbk@{<5HJ#xAPsZ zujlOV|9?!=8(|wfrXAK4*6QGsX!9Lpwym@KY}!Y~3`lQwBG}gn_LG9WFA;l9 zu{oiTjYT`{KAB9aVAs=?WwxEPws8+O)Y?9x zUw4(uEZLgvdOCQ?w#OprQ??ft8EV4djm;a)e+09Dtq$iy+cPb37OCCe`D5(c^yMgr z?d!ZR@l&)qQsC=RduX2ojc?l@Bbk4I4DD;tx1G))C7ElGc^NV=Jjkr0{|WX!KY`3X z-FK4duoq{a%LNgYHZ|Z;xgH2JVr+gZRqU-qtNFdd)*Yf$!TAldPqJBfo02GXu3ctZ zZ@c}Z&$P=7F1K@S%i5g*I^`fwryTTvi!_76_-u&vosnMxVq*YC4gukF%&;4;OZ^VX zKwYFCM!p8b&K*Wx1419VVq^)(5i>fBd=H471&mywQd`)18TnZ>c%#SlAdr6JGg;=B zft)dYXXI%hH@s5M0I~a!Eb|p0^r2tmF!Cahmyk`6B{1^mT4pEC?I#2}EU5seCgOXi z!@q)zjeoe*KLWAQAS3?)qz5(QpQ-u2kKv3Gug#wTV(k!Ic|IAK?~V4EQlEtko#y9S zxDN<@xP|oBBq88)$RZHltF-l;1ai*P&-1#TzF4XAKxjs~dfouy_x+!N*ww-4r+_(# zQcgebP${T^Gyxg>9FERTrth8RKluPIJfzUkxSMwMUyGPA>4uPEa`ZW*4 zZ}XRcT=ZnV3S`V<|3e`3aV`87kZVyX^Rn<1KcPfg#ZS@e)jIS%7PsE-qLkg; z4^t_Ap3QRQQOZWJ7#%ujU_T})YNqybn~y?f{WyDWMxF)I=OJf+SntO&uK=NsYxB2( zT=Z=I9U!Ght0eugUi>l|Lk!Tcr-AJBxE=-KTX-Ib%^jG19>`5khhGL_pGRVuuL0o` z?fMMY4}sVn50-fc$Xbv6J{(%z?~O$-kRxc4v&_!`DS15|0%CJ&uK5rUK0(g1PZ8qP zQv+h})pDud0x}kjGK5pV599{Ebe8Z(Ku$z`52kQ16Xdo>mO!O`0GXahhLHaS;`icy zyy4THwo0=bXI$YOVDxc5VGJ@p5(2R~EVubtAU0EA-;}`4b>^tz={wh<$32 zk$(bm*=zHUfWSIp?fEYtOJ;rNQupD-TKl{a#G9qs?B^jMZzB4l68EO^K?!FmU@Sb1 zWgv4EGR`s&0_pK;o&_?AI?zbduVYlRX9-^dVxLIl7JilLiEJLHcHq}L)2a0y`)iO{ z2WlSWiBcHWz_H0={~O5kd$w@}2wA1G%pU{cUw8JI7QP4M1RBD9hj8j6aI^NgL2h9$ zkhA#H+1O`+^ylI}VH*(pGy<1;6bPnItW*fZ#w0BB>p)&I_eS*!Qlu!Q-)r-4LuS(J z*B=0>d40bC#Gb;(H7^6fzgXX|;Bw3>brZ;G&!Rqx7mm?=BG=Q;0kQch*SrS^pI2#h zI0l4vL3!Nib%6nbI(}~1$~*y?(@{^+uv8rgecb4r1Y-9A?#1h>>Xm%Cmf~l>Z9OkS z=2T<}RQ@#}Ha_GQ{xy&tp3K`o?0q7Zc^`;Bg7^PC5KkKq0ombc;}?ODR-Fgf4`hwU zH3#IXHwS+M$Z@Zp*MW?9$eTdyv$EX6w}H@yt{8a_NFT18#y*0_7J59}_zVy}57uhz z^XAb8*XBb&ZlOvy%1;AX&@;|*Jp<&N*TS=;PYFAINc!>(_wz^K=f#1y5!HNH#)rOnVIT0yVQ% z6@_Qy=X>Ju&(~3Eb5x4j@uxs`dYZosgwM;hJ$)a@1+S;Sf}=DxdPo+?n_kV21MxG3 zSs>dZJ)_M>m8i`G{BQ<3Lcz$SD0>21lOkH>idOAv5Wfwb&C8iO6w%5iCE{A>-nC&S}w8Pv$3(>G%4+{y`o& zH=EKx=;M$qkTcP^E9765DrS>ca{!t3(U>Z8h^;+ombI}689pQ0TKKa-UPUP$9jwBo zu!86UF4CPV@;qeDdZYX*kgHKCYU_7^T=qui8r2+WjAY&e(i`=HkOw{$*BBvbAQ#bC zXFpjWOCHw~KzwgA2ZT?yxBdD}ASa_X&znG#f7eDb(|F@O@%4B*{4rQaZ34l0l>;JRJVtPO3&)&9`~ zd%vJY4@~5CWwUA|v-|K~wIA>Q&Ww+yE(Bq?PrOG}<>~DsQoew(q1_?sfubC2D(F-# z4||n8ty!#A>>+4^#vHt1jy)aTwaXq*jlYz_@$d?7EiX1OV-(LV1`A<3{P;vO zJMc)Y80N#HMOdePe{H>$Z>AJ|wH>;uvhmO@f{p6&1A~pnf_h_kATtk<_*J_qP(F=U zjbnz|q7%)*pk5CaM<>*1A-lLWlfi#OnM`pZvq+V7{a)6>RfxhdI96sLjc0<1Ts7-K zvDp}n$l@&-QWMbJbY^_l)*HYZloX7U3b$PpJwaoGAvAuKSC{l-ip;xO-O?MOss8l#lV}XW83EmLDu`2lW%%1V*~+G?1=r zcQIL8eB|`GR32CS+gRD;LldJ&UP-r>bRM+0egy9dMc6MNJ9Z4yG{X24i8r%f|E^@fNC`r*-v^LpJW6sVco>5QA1dQj4rzPbCV!_H+@&6KKB zK}i+p<=eEE86o^Ctag{ChI0qURd#eDhh?1HqMmPIAyr;fCAiLcUT87D!h8#f!J=8V zs@1t7#W(aCq1c!Ct~h*gxmF6xVFk_@UWtys%3c4`CHi*vD zLVB~hs<$fiT6Ppi*bz{_jv}U@A=>iD;J~)D=$9Hld>}WvKcmJbGKWVFs_{(r;4lwu z=D>)I(o~lM2^!6Ja?u7PtJ=B+3 ztlj8K|G>kku-sC7ZXf-nJy1$@4jfE;TJ9M~BiJ ziBknZp%7JoFSQX6o@Yf1dA_$Kil|(6A`0Z<=M+CgtaxNWJw`D<;=)mins*~;j#?|e zNvS=>N?|Nx45ICF_u>IcEUZ%ZhHzindF`pzcNGdaE1RYRTeJIexC&!xt0}V(qG6C3 z%S5e8snN!PYK2TRm@0*%mEl&sj@haOqI$zhtBm+x&t9CmR}boo2!hLZnlL}lDBO>_FPNsH>{Ci>4mpd8%4s57#<6GiDJ~%EaLebmheF}_9$tI zYU7)G3bS|$^B4cm;n=sZ^zc>{U~qUw&|1W)8hjnvI1*dgxE7Oc>Tu7-4c!)GP6>1a z#+#+bibxWJ(&5Tc%+J(B*gRZeZ&rvFsXfIKY}B-Q)ifhI^UyTpMXI*b+CX@0(H%+| z^-yU~&RYYjbMmQ_o6#7DY|v<81;YwLgR+Pms!ZX~t_GSL(qCq>kcY+=gWDA_T0?YP zEj2O-PZVZYt)W*W(-;^^r(KF@`+@JKQrH&cp&GbD#7cU68pUIws!mg%@^cg!;D99k zMX@@irdyRr3(+j_OVDcp>PXIMtjobuSaFa7G<5IOJfZ^15VReTTfhS?R(IT~5d?kB za2SrR2%Sg1Ru2Nb(WuLmw>?%~>}0ItP%Eq>&0f zzA=#%nre&~3U4B+Fm55*$FtU16WV46fow(FUp5Tp<WNgp)L=|y;WS})N3|w{4 zxmAZVAiEtI*<7xepX2Dp3R}Y$cIpJ~G?1>NJPo6gA0Qc}m<&D&LlJjQG_)%@Wmr#G z7apqH-l#Qx9*&r%iAFzz74?K~Em8q*8`mr=CPjjk3>;pesP~rfUOa^3)@`*% zE;tm>b7fH^Lk`WiJf|lA9sq2|&44Hxn9t`+SlJM+@i3UxC~qq5s-*UaLhpG;-C9^c zdRoWWV)(Ha&#VW9dkSB@@?J)T{H`eTPAFKVmlPj zC2bO8B?xELfPRL{28Lu9axrnSWVta$rP^J0f|^DI{fx7Ngq9yXfs@(>>aiTuqpIM{keRif-+3wdRRQ>n3e{P??ym z9z}>?oPJHe0L-;*glkBb*qwU;lOIOx*W`xs*RBD1ZaO^Zyw^ZQbvQ^2yw{iyK_6y+YHgvg&J+drpU$l z0jYTqnrT;bm;80N+{0QEdknXBuT}xEWJGrtekjS_tJa=*SeP4a@0LSr8N9a^HXX&O=e86L|h$A-xyjlZ}CGGHg`oY4s6*%VaorAM^ zHuu8cOR@^wzQead_xd4)PFrRsj&)NZt`4*ZF|Je- zE0xmfXbP_s(U5)9Zi7o7@#q!Zt&W+2zb5DbcUFX?n{Hy8NVZ$J+-(n_Q|No=w1N8R hbZzt2s4@K8Bpc{7qab%?<*;hiDPL^iYV$^^{{ze + +#ifndef SVARS_H +#define SVARS_H + +struct sVars +{ + double x, y, z; + double xPrev, yPrev, zPrev; + double vx, vy, vz; + double vxPrev, vyPrev, vzPrev; + double vxBody, vyBody, vzBody; + double ax, ay, az, axPrev, ayPrev, azPrev; + + double yaw, pitch, roll; + double phidot, thetadot, psidot; + double yawPrev, pitchPrev, rollPrev; + double yawdot, pitchdot, rolldot; + double yawdotPrev, pitchdotPrev, rolldotPrev; + double yawddot, pitchddot, rollddot; + double yawddotPrev, pitchddotPrev, rollddotPrev; + + double m, m0, mp, mb, mdot; + double vehicleHeight, vehicleRadius; + + double tb; + double vb; + double thrust, thrust_prev, burnElapsed, burnStart; + double LQRx, LQRy, Fx, Fy, Fz; + double momentX, momentY, momentZ; + + double I11, I22, I33; + double I11prev, I22prev, I33prev; + double I11dot, I22dot, I33dot; + + int maxServo; + double xServoDegs, yServoDegs; + + double simTime; + int stepSize; + + std::array, 26> thrustCurve = { { {0.148, 7.638}, + {0.228, 12.253}, + {0.294, 16.391}, + {0.353, 20.210}, + {0.382, 22.756}, + {0.419, 25.260}, + {0.477, 23.074}, + {0.520, 20.845}, + {0.593, 19.093}, + {0.688, 17.500}, + {0.855, 16.225}, + {1.037, 15.427}, + {1.205, 14.948}, + {1.423, 14.627}, + {1.452, 15.741}, + {1.503, 14.785}, + {1.736, 14.623}, + {1.955, 14.303}, + {2.210, 14.141}, + {2.494, 13.819}, + {2.763, 13.338}, + {3.120, 13.334}, + {3.382, 13.013}, + {3.404, 9.352}, + {3.418, 4.895}, + {3.450, 0.000}} }; +}; + +#endif \ No newline at end of file diff --git a/include/sim.h b/include/sim.h new file mode 100644 index 0000000..4e09f20 --- /dev/null +++ b/include/sim.h @@ -0,0 +1,10 @@ +#include "sVars.h" + +void burnStartTimeCalc(struct sVars&, double g); +void thrustSelection(struct sVars&, int t); +void lqrCalc(struct sVars&); +void TVC(struct sVars&, double g); +void vehicleDynamics(struct sVars&, int t); +void write2CSV(struct sVars&, std::fstream& outfile, int t); +double derivative(double x2, double x1, double dt); +double integral(double x2, double x1, double dt); \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 0000000..3ddc22a --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,48 @@ +#include "sim.h" +#include "sVars.h" +#include + +void sim(struct sVars &); + +int main() +{ + sVars Vars; + + // Initial Velocity + Vars.vx = 0; // [m/s] + Vars.vy = 0; // [m/s] + Vars.vz = 0; // [m/s] + + // Initial YPR + Vars.yaw = 0; // [rad] + Vars.pitch = 0; // [rad] + Vars.roll = 0; // [rad] + + // Initial YPRdot + Vars.yawdot = 0; // [rad/s] + Vars.pitchdot = 0; // [rad/s] + Vars.rolldot = 0; // [rad/s] + + // Servo Limitation + Vars.maxServo = 0; // [degs] + + // Vehicle Properties + Vars.m0 = 1.2; // [kg] + Vars.vehicleHeight = 0.5318; // [m] + Vars.vehicleRadius = 0.05105; // [m] + + // Sim Step Size + Vars.stepSize = 1; // [ms] + + // Other Properties + Vars.mp = 0.06; // [kg] + Vars.mb = Vars.m0 - Vars.mp; // [kg] + Vars.tb = Vars.thrustCurve[25][0] - Vars.thrustCurve[0][0]; // [s] + Vars.mdot = Vars.mp / Vars.tb; // [kg/s] + + sim(Vars); + + std::cout << "Finished"; + + return 0; +} \ No newline at end of file diff --git a/src/sim.cpp b/src/sim.cpp new file mode 100644 index 0000000..cf5b224 --- /dev/null +++ b/src/sim.cpp @@ -0,0 +1,403 @@ +#include "sim.h" +#include +#include +#include +#include + +void sim(struct sVars &Vars) +{ + double g = -9.81; + + // defining a few random values here cause I'm lazy + Vars.burnElapsed = 2000; + Vars.m = Vars.m0; + Vars.thrust_prev = 0; + + burnStartTimeCalc(Vars, g); + + // Deleting any previous output file + if (remove("simOut.csv") != 0) + perror("Error deleting file"); + else + puts("File successfully deleted"); + + // Define and open output file "simOut.csv" + std::fstream outfile; + outfile.open("simOut.csv", std::ios::app); + + // Output file header. These are the variables that we output - useful for + // debugging + outfile << "t, x, y, z, vx, vy, vz, ax, ay, az, yaw, pitch, roll, yawdot, " + "pitchdot, rolldot, Servo1, Servo2, m, thrust, burnElapsed, Fz, " + "LQRx, LQRy" + << std::endl; + + // Start Sim + for (int t = 0; t < Vars.simTime; t++) + { + thrustSelection(Vars, t); + lqrCalc(Vars); + TVC(Vars, g); + vehicleDynamics(Vars, t); + write2CSV(Vars, outfile, t); + } + + outfile.close(); +} + +void burnStartTimeCalc(struct sVars &Vars, double g) +{ + double v_prev = Vars.vz; + double h_prev = 0; + double dt, a, v, h; + + for (int i = 0; i < 25; i++) + { + // Integral of thrust curve + if (i < 25) + { + dt = Vars.thrustCurve[i + 1][0] - Vars.thrustCurve[i][0]; + a = (Vars.thrustCurve[i][1] / + (Vars.m0 - Vars.mdot * Vars.thrustCurve[i + 1][0]) + + g); + } + else + { + dt = 0; + a = (Vars.thrustCurve[i][1] / Vars.mb) + g; + } + + v = a * dt + v_prev; + v_prev = v; + h = v * dt + h_prev; + h_prev = h; + } + + double hb = h; // height that we want to start our burn at + double hf = + (v * v) / (2 * -g); // amount of height that we need to be in freefall in + // order to reach terminal velocity + Vars.z = hb + hf; // starting height + Vars.vb = v; // terminal velocity + + double burnStartTime = Vars.vb / -g; + Vars.simTime = (Vars.tb + burnStartTime) * 1000; +} + +void thrustSelection(struct sVars &Vars, int t) +{ + double tol = 0.001; // 0.001 seems to be a nice tolerance + + // Check to see if current velocity is close to the F15's total velocity + bool b_burnStart = (Vars.vb < (1 + tol) * Vars.vz * -1) & + (Vars.vb > (1 - tol) * Vars.vz * -1); + + if (Vars.burnElapsed != 2000) + { + // determine where in the thrust curve we're at based on elapsed burn time + // as well as current mass + Vars.burnElapsed = (t - Vars.burnStart) / 1000; + Vars.m = Vars.m0 - (Vars.mdot * Vars.burnElapsed); + } + + else if (b_burnStart) + { + // Start burn + Vars.burnStart = t; + Vars.burnElapsed = 0; + } + + else + Vars.burnElapsed = + 2000; // 2000 just an arbitrary number to make sure we don't burn + + bool b_thrustSelect; + + for (int i = 0; i < 25; i++) + { + // Compare elapsed burn time to each time entry in the thrust curve + b_thrustSelect = (Vars.burnElapsed < (1 + tol) * Vars.thrustCurve[i][0]) & + (Vars.burnElapsed > (1 - tol) * Vars.thrustCurve[i][0]); + + if (b_thrustSelect) + { + // Choose thrust associated with time entry that elapsed burn time was + // compared to above + Vars.thrust = Vars.thrustCurve[i][1]; + Vars.thrust_prev = Vars.thrustCurve[i][1]; + } + + else + // latch + Vars.thrust = Vars.thrust_prev; + } +} + +void lqrCalc(struct sVars &Vars) +{ + Vars.I11 = Vars.m * ((1 / 12) * pow(Vars.vehicleHeight, 2) + + pow(Vars.vehicleRadius, 2) / 4); + Vars.I22 = Vars.m * ((1 / 12) * pow(Vars.vehicleHeight, 2) + + pow(Vars.vehicleRadius, 2) / 4); + Vars.I33 = Vars.m * 0.5 * pow(Vars.vehicleRadius, 2); + + double n = sqrt(398600 / pow(6678, 3)); + double k1 = (Vars.I22 - Vars.I33) / Vars.I11; + double k2 = (Vars.I11 - Vars.I33) / Vars.I22; + double k3 = (Vars.I22 - Vars.I11) / Vars.I33; + + double R11 = pow(10, 2); + double R22 = pow(10, 2); + double R33 = pow(10, 2); + + double F11 = -2 * pow(n, 2) * 4 * k1; + double F22 = -2 * pow(n, 2) * 3 * k2; + double F33 = -2 * pow(n, 2) * k3; + + double G31 = n * (1 - k1); + double G13 = n * (k3 - 1); + + double d = 0.5; + /* + The following calculations are based on output of LQR.m to avoid working + with matrices in C++ Please see .m file for details on calculation. + Algorithm taken from LQR wikipedia page: + https://en.wikipedia.org/wiki/Algebraic_Riccati_equation#Solution + */ + double gain = 0.25; + + double K11 = + -1 * gain * + (Vars.I33 * pow(abs(F33), 2) * pow(abs(Vars.I33), 4) * pow(abs(R33), 2) + + R33 * pow(abs(G31), 2) * pow(abs(Vars.I33), 2) + Vars.I33) / + (R11 * d * Vars.I11 * + (pow(abs(F33), 2) * pow(abs(Vars.I33), 4) * pow(abs(R33), 2) + 1)); + double K22 = -1 * gain * Vars.I33 / (R22 * d * Vars.I22); + double K33 = + -1 * gain * + (Vars.I33 * + (Vars.I33 * pow(abs(F11), 2) * pow(abs(Vars.I11), 4) * pow(abs(R11), 2) + + R11 * pow(abs(G13), 2) * pow(abs(Vars.I11), 2) + Vars.I33)) / + (R33 * d * pow(abs(Vars.I33), 2) * + (pow(abs(F11), 2) * pow(abs(Vars.I11), 4) * pow(abs(R11), 2) + 1)); + double K34 = + gain * (R11 * pow(abs(Vars.I11), 2) * G13) / + (R33 * Vars.I33 * + (pow(abs(F11), 2) * pow(abs(Vars.I11), 4) * pow(abs(R11), 2) + 1)); + double K16 = + gain * (R33 * pow(abs(Vars.I33), 2) * G31) / + (R11 * Vars.I11 * + (pow(abs(F33), 2) * pow(abs(Vars.I33), 4) * pow(abs(R33), 2) + 1)); + + // Matrix Multiply K with [YPR/2; w123] column vector and divide by moment arm + double momentArm = 0.145; + Vars.LQRx = (K11 * Vars.yaw / 2 + K16 * Vars.rolldot) / momentArm; + Vars.LQRy = (K22 * Vars.pitch / 2) / momentArm; +} + +void TVC(struct sVars &Vars, double g) +{ + if (Vars.thrust < 1) + { + // Define forces and moments for t = 0 + Vars.Fx = 0; + Vars.Fy = 0; + Vars.Fz = g * Vars.m0; + + Vars.momentX = 0; + Vars.momentY = 0; + Vars.momentZ = 0; + } + + else + { + // Convert servo position to degrees for comparison to max allowable + Vars.xServoDegs = (180 / 3.1416) * asin(Vars.LQRx / Vars.thrust); + + // Servo position limiter + if (Vars.xServoDegs > Vars.maxServo) + Vars.xServoDegs = Vars.maxServo; + else if (Vars.xServoDegs < -1 * Vars.maxServo) + Vars.xServoDegs = -1 * Vars.maxServo; + + // Convert servo position to degrees for comparison to max allowable + Vars.yServoDegs = (180 / 3.1416) * asin(Vars.LQRy / Vars.thrust); + + // Servo position limiter + if (Vars.yServoDegs > Vars.maxServo) + Vars.yServoDegs = Vars.maxServo; + else if (Vars.yServoDegs < -1 * Vars.maxServo) + Vars.yServoDegs = -1 * Vars.maxServo; + + // Vector math to aqcuire thrust vector components + Vars.Fx = Vars.thrust * sin(Vars.xServoDegs * (3.1416 / 180)); + Vars.Fy = Vars.thrust * sin(Vars.yServoDegs * (3.1416 / 180)); + Vars.Fz = sqrt(pow(Vars.thrust, 2) - (pow(Vars.Fx, 2) + pow(Vars.Fy, 2))) + + (Vars.m * g); + + // Calculate moment created by Fx and Fy + double momentArm = 0.145; + Vars.momentX = Vars.Fx * momentArm; + Vars.momentY = Vars.Fy * momentArm; + Vars.momentZ = 0; + } +} + +void vehicleDynamics(struct sVars &Vars, int t) +{ + // Idot + if (t < 1) + { + Vars.I11dot = 0; + Vars.I22dot = 0; + Vars.I33dot = 0; + } + else + { + Vars.I11dot = derivative(Vars.I11, Vars.I11prev, Vars.stepSize); + Vars.I22dot = derivative(Vars.I22, Vars.I22prev, Vars.stepSize); + Vars.I33dot = derivative(Vars.I33, Vars.I33prev, Vars.stepSize); + } + + // pdot, qdot, rdot + Vars.yawddot = (Vars.momentX - Vars.I11dot * Vars.yawdot + + Vars.I22 * Vars.pitchdot * Vars.rolldot - + Vars.I33 * Vars.pitchdot * Vars.rolldot) / + Vars.I11; + Vars.pitchddot = (Vars.momentY - Vars.I22dot * Vars.pitchdot - + Vars.I11 * Vars.rolldot * Vars.yawdot + + Vars.I33 * Vars.rolldot * Vars.yawdot) / + Vars.I22; + Vars.rollddot = (Vars.momentZ - Vars.I33dot * Vars.rolldot + + Vars.I11 * Vars.pitchdot * Vars.yawdot - + Vars.I22 * Vars.pitchdot * Vars.yawdot) / + Vars.I33; + + if (t < 1) + { + Vars.x = 0; + Vars.y = 0; + + Vars.ax = 0; + Vars.ay = 0; + Vars.az = Vars.Fz / Vars.m0; + } + + else + { + // p, q, r + Vars.yawdot = integral(Vars.yawddot, Vars.yawdotPrev, Vars.stepSize); + Vars.pitchdot = integral(Vars.pitchddot, Vars.pitchdotPrev, Vars.stepSize); + Vars.rolldot = integral(Vars.rollddot, Vars.rolldotPrev, Vars.stepSize); + + // ax ay az + Vars.ax = + (Vars.Fx / Vars.m) + (Vars.pitchdot * Vars.vz - Vars.rolldot * Vars.vy); + Vars.ay = + (Vars.Fy / Vars.m) + (Vars.rolldot * Vars.vx - Vars.vz * Vars.yawdot); + Vars.az = + (Vars.Fz / Vars.m) + (Vars.vy * Vars.yawdot - Vars.pitchdot * Vars.vx); + + // vx vy vz in Body frame + Vars.vx = integral(Vars.ax, Vars.vxPrev, Vars.stepSize); + Vars.vy = integral(Vars.ay, Vars.vyPrev, Vars.stepSize); + Vars.vz = integral(Vars.az, Vars.vzPrev, Vars.stepSize); + + // Xe + Vars.x = integral(Vars.vx, Vars.xPrev, Vars.stepSize); + Vars.y = integral(Vars.vy, Vars.yPrev, Vars.stepSize); + Vars.z = integral(Vars.vz, Vars.zPrev, Vars.stepSize); + + // Euler Angles + Vars.phidot = Vars.yawdot + (Vars.pitchdot * sin(Vars.yaw) + + Vars.rolldot * cos(Vars.yaw)) * + (sin(Vars.pitch) / cos(Vars.pitch)); + Vars.thetadot = + Vars.pitchdot * cos(Vars.yaw) - Vars.rolldot * sin(Vars.pitch); + Vars.psidot = + (Vars.pitchdot * sin(Vars.yaw) + Vars.rolldot * cos(Vars.yaw)) / + cos(Vars.pitch); + + Vars.yaw = integral(Vars.phidot, Vars.yawPrev, Vars.stepSize); + Vars.pitch = integral(Vars.thetadot, Vars.pitchPrev, Vars.stepSize); + Vars.roll = integral(Vars.psidot, Vars.rollPrev, Vars.stepSize); + } + + // Set "prev" values for next timestep + Vars.I11prev = Vars.I11; + Vars.I22prev = Vars.I22; + Vars.I33prev = Vars.I33; + + Vars.yawPrev = Vars.yaw; + Vars.pitchPrev = Vars.pitch; + Vars.rollPrev = Vars.roll; + + Vars.yawdotPrev = Vars.yawdot; + Vars.pitchdotPrev = Vars.pitchdot; + Vars.rolldotPrev = Vars.rolldot; + + Vars.yawddotPrev = Vars.yawddot; + Vars.pitchddotPrev = Vars.pitchddot; + Vars.rollddotPrev = Vars.rollddot; + + Vars.axPrev = Vars.ax; + Vars.ayPrev = Vars.ay; + Vars.azPrev = Vars.az; + + Vars.vxPrev = Vars.vx; + Vars.vyPrev = Vars.vy; + Vars.vzPrev = Vars.vz; + + Vars.xPrev = Vars.x; + Vars.yPrev = Vars.y; + Vars.zPrev = Vars.z; +} + +void write2CSV(struct sVars &Vars, std::fstream &outfile, int t) +{ + // writing to output file + outfile << t << ", "; + + outfile << Vars.x << ", "; + outfile << Vars.y << ", "; + outfile << Vars.z << ", "; + + outfile << Vars.vx << ", "; + outfile << Vars.vy << ", "; + outfile << Vars.vz << ", "; + + outfile << Vars.ax << ", "; + outfile << Vars.ay << ", "; + outfile << Vars.az << ", "; + + outfile << Vars.yaw * 180 / 3.1416 << ", "; + outfile << Vars.pitch * 180 / 3.1416 << ", "; + outfile << Vars.roll * 180 / 3.1416 << ", "; + + outfile << Vars.yawdot * 180 / 3.1416 << ", "; + outfile << Vars.pitchdot * 180 / 3.1416 << ", "; + outfile << Vars.rolldot * 180 / 3.1416 << ", "; + + outfile << Vars.xServoDegs << ", "; + outfile << Vars.yServoDegs << ", "; + + outfile << Vars.m << ", "; + outfile << Vars.thrust << ", "; + outfile << Vars.burnElapsed << ", "; + outfile << Vars.Fz << ", "; + + outfile << Vars.LQRx << ", "; + outfile << Vars.LQRy << std::endl; +} + +double derivative(double x2, double x1, double dt) +{ + double dxdt = (x2 - x1) / (dt / 1000); + return dxdt; +} + +double integral(double x, double y, double dt) +{ + double integ = (x * dt / 1000) + y; + return integ; +} \ No newline at end of file