From 99c8b58333ac547890b305df4405a13a165bf890 Mon Sep 17 00:00:00 2001 From: UESTCsecurity Date: Wed, 17 Apr 2024 21:11:09 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=96=87=E6=A1=A3=E4=BB=A5?= =?UTF-8?q?=E5=8F=8A=E4=BF=AE=E5=A4=8DMat.cpp=E5=92=8CMat.h=E7=9A=84?= =?UTF-8?q?=E4=B9=B1=E7=A0=81=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ros_ws/src/upbot_location/include/Mat.h | 55 +++-- .../ros_ws/src/upbot_location/src/Mat.cpp | 30 +-- .../USBHID权限问题.md | 28 +++ .../Ubuutu下USB串口冲突问题.md | 203 ++++++++++++++++++ .../Image/UWB位置示意图.png | Bin 0 -> 33768 bytes .../UWB定位原理/Image/UWB高度修正.png | Bin 0 -> 22677 bytes Docs/UWB定位原理/UWB解算原理.md | 108 ++++++++++ 7 files changed, 379 insertions(+), 45 deletions(-) create mode 100644 Docs/Linux开发板遇到问题和解决方案/USBHID权限问题.md create mode 100644 Docs/Linux开发板遇到问题和解决方案/Ubuutu下USB串口冲突问题.md create mode 100644 Docs/UWB定位原理/Image/UWB位置示意图.png create mode 100644 Docs/UWB定位原理/Image/UWB高度修正.png create mode 100644 Docs/UWB定位原理/UWB解算原理.md diff --git a/Code/MowingRobot/pibot_ros/ros_ws/src/upbot_location/include/Mat.h b/Code/MowingRobot/pibot_ros/ros_ws/src/upbot_location/include/Mat.h index f8cc745..0586c6c 100644 --- a/Code/MowingRobot/pibot_ros/ros_ws/src/upbot_location/include/Mat.h +++ b/Code/MowingRobot/pibot_ros/ros_ws/src/upbot_location/include/Mat.h @@ -3,13 +3,13 @@ * Current Version : V1.0 * Author : logzhan * Date of Issued : 2022.09.14 -* Comments : �����ľ������ +* Comments : 导航的矩阵计算 ********************************************************************************/ /* Header File Including -----------------------------------------------------*/ #ifndef _H_MAT_ #define _H_MAT_ -#define MAT_MAX 15 //�������ܴ����������� +#define MAT_MAX 15 //决定了能处理的最大矩阵 #include @@ -20,60 +20,55 @@ class Mat { public: Mat(); - Mat(int setm,int setn,int kind);//kind=1��λ��kind=0�����,��������ʼ�����ݡ� - void Init(int setm,int setn,int kind);//kind=1��λ��kind=0�����,��������ʼ�����ݡ� + Mat(int setm,int setn,int kind);//kind=1单位阵,kind=0零矩阵,其它不初始化内容。 + void Init(int setm,int setn,int kind);//kind=1单位阵,kind=0零矩阵,其它不初始化内容。 void Zero(void); - //��Щ�ؼ�����Ӧ����Ϊprivate�ġ�����Ϊ�˷��㣬��Ҳ������public - int m;//���� - int n;//���� - double mat[MAT_MAX][MAT_MAX];//������������ + //这些关键数本应该作为private的。但是为了方便,我也做成了public + int m;//行数 + int n;//列数 + double mat[MAT_MAX][MAT_MAX];//矩阵数据内容 - //����ľ��� - Mat SubMat(int a,int b,int lm,int ln);//��ȡ����һ���� - void FillSubMat(int a,int b,Mat s);//����Ӿ��� + //特殊的矩阵 + Mat SubMat(int a,int b,int lm,int ln);//获取矩阵一部分 + void FillSubMat(int a,int b,Mat s);//填充子矩阵 - //����ר�� - double absvec();//����������ij��ȡ����Ǹ���Ԫ�صľ���ֵ�� - double Sqrt();//�������ȵ�ƽ�� - friend Mat operator ^(Mat a,Mat b);//��� + //向量专用 + double absvec();//这个是向量的长度。不是个别元素的绝对值。 + double Sqrt();//向量长度的平方 + friend Mat operator ^(Mat a,Mat b);//叉乘 - //���� + //运算 friend Mat operator *(double k,Mat a); friend Mat operator *(Mat a,double k); friend Mat operator /(Mat a,double k); friend Mat operator *(Mat a,Mat b); friend Mat operator +(Mat a,Mat b); friend Mat operator -(Mat a,Mat b); - friend Mat operator ~(Mat a);//ת�� + friend Mat operator ~(Mat a);//转置 friend Mat operator /(Mat a,Mat b);//a*inv(b) friend Mat operator %(Mat a,Mat b);//inv(a)*b - //MAT inv();//����� + //MAT inv();//逆矩阵 private: - // Ϊ���ø�˹��Ԫ��������һЩ���� - // �������� + // 为了用高斯消元法,做的一些函数 + // 交换两行 void RowExchange(int a, int b); - // ijһ�г���ϵ�� + // 某一行乘以系数 void RowMul(int a,double k); - // ��ijһ�мӼ���һ�еı��� + // 对某一行加减另一行的倍数 void RowAdd(int a,int b, double k); - // �������� + // 交换两列 void ColExchange(int a, int b); - // ijһ�г���ϵ�� + // 某一列乘以系数 void ColMul(int a,double k); - // ��ijһ�мӼ���һ�еı��� + // 对某一列加减另一列的倍数 void ColAdd(int a,int b,double k); }; - - - - - #endif diff --git a/Code/MowingRobot/pibot_ros/ros_ws/src/upbot_location/src/Mat.cpp b/Code/MowingRobot/pibot_ros/ros_ws/src/upbot_location/src/Mat.cpp index 4192cb5..8bbf4da 100644 --- a/Code/MowingRobot/pibot_ros/ros_ws/src/upbot_location/src/Mat.cpp +++ b/Code/MowingRobot/pibot_ros/ros_ws/src/upbot_location/src/Mat.cpp @@ -3,7 +3,7 @@ * Current Version : V1.0 * Author : logzhan * Date of Issued : 2022.09.14 -* Comments : ��������� +* Comments : 矩阵运算库 ********************************************************************************/ /* Header File Including -----------------------------------------------------*/ #include "Mat.h" @@ -28,7 +28,7 @@ int mini(int a,int b) } -//��Ҫ�ڳ�Ա�����ڵ��ù��캯�� +//不要在成员函数内调用构造函数 Mat::Mat() { Init(1,1,0); @@ -51,7 +51,7 @@ void Mat::Init(int setm,int setn,int kind) if(kind==1) { int x; - //Cԭ�е�max min�ᵼ�����������Ա������и��������Ķ�����Ҫֱ�ӷŵ�max���档 + //C原有的max min会导致两次运行自变量。有附带操作的东西不要直接放到max里面。 int xend = mini(this->m, this->n); for(x=0;x < xend;x++){ mat[x][x] = 1; @@ -184,12 +184,12 @@ Mat operator ~(Mat a) Mat operator /(Mat a,Mat b) { - //��˹��Ԫ�� + //高斯消元法 int x,xb; for(x=0;x%!$V6Fg$=yjBS;4|NZ!#`LT-__Qu=! zw)g?|!icxPWL5U8ApM_zFFUk7hhg;`1TzcRhXiOR?*IT~Z%_FIsC`|YMm9<65FeZ; zY_eZ^&REmAjHr7C6?dt=8P)y&j&y*JD@j!`$^6y!Y}Bk}{5OR(X;rui9spoUrdbZ> zjl^;MPTH5G!g)B6w~#j4&{3gm>!*hb0O&FCx@R{C+H71=62{VDN#11@o2ee8kS6}$ zY%XSC>2$I;uQCOi6gLHK50gmf@KGJjQUuk=q}18}t~}j}WAEWHb(xA!mqHjX5RHr` zQv$f=Q&3avY)1Ki>k|Tw(9RV=q7tt}W2Mdcgb+x>u~gU&rms@Ra9V6F7t{WiB>q-x zjvToiIdWr|61>FJ{{dP`Q=iIVn;iX>5(xhv`Tptk)Rg6n-8@ezW=lvZwpkMQNh+9U z+-b?>u5&4S{NI|atk^vH8>@2!g+Eg)2uLaZh>`I6R%~%_^MCs)VnSXiV7C@fB*T!D z2=(c4w3E_OUP??{$m7)TZ1w=Z_vM2zOt8-?d%~DKakfY@^TuR98cUuchES%&CLT3p zhxmU+bouFP1S~%cgs{Y@3prGtmY)ZI6Q!(A9nHb%K~w*Q`oDvE46VX}1UFNKHBIc14`AiwjFEbyEa}L`6|m2@Dp$y4pyP9z+@@ zR!qeh}a4l(ZMhh~mxh z;GT6H_#0^&l`GiL*vQw4Q9+Xl%`RBF@t}h5l?s9mFm-Pfx2@Yt z9G4F`x2xi&fWq3mfnb2nkYCrxM2E)wOB^5#Ewum`+gXz$G$zXp{dIHjeX;x zY9VK6Q>-;1A&KJsY8o?wtv>eDJKBE%2-1It0#+1;8P2~uw8Dz2MFU z(fRDwqS%N6u0ww{U`hv`Sa!|{@BbdVr5!il*khNzg;*PwAeu1z%@$u2qh0quAi-=N zBLVMKIzIrQH6d2}QKiM2`l}@<{IkB|JJhd&t)F0w z=Yla_VNqtA>?CXY$puU8C;63-4id#Z0ATkeE`UF+{AE|7J$b_2u3#Wo@3SCsVt8xg z&n$4%qI+AoAeNv5uRDL_Hlb9sTE#e{n*YOcSCtn4&=kJ2VH3F;!hDDRW*{%l5cI*^ zBB={B|2mD7%DBf~lRggH9E_yH4%3L5!xr#!QYbKdK?sD`j+ipx)%Om2f_a^M7ZuK( z)Q|9b7o$6?gQYr_qc^&sKpI0W||_>GE-S=Vi(cT z--(X2Q!Y&_V;XPVnI{)6!DuZ(lWN-4N_?Ez4*+CARf0HBHgD|wFw@Dy_tt}-pGAcf zm%nVtp2*<`(8EN9LU%cT{V7r+)V2;?gR=ZTE(d-~6t&10>-p2FS9V>b?-Hqqn0nUw z(dcf?d?3bvZfrBIZH3_-H3CW>W7)J3c0HWuh{S)oBK%oUPrsuZ&Gt`RIGH|B=l)M) z&B{(<1C{Z-()%Urn|asX?1xWuG1}9b3YCZbNACbXp+@!0qU z$-wu%uC*&xOS%%|p?@D-)lmfPU<9lb%FvmF>$!Rd@JmxPC$Up0c&Rn zBKd;vznA?gFych$b#YCG88?ZF@$mgb8rmcMaXx^aUCnax*4Nh#EO(cb`K8D!r!B#A zuZchW&u5n_*<`G;2u;2=G!fspDAZsAAvb1ob06Ie6NrBshBZw4S1J*R*MoNE@tunb zpA0WO(BPhVMQ3Crok0eg^ihn)Rt;ygiK5Ah;-(3M;^M6V56iA<)d0Yx{4YY_v@Rh5 z*%v$9fBhVMUwmIPVC%>jkgofLM1pUvs>GQ%IypbBxz@2`LMQym1JMo33m*XZkk;4F zMmNgBOoLv$q5&joNwUNayRBW4?$=%!ju)d>J zL~C%V`Lx}$zW0KUFU&}GDp{17iynn5Mg+^-Rf4c8d2R>yBKFC%>`|MsPOx`1G?p~# z8`FJcB(?l7O!_?=pvH3+Qup4M>n-4$clV^5fQRHh(_tuM0%Nu8hxTW{kFc0}dl%_48OLcvd7|9L|Ara}d z)0T_OF}hIQoCQZ}8OPH(q^Tu*2GsGkrF>g1mGBUud9|FcXFEePjN$WWquU&E%Qly} zUiIcQz}jBW&QtNUBDdC14~reEexe;37S5l92|cP*r~!-i%;_NQO7P^u8aT`|@zKHyl`?n(;Av zYuO}YX;Mo&HqKQo@LE2dW8P#S${tYOT*N4Jd_%OMERv(;OhSp=CWkb}$;PmTHWZ ze0eW{;iB}6JWn%$P#b!Teg@CCdR)^3AMmaZ`@8CUJ`dgacw?)A)LC*Lu54|Hm*}`7G4-Htu@oHXEXf6dF$X@z=k`uI0F23y#TghU1WVq42@p{ zMb>kPl)2qx<7YN1i8cD_30$CY?d|=`U>&C6`IW9yR$>6?$S*SkmKT^LBRpx@!{SdeXMkMHXwOT=M0kk9VT3p@^^P zd58o7c_yRHfuRbRzBs?N|y+VkD%OlIcKBi)3$QAh4a`4rWjBbpFLs)|J!Pwp6m$mHN1;3;rQMi)4rKKkq8yH}T+sk|w%z4e{f z(#2yGauyUp=*SQX-hLha)Kdqq>$N#`$gl0r^GU(~pUgDu))Yr9h)qX>(FZAPPr0+;b>(!R7 zZs+x5wn^cIq+x)hxqEpdluBKbZaB_0Gj=6FCcW-^gKl^ki~&^&6lXtmEC_4WQ(kCK z`^d%)^ryeclZLN-0Nn7GMsR0A_Dm)+IQxhCGQ(UAK599;sJh$dcOPBdzjK#VRdrEq zf6K~>z-oO8sMKurj_e;=Atv>=t5`IjEh$WjOPRyv_s|Csb9xLNQD+f@F6UZE?#nzC zDlELLhNkgLb-W_%=)zJ?NHJW@e*VJ3wp`o70fOD;auVs~RTI;jBh(<{1!a{JTnUzS zNQl8%tJ$o+4R||C)N(576q%oA20UK*ihkPLpT}TifM?Tb^f9gqT*cJtb|{VGXIEBp zgMvP~Nid?yPO9!2?cz3u^pKH}znoOGBlx~<{MnWmB)20xm9+VMjnfw-`MUN|NZlU; zFd0T6#si2n% zxb0qkv}Z`_ZYsEVs3ZZmw7ZX9S9YRwdH>p05D`iS^8AdAt>j6`E;DE5=b1o)g|&YR zi*M&k#0;YgqbK^9kqL-r14J(l=8-})`uZFQy4VwmS6__fVj=O(+drrTF5L815^6O^ zYU84a%+dU*Ml%VH-FCSkQ;Zx~r2cqm8g!L|vI4Fq6a8O6tj^PaW3F+2+|Da0{do8q z@riVEaLy8fV<)g=|8fFfI&qd<XDF87(p^fK4Y5R7Cv|Wu+$>q zy?K?Ih|vJN#GgUe{>}nxsr8s9{nN-|klMgSgbMt8TVr7$?tQngV|vjs4na%y?}MMX z`0gBsPJ3I2+Xh<8x$RV(^t|MyI$YgrQ!A&RaADTestLhdfuM+f*wEegFBmm!mlc6NpCn@4h` zpFc$Q-BcMn?U80#y!y$8hqEm$Y4p>W`(8>e4I?!3p^v(i+8bZ@Z4=aLK{+Mgemza$ zZR)Ah+*8;ebRsu8Em zXr4I-w;Cn3oo}0eMaHoZ%(n&^YRrq(s>t?Z9)`ZquGMjgS4Ypxk>F}-d$BRMFJhpb z^r+QoY$sOW(UdH|u4ONWPET7frq#Dd?c?EX?H_yXVuZ=5XsiA*#p3c850J7it;jzb zJ=gVlo@wY+Z2w0N^qvoHO>D_)zXM$*R>s-BOj zQ4^!i8uThTHBzxP36o+L&OOG_r9R;B-(S4N*%B>5yPiTEL%rz>-mA7V|i5wt0N`(!xRpbW32L`O#`E$TMcSY$dMsa*)AXsO6_5q6D?3-?H;9ap=D zVm7bK4dfdO1US7OF8k*%Cpw$=65Q1orss?@-JlTNcz*`3>r(kd4~^xcYq?XtSlgS( zENpK5Atlr?RM$RQ#e*s;fAv5Pj--7xx<0{NA)*Q_QpCt8XHw@|Q=ex@$92AnMbcF6 zYhKN|=4K>$;zxR)+iE@<%eY294M9T&Bwg*s(cG{A1HB(b0}*Xs>RfdkCnxMBUm(}*hJJGcjIY@McfcLL>HPpf@u|PBj@XHmQGfFDLCdE`G_~sT^-Y_H8l-7RxA6cFhQ` zB+-d5*$1lu$5@w>!IV3Lw)-l{O79l_no-j$Wq|^g&I2zF+n1uDkwBQ4D9v`+N7D6r zNjiVFE!QxKnuPFewS)UqX;tA2y9q8u#fyr z!e*KZ5g)>p1!AD4@y~S}PoTRj3|4)R#2+eT88MYXHl4uTPqJvEj{J-i)ns2LzScoc zcTl(`lwZle0lgrU_hfeF9zT|4>-k4K0QfDZuQ6|6ykm{yj~1w}h;BM(HL((YgFxCc z)*H=_xi1@maNSCKS!aGFUy#nH^b>`E+hbK7S~^Uv^Pxa+<<-7p&Y0oJk z)(P?Aa>G$_HUjSb@RCOVGVoLR(UYjVdYYt;%TX)jsx0=Oow!uo%`SXlT15*@(S)=t zkK>a;{*YDkW1PPXF#-18NIb>9vI&VC!zkn2Q$#ot@_i=@W@SDDQv83qMU;@$<+{(l}B|;L7x%Z3=oNw1Yk#p+;bG}B$#k!mbz+j97)8LpNm1Y23_5b z%L&rXSk_FPQDmSnrd=}_h|FM`KU^LW>3Czl-WS!U&!=g91I}xge5S;D4o}AtE1vdw zJ^C4ePU?@=Mf!d};-1P07s~Uuc6r%nH(aF??4H;CUCPaF7q5C-_G*K-8~c)oFTKgc zuOMH{dCU-Kt*Vx9quJQ5iN>^Fe|tY5akw>R$$?#J?yv5DQy;*+l(ta*wlG>8Wow~W z!l-L%R>43&%2=#M0PQfpY`5&K(z7j~pxoYwjE`lBFqO%()q7qAhqdGvJUoyHbTn9O zf+xW3tOT$mtZ>TGFrmDfS7#v=x7u70QyP%%!+)e8XB*?78Ka)Y79cLNQ~}io5;VxW zCam>7t1%>_?YlT@R?_n)xZOGN6Z3jc_nIqknsID2!GDs~X6dOeXW9N&5GOl-mz&p~ z0qxXL$1y79t=}wlJf&d|q7VZTZu{5aKg%7KbKsClA0MJ}==?%Qr_%+0>y`6TIW);A zQCVO8?=fLoQJ*hSE8Q6z8$+xgH#!|&i)i=b`Z1j}|NR(=L8qPtZA5*J9X|~MQT}(C zezhe&LfzTqEm|}g`?Sg0iDPLVXguN#e!UbA?Wae<(wWhTy&W4F*_Y|K_ahgL=$8)q zG0-pS|CAG}-5M8*G`DWw^Fau_a_u47zexgl;?Bhj%W!gM`dJC@8KPrb#M+BRN^z<-Qq z>jCJG~!aUwmE%4qu)s{DGNiVfPO) zI%4j!XT?}+3EOolYDx948PMHpZA@bDHoAPQsleeaC$8J|EcHU$jcN1nut@uxn$&V- z=~|_=z1}cg8VLKUfG1(eso5Ih-hFUz0m!MYs2@8@Vq#$eUQ8o7q}6S$5w-ew9lkBn zQQmk|Rm$--naoX7FF-ZGhXCt(Gf>)F%=Bb6mh^T9ZlVk!tNtA7N5t3q%XDUJD{uR` z^v_5-&)Wtn)bpSdj_@&yYIPt-!8t*nMxwD5PFSDA@jM47{Q6p)mafKL(6+i@f*kz4 z7~uEuqLr0wZMC3{hhFM)`jniP4Qj=retDC6a+(TVXx0x>{pl*{My#?3lQND^J4;rE?bL5&8WP)-e#7;ZA@>y=J-U@!Zj(XO_3eD{t5- zy_oZD=Be+I= z<-niozPZ$jHpJ{8>B*g`{~`Vm#p^DKew~Zd;d6-J&{K1!` zp3o9n+vDfbMx56k=gZ1`@A{2tD2Sbgq(VS77e_{&KW?^xU9+OBRwOi|FEFl?XpG** zK8<}UV!*nz_^=8QQ!d1qr8;;4lX0b>SVEp|0WDInC%2taJJWW#U41#Hd}IWuLe~0w z5zpt6Ubiak!};9vYlKNlJ0rxv_=YM~SnoZ9{WTE~0MHf&g?p6GhhK^)e)jnWwCiI6 zj#W{>7fSqK5czt@cs9iZiM;Bxyp(G1VKd)IMmKPFgr#=$lFRdp*xF@=a08^Y8DyLH z-8|sduTPG{y&h^bI+i>;)>G!zJI89uuEReP8(qISAK$rtcZC#$gC#t@kKaDUarM_b zjNI$$te?t#t-aY?LT8w++C8^Uzm45|`sAs2a$@GQ_Eg(QadjQ6S@Yckf=W3Aa%Gp* z+#DB0AkFMG@8z%zHW|fdH&J)dP3M7LvD|0XPfSmHtfTj2r;uusr9PJYIF?B za#Rrc9TXJTw5tDt0J#9!ew)2lIxjPkwiH%Unh{7>t!(lV1nrqt+S0S)MN?kRrC?U- zc)2f@(BB_+3ZyE{S#-H{Tuo+jR(K!hT|&LjBTSPZ&bfVX=iw@GuMp$7_2KHQ$DtSq zIokYyEie*D_}VP5+U_x(UbVM)W|~V0!iTDUN1!_iqovj1osDM0fRFi}VFZmKBA~SYNSqj_cA9cLC(A2l9RE=R9%1gIM{Mt&>ifb@ zyi!}+LmITVDNW_yB=LxW%P8sk+HZH*APET^XW_~@b)vZ(07#m?J_6O~GGOmO6UjCiXkV_-<{{I7 zGAT_kfw@7cvQ(JeOsh0jv#Gf%mOL70maJIdyHQ+xp2+sJ4?zvgaH7t^BFGBWo1M5U zM-gPyrtffTH8j${1=A@FQ<4#jZXi?xg&R4WXMkZ$>B5RwqRuApz65ihNsVZhFM8q4 zah~xjy`JS~zITu-Z{-ib8@ekDn6%w0k5A zNuJo%dd$fAp|uwD1xcpy2u%oXg2tf#Y9I@Q?!K1)-Zbmb@{Q~6%Gy;3gG`NN{|thw zb#N%)uzS=h*AdfZ`&t+_(8d?&llG;fKMuY&Atz$3-sk_<0$j?MXJQ@Fox1fHkMJdC zg4C(QLHOsGuc*}>jlS(|Z1lUcn`Kn~uuv8Wo5%UAID*8CFy>zur%S)Ek}!`Nq9rRk ziRaT9V~xxf^Et^%%g=geX`7Sw``(XS2$F<`Rwj;Ju2Dbk0%Ca0*Y4QwBkyQm4PE^P zst(Yry)j~&Fv?)TFgc^-()Dv9y$@B=oFy}SXAIK0yIEf-{-#{p_^Gg+O1Zj7qm8$V zb*d!GV_XF4<9*PtC^R9wKG(MWxCI~l$7NVDt6hIQW#5k%8bw4x8*zh6B5k?mQ_-g& z#XVG{(^3o%xS>fjPS8BQ3=54r3`HZ^1S_rnk4X3PU3UGUuHfEd*I)9)Ol-fGhh1T< zm$PnnbjN(82727j?9ENQ)j)IQajd|sXIcA?OUPd{0t7$N^(@PLt#6V2j$!zj@x|@n zi#)F9Iy>JaZk#mj5j$~if#@TgF1uh%b*cc!a~8kV(=;UQfr61Taz+v zf|URJ(0@$6TVeT%#j}9{VgEm$g7ytx_f@l0-We?GO>dp{4G;r?NI%Fk$y_*AN) z>vwT?q%^?1gp+$%+`GD6MLP%D6qD{XOW}qFmeCJY2cZVZAb3j3e8_x zOXg&TcB;|{W(_k?kSi<$xwz_p?;t6F>&gYe87{w(pMYkci*lGm%t*l?n#sLN_{bfG4; zvwTSHS0~^I2Ss_OYhL4T+`Em1ps+7VVcgHV*I`>?tM}t~={T4pso1#Q-i{TF0SNc@ zQC{h@yHY9jC0T{nXk-TK<%dtwN9J`3arYJ!f6#27CR{aDHM1?Y-%?LlWL=e!f0LU2 zg!4=^2F>kt(^~5;ymzYAAr_z4BA<|EDqt%sOcf^P8p{x#W@gz_OW_!Bzm&>lk zW(-MB>Im>lj>f&Rk!ibUS#?E46<)-tQK1lTSYN|wBP*3iFVN#4>q+JbFrMF*)n?l} z&}?q%{rs_9-JaT*TY@HG{_d=xhDmqxb!N54OJq$&8t{p{wxMFu?SfR#3~ULqI32c4lokBhQDwzEl$VmOhtU z!SD;z@(iW&U$nPhwV7Rkul*N%L_ zCVYTw=dKEw2;7fp7zg!Sl^K$ZT_d$vPJyW3nvs|Pj)Q3sNhv^WX~y&!o*IqO+6C_0 zL0bvurswkJ%%B5a2Grkzk}+>1rS|~{jHuY%55&al3i>v$%(aZ=GvK!Ntz7F}>t$YO z0N_=*(&X-z^47f2aSq{gg2n(RzuG^d`;D64Ra1roF3JDQ*bh@jYL1Z&CiE3D)uK#- zQGXJNSsc-#cwd~93Q#9-5cu0qK<}26SjF9>zWc8hR4!3Cd7Yh}M-h5iK0XTI@;~ih zqE1BIMz0%$hm0Gk9McDrZz;Z1(8rHX%7AU^zmo1Rrev!L?9`g+EOMHn5Nkeny(BY2 z*;l1SW^J_^U!6=Mo(*T(GunCTdtxiY76(#FnxYdk64yCwO3Gf%q@9JYx+o}d7_SkZ z_gR=wHkoNx@plL5YK|t6U1x7egVpf&=sXPFf7T8QIWW~ksbK>CW=-dvLT(4nTj?H| zp&om?3nT;sL+jA%dlGMO*`kOC+>P@tPt|hrsN!j6o(aJiL*@n<`rWIM)ugb;W!Ai= z&M${8nHUwagd>oql-!Gb&Yqq3>2?;_-OV^?a6vQidd&~B!v--0+PCRkt%m*6PT^Ty z#Q13s+E(WxZvqYrY#?}CeA>r}_>6P-bvTS*S>A}KptEhB@#R?FhbO+ndad)`2Kj64 z!DeA1<5!Yh(iXw(c%IIh6E7FPNo$jz58v-$1}V^lmKLP$pZ-Cp0>50&jql>^CgzWIo z7!!nt2WJ3QEBM-Vq`PI`?p42H9_lPSPPt}whc02qA>GW^n+HY`ue7S|1h;k_#<(Fg zA+bNdyV1MtLK!ha)D!29Z^@?e*Y!m=vq|{f?t^*)WG&iLZZc|J>}RNbUZ46)bP-;b zQE5ih$EdtF1`#YBg~4Yr=Q>g^k3{142hF9rV6UaRV3b-mV4taC)R~l(U1*2xYFnST zc9=g~&z@TSH-8b7^#%Swr7n4|yTw1|x)ipcT7CW8t?O-3hr(8fHb2j59As#0hgnBN zePhuri?7fjtY)I5V7yVdsH1K7<!ePjSsr_0IB?E zVOZy}@`m-OYYN(nboq+U5D<+T*fu@9w>6BD^gExFykAP4okA;PV z)^K_BcV}MIDbiL|%7f$=a&N#te~Mu~Nj?|-_C}%+=wEQMx}>)#-vqt>oiEpZ@b&Oy z-@0gsWfrJelyk4T^3AR9{ECt)-vyc)B7a^Z3uQihJ~Z&JGhJ7&wy=~7i?qjkJ-|KA zOeH#9a0^8qS0gCnbXT>%(5}UJ;T{|4gg%s74_qJ5`peKdC26Zvl8d{%Hr0v{HtQ{~ zp@w6+@*P`4P>FkN?I_2;ymfLyov$`!O?@=qT2yTByf<3K`$eA+d7&BI!ByX()rP+J z#KUysT&1Z3kcy7BOBlua*-6>-9SRNjx~rt|xkhgOac~m84?{}u;JK7DruF8Yw)>%7 z?UZBbb#N;!@{Y;Kj4hC(JjV2#!uh6YbuIuMZk+UKfQ;}|0tJWYn?Abq2Hwt%pUyd) zr={@lQm^$hsBM5goo8g*fL{n(qDm}=WrllJF#{tq4p&LM zIhl~R(FVt2TFrc6(MVIy)VH16Adh#GuIm2kIQn>jx2;AR#r0GsH2Ff~JLo8Qf#`5T zMV)i#H^J+V+8hh)96JjRLRegYmnVmBaA%qzk)e zxO=UsniJM;=S3)_>E~Q;hp6lAJ{D}=X9A8?@*W3iR$s`Y>nia#h<+b~EXRo@Iq?ri zkUmRbQ8)P9FW0o{E_+q05^_5@2_;93?EacfY~C(Kg}j;BT3)2@MhQGil+9RM$^OwF z>`@3uW2s|beF&eAqej%6HSs40-(~t?%hD$jWVtHk=^Fj)PW~pXVXrSHr78**lR~*d z2v233tB9L3R-c_U`H8^&Ec%y#{ioB1_X8qca{irWdlH4P3re9uv07OvNBi}f7^L}Xb>Bfpqm4WYN|_z*yB8Y|+#>=b#{nMLD#zZ7YH6vEK+;i%kyoa!jTzo9 z9kdN>4xh&lwP)>|zOHlHdCk=g7nS9vG8H<8#BOAPKF-#5k^j6;j-in~Z0x-2(2B35 z{@+8|Gk%l(Fz~%dY>CVAcB;!BTYQV5gq04oj+AMLD=Ci+OMgs`Z6J}78fFfn@b`pk zLZgt>u@PleC3-X7R)dgK*k?AKgzOV%?U5JQ?3aJDTb-C8CZ(vPZJpX4^Qm||A0i7_ z5Qe5;o<;7zoTq{Nu&<=)xJY!Ni{W^>|2>d{e3Dc7ILHpSMCHNXMf+?kS^KU(W4J7e zhUBvN{1$get(Bdb1u3gJJpR#f@;~K2KD!XU$F=($>qqWi_i3eA zrtgV9K^Ll_y=HaNW%}`NXIHzHkq*OF;&AuXOZZ*;Vs!JN&|Y)7sRd(}az@hAe7kh! zlMeoNuBDm9u?5Z~y9u2m2k3Sr<`e7`Z5}ap^1tD5egE!*Doi)EIJ}--#Irn@#@~*r zLDsjo=AGxXTkc|`UPhTC&f6_a;TWC}Xs;2knCoUxl>Fh!eYzk*%sQP;D#@T45%j2V zmBad33VY|mzRSkNX{y;PLMRMPsK^G=!Kz{0UnGh&5P{ryJgKi=%wK=o%Gj~208DAx ziNVd(Ks)@`Iu-!2MP|Pk5l-DVk1MS! zUENCX*`uqEjCHm4+ozT%@gH}OiHr~rt~T6;R(4RbW;64kwB3YJV-bKkitKNkchO<~ zI}iU~w5>LuTB~!IJdaU>;v;*`n)ff^mcDeO1;)Kk!e?Ya;lApuDThTHS(2sc=(yqt z3Xzz)AnvQ3w891}t~y%1kVQ}^c~|eIw_GcO5w%)Tp(trJjs415@2D#DF-oqJZoa)| zK{D=fKt8Qw$w`$o1n>MzY@g)0_T*fi4>DxC7|g6doRJFmU-T-8Xd)Mu6G^>Kvbc0} zrBp#g%$okZldHWH(N=x_!(C1Nug?xE>KQlma*7<{#R>Kgx*kk!h1Mq4yE?>&HoYm4 zV<^dE(WIuKJBYDUiWY|quoAXY$=C>^llh~OY3B;%42YjUu~e5;Pmy|P_WIMHa0wxN zhB?^$&ztHML0L$<)Vo+8p;y`-n#7um`hSG_Ei8H53jD>knjYhd*3-aUq)fQH6~I*F zJB(dbi!>~g_K?I7y}$f;h!RN(j^`lN)$b4wqX{2f*{2k7g3;CA7n@;$oWzfwZ2W59 zu8>2}s#9lmilU>%M`i4KnPq?*XwfsMlHf*v-|}K6=p^b2;`hp8R<-fVy|o8m_{MVI zk4wGPy#)pe@5jxh=Y@#9D{chR-h0s9c`?BZ%0iM_>X;6~B|1h_s^#C468K0O z*Zs(z{ShP9`O$Q?e(~u`HOWf$|7_q|s^qz;hro$b4P8(^u`~AFQ5ue|l zHI%>RzT5Xy^!h9`Xuw7wOC@GzOYP9qHjg&IOvd$6Au$jq4$62THz<&6W3&9d@tLUo z0}-q=OT)ZE$ac@eLrcZI-@sc#VWuB>*!a zT8{QmlE>3NM{VCA@xWF}pxf5zzr!m6C)BFmD`;mhy4`bA0gkwZ*iQOuq2RWar^atD<_ivdtG1b z^-KdHokQB|!%0U9O3-$4v^WCv>^rkYa?k$m+*tooZhFpp3a}z2z=Jr5+VMK7!SOOI zv#1v1eYFVf7HL>mkUU#Y!tD#VQOJab%2dDSv*&8*%6~KFC9eN$f-$AE|HbfgsJQ)GrgzVEa3&M$X#WO9RNGCz8qvd( zk52+TgC@VNSW|phNhD=KL84?oFq7TYL1I7>y3FIQtzX|Y#YkbbGk7eN*Oq6t(lRl@ z4S}vn$E{Wnng9!qh_YT)t>Sw5-ujJ#D%vZEyD2Xpn9QZqc3b)CH#>5w(Q7ulm}p3l z<=}#-tM?@<$~OCwxUM`mQ5yeBxjy)|i5lZ$Ga%id-5gYDG5xyPlp5p;qO*63<04a4 zFzZR^GsnGwi-a}8z{_gg?bU8Gz-y=fM0uxxfxd$x=k$xH$>U; zb=vkFc{K3ol0E9R`r&x(yo1}Yci;6HQGyU%tK*`DdeiPPoesX#1^loc=(kKWlIf;r z^4AYd12J|YA7^oEf8u!|9U&=_h#X9oRsvY3shThXpx{?#WDEUTHh<|Q;V-`R%W=Zb6D^wu9KM~Ip? zkE!~jbt6;^a)09)miO=@Ku=RJty+J(`Q^J~->e)JF0qhA@_04%3>muAuGfDy4SW3v zZCaCAhJ}W$lo~%w=G#=HG1{~#5lEG+O&mOmrzkB%l%rd#gkMVe9%lw@J8FtaJswB0 zyskvTH->BHu``~YGP01WCJVDPaRfL{hPQrm_+?w1JKq0jZ+G5VN$c=7sHp_pGO7|N ztr)~MY8VLTP4*)MX7*pTfpyKioda8Ezz*RiJe^Y1TbLac zUc?_8r#51BQ1ASbR5GidCn%b~8T7w=_Qn`5PZ}>-gZ3*``uOBbaRX-udj5o=VFc1^ zcbHxIBk=m>HSNslDyWFcX-YYK!A4^>@k-xMsCb#*awN#oeb6C0#o%WcCL;BBLm6kj ze?6Zo4j;=ams|48n>^yTd0RCb@NQ1R9;spTV-SBjzn}Nuz254{L&3n<`}n6z4l=Kq zn5kU+`fMAH#q*@=Jg`ow*&Z>`$4y8`3ac3BibQ|4dE}o=`nKpwU8`eQz>K2XyZ<6w zHyv+klr%>ZuBJ&N@w}m*?cFi{LXbYT2sEh;=#pf}T4A;#SkaW`dDHqPasfB4KO_EB zg>1-r7{SrI8S?Ri5!xBdX~7MfrGO_OFz4i3k2$Gle+R%D9L1sHmQTVu8vr)jXO7em9TkI z7}cgom*d=*bZ9B^*lOU`VQ-Et%`EV=Q8-wo7{rm0;3==o&MQRw`}X}$NU;SQArC}z z$qbLcoP>ndK2`zkuxspR75r;h5-VgR#g=Ub%iTQUHBU<=IB9YuWkLSyon_R^%~+JN z{_ON;L9`P=U5w9M2Je_%>l|gGMS#Dt?YheUn?JQXu=-@ZeNhp8eucI zgR-fjxw^SnF6XcLA_wvfjW`WE-};oC%w62G-egvnINXgT8NaDl9r$nI-y*TjS0h86 zfN?K)N5*$}2U5p3ymD+DbYsXpWd7-=O=yRLraw(kpV;}6@b;*$TsE;64r+(lfGuse zqyXWtrEa4H^GIE*d`E14M*7JpdXKmwmRPE+>DMbTmaEnxX}ewtQ|Wk`CwQ z#5CF146L-?JhLB`fRlaxFtkmk_l9@?F1Hw&ViPsbSeF}3A>KduMyd}aKEQwh`)3!g zqrv>MxH?lpEf_AHi9|oTu*y`3UmE0`ALO&_z(jegWulQLdf?2#?p|h^G4$z@_=bUC z3`hCU;C){;DFz8HKT6!8AgqKA{zI&cNDJ@f6>S}5{S&~o%OB5^(Nu?%k-A%bEWec> zRO{l{LTNX3WgHXPuvfO->FwmJ0J4Gga{>7Jb!5izcd>{l_LR87Ti_et`SRgK6B^Hs z!VLgi1yxfDbZivO%XG%ud^*bL%)+>R_5)8-G!?p8Z9A{0yCtYwxGiNaT#pxQEBw__ zJ@9&J5bNukR0SBOQAkB%9u9(6v?Or>a9za6S`_f8_t@^-*GIcl;`no!^QE_{u&DBd z7pk{nHQ&DtfBhxCrwKl@nR@y&slS#1PK9^z-sJj8T!gC@KY-IXH|2;*$)KS|L0=9b z?rwBXThHu|9_lBK>fe}0wEWpIUP?+LR z=KJD{JJn`G^l5w`UZA8lxTQH3u!`K1GtV*7HLLm#6}mvNpzpoaQGt#}@omvhkdo@x z);H4Hk-Eo(mRVm8V%*L(y(rS&Z3kEliKVs3;Az1=4NDXi4!ij%vXBH0kE2&!sow<$ z9V#FYZK&)0>PJIz3+DEIcnOwv{}ltRdBmaphE?ldc*(vS##>UsqJY5>NBtVxKCixQ@(Uu764!2KN(& z_gq-)Hjl$YLHzt)XEV6-hidD_l`^X>luLv=G=1z>($tTT=V>2?*Gl>5RvC4@U#uK- zLbGF1A2$%g5{k_^sP^l3Rn5p>dR6I0{Nzy%@L_!q8w2^lO}}WOy5&v2yHeMSzz3T~ zIMgJ)DCzQd?TQL?oPFUwzaLGldF{lq7h%xZJ_9|OI9(Y+W$zuSC3CiytOIEJ%G3Wo zlCtoc^}=UNdZV^LwZgQli7@p!P2(|>d<#@3m0+AA75qnu(QWjH*tbr|Ic|8mjAcby zBGDLs4~OUxPjE@R>|rOVIY9%rh9KPQe$oDN-5}Ddx7Fp=Wy)m>rTjzvVe34J(z6_> zdU9l@T1^KX@4yPVbXtQMxz#ol6di;{#&@8AhqU7Hn>5fwJr$M=<4ir|X&w@*WpIga z-?>|nhux-tpXZNpy;Qwky4QL>e4F$q3DOi_Q!`Hm7JbHhc} zGd7wwuyF4#pRic_XPG(qkIubuG<;f6Ho<*+=}JW&Z`#+@B;0|IAzsDmsriJtR>TA< zlPQXVbwDwMI7$ZJ{N+SDZ@ZS$U3mAqL(su4Bs#uPgGGv6B|?lJ*R>(Hr6EmjyMt4e z{|cd6{*0p&!MW|UxjfYkW?+oN{seIqt75>F1 zL3TEwQ(7~U8CPL19hC>(oGp|6fQNYO6e1ay7to1&;es!pYLfK|Z7QkpnylEAs5!GF z)OOS?KKy{Y?&pHVI?pYN|6?BjLI_J{Vy1b>ZsULmuGckN$b1=tHPli-tX)6L9g?C&Qd6Z-LD2Kh`mY`AP%6TAkeg(0@) z#}DWt{%x58bW;4!TN~4g#lxo}BC*~-8$5<7)VqFI8u}A~P_oQu7xO_TJQx`UmD8l2 z8P+Ru#Hp9_HGgeFPt~vYSP3AzEtUyT9!z0f=I)i25S-yVu!J?N9{>aOU8y(% zJU)Z99u3~XpHEZpF|mDTOH{%iuH_!K)15j|kkc7wIwHP7`k&z$G2X`m)5Bsty?D=_ z1x?%%5-5KJLs5BHKq>KU9HkNX1f-Z(`exJzjIciPNp{oP1YUX0h2e;(@#|E!)l6}8 zsMi;~S-ik}d>p8!u^8Y9R?7!ijl?`egr~tjBhQgYH`YiMoQx4*V-~KG+W7yq0LUPS z#W2InL-Xfuu;>Lo;1v_rgMSv^C4xJ5Ak^kRX~hdS*MP@KQeyinc|XcN6U~r%r^^&@ zBMw`1lahvUDx-I$L-qbT?~-+L7DAv7D!LeJMttsa+Vs};aF#&-(n5s1vpYE~3i}KL z+#+Zlb~*U5ZwR@MNq4GUY1K>Xv1)AS??MrqEx+>q_iUVSN0)}}J7;G=6EUjGE+yp1qx*<8O}uypBJk+W)O@1s`mlV8x3 z%)Z(Y473~zBI)eg^Jl-SpHO&1Nx%UITqHUX#?y!5tN&Fsi*&!V4`mes8^v|=?L+iK z%_W{xt&w4M+lp}h?o7X6Udd1SYV{Py#}e(3F)Ach&-j^#@4WCda|;RY8;i@?q}sWb$-BG z_419Xwb!hkmg(;4zWNXcp9KbdCvP;57^hQwL9 zBD*JU4SfCAAbdA`4U=YszQH)S?532DMZp|*tST$dn;o8%_~A089zh=L655v270<7l zeJ1WBwhOs6_zPGi-wl(RDT|EqY%LcK?f$CMo+}1szu1lnw5A?|0vB=)$~`JdgvKm_ z3o}ZJKkEeWj{ig$m*VSsLG2Md$M0y!lgc~7yYhm{k1`WYHjjAa_)ZPF-7Y<610-L! zd(bTcfmqWDYF)TR=O%}Cat=<0u#p^WLMYT_|0yd31M(qp_!qQb_pi`Qo!{UwqL(43 z7_r73#eeTVia`f=QG9ER`i3Mjbb-n?UgD_sJ6fct$b%^a@K&?+v$54o>k<~QCk`4D z=5QeRo@6e5Ik|wH9^6IT+70!kM;%;V?w!Oyht$zLpeaTqE(-M681J8$yd_myl?%%T zif@?%HDwc$g}e0`!)nrEc)2P2-4@&i(f>BZd+@(McNAI_WM3dyQvi$q+hhsJR#AV^ z@`s_Onq~Hfw1xb*EiS(-hrr0hXv$_sfTF%Sg6}y@3P0%WTNDYyMRY0av{ZA+tF*3F zh$A3-q-7PGavDGaTH7tdaN6}?38^>$YD0r5SqKokP7}6Spw)Fu$y%;fYN!{r=RcSJ zE{KgT7GTDsIqaQ zg)17feG@-jC`=GeQzNv&cM?0g5&g0`twsXdCAXGh6pp!O?o`7Qt#DHZ6^8q@W}|e# zf5roVD6q7MYGHuqxgU2mU~DnH-GB2G>d3?-XW_CPZDK_lep9m8wtGqbUJYogGE@)= zRyIr*2w)UYJ*9T^#K$*wpk&msV1RlJ>uJ`gG7E3XHcRn!RzNexSQB?V7SC)HN(Aj6 z9SMM^GX(9H97V+;%Jbh~HZ%NcUR@q~aXDM9K^beGD+oC7e7g(eEO{L}{`H3*lj0!L zVOtOb8J^LT2x_+yj0AED$+gA#PucpufJAf`$lHui&+5^sXD76VFpG=c0sg`68iSj>>>p0{OD5;rt+0(Ir7WyIo4*U)K)D?}i zOO1tVXv#EA$r3NYP{%<%HullzvU#N#|3ui8m9m_&zTB}KyWt@W@d*OF;h}z-(^;E! zH>W(QJULsNvDY@Me1X<#7eWF{;{V+jERQndabfI{@%%zs^a+A2`bX@=OO!_jYwaW- zs+_TiKX$i0nzEv;=O-5W>qWPq)T|Hm7U+o8WhrF$l zPmCT5oJ~d2a%;M^G;PnS9?Rqh_O{UKL<@6nwakT^I4EQ>w=3ZhRY<{AVabQK4%N`} z6KlUbe&zjors_28coYP^K^P)}zQYo?hMm-~;so|7$bIoQbFk-%WDBirxW-PrsB(p) z;d#Kb9-?MlU2jvNL1hMldaR(Y{zPzmDBP8cB5~XC(|!)DJ-PnuLgIVSU^d1Oe6@YM zYWB(*g1jU->?2HkQISP{kQWTF5?4kNawM8|IRgi^&d~*>>ac>o#q8iE`d#ALa=jqF zmEAK_pm0D8%kSM=+s`>vaC`^$T4H`N2CqF*e-BE4Sq-vlz6U%&ctY7*GbjS+1y)uudzU zyoj71o@F9`fIf&fd3P|9)bJe72awF_1DmUlg~yD#V}lNF?Z}-f&VqS8%dqwl!?r&$ zfrtR0B(I*Y!cq~&wt7iQxV}c10w{VE>V`QNt68NKk??Scd|p+VQRplV|9lfAU=;_+J2?4fbftbBc{*Wl<` zv0}-IDU|5vk>IffPmqotpliMY<`ypKiyHYX+)|m-^&68*lv2{=3;*pkxVBODW@7f8 zUx{qJ-?qz$Bq>}iS{C^gbAmuU1fVI*9I6J#mXYIAC?TNXB?xKZO^~1QSYa2n#y^xH zDR>Wh`h346ZH<9(GvndiTYVPg4WxtqkInH^%|NG!L6bo+hP>9JJ zNL7knd-G}<=gG(U*@@hgs8X1n8`VuImhROS$dB7EUGb>46rA!YBK=d95fes}8 zHmS+In44t^dSR!3?R{R0hf)Z+&CS1LLG~5;r-_Ggpmsh6S#rCMPtJVslRwV zf^^{i$DJ=6)N#3WdQoXtZVWY4nMSA1tMPT;wLXu#gBYOysYI4pyo#2;k91w6X*#AR z+D?NwREdcKY_NbQhyme$4;Wx2Vil*c3-s+dx~@llWf(khUb0S9b@=H>gB{ep_Wxd_ zPmMmeTbJFh+@td?Z1SMP7e!;il(UgO6^Gl>Gg%gn5r_svvk?(MQ|eqnTToK8cRU%3 zTXm#D(K90*K5GX~yk%!Q63GNj-tj^*BDDm*GM}{o`Fj5{H9J}m7#^v*JZ3F#8NAeZ zX2~aCT3*U+1m22jjAA}E!^0Sa{)^Jn@(>RN^3~JCvjR*s1$k^w0)U)=uA@glT%F&0 zWu$hN_*O3v89hT&EbE6__<$CgLv`7Bg?|+POUo7x(6oxyRLg{*&gIUi*IGbkf@1&8=7^2vtc(*Z_+du8qi!Z}O3k zK-zyi3#;L$nq!q>@$8V@VLQy<*Z{z&-I7$!bnKX!CPg41W=jkf=R%mr$-D0x!;dyP zHK*~Wle6!~TF58|uO44Ed$lQ1Oczo4@bj~%W#L&fJx%+GLq{53W)k?0Lj2R7upnmz zuQYXHQh#`*j8L-4W`F*F_Q}YFg@AF;j&JZQ3Pho#usE_-f=c=6o;C#NuhKumN|Y2# zTke9-SX|m2gxM+ol^kR z+w)ucrJ6jI1B-4Q73(m0^rfQc|AZCdj3QWn#s@33St2sPiS$mi9}#5wePSoC`-RS zgD!E+mLcu#w%n@cw@0aKlQ^5W^yZ4ZU&IO|HLzenc07QVRS3XSrWe(j0$s`ehkbT? zMH)^nweKWVdWEBV=#qiL@-iOuVWw?1NwbtnzY?^(_gkJICYfz8Y3GZIYS(+M&+J$v zOBPD=FWo=+%7nVUKOHc--~-l!I5cN;l+(%Gi3Ww3EM#bFAL2FdW)L@)RHZJy>5$hE z{lE9e^#_SFX%T~}%=0ribuYz*0;ko`vYE?WroG|=*Qoj{pzqpxg3dH&P?Xx^g-iHw zDXG$@nSK#NKwv{b_&W>~C<&0~lcKXbk&q?F`@0Hs*@d-;_7GC|b=X+#PJ(>vtRZ&sn zFW7oQel=_Rl&|+TZ?UD7u?UO2Rn4>JDy2WVL^s zP0(-(L!8{XYEECTQ*sO5c06Tt)rK#QhHz_dGAs)bfnRed%AYM=mPmEZF{3*?-A0~$ z)b>y5eldPc(AS6<3rtxSvz~dB%0(51uled-rB@{{bN2_o8AERS^oi8ttOaBM3z&_+ z(!{VigM%(h8j+Yk{n25Gq2*+yr=_IU^5VV?;Llg@6wnVKoWTn>jN}GKC2$GP3`R-A zAJt=S%xWe0P_^O(Mx=7^iv=SoCI1|Ra?PNZW6!VwBbkax#ZlzX)aC5C3i)9W!xu&% zGrxx_hi#oY^#?*1!c(av{}jGuBNx&!+D}c&d~R`iX1x#VH{*e@PgR5kvW4G}3y#8k^Lj*o*tYrsO0h2{`l zseheceZTAB05kojb9`sD-N5j%V6MoiuWWA#J8iDg9}8V1)Wbv0zK^$kVrZQssI$>%Gm)tnua~q6?^!v>{6(`33!Y; zLD)AP1-)s4wCm(2PIjGt9hT|z5{~8q+J;;;63^^Kky<_wDNyvH?8KQ#D68ngzyyXD zhN42EL&`NyE`|Y|$1b%yJ^qZB>|NYHaIA0BxvxIF8XpHMzY^laa9p~8{*FKcg0&-N{fwg1r$B!t7@YVa^>nwkmT_EXBk|}B zHmra<>UtWhmD@|7w^o*$Ru%?&g!gAZL#THLn7>LlES_m8#pd>w@w*|CWD&BE{t{<&~=cJ5|R^ROped;>XR*bQk}GxWT^b(tH-$qaly$?GJ_V#!fn8<#>=WD z&0AubI~n8Qo$Wt1+o3BV~$|+cQ7a;3ypZ!d}xy1^6)Q$RPh&NKO7X| zzSR@y&{4~>>me{04C@s|q9NlTXYT!54w)d1jYj-q)NsPsoIxOVQ3%Uuz_hQJEwn0S z2jcz8X}mk*j*9-c$6FGl69IUHO^$p59rLH9=2yG%t3bquJ-h;Df~FRNCH~?^?AWZH zaI;`q;l*j{aAA218@_6IQ=*WSIOwc~|8yFKcs8|}lg93x2|+w?!c*t9zF_s6^XShi z%d@AgrHxcvKXDi~a@pJvlJJmn_05~mfefA#iyFb=CsCPSm2#00+wco0 zFC+3|!$-zuVWl-RkTp7rXp)jteo2Z1 zu(zGucJWJakIxL4ni!T?bd;>v-ft~)qUDtjY;v3H4$@f%z8p&wkCAJwExe~yB%@1F zIQgee4h4^-_mk0vj<(LCg|j`N^f)8Ot$a-!=3{w*G6PQ!?r!fk3d1ox9@H`L<(M5~R z*6Ee$+z)j03@&S>-9-9)G0j%qL_OT^L>n6`u`jb<8i|SQ2VTz~zK{jt`a7aDG}l&i z1)IQ+c#4B6ME~U$;3}gUTc7sjZOz+Rxs?*ID&mnevh^^E2&a~JFn5+P8QU+98gkCp zFt~!Qm_2VgGnd~5r2cYk+$8u@!R2&0;0^wQ=s3uILG)bUultVAel*Z&<7F66=cEFw zt&x;uEFMFm>|E4CeL>vV}v-8pPTF%Gm>*jN!?V0ZQ#+-I#mY|oC0prd7VO7!L z6)H*RvX1sIrc$H+`cFSy7Cgf3N%!gAj88%2-6C)7KLsvMEkvo@?Yyf%I&S~?>nhKw zu5vXOzLF4Y_teS9W zd*!VtRK|rdI9Q5U*XowALkEIW(I~S-u~E>A#N*Wnm;^K*Hs9)-Qz}$Z>0TUG|2u|` zD;SO$a>bW#RL19a6aAa=V9Us_wZ3P^;!i}qkiA011AYe2~jJjsVau_>%v?0Cz@~pi99(kqg{D^FTL<~7-BWKGeQ)! z8?7^NxL^5rchNPUn&BmEvMgvh|GSTv>2oy-w;mFRDDZN5I!BZn`)s}KD~yqa@!PhP zaXsmbK+&@)Qz;^iYmkr_MmQw<$2H{3gW#|IH$gq@t4EH>VV|xk%>l|0Bh+3Ii2B%l z=N>eIysuLkP7VMvvsGVS@$VDCN}8qCQtMxy+8YYZHbzz>b^S4g`k{vWyhtFdXM;2; z5JMtS2nXis(z%lxmk=7VFf(zeM^fPXRnSmM?wz{X%!jZ6zV#j8o_HTe`MfTHv$nR;oa;;I>~!&~7I?`WJa2#4v#kj|Ua=y0|Bo0h z&{JpN@O#{hrtyTJ%J49x5@pasC4n?FIk8=)QNMD-vmssc3FkStlE~-JsdE_~oM%hz zmHWF?0jyFzMkJK-1cCL7iFl9u8X^E81j>&^%U?ZY?=eNE2kpS%srwoz5J+SZ{mm5C zmo}X!lz`FJ*-rCmKR5p#*W`0}sH!rV$&?PlxVWFwG9CVW>&MNAw*F~Jjghz14#Gyu z>D|SDq~PfGV-3Zm)gJtnj{WkL^D{?o=3kCVtKFd@mITdCo408MZ6EhfqycZYTG+*R zgl;dJ8~WH-7A5X`gt{ze;kV$4dyL>PK~re=&|&G)mGGmo2f zY8OEP&9VuthvCSJ2RT_>TmgDfaiWc#x>Y)kNF~cUZyIW0*ua4xlQHa@{*!r$&UfKI z;|?cAu`C4-$#hhYT>8dw=)LvQUX{5>pRjWNS${hd-qtreQ|CW{2mP8xcf=H_L<|o) zPaU;M-VevMAI~(kbNL~u505mea&N!!1-%?@cQrSx8?|%=JhuD@aTH#!gZ(41xX(Up zq-~y$-*i3R-(Ip7BXq7W1vkCO#76r}=o&{`|o7%65n@H+U72K7MXN$NEfno#eoV=nd%@?aa zZO?t$?BKb#ib#0W4lbtWygxLi ze{3G1F-xiLd(hYEloPB*$$4(a3BS%c+M8FbGb?}ph396;(Q$JZ86f8;qpy`NKoO)8 z#Gr3?`&iw`X|q(r?mjleTj;tLK6|w1CjZx~69W|slgs;^Ydq7M-kHYazmeM%{#rdd zkM$>X{5&=ii`(R{PcfhD>VYUbTR~J24XV#hSh1XyTv|*Dz{a^5z&?mz)jKcIrJ6mJ z&I@V%Qw`4C9k7D+3`y zJY@za8?iwgohebetcJ4wKm-_}Q)jk6y@pDN&y$(ukw;BBvg70qtt@I~)-$vz%^n03 znVxpu=~X%@=(t-J2oUJlyfzrA@|#8Mw22z?Z3ptN1(0U$da6!0u(zu(Kd*eKYtZzJ z(!q^E$g{x>nxU<7Pd@r{T3#)B5fAX1T;SNnGO30t1( z)}rP?!Qjf|wEOw@?cCK+o&oZHv-*SQFE?_nwcpNp7&4qrLgzO+_3 zjdvpbV=tTOZXam@sysnbs@@diMVq$k?wcv5oo(!Q%lLZGfgjhX>W*Sv#ce^++qjoC-O&?f2mNY9b}DXkJXX!R<8XP%|h^RQ^$ST~+{qG%Ptb?iN! zkG=ykC%_gt(osUf?<@bmT7Z3ZZkjY5R*4fi9%^AT&)EB4>c-3 zfG%aiTYG-6{|3FV3%hsx)V=lomdpu2sH?NUdN7q;wGG(`KiJgbF{YlCEq9ATO~pfX zj!=vPkkiXTO96(VJN-e<7X@$D7?d89GgAfur@IxFB>u@jnt_?=J0d)9o~cdZX_L!13qmzaciAe9vka&TU5sAP)6%UD_ zM)>=hQOipc?E|pKgkXLwE|QiRao?)+AJc~$8MCTd7olGhHraTGvj4zBD9>E#3xEu; z`~=+$hAhk;PKTKZ8LFR)ho5%fNsZ=kpkHASL0FN0Z3(ezRO-lBqB+cpcO~IhJ`eM$cf4UM8UAz8d?!KEpEsWb*_T$z$GU~X^yDHVXNQcz(!|(t z*+L|-Qudyb^kx8l`WvJn;`6xb^G?!5`(34NWWB?$2sQHR)3@zANVM~_?=?%KiiAPv zKr}OrqAeddzPD#uaMao;MQJC?K+Yf$@sEFi8F?7sCLE58s^_{f%3~AVi|J8A$lnOcj~EQEWpR%M8A+U*s5Auz`z|{I_}Xx= z9#aZ;2>Z_%NyO~j6x3>RB;aV#im0#PYw5J}cVgXBiwi6^cXbGx|}|u;Dnjd*&^tV}1}P)huaLIhP=wB_dLC z%31uNWkBkA2YwYfj&C;PgDuE50pIrCFR{^4cgMfi;20>(+P(-aNw;p zyrm&<>vrnQ=&5yB?sz-&UGI$o2^{BB&6hn1+>>V~R7O%fs=BhLKZZLU4K?DJyv)Rl&e19rgaJw(V=UMphIQEU?2_ zutwWuxEHM2O$r>wJ~vy$(&D875);YQEbXM0007gVJ$UYu;n62UpjV)w)pC?aO8NG% zgMwc;BoW!$;+JSV%^2BN7Rh|F$ZjTJY{>uKxw+dttgN^f`6E*c2C?{ertT8ON_*DKNe|}n|siTrwSENV_IE?3|s(i6q$TdyQ&QW z9Bo>Jq-65QJ~IPs!$d@_tdo=K{$XHU#?xXc69es5mY5g|CwCklzIv{WHM0Y!h{iAQ zCwoP4dDrIrmIS;X!ATZe`qzsOm?^*on5-ht{n!l4_siYZdu&2HR~MluRCro6HQtU1 zD+G=q|A?7BJL7D<5=F^uYG6IcZ!K5dz7CBl7zgN@If>)HC6vBYs7pe__u7LsODrms?mK&d2#KY_6p@EE{auwzd7X`PQGoV?$NJtR!?S-s~oM(4^i z2}|+h@HYZc!?!-MQFreM@5T5b-2ekr4zqCy;UOG!kKXA&M$bfH?IpWkBH-{7j?L}0 z@vKBa{HA5Ze7+rPs=yVDAyf|mJOd#u+B{bS;rUz%+0~zsIL^7*F@lNF!^Yef&l~UI|^J8!ecS^Hfkpq$m@&cekEqJtP@zG zYW?>Dfb`ogkiExK56)l=O4{lutr-ci>=(;52v8R~;9Tl(=^-Ht13e{RF1@-|F7VVL zmy>jzbRh|hPr$$7F$-J`WDAu5v=CP%a1@C`qrXuTtZwRI3!Fd&1lRY1{^`4(!z0h}=E@ zW#O!TQU50@+%%I7V5-tl5`q661Ai?((R)nsRz}&L-p)5PDX8$Q&~@xe8W#y#PZ2@= z6FPOkTbSal4On-ptF7+E#iz@PvkCcg=!{zHQ+K4mHLI71y8Di=;S+HA@w{NbUiyJAUVUw>vO?+%dji z=hn^Op!m)h@g>HkG6a~ZV=&}fMHtzV)ZEVuHq?+wvR%Alzz*E3=VGG}Wyt;8|4*vf zry_icndumb?Os{xGoghX-P~$35|o-0MUbI_kSva_kLS_EdawYlV5JhBGS=_(TPqUd zWIQWfyp8z${1P%KlQ<9x?V`i^y6#U|MQVf<{|GO@UCZ-5v zt$r>Iv)jpP70>pr^YNO=wuzHdGQo>)eFAmaeKPbpx@@a@kqnq6#bdOwv~uVRvV<{O zYo!V$5vHTn%CPcETT~DchZ#l|hQq#^8=r>s<^{w{T>w~+va)PP(lAW@2W-fPvx}3Y zFAeceU)+Zrs$XqOYkQ+(tc0}HZdmUPZr$s^6)wnN$-k;o)K%}%(5K!v1}+e<_X>4y zzkox+Y6--7jxA4D;?#E4iGxm`l4O(2xdAJ32`uz|NuNYaRX6yn7G8R&nxt9t%7K&3 zvN|qCQ6$3bx4*i1WSLk6Z7xzv$xsM=05^PXmCuJuh~^i&3J(mQIsW~gk}H%c|@-}Wej}1jy!FnNXm|xi9NUR(5f(L zn;7@7gy(Tnir4q~y6XyP%C6c{=lbft;UggDNVEBwO#oql1RMHLTTNCZjF<_Ul327|j87Pni0y{Q0h zzXNPm-*NooN5~4<0O)?KAYkR`oQmZgtAlSZ47hRXM_f8T>v@*QQRS4ypAE4n$YbK; zyH>b>Ur&7P@wP)(b0(lMtA5^%KMfZL|qSjEGv2!oqWf3lB?nyhp@_0-)HX>L^39>fpCdLi4w z=$vD4Y)4esQa{N4`^TMkzbZn}z=Vt!2OO{DpxBK3PJ9s-t)rUe+Ur!K-g;yqoFH_d z0!ob%7oQA~Wk~W12ah~IjW~J!Ww(YlCSZ>2K!$=L4W^5+@v?m$whJ!3OzGLX!C^d< zd0N&sRxa}DVsX3zqR3X!#9$`)IK}8IfKmpyQ&T|=X^Sz1w)({YHWcaKTL)Tgl7HQz zYH7K?=RV8^VIAE<$$2LC6y@iU(YXQ183WMwQSYkPs!AMEsxR_cxtf~@gI|P6EUjH+ z@y)e3=!X>Kl*l4`AOGnBB-Bb|Ku%SS!$tLHP6g67MBYK8kXUNhOk10?OV@UmP~SXY zyO?~5PGR~HUo4R1QS#vb2=sGAqM}GAs@qVP*26mkvwlGEz=lFr<_)yHNVcnIGq+8K zZ5V{a)0`1FmQ~ePEDH>w10TlJ_I(Ml?czaY3k8nyNPy#{b&E@A7;SKru76%PKpm(% z0ret*-$12Bji>w@T|1%PY$vUTAw=eBxO?$+iyX_J%l(08g79HqJ~bHI*87qr=lP63 z+hB?RVBu*TOIKfD#&QA_f{9OP2{CU*>t-_e7)p5g!o-Uc9vQ_gNty3k1Yn*(kT5;o zMAqxt<6&GRhhG^XNU5lG)odAyPVt)D0pZ440H~EU4!A3XtPfGy>JvNV3nTWAcj4|! zkG+4!z)JjQ4*=yxOqOe|{68SYP0beLYMuw)VWW=jA$3X-QoS|3~ z2Bhg>{a=52m3nEbv6C+vU{Qqj_@0tVBB`W}XDF{EW}Xsa6cPBM0B?f_++EDD9dK5S zr8bXFov=UZ#wWTI({`~0SsQa+;7%X7F$MHoQB={f3A^6E#a^h#AYMV*4qDFL6OTU7 z2M8ZQ3`i8;Bnxls$U}41`{D0(sbYZ$9B{=uLk4) z-+$M>+oT`YJ2@_U#;a8-&tmFSbh&4g*WWoS8it0lNl$W3I?k)qbH(uRF-S^D{%!p? zG0#o_68nCSSHQ=|$ov-JVXeWc48Z5rsGQyV_0;6x1xrb#m9LyB>*VJ!ci{PQd!|63 zM(<{SGuRlE?%iB?*xRb!rfKlHzSx?DQ#q6IWDL9#1S-TCs%m6oM?1(QGEGg1gVBP! z|7hA7%xQ4&lC%jO*SP;%g9bo{xhYuo`$g$(t`ULhu?1(eH8q!aq*u_4F3;T_Y6Hga zs{-TL@2nAKDhLX{KELz3UGExw{I}=_W zJo@Uxeit843x+KA{rrr&?|BliG0(`#i30bI({E9>tG5H4rep%F_}hR3(bcTux#Y5t zsJ6(tj0J`(!6_p!b#QzC!w>#83_m?R%}lHqBoI%0ot{hVa`2+y`D35cz5nf^qf@Kq zLeg|5o;t=IJ5m(cUhgHww1Dm%bX3^c^mf8a%Ev88_*ZF0S>#PMHk017+w{V$gqr7d zHi+;ZW8U%0O3~G961^@HJ^es-wA3^HBZ(=){n>&p1~RKN}!r6~DIopSS8g3M5JZNI_w7DLZ&d<2qpgQV=Dv^L2Tv z1HId0h1T2KC{i##GTCwRnMP)ILjri%&*)-l;dlpn!?N+f^XB0o)8n)P{lQD+@Y;TR z@`3DSSVghX)3L03;M)JvQfeW-IiX3boUK@{7*f`(yS`?MNF>r$jw$9`8Gt`P01$1VH_1mjO9w&n<2#D=I3wd{IBo z#5a`Hee03%2n!7j9XVN{_ktga+zz;)LzsrnXYe{omO&F6SV+HHbIs5~Z9cwPnW&*h zEEqx-icRL*>!vr>wUI}{)AY%Rv5HpgE?r1)UTW5tS-D>7nXaY|`?x)N-8GaQA$v>Y9C?0Pmg&;6a~&`FF%sQ&xcn9kc*UTJ z^X*n2)gYn-V%RTEgPrybX=?EGbNBeDA4&gb1zyIF~>F5vo~Y*WxN zGsx%l7*o)Lj%BS#Sqe#*>S*88hThtuVtwkzij}!z&JR^V0$DT5!5iKjiGu{^xb?C1(st}peAdaG^| ze;(K86yt0>-A_sv%jBQ#kcw3XC$w3fr_&B>Ec)uCILk+09XtLwP&2;`)Z^NYQZ?P& zoPFr<+%xh5MOF8^gb4YM3%;0&b63r9f_V!AYpV8K?l|07rXW ztV}N2tf?Id?BMtruYF7FJu-Z9K<{UrSZN0U(j7<2S~(hNV%2<{4*wS3Aixs$zA7M| zdwW}eN}dl_nuatLtcR?xfAw&e&ez!68XDFwV*qhk?kbS<&5BB~K<+fr)ByOS+|N$|9gHylJ4n-7!HGt)}N@`cK!D)A)l z%gR}V7d&@4IptYvSaK4RK99XQwP?L9t=Al#u5x7%5?IBNST36`^QLc+<8bBa?6*;MVoh7B+eo=xLm65Y0h14pEu6A*M(N08PXE~V zVrWz+z@WD-wO#(0776QgUlBC9E}M7Z^L&ff@Ns%drMz&v7<_fk>Z*npc~oe6+Iq3g zOgP=#q^##|XO}bi?Fb$~b6%k?mKS^)#ymJ{wmkT=Ncds#bP>sS6@ZP{akrkNjC6dH z=FkbP9NW2M?>gxBb~mrQ)C7g{XWwXVkNhsSX>}(@>Fq@+NJSV+g=Jvp)PhFD%&{{Q z@bkK=n2`+io4sc<%W&RisEWz{_S+Z3BSNXJ`ef6=*3YNK>>uUQ%_mzhwpp*M zl&1*X`fmq&2=mindY)$$W(B!si%C)IZ)@-02qg|t4%VOg^v~1EmOrF1_3iG{QZWQ? zo=H>}OntoE+`$3`0e<(A1O4_ zOS9iqQtBg#!V|*_@^>+(bBK+5Y!wfC5RAW{5C4Xta}xNl6m<1c>umVwR;@LSc(ppH zJ_~-}oRc*~MHvbr?I#yw7oEW;MH%>fcccpnA_k_@{LZmEUj$~+fr4to5MLVTPZ}-+ zwxzsWg=+>^RaQfoe$$xmwO9Lxe9gygID7S0D5qW;7?p1>T|F-!elb_bc<9CF?BtOk zOlx>t9*p9vIM+-!h#$^_!noeQw}b*iMVj+nj`Lc2hkBmYZa!cI1W7$EtSkgh zmg~QpnNDQhk>A$z+biNg5R1*EuWp+-SMCk+o^ZB59dHV4v|MFGDMLp1HOg{i>b-sS zH*6Xad|qgLf9&7I{B@!&cGrfuk+QfMXw5XgOHE4RLio;XY3jBIF8;DowjG;;<39IB zeYNvuCg&M8XvOrIxq)R!seeMjb|SbpRPSUz+&qE#6Xt z*9+xIXo7UgH749i<78!r$wE$&GwIV1I%0)hw1H9#R}hkT^uN`H&6$zUqhR8Yn*1rmVh%JXQ%sp-jJ??VBLv9c@P47arXQR5n^V289k(B` z_NW7yRbis=meLL)hLgG6ghEf_E9}zYrKQuodR3e(m$&4y&aVu>q9rV!li}eMC*}!8 zHeTj81?Vn1(BdSAq#VR0*U(o51pSls8%NhaRwzAWXnDe^NhK51DimjS&2e`eHzjjm z5pHLTjUh(u@F?$hy5rf<%~V(k8k?*4!{huHXX-uz4}9uoV>s8i{V=pTy<8E;*&QW!;3-7wdHosKJHS7kqNUH?z^&QmRi@`tlQ}oWRN*x zFkZW3^lZBrgGje2sObpH&il3A<){hJjupzlb4p%4O6c`|#JgX3Jgi)^;BK|)x1KUT zP$w04Fb*rQqs#s0w-lDccpK0@)Ll_;=_92qYXUFZdUswe+}o|7_tN5FsS{3?K%1B+ z_0%#pzPC24=}}Jj`gSt&jbsPWCmlKayyDqPwp`VyD5Sv|G z3~&QZ3d3c-q3br>uWZkz-3ydHb!ksllwt%VeY^!8yx-fw9WiL$Onntw2d)Y4mV?M~ zJJw=TQl4JGkr(>j=K4l1YmKkB@3V+&Z%LI7xK@;%b&|8D;j)pe4Fv12cl-FA|FvUC zz_On$)trQIzMoIBvVJ`Dv{Tn_T5Ehv9NAygwxlYktfJwFJcdXD!8qvle0viijz`&7 zs5D2OdRYDSW+P+un`@kjY-Y7td_fZNaT6V#Ti^C-0Zr=YH``~&$zjbWuHvsU8drzc z2A1O$AMXbMG#PPt{7{lYl!WK%2oAg7`EWff=h;P{npu3P@F3x)=O!W9?&zmR=|0(V1){$i zPOr|rG)6&PpSj;Im>({JzMp8i3 z;^&xiA-*JydsrYeGspm-mhM`n;ZlThz~vw)+Xa#d34U-=gRtT1pv-HP_2g}Ed?cBd zx9H(+m+7~@qssHh@TZ2BSg*|r!R4kwyOd$B>-!UN*u;{taS3_7-{B6JvbePdCMXod zNI*$e#Q1zgm9atv0eTUIhx3L)au#y&mFnr!W@*%>(`<=xBj4=_q z9?mmn$PCiQ-(_sWiO7PUb{KEVRaR%2r&RThqAqyz2LT@uCOOIYR4E@X^O%@g0@s(} zN*um$79zSI0Wx-AIKeeFnlEWw!WDl2x)1JM`SjA&?li`u!c(KsaE*yP@!+tz1t^FW zH{L2mNfr+g+%sZDi)xDA?SLu(Hn$$?yPcKsj9^4{#h|Xf;W!2Ce@O?>EgO|~E=!wm z1qb;!0jtaNsp7G|&DM2|NnsKZwbDX6E#IHta0;#7dwnCJbBf6E_027_^Z;gUcVXto zVX2Vle=M4sn!k}ykd+vpZZ`L6Aew?!dd_^jIa|d9_VyC~3@vEvoKCpw*uZj>$i|&} z@06lP%_X1_@G7pGIME6#iIb5JQi@7IpUgW7Vnz)fUUnS@-u&b&E9H6|Pn=j@bh2Hb zMNwk07&(S9iPCaaPmTNzyCq4`c3SVEA30>fO2Z9-I=%QH=XTQ6JKB`?+s$%QD;}kc z4C(q*KyTiBC$2&l4;4xB!yT8#*>GUUy7k+l$L!!h|KP{He2($t0b$wG#lCRiV4<{b z)$zl_BoFyC{~i0DHpiX}1ZB8>Ll-Fb;a>RdR z_h|;@`-RAtE1B92+X0y@eqK(FAuJ3__{b1hY}WPBQnG~^;B51e5*1SU1tCAY_p3Sl z*!pzi$~UzTiS?U<{DQh=B!e4EhB$0Y9gX4io5C3JF3`puL_)QLvH5af4li#> z^(E3o;9ajR4pU6!@qLGp&&_2;nNWZobMyV_J=M84^q^8E3NiZ5l|?~QSKBg)@#p?+ z6PT>umhv|DU=x|oB2fGLo`=s;-FZ}$%ZB^MR~KW)tX&=&>3i=d-FlXv-LKk(MZ_on zwr4#X%r8&v_z4bQIOO7%Yjxz?MFkppQx~&8kNJCe;8%$clvpgOQivQC*k<~lU5CTU zZkAaiS>F4^XNRDEMmZP%JXM|+LEN3Cv1O0$R< zfj2GTikqa5Ys8?#_;VZIBFX}vmdCd?okE#bkCQ8ox3XZ{RAv^@c?UWp?fdT691EA- z9%{v5d&j7`0=9yx^ZA#Y;?&gMO&^Dxwwh1IU=lEwrSW@5{YlMo^sSi72GVAheK4RE zL0NwAFHPK>0@xffN$F*8cSy+W=KWa$((UWyL_i~*40}Oz2-P??VM1{@sk*@HSewIn zv;zaUXR;_ZNr072oy;lR|^hxsYXg*@|tLhM81O>ydlkzQ>GT~b$V zaX$f!WzSoR@79ajIH8%2oS$%S6|8P-fW_BTp%U*m$RnGtzZx z#)31VNi0xhP28tR>)`CwW+I5ncb7?dF${ZpVB`Jo>v3h#URa-A(_I$^f!H&a%q_Eg zsgkB`a^Xjf?Pz0)ZUHxEMJA!ozIuZ4^2mqhS&2wlssxm9`S^?~Bi~gk`H@y*T#T6$ z&9eFG9H+^fZSTE~?d!JXepD3e`@LRQX5)GLhv&0(g#xiic;IwIO55%47j<&*3vpKY zmFT{UcBBUB0HZz+V?R)816)t6eP%fgrt>rATUam&&Ypw$Y%xJt!M-er=3KKrdzL3; z9w!b}x@USKe6`HWGsd7}J!Kg`lPLnbPM?sUpMST`dTsoCxbzrrhAIqu6~4MLZ(<@D zq3-9RK&xC&1O8PsE;ldg_D_;N;a4r>>qj zY5?3m7V^{yz{yj8mH1y@XMa9-{`8p>KV3L^>iC8yR{$qY{dD5wiBs2pI(hp1+2eao z9@D4K9N%{J+VvYe=eY!xlp#;8{QQ$sQmN(r3?`?L%&&KzbKg}or3lLc6}0TVQ0TIo zB69L(J|)LJ@*cA~=J)UH{(AlC^of(F&K$Q%Uj3J*lP8b)ojUz5G98zGI(_D^tORAw zatht~)s#zCPV2eX-J?Ok#lMPv_0&~>CSdv7f9~-AT{)_}X{4JP{Q`D_+B1(1i0KLfw1{r?D-qL=~m9%e89H%)3@<57)eeqCJD40qO)r1$~nA)hjGM za?cfv-q>OX4_2n+$DWutOHM((#5Z4fO7SiO^MO(?Lp8Th>3$vmW5_hDB4^QR+_L3N z=Dtevxt+(L-aN5nGm8xDW0GpmW3Va&gAIx9EhE99VS#{Op^Aw#hXnr#_av}0gFSZ} z8TY8Tm6#G-!rU(doBKDATV5wX-4+PRhk}UMF#=z15S`K^SDd}qo*zmYQ0B|ZFOXt} zs(PqYS>XpV8mGOscTRt%fM@6fXajL7Z5lF_=V!Lad^`(hZI#>Ma2Q!i>a(_gf|iC)I3`yh8B%)NEsV)HR`I5r+8}{ zGe~3toN$j`Ob&DBKj;7QcNBmD?gx1rC=elgjkB_gd9qf>inJehAS==>cH^VS3k0!s z$MIMgD`52eT~nGrzVPhttun!W56X-`I&r~JyPe)|)*n;%-Z@V+hpN2-muH$;g76yh zVt7KP8MpC4FTs-XP(!AW$k#!-QnXE48V)VBb|{tN|H2Zklo^c|ETgq2n~9I<$5MnX z45GAVM@y1Gy=D11vSGsC&V2s56;(M6PIDpt=;PpW{!T&QH1;PaQd+BFVNMrjF?pD+(FZD5wutBG3#vjG`XbhUPFcr zDIhCLZYA>~+*o1F9p=H@BtM41b97 zv9eG_n$VA{;VVFCjX>D9!i|Oen3=n-2wE4 zMLhkk`S#D`Z~r1ioI=WbMoT87i9lmavsARBpnIj|3(jQT?PeH;i8ar)fr1Cc? ztOuOaPj;HhL~-W6%}7)Nw9KbotJH01Es?dox`0>is?#QBdX77f*QonO07bzzxP9jt`Km8d(d9Oc0mF6%?(l*DG2hH>$w&ftl04=5R%Qnpsm~_s2>(? zw|qQtNaBa%6D`87wn)z?P-?EXet^~c_XKhczI6Ise96ZuRn)QpvXb^Na($@FRZad! zWyVCTqmf=Xs*(@>cyU+@XUKxqP((-6c*EImSTNDr*X#$S!&}xK{Do@vt6p2 zd9qjjVD57pVFuC3cQY)7aB}A57zPXf7xtiIEgIBYR#bXSZHj~XSXlUh$=iR%1i5jF z&|R6|wVXkn--`;6-g&4}xR(*Uv_nMJRiwVXaH8P|;M&bw`%r%LJ44B2;&140{~^N3 zf>rTw-rGr6J}76~leF4Nmm#*2AB*R3>@@pS9lE&vqVv0C0?@fJ1m`G=Ul9T7Tj^T# zCXIneo`4py5#`~}gN*cx@S)!E{_{rw$tAwDkBV^|&d3_3rf8;j(n&f-=Z_4Cd{C%l zoY)wZF9Iao_+XbFP;t;6%iRi-Q{+da>w3>aMdcnW{GP7Vgg~OoOihF!!f$2VTb}fV zb>yg!s0pbS(w`=S&o4S10g5*6*ZrarHp@R85cG_dUNw8rKMWV*8l@|qeNf$|L*=&o zUYuxC7!~E+;*L)kDOp&><*HHn6TkE)*V2Bo{moG=^r4SjcsvC@DaCQ`?Jin1GM*y{ zKIE-k8A26u(~*Cd31L}P8zLn{f-h7|luFMc9vhU{z;9q*yr8Cz4u-u=qsbmL91>jR-?y_aF^{m1hlI5#cf~{db$h&$*WrRYew@y7}m@ml2EG8R>zh59XPkM5kY9sn{M8wl&$ zU6=j1!L#R=ksD+-b%yEP+_}K)Lnb+AUFRZ0&Bb)U38rc$*PRY{eK&!MpZ8zBufoU6 zcVK;e5?{22zbh*%V_?4JU!q}n8~2A5ZKO5d)*ciBo^b#69}D%rS-5`|oa1AXH3~#9 zx2~<)t^S6x+LGTHUV{vWc}f4mbt>wRo(&BC4PIAY=$X^$N824N9u?NR1Pg)#;n%7qcOIJOia7`YF=zSEy&-Lqg0@#*2eHW@Lw zqP@AS$X^GG@dl(9bAvRu^!UK~lw)g*(o*rLc{B^OqifoRXR1L}0J3`Y&aAaYR?mt? zfa?T%<%|t-6gfdIHzd|py`@{~Ikb1tmANXZZe`_!lvJ)}`_yw6Lhrq9Gey#CR6i?- zaFiCeBVk3WF?v>Uwn8#0!>BTlVdScP3qq=7@j6s+s$kp|RFIm1@Lgs-#=@cI17vE9 z&FaM%r>W7)(;g}9ZyraesG2!c_q7m_f(RPsUddYmj*{a^YJGNF1rMK`lq?3=6*-&Qrq6;-;R?OR9#28m4nX@%v&si02xpd;9Xeq;0_X z^-$!2pX1hCEqcd=>(-vaDVs9H1ze>%sU-y&(KHh#YU|U+>05mgD@J5 ztZ**X-(S5(@!*9EVflR z;&*3713kTA>gSliewULU+P%+@TW9MwHj@+X>T2cEUrD-wuhOdZ82(MUO=1$XA(D8CgmSx~2lXvDv8`GgS# zVclR7yv|FC4v0lx-=J(a7Hy(;?bZ>X%qy`_Eqw+g3|!jVoL%y*WDBG@Huppma$>9` zE%SlOyTR7VrkWfPV@miKH&VWOmOyP4Wxhz5YE)!xKkYdFjHxvkt5RAv%q#3hQ~M3@ z&EQYV|Gz<;_>&QmcmzoPlaT`W$Y-)yxI&ybWpv2z@apj4pUMBq=)@ckiitiw25r)#tZ=oX055z%|=dqk1%ksb{9Wl#i%k6GSd6(Lr zMu?^u7};2`%LNp4%1a~z{Nccru+yLIDvaaZ=qt?cCcm>$8G%=!QrVzdvl>boz?q7j zQ;euf)TOIo>zAr+hEM?ooUh-BGJx5-z9`@41vj}mXpJS%QXZ4m{6wUB2|qWqhAYY_ z_377^68m4YGN^dRO2_))W=^(5csR}B8fa7 zNFqch_=-rG^3x(!|A$z^dTC2z_=}sIgwzN}=FeBQ$Z|-NQZTF}s%St)RNXaWMAX6tj%K3_v5rotp!P}jn zTh>)g;njk4N+}eSJZo8qcp8A94PubzeOlr!&cx}qZnTG#nta)OrB{%tG0MD74_|0E zdz%p;GCswHO9(Jj5xpcjP>}pebs`h%W^zf)BH3Na*E8Wo6t&Q8vgx-!@~BM>pCy*- z+5S%N#d2@O`+kv}Z7JeeTbchJh&Y(X&}xx;WE%bY8H(qn;M1XBgL8Y;Qj2Q>`vYo9 ze?gyqGQ7oa9oe&5XbY{j09W1nD5Blxp2}s7VAw^-+(+f72T;tS5f<3r|KmyjcMAV= zPxkL|(@edkT>vwFe_3Jd20OMQL-MkqF9GuUy#>MIwFm{2NPt9R-Htsk`~l$n>Dt}E zxmZ%Li-TJXWja2Sz|>WBV5!s{8X?svU~!Agu50~~X-KoRc!j>0Ai=UBz7^BasUraY zG9L#=@;>qVet4l;2NO83n=6Lr5stt7@WZES^3|g2JzWzU#3z7n})O!^9aW(8nmYc@7_nq0dn!k>!=ZqqswOioJle4U>m7UOk`+W*oo_jQx&Ba>}+8xyl& zt@SyT@6+7(w>yzSyehEp(N=+1%LNdijD?8P(f*obUN2WWrI3 z2zuCaB`i}~PB2fCpE2sx&|^ev>m5gm)b%`qid*1;hjgr)_Q5}zD}USex4=k-&9k-r zduL|xojOxiHZN~N^qUr|;s?xwD;ubcmEg+nsV}JWMzq9t9$ib<^D4rH8eN*!x=8mC z=fUuY7i|8FqfDB78>#<{R=id*kNQ-y5cGihsh2mqPXVoribBV5O?!M=cryL)?Yg23 z0`Dc<6si`^MNsPNs2J?i6)MAi{99T74y~nH9|v_vNGmK<_521=YwHv$^E#LPB|%E! zmEa>+LwK>Zy}5^+E`+p&CiT`-KPqy)ehkD|mem3ME#{W0gF5bcztq3NWaQg4CJyPtrzIlKjzLY`&(v&=3xrGV2rfL|k=wBCqpCkr zJg_Ty8pd1quu2%@s$1J9yUfKxwwnuRBW0!s+EZ_upb?BLbB_}2a0%J_b_DcJk|`_9 zeyl7$m7PKKKWuLt_PEVbstFdwa>qHFJ_V0_C5Tcjp$!2vx}lui++fg&7kDTn`FLIR zmK}RxmNnv_J$aJ2iG3MKJp+={zax9LxohMyai@1#R%zP9viO_94?kpGu_BZX-cK0=eKbj)hGR0&Hf<7t8Sl1y*wRkRf_!0rgK7D|_Ko6JFMjH+$Fxw6P@ z(G8ozB~#Ro9yuNaXj6PJYxdyaIJ_eP?JB!Fxh= z&|-nxu8ZnLWGcF(gRu7dLR5*gdt0cJ$e>KOY&RG}E<>K`$Tf`Y6>1J)SPBYoJcq8b z_iD4_tl#!{+#5SkrfQsv0meea3G%z(Fk2MjMaxQ zJG*vyCChEw5+tfPeVd66y7zxD>IwZAQfg;iJeZpA@T^ISr1ok~y#ojt!P{Y(Ul(Bn)7+O6EHPLm7ozrYg`FBpEkN4!g9|>Sz?- z-!)iD(kRTBAq^4>`{o>0#xfZ`Wma>x18KREx-Kz8fCr8zV>d2OHW_`G3s;a0Ixo zLe?9u(sY`4=dhg()|+%KoA3UHW|vy=clmUU@KynRD_Ux-5hcVEroWh4#Bgc4R?`@i zW7K*&=k~DtrtCzTo4=CyEJ~ysCFRa!>+zaJcP55I)Ps4ETnAGP#snS89RWOs`%=iVK4ABu-XEmw z2q)bdMo2IrlizJKvGbB9<@FKZPR&EdP0hf$I_?PO{?_wJYt^Poff%Q9$#S;nZwuIO zPlsb86YotZO+DtU?%Y``IWxHCpCAQcm!hc?Ktbk}aRZO~cDoB9rkYk7-fQQpHTpC1 zBSS0x;<&XZqMKn*uW)MMP~D~3L;C5olblfb$BeWMYU!26D-9@u5nPhoU*u$wrOV~I zG&~+q%d67wV&q{2Vf1&w@e9-q`r4a5h;zO!H*2%e4e5sEZF?{2FB4+Ny1&YulAns3 zzfaifZOfc0wWMD%FML{xm(J~=w;gnqLr7-OQL9n>&gI?QxDfBNi8T-X$mDiu))`e& z*%Um4sl?#8HmM>R=k5+&RQQ^?pLU6a6RttKUYAw#ct3%wnHx6OCDzT0;>Hl$Q1*@3 zTIrj@d+tDYxH6Urg?cC$ir9=c(P&ee?sc6N!(&>jD1@l1d-HH^FO7~eGV`{ai%~f- ze_8i=RaL=kobE?7fB5&)v;K!p$j=hJ%jTl)_M=>hxf6bQa#HbKnZPIW zqEkaeQ7wy%vB5E-J6VD}pofVOOL5KV-`%m4DCjNSZ)hv*2$MNOR~vY{W`i-@ulq9a z)PKFVc8W9O&gA?=-K5+~+SXN#F=e9-^%?_Z;f4{oTWnC|Q*_tPab#!Cp4;Z$t4GGa zCJf(9vgkYlOjHT)&U=)U2N*pwl?<@jWE8X~s@Ca>McK`eW*-fW-pDtLFYPqhD|4#* zRoc9>u;KyZbjPI+8PLtc@s5ud?Ib>95WkCER(;vfA<6YFMJ-%t$N`7)HVBfv_0o#e z;m!MYqV8f~Pt#mnah!|xFCn70GRKnVOg97YM*wsL_Kr`mSr$m68>qR|Q}pT7|G(Rt zW2V5yaf%Eftd}Ey-2=gg@RjQ&eme?f0RlO6DjVA5~3j(J7B6%r-GYl z9vVcP5POXH=(jt)EIl)B_n6+Mc{uHjd%Yd&p&Pl{C~Ll zWR2;T1phxG+Exxvow!|Q4msM zNcB<_^-`f%X2&g(DjmNSgUa+CTnq?H0tfBjj62)Ji0p>ppeM8L03X3-0RrDluhj@Y zX@~Op(3Dk%wEOrY%kq?Um0YutdtX=)(9&?wGTjH^C#*@(y@jnp(2#V$)>bQ>g&17<3yW za0iu=&aIf&kD0jo;XexG--&u#f$u#6JgP_Ex-B9MM}vMpubowm zg`Z3mKwKi(WUdgBK|zcNzU+d-y^KY21@xuO!Z!TlH>%qdslm$yDWHI0y8n6*xrL#D zLwR#4Dfpx@uw8GNTL}haUZV-hdhS?{Lcjmw)qc0isqVs;AA9P#EK!b<7~de>+@TKt zIfH&1=<1_4ZEm`z;KSp%w5vnClg~CsP@N-TZtb?rs1c*1!6^6$a0}kK4m|=CkW9rU z3bjqXOm=dJui>n_Qzh6_0@9zJI_Ed-+n}+g*XBJ8ig*^?=By3|ehf>_+q|uFLJcb) zXvyvuG%MKoA(qKfUg*)okB#kO#uEdKIc62Ny2G0zz}04{C&G7FTAAK^=u%ZyKZ&1h z6wF!V+V``{M^ydXiBHD9vt2;;I-}+bkSieV`xObEpuT6*y*?6LJBc#!Rl<)*xY2pr z&G3v&=pbIiZ9$=rgWi2%_Qz7{Wt)VS%lfNlQ)EeNASp8Y$iip{1eS@H7eH{3)e*}+iXB86dDGqx4#*S6WpaI0v1@?Ndt?;;fzIY4K4$p zH1_I?SER=gT!jH0l%5NOJMwdhuNlck4lbpT%lYd|;kli+N2`m}heLtM4ToBO3FOZ< zt(rC~R5G`CyiIyhMyA{>vx{vqjDcpJBPzTbK`Byvi?|yl>*GI218WVG{qFeMW=;=H zle4?+ip+;CtAvK?l47*L?%D`xtIHLPxbt%Ffg-6jYh@_J#h?_nE)2j17n-&T{9&r#GJTZTa6z(euaHVeP^)VS8%;iBKw z=l5}^<__Vg$20m3*}rsAT_p`7y=MH%`R;O>| zoe|L4kgvRqtvz%v;>XODCfKN?1^%T=-SZeUOT-VD2uM?%y`LJPlMqn}-_4g;s6mTx z;v^4Nn8k{@)XjPSwNSEF637oPz5C%^qN4gvK!X4#*gft|%rDK-S8@gtz0x`~&z>!@ zopLDDO&65uEm*lTkQSxf+R>BOlPC8bQ4T)_Y1N)@FkeRXPT#d*92SIG+_$c7KhU^U zE!QN`-C1WmbePeu+#MbZEvQ?3C)fLa3c?1O-q;nGd@42UcZblefA5oKK5f@VDocT7 z{N~VTf`xMXlx|y>XrjC5>SbU?s{3Jv(I?|7Ka><+Pw-!Q-e?_^n8Y*?j$R=kSo^!} zBp%%wA9tB0jxwzBM4uij?Z8Tlu4C$(3)abR1evd${cbzeK+>NkL054UPx4y@ztNqhIYI!D=0*jSUl)jS>Ux*}T6>6kTGYg}N&pBpTCnEXNGLsisc zX0R!1D8J>G_k~4%P8?Q?-u|%^bUWULv^-h0#Y+KEx5Ce?Tyg(=|T8qOVOp zoN!Sry~%l~nr!>-igq-K_Q}dNa4m8-EPw2+)m%A1)DT$}5oJ z`mStipMEa~+5X+{S7g~8;a@YiYv?_~QsTUQMJ~{8g`fht~QybED zh+yK)gy2z7msH&paW&Q1ttO_0ijaoWjHx6y_zHaGAIJNYv;ObXkp6Y^-%XloqJByB zOdGR`IwQ9_L8JAEA|e;@ObCHV5!HDQEGltb!rWmwh*?5QtIEC*gmg;f3=iLf?VX*& zOs~p`fSocp?VU27L+)(J$!X*YX->IpoFz>MojOb3rZ5!;Sk9WSo^L9c3#}wMaX(6N z6E1!&DT!qmY&AiB0sU7VH2xsMm7`IQxYJ4y{>q|@!2 z_`a&PBA#1{2YDlUR?D0f-a#zVc+9=9UwH#XVVLQU^8F-KM$q@Er_DksC zCx>`mI|FZa(OJFauCpT76J$DUSl><0>UY;`;GwGUO;Kvb`iJt`w{t3KI7lUUhM2|J`15Qu|nEd zq&JK)a^|f?8kurn!hJ2z%LLby7n`7s%6d(?8Rp<}-BH-q&o^{KV_c(N3^au0M|FSm zyIHmx2L^-1M=*=#KHX1`7fC2b_?W*Fz6|KzP+TPdJn^&EljQnhwh;Rc8UzQK@82vS zg>`KD(6?yk`WHOdW|CHgb@Po{LD6eIYeJLLlLQeV$h!)7cQz(1{xw)=_dvihB5sJU zFkoF3Ms`D}lEXZ=*3oR|k+_H`=k40qL3!)e>p%2Lz=CF+&j4Z$ZAKv(5Df6_4H7tJ{IB^CVxL_I7$}26azn-*Uy4ehjM`2&J7>z_Uj%~x3;%zs z;0frzl_z~MFtLf+HR>;yfIb~3cct(a?1r^J&te=OTs&0(NE?@l`udhFYa7DYFFb33 zshteA+1I%JYj23)0yOC+b>2E6{oUu`Kr@z`eM_t;WzA4wwrB!+=Rq0?HlbhgT>6d2NBOceXOsT|X*ptyq96KR-7N@U_P3Rf8he2qB1o^FonuajYc_da2fE z=f-?WdY^8}u+f^F0u#YnZbd|{?M0L-kZzO)ZHf9c*ReX?NZ!Lyrk29%%?3`?YvZc+ok>XP$A* z{qpa8?scnf4<>8#hxcQ~A#>ff*_&30vxf24%4+<*r#WZLiNaQw1>aVJS|j%ohKL5p zTH`Y8F%~aO`K}0BlKkPilH{Ut*yrEn$AyqG>}W~Yh7Ee1sDn5F$_!Y0u zmn4WXbPEnNE0U&&8u#OpPEl1CKc^Hv9r2m`z_+$Ww<~xvz{{xlF$s?f9vES`1eXDQ zRps~RbDU`mMZ3^gudQLCy)W<>ROBu1kH)z7$IR96;w>KG_Am>?u~L{sp`p(~mx=i_ zP9=O2+@dVmzT_~;@b^1+edXOPX7>3v`W%L@X_NL2KP-QjGBC{~cJdCqtGwyc~3!$7N5nCrkLqh~hRpW`NWjCrI4Dl3$2+gg7lfBy0p0_QGC7#Cc& zVG=vRLMF$KM3YecSG{^HHMzP%@9tZNoQG-5!JUg%dk*W8UKBe^Qg^4`zzE z>KkO3Mn$E@h(MflPuxVEaEe&@xQdlR!;|b<8X?tr=Sg&#iYjA+f}9zuK#rQdZ-{&3 z-U>?!^ls09sk(F+%C~mP29Eu0DNPED~@XoY=6qxd-^EU$GqzsSEq z5CxSyOVVXHwQS3Em`5D}d=e?TU8FVAA&S1T4R)je>tPncZ(@L@M(*u0Bph*_Su(i? z1YbY*9*bL!xpVh})$+u~zHL}vfa~{K=?j-5+x}sI_MRO6nbLngT(bY$pUFQfy`M~K z7PuGkjTWl?xV;b)if=SF&U`Hsi?k7`x$5g0Wk$#_1#Oyx=oXu92alg!3G^46^9kf@ zA8DJN`Of@fn(!O}qVzZi2~g8s#BfTaKgOhmN2W)`_lRGvdVpxAVM&XPL=9RmJp#Yb z>1`cjZ!$}CeiUJKAlq>q+q*Z-@inT}V};w%$4_hg-9y&=P{6tx;Z)V}!3+;<=B0X} zhvr*h%4@`;H02~v0FEEoK96>9prDdCnVG1RVT7&XU*aMru|w$ExhIq^* z8h^_Y{#1&~(3$PtiexIRwy%+G9avd)9dFr^2Ib^>!G1x6RIP5eM6cVf?#aMBNv%)He-0CP-WsTg5`F<(nP zEz@;avULdxk8@$+99VjI>f}IZX$vXUYO~WpBRP3d2ge ztm_;dtZ0Et5^0=S_8YA>VDBT37e|Q=Gr?&`$|;ndDR-yT0F5T-Jx;YQ2{Mp`P1`L= zjR=ol&Bryny^DEGafc4%L9VoOe(?R{uH&|I0i)^^R- z;jP?)s->A#ikIm8+yoBB-`ijwilq{g4PP9GJd`hxN+)t3>$r~CmA{`JBim249n8Xyp?fa5E}ASF&lR}>f}Z>> z*S}Bylhcei%!5vTc63~D?tM^gwBIG~As3sf9%nV&I^M9f7)+1Z{Z5$cM=q<|{W4TW z8D@s1?(1%Cesbs!#?cBASfGBZD&lOAwTYM1} z9{J)>M9BX59b%|+1b6^A^YFiXu@fo$&qDAFyVNY@Bf#z8o`ZlRz>^0a2e*$wz0c2i z+UW-v>Byc*^YSFhk_{M@aJbw2d*Iu(ev^acOX~5*M#Jy9H2OpfQ|YHyem^u{jTPOg z+xSss|6AGCVRpCElT*Y0mF0ht;ke@DpAyK0k0YjkN-#h1-_iJgum69mlRW|unPrTv z)!+XJTgLL9z}K;C%XT#DLziHn6ZBbN(Ix3Nthhya_P4G|yM^!`1u%pXRwVtpRTGC`pj+w-BBQ!azl$!9i${8?+bGSXftdTOb#YqBSNJhS0Y%;9E8KpY-oi0C@R>B|DNh%@~z-^7BEGgoRWnbgyH3cN7 zZnFDdW{Aoa%*uEpJB)HE!6%`1aid=6Ra9q(mh zfy+ojqzdRL!?oiCWp8>(k{WuW$@ave{A)PH;1Lpzi0M$MDu@VW81X8u}L%7#5c+clb0@plu0(0Gad9bjfa9lru#ba(Q3YMJ>cEbrgld$cF1|v(f`5tyEV&w}FKyh+IaX zKB(W1+tLy%YnnR6>yKhykF@?gPVSgAq74_9O(oNrccI9g@WB!`=?B^Gv{)ctybDg* zx8>d2in(%f{Ejm#S8U$4GZ?&RUCd$8*O#MEfs7uQbXWA^zY{Se%igR_!;}nV4B7*W)9_uBceG(` z49^dNZQm49zZQu*jeHl=FWtW+`r<3b%A`uX>b;*>=CS8D5*}h6qX*4lHnrdHF9naD z!w~zcN|@KCAM&6LxGy((q#LqB<`%EjyJw;j5Y3X_(v~dJuW=Kpcc3JhFox9iYy%Wh zLNBZ#WKu9MOt!$MF*6WVn|}xbZsa(y!n1O|!0d*@_MAAPP+1!hnmoGul#<7o=m)Uz!_OQiX%Z z90L|UXKDy>KMFM(3=l<%;Jq|D#Yd9&SCzc%OEye4bgZ~qTf=?}`(S7ZcT(l4R1{-7 zSc#19PK$s?1zsv&yC2z0L`6*Ag4!6=`WUaH4352(n_lbEYa<@fbFbS|4)x;dpzY!t zA5tTLzH_m4nk8<5>tnR`_Y%4peQJY+D+*#RkV3G(9jvt=y$7wn?z7Vhs|WY6gIsgH zbi;0zND?8wMZ*Y5M>dck_a(UQp=gLjS+IcOo#bBMZfQ27y;A4pzDl)Q=Rt_jje%=R zhK^)={<_FJoP|%bh3)2wWI+>O^rI<>qrq#;TEa_gHmhTCaNa6EnKc!F4%udO=yQ&T zTL!k=dlVhPpV$wxKG$s!;Kg=g3V?V?Fl{%pDpQ~|2c+xiys@P3`~<}3qLIgLUFp6(?8gjqp$zo38Mdz$ zsYk|VjCPQDt@<=vB}OfGU5J5ak zk8w(AlDe9iJfwQ4?uiv)Exi#ORFwTG!*r$_i;&()Fdu#hEHN!alSF8f8D^DXC8o|U zVZM_Ax+P^t0I{CyL6Dp!k|xEVE>9df8=?(m*0>RWoM%uDDMcg$ zlTx#{D6h?U_vIr%$T7+@2KQT!*yHNg6y82NZ1CtTUnpJ`!`d95T)wVi`7K?3$owKJ zKT}>IlKuRZ|!aQOg-9~sDEubDQ2Ie`vX?vyy#Y92EGkK;=j3gn5+h8S96zp zUXE(npk}?k!1rch*iGbg=G~Mjb*|#X{issJ))@hCQ#4_^XMp&jZIN~VIAeLN$d>$S zC}XNz5a=Q2ubJWiS)Bc&sRZWe5TLvAM(Ywdegr%EY!upR7xI`$#3;6^pMEfhrQ9mX zS=e%9Aq7{$inv%lJjE#9333r5gLx$hVV<@n@V?$dtz(Rx9Dl)*KQ-P?(E1m$wqegT z#$v6FBS9-=QXFyw$k2?PAbLd2jQQRtO6!}Xq5?9_i4*9iID? z)v<2y$G%{Tf>`rll`Wu6Qp?V893ll?-?>tY7T~-&7AAhytckY7hM5z3z{8h(OxPvt zt71ip6=>Z0j$=3B%mBLfoL6e}FrSkD!Dj1OS3K3jg90oYUP=pGTFbRrRJ=E?$a4XM zuI!HY3uuDEDUy_9Ob}|8<3|2z_}4zm+@`qM?mq%btL}MyX_S;5XESeam$hDzQYefa z3g7NS^lGnH5U!_CZF6BC;vb|O0Wv9YSO7CA*HTtFr=?cb8}^F%PRrQ^=k7kfHoowN z3QX{#^ZIb;)ro!gA`+|H4X&{AaB4|zX=_Wg^28!eaYI_n`l&f=dreVOCrMm|o@uVs z%x?79^AT^ARYe1xn@UuTTAKwvK7VRm$t_|T`6ZT@4@bI^FLPd}Qm#K)(4!JsAIWA- zTICR!-TLjCL`&c5QB)7~1@qGw{DWPzh;z(U_%xfR?%oHdc*tp5+pL=lGz5M!9w7*n$IhgVup7$!3 zvaGX7KHSis&FPm8^X+d`3Txhvzt+7er61fRl?hr-oGNsywrxi?6X>RK&o}X$m5njZ zFmLiz__bS$#g7*Ck+EQTBhkVG$qEP)P+>$++RU_h|E`XwSY2G&o3VCTuX0lH?4!Akud*r2T zyB~!1;%B(lDRV*rxqC@0F?&w`@%uLRPB!pBV`TwiV?(SXPVz5;+U1Psy8gwJy)7LW zUlo;FSkVU^>(19j&NKuy#97nyqNd)u)l51CC>4wGrLaFZ*p|xREk)nXW1Rd9kAEJZ z6_w?g#4G=(H(&8ZrT<+qHNERky%J1LbAkvJQFE5NS}XMl`(CV}oJm|_GkU_kTZ{}W zx}Ms*)V6R)y*u=@Nq0g5zP!y=>}y`hd%sF2#Gsb8nr(B2}PZ&xqXAKWE}N1 zqwdlCP~7)`a^Rf=DlB$XE>%R`UT6}f>y_#D_9pTE8|tD71nN*HK<=5tcTe_fB+_67 zem_@;9Uo@c^x%?jS7zYK0*o9-#OoxM1{JVl7M!`TfQv0@7~cAOKhu1RNx& zNVJS0`C`&8Zq6-fH)1k`QWALZuG-e+w#Hy+kY)4ECLNI>+7Z18?#Yt-Fxy6`O3M7| zPIa+R8oM-~2bMo~S*pZLa97(KgDSfQg^W@ivDw;w;uG6lGGaP2 zvV3@kc=S>Sko_8QOkWg}aSZ%LA6RA(y<8E#Hd}3D6c98rk84QMl@}p~dS2Dg=PS19ztIj`l;El2WT=u2h=3}+KV(do= zPx15OhNh;n_fv?f*RIfVDY;kA(e4~Ccx)!&i$?&uF730=TO8hQ59l5BqsNBG-raUP zxZu!ycJ^L8FRzj4_qjMiSL_kPEU<3gPosa-wL0knyN+gm50+AkiR04+X%fHnhzL~c_-|YE! z=A7H+o|${*&i8%a$j%Tqzfq-mz3cb!1iD`;>L(TK$9YxVC7EyBkN<7rZ(=N~@;z{7 zc-SsJoQ~1CJE)|kzhR+br5h14jrbyi+f#%_EgA5RC=*X{I_@eU0rLI=Xq^-xcHVU- zq13EoO-h3DcQgE259u4G=wT1kk+T};Rc$9@_)`n`Ew8V|NK=R zIR5JP<|pTJS3>X6s+n`Mu#W%^3flce#)V+53q{?!KwWqBTYtI}`c>iq6bbVD%%%B5 zh2lHtb%oRLO*xz!n+D-%zD;HmM=w!ZvdG(|GHk+Md5M4Ra*VQ_bm7tS9l40*a@LB& zKd1TUZvKxeEgS0+Fn9OEk*%TN@b&Teh`m`E;s;)4+oJ=W_?*NP-!(-9QKu~^6`-V! za4MjAJ7g!-s8cxfj)XR3DdwRYOa%aq=dfmF}x@r$Q$ilfrz&E_zOvy4p@Yrs$7)6VkEnd1wOU>Caz3HLk zgW?@e7w;rQwF$r{B5PoKwSRZOw@dW5cPj6h3s*g&GUqN>m$1D(h$$gQbc) zi^d|&VSBN$$QwcsdP9a;ZOyRg{0ENb>PuIYtb`hVtI4Ef5Td87}F?Yhqw2phL`^1WSeAa!(f`(H_| zL#(8KP&U%`+eGXU%2lFb`zL_pWJ~ok>otkrryK* zx%tf!ZZ_ZBG@^f^@)Vt$423`9(y3+81oGrQ%@w=Ndv8|f*}Q1M$405{-om)RQyIwL zch}pIo}h4Tuq;Q-M$e|g@?2|~mzG}EMBJP8vCz|Yr;Ci~G|Gml|lR-izBqS$!8Ju-35lLqjMc@K=(V9XIS zFNX}$j^+(`nkBc^1bj&~CAaPpVt%DJ`cw42kg$O9hfcVVGsdSot0k zSp20PKf5fs`O`3?D(0-lIrPiaUyyFhoGKdX`m8f&S7?XoIMK0rBdl@Q$FAk(Lf{y+ zW&jpl@g_^(g5haEPgjxB8&RgAHhRcX)Z|ifRba*$US1w>)MY7~H#jsC8itFGLu(u^ zd@GWuP*<1zqPNX`%Z@wWIyqK2CR_0y!o64E3VCodL0jy{+fx_Z*o+f~;nP7!mc)1y z#%IQY`xlwL%l?#Q!-{A`fq&Owt+x~-_tpe>P=7~o&~ZXzgIRspnL;0A^+wP;AlFj) zQb>MO<6y`i5sSOkuqRwPMV&a~VMNaXQ-NB*KJ`2NLTG_MHPSQq&>UzLM}Eb`dihT= z0H2$HLM4hsF2@Rd46TtGnu%o&i?XM)pbhgUDi zt04Z0<|_8G}51Q+uAknbNj`U(bU~(teat^Kbcn-T#elm$|~9bvD`r%owS*vw$L?UK`ZjQy%x`)}Yz z4t0AtmU}qW4S79~@C++6mQe^->HxvR#CjktqYKp7BobnJn78d|;CujeAb>h2KsM0? zdtQq#-1m9|ObW+Ww%^8KomADL^WVc9XJu1DjqVJOvxl0zCLVhtG<#Mq`C$@gMCC9v=7UjGN6(1MwN6i+V-82+Z(1DTx=h(}B^bje3A z?^a=Z?DHq;bUYZ7*GMrBGvN`9Y$7d%{hT-jMC8RwLr3-Ari4$|w%H-OIrYXd2Sdv9 z;=Q=3+!={NNkri3!NLkey!!{{!Uo{fz(s literal 0 HcmV?d00001 diff --git a/Docs/UWB定位原理/UWB解算原理.md b/Docs/UWB定位原理/UWB解算原理.md new file mode 100644 index 0000000..ae176dd --- /dev/null +++ b/Docs/UWB定位原理/UWB解算原理.md @@ -0,0 +1,108 @@ +# UWB 定位原理 + +#### 1.三维坐标转二维坐标 + +​ 在割草机器人项目中,割草机器人目前只考虑二维平面的定位。但是UWB测量的距离是三维距离,所以我们根据机器人的高度`carH`和`UWB`标签的高度`UwbH`计算出水平距离`dxy`。 + +```cpp +// dxy^2 = di^2 - (UwbH = carH)^2 +for(int i=0; i<3; i++){ + this->d[i] = sqrt(this->d[i] * this->d[i] - (AnchorPos[i][2] - CARHEIGHT) * + (AnchorPos[i][2] - CARHEIGHT)); +} +``` + + + +#### 2.多项式拟合 + +​ UWB的定位是存在波动的,所以会根据UWB计算距离的规律对计算的距离进行多项式拟合,可以起到滤波提高精度作用。下面的计算实际是收集不同实测距离下,UWB的实际输出距离,利用3次多项式拟合得到的结果。 + +​ 下面的计算跟标签的位置以及高度无关,主要跟UWB的硬件设备的特性有关。 + +```cpp +d[0] = ((((4.9083e-07 * d[0]) - 4.6166e-04) * d[0]) + 1.0789) * d[0] + 5.4539; +d[1] = ((((-4.1679e-07 * d[1]) + 5.0999e-04) * d[1]) + 0.7930) * d[1] + 29.8296; +d[2] = ((((2.3514e-07 * d[2]) - 1.8277e-04) * d[2]) + 0.9935) * d[2] + 9.8852; +``` + +#### 3.位置求解 + +​ UWB位置求解采用如下图示: + + + +​ UWB的定位可以用下面公式描述, 其中$(x,y)$是割草机器人上面的UWB的位置,另外三个坐标点是3个UWB标签的位置,可以有如下的公式。 +$$ +d_1^2 = (x_1 - x)^2 + (y_1 - y)^2 \space\space\space\space\space (1)\\ +d_2^2 = (x_2 - x)^2 + (y_2 - y)^2 \space\space\space\space\space(2)\\ +d_3^2 = (x_3 - x)^2 + (y_3 - y)^2 \space\space\space\space\space(3)\\ +$$ +​ $(2)-(1)$以及$(3)-(2)$消去二次项,可得: +$$ +d_1^2 - d_2^2 = \left[ -2(x_1 - x_2)x + x_1^2 - x_2^2 \right] + \left[ -2(y_1 - y_2)y + y_1^2 - y_2^2 \right] \\ + +d_1^2 - d_3^2 = \left[ -2(x_1 - x_3)x + x_1^2 - x_3^2 \right] + \left[ -2(y_1 - y_3)y + y_1^2 - y_3^2 \right] +$$ +​ 整理为矩阵形式: +$$ +-2 \begin{bmatrix} +x_1 - x_2 & y_1 - y_2 \\ +x_1 - x_3 & y_1 - y_3 +\end{bmatrix} +\begin{bmatrix} +x \\ +y +\end{bmatrix} += +\begin{bmatrix} +(d_1^2 - d_2^2) - (x_1^2 - x_3^2) - (y_1^2 - y_3^2) \\ +(d_1^2 - d_3^2) - (x_1^2 - x_3^2) - (y_1^2 - y_3^2) +\end{bmatrix} +$$ +​ 整理可得: +$$ +\begin{align*} +A &= -2\cdot \begin{bmatrix} +x_1 - x_2 & y_1 - y_2 \\ +x_1 - x_3 & y_1 - y_3 +\end{bmatrix}\\ +b &= \begin{bmatrix} +(d_1^2 - d_2^2) - (x_1^2 - x_2^2) - (y_1^2 - y_2^2) \\ +(d_1^2 - d_3^2) - (x_1^2 - x_3^2) - (y_1^2 - y_3^2) +\end{bmatrix}\\ +X &= \begin{bmatrix} +x\\ +y +\end{bmatrix} +\end{align*} +$$ +​ 矩阵A对应的代码: + +```cpp +for(int i=0; i<2; i++){ + A.mat[i][0] = -2*(this->AnchorPos[0][0]-this->AnchorPos[i+1][0]); + A.mat[i][1] = -2*(this->AnchorPos[0][1]-this->AnchorPos[i+1][1]); +} +``` + +​ 矩阵b对应的代码: + +```cpp +for(int i=0; i<2; i++) +{ + b.mat[i][0] = (this->d[0]*this->d[0]-this->d[i+1]*this->d[i+1])\ + - (this->AnchorPos[0][0]*this->AnchorPos[0][0]-this->AnchorPos[i+1][0]*this->AnchorPos[i+1][0]) + - (this->AnchorPos[0][1]*this->AnchorPos[0][1]-this->AnchorPos[i+1][1]*this->AnchorPos[i+1][1]); +} +``` + +​ 那么,上述矩阵可以通过$X=(A^T\cdot A)^{-1}A^T*b$ 求解UWB的位置。 + +```cpp +Mat AT=~A; +uwbPos=(AT*A)%AT*b; +this->uwb_data_.x_ = uwbPos.mat[0][0]; +this->uwb_data_.y_ = uwbPos.mat[1][0]; +``` +