From 26f049653be3b3ac8bd139d7918f0b4da44bcb2d Mon Sep 17 00:00:00 2001 From: asb2m10 Date: Wed, 15 Jan 2014 22:50:45 -0500 Subject: [PATCH] Storing programs --- .../UserInterfaceState.xcuserstate | Bin 74438 -> 74743 bytes Source/OperatorEditor.cpp | 96 +++++++++--------- Source/PluginEditor.cpp | 94 +++++++++++++---- Source/PluginEditor.h | 2 + Source/PluginFx.cpp | 70 ++++++------- Source/PluginParam.cpp | 81 +++++++++++++-- Source/PluginProcessor.h | 9 +- 7 files changed, 234 insertions(+), 118 deletions(-) diff --git a/Builds/MacOSX/Dexed.xcodeproj/project.xcworkspace/xcuserdata/asb2m10.xcuserdatad/UserInterfaceState.xcuserstate b/Builds/MacOSX/Dexed.xcodeproj/project.xcworkspace/xcuserdata/asb2m10.xcuserdatad/UserInterfaceState.xcuserstate index e76535f54108e91b1bee82f292b11303acd105c9..590797f8656e197cd41faeadef94162932d388ba 100644 GIT binary patch delta 36033 zcmafb2S60Z_y5lA?kU`Dy`#5-JK#jh(VM7>unk_6`7`0yrRmGoS$nT&%zq7=Q`Hfq0Mx8iOVv9kc=&pbcmT+JnxZD<}j#KoRH- zia|fn9}ED4!7wl!i~&|K0Zat5!5lCbh+qL&1J;6dU_ICXHiAuHGuQ(5fW2TJ*bfeX zgWw17BRC4qfb-x2xD2j<>)-~s4ekKzJ#ZiV1|EPv!Bg-IyjBq^XBDT?tK3wcDj$`v zDnJ#is;i1nMXO>|^;9XUG*yPGwW_;nfNG#>kg8NQTxC^_RZUP$R!vh)SIt(RQpwjRYz1uRmW7vRp(U~R2QwP>#7^7UsMlO zf2jUcy;S|B`djs{>J1KXHBRFU&f@O42Of-@@j7@2UKbC=>*EdZhIlI82v5Ts<4y2% zycM2-=i+Vf9(WPn6Yquh#*6Vm_%M7lJ`SIP&%)>9U*hZV_4o#SBfbgWjBmle!MEbu z@$c~qxb-4_3BQbA!LQ=i@ay;u{3d=2zm4C)@8Q4WkMQUC3;b{VHU5^s2o+I_s7?41 zeuRPWCjtl~VIl&FAR?GB6LpCQBA!Si8WT;3bfPKIl4wV?C%O>bi2g(=F@hLLj3&kq zRze`A6EldJ#4JK277<^GqKeo|Y$J9NyNNx-Ug7|8f;dB5A}$kGi0i}y;!ol^ z@q&0sydrV37D&(d6#@Z z{z*O}pOVkWcWR&})oQhq+F7kp(`rtwS9_`rYO}hIIz%0%j#kI0>xoT{PV^-8H>5y)`A8ewsm=Qq54!Fip8;lt$1%%>>Ov%~Z`a%`DAq z%{GzT;XH9u*7)*RCu*PPaz z(Ol46)LhkE)7;YB*4)+H)BLV^sCjJFJkh++ywv=od98V;d9PJzacwPaZLL;IX*n&g zb=A6Qy|mt1gVtXgs14GFXzOYtv=(iQHddRcP14raHqfSN8*7_sn`<+)nc5s}uC}eV zowk#C0 zi}qLTUF|*XeeG}B2ilj~zqEf-Dhj6vilo$3Evh!9r(7skDu6OlCdxuZQc+Yi)qrY9 zrBWGGCY5ESI#Qje&Qvkghw4j}Q2nU>)BtKAHHsQdjiIcRKtXCOHIAA^&8Fs1b19LU zN6n`ys7h)DRYk3&zNS`DTd8f-x72p(J8B2@J++hiiTas3OdX+)Qpc#{)CuYeb(OkC zU8inPH>q3HZR$_z5%rjQLOrFPQP$_w3+e-n(STObG|kW~&Cx!zFYQMgXn#6@HqsHa zg^r|C==yX6x*?rPH=@(%EIONRO?Rfd&;@i?x`ggW_ooNY<@6|eG(Co%N>8Jw(=+HV z=|%Kc^kRB7y@p;(ucOz~8|aPnPI?!;o8Chop^wtXtn_jE1bvb|MW3dx(>Lgw^ey@i z`cL{1{hI!le#6vaYBNrZGoxX&48_olC*#F>Seo@@y;yJ7 zhpoeguyxsZHi1oKo3QC@Q??n~hRtL1*=}riwg)?q9mJNhgIOypu#g?gj$_BO6WEFD zTvlY~S=sq)1zX9kU^lUw*)8lh>|S;syPrMIo?uV1*V!BFP4*Uho4v!{W$&@~+27a~ z>`V494sa?C=LnAE)LbpDHmB!YI9JY%Gjb*_kPG6XxM(hhYsjT?jkruMi_7L(bDg;^ zTmjdWE8+Ta{kf4`IX8;4j^?ItQ@Lr}bZ#N{CAWzCnp?%K=GJgqxNo`b+)i#6cYr&{ z{lp#TPH-o=bKDi~DtD9nmAlK`<38{>Pw=&QC!XSIp67ME8}H70^FF*kAHWCk!F*jl zl(+Dad@LWw*W*+8RK7W%$>;EG`ObV7z6W1q<@@p_d?`PaAH|R1$MX~TY5XjHKEHrp z!mr@h@N4;v{5F0&znkCB|HL2WPx7bu)BI)r3V)Tq#$V^}^S|*A_}}@b{J;Dg{w@EG zf6sr=VLE4>MyJ(LIyarW&O_&;^Vdb{qIA)^7+tI`PM4%h(bd;A(52~e2kD0BhU!M@ z%5_$qpc}87pqrwbs+*~sr4x1YbPIJ~>Xzu1>MC_BbgOi$b?bE-bX#=a=(g*=)9upj z*6r6F&>hnKq&uoRraPrOtvj!~pt~Wq*EB6k)Tinj>C^O$^{w<7`b>SkzOBBUzP-Ls z-%a0L-&bFv@24N4AF3awx9SBw)Q{Cq)lbt;*U!+;*MFg3pkJu}QeUC3)UVL5)34WW z(0{AnuK!N|qyDh|i2j8Br2ee_oc@ydN|Op2iiz5ZbbUc3kit6jlU~5q7tbVkY`w2- z3}V*_w}m^x0|+<>HVW$?_+Ciw+`Mswy(vMj=2b6_y~xErs>M0pX%> zOQK7|^4rpea$*zj%n~WoaiawYZ9dEqd`ygs~wjA#PmMZAh@tWh7A#nf~gW4h7A`2g&@@I+<_&FrZX%8E++7nT*Z$tW!DZ>OJ(O~?2Z*c5CkHcbc->I$JNuoFcqXy14K^QJP=S3RgbR6g#xJo7%)AO)gnflA#+G19v1QnDAwsYSkwTOZ zEyM`1tFTIJ1y+Tv#JVXK8WAznxovW3<{j*u&)iy=|7Q<;H7x|I}n5APn@0Q;JC7BL-$%EO7g`C8ge(CQTAr1?UFLJK>>>)1`qT!GyX z8dqSqgeIsx^&6UtfrU7c~ zJgANRg%E^yD;!+Z5&c_QR8m-0JhTXDp^cCsg9I9&&CAS15GnzM9aDZ)N*KU)$;{0d zQdZclq)2YX3cyJ1kQE4cDg19S{vjR8Z^o94ItY#Q0-ZD?otIq1px@5QP0-J_y1=1h9Ze5QVJ*F+xY7lh9S@FZ4h@I6&&B z9s|YQQGOvH0i@LAaG*YDfEhum&{^n$9IgO4oY*M9_oMHCrl1*i4z$1ug%Y6~a+^Y- zrRW|Lp8+zlt5qNiWP{cqN9Zo}6nYDNgcfH(9@2OeXxpKA4`k5dp2bC_2u)D|%V!NN zDwP7464k=H4;-jyw*%-XZjSLID?uk@zs)g*7P5>kpsmnLD9X75ks`Mn$}1L% z@){QnFY2LW^+Z{H?O8Uj0(~T}68Z_5qBW?s=$%r}cwp-7M>}LL>B(a7G=OZsjm4#`9}*c1j~_y!IxkW_zElrOTbdFOc*7M7RCrx zK@gxYb`_`qm0$&^0xQASV3jaV7%xm077DY3FNH;Nl-Uvjz5(AM>w>Ld8~7G%7bXZ3 zg-OEXDzF25kF2{(m?BI?)}5w=6YHcI?<3c}=u{pR8=nwrh>VYo8Qs1-Iyxab)DSh= zA#Q*};3u2yzYu09wpWyPOtSrPZ~~kJr-YfpY+YWRssucA!RZa>AOH&NDndzRg#zsM$CAcq9-Bt^77Q>zu>;@jAcEga1I zi)`Kn3ercC${!1hg%)Vc`q(!U<4|McqvJ=9J`bLQ7vLpw+P_ekcm@6u&&IXz7gix5 zONF%;!N1@QDtimwf%mBVFBL!wZyb9jHjK}(BC0hk5SBUUOhu~HHl2MfEO*eEN`rK! z(yAyGtzv`dAnI)yXLhWlI_dr#sDy)DFMpFr+HWQ8Jm8x*;m@R{nG88I{DpEX| z5KO3|P&Yl95M*_-g??46Dgh13syH;7Z;(dwLRAuS`;Aikamg<#9gIfu!Ah^s9n!5I z5@=_vuWBfb8G>N0P^Ai+gmimBV^y>NhD=p+B)6ro8A;wJhfFJK2?|0Lsw`nkb&pcz zs5<=LF;mq^)me&}s;+X({6^R=$IQJ_%(O%3p(?H^VygP6`eH^^KVfTaVH@gH-=a?S zB-v>F7&29ZRb@68*du)B=mH}o7Z|B3SB+AQ7Ip~V3p<5fb{9Y)Q;L&{)orm)N!Ws( z;sR3;+3t@npm+cZcN!($30MIeCtBiy3~2-U4J<4z9z3AGqIt#gb0vL=!hR*%g{T&& z7Gvfr)k4*mszs`=goDBl!jHnCD%BFzQq?lma^WZ8uy9m3hT_cTv=m;oO0@>rOSM|~ zxdIIcErs;CjZIe7M%891caw0$mRrDbX~^UQN{Z5prCFIYMYOB+Th(_G@pj>Og=&Xz zLh=!=aefR97Tu zmxW6es;k1~{~xrQ60}>Y+rky$`bTKLs_skGrdMP8P4z&yDqIs9wy&Np8ygmP{iN1M zs;8e|eWrRY+z@V}=Jcx{U{$?R{ezj8FBj5TwH@bM)%$7{eh_{U(q(nwDufBgaYFc2 zxL=J4uZ251ipMp$R=6wN6B=e48xCO|k>DJz{|~8a7NY%4XlQIWLZ-B<3irefn0Y1c zg?r;ZxG(M}{4P8c{t*5Y9<9Xv@c`V2oA5y4F$7K!=phJ&AWTxHLGqwyHwiSSf-COj8j2rq@dR^f4IE^NdT(Vt|zp71y7ZS{p$LVXBS z5Y$3GIf=V(wJ8N}iZ{pj3cQ){PX*pWcr7$6U>T(J{KAqUMT1iZw<#^MyC9y4XCwXL zS;D^+cx&N}kgm)p?2__uv}*bq&j(lWc6fWd1Kv@1i-xFo!h7KZ1Q;s8yP!YvkHEZz z0HAW^Cp~+vF42nj!TX_j2rlCJXuNw{DUr$q_Sk}#;$_ufhd_V}4egZ=$46FUD~Eun zjz{sN6|EFzRmd2s5zNNtRwEE0 zsQnSa7x)6j;p~tW;gyo5zQPydOYo)mGJH8+0f93F8VIxyP!P}%Fc7e-By(XwzGwy6 z2w#n_k?n<6yYjl0hiHn7T)-p>dRNinLW`sICSa6P1N98>mw!8^&$LP_-6q2a7WVH^ z)I*L2*@}N}!>%ruMl3Xf;oo5kmVfl|o%qj~c|E=h-;M9V_u~8T{rCa=ApQgXBYp_~ z2?7@gTp@6Sz#Re)2s|P1g1{RB9|(LQ@Pojx9zTp9!H-G}2t%tw=_d$3gP+9;A@GMF z5P~4NH7!xlYbmwJ3_*w#0JmOr5kWWn7li3o{4QF3<(8Ee_wNNk00gG9DEB`88~&g@ zT5=4w6&O)-(4q~0i2s3Hw0c>g@U1}Ef6A*kC9RM?#-E6PxOvxFfj`Bcp~3eLw|f2L zDqrGvAqaM;=^qG?eEeUuwt9xY>6Dq9Q`o;(QQCkZ{mUSzqey#)zweNl+Z?HPcy3Wy zCH?_B=8(2A699s`GChG4ggD3DMNN=|8dW~WT`%r;k1Zse2pwi#LpT!}LQ7BtO)vyY za0D`RI0O+8SRjamAPRzL2x1_Jg&=MXW+Yq)SHcbb>p^&;zrCgI91lSP1WD4bNVV&w ze>b4+-PGf%m8e66EQcUbff7oDp*GnTVhH>SB9uUL6|`1E3E49U3lXxCh$NzjXd;F{ zbtXfQ0l`2BP|x@h39@-LkwB!Nk&j3ul89uY9t7zB6bMkw4XTLxL<6EBkqSXWDX zXaPYhgy*=wZ__qqBL)_A>^Y>QB%^5X;KE*LZiM`iXokjBqB%qhsTNnT7ep%}gUCeL zS=dV=n`lks5V=Gy_KavlKdiRg@M;O1?yDis%?wI|UPf+p3yf#^>3{%p&Ni9V=h zB@m=TfZ(ErAs<#G4Un3E^n~^RYHGq@qKqh$n=lkLVJP7=9D-&n>RD-Gi?Fe^h;q3{ zis!;MR;w5iC@xhIV~KG{#S+G`!f;kkx+h zkZ#3;2cxL1;F>Mrngh`yvqoI=i21~P8P@`YYXO05oXZjj7Mmzw963X5_*hyjaAH&M z?p9(cwxEhwMl2^Ph)M|BLeK?*9uTbv?fX8&N@DG2L9Zj$6B~$)5VV7!BLtlw=xo>C z7767y5VWru<+sFkVmqdjJYWZcxr5jVK?l}J(q5R)Z7Z?QF`f|z2^7yhqqxJw5rp9w z1O*UulQDF+V>l^cI0Zr1nlYS}F-Q>3BM9e-ix8mbmd3gZBJ@3AC9Zyg;Rf-`XEFRr z+(j7fLr?@kZy7_e9mDSuhKCUJtQo_jY79>hh9|@`2vDp{V`+iFI50$HH>QZUA3M!8 z^tBRyeS+s7;@xNQyeB>oQ%DrC`a;lOb|y5Bm%WE15FV0*prl4TWNp%kbdtP>L=$LI zL!!Z~ABzUHG*-N2__iU*IbtC7qzA%4x{$6!GU*P%AP7ojhaOx-dXiqGH;G0R6ljM* zfZTne95NyjNuz|p1ko--O&&}JlV;K^V+cVQLP#`O8p@&>PMY}6oNFZ`(6o-UkdY9e z9%rp~R5FH4{4AIxGMTJLqIfm}f>98RhG2|cAq^!ksSs^&)Ci_=wSmfzfyzj2QwY#J zBn|Z?+*^b}ZEBG%WSxjlecZ)S#xg6JMYj1YkUTOU0YTkGfMA>qWV{_nM+pe(La=5a z1$H20A<{}A*&Twhl3hF`Btr|>W<85bijpECM7nNzEwZPAX^W{Bh!Z^mqxzF2QvE2{p`D!?1_W}8y?$~lQpHyC zTL=)?G}cox&?E-~O?w(G-daqGRG`ybGdgeIVYgMWIK&)iCHIgAKMU^%@<(JTG=*CP z!4lb0YwhrkNbrtA@Kw$5PE=d!6oPk(JOjaE37)S6Z%qN)-0na70-IXN^OET8_Ay7yL6l{uX%~sqPmDmO)S{t8RrI+dT;zijQc%T9fL2x2w*f|U@gmg`?*um8PNKU%DOU1R-fmA(Ftrdx%omo^XV-Kqr5I7-CX zPs1Her>^B_I$vc9qSnfpa=2A9_SqVm6sdV7VViNOUDR%9Eh4Y{)hKwP-5!O<3tO;4 z?XC7v`$Di8f~^p2uQq_%Uu|++ld1#NK@e<#;2X5S6aNVh$XC}@hkrs5p|(J<4Fa?= z^XVCyvEfX2$Mvo{R-Nz(XQDa@g6|;Mf!5w75#EWPY+<6U^m4RGnus<`Y_K-l37?-}E9+5419BJ*2pM z-&O+#^tElHEB}a{n}&qi6+KEl1}R#NqW;MWwH1QXXg&CGe^fnQ+8-59H|-kqKj%;C z8S0ssQH=r->Mmy`yysBW9h%j1`9#7}Ndg2H#mt9!B50mUpmklCSkc^TYhiN$>VAGp zM=fpXsQ0M%LU0FydqSQ#qlFKe19K4EMM~e&qN$R&j}jkRgmOru>Pry(F0?qWzKXrX zUWoNtt^?`fgO;6~rLyM`yg=&CY!&9Mey4t~S|+XBRH#4x3(?-pQF*a;6ty5A!z}J< zRSbN@h!!4%v>hcj%LsE`u!+4_OIwSoMQ@#u@gu+?c(XMtYrTpV@@z}DS})OpO4Q^8 zhDi&#TCY$F?P-G4((b*B%g`y?kkX>Tqei9Xq&3U6bNnlDbjxvl1jX*QBJ-n!zYe%C$-2rPSu! zaHY&eO5M*5Q&Om_8AY!)=}O8=N)@+>P*SMJ8O7yo5|os`l)Bv}NJ*gyi&3QWY_$hV zsnon+r7T2B4a|#DQejeRZC;3yLcPx@Ue8n7UmLCcP#g0Dl(IM_<*CnVo7p7Crm@*Hd9D`OeNNuzTL6!N61KYZY8`^3WlGYN*fwrCs336>j;vtc+*{N-s*>Sd&sGQr` zG}1vzrPx!QrPRQ7Hp_LDQVZJIG=iosM)62HU!|^|QtC-No8^k7RNwZVY-Vak6MID^ zQf6voCGG~tx-_iyheZftM!n;{a({`NMVqj{oHyw~1_6V2X?qI-uxrS>sW zs!0c%Z$K$EvV+Zz9#F^VlZ+f0qd3!^xw zv#su(Qff(Oo9g#SsneZpe!5>uz3*&P?Dzvp6|i;10|l;Pqb}}>CVrAgx^=NtbVN$c z>0)CzE;D#a3~YMyR@J&h3qGURy1+wx*TqYba#qSQ6xd?U1*JSjDZ8wcd5B*Zuu9G~ zDQ9ni4dhKJ^=E;tGoc`jBy|n5$m+U_QU$C#$S&;Ow-BA}A=_r>WHru9Yg6Fpy}wCJ zS8=xP)ANJ`!5YU|ZcrIcHtQ33KoN;N99x#r(eYFMF7ldq-J+CsBJ`Bq9@ zEwnZ8gOt*AQykn$C8ZL&HIgZvNGUbeo}D zrizi>^=z}O+%~qJ>7d~RO4LkXJs7)7y%;%ZKHq}0A1imy0@N~y;^ znktn?$TFIV&wA7q`xYsY&nZgItdBAy#6v~AqM%rb?^aQo!j~YEw3JCY^;A6EDOnA=^%+T zt6yF5QD0w$tV|}WFOxMXv6*d{L{`|_N3@i!-wBCqc<+uGBnEN-gh~s?<8sCgNG25Ye^2&8MfxnTfXctHlBRd4+nqTwsw4 zHutybf0iUr!RRb*?q5s%tG~_2b7k^|h}QY-nHp>NVP(g}VT&m0| zoVLoDZRN~krMCF79c7}Pm8I13y-boPlS~?{#B!(I5=jf z`OHaFAPQEqID448=rJ@vfqtf1c#1e~s9v$wd5QGt$cEyrp*CQbWU|gkYKoXLOc~dl zuF9E8vr~rA9%x8ulO;_Ssx5d!rjQycvC*!XP1>RrB0&n2u5ki?=qQBQk;>%A=`V@z>BxLVC;v#P%<>#1^+riG5+9b^{QbR5jX=#F z#p+w7HfmxYFq{D@DPS|i*5wVvuSRjQ0B6F1oXbybm1kFqb1l2*jL}M`b9R;mv=k4F z4iV>$Rt6DgN)ccdQ^wHZ%h4WkL!8-a(rB^e7)4*sI*D`^R7k7FC{f?pRVHmBOZ{hz zGR1ZFkVt*49Tbq>QcAFPQ&N6Ps)-mOD80ZrK%tHmtz(_Uxq{+>&VeYmfGrgLtxNTj~j zRPnd5%EZ<=UdpLGE?!|ul9{4K%{U*i*EkzVibOJbTs$MqiJTkCB)&OCBgH%Yb>i)D zN*s4ilc)^i-9+c{%2?x^uH-1w4d>=kDr3B@qE@n$Xfb!|&h(n3ESa49NPH2K@)VMOGD%}Zk|G|Tq^wGu z2TCM2CuJxkgJlvFT_@G^%FE2lZPK`)d46h+y_Y)=mCKb{4o}u9Od~!riC$BbKI%M5 z&O{Mwl9!l0#fID}XEwKG28bu@)MMp>cGU%cOx22(sY>v3o*)k^|G)D5-f; z%4fQ*Q!bEF&8I7Y$9a*IDxGdoD3?g7wbN}5yj)71neNS?{U_&2+ddpRMHHV-4*|zS zuNmo_{lwpSqci$yWD}bumd;qLa(*Y$GasrUK1RxUH*=9y(@K*8aRK6!AwCV_b0Iz- z;tL_Z7~;zyUJ3D)5Z?gtZy~-L;y*zA7{t#({2Ii6h4^m}{{!OBA^sP{-$MKYBydR7 zf`kSV3?y`r@PvdfB!VCj0*Nq4SRj!AiDXFBheQ)dG=oG-Df-NQ{OAgv5AAOoGHTNX&%jSdf?xi6xMzfJ7A}RzqSPMCWtF4oK{R z#1D}88KR>y;v^)_K;i-j+IW4xS;BdxNJq-+?9;D_)p4_ zf2LCWP8|59Mcnm8qGOq;lzoto|Imk>F6hI~-j1>tDu@=ec2v|7nG44Y*q+sjn)MAS z`Yz-hn^-CHrY_8K%#=RwY$H}IY~v_!y&}-50CkB2tHTgVUX%o8f2nok-6He$`?AEb z3ELH33N@jT7_mt0D0i1q#uTsx)p8}znzP8uQN(_Qj6myS4sjTy|tklIBj!nEGXD(Zu>nP}^ zBFG1Qk)P?{dOFl9F1BJxjb{PMOeIChmMJz3Ll=)m?2>i4&njGQ0 zQb>Zun~y$$^H#~PQ@{?Zc8e2V1bX!AckW}~(E^34ZUH;qfr=HUEe~{1gjOw)i3gTD zYDcS)GyN*YI8w55=EjO~4$aWID78d8s%Bax+`i3Q2?N zPOn|*>{yh+Pt&%^ufSph+LW=42{Wao^&4G@jI~CF)QV?kUFjefZg>kg$ zKBagV0@~6s|3@W%gxvSM9#fy%`iN3m{?Va*&{*Z~Sno-NWOM;L+y)W(yt5dv)z^{g zoI+(SV23(VeY4eQxv0H{4xhD`w3oG4v{xbe>J%Rf@o^9zU!}dSy@46Ew;(fivC<}6hpBJqX_YNcE;P^dRp8l@6R&%P`(P& z7Z6`yXA0TwWeuc45Yzu$v!Uuzp_q{hhxnHeUnDVnC8QfucT5`c_{Cr2(LI|;>9$E^ zY`g{Cvx$w3L%?|XYa^vY-G7jA$v;)Yd@;(b7pK7a!S^@E@kD`XRnEB1Sz{j1+ zeGS z9VW{l3S9}UqDra3R2ek{;u|5p3F4a}zNLy9Mh!=dBO(3`#J5U}+iZ;g?(nyar>01Z z6R3&QBnquwwnO|oi0^>-_f^zXYMRo3oeW0F;{k{t{KzO;R#O`!rZv=BY8|y6;y*(C5JVpt<3CqX8>vkQ<`#$_ zhWHVQNjiH*ZmOObP;q}$NAbo^Ps=W9zr??r+C%N7P+i9%egfhrA%3cgIzSyn{7B+y zh@X-8&)S+>MnH;;@2U51L8L!eyfW5je39>A42>##P3Lq=r)0@pGJFvtuLw9 zi1B~j{a@-0VtNPB$H(|RiRr%L?$hS#cl7O89v3BlBoP^nygdqCf^_h98mDU`ku`cd z?L<3cMp_H;2N3@qi6!ud2u$z2Mhj1)FGs3q9j&KbXjh2;3Gqh|e+=;_RkSG2Yjnz}7Lfu4vY zPlkjR5>zcoG>x!aMp$OjVvShl(en|<0!Xls;3Nj#hULBG**BlLv1kiq^b#7~Q>dbs z(#z=OG};i*L&60Tu8?r6qF2yWvib>kNO)97Qps>14!T)3(c7dp)YL=hZ|Us_5!z7j zg7U}egb!*$`VVHyUit^Ax_$J1`T%_p5`K^{K*Apq0af&m^dZEAHXn?TFiFh_L`>Yy zQKILM2J0F6VvTLTL|;ZsS0ND$3A4mhM``=e>^SG&QQPAqqtFG-$hdf^Uq#2FPF6jN z(6{M(NM_Cb>OTFO()PNL2(51Wz8}3TkLeem<$6i~rErBqA_Ae2`<3${Ps>{dNbP<{ zzo$Pi$T1@!5e128NW@ezDh9`l3<=SP_e7l3gm}5#DxAObSyyNTBQT3e)RDzLvU-1u-$9Oc)c+L_neeBpO2WJwMT? ziiu>R6s9ytG`2HIj&SfNH%kiBNP<|?u*#${jTOdpNHn!GI{oZpY004LL^bQ4Y0cy) zOwA$D!p@Zcv!As+)8(^F1x#0ksTCwLY)ohXA3iI&uvd(208gwQahYCBiPYNOOfl1k z=?jT0NMu8zH6(JXn0`!uWRQW7$c023B#OwB?%=p*i!M8diG2?TSw=Ee#9ZTW#0U&j zaI}R)J3IIThmF?BjPyZkjo!x0WM(N$9U#%s0sPDr@9r&=W(@LNC?TQRcbP93X&A1t z-!h9CWf&$pLjqk;mrZQ6rtWCcfBM7l9~50g$3@$t5mUvW3yS|6Z zzp?}p{UFgF5(BE3OAHDR3!Qd>+3KW4JrWq$uG<3r{T#P|pjWsn#mF{0b+ z;@D$m%L@iwE&PlbUo-zIW*iQQ5r|3dkXMg+T3NuVrH0iMX4zV7ZH22G5~FNf$a9$x2KT9YZ`Pnu_vC#_C1azOp&NTCc zmnDg9fS79RcWgs86}13`7&Q1zkyHNwGlchPEDZ#60O~q!h*-A~*Au+>VQ`ku# zOIsG*Nc;>_XSR#NGz${5?Mx$2dRdCtK8UHti3Qu2EkW>*U(JPtD8ZYD;2k;{WGQ1u zASQMQJCq&9BGZ2X2{aflgv6Is>`1m8F`-TPMUePPVp=RaV7d6ksbI?_7F{%~Ipnf4 z*qMlNHYAopVwuE>8DMWt*q3CYgYUBEb78&DNC$@#9Dhzw@-Un4zNFcmg#5qu)?$+ z5*zGHbu5NbHBi0SVDThhf6wLa^0| zlh)Y((^ENyL+fjfhs2MNI3zLtr1aE*b5hG6b}EmJOO!flVss*!I>yCCM}`_=ss}F4 zo%2CLYYdT`FXx8@quJD9NE{K=Nb*snp@A0yt-)NVq>_)}_+vEY!nklnCC4Fg;-gAZ zANd?R@mPsJaq-nlUoMtQLZWK)3ND$er-(WQiPIlN4HxwnT`g%`GsIYaR zGkwW%kt<#M2r;$$hp-Qa6bC>Lo5FXRcrZkxQ-MLa?~(sAOfJMNChSKRkX;S+Jr?HoO~o7;;%q32Ksc~-&ggT!-G*Pxr; z%8do?2lVYZhddsAdw!n#S^6#=-M1~|j&Mi0W9Va5$FKCW(G}6mA^p0cS8!TF;x9gd%*q9 zJ>>r2{^TBUkGUt@Q|=ig-a`_DqzaM*B-N0t4M}H6Y9UEOl7%F{j(fqqp zexQ<1iM6kNA}2)2XT+RO^COgePF(zHevFc@6YpQEr|08&wCz{HCqUArf=_~^t770F z*}!~#WMIAlB;AA-7o=yh_(s?ZK8fDIe zwd2tvDiwTtNP1VGy*q$b;mG|>x&ppX%I^wE-%s*;^61KO1>Xyj2FHABKYqZ+Rt|(@ zfbGr?KUivD86=H0HPDqWhosy(vKAywpR^8=9yUkjtvr;33y=)5SBgI7&MhiI_cDrl zNLQyt;iijqB0u>fhAEIV+c8X+FwB5totiKh_<42=8c2qG4#Prz(SI@6;VtD+EUVyy z9hGG-tKz?w%2q-$ynz%7rR^odj$>BrP=oi{Q7~fpL(G{2Z|F`0qc~uoIHe z_Eztagztr9Obx=Vd<=icE?o!7*w0Bn!XJ~QABALm1%Dip3CeqgnT7p|ly?h0c~OHu z!=FbHnm@~*gCz3x~ zouDBkQ&;f6@V|nqkZc6WPUta?bg}B!eytv&+uZyg{Ga?I{xKxeAlU+vnUKt_zCOl3 z%>;Ry^<(%kPdf>wu1|fk&s- z)zYDGh^}w7f@B6l;B(I-RY&Xinuv8ez0L)aS&+U!R_BRn zbY42|t;6p1QCZPd7&H{vE7Wzi9VC(C?}6lgNd5@P!;m}y$0Lltei%@v9JrEQrQ2){Cu2J0u$Aog`SWp|a^gz%u%E|%a+0f4&REHw=+HXL zO{r3;Q9fCPWbYcjTyYrLbjn#P*{9|&YIMp0D_LScVExb0rA|Izg=GKgGjnv%?kHY4 zYb6KPbPBCgPFl%Q>FWwdCgoU_Ec?%?zD_w(C5NJ~Or#t9j$eQ1lrvOvI4W!5C`&m* zB}e|}nCT{I_1!mL@ydVbv(bGP^Ud*8dLyMpeF>MrRnLvk`Cr&Q{$>aIa@DkP=X^*o;k zi@TmX=}{pXSWw}8-EWYb3CUTgaMlYyU)>{}^xBi|vBW<|CV8fN4#~NY6zwGc=-x;q zuO*WCGRa#Vnqhqb$ptcr!3Wo?5rv+RD87^^^tJT0A-M>W(o=)8Ueu8QERhR%J&NN? zA-POp75{u8qpOe$ee}MNtc2tWn_QDVSdtqk$z3T^nDuoa`86b0*(f6PQ4)nkqF5tS zMC)T9x<5{?vr#1J(LgG^ChkAgS~A)9OzP4wt(w@+$mu1A4;3nbB{Ua{i2 zhp#?MpCgfEOG38ELUQ#eynPGF?TBROOM_1bedqrO>7p-yM7L^h9nvu(GznDl;QeviDZNX<$w%jlzucM4?^+>L^A7z!DpO) zqC_!XqBtZ|OwuFQ_z99fD-ZYOS$Y((jzIEgrGBnngyb-Z^G$t~e${{2R_l?G z&OlOn9Bt~~o<1A(TO=S3jrm58BIS8VqPNk+1An_`q09MeosT*ncHXbwt>5Fk&G}d7 z7y1MGgAjLzxE|tYS#SxGSD*@=zO{gOA4nqazky=B98u-)rvF))>0bVP;M5;iNUqk< z@APMsvg>kCMIR-(|L1E!{Y8b~rakb9PycbVUe#aA%Pm9C{|W%Bjd@@JSY0d@OTrpx z0eY-nkDjLw)`n}N(UbJ?+Ir|o`c(8JeIG5<&eSf`R-pIfSE3i?*J#(F7v(phcjOPE zcjOPFcjS+2Poj6^&uY)37vfFmWW5J^-2Gd0{`x2Nn%1JX*jbuKhmx+eyOs8&z0s5G zk?7nomX416a6dn$T{J)Lew=hMaXSo$0K5PcK9kZwRH6NyYFlg;EXZP07z?U)Ws zC#DP2mFb3FK_9`CGou+R1DSE?HS|f$6lNMT18r>YVGc7F(NpKI(YC1(Jz?IS?TPmB z`mqDpGPGM~9ggJV`vNNEPEbpH{C{$l0Qd#K5y7}><9D|d2P;_ z({ePI#N}{(xWU{|Za8{qd=mEsdR=@Gx0qYXE$1q^DsC%!UHm)ld-S^a9&R6cVf+W~ zG>% z6|Q?+kGh_5J?DDC^^)sN*W0eYxZZWW@A|~`x$8^Uzuj;*-c9f3>gMj|>E`X`>t=9^ zaEo+{c8hh3cT03jc1v+<;MURV*4u56+hDgLZo}M0xQ%ri?>5nGvfEU*>2CAgD&01? z9d!HA?I*XxZb#jYyS;a><<7eE?s|7ucXxMBccXi_yTv`qy{UV)`vCVcchP;Z`%?Gi z?yKB4yMN=p&3&i)5AKKDe|A6Ne%1ZD`%U-T9uXdWJ%)RX^cdwa#$%GlRFCN%)|nn( zdu;XC?yPn{dDZo5>Q&@5$ZLkzBCi!*E4@~Et+9Ho^V;UM-D`)}POsfwd%doBW8SoPoOc87 zR^IvEeZBj65AYu3J=lAQ_ZaU<-c!7%dC%~kE^`>^*> z@8jNQy{~!S@V@1J&-=OeOYgtE|M5xnDfRivXSL5-pY=W)eZKSA>9gBsug?Xa`#x`c zU3@LR)+pZ?-#Fg{-`2hzd<%X1`OfxT?7P%=xo@R!mG9TSyL|Wf?(;q1`-ATx-;=(V ze6RRk^S$AF%lD4&L*GArAN#)YeeL_kkML9b)%N53bbc;=UVdi35Wi5raKEO0&HY;X zW%y=k@QdND;lAO4;i2JA!(+o!!#jVqe{Fwff2}|5@8<8}@8$2~@8|FDAL5_jpXT4r zzk|QElYbZguKwNp`}&vp5A`4JKhl4c{}}&C{!{#?`OowJ!hfNEh5riwmHr$3H~W9% zzr+8K|IhwM{Er0?0aO4Rzz669LIV;58U-{CNDpWh&>|o=ATOY8K>L7>0i6SS1q=un z86XBM4_FbfGGKMU+JN-|M*=PeTnV@qa5La`z%K!RTaCC;ZLDq77%3xTG#W#Vk;Z6a ztTEo$*x20I(wJe)F}5-08`~Ls8b=r>8D|@p7%Poc#;=X*j2n!bj9ZL*j6WIA87~?y z8?PB}7;hP07~h(J2{)0ZS|+{8!{lZ1F$I`RrXZ8q6lF>_H8W+HvP`W_`KETJ4kl|S zQ-9Mi(|FSa(?ru`(^S&}(<0Mi(=t08rxrXNj5Ovg+oOlM8!O&3j< zO;=36n4Xwkn*KKZV|r)$5C{VCKy9E$peZmY&>R>N7#bKJm>8HGSU)f|uyJ71z~+G^ zfztyw1^y8DYv9ws4?!RZ4X+WYD`{eXxJ9DL5#&PH^4eu;2#4t%9?HTL-rZ&JS)E+$Feg@bKV~!J~r51Pj4q zgC_*f4W1XgAo$DRuY#8ZFAJ^+t_)rmyghh-@cH07!S{n71V0RZ68tRqMetu{mDx&~ zYnh$Rl$kMmoBhoGW|KMCT*n+|PBbT*>zh-}Y36Kmt~t-#&fL-5+1$t6&pg0fYA!Pm zHIFk-G*329GtV^7HZL(RH7_$)m^YgDnD?81F#lveVm@v@Wj<@ZWB%2A&-|PDck`d- zC+6qomvy}Aq}1tNXHuQ2I*03Av(~v@=U$!rbsp4tR_A%0mmwg;GsGvv5Mm4o3aJwk z8WIr_6%reg5Rx2HKcsC)hmg)8T|>Hs^a$x0(mSM2NJ+?mkkXK{kf9+fL%t8WSJ$bo zxo)$%g>@&@U0(NS-Djb-L%C4TP@hmkXr0jL(74d}(1xKoq3uJvh4u}d6go3>ZK!o$ z=#kK~p%+3ghu#Uj8+tGFap;@S_hGfd_%OGyfUvq@;bHM%EyHrcdWH=On-^9Qwk_-yBqdf*u$_#VNb%Ihy4}yD(v5|x8ZK#LE%Z^ncpcydr!f{3A>e!4WYLDG?1L(jw9$ znn&bBOn1uL*#Dqo(O%j?V zv`83`P?}JdFf3t2LV3cNL{*|WF)}eKF(xrJu|;A=Vs>I~Vt!&lVzfM{(}`yjFC<<{ypni5$(R&sO^Qs4Ns3QOOiEA6O3F#fOKO+Y zF{wvVucSUn{gMVIl_r%ZjY)z@9dmN7k!d&$*tq9#gMFz3%mT)azOARK08U zUZ<#2m=r$6>XPD~;+0}b2~G(~2}`l0M5QFB)K5uGNlWRS(l@1l%D|M;lp!exQjVsa zN;#WyA>~ra-IPZuPg7o`{GIauYC7w`CKrHS#}m+AhdyIOax z?gri8b^p}erMp*mzpk;anXaYoZQUZ>D&1<`TD?E?4(grKJF9m=@3P)iJp(spqcesh6miqL-$Zt_SI5=!x`XdLQ+s^{w^8^`Gh|>A%o_sSoLA=ojc0 z>zCNo4R>0|Xf^~d$a`cwKJ^{4e`4Xzp(7#JIv8CV+JHgGZUH3%>WGPr9H zZV+wo!~kg!Z;)t^Y=HWYILI-0ZO~(YHy|324YwL1cN^|8+-I0>m~U8aSY=piSZCN^ zh&Ajo>^1B&BpFf+*@j%hAw$0555r$Z%ZyeSA&eZ2oQzzINJe5KxzViAoRP*zYxEtq z0`?nhHEbJf2W%&7H*6p50PG~}0_-yED(nXA7R(%mfPpX@m?O*u<_`0O-Ge=Wy@0)f zp^&f)SS~CdRs<`7)x+9hL|8wJ4jX`RVE@4QFd=Lfrh+en?|~nMpMal&pMl?iTf^<( zj&K*aJKPKI3lD$?!SBMu;rHOF@Rx81j)rH!bK&{$B6umh99{{phS$RJa1mT%yu$b| z02tW_sDw(A2`z$`oM=n%bDUntGUeoBEmtm? zW+Uc0=GV>b&3(-M%>&It%)`th%oELDnP-~knCF=nnAe!sn>U)bm}AYm%zMr8<}C9` z^BHrE`49777RxMFS?E}-x7cX0!{U;~Eem}MBMZ2Ny@jWRkA=TQphbuU-hyVqvk+NK zSV$~n7N0HVEff}N3#|q6m*q;!la?lyR+jdbPL{5g?v}xpk1S&>V=bRqCRiq0rdsA& z=35q7mROcqmRnX@R$DSHr>%asx?*K-6=Riv0RN-T9T3h4H-sm`2jPzhM1&y15Rr)c zh)0MRL@eSNA_0+%NJXS0P>4)K4k8axh$un4K~y4Y5bqH0k%%TlD*}V)MD!r=2qJ=l zpdkhjYy=lEgb*M`5Mzi*gcR`+F@yMwm`5lOYQ$H>55zBE8Soph8dwW#05$-eDYyb$1?qt7!Qa6x;2+?h;4W}4 zcmO;M9s^Gz!871_@Dlhpcpbb2>Vrn0F=z%_f(XzWv;!SM7tkH_0)4>%FbKR0hJ*LO z2VgY#1Vn=IU?P|Trh%_OG?)eEg85((SPGVdRbVYx2R4AsU>k@9yTD$s4r>+S!r|I_}ey@5T<-p4+~KFmJdKF2=Ko@CFoAGBB6|8!X5aM0nD!&wJM2QLR- zhi49{4(SeW9a{caIv#L5>3GJ`-qFL++cDKK(=o@f*|E#9*Kx{m z&T+wMozpg_9ZpxA^qi1}PM%JIP9aWdPFYU5PHj%TPJK>dC%My{^J?c!&Rd;tI>Vh! zor9e3IX`eNb*^=;a~^S)I)8Lokci~Aq$*W3-=;qHF!q3#jxCGIuu@7&q$ z0{0R3?;a~WR(TxqIPG!H!^y=loSH2g?i|IA!rS)Fwy~6vr z_XY3E-Y(w0-T~e(yfeJBz5nqRc~AK4^*QEq(#Oun-N(!4xz9@<$fwDt)2GKr;4|qX z_4(I#m9LKPdEe{4w|w1w1AK#gGkgnti+%fi>ApX&>3T_B)4qgoY9{g{})ewUaSV(F}W=Kv5KV%|Aa(B<& zqjyi-eRTKP-GsaJyC3fILU)B84m}p?9~u@K8Hx|3g${(R4%-yAHOwRo2(t-$6_y*8 zA0`Tug-wU=4?hupIy^i)I{Zm^cQ`q`Km6Z_RS`N7HW9879ueIUWMo8td$jbC&ZG5@{2qlq zig-kM#D2t$-X6U#`e1ZSbV4*TIr>BNX!Q7Fy~n1HEgoYZ_dO=XoQ}B?b1fz#rXZ#` zW+CQV%+Dv5PwbvJKB<1v_@w2@ucxb@u6^qA)c0w?)0U^*PjRsuVzZ5gQeY zkEO*9Aa^1UB99;+A)g@=kORmeq#*9>e`j4c{(IgjkNYncf41S-re}AaMLdf_J`+5f zd?t-IinokM#Fxdtjjw;cz=zk_kSMv9RHm5d>~;-!kUD235E$43AYpC6Vei1 zB{U>p6S@*a39^Lg#I=cA6SpT?B-$oAB&H|kB<3Y@5{DB-NgI;3C+$o!OtMJ2odhMl zPAW(mPLd?alD8%AN#37qlkA%8k&LWJu1{`E)}|~?S&?F&;*sK=Qk&A8(w6e;#p)Mp zU)aC!c;Wrx?TeNd?Ws#sbyC--x~2N32Bx;9_NMlw?MgeGb}TJ6EjcYUO_U}}n|^ui zrQu8X%iNcxFUwylU;a#AlD^mJ5uU3yzOHl3S3l0KR~hD`tX zYSpU^ug<)Jy#ilZzp{B{_sSbu4y}aNKm-G?4QF;Fb@3`&5Kp;Rax zLP42O4wMHKLM0IL4O9u$K<}XUP!rS&VW3W^2f{-{hyu}|0f-H8p&>{BjX-12BqW7C zLNm~3XdZ<|WubCW`KTgPDXJV*g{no>p&C%ls5TT9)rIOs^`S^8DvFL`q6SePP&||n zHHsQXiBVIiPbfKR4z++%qBN*)sGmsm67+KPO7t4^I`l^LX7o1n4)kB>J?Q=DL+GRE z6X?_EbLflcE9h(Jn`k|>AsUW0MO&b6qd~MS+5zp1c0+rjebD~sKy(N?3>}HSkA8%X zLC2!w(CKIhjYel>=wxiq_%q|LjQ=3MjK+-SjMfZH=BdnUnKv?TW$I@l3o~mo-~Gq@ zH)fs5x{-A&OE1eXDcMpm4#~x?FzjMeGB~y0}I;< z35BFWN+GRibJ5MUiYt0v#4Q>xnklY&pi($nk#d*b5 z#Wlrmi|dQOm#i+)DOp#tu_UVGS;_N~#FCVfe@oYvt}oqKy1CS&G^8}NG`#d)>F3gK zr9VplEn8ZaQkGqoTb5T=STxKPQ`}`Uge?6^OYAXFIQfzOsveP z%&N?(%&U}EE>tQiRh8PR`&IE(2~|l|FRJ)e(kfZirz&~%^=gx9vuca#+tmZr!s?M~ zQT0U4*_xX*x;6SWMm6a*`89<##WiKMTWj~%9;`iFd#pCR_GvA$_E{}5p?08FSUXZH zs-1Z2^EUi#;G@WWX z({#S6t%=Y?YN9mJn!#rGX3u8tX1``kGpU)<+~3S-+17HPw8&9DvLX4+=nhO}x!v<0=H z+e+G~ZG&yXwu!dSZR)nKZ9m$6wJ&R5+rFWFQ~Q?oKiYS+?{7cZezo189oBBrZr*Oy zZr|?I?%M9&?$z$o9@}2o-qJqOE^S|I|AkqNS&P|#*@W4O*^SwUIfyxoIfglbxrn)m zF~eA6>@bcP7mPb50273{i^POsA~8{zrwg6j$tFSfLCTuU3fkpm<qf?dEW zvFeUZ9alSyJ3>1ib|iG9cjR}JcT{!McGPt=bYMHWI(j?s9mEcD$3*9<&TXByI*mJl zPNz=)&alqN&ikE@I%7H$I+Ht7J70D}o#@WG&JUfFU2D2FckS&u)pfb+YS)b}-7bSJ z^De6{0NG{TW!L4<71@>7Ro%tz5_E~XzI183zIXlGy|jBp_xkSNySH?2>)z45v-@(l zYj;q0Mt4DXMR$F7XE(8%(oO3g=w^2dx<|Ulx+l6N-BUeFdXDy7?s4n!?}_Yr((|Gx zqbIxPbx%Q0aZh#6+n)NKhMwl0)*g0`x_3qIsb1veUc+9iUgut)UjN>}-jLp~-bcML zy|KM&B6BT-*q53^$3B;y&W$aSEIor^S88{Y2t- z;PvoU`1|-+d!<7s#C!#CSgXl%{CHfP?h);+~NMa_jkXS-|L#!m$5Sxgt zL=3Tm*iGyu3Q0>y8%S43dL&bl9m$>KMe-#Dkb+3}NDoNSq!>~xDUS4lltU^d)sxyu z9i(m&jzl0aNGuYE^nt`92}la^PVzA_Kz1T~lS9bS;g5=x1nL{T16;waB4Nt6^y8YP`lLt#@y)ZeHZsJp1gsF$g_R0ArE zYC<)q+EDGOPE;4FJJpjKh@?hRk<=7w8ub+wP0gYfQA?@i)Jkd%^)0o9il;KEJgSg7 zN*$+)sdDNZb%Cm&s;S!kE&bQ~P5Z<9qx<9gq5jwX1^vbSW&IWX_5F?gE&Xl%*#6Fb zVn4fow12AqQ@^}_u79EbTmMhm652A_Z?sjk-)VbjCux^x$iHdVX}4(lG&7nd4M78G zwlsU12Q85HfQF>S(-LVZv@}{4Eti&0E2Nds%4pp*32lM?C;b5ZEd4s&gbvVc==O9c zx+~p}euo}Rze^9NN77^H>GXVhIlYQrORu9h(6RI`dM_PMC(_Au7JY>NiM~Kr(lzvN zNcvC4O2!(-I>rXZCdL-VF2)hYMaE5rE<>MT$bd1d7y!eDVaIS}I5T`0;f%+OWCn_n z$;e^kF$x)#j2gx}Mm?jE(ah*#kQpq-2t&&F$e3Y#X3R6bGJY_A4J;j4F|cxAEFYFXE07h;3T1_}qFKqTELIV#lvU2EV%4&mS#2yVtCQ8k!m;{UT-G@2 z6HCsTV=b_hte@;9?B(p=*sIw(>@Dow>?7=p?3-*owjmqNHf4isTebt+iS5dEX9uwF zvE$e;*vOY`h@HXCW*4)|*cI$5b}joIyOrI`X0ZQZ^V!2}5qp9?&7Ng{VK1uEy;u>=iTx+f!*MaNIb>;eT!?;hl$=pq$8F#? zal5!YuJps&4;Me&{Gc~tXkHdC zmzT#Yo&^C-eLH z4E{fSK7W`$${*)X@@M!O!BW8n!FIt;!EV7m0rH^Wl;Eu3g5Z+iZ^1Qzp}o z3ql1Ef+)d5L7d>ZAW4uSNE4(Bas;JvEWcbste0XknVOTk=9@#wd*T|lc{UZlQE{#}?AV#c5>_!|% zszw?{up|7Dv5}vnTSoVd9vnp;89hFFYV^#g`KZmP{ixHZ%V@}G=xD@f)ab)e!YE@@ zF#2V5aa1*`9sNG~uV|@gg=m#XN3>q_yXdIsgy^*BoamzHis+i?rbtg@D1wVjMdl(0 zk(06<7MOJ<5lA$)j9Bkl0A_-Kc#<3&q*&zFH5gTuSsu8&7_u6C#kE{L+UN{lLkodOJk%d(sU_G zip-S0mKI2hrKQqV>40=Ws-9Xtr8BjD>i4NFQ#+@2PwksJFm-6kVJdPeZ7OT3XsUFo ze5z`ycIw>}b_zE|m?BU0PqC-CQ$tgNsbSf2*?F0p%wKj#7AlL8#mf?9DY7(KhAdn5 zT2>${l2yrSWeu`!8Bs=&(PRU%4@enLCX|iJ#$+F5b25$W*R;p9_jK@d^mN>G@^sd8 z*>uHp_4M26`sv2$mTCMnahg2cKh2nCPP3;u)9RVOX5cenGmmDT&Agb&n8}_go~fL9 zJJUOZpP|hR%&=w#XGC%x`Fi>9@-6Z|m*juTugh=A z_2ou#W4W39fjnCNM2?il%M;}(@-+D?Ia;12&z0xPi{z#9a(R`!R$eD>kT=WQhPEgCPHE}Ab|E#@s&E!Hf)U94aHu2`)=>L}JJHYz+6A&Lk^ zl;WY{i2|vJS0pG>6=+4iqFm9aXj5PnT?)K{sGunN6)Xi`F`@XZSX8JKTE$Q066JE` zZ_2gGt;*fX6Uwv73(CvN>&jb7eWjt&R0%4bl>y2SWtcKj`B3>-`BaHiCMsVkbCng! zT4kNG0jX?NVw9cAZY4pNx)hCr)^;xA>{Zg+}Z&D+-s<*3msrRZ6s1K=6s4uE-s?F55)u7r|?WA^9 zd#JtCLF#+zICY{rMV+QbsWa6%>euQr^;F=rD>N%L>onUmdo(9C=QI~JS2Q;?x*7wGk;Y78t#Q%Z(cIO9BQ^Ilk2EowSWTQJ zNt3S0(UfTFG)5JH?%OVmDXG9r@f;M)`n^$v{BlJ+Q-_b+Bj{z7Sf`%nc5t!L_4ot)GD=_ zukf$dU;noKYX8;gYw6eeuMJy zaVUirTA(fU0;Pqv*#Gu+FI@Vk|M!y*$eXA0=FOYgvFB&-C#Ug(2J|Q9GYj3r(H9Hz zW36qec2p77nd(B7Q2nU>R5>+(8b}SJ#!};`Nfe>xQwykt)FMiv-laBCo2f0-R%#oy zo!UXYNA09`QTwR_)KTg~>LPWCx=dZ6u2R>i>(rOj9qIw~1N9sA2lWs20wKg8SLBA= zkq7cbUdS8yAb%8qf~_bN<)Z@B2sK7cP*YThnxW>X1!{>}q1LDfbwpiJPgIKfpnj-7 z8i*>;FfCdUVz`l%kgSlg*W2&@J_r7@5cx5aeM-w#2@1`_%{9m ze~ItlyZ9?B{u4&6y&mnCZdvVk()D3}GfSQ<$mDY-T>Qm|4Os zWmYq5n6=CXrkdHvY+^PujkYtpnBB}_<|F0`bBDRhe8qgte8>F4JYs%l{$&1Q{$^fj zkyfKMXpLG<%WDO#o7P?Hiz~H$+7N9+ZM-%?n<(w0XCQW8I=+gmEp=^m?Q|V<9d%uG z-E=*5rMfa*U)=!RKwX7ysIF2sQa4sNPB%$s)lJb&)y>q+(#_S)(=F0Tx}~~hx>dT> zx+>jz-6q{;-FDp$-EQ3;-G1Ex-C^Ak-7(#9-6`E^-8tQP-6h>+-F4j!-7Vd1-Cf;R zx(B*%bl>ZK(EVc7{i=JS`(5`;_gwcv_fk*kk)F|O_0D>o-l*sFX1$BvUGJgy(fjHH z^+EbDeYieKAFYqm$Lo{zDf$e3rao7nr*EupqHnHmp>Lyat8cIGpzosZsxQ&^)c4Vs z>C5#4^h5L&`Vsm{{TTgN{Y3pF{bc*U$u706@k$#DOseYw?m42PRO21LR zNxx0MUB64eTmQa(zy1ULVf{z?WBQNvr}Ss_=kyo#m-JugztrE+-_?Jm|5|@fe_#Kr z{x|(2{R{m|{VV-z{Tr5I5zDd$*2sFYUaU78&PK2e*+@2pO=Z*A#%vR|DO=38x3V4B zUTkl+4_n6eW&5%H*>ZLyJBl66j$y~LAni=EBB!_Hynvh&y#>`HbOyP93Y zu4UJ;JJ|Qwo$N052z!+Mko|}~#vW%+uqW9|>}B=}dzHP$UT1HxpRxDZ2kbZOx9oT9 zL-u?22lfy4Pxcx6oVEVN{>}cwzA)4?)HgU8oDB^Ot_C-QyTQZYY49?H8Nv+_h9pC> zA;pktNHe4xG7L=(g@$H^4u+0~PKM5gGDBZOKSO^*rD3FDlwq`Cieai@nqj(OkwG%N zYglZkGORajFjN~h8a5d=8}=FAH|#eYFq|}eY&c~&ZTQ4$IAb_#IA{3GaMSR);g;cB z!*_;Wqm0qU7^B4)Ys@re8MBSejV+8V zjh&5Mj9rcWjQx$}#sS8G#zDrx#v#UW#_`4p#+k-h#@WUt#-+w(#%kk6<0j)~<38j2 z#{EX?0pm&I$Hr5})5fdDYsTxw8^+I!H;tbgZyCQeerJ4W{NDJ~_=oXN4sjZe=8PQ2 z@tnY!I5X$MHQ)lcKrV>0aIst*m&IjsIb1H+l554a=DKp-xb9pzH-H<+4dTXdW4UqM zcy0nWk(xp%lZ++1!Rx5CP;t;BcA0AypiX4FW#H?;UoBld?cU3r}Alh zI^TqE$`|s@_zrwWz7yYvFXQ|2{rC}lB|nlM#ZTs~Q~0U;0)8RCh?n^H_&xky{s4cF zKf)j7kMk$^)BGp=dHz%WGJl1?!GFfz=D*;-;=ks<;lJg7;(z8J@z42}0wpklPS6X2 zU=rK~55Z3e5+a01Ax?-FQiV(*UuYyW7upIPg-${@p_kA{7$6K0Duq$PB&#r4m?F#& zW(xC!`GO=Y7gh)>g>}LvVY9GZ*e&c4_6moD4}`ro8A5)pB+|+S^X^5%9G{RJA8eHrY`oMJ9^pWY9>5S>D>741j=~L5n(+$&SrkhfGU6a5Z zbFMkhoNsP!Zeea|Zg1{j?r1JC_cWK9%gqDK1I>fXmC`Yti|@PU#pWgEHRiSEb>{cX zd(3;y2h0b}N6bgf$IU0qrzND%MFCR2e!3w^)QF7e20tMsT$Xg-;J)v%z5wxVqPyrJ zhKlXQr+|AchDhZGPd~1(pixo(iqWk~N0s+0t*jW{6$*+=d$lO-RW_)Ei<0@JHHOK_ z-J!fupK_qc9bQ(-X`Q;Y88otA`H;qAqI(Y=dYy8joGBeuOm(2bs;Ks&XBE{^^a3Tr znz>u3u2hfpR5z--=q(0{!FJ-FRBuXHPnA-=L?6+2J=KRQ6a7SgF+e)r%-_@|FlQu3 z$$zdBgBSc1HJf^ennTSMqr?_sCvliKT&{Xlpfo6WQXaLKT1|y*rj}4k zsb$o1Y6Z2DS|vt{F``9`730KsF<~>ch6;qAD)_sBsumN)B=|{&zXf755EUKr(4)S+ zw!5jllu$+O5mTzDePSy3D=O5zCv}keK=%D1F|CR^ET)Sg?F-7rl=ZQ5eMFt6!ZuOI zsN>WL>Lm3sbxO<-GsP@1Tg(x2WyBfyYx@C29{g2)LfR;Dr1hbxR_X@zITf}Z$Zi5U zU;gEojV`1^QN_sNz02&{?owaZ*mzHDBnH?K-%#JxSou(FEQZ(-KT5v|=VoR}=*jj8OwiVlnenp$95GoMy@NXV6Q-RQvlEh;8x4qZ_ zehZN@!^4oTloQ^-w`qCV@Y3PE`;RT*F(`c$6S^7Q2XD#cpDEv4>b9_7qFSUSe;t&kmG?l2M8rZ75y-p+ZnL%0cO(dzn}+ z4uD!DiGyrEZsK6E0)7kGH!4CxC8!Np*A}&d-d9vPynIMMv9H+w8k7~I_NYVWRz=Yx zl;VD1JoH%933V>vj5YmDVcG!2U2I)gffdqjsJk>T(yQJE)B}}JL*e%ft4&`o)J`1u zR!v{AUmK3PhRQ*0KQy3QtD<(LL;98FSBxA|DGpI&4MKyvv??kDXOAf=t6Yzu4?Dni z-l5`9g?u=I=HP3rwDWDyqDnLpOlcQY*ba?Blc}(+Xe=6s#-j;nBASG(NJK;&Ay$eb z#ZlsDaf~=t94C(73Vxl6rlINZ|4cLs{(T1=IzgN$TH*i4;uHAycL|1Gjvm&BTC|Oac#}ufo`L( z>a6M4=pMR{9*A?r1>!<+kr<-X;ybw(55;+P*WyR?6a2`v_yub53;Io*uj8D=nOp;r z;%Qd8=hjwwl`zwap4vL6-P_O5i#lz1iC%#XZ^U=SrC`G{)dr0QY|zl+;yP{6Xzey= z>Z3E7`Wk0(2^ioe8vp^?tZ(_CGRc^9z^XAg+MwYz4eGK%&2uDG7lgB8hOMSZG-BYn%Iq&@8yEp}eC z+gC!Vktv!+wXA8XX$jV73N_8pHcbn0leiiBz?N!FD@|)n8%LhNf+oG8}}Frwv0i6`G-%Vd744kGNOdXZJ{@tbe4qt8V>cYFcF+=pUz8+WnnN_Fe*_wAi^IUPicnCCqVAs4r*1S+WP`BoHYcwwb%}X@P#Dh@p zcd|Ry)2vi-rBhC+jriW6ddWz$fBK@iaK# z6T2bjWJAu2AJ=Wj#Tp0LU4KfPDMA#s=qr8e)?9B(E*i*GFl0-9d6i|Fo0>1{RDVZv z7u0_(o)td@^%v~wAIR#z5zp1F{$Y)JyZ_J2>LttaOzHS)M!NE(zSJsTTTk<|y)|Y? zLv!j4&^*@sS*I1xG|!@wCny}Lpl;PM~h#GcR}-4cFnP}<~Z@ox-}=- zHPgx9gJe2YyaPUPmm_l2|7s38!`>YIP?FR(CnSQ-r5l4WbRM0Lw$Y8m`{DygO5aq| zP3Wd{A>B;;R{UQ4Rea=-l;}3HL2bqF>NcpDZcn$DlM>w#4C+XC79Vm(=$wU?E>@UE z(%q;YRdjdphqo=!lP;^%guZk?Fri%hQTzo=_|5K*L9+V6;!ky}9}0PBoK5|3P(Pfm z6n_?H@<<*p8=@nUxMAd?IHn#wT5*IvZl@X~6Kw^yZbOUe>_;|titTrGV5O(i@U5kM zM$)syKkO#Wp?Ykf=hE}&`Qo4AU*e0mbz4L)cKiUOm(WYaXX0})K$(2Q*R51u;Nd~9 zqSw}q?E){W-MZcM5h`pOy@%dQ@1x(R z_tOXHgY+T#1NyM|h9HU{M39CcnjlONLy(rBdIZ(qMjxd=q(6fBb~=56K1qK}pP~W@ zaw5o?pk(-l7(`Gbf`$<^j-V|tO@v9BUqM;l(vgEI+msC-AzgPjOB;-xB%U)%^Np@W zCitvS@dahQM)s3G%%Q&W=e!N>S7!TGx0`*9zFzBdhrUVQ0x#2_6Qrx6Zxf`4=sV^f z(}ccDe=Q@vB8aV`?-67WLyB9LmJhK@`j-BI5;oA^(GThG2{IDI5yWqxe}sztOpqW~ zBoTaO;7hIa6FH22C&(mrw6p(7zk<&!`WgM4{)_&b{)c`+za+>^kPAT#2y!LJjUab| zJT}v>={K0dhkz6AMIV;9_j3dEq#pP&FSiJ(9*eBt5oaZ~q= znZI{MxAAewaj}tpu?flX6FZNOk4sL7^s`L-30Kk^DR{9Z{j2|Una6~9|tJY4&giub%+E|{rE>mV6uK3 zH^xoS8G@n-ijhaJ#?q4~IYwpaMp4xqw~(UeHDK1`mY@rMQ)cJ5HEtsfa*4#aEflYE ziIVcYJL_?KsCx%=26w`ZrJM#0pjHVWT#?ijcY|*hnEkKE-EE&Q@T;xA;}Qr3+>@Xr zv7_{nw;PB1;4<77MD+tv<#>Sf(7PG5ZLSDiD21Scn|Kf&4Co=a0uKd}es~0~#3NBZ zsjW{-D-aTt&p}^Hb!?8&c#P5<1mzHvW^W0_f{AiVOu|+yVnR?lK^X*r@3I_PLUF&% zv;UW$=k}Hzo&A41x>g17VyMChNSSAFB|&*|CG$mCmxAnvSIC|zhgz%O`gjdqTf&9P zi*F5Dl#Z1tgKZ}iZ9@c z_!7QMP#c2U64Z{MB7%wuYEMvy&G;(5hOgrr_%nPHL-y)OP$z;Qus}m^f(8>b*lf`&k`2 z|DX7oJ=z8kR9ZXQUdYk*62HQ)F^mhn2`T07x$})K84mG7eW-(?)!|O^!97u-duZTaw=I5YHkd4pQp)4hmY&%wgujSUHQJIW;|( zS->ok0|Ts`UB!U4u)HL_HidcGJ-LioA>)@5G`EUbNzgpNmzk5?t}BBRvrY-n1?u3` zOlq4|i26%sTm}a_gy%XnJQpa|?2tYF9zjds!)rqWe=DxdlNM+sW~wi3sfGyl)#!dIDd%y~KeFvHaJvw}25YwY<4JOKH}Uiquc&Hrqv&zW1$ zQeO}RPFW?l)M|+FIj#W?8HTyX+_z_#jRdW&m0_5NkYSkbnID)RnV$$+M^F_(>j~QM zzcS3fl8FM=BoPIKX$V2pa{6efY#gY~k+h-plt+gCum2t)=BHE)oJwvL2KjIIXH50V63Ra+Dsae_) z5MQ# zFl{(N?-O*ere|s+wK0wvMr+Z=611P717bk;4yD7(rAdMAUfLvWYAvcXEp!Tqqz|Bt z_5`}#d^{-KbeCO4qj6cF=azcG7m%c9ECceOnvFA{O7&4$=e1SQ9Ucz2XzJlVmqdB}y--i;z4dcp1R&A8KLH zzfaJ2&_7o;^R6et(ETmA?s&5%w%;GZ@5bhlJa|nDWB89^#~a!&U{U#q)S~%z5c5~_ zZq739cY>aROMA44@&}i`*6L7tJ*3si-T5B~Ci(vt^8b(^y(Rx0*n4($*Fs zQm2*;IeBfymNV+X%IPldyM1$8opgw*rDted7 zBhiQn6N);wY}dMVv8t!O6Yw|}`6>eR0K^qFQ~)CYeT#w=Kmb50@>c*C06r{=Rsc5u z{wRu408aoSiW@6{4*+9}V-&z2fIY=23J?Uq@5Lbs5DI{QdsS%!0PWj{Dwrq$rnQe# z01E)e+ebv%Di<$T&J`7u4INZ5R$k_ZdKI@TY}2?!Zj&N=)sle2y+eS)o(e#L9moKn zqJvtSYyg&bP-~M1z?BZF{zhWIMIBWun*t)HW27RiIRJAzx=9l{)>jHz*$Vt@O;^9I zY@Cm@prea)siR&oxL7VT*D|;OEOuy!j<)u)artzrr-oz?Ig4}iIgYTzUQns!k_wmt!1R2MZYrUI~|i`tMg0QlZc zHX8t!uE8yBtvXj$ZbB`}hYW;$y$KUq6qK}TUDBqo#?%EeL4&shg{=yUOWL(=UtHL# zhDHL3v%9JdwFH1;T|Had#4ne*&2PC|w<~DWuB35ciyGclGKH%HMR8N0Xi-ortk#0e z$Zl$#*8|YAo0sD4jQ~vRruu0M0DHTsk+dCv2X@R(0F2#L5AFdVvAf!k?*q`iyUKGA zfVp(9s`hEs`k^T01PQr zEBXw86{V`QzX7;XsygQ-0Jv9}V$K@?5_>7R(n$kAzg|kPIxzq&?v-aFbE*%(Jv*QS zpkZ%Cw37jV(%vc$55RmoUe?He~P>|_@mZkJ|uD{R%Iq^NUI zaif-YWTcGrmu0%-wJ&S|A#caT$e3Iyw||WEPMM2hSe#te6v`S(pO^V579>I%>|3DV zQ)GOmjmO%TSIW}mvgWq3Py6~RWm$4rp{*>qpSMz$`<8BEKb5XPE|c}eNT2ufQs|n< zW${qfP>SfUQ*3Ak755$PEph!^q@n#eg|MYem~CS|(%+<%wUNtGY-LX6dWE?Nn0?Bd zC_o1QhLql*Vh+HOH z7cc!VQ0Y@n!@&I412Yv9DrJIv8&ky~r2{#QmRrkv(O?(p>>xoQ8z+;c09lMH43bUS z<+f>RA0(Y7%DCn-PU<#TZ4~jX*j}Obh<*xH%`msGTF;v zl6k1=!atHm&rbik#-JM{aPiL#ml_zMNM0`D=ul&s(s5Ek5tRp#x}`` z!<0FK(`N8`$*`V^$Zaw~Q>kjazcg>SLHcKylK!3E10vtyc?!{PnW%|Mq~@G`K){nQ z$#10Fq7kaU4#;#Jfi6?(Jwoj$AIN2eP?jJaAK|8i?NQ*pKccH5{FqFTFEjB)O>+xc z!_gcCaT2J8jY$SJopighfx>#aMs1uzbyj9?rOMY!YeuSm`BW}%sg~=cf9&O#4sf)rW8EdtQhb)7_er1jx>3+YS9-^P&K-@g1rmC z{Si4*%Q4CX*XbS<3>(u)vGp5SUYldeYo+(TbMeP&B*% z;Ml}GDSLu4C_25i6*Q67PSDvzI3v4V*>3HN8WohZ$jxg6tI!G(%ShSV*;31iN((sG zt6`9~PE>llv$IWVJB5jr37P{_u(ZRF<5G4HAvg+<)*jva=FH;_}IAt z2yHz%42Yu?0q!zkBUP|6t~z@G5l<4Op`uQ56P18<_LT|cMh{*jx=HgVGm_L;2nY(ke&D8cbpF76_ux5PNB9WCI zOja7zIYH)=!x=1MrQ9jXWXd_&!TPOJJQV&kD7-KwSphNu&`(WOfE)l?O;s`Z0L+`J zOt+jH18`)jGVD7S0`Q|9XaRuhG?k|{03D~LDphPJ+mtBXn-(Y?o93cuXb%K;rzw*v z=T0&~u+(zU&k=D6~OpqaQv)!bO8N766x-#rIm&)al_Hsj$`~rJG z^#OMO8HtLlegKrrXsQ4M0N6dFxnkO2SwL$L;33z;)Z5p#(iyF0PTp~}??M6>@?&WSOWCq-IK6XR8vY0l|scJrshOGC`4z;QTv!w+jJ~}e{1Y|MJtDWDKk*(}V>CqhJi_du}46}3909gTo zqvk3@h4X3vI?lByj$a4Bg1KryZUErWT(5d?DA9SN^CrnK&#&GF=grPrU{A|1uQ6|5 ztaIM!3_Fv%Kx^5&RT4e_CkB3Zel0znzrsrBNrawG=vjnbKxm23O9;J!(5nf(j?fzj zy`9ke2z{8)CkTC-&=(2)8KLhI`a44ZNa)9eeoE+n2>ps+L@-0J6TvLOJb}GO>_u=8 z!C?e9BsiMjID!)iP9Zp(;5>pG5!{qmaT|h*2<|{|XM(#ETuN{m!Gj4NMqob)k0#hk z@MMCg5j>0FIRwuqSR!~O!D|U#Pw*y!w-UUA-~$AIK=26y+b{Sm!JiV?X2I79zDe*G z1b;>F{aUL?x;D1e9%O{oK*FG zSLw|bR;pTTa-yR>@^8nJ9}W6Dti9=G zs3b3>Vbw{}<&8$E>r&RyfH^9`s}imZDiJ01Tq#H&E)8|0S*X&yk<$b0*fxM2+ge(d z*a)Q7%i216ZKYDWd)Z*eQf2*Iidx>(TT$Ec4-}zMEBiWH^O4HLOZPVCNk6PKI3hn* zktX#7n6rzc!_TT%7rTrqZ~pTjXx) z?FI)ipW8?zadnZSH}0s6-f&V=-o9|J<-z+Z)>qDUBqd*JU9GE4@ld7km**JJ($eEK zddJ55S<$LrTkfd!vC0)(!i@mA9i;nfeH^*|RJe@mYK6x?O6kyblN@Q^D5bC0z2l%k zk5vs(ibK++FRJv8cqbJfQ^Jk5b+wM`y&dszbX49`q+?6C3AS$b+j_^YsyC_lc)MqM zZeSg((!=pr;Fl(D80#q2Tjfet7NBK+8XdU;6s{rF?H##7Rjzc|#}ELL+eXJ8sgG3g znQ|LGdD29>_ZN1EKYgr<&#vk9Uv6}ERFI?+1EEx}65b{F&D!43hgZ)U?wcQ+R~`l7W`nzN;qV`;Hcx@OC0 zM*};n8d}Q}Qt*)5i1H!Py?Z+<>7g)^tt}kI^;SynZk^%iu>PvJ_R_trlU(EeH4x|r zD@?lW%^htRt}?;ZfeBLE&13)7jrF5dd{-qWrb}r%YBjaWs0m%3mrQ?H&Jbrgv0y?-Fhj1oQ~0#ZJ8=`vMhTW=lg`c5;r$#VQgO=eFm0 z$j)_46Z#b@x?HlXv`8Ix#XIt@RgnXw%a1dqEj#tK5{SN9MGr3Frb8-d149WXJ>MPb zC}OKhQz6Cfnda#8oho8j2{#RxOQop2!H)QSDjv?E%lS**@R7#}qoeRcD$Pi+uel@Q zLlrUF)@@p^V{3=}NfkX-s@hT{eYwxyk@t*>94{H)pWukNpduzpYu+c8%laFzrKP{3 zzpB5czfNeFtcipsgq~cj|4e_A3e?{s^b|r*g)J?58fV`1~O z?pm`ASXYJVT|zH*G=AHfasMdBTVj*!#H|W0T=bL1JQTynLoW^$Hus#{H*_@oa)(<4QuyyWeul*c^Od zFy*bBQ%HGhVmg~6OM2^H-?t8CbJ;va)EYvswfm_1Ax}#o+v-2{w`SWYOjU$lZ)e(a z$j8!=?FLM2C$=-&h3!h{YC>-$^d>@Yu4cQlJ-{113B85TTV<~ilAoP2L-bv_P)$CAq7%+|?^ln1$ks0Mpa5)Zh4*OdsvT(hqnw`X2S&@af zeV@?#34MUj2dmjB>{P|fLxldoZsx+nODyx*cV(sp>_T=CD-rq#p^p;!LqdO4%`Rq_ zC``u)ef%xcc*l^IX5r`bWqhAB9+MvhtC7_H*_Ydz<}&&^HO3S*4+8 z-mYfvuy=v+YeGZ$monoW8{-5C9SgDi$o?iX{>1*w{=)uB;6N)4l=ldIznXo-J_g3$ z3H^Z3-^h&LDjJI?1)UH&yLTO*n3N1*ofMZMAC-xZO^WnOt_kax1_XlZOgILOfu;ft z451$q`g>XM4{)8e zaW{*%A>co?1sZ}B#wUdS-OhOYxQC^o!6IvmG(;Jq4KalNgV28x`Wd00R~uptaSGF4 zg#O#kB*)^k6KS-tirrrc=2&QEw3`~Pg23gAuLx8Ey;5Aejh62-Yg0%$KlbPx( z!MpeDm6m~!sS@H+Wuuy-^Kg3=?H@>gv6QNd_xOCIsu8;jb)O zJ}lkf;~?t{gY7s)U5ASea}D!=YXQLqf{ij0r*@_>^K7`n)rM7u)wX894TuwV1;I7pl6uP3vc>S8T#vfCi(#i>7g)51V0VH& zWQ#nZ8se!i%R$3YS=}MS2ZqCjBLsUB>_f0G!G6_-4-Fpy({Y0R36{@D<3M1N!=>o7 zzxBM~GBDQN6|NYr0wb&~1QQ%0GlnV|e!{y3wk z4ngrXlKwRO1CnZ|6E8KN7+x4&LS0`I97C{0u4^nfi8<5If{jl9rQhgm)G7Mo2~JS; zOFhqcSOlZ1tg5cuZgexcD@>pSZip+5zwL~V#m^WFOh$iWfHBYr3reX3rxBb^a7MK; z#2BhDWfGiaXOi1+#93EMoH1E8@$K09c4#%G7*iF-9D;N0jEB#9TXKwW472VwGB!3g zQJC@xF0eDzJLhX{Wi0wnreb4zg{d*YO;jeiG3KY2_DfKsCAB6-jNOc-a&5aCdl*ZM zJqa!(xEaCC32sqs>}Bjt1sY*}tR=y%Koo8*pAUiw*T!?JEfvN}V61ZhGmbQlQfz2T za67x(&M=eUMaZ+#tnN$Fg`QB08w?f<4fZ! zMbt=wN4*u*sL7D2?+)-#WW~MxfZ#AE=LwGCv|K%|KEY!M9!u~zg2z{L&K%?k4%Uk& z5Ij+?%Ou4K#ltgOK3SX5ZG3EO5=>BFni4m$)A*#+M29&z=gPrh%DQ_u=gs*jMv4Rz z)ktaRC0|Q0Ctsecvu0dFE>dBdLU7F|)v-&SmUu1&nCk43Tq>6aRmdQCI>9sKD$Il` zIA0F3#()%CdSZE3@`|4*h4Tt|gzF2VEcOxrJeT6%E3 zfvL_(3fG4#1M?v2V6z{CyVD!8E>thK*O@M40O5WKXS8^Kiq z(Y9;r8@OuFw29yi1Xs(NHiD)PuLfCmaC>A;b-H~o zw@>llW`f}&n&Ni;ny2M3ckDlzj&mmzrfmc+kEl%Du6d@N5&P}SzTQA%z0Wsr^h8TUQ+gJQu!f)A+{zyMNo5YCQ;h$F;4`Z6Qj5<$t-d^5yQsUN_+TDhBY`yve2(DrZ)-ee z-bWQZyV~Y2ah6znh50C6{ur;b!hAdrALBgOdV%1Jvdx!lBSk?I>EY*rmJB}kKW)h4 z^MSJw!B+^rDsx_g+NRzLvNY#y-vo7i@9}N#4o+qt(qEuHxuvWx2aWaCTt zo}dW^kIxCdC2P73nr__+v-IcX+xB$^1wVwZ04C_TUlM#rX1WVZmfOMB(fkCtPIXOs z_=)@^#k{WxzNeZ8k<|MM+vQ$*xABSb@$hXJ7oSiQO#C!{wroOOeUN{Lp93b$BNzrF z`BM|ar)HpZ<94|9U49)Eww+(hFX5N+%lPH|3VtQOieJsI;bGVAA;CWo{1d^y5d0g# zj|u*r;6Dg{MleL?Kil~#em%c|ujV)MoA}NA7Je(gjo(i2OTy5EVF*)?FiwPF31cLT zi7;luxDdwU?e-oEH~9G7%2FEsUg~i-$zhF+->)Kmls4B!999uOOOIsMLd@_)kfS^5r0dM zY9k(~h!;}Iy$mz|9S;kFRXlk9RTU4;e+|L1@Ed=B{uell&i_jA8?obOaE#(N zpYXqww^-;J03~quL3@GOCC$4XT9pgmJa`Ho)3hHmD0>-0Cvuu25<> z=x@Tf|Cd2!Lch1N`x6Gfww2lrl!e1p5U;v~KM+O`rdVxJ>c1OgZIn25K19J;um>~s*uPm2D+arakHH#?XBX~7rm%)%_;9ogL3gaPa3 z5GGi0MUMPPh_H|_A#h1Ucvrrp0bL+nSRyPHmcg-bxXageWO?s_Eh;Jowt;7aT8$js z3+^#P^}+}fN|r4cJPUsM-d+C+rmDi(O0%VIbJTp%%@%gPwuUzg@f}&)&fM1X!@F z65c0FY?W|;FmZ585KL}WI=D=Ef~wX#X~GfVBiXA*g%1gnK$yh!!ZG1EVUh@w4A!js zwnxYr0X|nY2xo=^KO#!bJ)QGYHcG-c<{cg1#Hv;s(57Bzz{^6h0Sj z5xB_66cDBWA*R!e7G6x`lX-{jQ2=8-D-()|V~a;AoMXjLRb zs>@A!lL_9M6YiJ{CZq6`i8l$hsVc?4I9>PE` zgnL48Ma*`gCjgo$w|8avsB-DyGmfw_uhMu}l)8m_)&{-7gf=wZc zA!X}L!SaP?uDGI4=~%zgO24GEgjByaExDg;{m&Euw+AT}UP=tMn;dN_kdOYjm|{#8 zQ>-b@6mLo}C7O~<$)*%jswvHs?rzF3Wty@~*`^#*t|^aSLYU5k=}MUHlJn0A8vKKF z_os$kO;AP%Go3Kdjph+%5n+IE1!2|@2I6`XVYU&tx5z+cAtDbF<}hJCBFss`d_tIW zgn<=vhy7NQvfoOWE^qHz`8sUPnUtMZ!gO=kw06X+d$3FohwV~_QQ4$y!V;#Zd`Ha9 zQM0-c%k+}ZXUaQ@+U2f}oa#m_)5r0Iiz9)$6U+3iV=L5TPf7jj*y%Re)6xLgCvECj z8+G@UftM-eV-{&r>vg;%Ufq3VhB)l7*V-pFsavoN1c&?x!oLqRnAAO3X1IDv#A|42 zW$)UjL`>>dEK@0ObvmlARwfh7DD@Obt({Jjy8X(G0e`e~bdEel z@E>PdOzNg9Gs)rDh@${?@0AhZbWaDssk0f7^KHn7CYTZ}Ak0EL|F5RUGXHNfzhonMVuHl=E@9w8wW8uL(+ip8Z<%DN zjpU{26=9YUX1R^T&zm-Dfx?Vsij^{jxt_T`VO9}FzD2wHPd{nxA5O9nYi&ruY$D7$ z!c?iqI|_1x4e4$6AqA=UrfK@-G=p&5)1x5@w$&qm{WW zP&hcs+|CRsazA0;T z1BF9Km}i(FWX=%gEZjcNnYGL|wgl!(J!|_#&AR5f<^}&^TWE%i3B&5AAo#^|59?C% z3R$&-`76!P#uo{5Nftc$xGGrv#g^X9RaB2{&gY$vI^S_V>-@fXvw4eot9hGwJE7f( z2DYIx2yG^s-w1PsFxLokgD^0N+=9X2?LjZI@?8WUQdjH9UuN~=h`DY*j!~lh+caVOp5nHrccAe(l=m6cMBeuz9W1Eld)fgM=;2SECQYtIQnxoAYbDTNBoMcWhH!&B&gVHU{t<7!CMewL}NApB@IC`)7 zrunIht4o$k6PKng&0Lzh6uY!{>FCnarOaix%R4S}UFN$ibdg*ZyDW8C?y}NlwaZ$U zDwho|M_oR$x*T^o>2k{D6PL3t=UpziTynYMa?Rz2%gqK%1NR1v8k9Gf*=#aOd0wce8r~ zcQFwb5&**FmojypDK%=ylBNgx4jn&%JJYed%@A>uawcyngcf z#p^e($6mjCz3_VNO?hj)L%qYj8+u21$9TtjCwNcse(Y1Po__{Pp(hCPa~gJK5c!9eA@er^O@i?$w%~=>@&^hns26WW8Wseg}xnpOMFXx zd;6C8_VXR;JKVR@ca-lK-*LWEe5d=)^quXy%Xg3OKHvSm2YnCwA-}$U6@EkghWlCl zX8O(co8vdnZ-L)(zm>x5sav-z~o{{Oi zm-#REU+KTae~3_=q6aTaR=lw7E-}C>;|C#@r08Ic6&;~RNhzf`a zhz*DjNDN2`m>MuQU{S!k0ZRgw1#Ar18L&HGZ@~Kj2Lg@-oCx?h;B>&5fO7%Y0<50} zd>(K+;B_Dss0qY@+CZnkPJyL?y#o6LP6+%l@LAxSAQVIgF+uf$xF8|O9MmAlEyyD% zFeoG_EGQzVbx_-&qM-Ic9fP_AZ4BBOv@2*&ut#u6a6xd};4Z=4f_nt_4DJ;?FnDlq zMewlT5y2yaCk2z>DZ$f%w*~JA-Wj~x8oW1ne+UY34l#!CA*K+QkbsbeAyFYQA+aIx zAsHcAAvqy=Aq63gLt2Nl3n>oi5HdbwVu&?_gj@-^9r8uUozTM24xuHXrJ=n;%R>8w z4hHCv;!v{xB-cDa<)cA2u>f3R@SpHEes>dtugH zVSB<3haC<3DC~IH$*@yl7sIZET?@Mr_IKEeuvcMk!cjO5ZysJ8-Z{K$c=zy<@Im1t z!$*gY4IdvqF?@RX%<$RabHe9^F9=^AzAAi8_`2}Z;b+3ng?}315fK;>6cG|3MXZb1 z8nHd%y@*{Adm;`;9F6!W;&{Z#h*J?4Bd$bTvqs#A_&ef7#H)xm4N*hfuyw;u4LdjN z+VE7v2Mr%J{Hx(V4PQ2V9Z5wxMd~8iNMj@)X^ISujE&5UY#dn_**vmk!@~7XQHk|U5&aP^&mPqnncfzekXcv^pfbM(aWRPM{kJU7`-=ofAqoV z!_h~hKZ-sReJT1%^tI?4(Kn;NiT)w_r|4gzpF}^6{xkY{jB|`B#xEu~CNw5ICOXCv z6Bm;ZlNZxGrc+G!n39;%n7%RnV+O?JKnEf$_VvfXo6mufx zRLq%}J279!Jc#)&=KGi*V}6Nw6!Uw`pE1v4{y{gqo0e}Z4=q1hez82VJc)IW4T%kpjf{bAz6K9Tdjq`}}j`NEPhzpJj zi;IBg>hj}y#0`&|7q=tsP~45U`*A#8=0E5Pu>5%lO|CoDA{IFB0x1JWTi@;pc=u5}qgglSn19iCm&7(Iv4*V!y&Z8h zZzq45{B82XW8VvQ_rNHPrZWmE;J2G}#TZN`YdCXkY&#D&kC_- zg=Ix##bm{0C1xdOX_9nt4CJPtg@{BSp%~MXIZmmW-ZQIk+nK&UDn2|Em_;M z-pe|Ybv)~0*0rq9vTkMF&AONMP1bi=kFs87)7jc=r)+(;DZ4?oTefGmcXmj2cy?rV zbar}nv+S1HZL*89J7jmx?v`DWJtTWrc4fA8boRLHiP>WIley)XMf z_6OM~vrlKA%|4%fG5d1%t?c{RKj%<6bdEO1DMy#X<}}Fh%<;+b&k4-29xf^mf zIeUqoj!+Ct3UtVBdNM3keWL`{O zTwY>cL0*%*W_d01+T<1Gb;#?S*EO$y-mtvNywQ2%@+Rg@&zqGuCvRTf!aON&Ro>RT z_w&x>UC6tfcP;O;ywCIQ<^7oVOWvcr-}C;=d!A3_Tj_jlzA<0Ocggq3_s0RvVtK6BML?p zj4c>nFtgx)YC7w;rWb&Vqh7mPuU9X2$F(~dF{b-|>246DQAAOgl=OF_rIBs~#zrn+ zV=UQpMQy-98O;j4)_b4#ecoTrd7kq(oO3>jC>^v;l1{o#rcRDdo=&w+lTN1&O^2?- z)ZyxU(h=&2b;fjNV5?zUVB29kVY^{RV7Fj*VGm%sFasC@hJ+cxOkoxsOzcwR<}SGuS?PG)%~c866lI` z2XrO6a@}d&IbDUWTKB8&zj_z-Z1tk`iu69{HR|E?TJ+lW2zpFCwjNjSll}qyv-(%{ zZ|L9Fzo)OG|4<*$H`X`Rx6rrJch>jUf2|*@pP-M{Pu5S<&(JT{FV(NmuQt#!SZ}b) zV2{B*gZ&1F42~L{H@IYQ)!>G~ZIr=1g9ipr4e|`w20!4Z;QDY=xCPuAZU=XSJHvzE zZ{Shz7pKo(La=KjIl82oa2kM#Lf#5NJdaA{CK=$V9Xt1c)CG4?NU==>72d z!=Q&RABH25$p0=|kQPX5q#e=`>4JQWe1h~w`XQeppCex)Un5b-aAXuR1{sfpkV(i? zWCk(|nTsqy7NL-($O>dNvJTmRY(h38+mHk#8A(CXkPIXn$whub3Xy%tL8KHpiX2By zAg7SC$OWVdxrqE1`4i9rmH{h()xbJnBd`V74(tN<0Q-Rbz#-r$Z~{0DoC7WZmw{`* zP2di2AAkY+fFbY*0D=FerGOP+3pfBMXTS~c0K5QSAOHviUI4FvP#_G51fqdBAQ8X- zDL^`q3FH9zKp{{9lmk^jEl>|&0X)zObO0ov3+M*u01M~^J^}(j3=9AgU<4Qgz5tWJ z3@{HU0S)jC_yPO|mx9Z|Rp4511GpL72JQs^1owj4DDWV71UwF&0?&fy!Asy(@CJAr zya(!ldLSHp2m+unXa-t>HlRJ|1iFImpeN`9`h(BFATSsV0pEZT;9D>jOaRefGMEOw z1GB+A@I6=zmVuRE4fp|U1aV*s*bWlGPLK-rfJ~4B@<2W)0{g)s5H$?Sz|Wu@oCfDW z1*itUg5SYkMp{Ozjn*2SHo9zd)d(=MG_p1dGzv9(V^nHXXH;+0Ya}-6H_{mWHeO=9 z*Z7F>F=N2k(%9PgwQ-bjv~h`Xt?>ur0pl^_&nBBpcAM-mu`_vW;$f0zl4nw2A~2Dd z4F7j9z0P!l>1ES9DARkUuBJYwex~`R<))RUJkx&DK~s(CZ?h$4+GfYiPMX2ZjLl5V zo|?Tj3pJ}SYcRu_iOojLWacZ(H=1uYzi$4(9A@rh?rH9A9%r6no@S0SCz_MZ#pWaC zGV|XSt1Q-7oVU1Pam&Kh!pFkTBEcffBEy1UL9?J+j9JWBpyn*sTkf#jWqH~1j^#Z| z2TKo2Ps>=#WXn{`CQE`P$+F*4W;t%P-fD-{F01QS53FETzE&@+f~_j78mzEZLMy4& zi1jk-b=DiK4_TkKK5MOS4O$ypzqXFDj<(LXF1N0ZlkbK*>1AkZM(JLyd#bLFzE# zxXy9A<4(sbj&~jJJ9;?=ItDrBJC-|EI`%q>9s8ZMoK`!nbvo^I+3BiNkkcEda3``8 z!-?gjar*7N#QC7}Dd#iJfU~8uwexdllyjJKwsWy_sWaPI=qz^r=Cah~50_Iemt3y6 zSh+a=$E=A#xg`BZ3&FZ{xDZ`rF4HcvuIF8ExZZM&aZPefapk)Xxk}ysc01;F!tI4y zm|KKfubbGd|M9WM|2)3%IP`J!^PqWfJw86!^knywJx^?(xIJ-yQt$*-@ucdB?8)?#Sm4DrN!k~}-TR(Wmq+UjNEW$R_{mE~3BRpO=e`r-AHZ)6`2qU^js_eLcoPsC5FaoeFdH!c^yX98 zQ@yA8Ps^WHKAnI1?dkVtz%$Ed*3TNAwLR+y+z_}kaCe|bU_jurKu(}2uJ{n}N(!ZiGErMmf1&oF0#Tu; zHz+A;0yX)@;EmB66V#ikH`q70us_2Nh8+%z3`-0{hmC|yhE0dx3D*yYhi8WuhnI%` zj93w|D&l4YEJ80LB;svEOhkJGHG&o~5wQ@VjNBf%FH$@5exzaK!^p76xX6Ua&PZk? zJ8F5}}lJgtxr6{ci`O z4@IAjJ{uht9T%Mt{V94dS`u?C=AW1gF`+ThF|jecnEsf-*rT!MV$a8h$HvDd#`eXI z#*W3^iPMjR#}&j?#8t)pieDMOI^HtgDc&U>7f*~QCu~XBldw18c7k4lLBit%zl4B< z{Dks^%7pHO-UMF46e>ZLxGix{;*CTw(Js+G(IL?((HGhPZHBf%JE1?Jy^uC^5IO=K zhfYCfq4Urs=qhvrx((ffbRazl4n2eb$QUw%EFl}n9&&7n26Pj;8Qq2^pvh?Zzv!PBEzB~^3KV8FW*ufDW(#IJW*24; zW*=rh<`Cv6<^<+6<{ah%<}&6Q<|gJ2<~|07(Z?8K9$`R?3C0{_g|WprV4N{-7!QmW z#upQS3ByuyTH!Y~mS3?>m?T@e@I3(BsV2Dr(8~XkOE85Pccl%PAN~ROsPrvka{ZhTI!9|+o|_b38~Cfb}BdZ zQyMbOCe1F*G0i3ILs~}~F|9L=n!YK0Z~EWq2htCxKTnTHk4le8k55--Xk{$TSe~&e z1DRoyVVB{U;gV6GLC7FwbY*nEJNxeDyW8*Xz0-MzM!m~S&wP^Uo#~e;&K%GDk~x_!QufB|zq0pb@6SGz z?Ux;rjmi$sj>_g`OR|TvW!ax|&gR_Axt((_M<*vSCo3l>CqJh!XCdcTu2$}{+!eXT zxemEbxvse=_uST8S}r}8mD`)QH}6E=sl2m!=kqf1it|eID)OrH59FWC|0n-q{+0a5 z{G|Mp{Pg_Hf~^JG1qTWa7aS|7D`+nu6p#xj@7KTo^Zj4%|9*eqea`!e_f_v}-`5wO zE4)>Br|^CutT3anxUjUaqOiJXf6TD-j2 zxY(iCso1sHy|}5kvzSs$D`u2zFF8Xf^i63**^;siWt+;jmhC8WEej}nRu)tiTt+G5m3=A`mi3h*$}P*S%k9b?%PY!p z<;~@7<%EhA6{xKh+bece?5W7BsH&)`_)yVUdAagIC9G1v(y%hQGQaYDWpQO$)sdQPRi##CRIjbxRsCo6-fHb?uj-f8uc||7n`h`Jerc4vYN`9nwkhr*EG;1X&P>lHz}Ha z<5uC;;x^zm4hya678H^p1vt?{;a2fP#B6aNAqg@^D-_*8rbJ_}!jFU6xO@KyL) z{0BS}uV~h4KGytC^X+E6W|L;yW`}0yX18XK=78qF<`>Pu%^}UG=B#FNb8quvi&o2; zmaQ$?Eyr6f6 zKU!C|u4!G@y0LY0>#0`bR>#&@RBLi;PHRPLLu*rOb8A~Gp_SIkXl1wdwtj5ow+^*_ zZk=oW(YCy8RomLO4Q-p-{%qUZrrma+?Qq-Cw)<@!Z9#4MZRKs)HbNV-jo&6}>u(!s z8*Y=gO}EXpEwriHH0_()ueR&9`?LqON4BHebJ|PV%iF8kYuoGFTiZL@QKa_Hc4|AV zeY9hB$IgyB9r_(+9gZD79YGzz9U&cWIwCp}I?x@-9jP4|9hn{2j)4w2VKd=R!V$tb z!YzU>!GM4uAPGhUYl0oYk>E^lBe)a%3BiO20)~)D$RXqt3JE2IT0%VmOTZCY2yFx* z;U{q|@dEKCQI}|pBH9q`iB3dUqC3%__>34td`Wyw3?)VrF~nSADY1fBO{^m}5Zj0Z zBAM7l>?ZaQWu!HvU8K7t1ClYxf#gB*BKeX6NP(nKQWz%AED29) zC3TQUBsz&j>Lu|=e3FnPCCNz&(r@xA@>()#19>xf8+k8Tn|zRbn0$ymF zCfkth$xdWfvOC$I{EQq#eo1~!4kbsEQ^^J78ZwUDLT)D$$(>{-nM3B0KaquGF?obM zMOJk#>0HyfzH?LO*3KQBe|H|}JluJ-^F-&V&P$#5I}x3holc#uo$j5Uoj#pGsLtTd zkWN%*cxPm1erI+ zcD?RGb%l3Db;Wcgb)|M?bY*tsbmeumbPadSQg%@OrW~W3r`)0FQw%AOC?LgzVoPzL zI8$6H?vy8#r<4#%G$oaiODUkBiYTR&3Q7Z|iPB7IrF2k;lpe}Qij*=znWD^67APvp zPpTGm8Fe{z6?F}DEA=nxaq4;MCF)h`4eD*G9u-b~NJUbOs3uffswXvw8c9v0VyG$9 zbZREGkXk}5r&dyHsCCq4Dw)cmim3h6A?h$yMxCb4Q594bin>Vs*1fcQWA|U(hr5q; zpX@%<{ZIGx?pxh=yYF|yy7ju9x?{UDx{2LA-Mnr|_m}R;?wRiSZe{n6?%%Yfv_EJo zX{%{lX!~d@-BJ=h+6Pis$m53z^b!{{08k@qNi)IDE&zW4m1ucWV`ucvRMZ=r9a@1>uhU!mWn zKcMT<4d@8EDcyo@O}C{x(4FX>^gwzzJsw4e=t=ZcdIr6KUPLdYm(#20HFO-ki_WI^ z(`EF}bUA&RK1csb|4#qK&|)lOEN5(B>|*R^oMBvHTxZ;3++{pqAQ(u75yOOG&ah-S zF?<=pjA#aik-|u4WHNFXC5&=L6{CjnfziNVGgQo_%oEHD%sWgt)0~NNU^+A1m>x_o zW+3wg^A$6M`Gy(JjAy=M7BcIY&CE6?fk|dkm~1AO`H3lDikbaP8FPmDFKZcV1#2~H z9cv?N7i$k|A4{8ckad`KhIN$%V?APlEEASF%Zla9a$|Y0JXt<0KUO@efkk3XuohUq z*eluF*n8R9DE2}25%zKRdG;mtRrYoEE%qI@KHH4#%=TjYvIE$G>=*1Xb|gER9m`H& zL+lLpdv+}w&u(RRuu1GLHjCZM{>bLDMeIKID0`Z%<}Br`J1oN;wsrYEB)enbXE0 za7dgk4wb{<^mAmKdCoV^56tFo$1x|{^qXYZs+df?&luj9_60kUf^ElUgO?Cac^_) zat*j9Tu1H`t~b|@`;_~fi{gfJqqx!BIBo(rjhoLc=QeQ(Tr!u!rEwYDPh26lk2}DX zaEG~au9Bz4Tg_X?+sNC(+s@m^+s`}1JHk88JITAqyUjD?nei-nHavTt6VH|B$9u|q z&U?Xo#S7)V;l=Svc&J8R|Hq{t*M408=?8x~e+z#P{}}%t{zd*3{&oH>zAoQ@kKjMz zgM4GY4d0Fbl>eHK;)nC2_%Zw>ekwnMpUKbR=kZ(k!~9vn4#D4o(}Jr4nBb8B6qpFi z1y%xQft$cX;3@DC_z7MLA_R$oEJ2Z=R8S$P7SsuvQGzxBK|m6838(^&Kr9#+%nB9+ zD#4=QU*R(03gK$uTHyxaCgE=30pVHURpAZcZQ(tkj_{!n5E=_jg%(09p|j9W7%Yqy zVuUHebYZ42M_3{(7gh;tgdc?3|9P8O%3#P7t};ym$tak02eTq&**e-Jl{8Dh4WEB+)Fiu=TaVySpk zJT9IPPl;#5|B8QzfA=lzyV9rAr`u=Hhv*CIgZeOiDShdE%sz2nf8S8waR2uH1O12k zkM^JFx9|7r_v!cVf7V~okLz#lZ|f)YD+ja&mJTc*ST%5K00kdF3?K)L2BHU22hs;J z2XY2@1CoK^0olOk!99b=22T#28T@DP;^5^$qe1IIyFtf6=fM|)@q=lD?*_95vj_7A z-w)Ofb`A;#MT7l=vcb7Q)sWWE>Y)Qe$A|6@Sq!-jxes{``3(6D1q?w$*+Y3l?}v(q zN{7maC_}szq+WuR;3X{*j)W)qB;iX$l77h-$)sda z@~`BlR7<*4`iFG0benXi^iSzu(tXmC(lgS3q^OJ1E7EIHQ>mTQQR*UflfIIMO5aGs zq><8SX{t0sS}ZM-R!VE6AEXV^HYq_$mUcho^_E||qen+ijGi7nJ8C#;GHO0*HEJ{JJ?c9e zFd8`eVzg_NHQF~iI4T_-9UUM2GO8Z^E?XsAFWV&BD%&O7Bikp_mR*z~Wd5?}vItq6 zEK!D$rO2{mxv~OTp{!UYk}1a4j-j@V?H$t|J2-Y^?D*Kpv8!Wu#_o^7#`MRKV@6}9 zV-{mpV-aKZV?$$~$0o*R$G(p*9bZ1aYJBbZmhtW5yTLXnY=i8W%Amj?xg;t;pC&q!pXYH z`bq30e(H~@%~M;ac1-P_a+va-@|_Bp3Y?-$@uoga38(s|?@uGA!D*9e^Xc;GrfK|i z>vYG=>X{ugyJq&x?3?kP37&a9gPIASq0b0s#4`gklG&59S7)!!-kQBT3!!GSXLDx@ zW{YO0XTQyUpZztrWDY)OK4&>+GiN_nF^8LLo@<*U%&(o_HUH=Q-g)hLulbkrujWJN z!{%A@ee(nJlKGK^(+k%ZZZ6zexW9l|$X&=^C|oF6P%D-yRw~vg)+@Fswkvii{#0ly zjw;S6t|@dChKffDP+_L9RG@4Wb_y4Tx8k`XLJ^~gS3rssMYIs8lp6ND8W= zN5NEZ6`vGBg;*g`d{N9RekzwLmn&B(*DE(Ew<@0QPPwQB}@5HIiMURnJwgRH3Rc zRfH-*m8L3Gm8mLKHL3zyHd33aE!4JZ2eq@>Rqdk=Qb(#|)d^~}I#r#a&Qj;73)NL> zteULuR@2oiHBZe~i`0E;sd_@ap#G&LQtA;O_U}^6Q@bhFcBwHB8xu2@{XxNdRd;^xJDi`t6^7mq9kETR^}79$s<7kP`4#osetText(opName, NotificationType::dontSendNotification); - - parent->opCtrl[op].egLevel[0]->bind(s_egl1); - parent->opCtrl[op].egLevel[1]->bind(s_egl2); - parent->opCtrl[op].egLevel[2]->bind(s_egl3); - parent->opCtrl[op].egLevel[3]->bind(s_egl4); - parent->opCtrl[op].egRate[0]->bind(s_egv1); - parent->opCtrl[op].egRate[1]->bind(s_egv2); - parent->opCtrl[op].egRate[2]->bind(s_egv3); - parent->opCtrl[op].egRate[3]->bind(s_egv4); - parent->opCtrl[op].level->bind(opLevel); - parent->opCtrl[op].opMode->bind(opMode); - parent->opCtrl[op].fine->bind(opFine); - parent->opCtrl[op].coarse->bind(opCoarse); - parent->opCtrl[op].detune->bind(detune); - parent->opCtrl[op].sclBrkPt->bind(sclLvlBrkPt); - parent->opCtrl[op].sclLeftCurve->bind(kbdLeftCurve); - parent->opCtrl[op].sclRightCurve->bind(kbdRightCurve); - parent->opCtrl[op].sclLeftDepth->bind(sclLeftLevel); - parent->opCtrl[op].sclRightDepth->bind(sclRightLevel); + opId->setText(opName, NotificationType::dontSendNotification); + + parent->opCtrl[op].egLevel[0]->bind(s_egl1); + parent->opCtrl[op].egLevel[1]->bind(s_egl2); + parent->opCtrl[op].egLevel[2]->bind(s_egl3); + parent->opCtrl[op].egLevel[3]->bind(s_egl4); + parent->opCtrl[op].egRate[0]->bind(s_egv1); + parent->opCtrl[op].egRate[1]->bind(s_egv2); + parent->opCtrl[op].egRate[2]->bind(s_egv3); + parent->opCtrl[op].egRate[3]->bind(s_egv4); + parent->opCtrl[op].level->bind(opLevel); + parent->opCtrl[op].opMode->bind(opMode); + parent->opCtrl[op].fine->bind(opFine); + parent->opCtrl[op].coarse->bind(opCoarse); + parent->opCtrl[op].detune->bind(detune); + parent->opCtrl[op].sclBrkPt->bind(sclLvlBrkPt); + parent->opCtrl[op].sclLeftCurve->bind(kbdLeftCurve); + parent->opCtrl[op].sclRightCurve->bind(kbdRightCurve); + parent->opCtrl[op].sclLeftDepth->bind(sclLeftLevel); + parent->opCtrl[op].sclRightDepth->bind(sclRightLevel); parent->opCtrl[op].sclRate->bind(sclRateScaling); } @@ -481,32 +481,32 @@ void OperatorEditor::updateGain(float v) { void OperatorEditor::updateDisplay() { float freq = opCoarse->getValue(); float fine = opFine->getValue(); - String txtFreq; - - if (opMode->getSelectedItemIndex() == 0) { - if ( freq == 0 ) - freq = 0.5; - txtFreq << "f = " << (freq + ((freq*2) * (fine/100))); - } else { - freq = pow(10,((int)freq)&3); - freq = freq + ((freq*10) * (fine/100)); - txtFreq << freq << " Hz"; - } - - int det = detune->getValue() - 7; - if ( det != 0 ) { - if ( det > 0 ) - txtFreq << " +" << det; - else - txtFreq << " " << det; - } - khzDisplay->setText(txtFreq, NotificationType::dontSendNotification); - - envDisplay->repaint(); + String txtFreq; + + if (opMode->getSelectedItemIndex() == 0) { + if ( freq == 0 ) + freq = 0.5; + txtFreq << "f = " << (freq + ((freq*2) * (fine/100))); + } else { + freq = pow(10,((int)freq)&3); + freq = freq + ((freq*10) * (fine/100)); + txtFreq << freq << " Hz"; + } + + int det = detune->getValue() - 7; + if ( det != 0 ) { + if ( det > 0 ) + txtFreq << " +" << det; + else + txtFreq << " " << det; + } + khzDisplay->setText(txtFreq, NotificationType::dontSendNotification); + + envDisplay->repaint(); } void OperatorEditor::updateEnv() { - //envDisplay->update(s_) + //envDisplay->update(s_) } //[/MiscUserCode] diff --git a/Source/PluginEditor.cpp b/Source/PluginEditor.cpp index 5c3c841..37370f8 100755 --- a/Source/PluginEditor.cpp +++ b/Source/PluginEditor.cpp @@ -31,19 +31,20 @@ DexedAudioProcessorEditor::DexedAudioProcessorEditor (DexedAudioProcessor* owner : AudioProcessorEditor (ownerFilter), midiKeyboard (ownerFilter->keyboardState, MidiKeyboardComponent::horizontalKeyboard) { + LookAndFeel::setDefaultLookAndFeel(&dx_lnf); // This is where our plugin's editor size is set. setSize (865, 420); processor = ownerFilter; - + + cachedImage_background_png = ImageCache::getFromMemory (BinaryData::background_png, BinaryData::background_pngSize); + addAndMakeVisible (loadButton = new TextButton("LOAD")); loadButton->setButtonText ("LOAD"); loadButton->addListener (this); - loadButton->setBounds (5, 5, 50, 18); - - cachedImage_background_png = ImageCache::getFromMemory (BinaryData::background_png, BinaryData::background_pngSize); + loadButton->setBounds(5, 5, 50, 18); addAndMakeVisible( saveButton = new TextButton("SAVE")); saveButton->setButtonText ("SAVE"); @@ -66,12 +67,7 @@ DexedAudioProcessorEditor::DexedAudioProcessorEditor (DexedAudioProcessor* owner presets.setTextWhenNothingSelected (String::empty); presets.setBounds(115, 5, 180, 18); - for(int i=0;igetNumPrograms();i++) { - String id; - id << (i+1) << ". " << processor->getProgramName(i); - presets.addItem(id, i+1); - } - presets.setSelectedId(processor->getCurrentProgram()+1, NotificationType::dontSendNotification); + rebuildPresetCombobox(); presets.addListener(this); // OPERATORS @@ -130,7 +126,7 @@ void DexedAudioProcessorEditor::paint (Graphics& g) { void DexedAudioProcessorEditor::buttonClicked(Button *buttonThatWasClicked) { if (buttonThatWasClicked == loadButton) { - FileChooser fc ("Import original DX sysex...", File::nonexistent, "*.syx;*.SYX", 1); + FileChooser fc ("Import original DX sysex...", File::nonexistent, "*.syx;*.SYX;*.*", 1); if ( fc.browseForFileToOpen()) { String f = fc.getResults().getReference(0).getFullPathName(); @@ -143,14 +139,10 @@ void DexedAudioProcessorEditor::buttonClicked(Button *buttonThatWasClicked) { return; } fp_in.read((char *)syx_data, 4104); + fp_in.close(); processor->importSysex((char *) &syx_data); - presets.clear(NotificationType::dontSendNotification); - for(int i=0;igetNumPrograms();i++) { - String id; - id << (i+1) << ". " << processor->getProgramName(i); - presets.addItem(id, i+1); - } + rebuildPresetCombobox(); presets.setSelectedId(processor->getCurrentProgram()+1, NotificationType::dontSendNotification); processor->setCurrentProgram(0); @@ -160,9 +152,62 @@ void DexedAudioProcessorEditor::buttonClicked(Button *buttonThatWasClicked) { return; } + if (buttonThatWasClicked == saveButton) { + FileChooser fc ("Export DX sysex...", File::nonexistent, "*.syx", 1); + if ( fc.browseForFileToSave(true) ) { + String f = fc.getResults().getReference(0).getFullPathName(); + uint8_t syx_data[4104]; + + processor->exportSysex((char *) syx_data); + + ofstream fp_out(f.toRawUTF8(), ios::binary); + fp_out.write((char *)syx_data, 4104); + fp_out.close(); + + if (fp_out.fail()) { + AlertWindow::showMessageBoxAsync (AlertWindow::WarningIcon, + "Error", + "Unable to write: " + f); + return; + } + } + return; + } + + if (buttonThatWasClicked == storeButton) { + AlertWindow dialog(String("Store Program Destination"), "", AlertWindow::NoIcon, this); + dialog.addTextEditor(String("Name"), processor->getProgramName(processor->getCurrentProgram()), String("Name"), false); + + StringArray programs; + + for(int i=0;i<32;i++) { + programs.add(presets.getItemText(i)); + } + + dialog.addComboBox(String("Dest"), programs); + dialog.addButton("OK", 0, KeyPress(KeyPress::returnKey)); + dialog.addButton("Cancel", 1, KeyPress(KeyPress::escapeKey)); + if ( dialog.runModalLoop() == 0 ) { + TextEditor *name = dialog.getTextEditor(String("Name")); + ComboBox *dest = dialog.getComboBoxComponent(String("Dest")); + + int programNum = dest->getSelectedItemIndex(); + const char *programName = name->getText().toRawUTF8(); + + processor->packProgram(programNum, programName); + + rebuildPresetCombobox(); + + processor->setCurrentProgram(programNum); + processor->updateHostDisplay(); + } + return; + } + if (buttonThatWasClicked == aboutButton) { - AlertWindow::showMessageBoxAsync(AlertWindow::NoIcon, "DEXED - DX Emulator", "(c) 2013 Pascal Gauthier\nUnder the GPL v2" - "\nBased on Music Synthesizer for Android\n"); + AlertWindow::showMessageBoxAsync(AlertWindow::NoIcon, "DEXED - DX Emulator 0.3", "https://github.com/asb2m10/dexed\n" + "(c) 2013 Pascal Gauthier\nUnder the GPL v2\n\n" + "Based on Music Synthesizer for Android\nhttps://code.google.com/p/music-synthesizer-for-android"); return; } @@ -206,3 +251,14 @@ void DexedAudioProcessorEditor::updateUI() { global.repaint(); } + +void DexedAudioProcessorEditor::rebuildPresetCombobox() { + presets.clear(NotificationType::dontSendNotification); + for(int i=0;igetNumPrograms();i++) { + String id; + id << (i+1) << ". " << processor->getProgramName(i); + presets.addItem(id, i+1); + } + presets.setSelectedId(processor->getCurrentProgram()+1, NotificationType::dontSendNotification); +} + diff --git a/Source/PluginEditor.h b/Source/PluginEditor.h index 4ff801f..0e79462 100755 --- a/Source/PluginEditor.h +++ b/Source/PluginEditor.h @@ -60,6 +60,8 @@ public: GlobalEditor global; void updateUI(); + void rebuildPresetCombobox(); + Image cachedImage_background_png; }; diff --git a/Source/PluginFx.cpp b/Source/PluginFx.cpp index ee52e8a..9403a3d 100644 --- a/Source/PluginFx.cpp +++ b/Source/PluginFx.cpp @@ -10,7 +10,7 @@ ============================================================================== */ -#define _USE_MATH_DEFINES +#define _USE_MATH_DEFINES #include #include "PluginFx.h" #include "PluginProcessor.h" @@ -36,22 +36,22 @@ static float gaintable[199] = { static inline float saturate(float input) { //clamp without branching #define _limit 0.95 - float x1 = fabsf( input + _limit ); - float x2 = fabsf( input - _limit ); - return 0.5 * (x1 - x2); + float x1 = fabsf( input + _limit ); + float x2 = fabsf( input - _limit ); + return 0.5 * (x1 - x2); } static inline float crossfade(float amount, float a, float b) { - return (1-amount) * a + amount * b; + return (1-amount) * a + amount * b; } void PluginFx::init(int sampleRate) { uiCutoff = 1; uiReso = 0; srate = sampleRate; - output = 0; - for(int i=0;i<4;i++) - state[i] = 0; + output = 0; + for(int i=0;i<4;i++) + state[i] = 0; } void PluginFx::process(float *work, int sampleSize) { @@ -60,36 +60,36 @@ void PluginFx::process(float *work, int sampleSize) { if ( uiCutoff == 1 ) return; - // the UI values haved changed - if ( uiCutoff != pCutoff || uiReso != pReso) { - // calc cutoff + // the UI values haved changed + if ( uiCutoff != pCutoff || uiReso != pReso) { + // calc cutoff // mel scale freq : http://www.speech.kth.se/~giampi/auditoryscales/ - float freqCutoff = 700 * (pow(M_E,(uiCutoff*4000/1127)-1)) + 20; - float fc = 2 * freqCutoff / srate; - float x2 = fc*fc; - float x3 = fc*x2; - p = -0.69346 * x3 - 0.59515 * x2 + 3.2937 * fc - 1.0072; //cubic fit + float freqCutoff = 700 * (pow(M_E,(uiCutoff*4000/1127)-1)) + 20; + float fc = 2 * freqCutoff / srate; + float x2 = fc*fc; + float x3 = fc*x2; + p = -0.69346 * x3 - 0.59515 * x2 + 3.2937 * fc - 1.0072; //cubic fit - // calc reso - float ix = p * 99; - int ixint = floor( ix ); - float ixfrac = ix - ixint; - Q = uiReso * crossfade( ixfrac, gaintable[ ixint + 99 ], gaintable[ ixint + 100 ] ); + // calc reso + float ix = p * 99; + int ixint = floor( ix ); + float ixfrac = ix - ixint; + Q = uiReso * crossfade( ixfrac, gaintable[ ixint + 99 ], gaintable[ ixint + 100 ] ); - pCutoff = uiCutoff; - pReso = uiReso; - } + pCutoff = uiCutoff; + pReso = uiReso; + } - for (int i=0; i < sampleSize; i++ ) { - output = 0.10 * ( work[i] - output ); //negative feedback - for(int pole=0; pole < 4; pole++) { - float temp = state[pole]; - output = saturate( output + p * (output - temp)); - state[pole] = output; - output = saturate( output + temp ); - } - work[i] = output; - output *= Q; //scale the feedback - } + for (int i=0; i < sampleSize; i++ ) { + output = 0.10 * ( work[i] - output ); //negative feedback + for(int pole=0; pole < 4; pole++) { + float temp = state[pole]; + output = saturate( output + p * (output - temp)); + state[pole] = output; + output = saturate( output + temp ); + } + work[i] = output; + output *= Q; //scale the feedback + } } diff --git a/Source/PluginParam.cpp b/Source/PluginParam.cpp index bccd199..2839707 100755 --- a/Source/PluginParam.cpp +++ b/Source/PluginParam.cpp @@ -87,21 +87,21 @@ void Ctrl::comboBoxChanged(ComboBox* combo) { // ************************************************************************ // CtrlDX - control DX mapping CtrlFloat::CtrlFloat(String name, float *storageValue) : Ctrl(name) { - vPointer = storageValue; + vPointer = storageValue; } float CtrlFloat::getValueHost() { - return *vPointer; + return *vPointer; } void CtrlFloat::setValueHost(float v) { - *vPointer = v; + *vPointer = v; } String CtrlFloat::getValueDisplay() { - String display; - display << *vPointer; - return display; + String display; + display << *vPointer; + return display; } void CtrlFloat::updateComponent() { @@ -152,11 +152,11 @@ String CtrlDX::getValueDisplay() { } void CtrlDX::publishValue(float value) { - Ctrl::publishValue(value / steps); + Ctrl::publishValue(value / steps); - DexedAudioProcessorEditor *editor = (DexedAudioProcessorEditor *) parent->getActiveEditor(); + DexedAudioProcessorEditor *editor = (DexedAudioProcessorEditor *) parent->getActiveEditor(); if ( editor == NULL ) - return; + return; String msg; msg << label << " = " << getValueDisplay(); editor->global.setParamMessage(msg); @@ -352,7 +352,10 @@ void DexedAudioProcessor::initCtrl() { } int DexedAudioProcessor::importSysex(const char *imported) { - memcpy(sysex, imported + 6, 4104); + // reset current program + currentProgram = 0; + + memcpy(sysex, imported + 6, 4096); for (int i = 0; i < 32; i++) { memcpy(patchNames[i], sysex + ((i * 128) + 118), 11); @@ -380,6 +383,26 @@ int DexedAudioProcessor::importSysex(const char *imported) { return 0; } +void DexedAudioProcessor::exportSysex(char *dest) { + uint8_t header[] = { 0xF0, 0x43, 0x00, 0x09, 0x20, 0x00 }; + memcpy(dest, header, 6); + + // copy 32 voices + memcpy(dest+6, sysex, 4096); + + // make checksum for dump + uint8_t footer[] = { 0x00, 0xF7 }; + uint8_t sum = 0; + for (int i=0; i<4096; i++) + sum = (sum + sysex[i]) % (1 << 8); + footer[0] = ((1 << 8) - sum); + + memcpy(dest+4102, footer, 2); +} +/* + + */ + void DexedAudioProcessor::unpackProgram(int idx) { char *bulk = sysex + (idx * 128); @@ -416,7 +439,43 @@ void DexedAudioProcessor::unpackProgram(int idx) { data[157] = 1; data[158] = 1; data[159] = 1; - data[160] = 1; + data[160] = 1; +} + +void DexedAudioProcessor::packProgram(int idx, const char *name) { + char *bulk = sysex + (idx * 128); + + for(int op = 0; op < 6; op++) { + // eg rate and level, brk pt, depth, scaling + memcpy(bulk + op * 17, data + op * 21, 11); + int pp = op*17; + int up = op*21; + + bulk[pp+11] = (data[up+11]&0x03) | ((data[up+12]&0x03) << 2); + bulk[pp+12] = (data[up+13]&0x07) | ((data[up+20]*0x0f) << 3); + bulk[pp+13] = (data[up+14]&0x03) | ((data[up+15]*0x07) << 2); + bulk[pp+14] = data[up+16]; + } + memcpy(bulk + 102, data + 126, 9); // pitch env, algo + bulk[111] = (data[135]&0x07) | ((data[136]&0x01) << 3); + memcpy(bulk + 112, data + 137, 4); // lfo + bulk[116] = (data[141]&0x01) | (((data[142]&0x07) << 1) | ((data[143]&0x07) << 4)); + int eos = 0; + for(int i=0; i < 10; i++) { + char c = name[i]; + if ( c == 0 ) + eos = 1; + if ( eos ) { + bulk[117+i] = ' '; + continue; + } + c = c < 32 ? ' ' : c; + c = c > 127 ? ' ' : c; + bulk[117+i] = c; + } + + memcpy(patchNames[idx], bulk+117, 10); + patchNames[idx][10] = 0; } void DexedAudioProcessor::updateProgramFromSysex(const uint8 *rawdata) { diff --git a/Source/PluginProcessor.h b/Source/PluginProcessor.h index f1316c9..054b546 100755 --- a/Source/PluginProcessor.h +++ b/Source/PluginProcessor.h @@ -64,10 +64,6 @@ class DexedAudioProcessor : public AudioProcessor char sysex[4096]; char patchNames[32][13]; - void packProgram(int idx); - void unpackProgram(int idx); - void updateProgramFromSysex(const uint8 *rawdata); - /** * PlugFX */ @@ -88,7 +84,6 @@ class DexedAudioProcessor : public AudioProcessor void initCtrl(); - public : static const int REFRESH_MSG = 1; static const int REFRESH_COMP = 1 << 1; @@ -118,6 +113,7 @@ public : ScopedPointer fxReso; int importSysex(const char *imported); + void exportSysex(char *dest); void setDxValue(int offset, int v); //============================================================================== @@ -134,6 +130,9 @@ public : bool hasEditor() const; void updateUI(); bool peekEnvStatus(int32_t *values); + void packProgram(int idx, const char *name); + void unpackProgram(int idx); + void updateProgramFromSysex(const uint8 *rawdata); //============================================================================== const String getName() const;