TxYtrw&1Hxg~39MVyYT9xA}ky2s&S*EuVMq zEjaVyaDK 7>%sZFe$5X37O&G9rlQ#JXXx 4>nz(TR>5idu>zG-Lj*@A_`v15&Z=ZKY#g4qOy?+ zIImw%_HG%VryDr+X55|v*bRF56FBdBUg;xz`cmf|{@}#|LoX 5Fj1h7!b|sluOhU%@cOE zWZo#RB*@^vna5H8RrQ}$f~~TxTRd%%jr}RUZ!a8&=%=V2jA_!<5OY=qn}>zt*rsqu z2hQ9Ypy~4eg LY@6iOqjlY7ZAUy_PRu_7 zg#T;Q`q5c46|1KFaNXxGO9S4kQU8*MeIW_WaySVi52rjmmyV#b_EV24cs0CCed>ju z_H^d2peWTzqUuq}T${u>?OL}bZ^5d}{MC*0^`nnWd}IMR)o*qG3RRD$t4dl^DTQ+m z9H`{udfd>(oR)!RLSSTM8jwk@SsCQjzg#St2MDWwqyL<$exrUKT5#%3Gz&4_p;{Wu^H*YSJt|velbwYm%Q}MPL{-}T= z`gZ|33v6B{kM#_}Yb8M#n;Y{J&gJ(?)dcwjDrR!snYfI~O#K8mzjpeYGJ*P8_+b5W zSGsokpFbiP=vdD_&b }cwNkuU=D?qp!D?g-dwXV z&krB&Ku^H{8VNw(cC2dHrHOr{44G^U3xfpIv&w9jw!CZ!RhcGTtwNGQ?R;-m^_Sc7 zRq#b-T3XtR ?SHx*xuSCp_yVeR5Dd7x zyQ_xRMS`$9Fd~9wrbC4pg0IK#=T?k+yVb&n-xCrTT%bpzB>wto3qm#uCxW{`%99PJ z=P7hM;Joo#*Gy}S2k8Ca_EfZ>f<`*NACyssOG732+Dn5)%Agv$?LR-1kWh_V8PDri z$&xp49lFyC@V=dyC303*yg|=v)|2r7dc&>oW|--g?*U#*ie6(XpaBsBpS(%hYeHI` zd8cZ+-=eG&td{^HnV&zRgLx^-AL8NT8^LjUR2lc(4{F^1i*xqhjx3fAb)(acc(KBM zQDe%|@3Bf}_ZJGSG#;#RRIf7{v1G6t8jO5Uw3+^?TBy=g_ku|Bs^&?L3k^>)U)W{- z(q>MyvNou%&F)|z5v$h3yLNB7VQY(|%z3i<5&!zQ&5$5%zscCzVX@=z+?u1~eB+*w z1>T)Wi`Iu9`a`qWiaMP>O*tfyfoM$B#YIrd;jeq`<9>R_Xfj+}+{Y3U59H)7L^@7V z{HdyvR@xPsP%`lk3Gsv##0ME}SVOi;0R7NqsJtH<8#4m!EUTe$Hb+fRbw-B2QrKg2 z^4!A@(AicEtJS*zdcV)Uij0BNv$Gedc+4*$@1)}|YCEsE+m;p=Yow@TK3p+banBEN z@)2`#;*Y{vf1~#9-MbGc aV9y={6oY ~EWoU>vN9`lfB3G|pKLHEL8yXfCDA^ldAWsr{WwC1%Hf0qE?=zu+akFim zaIxb$D=RT5?htIzVj-dTWwt7`arC&fv>`(6(&fu^*RJ8f`8o%n19a|?XXw|H#ma4} z!d)N@chVLS5z(1xi=CdHes*KHpXKok-Xa&AMn6qJ@TSu^Fh@OAsUb?37Fh;1_XRXs z42_H)+`o@VN=dbLcgKqq3N=SKA?473_||H8?)-Ti@5(p8K!1G_S1a8O6ZRJMCi^=R zA61noAD`j8V~yO`(xQ=$5)z!*+2yb|_W$$=J3DJ^v{s#K*018xUp^QmYr6-x0lmR> z_wEVg1TOCLJLHz2*^+3+a9Ez0zQ!0RxfveSYWS|zP~i^Uk)4Ym3NG=pRxG-^Mu7+y z*U|a*i()6;#N_$iu GHkxed86$=Ekq z>Ei0@VQ)fq=(~Qu${_n6-`BWZda<$}NSTL*T$JBoqURohOiCJlv05tGB0#Q#?)xkW ziTD1#GrQZN^Gd5Yt!HVe(0S-lI4qWur+94Pnfw*3P;-!hQ7@)czI(WWSIi2uNu`Rh ziAk&wh*L*_7rXfT_wQeN9G<6Wou91~yKt+JES>54_3BN|awN=|UWIV$(Z&%QfSC_9 zGRqYAVLsP|f1kMufBC~d>M!0W^z&xR6OUo}$6xZ|+SVF9MvAI&$J8jvz{N^L2vd;Oigt^_v WlYyZjEePYM!gwq;RnkPpsg4KO-JMGZh|1>O z)YQbjck ``5vmYOOG&J*_}WOOCdbGoS#UdFMbrsi~tQZjRz zM!|`Z*(4=VQG7T@`#i6|wW9+M`O1%Bv|AiF6V~|t@X+-NzwK$`9JRaVR#xmON=zqD zo_waM`LV4{?rWpL%)SbffmqD>lW!mJ6B7|tf+P7YE}Cl;+MY2pGgE p^pIEv=!i zTTFNEoP#j2y;{#USXkDbrNYe0lm>MWzZ>*QdKT>T^z{cjwnfInz!=dI8v{1Y&kYSv zLo_hyO2I);0n7(q-zrEYpMrwkx5vwjfdsKFsS|3lWiXsB= 8CAQuIx3cQgRC`u6sZ0K2DFu=?{oSRv$I7O=i?WJeQ zohqfye5@Mz2$GPPSaDHC;I&bEoWubqC+GPqSA3d<_DmbXv(;FjHbOV%8SUojEx)wv zA!w(=F%({?fNssT4-K(~O VgN2ZDRz}3kEY*@f;)SK m RKzt+1mr(DQINd&I>26nRQE6~|w zJL*-u!EdWhiRtU>`_?`)(8R>YM*%pb&3G^Y8tk_A_EOc5)$$!yqHPD-+v!~J1YCA) z|5R6_OUvUN5gJN)>C&Zd#l=_PD3`;0W_6XO3n3xl@0yyLuT!&gb1Q%{>iVp$tutH? zoPtY%NEdT;6|&`zs4oH8*=Z7zvggDi<8H^Bi;|MkIz&&??NAM}1f)C&UiLG4U~LI) z!fRD7gWwJKW94f5(gyV|P*8Zf9qyb`OYPE6fht`>TYGPRV0!K(o`#EBRm4+D@NNf? zLVXGi^@3LTDAb~NLZ0x p~FJG?SyorxIQ&shxigKfY<1k-2UlI?w?wK`&@yOh5 zf@F*W5zq_6?<9(fiXXhZ0-B-(Uy%VZUI~Aq$UiX99RTu=*x0{0-CDn49}hHbedHM` ze@{g9OhMrt6y}eTJK>M`Jno8*i#rK;^Q+*iyRgdD)Xl~@qkzVL0nnJYBaZp?`}Yb2 z;R@5cx`25;czZw6& &y |<%^DnO4X;@drc{^ZEc z&8^d75*DTfEc4LOkq>0?<~^o&zdpHjh1art!P$PH&mCO4c)d-krx3#g2^9iA{apLN zfDgp_Z~;fT!uKm39UVGw);}RB$@(72$SkL)%~Vq*cn>r_+#W9kvuOtj9lFjY## +_*j*yDfd` v79zSaP_>uM}h()Y$siSy&1ixZM21lY{VY8pcZ9yv)okz6%056Q4a_t z#j9^d-=jry9Sw)g iuVml@OcUBHf lq~~|eES|Xaf0sEY-FC$9_gB}RkwV}<2~la0w1+xx{x=;h9FYJ3 diff --git a/lib/gaborator/doc/filter.html b/lib/gaborator/doc/filter.html deleted file mode 100644 index 25aa939..0000000 --- a/lib/gaborator/doc/filter.html +++ /dev/null @@ -1,266 +0,0 @@ - - - - - - Gaborator Example 2: Frequency-Domain Filtering - - -Example 2: Frequency-Domain Filtering
- -Introduction
- -This example shows how to apply a filter to an audio file using -the Gaborator library, by turning the audio into spectrogram -coefficients, modifying the coefficients, and resynthesizing audio -from them.
- -The specific filter implemented here is a 3 dB/octave lowpass -filter. This is sometimes called a pinking filter because it -can be used to produce pink noise from white noise. In practice, the -3 dB/octave slope is only applied above some minimum frequency, for -example 20 Hz, because otherwise the gain of the filter would approach -infinity as the frequency approaches 0, and the impulse response would -have to be infinitely wide. -
- -Since the slope of this filter is not a multiple of 6 dB/octave, it -is difficult to implement as an analog filter, but by filtering -digitally in the frequency domain, arbitrary filter responses such as -this can easily be achieved. -
- -Preamble
- --#include <memory.h> -#include <iostream> -#include <sndfile.h> -#include <gaborator/gaborator.h> - -int main(int argc, char **argv) { - if (argc < 3) { - std::cerr << "usage: filter input.wav output.wav\n"; - exit(1); - } -- -Reading the Audio
- -The code for reading the input audio file is identical to -that in Example 1:
- -- SF_INFO sfinfo; - memset(&sfinfo, 0, sizeof(sfinfo)); - SNDFILE *sf_in = sf_open(argv[1], SFM_READ, &sfinfo); - if (! sf_in) { - std::cerr << "could not open input audio file: " - << sf_strerror(sf_in) << "\n"; - exit(1); - } - double fs = sfinfo.samplerate; - sf_count_t n_frames = sfinfo.frames; - sf_count_t n_samples = sfinfo.frames * sfinfo.channels; - std::vector<float> audio(n_samples); - sf_count_t n_read = sf_readf_float(sf_in, audio.data(), n_frames); - if (n_read != n_frames) { - std::cerr << "read error\n"; - exit(1); - } - sf_close(sf_in); -- -Spectrum Analysis Parameters
- -The spectrum analysis works much the same as in Example 1, -but uses slightly different parameters. -We use a larger number of frequency bands per octave (100) -to minimize ripple in the frequency response, and the -reference frequency argument is omitted as we don't care about the -exact alignment of the bands with respect to a musical scale.
-- gaborator::parameters params(100, 20.0 / fs); - gaborator::analyzer<float> analyzer(params); -- -Precalculating Gains
- -The filtering will be done by multiplying each spectrogram -coefficient with a frequency-dependent gain. To avoid having to -calculate the gain on the fly for each coefficient, which would -be slow, we will precalculate the gains into a vector
- -band_gains
-of one gain value per band, including one for the -special lowpass band that contains the frequencies from 0 to 20 Hz.- std::vector<float> band_gains(analyzer.bands_end()); -- -First, we calculate the gains for the bandpass bands. -For a 3 dB/octave lowpass filter, the voltage gain needs to be -proportional to the square root of the inverse of the frequency. -To get the frequency of each band, we call the -
-analyzer
methodband_ff()
, which -returns the center frequency of the band in units of the -sampling frequency. The gain is normalized to unity at 20 Hz. -- for (int band = analyzer.bandpass_bands_begin(); band < analyzer.bandpass_bands_end(); band++) { - double f_hz = analyzer.band_ff(band) * fs; - band_gains[band] = 1.0 / sqrt(f_hz / 20.0); - } -- -The gain of the lowpass band is set to the the same value as the -lowest-frequency bandpass band, so that the overall filter gain -plateaus smoothly to a constant value below 20 Hz.
- -- band_gains[analyzer.band_lowpass()] = band_gains[analyzer.bandpass_bands_end() - 1]; -- -De-interleaving
- -To handle stereo and other multi-channel audio files, -we will loop over the channels and filter each channel separately. -Since libsndfile produces interleaved samples, we first -de-interleave the current channel into a temporary vector called -
-channel
:- for (sf_count_t ch = 0; ch < sfinfo.channels; ch++) { - std::vector<float> channel(n_frames); - for (sf_count_t i = 0; i < n_frames; i++) - channel[i] = audio[i * sfinfo.channels + ch]; --Spectrum Analysis
-Now we can spectrum analyze the current channel, producing -a set of coefficients:
-- gaborator::coefs<float> coefs(analyzer); - analyzer.analyze(channel.data(), 0, channel.size(), coefs); -- -Filtering
--The filtering is done using the function -
-process()
, which applies a user-defined function -to each spectrogram coefficient. Here, that user-defined function is a -lambda expression that multiplies the coefficient by the appropriate -precalculated frequency-dependent gain, modifying the coefficient in -place. The unusedint64_t
argument is the time in units -of samples; this could be use to implement a time-varying filter if -desired.-The second and third argument to
-process()
specify a -range of frequency bands to process; here we passINT_MIN, -INT_MAX
to process all of them. Similarly, the fourth and -fifth argument specify a time range to process, and we pass -INT64_MIN, INT64_MAX
to process all the coefficients -incoefs
regardless of time. -- process([&](int band, int64_t, std::complex<float> &coef) { - coef *= band_gains[band]; - }, - INT_MIN, INT_MAX, - INT64_MIN, INT64_MAX, - coefs); -- -Resynthesis
-We can now resynthesize audio from the filtered coefficients by -calling
-synthesize()
. This is a mirror image of the call to -analyze()
: now the coefficients are the input, and -the buffer of samples is the output. Thechannel
-vector that originally contained the input samples for the channel -is now reused to hold the output samples.- analyzer.synthesize(coefs, 0, channel.size(), channel.data()); -- -Re-interleaving
-The
-audio
vector that contained the -original interleaved audio is reused for the interleaved -filtered audio. This concludes the loop over the channels. -- for (sf_count_t i = 0; i < n_frames; i++) - audio[i * sfinfo.channels + ch] = channel[i]; - } -- -Writing the Audio
-The filtered audio is written using libsndfile, -using code that closely mirrors that for reading. -Note that we use
- -SFC_SET_CLIPPING
-to make sure that any samples too loud for the file format -will saturate; by default, libsndfile makes them -wrap around, which sounds really bad.- SNDFILE *sf_out = sf_open(argv[2], SFM_WRITE, &sfinfo); - if (! sf_out) { - std::cerr << "could not open output audio file: " - << sf_strerror(sf_out) << "\n"; - exit(1); - } - sf_command(sf_out, SFC_SET_CLIPPING, NULL, SF_TRUE); - sf_count_t n_written = sf_writef_float(sf_out, audio.data(), n_frames); - if (n_written != n_frames) { - std::cerr << "write error\n"; - exit(1); - } - sf_close(sf_out); -- - -Postamble
--We need a couple more lines of boilerplate to make the example a -complete program: -
-- return 0; -} -- -Compiling
-Like Example 1, this example -can be built using a one-line build command: -
--c++ -std=c++11 -I.. -O3 -ffast-math `pkg-config --cflags sndfile` filter.cc `pkg-config --libs sndfile` -o filter --Or using the vDSP FFT on macOS:
--c++ -std=c++11 -I.. -O3 -ffast-math -DGABORATOR_USE_VDSP `pkg-config --cflags sndfile` filter.cc `pkg-config --libs sndfile` -framework Accelerate -o filter --Or using PFFFT (see Example 1 for how to download and build PFFFT):
--c++ -std=c++11 -I.. -Ipffft -O3 -ffast-math -DGABORATOR_USE_PFFFT `pkg-config --cflags sndfile` filter.cc pffft/pffft.o pffft/fftpack.o `pkg-config --libs sndfile` -o filter -- -Running
-Running the following shell commands will download an example -audio file containing five seconds of white noise and filter it, -producing pink noise.
--wget http://download.gaborator.com/audio/white_noise.wav -./filter white_noise.wav pink_noise.wav -- -Frequency response
-The following plot shows the actual measured frequency response of the -filter, with the expected 3 dB/octave slope above 20 Hz and minimal -ripple:
- - - - - - diff --git a/lib/gaborator/doc/gen/allkernels_v1_bpo12_ffmin0.03_ffref0.5_anl_wob.png b/lib/gaborator/doc/gen/allkernels_v1_bpo12_ffmin0.03_ffref0.5_anl_wob.png deleted file mode 100644 index b75fa6c368f0a28f89c81cec46c35aa97363ef08..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 124422 zcmeFYWX&=?h!yBkUP(n ojxbyv`Lf9d?%-P8Q7HAKza-NnJ#-QkS|vxoItw>QpC0^9=Jf?UkD?(QybVmv&K z|M!33c7AKaL#q9|4qOD^MajSo{F3q84~Fc+G%pAS1oB*7M%ycWr_r;4%fRGGQ=M4% zXr4yH Wx&n_~liBr|J)MFvPyd$?F5Ca- zkPkk5fe3p4zoSc!To67s{J$dtLoG{4@PCJeG`a1a{~aG_hOrFg{&%q9{Qsxj`TvLH zcBTA(XqE7joZ?FuzcLt;^C!6Xe;o-4%HJ5bUS33nu@CE!UXf`2pG$bT0K@Qt@O_ob z|FbnZg4l=uch (9{)|1!^5~h zdSn38e!zJ>X7_7;+8OWljER| R>9xI@ICT(-5ma@%>*XMpp&+FvTV0(qV^+wO zGdme @oyAm7X@z?SBjI9ehYuftV51~U_eay*EEJU{?|K_=N zY8Dh_Rr+2=6&v;FK_Ez(>!@O+%QNA`Zd(Z@zd7YvxQET-LvQ@st6f`C{oeNX{-MdG zZJtWL>bYpDkY5v|ULC3Z==24mPfzey_;sM?jBEJmo@ev4XJDggHCKOGQPY)O)$YaN z@@H!U-9p{yiucwAWA$@>tElT)v)Wg)E(3)QNHp?Kb7{cQgZ+xR)7Skz?FIXl#CyJ> z?@klCjW~*Yzn?bFpNVbb$Dv+td!qNfw|iO@4Pb85W(M 8qd z_ +iJ~zQ$A;fFnZA;aG#|C$XFh{X6j~i)9JQzHEQF7-0k3Spqx+Y zGtq=&`=~zb0z(6JKc~xPi?8?WZ(bq}Wd9o*4#~4=%i_ukui>joaVcm2=wWv(ono zRi@~lJO;&q|B|`dl{An($y6kU8UZ_=`uU&uPU(~0w)>1!qodv(FE_b;KSymNP7}xW zZ;oge%k8JoTAb}ZmvP8%r?9}2p~A2!LyJJBxWJR+LiG9js#8oJFMkU+Xi4UII@ A-Sp zWZTe9{pnwhhGFHrayKKwpmzhM90typmHlHz0lP=q=&rm==lQA1F-P=n;n=q6;q&b$ z%^s6JH#vwvg)!_`-?TWl?GXWKr?|!QrCir`D(LlNGn{*0e`q@- PW$z0hrXqI+|~Fy5;4?XX7CpM1Kx z$%nofb!_&6@w$EfTD<1$XWC(CS`#e-{ihiNVtO;{xrCTIH*)w**tDqw2{OvOkn|eD z4Zxkhb}Vk6zv(Z2WpmCtcSbjTaUO?c*}FkfFAk%~Awgih&=84vwW-Y$LA<6BC<>>B zJp)J(hg6p?(ruE}6isLbh4{_)E7QdKc+EbRf`eV_ ;iqziuMXG+5gNDKoZN~Lo|0t4P$d?UYkff_?a9?8hA)j+-i1%EC}-lo0Tdm>`_te zR`11-Mx)Whd4xS8mV8_i6Z`}RwK0qCcH@p~Jfwp_;=ETx7M2m0_CqK(T&6IyOSBXw z @3E6PauGP{<1+F0@=Urnf_FK*&Bx>=6b@|5f?DOzr@CbCO50Rp+g`? zMQhMx7h#A?Pd~KAKfi9BzB>&EMge4ygI{?~G|tzf2(8#OoP2G9p{CVv&Emqv_x4Vw z4S4}Imxnwpmd-cN8dgD12$A7%Z!ph2%;C9`lsM*uMd&r{an`J(;+`3 %GNhjhgqj^!FtyJ&pP!b-`tPtclU x||~pE?Kj+oEC03 zq1V{UK)gu@M(3+Qp4Mxro9ogwNRXl_+M(eDcP_ST38O;X=wc!d_4cPY> }ct9EUsP=kfh1#sYZQ&hvojZO~~zsccC(HtPsS9ml=Sq%MIK1gupx z%lex$Kn^}qqlBeA$D7%Ix-*HN(D kz$ z?nqb|wu6&XSvRDlzJQ&g*ymrt!B4%$D9LIr!s6@Q^`T2ulZLgxK&)}ocLKz_&1BQ! z>vG-axC|6W*4q6l4o3OfxR97
_3D(H$(tq4B3-_ec(orsqD;71dHc?pHiS z#ob^)7REUInQpgUsq4R^yIYm-%q1^n7hL0fGR2$9LJQXnwEONrg0Qbce(IW-Ti*Vz zyukqCZx$Jj;(iMWUI)KzTu&BqCaYGv%+G2xVL==-Cj+*gRiWdW54Dr_dlN$9x-^ Le)Aa<6JnibjW<=EY>B;#;t0=h>8zLe6xR#l75ky#JCa-P*GsxnR0l1;J@r^| zg#;B4!_>Xic~DO0vaiuom5k7gq2xpVdDP>bS_Fd?`s#G&a9j%6eK?N35nJ_ntfDx% zye_e;cvy`-D(G`HJO7 z;;g2USQ5XJU5J*~)d2d={5iNt^KmRws<%@M>i1 -D*rt} zkJVeRZbUOZ$B-Wm4-y4y5kOp7_^pudx7jou3`G_xUW^qtGhB}qwdP5o +(pzjF-QsIay3Q)orq;i@j6MmkNBaK _0&%(7Ag3j}1HIIB8%z>@l}ONXrj1@J z*zb&PzE=0!9Sw-tWr_>0SxhzBT@II|hn>lvPq=@UEYi^{ZSqN%9I}r7;Ub^WMXKB> zM&O d0a6JZZdhz7MJlGTZ@|qGvK4m!Z%tp%bNSqh9@9#w47WTj4=hNNvQU^+4 z3Wg5Buvo`=zg5vUYKkf(so77Au?%NyXM`PH**xyH67X)V4t%xivnmRyL0uHi%)}{F zmhFh2eS;l%+^nd~MN)&=Ubr?ppu1g~%i>fJr@F)K$>kheX99Xc2<)iQ`Sl7dDVp)- zKyv;{<+gjgBDik#kHeG1fjBjwCVQ+2Awlk9Asmux)2s}*5S}ZKYl~3s-{5Bk32`Qd z5)s`q7pD_*Pvdqoj=g?=m=Ah}lwMiJxMpn? 2%^p; zo4fXYNT5bW@v(=RI@#TwFLRi>&5)x!IWK;ch(C8Noe_-z7yWR1Q9X2*+rd7QFUL{s zU8kD0H!lZpAsW7a&RIYU2c3WYpuqV`H@)6P#7XRMX1IBt*RT6HfEY|i!?~Pus}cI* z+kY#s)&V}NkczDm9q!UDRK4`4>v_ZBE-V7(HLme>vM$1A_UNv0;LYchb=;u+i!MYv zs?z?@3~@q%{i`>S77?lIW{xJtS7z}6{o_b3 zoObTHBgJZPBSD_%WuC JV)_Fg0k*G?_H?G2KFF|W7CE+krpdI(q D^ZDtl5Hsdld`YM%u?uOXttBDyt$8cQD9xWtj99iY~E=oCz>AJ@m3(~M2 z;*0~iEmV}7HFU*+RDfj>rAwV-Hy};UlKCc6vlmh{{P~F3KAihsoP+M!aOZtO7pPZD zJ>5LodbdkcV7)man(lnLpCo|(H0&Mygs0rfQ^+kI#ehg%cLug{z|K7(LEW%NQgG8> z``wmKH#mYu)Q7!8D28$^6W@OWrR&fjoB6ADULwp}q-tRidpOC1A`J4P=Hz#B=N3dG zEdwJWpLU7QBg-K{`(F|^q^?2>U!f1pCiB(NC#d;n>K6_6SZqve5-jjS@7d24;cK z{<7gs;luD)hFv;DA`!md7I_mLSTyHzn^BMVuOs|9mQys4t@2}#pgh>+H3q~PnZsnG zP`-~GHUcNQZj(1tN2h<`fBa{YEA#LZQ->9Q7p!r FWxcmm TgNY*_tX9U;?Y zkK)19_~5>si>|SY({3?0lN`4Z5rcECW2J#ohmyCXX)X>XDT-yiOu>rb0Wm55mh3wn z=B!l<6Xy14!s{1Ye`k>2#MpYyjD`7%k8`JKhYFmmy9YJbl%$%S5?)sJR+-bh`6VVV znAXdd^cMa6QxxHz#Dl$?r+ mH(VmbmiE_N zd$nj71goIwLm1MwQsiJn<0i#r@X;rgcgA34OxR_%gLQB5?()ZhFA$+<^+ADM8}wdl zj>(n=o2cDoq8-2p(hMhZ+_PEI{JDkFxSMBR*02JP#)~_2kLej*cSj|gIVg) HyRF3h*o5tRHVQCc!w?{!u6P>h4;_x9*hO+a+1*V>-2Q%KSe~#UZ{e?RL{bs z29gEb1^TLW9vk8}=k4#xt>pzks;I{WUrog!gxgU90=c-zLlYPcxYYoL^_^V^K)KSU zw?gWfC?XZt6xC-JZIb(nUthEW0_XkH8^2m&(H8 H0iRwzeVyP&0DzLX{m){E1D0{mX@YW`ISv z5trlw#d2OtYV*N9j&~3@GxO&4-m#7%1Nf*-e@`f+X>k&kG2s)0l=L2rT(>CjCJsaw zH?!<)pLrZGA#U6#2z4YbOXm|d>VlBx$cFVB4WME*Y&+XDA0N8hN@~qpI>oY&lJ25> z*906_cdDkH+8wKBySie#EgN>MdE|0Nq;p1EG;TUHUh&r+k-gCzahLkNRe7q!^y*ok z6G8jS*X>!)`1W*B(X5Ea<=y=7wI}z0Py_EsR*7zVf--!k@FHEM6RhT-g4g2(+ 0V$7Yvi_oZXAx{MIR_da9Nu5OZO}|J1{NE !N(THMAk{ANxE4)drg!dT>{kpg(! dBKQjIsc8ejB)j$Ce01lR~>>m3J#| z6&yr{N_p5(+`&X;cz$by=+MMGN7x+T3r7si0R3*d E=KYfvTLybiE7j#@Ne9I8NSE zsICsV*6_dE|3NOH2ZcJ_E&-*QXZD=Mc*+YxEwa}Qo{97`U3eH_4YTpPl|x9-H3L*F zcSXJ>1C#b&AODzM-11CVJ%H;N5X8mrc}RrwGP9O6qeFk0%RVNP98f41gXXIVy5l7A zLDlzLi$(_z?2bZ$z#pQ4ho osN0@`wDNr=OR5 zHsV4Kekl6wY9B+-nvs^_Od$g6O%Ex=VxRfXAXiCpv`jln+vD)Ru+VF#b6@XQr>!64 z524w%2)AoCyCx-;AO{yfkNLAnB!x<8KI+IsEjKq}EFY5I3IH}u%*=itEOm0lRV3!F zzgB0B&vzDTTs27-7#d4#mV(Zyv<#CvwE6O74k~q3O}4K7QhVm8V_zm;zugyhLM3xK zhSvoa@V>R6CpUyymMnlSzN3mF8B5kGvRL^0jDa*)Q~# fn&k_GgJ@kyR1LBqF{{shX$VfnNJUS(k#9Y}}O6SRTJ-?uIaVAE39^ zOaIHu5$|8(-AA48+y@(U9^vVUV_o%gI70o0l3~GzUNkCjser#l-Zkg&xKc;75H=iu zS|ICU8SdUmulEv}R#!-O)tSf%XM94hkrhbp%6%6v&OIs+wr>2T%+0T*Y5DCy>E 5#F;jSk)XQ8 gavzU2zg3QWLo#Z_E6Axh3@GZG?ln*~ zij;=IAp7wWFYHvdQi K s<;yZ0 zGAAhKaN4wui}&$;yML4`$JXXVWaFdjO+jOO*57u6@d69{X^mnId?NW8sRuF$V~l?~ zu&o3(RV?1Mg_#L8zTaJY>aZXBcvwWVGZJzAr@8E05KKN+s`e)^ry=GveaGy>P5o)a zaF2-1R%9#I)x=^q)Mc0Cgz?fu;s6XE@o0L<@y(2hFkiF syi(WUusZ`XHRGjRCIVsqSd)}*Ic(UWRcQSl`SRRgW;5aK;{#W~ zmpeBnxM9O@i4@L_m2F&ddCTbSV !&mE6WLFK> rtS!{NeNm70}!6-pKksLz{ajGZbG-g|dSRxB5pDgEu&>BVN* zaoU}-aO;{%Na}ah-0ReIDFasGVQ}_N#K$Mxre&0K%=TC>vog*Fe?rxY6UJB-Oy2Re zv86qE_2!USxJuo8Nxo+m)Z%tQHQi6tSd{SZso|%1SU#@iO!rQaqW)*cG#{=UuBk1i zL}LY@PXabGpQ07&tC$zE!*IzwQbI?PFNN^QHhAWc0gyxd6JTuoDrThi>k9?i3szU+ zh<0aeIElnv!b+VPH?(5X(^W*{wj^)NiFPh;+LMI?xFWzD>M4|g=n#Z--gF0WLL&XX zvV{=XBA3X!ms$1#56FM$ehyvQs`2_AS**xy)WRWkUA;3OO?1B3wu6<5Lcy*(&o5#x zmn4~5toUDhlD-aeoaY4~v*9tX*;FhmmJ{$i*vq&f5{uuR;XoKJ)j+Qr*K6-7*g_k_ zM>d@>Np)Vp;`?^4G9B%)n@JXwggP!nCNWJGl#GNEley@Y+zjB{ly+@y?Yw~9Vxfh| zbOIRG;2xi*d#!#)RMG1w9+THLfD!|F<=rmt_gsg9!nV836}2P@k%yW*`pZjyRx&+F zF_?(3tZs~Sa#oz^M!*tSV1(Ts$MjWIj%Dlx)gP{8POcr@eZ_4(cN<=$MCd&RJ?0w? z&)>1(JqJrcMyyA}1+h?n*Y*Gsku;l<7e+b(e8&WW$X~jjKUp5v-X*x?_weAsD8b)y z@+A*Hn}2wdakTJ+KFB@+??~pD8Y1luo&9k;KF`YEkp=mW+vL5&SBb{OBqV)a+Po0& z+oBtkR!C_3mn8H`v=`=Yu8eJX1|$Cg5mf&3{83WdVU9)zfZ?3^2|d_(LGMh;6fYN< z*@m;Bvw%dc-I(Z`)ryrlKTYCyxoBYnctX;2Fk@Cl^xc`;M74+7h5~UMUCPys=}^<+ zk8q%8;{cW-q0nZ|eEO%jmheHis^zk%&%uaNo MuoUt}Jn-D}Db%y@ z8_dKKOPP+Dlq5zLC3|Zf63CpSwciWSj k@fkq9d6kI;V$ zRtpfRQfEo*Wl8H5Xp?ZKsQxJ5!t-=RLpN))Dj*DO-*4BT rDk?@au(;5Ir?^FAQmz#|aM zzsTKkc0$M$H`6I)f#JGp6RYwZB&_xpsn!5;3Vt9tzcvB?t7hlT3L2dsZC5c=#A|_{ zdnl1~`uLogSPpNEIeC@ 4H==LbJgY0%kYGUb-C9}Z(>4$}@=n(i*A`5xS#ta7Qz z73Fz6Jkt~-3#a %(umQxetPz7mM5(xXK n z;o3{@YaGb;;NyhgAhip%(GDly(Q(XyYeZOWE{^EgP1Stkzba>ET*|xrgyC+nGSBHx znvSXmHme$bKL618-4Jd{_##X1vpn{_5}gf;uUp$TMdM?Dx_=gveWj2RWuXEkQxOyK za1fY)5l;|oZyoXNRB)Ga8Mjn1C#*}Vwl?*JOOIj?zg6NES)d}F^Zaui#-wn%F5|sf zhI=n!Kjf_3ne>N}>%5)2N-IX5eV!Se^-+)+U3vV$Mr#^xN{s(=C;M~$s;VK2`7NQo z@5(Z-_`*2;5eP1@pQ 1z)8^grT3c87Mr~6& zqBgPWo@s0oLT8!4 uqlT)LxEGD3N;HE-G)1x8EDehEbiMjZUI8U1V={nmT zZ=izY%sUH&W&U~!CpbCMJh`fujW({1e_`@Mu_N`DAlCRxM(HfQ1}Y-R#LUro4*6#~ zkDaB?JH^GPZL2(NX#?R@e2h{qY^rWcETQe1Bw&^6zoEw;X!(AUI%?CH`;o%->Eg4n ziiB36;f^?%SW&-`=s6DvvX^ASI_idb8LDOVdQf&J`o2Qq5QR(5dlmbBfih&={~SeV z%f;9d)_;!uD8ptjkZjYP-J|I29~s34U@D=efz+UL^J}d=C3%$P-}0Q|s2wyc02zRp zP3JG(gtJ(a!#?kM1e5D7lWn8*8|EmgeEx=l-*+Bx$KvK_P@PXw?#;cR9tWKCtI~3B zKLQK>o%PSHkMlZndl649>zvnu%$CDnj(M2ifeQ2RO!)g`X WG#<(ubbvod-);@x1HO^Uk{tTGlgO(dj zzuhXZwspnVqsw`Ba^2XSyFp(CW%E*fm4VI6^H7yYWCQ1hxEC!1? z zDJ?s5Ft5G{Mn-bQ|LIws(a3{|Q>1cuq^IYI)4Zr;xz^o59HJ%_D6)asQ^<@2X z=Nojl(xv8Sok(D%{*P=eQ>!h3SBY)6DuIdE&zp~rlc_WxapP?XknV-BR|dY+%6dL> zZm*7cVI*o>#C){t$<_R%rwi=q|I=p6yYG}NqQROrKv=k^lVvf`Z)B?Fy?KQ6KzU#h zc3-6y7XAEd)6)33WNEZR5vTLZrGe rq{`K7*G->G8`dH*>AgR+NBfDL^m0z z5~vqYoaS=X& ulFko4Y_87gPYr#Puag&mx=>HlIdoDN-zg$l6dDcXib{;t$T(Y zaNj((bZLadF)c8(YtFXv@a8!*Wl-y=tmRtqoZB?hty>3b^n*XDn0EP$Nz(fs!iNhf zLl*w4Tl%H}t5f3>E66>bK(FuKj77s(J|vc+Wpp0$Y{Rk8frQuJppG^7Lpko3g|R&* zx80*((Z-vGWl(q7l%KhccbkNp)6fu!(|ow@0rM~WXM5j5bO*>Ht-ODFULVsC)zgSk zldh~|8+RstGS^D)-II}@S6eKJK71P+r5@#)SHFA6GJ3BupkFQ?V;WO3C1zxMzYOWl zsD05xVXF(Vbza|PIrA3UU9M5J^O@P*$8$TxGSq$dq+cHFcx3~2fNCUZJoxBOC8>yY zX(nCq1ryv-R=#U-a&hmp5AG?f8QBn2uttV_3#%|8RGjYq40SPei2Q3( 7yW+2v$IK5N=PS~*IhNGvs_J5Jdr`ilGr;LcR4 zF!-l^H|k~z(Y=#e9-#GkTks)U@Z6R9tvopHTiAQI1dtH1?HWn prw3h6gaGOB;QTylvPk=~y3YYPJrRUvOz3e!G@hNjqZ+`2+iYn2&kpISXK)e0_OX zIrUzYUpif{Xd^)*P_RJDU;aBeMCds$n0;HeiCE(`i@JJ6dapTN5 |bs0`QcsE{&?%-qj@b0`4-NM)OX*W-Pchhfe5+}r& z`IZ1TL8{E1mw#%SEaFE2g^0lk#ej@e&A6xJuq?5AZL6t<-jv3c;L9xW=^dH?`UFd@ zEN? CphBF2WOHX3`BOy(e9#3kko&dMD?;4uyERI$s4enTg@J=$Y zp6iE8U&}+Lip_ F~CX5DfMb`V=0D`+1fd+;68d7yK_Cq^g$XyTzWUZ zWrvRBYFY#@Z%|D!D~{2JNY#ziUG$_~(yR*KeMVFkQggLI&c{gNFS*OlXf^P8NkrSb zqf!GG;>Q<^PLb}&q__lA+Or%#u;zN645NQ6%k8w1OOPuS_`HvKJc9VP?0yMjqb`yr z*D_{Hs!)cn@qY{PGix}yZzQ_H!_C^ZLO1xDAm+qV6#Je_(y(z=P=lK>uwPm cFk{)dR004yqQKvBqLC z$VHzH9Y6@clCz}88-8- ZIB;Ut&jAF2Y{OEAZ*uQCD-*culP$ho=H=h~MQYB$M3-y&GBhJf+AKmkD{{j5 zg4E21N!xJ=A84h(rxWxXyuR|}>~oqoEFqcVX^X}E781Iu%p~=y`i7Xz=yw-cYfdAA zVuKgDYn-c)LcT!2(N1A&1LHi^T+qA!6MDHoa!s-N^F=|?t6En)8y>&jbJ?(NO!f7@ zHNxRQjsI(JFY3J}01u0j$QCp@!lX3S`l {4; z4_w?8pu2g}iSNQVhZR`Y#oLC;7T_L30|EOD^12GjlZNRehU#OGzblpZq_eC)*7w{M z6~*>hmw+%4;wJc`jGx1aOI&)e47tx%SgH@%hqq%3ZWW4FK{acP2c$dZ-_IXJ;fnRN zk;!Mhae}R00DBqIdaD}1{%pqlL90fjcC>QQ10gK+B6LEOc(1-Sv%kAZMl_JKj^wJP zPI5ivxV3tG`Pn%Gh*$y}Wu1G5K@{M#TfH3!2yr)0)#Z7A1jR2Hie?)z#y+*;i}J^W zuqTq;N=KmE)t6IZuLPowo}(pR({k7_4=a+)t^7XR?CCzibu_MV=NZ#2x+@i(V_|rA z8gSIBnf1~#_fUh`rQo`Tt&6(N+iB=xejgS>N(JvM7r?ElS_h1&*dh^*cA_* zs&ZKg 6?%h831TBSMR+(`FmE}myp{x)(>-4fDxJEeA zQU7z~;*X)V1xnlNylJj5YiZB>gt#xWB3~6ep?8;(Z!q~+GdQOwCh}c6F=~L!mU7V= zJ35`D?sv~cm3S B Z9au)tb?P2xNK)d zk9_e=QbZ9RyA;Ash|92yE8;9+46lklBVGj9R8dP;191%n)-iH>@i{&4xpBveZ&hlI zad}E0NSFhe0emOU81mfC{u5Lddg;6DRhxo-DvQCg*!Jz3m&U_&Wg&-^33Fnp=W0u+ zroxq9kXr-CM5#mPD@afk)nDb)#9k$Ed-#n@(wiZ nfd59A6#w~92rL2 zl$Jp#+wQ*aS}TWpjaAJXn9Ww1T1A93iK671^XDh@e-Eq#w*;_Ll@4wH+T0)4fOD5X zn@vt|>mO46RQjgXv#v}->|4S`9%7!Hzx+T3?lG$R1$T<2Bt#~>+@(e#6cYNHGpXzc zuK*z~CE4fTC-g Yk5IMs8H%-~NH!Jf#isiYD?@mcxSm_lzj!?Sh)}V3 zzAOiwdm+)3$O^I|Zh&3{3t^Q+ pPg03;Tk$Ds~x=Tz-Xe`%PpBL AabH}8^|mc; z!{_cp{r`I2@j-yo@$NWKQJ=9S4*GDLTD_n!{}N^?lvR>|8$C&=c^eAT{TvJ2h29qh z!A32#pb p11z ziwwnO47Pr&W&j6wEZ}(G%*f1#G_x>_{0G }A%bC n!C z(GT%edvzWTOTclM< _Ep*GFBUNnv0_QYWLa1m=gp&@#*Ok3;&Z}7`0H{Ob}lanPQY}4cMI-R z*7kh)9v?p`V$s0fRzV>6A@1Yn>^9_JT{m$j$8ga*`Du~YaQ0ze8u^ xmvqd(YVPzFJb<3BRbxv`LeW>&6t%=3f5pQt=?I8*HH6n#c)|!5qXi!F?6@^^noJ z557m@5e99NZTkI3@O=&=@asUluv3<@v6Xw8xFzw(ym%CDPSf*tmVC2@dmR6xfdYLQ zcb Rtklaor*fjPK>xD@@?r0Yfq>ZA?^aHfjYj2BfI#F1OcJq?duYcAF}=A+OV74 zPQr1(&IoLV6eVWMGd@pP^B?Y%y))@xdSK@}D0d{oGj?uibDqr+9K|{O$4h*)zQ|#r zwV8dgOGeGiDqDSms3-V)t#&aX-eB-|N0~8vD!Fy?=IRPByyadcB|Xi7gnmkY C#o|5}zkQL|7@L z-4`wDyQoqszEUdNMzcE=$5@BoQh_y9RYo73kM&agGLek@nbivn%b9l=3pFo?pBL^5 zeGmC>(wIl_@7glTD66nrf`o~>oun$t){75an z?^Al|YGtCy+0DQy8RCqR1yUD4m6JEzn$(e^%m$+AulXcCQ4!mDWWUJ57{MKo7?vUs zoL5yyqG}tITYSU4^0+6r+yQZ9d|&1Hw+g&=UO)VkB8^WbY@rv}4_trv%}NAQ*oqh) z1lusdBlsEvB|r`bM0Fh;5qIuCkRL{B+rIY2FL8kgN0uK~$2~e9y jVpD8m&7Dy|Wx~P5wx=?61 z+rwe2;|L#3nHrZ(sTdA656!zc<7;;%=~8&r?&7iyztk5Mn{_mv5{*RKk1IqyyHD?` zz5j#EpC9PTgJyL$KcQW>y5!;y*uU$7McG>hv<8pWr~ilr^jk=a3x%!eH)iY46r8M) z@;?+U^-Km|AA$1q+fw<1PFH$Z2 tbY>l7&gr+PvU bb+wKow# zlsoH-oSB#yP+j z`S`jw&I}o`Qz;yp*`e;5q}dHjV*b;>dr(K4 zmx>RD0g_L^jFZiqCORFuUWAV#K&RnzWQ*(a;*auU`PTMa5gBXAWZ*>q?AuJsts2=u zuhCfb9&C|&@`CH%qzhWKo%1G2`X3MbYr3+Fhy0SptkUoi+_F@~nkw}_uzcH481nHc zeYO&IWY9EDx_5@67Exxdbh2`lvP$ rFi2Y7ND{7wpCjH`YLioqFpFl-)0?U77k_%qLe*fIZT6 zwRPwcJjlg*h$p!4aq*!r@jZbLvQtbIu8T*>x7j6f?cfsU(|ap#JM(wwLTjWp!nPiP zyoRVRswkfT4}X+`SBq$|mxlAvJ-h$VnVCyUJW1z$8M`NBlyl|c^pga<8F2;D;#jHW zHY;V=M2h}ri*0x(6KadEI>U|maSgb<%mgcGnZyGeSXZ5#%8lglAgipL!^Ci115qV7 zV;zC}b1l!v9Uxw+J~=OUq4*M(!}eRH18@;d?tclw{0}J}nL>Ae?7EvT4wi2Z$|+YZ z!?~X`+*x(CSX_c$g~TfMW~~sh*8a^jSxx&y_y{A5%673N$=p=4DD TvuN-VmRD@J@})j-9Md`van%UNoFXVIP&ju zYxd3!UWG<#6jNKnQiZbwBaY!~uNP;hhSGO&3#r2wpsmzGp?*y o+8T}6{WJ#_t6G{83SwUgG9|4#@5gxg zbE+9@1eCM7bM &{BRT_#;rSzR`WXT)k+zK0{&&hm7 SRW2LT1o` zM5|=!JibgK>}=tb7+yw_FO8NGv=$Py{FOd}jJ$0`z~{PacTZ0Ki_)o=#KJE|Y|j~` z6Xisxnj6)zx*OFbP&0J&tUV-w%|9xv6?1&af6ON!J7@q~VU=ysT~EQSd(jFkr~PqY ziUAMXjf#>$5Nwafvdh$rH#FCk-uT5ck;Bg1dYaWkPm`apCJz3@ch{?MDN&D_xhy}I zv9l+xu`B4q9N?l)5~U(`zN`2HcS;e?uAsyH{(j6e56uGlmQ`JKr&imC@$BBlk@@?*q{m;dM!)8@E;;l(WiSY8H={@7-OX9}I9B zpB~x>RGRitkN|Yq36ht($#IuaR0S{ZZuGM>xwllt%2%cz)X HMj4+fqvVRFIneKMz-S0A@7L66#Aj?B|uTX4g`sEr8Ux8WJ(BWm|DQOlCEh1 zqCOk!U)DmsJB7Z7|A%+F)(WK)@7cqEP21NJ$`%@=M%-nY%v-+x8*`TWuY+Cqof@nu z-F%ZY+=Yk3#GHd<`D uTl=~!cQI!)027ZG8BOqZju1^OtBCmjUws1 zor7?~%d*koZ(Q;AVmzPQz8**)ubBM12pxm$EcL0f+e|;af4BdWLoeo&f=O;#>Ro1K zC;&SuZ4;(JP?MMqxKlX=u`}6MCRz{Vv?=zKNSBjdp|oDV3aG7cKGRPj1BnYIc;d2d z>k@z_#P{EsAaDl_?L;-U3lo_BeRy@N5d`k_<@lrN51)H|!V^cmgV $R%;TXM|EO2iv}axmI=sqcN@aw2I1^blV{vU z6g=#r+qjQeSCq Pk-1g_y%X~k3N0s>}#$zjJzs0pWtU!<6L_Zd6T;<;k9^S74j zV!PAC^^`y2mpPNB7Dhj$wEtyJ#$reI)!G11J6-aP2z>gW0;}W0(4*SW2f-z^`nolq z++sYVf^3)h7}xt&ygTo|`*Z-(x$sd=9%=Yh!+x=bzO`-f*+i#a)-0=9Aar025uAm2 zwm#c67NTz=)fb9KNi0Tin! 3)0rEaKbwiae1Q`P>uCI_j z4nji;cGZkHW9 ndXI!uALMFnRJl@J{vFhcPwb9ytg13B&nuQ=^c|06(^c^X|8Pekr_z zw4%*#=lv72a~A+vz|r_q=pT;>4B(%ezSL3-Yov-IuyS)DsCYyWXBN#(-zTLI8e}UT znf)l)?_OtwrBNGA(6KbGzUZSUidYXtwJc9e3R@V7Am?mDwmh|_pRem`DZx->S_;F> zw|qMax!OVVEujVHW#BM&*b3sAAjW#F-e&gjX(d+siE$nQ48L*a@rgi?Z2TdaM-YR; z#8l(2^v8}?!yu-jd+hLQsTTNDx5=N^u)WKtwEy_<1?@wZa~u>mmwu#s-Ws~DyzopJ z_-m>ZW~gKc5WW+FWTXxa0N~8n69&OVpdy~@fA#uROz&Bzrd}*XK4^L$%HW{+v<8j! zXH%6GcyhD%Fl(?wr_kv{g7CR^8UaGZqvkahjVuO@vJ%OpGRdKjxP~us8At@lHu&;H zN4>OiFWcHnSE8w+@B}_lORhvzsr-B+0a-b&B9IO9=lWPA?bvQjh^r_6@G?iG6PxD! z*M=`Z3(x#?Cjds7b{hUM%yQxGibd&~X6z)&cruYq?Uh34WmMisv_#R1AIwS0u2$8X zwBx(gfJuTVBj$5g4P{z>dtRmjEk>f>52TZGe6u*#Xm$rb^E->F!e2*; zC 1>VAcc0E(&1`}i57=sFBlcR* >eH2E*;kAmyH{zG6L9Q-^a%@M&qQJI<5F)e|;iXbpyd)0e$0% z{pm?p02ygM;3PQmNdSfKD{KSn@i0E=h6+n(R?7}PeJCLaCUYCTSSu~B{Nm4MYDq&G zaS+Zq{E6u8mIFWIioh>XfplqmY%zoX;GtcN*?Cb7uUhqlqIOnoH*u+;77qIw4ZF>0 zyyOUf>)Lak1=1ZpGTXs5mT9pIi*~{Fq|Xt;WX@M9Ls4P=MGQGh4cs7?GnCZ8=P_8C z+eZMrxkkAcS^2Kfa%I|#wk_=8Dehx(vEC#VGrhwMa!-eK%m{H|+=$25-(4W-*(Sdf zw33j9N&O2+yV{RH4s=qFli>sI#`$!17+Y2XK?{ec{5fC@Bz5{f$_UF#c5JIMWe-j9 zHf1+53&z{X6ybB4fW~Ynez3}Uy7e)+j*$gF6u3gfq_c5_=>`7>OJ^Mw_4c)K7(if9 zIz)! oE_Ks)D358^W1j;@ zp?^cS<*5{bRC$Nb^Q8Kw%=%9~uzjlus#XarKgH5U?j7T?F@5b0qDEsXf{Qara9xGq z2zh7bl1+#a_hJOj?FWgdZA6CSfhLd0P>PNvIX*)^TB-pSoaqZka1{r~*7WE0=Z$W$ zO2Da;vhGa%tr0(+J`cPaUAFQv%X=g1 ^9Wh#bmNAB!^JENV&>8#sIh&(G@|3 qzmt!ZXX;XksIN