From 4993ad74c0aa6dd281c4509c168dfe491e005ae0 Mon Sep 17 00:00:00 2001 From: drowe67 Date: Tue, 12 Jun 2012 05:07:40 +0000 Subject: [PATCH] first pass at fdmdv_get_rx_spectrum(), wrote octave tfft_log.m to test it git-svn-id: https://svn.code.sf.net/p/freetel/code@543 01035d8c-6547-0410-b346-abe4f91aad63 --- codec2-dev/octave/tfft_log.m | 49 ++++++++++++++++++++++++++++ codec2-dev/src/fdmdv.c | 56 ++++++++++++++++++-------------- codec2-dev/src/fdmdv.h | 4 +-- codec2-dev/src/fdmdv_demod.c | 21 +++++++----- codec2-dev/src/fdmdv_internal.h | 2 +- codec2-dev/win32/codec2.dll | Bin 439004 -> 438382 bytes codec2-dev/win32/codec2.lib | Bin 10842 -> 10882 bytes 7 files changed, 97 insertions(+), 35 deletions(-) create mode 100644 codec2-dev/octave/tfft_log.m diff --git a/codec2-dev/octave/tfft_log.m b/codec2-dev/octave/tfft_log.m new file mode 100644 index 00000000..89364968 --- /dev/null +++ b/codec2-dev/octave/tfft_log.m @@ -0,0 +1,49 @@ +% tfft_log.m +% +% Used in conjunction swith src/fdmdv_demod to test the +% fdmdv_get_rx_spectrum() function. +% +% codec2-dev/src$ ./fdmdv_demod fdmdv_mod.raw tmp.c2 dump.txt +% octave:3> tfft_log("../src/dump.txt") +% +% Copyright David Rowe 2012 +% This program is distributed under the terms of the GNU General Public License +% Version 2 +% + +function tfft_log(dumpfilename) + + load(dumpfilename); + + [rows cols] = size(rx_spec_log_c); + Fs = 8000; low_freq = 0; high_freq = 2500; + res = (Fs/2)/cols; + st_bin = low_freq/res + 1; + en_bin = high_freq/res; + xaxis = (st_bin:en_bin)*res; + + f_start = 2; f_end = 100; + beta = 0.1; + + av = zeros(f_end, en_bin-st_bin+1); + for r=f_start:f_end + x = (1-beta)*av(r-1,:) + beta*rx_spec_log_c(r,st_bin:en_bin); + av(r,:) = x; + end + + % spectrogram (waterfall) + + figure(1) + clf; + imagesc(av,[-40 0]); + + % animated spectrum display + + figure(2) + clf; + for r=f_start:f_end + plot(xaxis, av(r,:)) + axis([ low_freq high_freq -40 0]) + sleep(0.1) + end +endfunction diff --git a/codec2-dev/src/fdmdv.c b/codec2-dev/src/fdmdv.c index c626e9d4..2e88d1d4 100644 --- a/codec2-dev/src/fdmdv.c +++ b/codec2-dev/src/fdmdv.c @@ -224,9 +224,9 @@ struct FDMDV * CODEC2_WIN32SUPPORT fdmdv_create(void) f->noise_est[c] = 0.0; } - for(i=0; i<2*FDMDV_NFFT; i++) + for(i=0; i<2*FDMDV_NSPEC; i++) f->fft_buf[i] = 0.0; - f->fft_cfg = kiss_fft_alloc (2*FDMDV_NFFT, 0, NULL, NULL); + f->fft_cfg = kiss_fft_alloc (2*FDMDV_NSPEC, 0, NULL, NULL); assert(f->fft_cfg != NULL); @@ -1362,55 +1362,63 @@ void CODEC2_WIN32SUPPORT fdmdv_48_to_8(float out8k[], float in48k[], int n) /*---------------------------------------------------------------------------*\ - FUNCTION....: fdmdv_get_fft() + FUNCTION....: fdmdv_get_rx_spectrum() AUTHOR......: David Rowe DATE CREATED: 9 June 2012 - Performs a FFT on the received modem signal at the input of the - demod, returns the FDMDV_NFFT point magnitiude spectrum in dB. 0dB - is a signal with amplitude +/- 2^15. + Returns the FDMDV_NSPEC point magnitude spectrum of the rx signal in + dB. The spectral samples are scaled so that 0dB is the peak, a good + range for plotting is 0 to -40dB. - The output can be used to plot a spectrum of the demod input. - Sucessive calls can be used to build up a waterfall or spectrogram + Successive calls can be used to build up a waterfall or spectrogram plot, by mapping the received levels to colours. - The time-frequency resolution of the FFT can be adjusted by varying - FDMDV_NFFT. Note that a 2*FDMDV_NFFT size FFT is reqd to get - FDMDV_NFFT output points. + The time-frequency resolution of the spectrum can be adjusted by varying + FDMDV_NSPEC. Note that a 2*FDMDV_NSPEC size FFT is reqd to get + FDMDV_NSPEC output points. FDMDV_NSPEC must be a power of 2. + + See octave/tfft_log.m for a demo real time spectral display using + Octave. This demo averages the output over time to get a smoother + display: + + av = 0.9*av + 0.1*mag_dB \*---------------------------------------------------------------------------*/ -void CODEC2_WIN32SUPPORT fdmdv_get_fft(struct FDMDV *f, float mag_dB[], float rx_fdm[], int nin) +void CODEC2_WIN32SUPPORT fdmdv_get_rx_spectrum(struct FDMDV *f, float mag_spec_dB[], + float rx_fdm[], int nin) { int i,j; - COMP fft_in[2*FDMDV_NFFT]; - COMP fft_out[2*FDMDV_NFFT]; - float fullscale_dB; + COMP fft_in[2*FDMDV_NSPEC]; + COMP fft_out[2*FDMDV_NSPEC]; + float full_scale_dB; /* update buffer of input samples */ - for(i=0; i<2*FDMDV_NFFT-nin; i++) + for(i=0; i<2*FDMDV_NSPEC-nin; i++) f->fft_buf[i] = f->fft_buf[i+nin]; for(j=0; jfft_buf[i] = rx_fdm[j]; - assert(i == 2*FDMDV_NFFT); + assert(i == 2*FDMDV_NSPEC); /* window and FFT */ - for(i=0; i<2*FDMDV_NFFT; i++) { - fft_in[i].real = f->fft_buf[i] * (0.5 - 0.5*cos((float)i*2.0*PI/(2*FDMDV_NFFT))); + for(i=0; i<2*FDMDV_NSPEC; i++) { + fft_in[i].real = f->fft_buf[i] * (0.5 - 0.5*cos((float)i*2.0*PI/(2*FDMDV_NSPEC))); fft_in[i].imag = 0.0; } kiss_fft(f->fft_cfg, (kiss_fft_cpx *)fft_in, (kiss_fft_cpx *)fft_out); - /* scale and convert to dB */ + /* FFT scales up a signal of level 1 FDMDV_NSPEC */ - fullscale_dB = 20.0*log10(FDMDV_NFFT*32767.0); + full_scale_dB = 20*log10(FDMDV_NSPEC); + + /* scale and convert to dB */ - for(i=0; i}1~menz-u&k`S`To{9GcaKHeV_MzUVP@9vwwT- zwbx#I?X}n5XCGU?9QIxNu=>rzf+)+uL_w=gNBJvZW}dR-Kb%1s`vrVWIH;a&}e-dd1UJF+rdAfm^gkHp1l6jnMmiP z%B73eEMl0Mud5lxiOfT|Kf_;C4C|9Yq}7^jqk@K2GwIGr%VbKa!g>wEsE|E}pQIe7 zh~V#4-le>$I#{WEUZL#6^Fvf4m0xe?6IA)i4cqy8RgiMkcK)xbD5Yu}|C#C@<&WF= ze(GUEn(G-x{1|MqIit>0s^E-TllWXcZ%~g`zPODqQiqRFZD$zvg!PnP6G>zHcuj!G zRO0W{m1m3BxAA{buU0lZ&kxg#pj(nA8n=ThHQy_hE<68V-(|{0cK)5dZ9|^e!Z4iB=e>1RR*4V)rgO7`$uDC6{ zvR_31dZIidoUxu#wfgVk4gKO24SZ$4okO=!MjREgo(g{8!NP)*ZLVwQ+SCVlz26v% z9xeDXKQBi-$1)68ptW5HsQm!F#u)>-Ox^ev*4BFI_U+U(1;beGI^M42a{bujijVAp zKAe;zC|oV+*5fK+nDvAzH63K;4sIuvNy-fj*m?-9vitFDi@*rhqP`5{x;nK@-AE#F zOOc#>@wl+31Jr^|x}Fi9B`SfZOd;6nRHftwnon|vi6dt%1Ns)~U|4Gj9_x7@|GV#Y zLSJArK&X{Km!FN0bnDGXpiW_^`Kvb9bcmQ_4m9uJuMZk(iE^?T|GtUet*JG?DbQN; zw@u57i;I6*8Tip}X!-G*p)A^O3><%g-RVNjwvRWgX3wz~XExhJBq0D}x}XY!uG{vs zlk^&Eht7IBux-ydq%KHAt^Q4DX6s?fZwm<%4J@=O%`^+K?H*$v5pgzv5$$SG+@ttHiDvUW1rALKGD*Zk|{KZ|^m8R|+Rpa8KD1mF<$F?-VH zT(h(p#TiCwKA^eQTj{CusXKpQc`_qbG9#8JTPbc*F!lB| zC@9{aC-G-V-C+#-87k?+o+E)zno6ER5xKqlsJ$x4QqLa?NJ}}lNmjpqJNi*5=oE~d zg8B-c+pfyWkL9**27B9?0NY={q)ja%(-qLB?&K468EILb@;9k`pU>n{Yy4T)w4~{( zs!y)HYJY?gV?bqMU9h`0HFE+sPh;H`r#->HrAt)mPVhH$r!e`vsXML556z;s0<-#Xy#!HJ-8sSUWoN`-8W zLE~r?3GL~^?oV!@2MJjQM(ptzn-A3V0-9(uOF0hr;72ai_oX@Dc)>jw|fb4I^x6Xwn=llbEtskiLQ zZa(l}!AbUK`_a2V{`TNkMpdI?O0EyiJ?%!zdJN3 zs)A&64+VeV%^PW$)1RPTgFN?0Horqt zP02fl4Yt@1jiZ#wl!Fo9>QCx`Uv}kPjlTX6d>UbUJ=8twkr)w3Nn8WCHjCLZx}JuGE=Sr(}v(m z)dQ78?NLb|1RkN1pUJ4Zh3AEJaKux<+5BCbE6ORE3&tcWXKfw0+U@iVpGFh$N0^8| z>Yj+Xx@xGf7_+=wB9*Ik5W=cH!eq@sTJyKujJd^cJ)&T3^)y`}|2J@!@@e3iza@Li zgTa;GyFFyE_9;e-;?q_9$dE!+zRLD7UlTHP3^_dEgzK{F-PX8Wq`Tv!)H7`bEo}u& zZSa9tALEaOOz@+;iSHaUDJgQ{>RN&!PTl4qfNLF6qSiqvG_RAIclDA&R`I@>!`%b-QpS`& zgxz%+NTY+Y%-_RbkOq%XIr|K)DKCecp)!eqzW}V$hmyL&?8eR(5gev-yb?WFccgSFXZ}J zPw6=&EAi$Z?mMIi{#y&z!4>FAeeIiqQ6&u7l%2y(ha5+8$SQ;Fn?it_a>T!qu$#0& zFf~;eS)9qfX&0o)F>#xANK%<0futYQb8V!cKFWU`IX?{tB{WH*XArfiG&vcw{=lo6eCC0YIn{O2u`o z@epF49C5##jSx;8j2t#&&!K7X>(<|W%$Mw$TkOU|d8NKE)vFIM%zS(9mIq3Gv&D${ z3^Nb83y>vR7D^SsgUIsNoCu46R_*rK8xV-y8HQVSmUyp`VIJfP+6!U(Irge8+-4Wr zoh44;TStXj1|WAHXA~D;XtbNefz!dj7I>R_T_+S=5!B9;x^mVQ30~|;a1i!{% zD9dX7Lv235e=vH4lD)+*3Lm@FM!m$@NhdiaL~Y6vAA#PXJ+z+6Z6vjD#x3kdYMVSH zGqqgC&Mj>1HiD*FfAckWcp_a>$#!rlX@D0fX~acrujDt3nWWJ3uZ|h9v{G&b)`z5Z zlb8)h#Mx#-ucZo8ex5kGf(SyefK)e-)yq^7L}iz$vOskUtwoO2iQpLX?15XzHfp(@ z^q}6%PYN44A+F5LNULszj3(CBh)m1}LP!`?w2Wa&wN&ArRs6$Yfr)>`DDal!QAwYY z9PNrOIcj=QWv$|mg^g0~eTZ)l3-p`U#kBvb?PG^5h+86!UNnOd1rsFRxfbm-W#{Kf zwl98CP9o|htA7*uCa!jmL@^C=HMuik_7_VPr3|3I075fO;zIu6u|ebR@2TcyXwFpf zXcu^tbpLt<|H{~r$^kz7D*YJ#`>|mwCANMD$x1OBkT=N77IS5gwUIA?>g`pBFpN!N zDpmOB9$_N}oZL@v0VZ*fhXXkUaFD=1R`S*30y9_k@&#goRF+(U|NX?pPj&?;22O8* zoUG364X(|RC}0Paxo0JRdEAisSKuP%+l@5zWzRWp0UQDO0pEOy99pvPr17KA z+7I8N84_uYJTt-f+ILdbHOD3EvQd6EYZr0DymZdsHXmr##7WN6B)*sGHli{#P2D&E z9;pN>N`pP+z~L68@vhh^Hl{48-W z2%#?;fljU6jLklmWWbnv=s``Y4Y2ha^)UDQ8_1dG)W25QcKfPPPVv{2t8CXi^awKmb*t*P%{R$>}aonzLG$^NS}XCdN)k%U=XhFXAnHbf#X2uc>H~R_J-Bu?Hh@m6oK~WZhw<)rYjzc_FKtxNPPwJkzY!}8X~Xgq9)#Ui$^;u zf|a@nJFkhPjCN$PRx)7LDoR&r)?9Xj#V%4|!3p$G=_1((W`nWFl5gtpi@Kd7J}9{< z-L;SF>wU17d~i$jc!i?j;2SZ|D}pn80=jU-gT#iayjWzFlF0+GwI8HyYgDp5; z^DA>g!I+OX8%2_>X&)|Jt~mZ2mnqVFkOD1hyrOR4kH!s+e4!ot2b*uI7^dcAHA2=m zFDbA;_e8@ftf@Y8sT+`eO)CczZ7xCm0I_06;)Az2_5|1tSlMHByI%Esh|f8m|NG}Y^hsN-z^ z;(AWClaQDUUNu#5-1=Ju+uwXm-eJl@kGSHTU`=l@)Ghoh!%Rgxzr%1=+kOd62~gkU zOHxNG&hcF8Y-G4nLvZ~mHHKfCc}z!AnAqI&oQBI&iAgtjAYi#Pn6<1A3-u@ez?Ydql}SJFKiyvv z@FAuu>nV5EbJwM;{nvTBX~}SdJF5?yuMz{0z~-XVfn%=o{jx?|1X?jjbq%Asbns+d zksG#wnr)rf(4aoz?DT}U8sm?%^5aed@TMmg+Zs_9?6Xg(ICCJEb&FG2k89bCiz+to z;g{R`#CcGY##ebP5Gdod0 zWT^zUMLxXA&i(M#l$t+CPDG!`HJ>tZ<`BI5DhSRIjTrh-7ot8EzC-wQ&A&}x|AqZB z1_G`L2bG}uRLJ;LCA|*g&!$aKoacW@8@cQ}Ok9feuzjTxhIYTe`m@OX6+bkuN?TK< zqj@FZ$-$5WJF~W*1GcUQ0FyXegk7q7t}aqgFx-~r$aiqt(acw81zIF5mF!`IZ?lv@ z5$w6e_8^T#iF9@@Ov&#eE9G?+Awv3_mQtWI+bJr_)V=)`fT#=OKd^6UPDj3bOIWf= zw)PT1?2bzY+@iQ`5q(f!O(d?!sz5x2tTNoD!FrQ^G{1*MvhCx5tuKS6{m?H4J|lay za{9M?N%nXPhj$E|eIXjhYS=s#SNlFSl-u$CQryr<;&0e9%*qj$fNuT+>?W#&vq|(% z#o{>~X3R=y$ekoT$fky3m0lLpOJb_s1WE+FF8@vt zV^HBeyhKS?*I%Tv!9vERoA}+5OXB^Er|=+m;hF!N(hGOpg7nhs^(J@Bd_sqKY8?U; zxy$0I%iheSF5_RC5~{e#pP4fD0i>m1qf4^3f_C9Mmyat0?{}>?b>^R4am;0U8v=2J zf*XSI2DN7f%FSEQRv5sM6;>ta>1t_#Lbr+*CvWCmk0k=%MdlJhxp zD?B@unTh0sZ)?%s`O=I;?qAiPo7-O{`hU$2Fb*9sP%4n=LV;GSX?(usQ;gS@onP{k zrjMlCoaqV5BVY1$(_@RY=rmWRj%L-WU{{?bAh5>*1G%uE|!_5~au?S8YLW^<}0Zs!dYH(_SS zP5d62aE0I&bcKIuraoLM?n{Ni)lNH|ID9dz9x~xIJ7KeHWY*VbR)?NvGn=@~1IOEa z*iV~{FGyx&TaPmK#|Ci5CcggO^pJCe9{=2j&8@apH4U<)aK>}k-B6t7GSBlJ_eKxK zIfV1p)8XzZ(|nGi)T(oQ?0uX4GvsdG4Dmk6;LqF_n)kwG^qgSaQ7Gi@&gOD=3kADi z8N0-zz~{5g56~8P?jg*un>k}Wm%9U-)l$x<4>TLk(oi5xoJGlCE@R^@_6M9i5KWi) z$+Lz;EGNQ3w%NnNxY@-1fb0+3fj=OXV?Rx2jc2V@XZf00BZp0s#u1`b@^Cn#)EXz5 zf;#*%|K_ZaFgD`loBS#@z_tbs)g_S&1&z%{7Xz1pPz^R2_4D|XQMcIw7ke_r z?BWAvhbFt$x6iQN?r-T6^)pwXzxDx_>wyNzu8rHC3+L@S>I|F1Lj-)@ zHlE_&n;o+JD555c@HpeqB;zYp)45!1Yn)P?;0j)0bDaMxK@> zR$P({YPu(ktC!P~L8lZPUH>jvAc%9zb*iT76h9|(jHM}JIpma&Y^9S{f+0#Cr$r=| z1uqeTV32c=Kcn&Uu{l84N6ze8Uw7=#<}$$yg6)UTV;6;k&!{_qY}^{?#?=uqIhP&S zW6lvjxCtU-FzquC4ZMtn?u~Au^Sg*>-8DCnULp$D6Nfx;34E7S)=z>rU-Lmx;|nMr z{y9C`B4GZsRrfAlhX_uIR4?o!-zlgg$t2D+GY#lKI>FQ?&>5z_oRPQ89XvkRdM%s{ zrWHNBNv@xLp9<}@A0dY;?AKzlH?L%_|t7AyQJ)0?(CZ1oLHloFXtgtY4xYUiKfW2tmL6v#NQ{=-s) zE+H$0uhbRufMUQ)@hDqIVJurG#oKihkV~62v`^AZ@hWZ-f$xrHIV5jR=l$o6vQSLR zIw%rm9SzcR1D+cdQb8$mN3)c>qgl$v4f*M*)zFpsvnB+4X($eDv(mt2rBTc}ULeHr z3a-tPWy8GiL{?0Htb;6{bvQFDnr=Cz;lS>YMhC*H0P{DjgW}yr1&)Q#1O26^N>S*y z9>u_!ie>#|`>dlt6x%h}i){7mjW!!wso1p+QwgnMWE-y_8y{>y^b%Oo+=b>7ssMWM z_JZG4%8%m@-YPUJln=%6s~25Uq#rC?oa3V$7R4W0Hd*;iB!6Ss_NbXK6r6X!n$G5I zHM`a*g?3nt+fuV4VF9~;(V~~!22&TwA1RJhW=8T?iwkuo6u$O(as8XHczBw*{JiBO z2fcWY)RwCc!Y9G>vqj@QJiEMDv6=5&K1ET>N0&T%ciJS-8~tGV2r|Veq^upba_L#E|GYt{?(>iXeAWEu9B+2H4sl1X!fPu-&YsY#!if3!;{qOs?iXTmnb7`#NIS2Z)?0dzQ1 zyY(h);Gg(en0(-v!vxsBpRn`nB~0jQ=a(3pJDqrTed9vx*@ASdjnZTddk)aUo?W<# zK4W1^$3Dj+&XUqiI!oG)2jNw^Uf9zrJyTYjjf%*8F(RN z1MDBdj_kERiAbYTLq_ z@JD_#EJhsX8%NI4dFtA*dzzJi?XvjPg!9;8w4dcSLaI1ei^1%hvZ8plHHJ|$c z^QW-Dx8da(`<@c8zgmQ}Xhq3<);60&@ixs20IoBxIO^E0+61|_RVYJ}Nfp3vX@z5p zZ{FrFtQpx~l*rG~)xYCQzK?lIyc4c~wwg>-gV%;{1f*#IBNnzoSH@Rb! zjdya+QTzt;^m#XlPwh|b2*9aJsV_581d3rhN%Om3&p;cdG# zpd-WpP}A!jS#K1(AsWM?Kje|%Kqs65RVwR=c>k>DXFd|9%=nt$`bena8@~LJk;+r! z`M*8#p<*7t;n4`+qOTy2s>YRC!XJ8cx}uE#{n71;vV&XK>J*^Z#t!0Ne{8(IWqeRM zjw$Xxi@Qnu0;dSli0qVXO&i69f<~S#JnS z|5{fb@Y)HEpN$9WNo+4}WU<4D&BeATCs{T8Jb!ZioQWadfP-qIF!#w@YZkjQxSQ5r zeT0SFtqnz7>e-G#<<>t`8y-Lh?RR$YhN`;|JS?qRGM;%isGN)Qqbq}Izzl-eRhuLq z?80#~mCHvMPIYuv%~V2f$r};|QoBF8X%E@Rw&3F;siD>l4=C#SOBGBnZxdMbxd?YkRxGXr^)K2~*%iw!kkV`myih{X& zno3ZgBj{?|H}dxqgK$6D)Buk-T`-Q?)Ph`N-ELoYl3IWj zVIX#QVGSScj{s;7#7rZoY_s`Ss>ejd4VD}xwql8QTsyAr-NC_s-c#FahQaoR*XRe4 zh-lN}D$iJH3gYL~j2L!>aH#>US6hEYPrHXwO%QLZNmhzq@yBac(JgvoW?UzTDSS99 zU^mmXl(vZ6(87(hyV=kDmECxQ8=*zFnK*yy!~K5zp^XnJJHO%st+Nc_umx-;9M;p_ zZew7Uicah*L?E4w!#Ct0ai9XHZ`q8uZgGJUAz4}A;Rya&>w|-xFc{PR7P{JP6`;=N z;?8#P0kw%##l5v-htGsLqKZ9apIEYY;y&yA2|;(|yh zyU~?R0u3t1p1-jXr%n86r-D8^L&1R8-XnwEW*Y({f5|q*LLKPxZH=3UJ0x=Nax`by z5GPfq32G@Hn|yAHg|^+2k}pQlnF}uDnAAp2bxdlr-Pl5vlJqnr6*p1)6zRPLDn8k! zrb?&{*fp0eCuCF~cROD9YDcQO9kODd*fe60-1x23@_9PD3cH4z`L{Nekix_2EPbg@ zv$>GNdj6HV-~rT=Ch-IgETK}V+dipFo=7ZUI1Asp6|l9ACYjt$sS~r^+LQY-N9xPu z%_0A#%He$N=0Q;1uFW?kj~eOQ?M?aj*kR-bzGhcOkQcNQFkk$N7e9ISowQ+z z?Y%g1g0e^C{NV|!pO`a%SJ5gDGL{U)MGW=BPDZGO24ziZIIavPk^tLn2#)!e;$&Hw ziFg}AN{zdTE6owDSX8zZI2X*vgw4=W>OBChRZgKm#8*$~6u4BPI|LY};_{b9WkCn_ zb&MibDz~IJR(ebai*cR#gx15p*SQpFf9Zl{1%opN3(lZRPcFeX{iD)ht zM|${gEq)C}>Ai*1)8f4V^f34ytyWT_ZB$F9)M$SDmar*u!#27i>fG%Tk-MMNotK3P zlGGoyc3J8KY`XX+%E_{)}YeTbfmi{QiTqhsI3mvZnPvU{YE$n7D|3dXa- zz}_A*Sf0z)*~h?`_S(B#n?vSb*tp; zsgc9`^24_l=7$sL3rk`D#nR>wjXmDBwlD?LBVy#GH|dWUI&K|wlwz%%V%w{J`D0tIOS z==n(4)ncI!ou#*tuBu?X=|mYJ<22q?o_4>hlou|+!ot%x(^C}~$8?M@kXs9b2-wOY zEqq5SMn>3qp2|ue{bBJKh+r0rAjuf%>mUkf@qthxDbf9b(4H0)u(a)=^^SWn^C@)D zYkl`$*I)8NNnY-_j?3%2HXHFI`=pBG*RvbJldR&;m!n~KtViW_UDA62_Wwb%?12|q z7vIT`wfM+<=<_XkEheojq;DcKnzXJKmrYiHbS306VXiKv2n(CEGo+>0KVg1?MD03E z`7m=?do*h4gf8B!$o`n*c7H28xZor{7T$y}k-Zds?ahPz9f68bGb;y|vtQQyO83>l zI90+aYEIz)1SrRm1%(ngKW$gt*mUFy?^0;kCRATBR^LcBYh3CKpw?3nCk5xl&*{t5 z?{@_$GI;gVcUxK;2A9{@-yYlKzMpsB&${o8?t6>-e#m_n-FKJ!-r>IAaNnKo`ziPR zocrGCzPHQwVPmhjfurtwgZush|F5T`_;f|0>Xqkpd#^Ne zO;--D%3$MPYM{dP?;}1ADa8*(=SI^~_I4+M88%-TO0?N8X>|6IwI1 zodRUk;L)P~+n(v7Ug-v;i5DUtX1qWC*Nt!MCY|v)GU<%!55p*CLQpv-1_l!?!;l)* z^-3Sf)Tl!n6#648U!;5b5&Lw_qkVb(Geti5uRI)mOqx-X8z!K=c->Nwh;y5GL(+*| z`E$TJ??W6!za@yt79qVDcYLQnNA%C77T<(hz9%@A44s- z0P8^F`5TSrNc@uV%fN3oesl3#h~HxT%J5r*-+KIN@!N{uF8rRu?*M*{_`QLj=kNc( zKmPx%0>^){H3uC{IhwUcV&`h!r&b55bPUtrQ0HlKElr7cC#5BQmUJV@CwX8>WJ+Ah z>Xfx9BMoB=WZ=u`^<~#y%U{5<5NaqqxuF=Ew8#uf?B?Uz<>quq$D2 z!q*7{EQt$}ij)4D6qlTm{94KmtCP|$Xlr$_UDkVN;ddjR6r{NvLCx*`q)v31BovF{H{wGyA*^p*Tdpd1z z8j~*b`ZDrbv^pjvCM+g4rZQ%2Om*z(1dC6iE-@%^bmH5IQ<8F$9!^@9bTX+v*^&HK za-Wp2lpw=0!{pRysRPr7fYBG!QZ$nUTNe3zq#^2os5fKYj#(7DJa%pD2DJ01*yy+w zapiHl;#%T9j|-0HlAlTbBIR0&+7MuP+OXen*zixoqiHp1b!mS|JC?>2VY4^_%(%!e zBgaLbiH?a$j0uVz8T&!35IZ(5GR`kyK*FemaS2;79GD7O#cxEfjj4+Xja?KwH14Um zV{z}tDdH>Re~KRfr8XvfobX3NSmOA^#KhFZ`x5U@d@=DvVrd=~RX z%!Jruu^+_siyss}K7L>Pi}CNopN+p7e>;A5LQcX%36%*a5(XyDM1`vpEs5I`KTLEb z{s4^@B$X!dNxvlhCrO(enp~2+Kl$&;{Zpo-RHbZ55mLky#$p&^m|#dV%rO)iHX7bC zd}z2}(5CiJ4N1Kx^}f`HQlCxTpZa}j(d5@ApP2mb$rmSoF?nj*lWC5$zot3U-lguS zhwFm>8XtL2WNPH2k$WRwjBJV=7&R_xR#aY8VU#&)d(_iW&qq0gp3HK#rC(KKzO4ycgFyU;%m4qJ?#-RO~i4P|}3Jus2Urlr- zewBDDQJoZ+G%hIO0r240(PhON(k>(;TG%!pC zZf{2Z5cOMBpXhPDm(Qf8+tOesr2qTNTrwitFBUNIas zoP}R!#_HA5+k|-QLJrY8rwM zQ2xO;N!XJU2ocB29JfazG>BReZV&%gWE?H?VgK6n7Hrz9@FOBO9%3SRYH2olVzV1LeypfdcOA|azZLK1QTh$-3|`3gvdCDt4I2~b0VH_{g| zTPK2~ZjFor(tuIajob~ygt63(q*19JNEXpxfOgX?BqSAcLpQV%kRGn48(9yedWttv z59Hi5Z{%g7F?u71fTU0NM&74VJ&?K-8J_&&88NdwZE%`o?LLnc5b#F;YUF)XKKA7nkN?!r2` zd;A5oqka;>M==*8M(Y?*sR>fN=NP(96RIf!ugH99Boe9g?QwPbo^tTW`<E6evj_4Oko0BVG`|2jSL}`SfzvH2@gN=%+8y6M?h#?0WBz*07{`5& zYkVD>)@uf<15u>jv46cLbo>}R>PtPPsgd^pF+Jo#JpAe%SJ%7wsT)Q?!4Aa}nqWt0 zrKXSa7sj!!N;6WEf|3m@B?S*L;yJRSH_3;|xv|p2lqf2Joa=$q0_p65@IaW=-ld)gLjO}ox1Aj# z8u*!R1(}dh5;$+frJBT?1317=pOSf zmDdM;;am@>f>^KfCaMO~*#oHuQt`Mq&5J-9dLT_e8rOT%&@1%WiY)0#e-rc@0SY7H^tkKsqyeKrMhwc5k8!#AvGr=^8nbF_KG~ zGm>Gx?RHlE7>|PCBq%CU#5($I)QnNK*E=FNYDSMRZR^dey`B)_^}FMEttQpcxJonD z@evAHC_I!rALh(eOP8&VV$ypd(M)wOB!+SJLNN0o9Ps87$E5c{;+g7RNCM+b=mjM* z?Y$68j}ttsJ-TV%=6JhKGu`7UgKFU^^BqaJEv)V$_O!>@3yEghdm%9lgV4oW`dCKa zh5T8i0eTM$1yiG7)bfN;?3iIA5&lQfgIN^g?1e-#%qu-O(=!L{G?OjOkN+}?Bq}8FyjgBR_B{HR|UR5%0 z^+eFl&pk+Qb`;Mkohuv@Hfu&J?2gRMnlXWTU$vX#pHV9q$M>L8I2?mm5U0QVza`c? z4zrlOztX}O=y6E9ig04NGWud{__i^;J3`xGVRrr;xk29vN$&1f#`wFw)DUWA7Be)lDml6xZnZ z5-kWE-JRitxp-OM!Nf{~U{z)5K9seSg`~cFx$UC?uc5!`k8>r6i z1j7nwFYviLNYlGW(@1F|Y2rIlwBM7OL5i--Gw2V;gM@$f6!;vtgO90;^rf93U4Slf zd=8BUzHtZXye`t?)Q0=O&{0ASFUOOzs4Mpv36w_}U(sb9X{4kpH->tz7+vF7O4XFz zQB6e`=|qyKg{mndu{xg8`1*RxVQm-HJv%_v0rPScL0^Ge?_gNnMfwi))g035MIzmG z2kB;+^iMkOieo+%UI=Lv8IEsZWPy#a&z?3~&r9P}9#J8V4;>nf!|s6BTJS8&eu5|E zog{sfyBNooU7AroaW|!h(eSLV?ZP+$Esdi;u~cWbvaq7TWO_O7x<-=UL4}**xKv*%OkE=B(XvRvwUAT6My-jk8PIsUm@6J$y6QScbZ^vIXV3JaH2R+g_~v|TiX zm5az>GBdjnB$$s-suOp2sU^!+lp$5rgQk^4(lIy&yE?4#(ke;3P4$<^zYa0+}56<5JX~K8+9;KD7t|(lxc&R7Iky+ma(F;9_>H0Cu zt{wu72IBdXOT_|dfPCEz%Wz!Si^*)RW57Oix!ygC%hW4C9oVCe^%6&2d3P^xKu-0b zaS%<9CcX;9xk3&-py8FvRxYV{j9J^m2%11M)6!+&M6`O@8m77j(Wf9Hfk-@A#4muj zdQ{&Dq@ha!FPRas#Pu zTSx@bT_;h_pi=JmNtQGVNMl#2!bM9~tww5d54o0trX64kcuvZQg5NudEC3}I}HSrm{)Tzx;b|%;Cn*4ZKH5GUjMII zROTGzX&kZ{Re!pAGt&1!3UNxIuy{qK6Ew0#6(ZU!$I4({mxzUhi&n2*R=Fm!3n7k) z;4|}eZ0>a%;sQV|?zxwyo3d4_DsiH&N3jZb^~6HSR3G{Ec}${{qPZk`({| delta 26329 zcmbun4_s7b_CJ1Sm>Cg4#zaL$0mVNk8vlm>ASh#QiVgoYMKBeS5D6KxQU@GHxLrrl z3y!r~xLcpxvW-$#E89R>!PZ(WtGO!}wpLdqrE<&Cjqm&1I|GAmzt8Xc`wg#|d++-> z&w0){&w0-C_j03aOvhJa>T1WlBz*D+Q=(z~+!&^d(F6`rC}WsC48xq<^@k|8^KWZ* zT@3WNs{qibVUm@*0>`SGG)$JI89=J;VkiYVqB}KdYD?{5M%)z(R4AYFnBe?G4FDb?h$|BNA&91-^V=9^C=9#NxN~yp)4Z|prY~W`q$0(Bd z-zldkL)C}Nm48$yqZ{~9s`1KE4ScjJSNZ39zD_kl`C>i)iYiPQ$@BkIJ*b>m&ks?L z8THd{h7mson+#5`H54m2y}LpDcsHM*o}m1U=L^(R$0gJ=413bt>Uo@`v3y+NZ7>vh zHET;V#Nc}VW%YWc{bhcPW*l8&HQ~4%UaPsORJzyk%LcDf?%K)!ZE)wPcXmM3qJM%z zQ7G~jCE`bXc?bWtN6@5#7Hz5BUD$l1kkjAbvVD(u+P#W^6|(wnPVd_y`rCCSymCm$ z&@!StBb+g}sye(j@(Dw9ib}qGNWN*mGTZzX@EyDh8&ykZ=5DRI&8Kt!IXqpIh&sIXLYI!Cl-}tVBvx?HT1v5d zHMVH8N;!$Oxm9adzeJQ)$}9MtPG%*l*mK4|!JmrAM{`8)1q^eXyj8G}+=As6{hqP6 zQ&np1?PRTLr`{J{-W#0R=v@qQ{b$v0Iw@M?VN?~%qQJZ2;IfL*Lsux zaOi0FukOH%R#eoDq2o+QFy0i@l1qHY=>r5`>#AFlPY5@zAIvQJ9C8#@k`r3V3B#Uc zn7VBCD|5Fyyx-DXF__i6pSk)AOAdQrAg!8ctre3QiQcDZst1}+Gbo`&*vH75+{VmC z7UnHw*co;~9o5TXs+aHBTB?7xmg=9arCKgTjki_T(Jg&un|}#4-ega*=gyqsXJ}`| zm$4FCyH_*JE9CVE`W`{uiu=y1vS}i@9kt+XIpb}484Nnr?MSqHcdF0vuV_Ri&{we3G@M7(AV&|$he|r6O>jp;r1XKpr4tMBOcY*K{wJp0&Y~iO3i&6Hp@GFM} zD{r;%JBN)@-frO!4htBrI;kxs8wmAVli{?TYTy@#1uNWn^#gMiT7JO;Ge-J?#;*3m zFPulnJ1*oM6rZf&cRp}nm=>VWY>yH|AuGsTPzUfS!>8N~8|O5=839Puoa{aSdPn$X4l zSMV#mPDz|}Uv-Dt)fV-;bm5jtMaabosaxGU_ftC*s<+M~gFz8VT#2Z|N=YCU_H{~a zLn42IN`|o>nG8gtSGDm)BPULA zAlZmtU*%-J1HBk7&7CuPa(P--!KSFJf1w1ihA!zYwz$X!c&Ki zsvOnOnYUMT+scpi9XFb&?k5mGtm4ysBS)b(IL+$oWsgyO#-%l}-*>8$`F*}23P1jg zZ`uR;dM?{XagxicM~{Vc#VLO3=IMA8(MFF$CNdIQ#614dF|lC=lF`v3ynwfDrPfX#L7jy(M}s#0jq)f3^&-A?OsR=T zq`uDF?Z<5H(Gxg6;18d zEUR|NePA?w8~d;6TKJ0q#0_4Z3G#$#ldV-(K8i8G~Co*6!_YgAoLFnfF`A|Q<$29C*)qm;exSC4nNaMd^5=}O8*7TL`o+QF@Bp~-0SF@W+w5?ek0xIs@OdY+?v1S zm#=yV!Glj3H+mvPFyW;Avi*Y&-A1xN3)$sNXI^_}-tkTZHDMFKdE7KlO1ng9;vYA` zV@B~GjGM2VvWXuxe*B05u}~bgiE7!CH;o&~7mOdSJpT-D9B(r*PXk7MrD>&s09VuM z3x#T`M@iC457jn$f`&b?ukq>^3fW#SrjB)VN?)X={3`6LNyamboo>8oMW>2k$}!4k zus)HaXyB@i>%vxW&(QDkSX3J zowlh)Fif$+VBJ;+c_Gec5Kb~33cEgDQ19c92aF#?$_VPcd}lz4vSKptA2?p|J)abq zYT7_*noT?K$Y3E?(vj zP4G9piPS}$UVId_+hq{nnhORN9|T>jTcuHH!T0+5#Jp~TJ{;9aNHXQ^H&LZ7s zZ#QJX1E(OX`P5WF0_{>h@QA%5=P-V3wXB5QtnZO@tR;kgPrsXmD8q18Vs9w+$VnF; zn@{qj?zcZ`&F(2yWEgS*i-*>csy?|Q4{LCeG;_?&Q_ZJCs@k@r;iDi~M)MuDv56lO zJWhGwE*~2_sl-aP!|f+q(4nLx3q;^W3A-^zaCI&E@gT}1{CN(K7%<2v|ehhJnv&@5C z;oP}7;)L}?;D^3j-3SXfs1k_EDpRF{>TWqn=8kCvlxHmm?;=_6&Na}Dx|;trX!NvC zOB{^c)fXVEfweRt5#e6&3(6F03elR}slff^e99!Bm}6)Ku5vty5*%`LDf;Btbq`f~ zId7d5s7xy1nyNQB>CDpnLTfL;a!Jq=mz-$TNL zN1X;j3^0hpog64CfP)17TE-iu_@tHH6AZ-9(OOY)hy|}dLU*2WEI>AJdI#j>evWX! z$rNw|O59(@zd2>p;%dZ*#a2DFeS?@w@e-|KI|YJQb0vnblC^;vl-f^f`4q;|Sqpi) zAwx7KJ6nF5-11qu<*!ZQ1E-FkkcecLrk|7|S>0;&LFLI!pI<(8r0M>aei#}5uUk62 zYd}N4AqAd$8+uGJ>4k>w4+W)$?$`Ujv~kwRB}~|}b1Ag9g;bsD3+=?i{Hq&6`+L*JDW2yq zPM?(Gu$mOqQ49%f5TAtM@2m0p`$Bs?g?2tAWVlcKz&gGRTh{SqA@PbZ{!oa&;yiyg z#6Kz>?Fshh^6s8F>51U;DKvI*jM-GD@*%GOGHp(7x)=pQ>J?gj&@otzSmd%xu7{3+ zZqzg^EcU?C7anNrR?!;{(_pn`C0QB;^mP?opm25-Ef`IptB_^6u!eezq#HeQ;Z8wO z_-kt%OtdhwTIw@0GsM3Up_58xv2_iRR@OI z(g;Nimx}eXZfk^Nphh4Pb^7y((rFbC8*)W=iP8t@#U7|VB9!XOK-DDG(vQmr){?o~ zB=_ZiULsWx_(*mDvlCL&@pBsPLo^_#;l9IQ49pu5UZ~jJ5~Xaj&!i*-3rE@pM;h6T zG*T8b$WZ`Pvfz{(agy^7FruMoaG$-TLC{uIilHd550s3!b`5_y^w}tdG{5L?J*@*< z&qa0Mab%B3Z(f1Pow<|G4m2ejF^cnkxVGFQ!(j9yZdrVk}O5Cyv|^K zA1QtF5Z|y~%tVT=1Y(dP*MgQkg|(#WUJv`Nfi!>WV@Co~vtv3e&kd|=1Yco^G zrq#4Ia{%rzd|=wlFF`x{usrqJO$u5M?(nL^5MEmTdkHtfJ~O3(i-)nR%}gT#QdOMX z3G2t=J@_LM7)#e^r zBl6x!J5ih-={{I@ieb&1j`3-D-8b(HdF80N~=wiI;cR%bRhaq}%+kviO@?=iPw318m>VMttW zixD9W8$WO+B|BRsEeJYS4buosJ&#?E^U^K{>dttL(^aCJ+?@A)NDHHnEN2(u2fW00 z3H$e|(~U^MT4K7&e9E0uy+`yJ25fS0nl#esC}?FO2*|pznM7CBOX3*MON&D&DC{DH z$`IKxxcwMjiv0txPJ#UdYcLFwE2eTrUtXh+QdIDX`tkT(s`oV&)@2{}!)Qm|andeg zn0Fbf6QfVqncyF=#$&m-#n)PY>~^Y#;gsf+Dz;nH)#oG2J$MmQ0)Q#FZPjx$2)?y=qz^g;{BnD0fpXinmL^8=A|bpBLD7Jq5Jf8racGz{d6H)iIFk7Kfkd+WAj2x`c*?%#9-TLt1- z49%?Dj<+gEr)0XI8ZkJz@I4>5VE$5!85TW?6=6&lI%oi%=0h57#@bH@r{L06;@4O) zMB_t@kRE@+<6_R(v4oTIhUSPB`)uTSwmIg>)-O17mObEmXsmQjtm_b zJ^k@pen{GP%DQg;*R=6;8NV=EncL0hE{rTVh)T1kX{q6F_OJ7#MZSXvF3%5gS}qF9R9h0!o~3}+a-9aeaxD84_XrxEvQ(bWrHjM6`RfaF6&d`T zN9Jp3K9rBmNvudg^KnM>Yv>|r5sdvT zgHs*n8g3ywrXIva+=)cQ9B?~&jep7zFjdO#L7BnTO6wii4joemnL5=n>nfRbi=op0 z9Ghn6(hjzCxv`(M>0grE$g&A}tWOQ&^me`=J=yOpp)Fs!vDua8&GzA@cus#78v%;b zT-rJQM0)thvs~Ue^XaKory4=X8qczM=c+cJs|JH>^6!$-|#~-M}-U`7Wr(OlZC$4zoWwqy;15~hMw-&(b~m06@@jE4|jAQU;|hgh?u zkhu9vStgu!_!1q$5%k;5{O_~;Rv$-SN1ZRHKOU<;w0SOwhLppqMJ03yY)N% z;glubqy8mHAa$eSwJ-Svv;CD5`NoC#8SMubsVOZ1-h3iAE6O`*?r? z(rE9K%l!4(6Egn+=aI|$g~|$;=NzL~bszFXH5%QkHf!5aFWx%`gA`R|!SReu0MJps zSAY(_j@uS0C>U=0>CnI7Qh%Cn*87+wERjY*TRhsN2dZ3dTjT)JNaRRnv%XNVo?oz1 zT3;3-q|coAJgw1+xjIHr?|%&->|*dgtlLi~Al*59Nx#b}*y>9JvGtc?a0%mfg$zP@ zRiXGrQVHh9NGif*j=9A>_KxxISd6rM?7ibvu(Y1|HHNRAJ3*P##UGp-Z2El{qO5f( zl#>Hi^@pS=SO4KkTo6`74-jDKdOa>^LN!zfXOZY_k+@HWC$Q2ptGMe0hg4|dqK(++u&2SwJrgalmn(S@raGV0XovBIg!6kEUNo3edOhaBjIz0}ne zNNcjbSODNctu;XbN+!p8^a8CrWafx-us#IVwCv?>t*O55#-u~1mrz2`mu@J?5&~;w z(!wl8w?eZ-8X&w#UA3S-M-k{u8`FrYqa!Sx0v%!*%qQmf25ZgNrm|Yhdt?^Y7a6E$ zJx0AhbkTw(I$VQ@4gM`TBTeUE73!sHXq1tI(&b^sf$tIOYc>L-JkVbXmV)Ih6qCn! ztix=+cF7j9;hX~{A6l4{Pp>#myO2Nz@s~MLWIBVXT6)p<5I#k2c_XRXenq0g?)U83 z#T4CMpuwuOoSSWH({~^*CWhYC3;DIVvlR^AlshU~1#yGht<{5Q#KCG=gNm)YG7cl7 zIuXC-W_M{bCG6sC)|XwRV)sgEdqrNc$j3wh9wN#kHK~_x7YCs{Vc$5)&gK^`o@9CpI7VPE zPDNls?|dDPORP2Yv<%)s0nQ-27=nu!iXja;k{W7~Yz;MGwnmCFH57(m0BHq+)(P4q zlKM7@roK%MMQuctoJax9_|LW)ilF%L+DE-i)Ye%W#Rk^4PrBcS`zD3NOG>P7lTz#3 zq-0!>o}5?-0~!B$oGJy`Q46fpTv@5@vbIJ-YzOh%Cb>41*Cx3!-LW=ueb#m&)ufRZ zPpCMlJ>Wvk1A}>Q<2BYsv!W&i&K%GUeUcLyD*0PZ-{D-=lTU6P2&f!cY7l27!=?v< zr27cE=e(xkAzhq|her>DNC{(b52KwqRcCTE9_&`DBo2s7gQe_P3K?Z6jwS^ewzncf=I2Fvb0a8!W_pG}%)i5Onz z{2YF8$sLt4Joa!%fl;CSdo=&Y<<}Jjhj%`f>85--g1@pVN%?RDA5^$ItO(}d9>OLo z&WCgu?G;KWfs<)8_h=X2440ykJDQ85oqrR~e^VH$d_9~Wy*gi8hRoN$EUbIm4W<&* z6@2aL@xwL9L;@{?KoBxRd^wDNdv&4WARkbaqIijatmyYMUJM1j-V<>SlTvXPo^V#N zQ!id>v3tD)rbsAam>`;}mW1-t)&xf39ElH&9XAJY+vwB~mp2t25kd>#mGq1Xv)HM^ z(1r8?D!yvX2o!8vGucFJg|R|v6%K^qP?%JVuvD5h4>5|;h}M_l?y(0+v;ax8>07UPJqi#-Jt7$^kM~JOePJe`K(ka27!Z1uC zub#()?7-;t__M{qAqQa<`Ph}(+d`|rf<|bu)8RxMf|V=6an|wWnK-Ce5PF=<*lbVT z;qI`I$4qFQcdk=^+@AUZf#U5Mk^^+=yX-TX_%|O9OrT8m)IILxSs-{J=heSJ-$~_)B#wp3uV~gFQ+*y>zK0%o76^0j~cS4A&O%W7m$> z-{X(zA*5Y^u=EA@IkC%BoB!NbqdO(OXS}O(sEV>Zxj{I`wOax|=AT;oxiWG(pHaFV z3!kS;(-p0Ueb-G?DBAgivg!CODzhkB`5R^1mBmx}O;1cQ^{uy^n~Y(2Gna==7+?9s zCM%u5me&;DqxGjcT2TBP3yPojADgzE+2})O$q+rbRQ@id&yM}T_(O(cQ7l)?#atD^ z7UxPS7U5{A3hk)PLWegMj0uLyrV6_#0XUA=aF&+I)Lmbpc{ViT-hR!F>8gn54hub# zL+n3DH~aVES1gzUcY5zj+~UY7U8EzY(qi4~^m}nXofQ{er=(5`Ws&(vXUI)}h}Wfi zix55jFWAb$+pQ!zCl{x_0)a36+$o8S6+TH7a<#W$XBfgEagoG!O7IV~ih1d0gh1i4@Jr|ZGCOD3!TN4&#ntDh|ooGSu(MBcoHf|sv7y6I##^}zmt;9U^+0pcs~JY zxAde6^@`Kxb`&8UtJP3Y=sQk+RS)OI!nb^et*X0y5XDp;h@puPpO+C5N&-9!hd=?N#0C2t|Wh(T^KnPke=c6c#gqt~H*Ty3X?QfPU| zalZMV2tt2_BQn9o4H;-~-Z0 zPr1Z@AQQyn?^eth>W)I~>K-EV^8A{QHl{>%q3zS6vw@gerQi3maF5;I?B5>+Re{B>l3IoKXD^uD)JA^BXGcvB%j>y}!Cx_r zzqH{Widz29PlkBZkvOUy`}pY_cPsWC{_94q0u(LmaQ@4uf&->b8&Qgr zjt4?;HHiO$ebIkm7!u_D#%XRu$TWWX(-nhbkeFdOkT8uu`1H8J^W>)m)A)~`9_yQc zrGlM2h~;~Yv6yS**ryYoUh-!BDmm#5v822gnk(m17;A!s@f*S zTpTuUR@vQzu~bIDmU&9pt$0iH1Elx)+g87=(ojxP^zfD?2>0Hma76gorg-f+uyLMp z##*SIx0)7A6o9!OL7`wONFDUF25kHzc)jhnTa^&xBBb9J^c?5m+9F?GE zU;_Kq&TH~J6vJ`G6?=Yn9dr&F6=*J9br$V`biSZ+g5oZ3u8f{gS&Y%CQ97!cjnnbu z4d)MR2Wa&{&myQSm3&9##IOcmDL{63xl@5UEq)!l2P1!@rb4U6!1?A^1q>${q0}=f zXIt_0<+oIg8{YlA9O3bz!4i7CR$n&tox7ZmL`ZJtb96iZck{B50q_{ZfvNOswUmK6m(zuO z%g?Hgp(38Do;3C#WJD4B8|g|X5Ul!r3OgZ(__wPUk0gQZg9RMyP_RnLok$6Os%7Gc zu5MzhZ{#B1>&C6(Hs|@C$QM{fEFkZ*dv3!R0HO(g{^mB7xmSzLB7F~LB_s_uf`qc_ z?HMG{@KP*e>6>uy#S2S7@NTvR8NJ{5J9%u2WfZ(zu%wu%2JIdlx?1wMyhg`@NL#7} z10$?8sHJr50yrp^TJ}jsz7$5sKRCblBptC6Dd}w0w^N}cJ+(>2ZIqsZRVk@pjO(Zn z(g7Q3vg`N-4sz)6mWv*V4n1VUzO!xIa9Q~sr1>JPRfTPZAK|F~CFYh-_N!6yVjhjv^;5bX)x$C{7hPsyQ9;p&D9M+TTGE=I{;#$Ao zC~_=+q;@z=*Is*D3aOzU{o$0q!;YaiFzVU0AruBPbGbx{2RKghGj@S;tPQlIf%ShK zML{_va$X39P0ubIwo`>=;Q+{36pkO!G?e$|{7uvN7DgmW>%> z_mXNzHx>4#J|bZ#4aJ)uU5qZ8p}Es^03Dl~g*>rS9ZHogO}RuLz;G427XwVl>&9A~ zUc?ciyV8Pd0Q!T{u;u_OwieO!rE06Omsmu>&zv0FW4wl}Ifet<`472KT8a`ljnyA0 zZgCHq2rMF@4dSwH@&F&U1tSc$U3z6LvnU8l8M3~!N#8gxh;!fJ`32U^BGkpcIJo_m z#@@(E8=K8ejeo_8K>!?nfYwSf&R0mWrb$ZkC$|Ts$ck;XhtxRq5|Mg<%$<{t9+Gsx zIY6vCQP=3zr)L$0;%QnbCQh+V9z^tV(qCoC=EQQM>FD!=Dq*Cn`SqKW=h5Av-pyBDQEbUIy^sj^6CVf9xq zsik4~B3`jGd4a@x!3+I<=*pNpu}>OeoGmf#uzOJo4U43AVfq+acTPnA_~y<)CtIxD zI^5fp?Yw*0whktF!Io0)XFI-bB961nt_xb2jC2ex$6jqluud=XQae2_pFGbUY~=In z(ngHA+ZT%x_O0E*|wfh89yH9>&YPSbdyHDh) zU9RKhxJ>cMw%%UppnxE8b-uDIznyB5&L-G5`#4TMq@Kdbg;S1`3v}v%l9ryjot!8g zN%(?R70OhWAH8>QXw$-t_wmaJ4Hqzh5Tv&Nb3t*D#^ds^gWfKp!7N@dDk1|qUNG9< zE=_8V-!#$OhURu+90I}r`xzolkmO0By+wY{xYI&B$v3GW`MAc{uqk=OZ%;e}2FyI= zNnGql-qzQsXYl!f?csy!Cz)2ueCS;+c@9Ri9BE=Eq#k#-x7#hU0i<6-E)zzxD%mK) z(&O$A#csrVi|@nr1c};yl+xkivh}FN_8|6S!$pq8B)8+$UQ^yFoXy#Wm)l$nef@36 zUQ^%uaHyI*U#tTbdtlKLZxX$QeP%l5eC;Y-;eNveDF9>j497PSjIqTlXt6}q^C%Wr zvAsDK>BwO5ptPJvEaWkt%#ZQ;klc@`}FlR?_KmX$4_n!}R8-IEpVi&&O z;QJH4n%`+lZMYuB*EWy;b$^VyaOK*S8~CSRm~^=Dg*kqTc>c;eOHDIpKDfSo#e;=~ z6*E_$8kxYtHKhTQCkF%;t}|9hH!BKP=NGOke{y;G%D(6FRU1~7uV2LwabRM=!t4bL z7%7AE!8MaB=E&HW>F}&~J=NnDWEuj>*R88qA5glkA^?m^S2E0pXBW)E|5BL6FKQNj zE20l>cyMg>EcseLDOlH} zd!8HbdG2yNqZ!gms!RYz?o^)Rc?6T}0B9|Ugebr>AEuaaSb1`qGNo%EITLVwKz1hi zp63EQBW^Jmqe=Qyn%A}-TidF5zcQuk@dpNI8c;Iux!|7XMm)Q+>Z)0*R~}odck{2B zos7ActJNy+d2YVvnYl4s;)O9D6O6%Z@{O90PP-lZ=(OtBgunt!70?SY7^O)68KvOq zd!CPd>!$W^R8$`GdWo)$$7ZBzo*e9k|M6lQv``b6)D;X}@hVGYH2x1u0+`^dore40 z!QS|mEk{~D!-V2mwh-3^4AY3MF~$IzhirulHBp04?$R)Je7`#O@g&X|ZcKQ*` z>?z5OWCZzRKcHb=!n45zi~NIzIns!K^)lL|Lb5Nu&d)U5$KX2~-v#();ky*ymG~Cp zTY>K;e5>)@j_)3P8}WS=-zI#Ir#HfBW3 zq?lux?CRKOV?U3*6>E+= z6&Dj<6#rxV2(WERXh~>G7?c>9Sf1FPcsucdq{u+qwJ>yWSXS8L zuvkd;pK$kxtcd)GpCa9KTAiORMwg;X(`D$E>xy+2-SfJmx^ueAy03LV=x*!OQ65pF zqWq%bqH?01jjD^<6Ll!6BWhU^Qzps9Yzvx9Pw(z;fP-%tdTG1F6#cJ`&qXx zYC}{*)V`>#)%&^!Qv2n30V%uUr zjJ3z!jE#wVBCaa#Qrs{&n4qwDNuh54= zOG7t=nrcJ84E-^5Y}n+m2gCGXkAh`$Z7ELoXDa`TV$QC1%CdOE-PwjRC&}ExR*WZ*Cu4`84KA%#ShSVkgEv z61yn2F!rg~{jq4Vw=eEc+=;leaiAzrGW0UR_V|7AhvHAfpN+>umz#ujC)`c&O!P|( zLFd2(sHF}*BrYLt0p)8}OTA=?#6u(9Z;#`L?fv*KOEu*qB0|wuDG;fsU&ithJfNTt znOU)FV+FB5Tt))pruYxK?y4i_5&)zLOI!U&0wLb6$UGnc z54a*(K$-_2tAI3)bftMF2v8YnLuT#NvI~O=S<9brmrPpb4e0?Qt668e`8d=ptbm$b zqx)3(6L@Ly{zbo-e*=;{0I>t9!#};~r?~;d;OB}cQA(x1D>4#DQ=ls{4M5WMjiV><~e zc|aTD*yjsVH^4}BGi?huXeOANXUa_6nEVxMjU{lXu70FYhC(0gr&+#oC3qF|A$VY3 z2m3|`g2M1=1=2MDxd4`^-HZ`czjXqEl*PCrGk^rd zx+1eE*8n7)Xwb;|`4j*NO)$Aa<$#*dO8bd60VzXA(vLI%VGxh{kv|cV?1~%%Qa1qk z8<3{it~BR?B+o%dN{pa3J{^>8jw_J}M5}j2egaa4(PV$|N{m{|=DQ-pfh4E7B2$1= zKH`c*0|~|32@m!&nn#QP$%xaX>LhO5@xMmSp_GCF*WArL26t9oSCFFyQ)DFdqxC6`V$s&Z2W(Ojhx)C%q zAeU*7m3fmGJm!kL3nZWqaoU5iz5kTvAw{U|e3@pVqQEx&Y0X4i?FQ030J#H1yULZu6A`_!&=v6m5?bU$oU%08zI(b~mW{T&XCTsT zTh%ife@!rQ6s(~(J_a#8I0lbBYn%*7VLIa&@VFCkvMjKD`%E88b#oxBZM$5n@wNGv zYX&LR3fq=Vn(=A_@|M{SY|{9TdK9-bZW~yGWwy^Z^|A5nA~qm%QzWZwJ&$XA6|uI} zn;~R5G8dFPt!3JT$I5aiFA}l_NaFzHIUvmgkb^+Z4M2_qVes!e`fK+L(F{O72T}n4 z>!-Pa^PxEH=?e7{(UY!-7DqIi2OvQ}v>RP%9t09P07(Q=IRHrq(lr2id=O$$<5RAT zEX4Y0SEK<*^8n;!Aj!|T(!2|#Yyk2hkjhQ2Gy)-$9koJ+X8tt@v8Z6PE7A8LsvCgZ z1(LkQm1d+n3_Ab`1rl26N|OqtX#kQI4*EbtUQ{Mmt=QJ3yK+H1Bt!p@WfYmlNr0 zRg!yB1Nd_Q!~9GEEfyifj%mCH ziDGEYLu%Ln%M|n>P6KJ{Z7*!o%!MkKjhZ0azqdl4)wa=Q z&BUc$eZ)?E0;UfvBAiLS2Z>+`?m;4%%0A@&LMfJeS2_z)FjWdhEp=*&4Yn!OB*bfq z0a}GI0fz=6;Y`6jNCeY(4-(0A^&$UV2t}oBm<769Y&u+)CeLuYr`XDSkZ`8?9wdTc zW)931$t3q7zfo+L&3_w;-EEtLOH4tr>Yic?-WiBM+b^BS{Vd6^6~#7>8qEa7e%p*1 z%|xF{54D5k{p60G^dF#8{Mq&ckvG2jzmQkj8fwvj1Pw-ntd}|vc~*mmOSO_Cp-qfM z&!-6mNkBizU`4&Hl$9u!Z$~>b^m$(3vo4R3)TYKpmzA%33|%vmQ%|jsVX$nru9N^~ zZ6D%P$lyTS6f@*@Df95iFPB$@EBl3TSK^_NgA|dn!=LA%%zRR&!Bv?C+nDVVktAwp z!=4?mXryh_E{r*5)@vTHUD~dBz-K!oLq`SsIz@?bQu^-%<+KJ+F13OZZ`9mFne3!w z>p^*<4wU}{rLC(@GhE?J`x6Xh3+DkZ+5s-b_i-^eDTnU{W%Eu@enynj?xS4fq8q!UPx{lNr{~f4UBe4zLB2r3}!@ z=hgeNl{pI-OQM{GC2b#({yn%;Zu~8tQ*Eyh&y%o*5ACN76uMH%w)B2cLNSnakjld8 z?n2Z7NaWsok*L%66;SIG+M99?(8*`&Qe z?sBA7>Sw#!pqUQhZ}(^>*rNAnCMgG|yUVo}xlf{S(=iI$4UnQS4znR_wEvbU=WJJz zZrfpldaC=>J11rPFJ`~cPwH@&gSIg_)M=E}8T1^~xhH+s zbDHTkpFI#g+HSl2oW@_V*rs@1GvZ#lXP(zgF%=>(U2v2Lf52xw5c-ev)YHqzZXoob zCmA^aq^m)Wn@T3XuzVE-&SVL3u4pwma?!sPmvdbPau#&dG-RaP7WjM32vgaBjCVkW zL5$SkWiodUhKaoIwqzsSAO|&+LvQC_91v+{E+K5u8v$QR;?+)Q{4cX zDWGBKAW6TJ$pkS0F36)mDEjo%Y>;S(&Z$Z5eaQ1boc)HZ#!L6n90Af5f~6$c*!e}v zOH0?3uC5#*kAmcE?}O+T3UcTnZJ#hq^8h{m4w`leaSHT>qc9R&=JPF(ffcJAf{1uO_bdIQG)^k8}u#bjvEdg?FfIw@3I6rbOI+2wO z`G)kn+D_Z({TS%Jh?E`>_j}4~j@+`O`Kwn!2!^S2j3s1#&7koakn0mEm$tNDzb}Eb z51_e0Gy^<9W%7grI0i~^@3pJet|)toIXJ-L-k|BXCef^4Rlzh3pqT-h5OD9WgE$~0 zA_*)D{Sc52JoT%Z<%!v%z0Y=7ODQp~FJk5mVEq`fWes3m3dH$=(D}w~<6oarl-37XS6O8~uM(xiw4M_6Xq0r>WN-FKkr z2GTFnT^rYk=)Y(Ht6@Vy$uBJ_%P(A0-iQ=O zOvP}qG@M~-`-Dc*SigQ%c|}1(--;+P+6PAc4VsX@01yV>b_I(p7#XWrg`=tCl~WU$$n&iVjm^X-l0fhM%L9pNl1_lroQG;NyCUzd=HL^Hw%}Ca7AF{3cETI2R25;)n)pz7 z@&yjI$qoE`FxLW|H`!L>_vU2+W-uRZ{-7$vxcQ5a986$xgM`Fp0}(MKKS)eA5c#z^ zPFx12W^;pt5lkM)1{!cmS^+NkK_&=QGD-m<*`SE7Qw1UULDc}J6X*=_&9)k{OaKtq BqNxA? delta 575 zcmZn)y%jP+rryZH*uvaQLBT))1dvGu1q(|Hu&9DU0v7`VgAxM+^DzbnRv?qD1%f#) zFff2H*B=Pxbz)!uVg4!z7Cgbg0K&rmAXvQ8s-hs9LbR0H*+)50ba#)`aml zKadh)oLtAp!w$7^vOmwv$@65im5^P5-F1@{H6$i4=jVr61vGkcs>bil=LF1mUZG=dFE)sSTZ08!G5C;$Ke -- 2.25.1