From 5956b5c3fe4f15757da82eddd0a56f2d29590a23 Mon Sep 17 00:00:00 2001 From: zzw922cn <1422459603@qq.com> Date: Sun, 23 Jul 2017 19:23:44 +0800 Subject: [PATCH] add DeepSpeech2 --- README.md | 2 ++ feature/core/spectrogram.py | 45 ++++++++++++++++++++++++++ feature/core/statistic.py | 51 ------------------------------ feature/core/test.wav | Bin 0 -> 35564 bytes feature/timit/timit_preprocess.py | 3 +- 5 files changed, 49 insertions(+), 52 deletions(-) create mode 100644 feature/core/spectrogram.py delete mode 100755 feature/core/statistic.py create mode 100755 feature/core/test.wav diff --git a/README.md b/README.md index b99f7ef..15218b2 100755 --- a/README.md +++ b/README.md @@ -17,6 +17,8 @@ End-to-end automatic speech recognition system implemented in TensorFlow. - [x] **Add WSJ corpus standard preprocessing by s5 recipe** (2017-05-05) - [x] **Restructuring of the project. Updated train.py for usage convinience** (2017-05-06) - [x] **Finish feature module for timit, libri, wsj, support training for LibriSpeech** (2017-05-14) +- [x] **Remove some unnecessary codes** (2017-07-22) +- [x] **Add DeepSpeech2 implementation code** (2017-07-23) ## Recommendation If you want to replace feed dict operation with Tensorflow multi-thread and fifoqueue input pipeline, you can refer to my repo [TensorFlow-Input-Pipeline](https://github.com/zzw922cn/TensorFlow-Input-Pipeline) for more example codes. My own practices prove that fifoqueue input pipeline would improve the training speed in some time. diff --git a/feature/core/spectrogram.py b/feature/core/spectrogram.py new file mode 100644 index 0000000..25b70ff --- /dev/null +++ b/feature/core/spectrogram.py @@ -0,0 +1,45 @@ +# -*- coding:utf-8 -*- + +""" Calculate the spectrogram of power of an audio file (.wav format) + + +@author: zhang zewang +@date: 2017-7-22 +""" + +import numpy as np +import scipy.io.wavfile as wav +import librosa +from sklearn import preprocessing + +def spectrogramPower(audio, window_size=0.02, window_stride=0.01): + """ short time fourier transform + + Details: + audio - This is the input time-domain signal you wish to find the spectrogram of. It can't get much simpler than that. In your case, the + signal you want to find the spectrogram of is defined in the following code: + + win_length - If you recall, we decompose the image into chunks, and each chunk has a specified width. window defines the width of each + chunkin terms of samples. As this is a discrete-time signal, you know that this signal was sampled with a particular sampling + frequency and sampling period. You can determine how large the window is in terms of samples by: + + window_samples = window_time/Ts + hop_length - the same as stride in convolution network, overlapping width + + """ + samplingRate, samples = wav.read(audio) + win_length = int(window_size * samplingRate) + hop_length = int(window_stride * samplingRate) + n_fft = win_length + D = librosa.core.stft(samples, n_fft=n_fft,hop_length=hop_length, + win_length=win_length) + mag = np.abs(D) + log_mag = np.log1p(mag) + # normalization + log_mag = preprocessing.scale(log_mag) + # size: frequency_bins*time_len + return log_mag + + +if __name__ == '__main__': + print np.shape(spectrogramPower('test.wav')) diff --git a/feature/core/statistic.py b/feature/core/statistic.py deleted file mode 100755 index 15099fb..0000000 --- a/feature/core/statistic.py +++ /dev/null @@ -1,51 +0,0 @@ -#-*- coding:utf-8 -*- -#!/usr/bin/python - -''' -author: - - iiiiiiiiiiii iiiiiiiiiiii !!!!!!! !!!!!! - # ### # ### ### I# #: - # ### # I##; ##; ## ## - ### ### !## #### # - ### ### ### ## ### #' - !##; `##% ##; ## ### ## - ### ### $## `# ## # - ### # ### # #### ####; - `### -# ### `# ### ### - ############## ############## `# # - -date:2016-11-09 -''' - - -import os -import theano -import theano.tensor as T -from sigprocess import * -from calcmfcc import audio2fft -import scipy.io.wavfile as wav -import numpy as np -np.set_printoptions(threshold=np.nan) -import cPickle -import glob -import sys -sys.path.append('../utils/') -from functionUtils import writeParamsIntoFile,readParamsFromFile,writeBinaryArrayForC,normalize -import re - -a=T.matrix() -b=normalize(a) -norm=theano.function([a],b) - - -mfccDir = '/home/pony/DeepVoice4.0/mfcc_and_label/TIMIT' -for subdir, dirs, files in os.walk(mfccDir): - count=0 - for file in files: - fullFilename = os.path.join(subdir, file) - filenameNoSuffix = os.path.splitext(fullFilename)[0] - if file.endswith('.mfcc'): - count = count+1 - if count!=10: - print count diff --git a/feature/core/test.wav b/feature/core/test.wav new file mode 100755 index 0000000000000000000000000000000000000000..693ddd698c5a0238845294f3588697d32add561a GIT binary patch literal 35564 zcmX`T1(+1a^Dx}qV>@eSz;T@57TgIx+=2%S5Zr48r&U%`yD6i zIy2q<)*S!uW1iic9qBHw>Z)qmH*ebX!(49~>SyvSC&aoCn~p8;%@+~m6@p1rW1pxb^s3ah-@2NK*DfPSV#m{c<5 zBAAO;kW28-%{lPcgu|TEgie8Hzi?cE z=S=!@_?W!oKwBSBB?q|nj=$xZK)o-NHb?U3j%U);2hW+%s{p?#qbVSzDL|!oz{Z@% zl$B&SkAWv_fRziVeV?D_C*k;q|I4of51zw3VK_|qzUYGM|DY8B8z&q#m;oU_Jog@+ ze#M{gXTT{J946OIj+wMKsqDz5he>-=F28779=K|Q>y})s!ns^BaTI_$0?3s)b|iOp z6YCI+XJTs7o#x6hhG$Gp_yIa2S6__(|Bgv#25?7!7A~OH2aqCDj$Q(!pW(MB_bnZs zH}%gP)ztG4%wy^s2HlUsk(2vmI{yfFJ#gRDX5;@jVe-Y~H_p`xlV>8FkzCyh!+0K; z*OYk=%wYaAtqRVy2wvb?7GUGgea6Ho1kYuG4!#HKeFE+9=e{EYbsWIIIN(;kT;7?Q z{Y6d_b8SuxJYfTwF+Zk$JAk(Na`nLEZXC=Pgwb9CUrf%t0X#C{cTO%v(t#$gK-*ry zRX@PzfcFZ3q$GoUm^@*CYXF|kgy-G@RHi1H(q?Mm7yg@;C;_CaAS!~2qe3VZG%+z3 zmbhFwcETv8|KiG@mfJV8Ufu2$Slj^)YS2XP7+;D4&)4 zt>@Z8Q}*IOrc8}8t*sp>kAeQCm5c#;$?(h67n;ijQwB|$lHjfa-{wD)cP58S8x#bX zOsq^v`3xV^9-8`P&TU%%DBKCdeJ?;11l*(Wd=Recz)=h9|AvTv|Cf!VXW!^K-OkZMJ^;n>NUida`M*@6IO_g8{Q;$u3GjUcx#!PE& z>XZ}ynlqZ#!n9~6mS1pJ;o2Aa1^@>W;vjI-w8kbrL4e-0C(&GuGVPXWAsO5=ZMXT` ze2T)kX-hr>_cMSZL7;>AF?nUaZ(8~55S)?7GD z9WiaX3BM_CU#yWS|Gr!tOv-%G@c7)B%{Sw6;Y$Gen!d)Aep9+ljgsMGa@FLcDdE|m z-5-EDrcE(9YkFqWE(d|1rcP$%K5NQ|8Fv^!_y12vOxqdGl?+o77;xOwQd3S$TWr2z z`WQdJnFE&P1^hLo0|Pu?A{OvabSmv0G+-<<#WAOA)s0UeByx)B1l~bo;RZ#)L}kldPkF+KEU6!3T9+VfIFtgHFevhsu{~s{v{r@1O4&> zMGJx)76HF zO#5ldhUueCewcp9m#ZD7b@ag~BG8k z82Nx2kRC#B+z5Xl1<4rPm8{1Kdc=R>wOD&Pi6*fWHlFsUVfu+C(JMwZT8o}HbYm6$ zAN|>AVZ7C2^*H^WenM}icQGc=W^^7s#RdR8|KK30E3O2m_MN;@`B%9qOG>J;L~=?? zq`Kk^;v^mLG&B;u1^aLwqS9?_D(}jB(#u9)W0`?}a;uKZF*9lu+GZ z`#_d|O<+-QMkpgvz&Ola;&Re|a<ePEj67lY~~- zg0k5bddXN|xD5wgXso5}k%Lqbe3Dyq43vym-Nw@nEyn|=(G`OEcN@8Qi&@Qa^h+^ zl9hI1arBKgAoRdHHhbJ>k})S^R%Y{@PTuU0%nHc~F+&q`Qp%;BNNZH^NLsCe*VE4D ztzeytwNQubXP=Tk?)p&SQ&L9btTXOP{&3(`a9^;z-{nfkxs(&1Ga$Q~`$4DzS?6e+ z=V|^^snN74sYjERCLFS+<2lAsZC2!Huy$af|E~X)zlg7g=eT#C|5@N-MCUW)czcQX zRr#H%pHu%!r73Na<-}Dn{Z%HU&=(=AznkY>PN|%xIc42F!8A<@eGcc-ifA<=JoIPi zx_^_WyStC8c+Q@j*PeQz8SJH;ZJ!r^GqGZFV)BN>KjXTpSyqRoGq9 z{hMz~=m+gOUBvQWM(XqVdgG`inC-pb>6M+9v&`Gk-Pc=4pM$=(jE(;>k2n9BwCe?u z5?AGWXLktG={?_=>~+}(GA4f-k`>C%&QVXWlO)H*S zFMmetVe1H?uF)iX&(k*hc1|77Sl_PDpV4_ne-uQCdxa^KIsj zIYnIueQ)&bq`LK1LYe#(QoLz5Q!fK%T?lBHd?N-I%t|zD zW5U(kUDEfxDgJi+TlH;`_h)l*yfcjNt)k<3T)U*!Nkt0uPO}y$lW$wTqOs>JuceW! zb*PKCQr5YQ>e)YeKZa9C1LwSae-)s~Tl1&JkG8ZmUU*67=8tXP-+F&E<11I1FFw35 z91|UhhDwRbu9&Gw(Ud%C&C*_`e4EIfnR+W%`%eYm&U`!Jt@mx2cg?e_`hV97Tel`G z$QzgRHn~{xkz_UTW!&EhO=1&dJI=>`iL~-f&szFca&z6$#Jm28_Yw~Z+ z+s(ci7mUVwqgh)%FV5(kBl=qgc83S*1@(E+G5$xM36bxN*{rQ~T;4wUze)ZxWk|kX zW9v%?z43%y=(bNwOL;XXL)1f z(a(g=2MYNfdfWJi1&Y2bb3{~@}QbwJ}# zRkkX+IdC*kD6&zjL>gItc8*IplCNf-(#|R3jc`#{#q=rfeD6nP7Ym%#dnlirO%hHf z-pf}c&xUx#aZ{NlSC%%4+ojr)A#4zQsE1xEGCDZjJIlS#yDs!zABo#5_Z<6U+Bv#f z>q_tGrSN+H3(qD`EpOw%qR5Tti>MZP9Q-F_M6uomJyC{QcROmtkB@umJY=nk=S8*! zZn^4ZJ#ya+EQy@v+0ry?nYhLYx8n4;2F~fqC-Ent5`F~L({+r$dUg{;ja^4M|UcODCvwAUH)UwO5Dh4MU z%Ue02RO}UN0=^f`@4uD3JNrydVOI^`vXE2jhM!tW+8wb6<4?vkcg%F0xBY5eZ%wdt zknc(RNlmnoUonw7@v<3q1p|K}V#&Hi9lBG4ejkeOptz zWIJ!0YM1QY?eA=N)f<*0a%mw3=jRXfnbGQzwD79%_mP^>Va7E+1WiIW&~|>5hK(%! zQB;g92{jL%3493di?(1EoFlGO+gLZLXRYJZBzds#8^5OeqHV+1f_)>iwLw}r9n%FY z%;)0=oCEhlIJp3ep30WJPs7^uqt%^W0UpJN zd)h*u5xJQ2 zRZG|(+kbNGuxjF1T!2;6PDNIRkB81gu-<^W5hweFEOE5hS;!-d#FfxIh;)8Kx5#y| zp3>4f(w5J5Og$ps6F#HHw1>V&vuQmI1s@W3D7CEhZQog!D&vJytVOiB|4-M$tQMJB zne$yo{qD$AO7ROhtTwQ&QGZh&kU0L{n4lLhJ{sQ|V+@JS=NgLOvV`G}s26|B*6^$7 z1pbb67q$RL)?3zEd)l~dnyr&MPx)SMAnJGl8pb~}g8suR1xaqNbdXC(g@wj^h<+qI z%HPEEyQ`k-7teWr`EaHdFov*NcreMrcJdqzW-@!gdZ8i0HF1Pch)l!dAWGEPI^%it zUbt#FBht{=%u5S}f2+g`+$$nz-g_?L zizx5J6tVyx)7ds%XM6BI0TfHg$hG)|?(bB=g-pZbL?ya6RzJkF%kskCn zp}Jbz`BnVC2~QLHC43iG)LGk>Xt^vlB{$JUvVuQ|Ejwv=#Rg~FMMX`{uopd4t@CiPe zK7kl(e#8I6qUxJ83;H<)b1Mkj~X`)_-0xHo%}ecSzdplj%d$luyI;}kP< zI-4OEUKAOq8tBRQ!ep_g+(U6I%`6v`TJjBXsn8RTV(p9vS~M~td^A)&v_Et=a!~Kd z#-SgGTimK}wTC^%In9~wtQ<4J+1RnkmToyO%_XOqp*;)l4E*Ii?cVFMxw^P)o-)3- zes3@>y2n_+r{U}5w(vsCBPT0fd7gAhY%HyjYDy2prs4#Flm6sBtX=-3XAH$?txwRd zMPq?Wz32>94px%Yv5yp$x+t;gZtF$+U(VSvr()dB+xEWJp2`+-n*I}=7+mW8*1aWX zWcH10PtO0`<-FVd_d}nwQS2PD3rD4{mV4GD`xINII>1s-DJYK>Cz9*vSALB>VHa3q zR)*DMnXn3E#%N=+@fYpS_OT!MZ>T>mN2&@=@ufIOu45Uk4!2IX$@V9#qY%ON{+2*(PvbV7h zx7n=+EUUmiCyTXlO`gi$7;E&CS~R*lIzanXFK@gys<0=#CZ0qN3Y*1$q<+d|@Tku$ zJ5|5B8|JO96q1?<i(2-4RD_8y6G(tR3d|QC+|R-NWUrrEEgmOM#|}Z z**lz1dMr0nGL%fqP<67pK%J=8Q%kCsEUT4ba+0Ko5uD7Y8wa$ZFt;mQC0s0gJu*n2 zOB?ZexTo;DbWEwM+O1)0hRtGcV%w&Eqx>iKB`x_OJskcm(9GA~JJs{Idx`ri&rWZV zz|~M@WV<%Nn9nFGE8G<&h=ZD0wyVRe>#WPHRjp&yQI;}_B|5+RYz3@sErsQL;vmu# z+1M?kv@u&x*RrCn$VDjlbcs&ZrW#IOn3R-$Qbw!IZ7c1mjyd+9t>cyN#df$3X!HDV z_rP;+j(dsge$M8cMlR8F-d8BJEV|sN!>{6y&{~=)Vd zt5#9Yis$eKmSXhR`bL{YKSbAS1NE*(dAgSB)W>$Bd8Cr~pLAH+r(UvEas=!pZCxz) zMFAJ1QWOQ>c^#g{?mX`L?mO;8Z%zNCU~G6oq=UB2n7})c9^z{0s$AN#QQczQVXbF% zSdXgQl4glfRJp43SojC;=jZ7&eT}9?=SJs8D`{=@J4Pw?HNS`aaRD@j4W(9k%cyD;(Hm;tY7uRRKGf(+FESBN6?#aQ zH%0G%u^pIhov6EVbqfLiQWx{eUCl;-K$*NTsz%`yb<5BV6#XaZJVBM)MAj4 z#V>>{Qg5Y!I@DH`F~!V+q1-+=%;VO`4w$pu6ctx{z+5FX)e~0^}Kw zqfA^~SS%*V%a!ex>T0HCk#bPFBK(Cr@SDcP=-AL&{}S&APt?8NeZjrLBlukYpF>9E zfc8u;K`*e~XbbsHd?RgEj;n8N`yB_IJDvL+#C}YDEWZ=l;0k;-ooisgIMdip$1;Jx zXPel6Y#!f(N|QrE7b#AeWm%%u1y1ExZ_2L(6|Z5Vje%ODNLJA8f90Ft>+c&5$5CHT zzYzEk_&HQIvK+MI7bBg1;2p_Qakl)uCC2*NHrvt0ncrF1G168~y(o*~U_6-LqMeQQ zdRXhI*EOopiy&W(SsWjRRB}aFAeB|FT6$Z@+y1pxvdveMm2ToV{42YvkBrt14-L)> zObI*;R0w_*^g?kzAy_?lCpakdG;}?jC)!=h)VI@b`3KYkBC3wkdAYJ>hFT4 zBO0eYj-HHKv|XBFJff@lG8nzP__w%4Y$eVTCrJsiL;gd$Csq;H36k)LBneN1d{Q;} zNBOc85Wf*u33-KDLOn4Rb5b}pm zPws58H(u|J3KZkCdR2cuGrpNoJuE%!`DdTrDx*T5F^$ghp->rMLqF)T#Gai zz7_r;r|@aWsaNK2=rSs@yX+dj0-5-ys1g#O|iQVBCO1g%A#aVd0{bz@T@6a7TLuf5U! z&^AXGM?Xd1X*Oe_o~Uoo&PVP>;$fwCOJ7Di(B-T?chRl12dzVEu=7-;EoecbfG!#h zX><0LZZkg7zxYPTl6OU2`9Y+Sk3w6ion(i6L`Yg8S>*lj>xg_(ZZF#upVUEID{LX% zgd@UT{2i<~-_k*BDyu}D)X-hpUa)Y(j4SLdkAcSZ0+0JfCvXD4}iWU!jB>U%`fjAo#}HQ9DPiO*++ zP({20Hvlc$#w+m!>_=Xg{|z3q4cdZgLPozdZYORM+e$IYO1YRKE8mEN#fkD3`6qdn zI0b#p5AnlH<^|D3`cxlFi^B@6Hl4-{+5t57up#oPY1S#e3o*JQlx& zh`zTlLEJ zfkezAKT8*|j~9`uNR`oap_Sx>nEP+ZFox2gw1;n}`K7y53wOW;h?~uoRtSrX7Nom$ znLj{nNQ8#jN}&>|%{tJI^s{k~y+DU(Ck@d**(ZIek;2c=$+R8+O#h+Xpv7$!o*`5u z`AJc{3GnPK3`a}xLsWsTMww&*PsP8GuX!S@zf*Zd{7PtoKA=Wo94UiN;yt8@@UyUk z{Djv*1URok%bB5k+77s zL;u6$NC|w7m&3&%H|#@Ogw@71V+`qI^rd~Jzgau_h)DWB`a9td`pP(fX6iQlR&?u! zQL0!)zYUT!U7wF@;CI?^yaCRgG?}(wA8;R3mOn$MggfGKbO`kkx1gD}Qt z(6jgC0WWA+nIGbq4Dw3ofkLzrPQi=WD{=**+b2R#a)!o`8oU*MEL228v0wOu-(^?u z4WScSYK-DNXtJ?^bVilw6BDJZ`f@lTT zSS`?#onVQpL7lBGn@D#UB2?Wz@L!DT+IwTEk!GA^KSKs!B@VFHS`zAor?ED87cWc~ z3b#nW_!(!BU+H<)9k=8|`Bk!ztl;f%X`vp}C)bntV6`ieRtO7m(p$8PJwc1mC)8g^ z!OM9BbT~*)@MG*>!@(=_e0&|Wq0BKlpx*eZF*DLatIBsG#_H0Z^dP&zwzIBmD=Pyl z^JHEMS`x1C**K1Nr*c;b@8~2p4;l-K(?L9rLsuaCoxWp(sfzaC zMRYx#P8aGn=v+8MoA4X7yAcKM*!fb@3BSPO$vQfK?-vDf08J$i`7l0MI7e=yY~cgB zN~7q4FoGAyUyI-4(`2qt7dTv(q>vS86I6h=LnV0|RF<>pJ-!#UqRr_|dRi|?H}MIq zy^%oQ@Jx1APoxjnUvvr!Fl0P5P9Y~xrS+i-v4d@e>TD6HV*Ux`_IyGy{K6Q81mSy> z7moqkW8nEnqXZ`jodp$a+88Y3kHifgYc@G7R1`FPo*!ifP8Qap<>+_bjnyZ=;eFIa z7Ks7co!`Y-tR-%a3(^x{1PapaRAOD}J9Lg+)DA;7pqf#DAE2A)NVLO9H+JB|w26^| zuF=7499~9`(zU23eM1aCmp^vB^ zYivwKpMe+ExE(xFTlSu1^L}_E-$J+Y^`MobjO~0p>dUieW!8na1^-N$0QKat##HT% z5d!%CWW)JYHU$laXem_~3p!9y_#hO-`|wNBR5&gEE=N!K*G2cP9w8OJ8~BOPQ)3s3LAm{1udydMxiC_G9HINv76{V8p@KOMpkchDNe7;o62&tW6q@8z9TcXBL&XN7A=DB-3#A}8yau59OSmAO5bin6~*v; zCBB}f(Nu^un$z2Kv5~H?G3pvG^l@N!dK>SIGWv_?UA;6tO`oA=qz+h?NjL^S!()Xy zLU&;hcpIm5Tv{wzgtep;d5az7Dk&=p;w|zI`GgBWbbJDJK=W}Pp{3ARWWs$MLA6kQ zUJIg{uF&IQ#vfU{BKw<;f^`W;GRZ>yz0Ur`C4W>wiq$UhaMognT?rA}kNzFx1c zWk#RDiZ`ft(N2c`3jP#|4|j-uYuu!#_yC*(dY43E$O$q{93=fM-G^Gp6UC;!Q1Z(E z3i$~qj|IQ*5LO1Yg}!79isN~BW3#J=bQKyy55``SML76t3D3m^$pccHTt=OtXJb3` z-t1#P(v@HV#<9ZaF>1&UG8gn+_>8j9i_sqJIoFenbNb}yj}ZUXkL-y&jC>uw6tagp zKyB%1C@0d{Sji8eji@}nK)w?S3&o`dmX=m#n_w?vi$HDYJEf*vNcvXnAl48oiwEGd zh@1hL%LlP?6LyJTfH?CUUI($-1^yqehNd9_SH(N=a3k3EXk_Y>bgw>{USfy&Tyzz!1KPht1@R_`V$TX4#mizD zz~nC2;$3(Gn$7F*UVJ{9gGZwgd>a3b6{25-pWJw(Oc{B`H(cXI*UX>d5ctXsfO|Ee@rgyk1UH9?C`K$>J@1 zoxRhMRy!IK{ZV5^D^`rznVYTx50^#%h1lSt5SHdETP!ZiHJ1a9Fi&nzc&bq;pC2y22iyOp`;!bgg;KhINWO`ZK9+?*2 z9{xIVE;1@QGnyJH8=4gu=v(L6>1pUa;r-ixIW#WX(73~5!On}MqL2<1+KcK=d+V6~ zv6W+6#&mULT3=f6}}%%g8b&9(3rq( zUlVV4&j3%NcfU^v71Oe4Gu%noCCnCvgTJ09PEj(gpB(36!ZBx^#qCQieRqfqkoN)!?GGaD4 z=2|x@>!pt39N`*Sf&b>|#!u13p(TN_{vH1Hfw{q@Ay4R!;0S*gZv*#s*F;Yre@r-C zAA=^tn&nri4ZPPpL@!qe7KIA(QBP3J_LU#TX}#mi7%GzcAmRp&-NfU4TwP{Y6r z-xz=Q(EMl)38Kl5M8ljQrZnaKTXD;I6=c;Qlby<{FdvI=qs!fy~Pf z(nA@k18ooOOB{mpnZ2g#MrF9$&@x@C5E) zm5kcaxuMqqufJKKQ|PPcVf`E(4!R#f3&2+ukQOR?t@9isV_L)>ikah>VQsHW7rT&s z=%DGP=?bX0lh9TF0pBuT6<;IoB+pxS4_BG&QCTmuFS#EFKIlJ^X3ABl!qv6u>K|$y z>k#{_m>Tit6MjjM;*uN_Eqes$-=ur#9M*=PXRnP%(LA9v|9$T(??nH&(8Oq1FU>ad zmM9(alcU66m5bI`=havx-Vy&G_MAgkODk9^F1*195M@V=1Z`H>6X@^D^fdE~a1(dX z<;j_uT{v6FfjnJcyjBLKNzE*0)imp6^%Z2&r#aq0i*Cz=atS5k1~{s!6{RJ3Ep!=9 z;1<4_m8PNSub~hAkk{sY3teMb&{-hp$Bp%L9y^3q3YX-))>FRJJSW{gIf4j zw53EsFQDidrD5V z?8{j=2(WSx2#sjyO{g&wer5qJ3mjq_!cppY-=nB zm3U>oTtU7jN~9lap#2;=0lB>w-l*^Ez@}icaKA`;WM0&(ji$R%8!^q2V0&xt?DRUr zjx;;uljWL1Nj!zCEP;+P>g#VKYG}CsfXCt5nB6e@&+Ou^)1Hg|oDhq?GZyiMc!027 zIeh_f%Y2C<1u?;WM_H%Db=a;m1c^=#CKv5 zX`MJ!xQAEqT}EkbUF2qXNTjyb$>_)~^C{>F$nF2|Xwpu6CJ$6ESsk`&*5a1mq*-JO z4;o`MSHu!=g$9R;gkA;m`BS}d?$J4gv%kt->`M1`5B80IMYr(Qcs*$;low~oE7b;2 zPyIc%b=<4iqA~aF^R3sES<*gH5z9iJB?B$tA7~{btgVPXi2NLNXhXGC`YYoaUCkzQ zKhjBFX@Qbz-D7KIuWfH<8>i~>1kr^b@fxfx)P9ad!lClPa{hy!Nv@aKQ?vGE+Oytd z?{|0d?+uUBr$g-DP{3kCsO$#Re)itZgR!X~^&Mh1I@;SLbv0~t=qo2k)y3*UKXj0m zH#%w=kzizTw2rn!d#xoH60J&mumLEMv=Rp?msM;l1>GRTUdk$2?n{k?wx}MHX-UZT z{~ig1E(gB%t#qHyIh8GDt2u4l{k*Y(lHmo>L%NR=^c3$AI?H2Khi#j!kYkxM#d+0k z*!gmrzVA10Q|}MnAADm2--b#>Zfmt^EZ+uD z6cxS`YfGo)N6Hdqn-XUksf>}If`95Rjg|b8O)f315-W(uh>Rta0#%<9bSnJ-ncwHs z$G^gdAo?9Aw1AxZNui3^9O8$%QoQu9;Dq%>5mw!3qu100{jj!JtFKj#ZVK-VRSx9~ z-hf)>_DH$tTBsL@ZKt_SpT;E7H~Qp1x&RUwWj5UHRMJzbwlFVO2WhaKegpr7X~)H=Hhw}qQR zPobPJK=@5a5xr zkV?xlM%zi|8EW^lOqBpy3blIAy3(UMZ+Nki*h%k|Fh%3(8ZZd180S?Sx@{y@C(o|KkT> zod)`5#Di_IMn6P4M1P7F)q3g&^}_lq?WERQ8=`r%^?GCDjv+uSU7gN`b#fl4{0)Q{ zFblN=I41CRd^&XMAA){{bFiivfs^q`^a{0U6}|Mg-RGFCf+(L*t>hV;FSNPttqqt@VETGpLK6g8QW@qCx1g@5jpXIp{S$ zNu~*}ggHVzp|!AH=pfdT3duL+_wq3LN2w&Nb^axXAXn}X%Zo(3AvlE$?7$;ow?uPv z3c4C!qFbmPy36};0s7BAGb?WoInA29Du2wDv)>`B)szikh1e515#S$XoYwp3KkBvg zMS33Nlb#JLn!~!T=QBDQb7@Jayp-Thz6!D+tsoct7~+@OWE$x}ekBdbbKH$=C;yS- zf(!ZzhY1&fHZ90f+ykG)i$U@UDFigzOwN+(LKZnj>Ixw;nXHD~^=Qa~FzA(92|FGV zVL!-Ro*%OA0#s`j(vMI<{gL&8+{|6thQ2gXX*srs)r1_UpD*CMc}w1b{|&XN?I;Zo zMZIB4tZyTUG$`6wF=1^UI~7HAaehOWXcpfUU_7_AO(%15KutPh)x`(O|I z9sP};Lp*l`=S90wd&mTiK|@5vVwqN7zD$uphGK0I8do z=RZN_b1JOac0uG_5Mo{EGle^kVct%;JC1q-rF)dtubB&^^!igFa89yj0Misf#<#hUr`(~b7P=J`x3HT ziI9tFkFx-hEEI*z;1)gwqUp(?;hR9G8?Z5~5%i4?VU<`v@P#>Gf%Y58v?yIb6MU7i>o}d=6E^Eg-}HlH4S*vpNA}X1Nsbl`5tiG4cfOfcSn;Q==d?n3KrsC*lAWD_N2AspQyk%>&$<1NU`AySR>Bjtp*5LwhEy~$=+)BJ%Nq91`9r9s>CK({aa zuMALE>A>$mPs}4$iZx@ezzdAw4yY@QU~~9n=))`p`c)iuvw0wQOTb=0y*YO`-PdRU z=z5s@VT4)S&ik@gtO#!dJ0;t}4zydWFKB0BSX(xNU3;w{Cz?QB<07~$tgB+M7xhAW z(R;|l*TeOQi0x=Qw&HI58?dq~AQuW%DX@Yv>{|O9YCj7hkG+;1;ib?sh*2isQuqU+ z;K}wvlpl|m<5=fzHRK*20z_C6OHB0r0>rVc#F+B_R)bo%|s- zmB-1G6hZxLd7*5Ob?6G2&YiTNhNEY~3xekY^#eD3UA?{BFS7e)uFa^H>CYMH%?g!c zNzz&yitC&=PyPb=HzZcfKPz92gfej@9b1%o;wAKh-YN8rudI8ptFilycLDT7=BF9B zpt9cHGxq0%?fIrBrY7#nH#@;_ep1(vZAO)d-+$7(-jm;b&$ZIk))nU}npG#`_@^oF zJHIRR=|g5qFN^LId&IoWKOl8&>ZsJ!skM`7!ZiCw`3Q7q50A_Zz`8XjKJ(t^dExwMukck|YXX|DWDO9s2SYiBCyi_(u|=%4duuXWA# zKJ?%58{WQdE&EC4-K+%vC~Y*};w)ESWop;7ZE01~swXXWmJ@%XmQVrD3-`;MI++=t zk7qW{yp!45H6frySD;bWz44aBXUSXBDyNl5Ym$60v2grd>tSgs_lF*Py62S2YM#|3 zdy;!lU~o7UcGw(`%n3IQl=d8SEy(T$8{zZunU;ciZ>9Dwhzr(F9hF$pIhTZ^5B$?y zzvr}c@A8!O{_Dx{j`SDzmk-@EUXb3_bMelk#i^%LhZZQGI6t3sFm<*qgB~ z=hN8cF$>k};!nJX;nY2$Nx@cOTX382ls_hz8J?pJHMR(iZGOj!xDyGLV$0cYDfP(; z)>^L??X4Mlb2bq-BW*|!;=oqIW#}ZDMOvWOw2tlwTY@wET|FzjQv&gU$-$KH!Els4 zlDu+Wr$5iYxTdkexZ}1KLT6nK4D~hkK5=Dv2SNXtFLXrf!bggl+~2k$At&GRyhZZv zj3eqVXhd|bf13A^_mZz_WEs>S=Sov8GnAn6wbBYA_X$FIs9pDp9D+>eaBpkZLjRiJ z{h&inF=`s;jgO%XS}EnSoJSp=Z)4s}=hm1CmVNA2bge6rdC_;+pA;I$E0d>Wp7fnG zTUn$|vUGJkiO(OGKW4Wz1+@*2@pjK%kbT9oD=iEzP9|LKW!xU&+6v z^YnX>alt{sO~GY>kD*EWSG+Sm2yxFAp02lnJ+2+;9Ho~1y}flpY{IYVRB0hD6=mUH zA}@l1F@v0A=h$o94eE=3vxamK$y9RW%GOHu%5q!0Rm&fk8=4Sa6&g(Qk^A@`=+iky zYQg@W8t5TjFIJOP@deZiUqX-3h3HznFzjDTgbtggq9Cl`4fQel)9CeZX`{Z;L3>EB z`dFD_&y0z+hNPR~_k6l`B~r$J!rdgeDU8C+m;ht z><`w57h`pehx)C^*U@ye4c6!F)qiXam1@!qaDI1a3$0ElBm7XWr5%r4GNwYb*Ar^U z0b#M_o?@3qi9OMEeO~ArPXT|U$jV3#yCl2Sea`Pg(}W}*J3q2 zIuH7+p6k2WaDj+PVmq-chQ0qxfSO}v=zjP`{{hz8llW=qhTA4owS+A`G8Pr%(2=bz z3;DhG!>RfU*sJiwxIYa!@;{!DMG7vu&)5$K(4D6}B8*g#%JJcl|#g<>)d zX}5!a`94SMLTq?Lnrdro`vAM|uslYJ6SG*VUR}?CmFF`325rw5@n^WQa7c_o-)LcW zU3Y3DL&o_Th7Lew`a34TJ1>0d(m6gbJG>C zpCg@E3$n`6S1vC5ek$mb&*tU zI(cSIQbX2`@hz<)Kf#fH*e?VPU+chTz6kn4ykarcCzX+ZP}*9&YI}JAe!(AU%>qNA zce{iyBeI8X#pjg{>NusM#J4?yZBT`*_CGHY-lJR^x#OuqLjrYM1NH0@cX~?)Vk2(t0)2uq@O|_SVx*JAZ5t8ij?K(-H{pflKk}Tu^G97cr$E*@Px0u# zT4Q}SuSez!yOk5ROvmreeby<;99h7l^d8aa;eFb2w3nQgTU$k?zSK;rg^t1gvcr-8 zLU$rXqdl~Dv=pp1y9vAGw@P8lN2P|cK)Q?9Lw%-8UYzz}4 zkaHhrlkBsk;;>e!NZ*A}@MiE$B$>@dQ^<7Xk>#U2$$Bbgam-Ffj_rU_lq}V!2R?dc zxo5i8cuPfQ(4FWYxgyn66>Cjf5obPUEBg=|SBeW8z^_CiwWAO9Bt8b}{cj=S@5|0X zMk7|QsQsp;Xb++nqjSUi0{^e0vw*59eY^PSxJlaWsAG3wcjwrF-HzSd zuWk+}g{p=dh025mh3*Ce(j2oFmBjUPxgvIZo4I=N3Dhz3PgPV~8q>@NW)oCtrdV$4 zo}EOGWZSZ7+;;9fbsPCsSL3ZVNt5-i(D?KqedrA9=4t&1YLF|H7;TJRLeHVsF$CkW z+FJLK-S`5I3GT6;o{rUQ8|stQUwBWfS-`(c^g*aowBU z)sO3JSJVp0FGFIuoZLqB>TYuqv4)<^G+{?`ExDEKefkh_#fmhiXzjF|$T@dg2gzm3 zY;HLJmOD@XYZisKy`w*vSw3@GW*L9JK;>W_IVbU0=h$GV%_7Hxt>StihdNi*W1r?SzJrEfj|3ts7@#{I3qATR6TrHiZ=hC|KJ)r zD@3G6q(%()ws#a^)>%8XNUf4KSiPaTwAbpN#!G7_F`Ch#Yxjt%cv`r?cA>7|>D4gO z)ne!y?=boiVd^V2kZwRtvT_)1t*$gGxF}18o1sy#S@1~Ud#IA0Mb~!Sj}GR{p1V`_ z=Fz3S7x;9mtui_I#HanXGtR@ubkSc{Dr#+JFFVUb=8wsWc@uLx@~iU!w-nA^w-u+2 zRdy*;q+7w^;Z!A{4YL~1$$WFidvSoUlg|kwMG`X5Q>Yc}hH^HRfb$udavf;lYU^&L zic~FJK2XGO`D**JA&P$t< zI3!29SWIZo@oY!tCbgX?X?HYR=*v)texdJ1j&&NE>vhHyISYNd{=Np8C4DJbLg;L0 zsZx`CD6I0-i8&jaJEmjIjOdNtu|UwwwkK&t!iull@3f!qe?Iqbkc%0=$Qk@D=eLMy zv5xG2WV;giz@<41o}&Urn(PhuGiPNc`#uM{OLMiWL^O9%*zEA5U(nXs)lu3pOn48a zW3rWCjL`4uL-p2rv{Axng&i}XUYGmHXQcwt0O@D=kMO%tt8>T-5=tE#H9~!aPDnguRN zl;YH6a}e2{KE|YQt;KC(6}}#q#%XM4_5zy>jbVb3r7lv=D>IefGNGK56QzZr<5`lw zVxUAYJ#u&!n@Sr=2_x5^Hsd-p5yK9z3IvH zy!NI?y!EC!?$DL2-s**L#ZY?IlFZM)|MhhV43;vq!q##!%$9fb@rY4IRNu(S-eT^? zVoCN4$y%A(7WJ6I%Ne1Efgf2*1Dk?X!$+l-(%0}CNs)5>=blshYtsq8(Aq;rUX2_Y zk(p1wG*pau4G#yD0gRe!;B~o4C4qG*4O2Jy#)TGl68U0(dkI zea3j>uu8%eSTS@kcqmXUP(83GOV270ik8~T?Uh5yVQnjs$rpCN_ST80;t%MGW!W5M3ae=3G#N!Adl8rnUA$o^6kMcK}x@2=RP3;nH z?~l!Fnz_~YE-+R)sl*xI$Zy;R$3N~F-dYg}kq@E{M(GhZ-G7M-m~zAhqk`He>+9yKo9 zJZrdburK6q9(pQw*M^!`$RliPp|WF|bFOQEXG26}r5Xxo;@fub7gq~-UZ&XZqljq-Pi&2Ao7!SOg}1@2o(&p^4H7k z^LyIwBfk&Bt?3Q)4|c{#o?+x<#yN*Ze2N|(TPgN+Ov~uH-eHbv+)Jtok==Tr4^aw* zzQX@^HM5OxPnI_vrzTo0nCtvL;fpX?Jm@%tvGvpQ%5&O1(itV@=T4IC&1~9W`B%8D z^g*g7>ETp)ymsHX16O%5sui;r-m?gCjrbmp-$c$}{-8qEA9?}#R%m}PcVLqI!N_Jeb!GFq*BT5aI4I<{)c`_ zWhipD5N=fbzmff^22>YvGRRoBttzGlMu9_ZFK?DoBvxK0Z&yC4mGt&T*jQLSHT8dt z=2mv13v~=yi$(lpK8b(8=Mi!W$$U{B4l8ygEmEgIX5ETDNqKa%7C}e#3DuB-cxAKQ z#m=;fSU1fnRyV|N0+~wYpdN#t(v}&C{y+-dj6O^GQF9L2FRYGuGLtRF>TKr1UCA^L zLH+a>>h2q@G_#-4U0bEBmei~Zpu%7;$Q zOiHAO(>v**sHB_*ccU3`!_I>q>e&Bc7Avx6PKXC4jq2itft$TI!3ipAqHyqTMC197t(VeKyMwd4~l|>e(rc!sPw&)N4#q@;c+y|ZZW~u}zDtDkM--iCr z1N3R1SuLzou;$9bgOS6^w35JVYEIsv2z26`GVAH_RAV@nI)k|P9a?u51j6d*GLAqm z<{u)OEQn6)7Q4OWHxl*B7;!~3zq&!KpuSX2;`t6jR=pRwTsw3JPhqCE#!p>9pEn1& zk(>&3U=Ai5o6hFr!qAy_WD}S{bT?`tyiOF+$v$kgLDja3y#;EDUUsZ4TgB{-=#|pA z!>ggUOS^CmheK_kN00a)cwxq-AY{3Q3mxx)_bjrq%^J4oa5+_+16jv)M|; z&~xdcjLA%7YqQhvG#^lvs1+oIj?g%A4_qDd(I2i#9tJ@%6)GAI4uhQNMh&yqTP;z& z1{Fw(3w;80AP=Ja4}LzlN&11^E+?H2)Tc_$TJAcY2cDVU&EA8a$!;%Hae29l)Nj+L zc9kE7M~1cs^M~TYT_jPalu7DfowxFm<(bL6+xgrrd1`sfd7YjI&e`HxK9#lMpIS^T z#$0@)_rp4TQQ4$E(h6Y)Zn6KH7c6nXnrOB*E^5=1RuUhs7wR0`9S8;J@MEQdxrX>c zm1H~f_l18^E$j=w^?GNDV~3a`#POq<*TeyHwEkHgqm-2&N-Lr4>#kHnEwr`14Zff} z)Klgszrk_Exzkz9x!lnQu6CN+$P}X&lTYoU)=Hy-UQpYsPS++G!z`#Jpko{&9ce|P6uB~i*<(R2Rh^pel*nUZ9Pl8kG+3; zr@P&bPuz88Hx;(KnP0WJ%5CXw_di81~(aNt*rh>TM!+gJ9rI+_9t_c(N^=x8R3qhs=?<0GT0n+vcfX2w}S5} z5A}quz*QGNIXk&C-FMvGToE8`#DWxco659l)WedSo`V0fA|P(CYC=|RH+!ag#QkvKw@W3Fc-^mkUZYz)_eU zsu_$8xPzyqVR{w23ptPynf`oNXKl|bZ~ll=o`$ZymC=BO|NMEvg1i8$*D|gE1j1aPG2IA*oDjyT6HB(S{yoy-sS$l+hB8fvVOyw z0_W6mx*DGidf>(04DTVR^<`&$$76IW?$clF6uq626kZ;j7Dx%0!M{xeI$(&k5Hhu{@_x`H8h~kEAQN<+}1oeE$TwucD|iMg{8$afV)n zy|yQ7GEbRkWcxx`!{PNjwp3tLULXZo*^j8fulq%?!<$}xVE?t+e=)B~v^*m15o3H2DoY1Pudu(5GxARgmu}HS{r7E-0?s3lYxl?$VxF?rW~@ zpx8`-6GdU(kpEbb#tK>R`>3 zAr3OtbC{Rop)-D=UDI=$jo~fcN{N!gxU74=u9+Wy z|M=a+S1&kEDQp&i19>(5nR|qK#)OEq5%;}4JhoF3`v|Amc2G>0JRmA;hDjzWe*>tk^q`QY}k~2$K&qmM*@Ct9xzbJ~-SjsNlkTlt^{6LiM z(@$E_)GTHMXYq^}7W+89iK9R_S|L>Bo3jjEoLq+<;|X(}dC1V94IKoRVQnkk9!>Nh zS*T`*fWwhYbtj*|{o4aRq9w|*@Z`Wp|2T0yLE$DmT2W0ym$_>zc$Ua2Eu z*%ihHElt@YJqisEj?RklH}Q?l%;y{EubGt?+%Esp>k`b%^g7tF{)R|y22HvT$U+XE}Z>jBPxK?XqV=^>1D9`#&{)S{+F&5dLuHhPA+ zOF2cMKh){9$W*JBK0p~O9SKj8s-kzeT-qcZkR!B(#tCa0v5w46^Xz8M;HL;l!Uyr4 z!{OZSC?TfsA2@-V%I;#;QtQB<5Us6dU2}-xF$x-tk)bcpZ)yv*{n~D=wdPTK%cCVN zoPe%tl~B82@8ImcWrEN8IUb>8|M+=6U9}T!QO}Ll9%Y zH9ALAhyxVRYEC1*XpQ`Lz4jK&uxijk-`8IlL9??x0{Q$oWb;kwcg#*MLik5$Ax!5> z@pbt5{CU0=Uz9t^G)H{-4A1^OoZgYfPVJGJpZ5 z@?5!${7gED8g6sxm$Y7XsU7r3W*gLuzR_#A`eJ+M1J@S!6c6d`>$&OnxxCKOqQxy@ z9#YSd8?eYpZmBuc{~>x$Q06E>CA+o(ZsA+TN3)^*6`tu8U|db)n&7Dm!hP`a2*-X$ zMaMVcAAS|Lhy9m11}C@z>hwHh67#^X8LQn@C#kXOIpvI!r8H4Ts#DcO#55QhpT zKZj2Th$G6m%30Bs z>>A_x%Xv{u$67$JJLt<`IxI8ej81w}tv9%Fwp>$rsZ>&HsPk5hnUoNON*MEaEz|lLIM9zWt+teL}%+2M!>>lJA z>=Yc&`Q>a94R;l>$hu%K`a0-MIHi}eLD{A>QWt93jLT*-+ak)*{n&cED%5a%bM$d$ zb6s-%a5Z+_bCecW@=5FwdKb8~-OY1)dF{92RocSuTSNXJFHnl89}tN@(%&0r%y{b* zs(6i&r%y&!pWVJ@Ew##mT{Z#q#g}RWWs_6|ammsk8>$`NB6U_mT3$Hl!8l{j3Y(l4 z+-1En5v3y5!tL7I9dZUm2d~lH$&c1R%ZV3hUj+8Am$ddHlWlIUVD$pAgcMUbd}|>8IpqM0w=SIWhwr*s4m~j`UhIIPs$$# zN&KR#!UyYd74w|)Qjua*uc#4`!@RaD!SRA$#$+d>t!sLwT1$B>N#P3N{UJwq6MizE z-rW3T2dS6rWPx;+b|-lnc?)}YdQQ57&SByq?j8Lvk!-fpuc%v<{c>UXZ@D4vaz*Wd ze$||WtT~;Gq<_=-m<+gHd(#$(PnjT3t+BtG^^9ML!z!wEl%BE|Rj)3{J~P94!*uun zM$1U~hI~?<0TOwV@=6_lEz?l|3i`|m*jQE;Mr4JA{%|7}{ z)ua3XM{AZ<-#gnA1U;-<)RoR z>!5GoLKU&26bXL|pO6;I+mt7205R2TqahUP1P@ZI;|P#s$9^97&lGR>P%FkK4GW-pR=0hx;IOAsLXVcHzSF82gFpoMY%PZZKMyg$ZURoqUemH} z5o1t$^{@>&nyi93;G$OsI|$yOZ+B3P*v&Q&|N=5 zohyOpiT!tmVQMK@6~`$}l>W*WWg)nRFSRZDRwL0IX?;Uoy%(x;!@*m430lG&b3MFX z@6wFHr7FVBjGMB(Z z`%nGe4At;FG|67$@(M-84`5hJ;!bhASW4U`+~qfOW!SCsE7G<*SU-(SeT{xaA7E60 zmZgHV5|kej_4L`OqOKvUqcWSDsDUc_aFFu48&2b%K3gvbPh}~+EPR!N^(FcV{TX`h z2}T|e3|pao;j*3fIjgx<#u{KPvr1cWW=G?-K3)H!IkX~hX6-`7W|uS&d)Ys7TeYn| z#awAGB0JD7R^vViqaEj+Ph3mf7u-#eZ>KuOiZg`_emK958_c#~;^~zjka*G2Xb49} z643$F;@zm#@gOy&le@`Ps5S0D*JA{#-Q|g~@L&Z|Q;&k)`X-dsZHyQrw=vB4WvnrW zL+$5*3Vt*?B+sChjwSa&Q+^4Zg(Rzlm1Gt$6A+J2*PH02q0^ZRZ*3K5wl^F97%#zF zyt#N~fihP>>yp4oyM=4G4#q@BaBMw>2-SIvk)}U|pHIbj9tEy#UY!HmHcGDxCFU9E z(?v54oR0$bO#3`k^gqx;U_dQdL0pDkWem>mF)-_z;+0qUjzoJ3F$F%5^3)S}S7h=W zbqMsqEzD8oGIN$W&Rk;NGtul&_BmUK%gbf4XTkW3VrMY#;2pb9b)bHuzN*5>QUgw@ z)2LeusJlkPeYF(NcMNLNNqAP*;8c;}5h(~Fl47gaM&zko;QZ#%$Vwi8_z3Q zzo`GKf7ByEyZ8qzm`rmTJRBA5uJDq?f*yYxPh%szFnLj(W~lMhY4py1z~gq89)aWc z7O+v=Brb*f#%1UK<{$GP_yhb1%+#Y?O>Px54o+q~P0>fGL6n1u4>)I?>AB3m=akO2WZ*1Gt)gS=W(?m4Y`yhI0BK7@{c#2om~K zy^>x4b5zvRwerX*wqu5V)4LhZjW0%~G0F_$#2jQf=0~`XEYLO5F(yvpp3qhV{B>R^ zuwR-cI6e2Ra_~D8fZuHyGK5-mB*^F!*%G@}%wKO)sd`U$Oo#%Q9J zr9M!9scp0~S|NR>?gpc%Dkw!$pn@6=pXM)3*Vm#a`@z^^%*H85;}MfDgCpi5>ZxN4Nx!b2*7xgo^!mm# zqu+ny*LrW?!)_~6r$EYB$6RDy;Nvw@5i8+db|>g9qu5$(6}BFjnEi2u8R)xaW4_R5 z=;^eZ9z?wWpDR1)cP}wE6XEZ1hXSY1#pge%NV6(i@tH8_pf z3^!#tbo}qYy;%!u;dN^VJV^1-L3XhcuqqzK=dM(7t(x|?x=`Vjg-U%*M{TbSCDS3MC7k-{ z>@2Q1A1@?``yA7qH=S+af^vx}Uz%Ucy<-coBSA(gNROp_sG*;Lb8o*r8t?FzeT}$F zUZVQZ6S1a`Lk}^MszSaWAE&G-c^?d_TX<%LumUApi>=;Z*VlmVAiwp>oNIP8 z%VYhnV79=jw;f}D0%k=lII&KBruIy&jf~Z={8H{J$;vTh8KTH(&_^XJhw=F>PTkq4 z(;yj+pc#yoeQX;xmTk%U*l&oVmkH}ZG;r~s*=I}+<_5a^P0#@y33W#zx&U#AlJ=q_ z-4TA)Da29GDJbd&HHdyn`{_&c7PzBtfN&edPGak`iC|kjp?;!wTOEBV-d=9Cgrhaf zd}3b4pAYbBRy9kRrJ<;BU@fZx=eq`XjR3T~$oVKOO_ryHR$v$Aj z=E8n49q!ti)>~^7PHBrH-hkg%idq5Z-4!Yay`1KlB}{g975k3;${u2KvbE4FzXX2S zB=oE~s9DRvBQo5$p?5`W)AF zGHU7@m_NaSZb3DN3%oud!NWSmt_p>4X=|`K$e5)wI)S_G*Aub!=Y&%+AJh{^;h!u8 z7Hny|HfWW}P}ano1&x2Tc&J1<`Gr(d9;kS=WW9r#ZpFZ>xesedU+PbAl}<8q*)rU} zTw~--docr^;S`>mRB`GaI;L^t9il6I(EqLO%W;PaV;?Jl_tDJS0B+siaDb| zu%9hv+j2o}5PyXvRr;HzUe z%d!SCiO;x)ow1Xpp)OyRbU-1#2?s1XmLRoeGum<+HcH<29H&L zw!T@vrn6XGCm0J6qdr2;Fwwk+I9x=Wwb^Wg*rgdXG{?2YY8zz?PFTq%AC(i8XziVT z+#F*^lRdzDQR$fs!_GlGd7c}>i^6WfB}R#-gfOmT4b%zqz%b~DH76I96Y7;U;933; zN|3d7WyFZLpzw)9y!sXz1&;U^*D>F|YxjmbJQA_$dW@*=^hUZ8R)wYTX8lHdU6H&& zG=YcL1~=d$BI0+L4>#aNdx?_?Tcf6a6DM6%fYW!FH4dL6txM(vtXcz&1bvrw6su}` zdARf-Cq&JnW0+*jiXq$-IEVU)-^Hh5oLEb6V2z^K zZipe@(I&{0TcO9vM^yvm>>HfKE#cZN3>L4LipS}U?U>o@4lbF$ z0qyrt$3@3sM=M8?cvpDIf8lT(9^*z7JlfWUt_nM!3DJ${ zIUu|-sNjvXPhj<32{!k4kYC>$enT^O+{a>2)tTltYb1D^E6EvD11NdgGea?Wp#2C#DtK9%q%L^Oc2;LJdLZH}Dx;CVP|FO!udXkU5C9_8KVn zYMFD4RMg40Y0b3CT79jA_CcM4ZiG*H1nuw_?BE~dlJY=lZ&*dAD>5X6qT!jo71|fR zEEQ5tLi3Z)JOb_HF|cpmGGn=a`6t2&ajc^VVv>5Ug|0-`CRZ)j8s}9uTfl1IAl33Z#xnFb!w zo#_TpFixPq(Y=^oOg-c%#X*&Ch_eNHLxK2?`c5%;=cjOjP$Om@RCFI0nR&}BWq#8% zouBFqrXdefLkFCpTgZ+Ak09Mz2nJ1k^kt@@=T%lajK0i#^`$x(S>Xe{qp=(N&UDl? zN+Ls^iM6~8vi*iQabgYBoIO!vX@$zoO|U-p;O-s)DdQ+eFXOrU6D2jC=v!pt^CMc2J9GBbfa%~Zw={6*EliDMpgkQ*Wz`V)0q%f5)L@f;Wzv!L;t zY!pFf^qjslycMRL8W3DsIOFduYFj^< z@60_s`{KC%#dI}X<#xEu3FA=r{V6;LM+u1`A%VQ zxzezAr(mQfqxN?QpN~PUn}V<4;KSz>@Ic&lJ@5(tfx0v|l(2b02)bjh1&^Z^A}J26 z+Z05wLy==-fx(YcY@u%+hxmLjGSrqhbEYbYQw`1DW&-MZ#qfOx5GjEKu=ESj9TEE_V|H#w)Wp+Cs4vum{80ijosqM{(?)Z7l((VO#*)doC)PRn6>(pl+f1v&+~3cGW!0N31eN zHnSa~>Ai@ipFu5J44L9)#EvZV%yC#jI)OG&87qEHRM;Z%cMWvXh9g3rh*2^fAL~&G z_-{8J4mxN8m?_&p+1X3%!#!9|EW<0ypj=&zu?4j%sD9VL$e9je^Z)Sbc6{e?+=>0j zU-zOico%hqT!=3#BUY}8&t=K-WHsn*2{IF-^eN~lAHcRbf+%JxBI)X&5e0B(_h7vK z$Bep*r|{p&<2ap{f#&~%JzDz7$_1Y0& zwUk9IaS)#8dPGdC?5SA!Rzkyl8>h$f&@fjAaj753Q^&!MLT8t(fNFIO5TFX8e^3@iB$P^^4MmYGx?iuLvfhvH?~0YUFn&HCB3&PHt|N%9HlgNo8r72*IHUa)UVDaj zOT@{0)Kjs%HJ)bf&W&GoSNe#E*n0#BtTxKSmLYc;_08GxC* z0u;8FIES3U_e5cSe6;U_H1jWB`|o^o3M=_H{H{B=U)SIYIESz9;@aNYCdO@P{Lh_m z63b-NN0#AZ0jeak!I{I21ccdhLv(DJvzJL!PR@?W^$ z$Kqu00hq^q@&As%@9GCWRVmz+D3FB0sE_}^ zd#5lbY5YDOv$Gav&qDB`_G2a;CqRJ)Pw6uJ$yf0Af&VD?sG#)+hi3xD(r_r?*P%w5 zNbJOS9>-5D#@!kNu2c(LSvin?iXpDOiMyVFkueSLz6tJMc5qm)TKiBvO!$vY183$- z>j~D0kBBxiEDF(QS&Z~?7+Z;`B44s^;Ep~9`|n>=^p9iRPsXcP@Y)-=xqo8hy~n>? r16wN%D@-J~