From ea0210b97a639ce6e53b618a30febd276fdc0213 Mon Sep 17 00:00:00 2001 From: Jeremy Vachier <89128100+jvachier@users.noreply.github.com> Date: Thu, 27 Nov 2025 21:36:16 +0100 Subject: [PATCH 1/2] Updating README and adding transformer architecture figure. --- README.md | 78 +++++++++++++++++++---- docs/images/translation_transformer.jpeg | Bin 0 -> 63632 bytes 2 files changed, 67 insertions(+), 11 deletions(-) create mode 100644 docs/images/translation_transformer.jpeg diff --git a/README.md b/README.md index 6229d30..2764861 100644 --- a/README.md +++ b/README.md @@ -19,25 +19,68 @@ This repository provides a comprehensive solution for real-time **speech-to-text *Figure: High-level workflow of the application, including speech-to-text, sentiment analysis, and translation.* +--- + +## Key Highlights + +**From-Scratch Implementation**: Complete Transformer architecture built from the ground up, demonstrating deep understanding of attention mechanisms, positional encodings, and encoder-decoder architectures. + +**Production-Ready Pipeline**: End-to-end system integrating speech recognition, sentiment classification, and neural machine translation in a single application. + +**Research-Grade Code**: Clean, well-documented implementation suitable for educational purposes and research experimentation. + +**Hyperparameter Optimization**: Automated tuning with Optuna for both sentiment and translation models. + +--- +## Architecture + +### Translation Transformer Model + +The English-to-French translation system implements a **Transformer architecture built from scratch**. Rather than using pre-trained models or high-level APIs, this implementation provides full control over each component, from multi-head attention mechanisms to positional encodings. + +![Transformer Architecture](docs/images/translation_transformer.jpeg) + +*Figure: Detailed architecture of the Transformer model showing encoder-decoder structure with multi-head attention mechanisms.* + +### Sentiment Analysis Model + +The sentiment classifier uses a Bidirectional LSTM architecture: +- Embedding layer for word representations +- Bidirectional LSTM layers for capturing context from both directions +- Dense layers with dropout for classification +- Binary output (positive/negative sentiment) --- ## Features +### Speech Processing +- **Real-time Speech-to-Text**: Audio capture and transcription using Vosk library +- **English Language Support**: Optimized for US English accent (vosk-model-en-us-0.22) +- **Downloadable Transcripts**: Export recognized text as `.txt` files + ### Sentiment Analysis -- **Speech-to-Text**: Converts spoken audio into text using the Vosk library. -- **Text Preprocessing**: Uses TensorFlow's `TextVectorization` layer to tokenize and vectorize text data. -- **Bidirectional LSTM Model**: Implements a deep learning model with embedding, bidirectional LSTM, and dense layers for sentiment classification. -- **Training and Evaluation**: Includes functionality to train the model on a dataset and evaluate its performance on validation and test sets. -- **Inference**: Provides an inference pipeline to predict sentiment for new text inputs. -- **Interactive Application**: A Dash-based web application for real-time speech-to-text and sentiment analysis. +- **Bidirectional LSTM Architecture**: Deep learning model with embedding and recurrent layers +- **TensorFlow Text Processing**: Efficient tokenization and vectorization with `TextVectorization` +- **Binary Classification**: Positive/negative sentiment prediction +- **Hyperparameter Optimization**: Automated tuning with Optuna +- **Alternative Architectures**: Optional BERT-based models for comparison ### English-to-French Translation -- **Transformer Model**: Implements a sequence-to-sequence Transformer model for English-to-French translation. -- **BLEU Score Evaluation**: Evaluates the quality of translations using the BLEU metric. -- **Preprocessing**: Includes utilities for tokenizing and vectorizing English and French text. -- **Model Saving and Loading**: Supports saving and loading trained Transformer models for reuse. -- **Integration with Speech-to-Text**: Translates recognized speech from English to French in real-time. +- **From-Scratch Transformer Implementation**: Full encoder-decoder architecture built without pre-trained models +- **Custom Multi-Head Attention**: Manually implemented attention mechanisms with configurable heads +- **Positional Encoding**: Hand-crafted sinusoidal position embeddings +- **BLEU Score Evaluation**: Translation quality metrics for model assessment +- **Flexible Architecture**: Easily configurable dimensions, layers, and attention heads +- **Model Persistence**: Save and load trained models for inference +- **Real-time Integration**: Seamless connection with speech-to-text pipeline + +### Interactive Web Application +- **Dash Framework**: Responsive web interface for real-time interaction +- **Live Processing**: Instant speech recognition, sentiment analysis, and translation +- **Visual Feedback**: Clear display of recognized text, sentiment, and translations +- **Export Functionality**: Download transcripts for offline use + --- @@ -240,3 +283,16 @@ Sentiment_Analysis/ This project is licensed under the Apache License 2.0. See the [LICENSE](LICENSE) file for details. --- + +## Citation + +If you use this project in your research or work, please cite: + +```bibtex +@software{sentiment_translation_2025, + author = {Vachier, Jeremy}, + title = {Sentiment Analysis and Translation}, + year = {2025}, + url = {https://github.com/jvachier/Sentiment_Analysis} +} +``` diff --git a/docs/images/translation_transformer.jpeg b/docs/images/translation_transformer.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..4904bba5fee762a2c738e316ebb0a5e14bc8e985 GIT binary patch literal 63632 zcmd432S8L!x+dIYkeqXnEK!l52(%y>0YQ;Wi)0ayoN38OR1i=UkStkp&PhNerzYnN z-Nc4&y7xGH=g!PGcklgo?|l1jK^-`uPM^1`PSx`~?^}(X#x8-VG*vZJK{z-dkUH=K z!Y+gEtN1wBfk*ujFL;0bAD`>@No+fa zni!u8=L8Rj8-z=ZgGY^n?FMlICT12s zegVN7LXuL_GI#FEK2TOsRa4i{eEh`VsiBdviIugDt)0EY3wIAsFK-`TztFJoh{&in z(TPd#lT%VZd`!#E$<50z_*z(0Syf$ATUX!E*xA+H)7$sGe_(WMd}4BHdIq+QG#B@sUvMM@Acy8;%>7ToeTw~ysT;@akHtjE#{eLqod!JcFlqw zfN=kk@NjYQ2=MUm2nY#)L`Y2dI}u+a{!6;{Z;9+LiQ;#n{P%7KU zB_XBy-%i+hpmT9yVIVR*9H2AdQG>vsD|B|WAn53_-L))1pX(Ik8s~RX-_EG;X1&r>9V4=QS1&eq47oq`DFA{r zUml7Blh-UpaELf$k9kfjJBe29Wsq2TrZBHOC#HEI#2cl~;}#oo=L_ZAR*`Kihy`p5 z#)kzsL1JWw;(L?6I=DJs>Qp%ul*V0^Uad*Hv+`EgM3`zk`oY1)>v`ezE#P>!jPoS)lhutMDlutAJtI7SrY z(fYLrXqcQ-pu^Xzkgf;j5`iWg9o@A*3$@Qaj^t<!tAi(wuyTI@PZoq?hI5>9Dq;f6N#p;m(vQxXKHP^O4ulx3ZvB|#ND*(vz`I~q@@}$lR_b^4>pmR_&Zx|))Sg9h zA1tUt7{1z_l|3HB>u4bya*m=uuo_X#D}W5jdCxi<*w&@lQ3=};;%aBbBugzSqBwnK zbv|h$gLBcU;XyY#Rvd?D=67XS?tId%cSPajYuVP~ZZmUf*{H-`eW@4H337RlOPT;n zTG5RPx`U+bP#}d@lPvE)=&=xhFBJ2h7j6tlQVksU%6-o7fyjwz1o#>=&s$6(3RW}U z1hM*Twl9)5(=UCLvnxj)iJE9VK?V2)FknG5H}Dgsx+~TA$8A2K2TC4*vW)6DjF%E- zXuC1Q<8rJkOs!mH#brpBp2p2LF3x4uUkbmftngX4)*aS^F8ykP7d&F2yQGhd{@GjLp5K~RpzLh*&1k7fIfXnsu*|Ca>ueIwEB#zN zTJ5Xqnl|cP3v#$!SSu6cg@p)$?Q%apr$8ac1$S#IgS|0i;li%o<_0g9b_;I;A4Y|w z0b>p!4VpG=z1|8hf8!iLAfM1B&hBV;e?(5zlQ=iSzb-{xH1CrRb!5cChSA68P^nMv z#iE&5=8@Vc!SXInW*?WnR0ZKAvx$@GW^Mjr$y!H}@l#IPdD#4roAkg_g4kJn_1Dn% z37_dN8gz*;-z@~;2sk9T2EzW}D_R`sUPkV(Jo@;dy{EV=GhfQDg#+|lqXt3FU<0mc zj=}_4ki~sDEa=Scsx(M&CxZm36m%OYbRa6cLMxVJw^G+y%3T&6H8%^#?Ku~h1ljy`35>M8iN&1Sram$=5ghFSzlEU{1AqDpUN92e25Z^WT>{R11(9p zN5jc%lY>~$SWS-0E#9~=uKY=TP9N(P1^S?FlhiJAyZd8FJ&pcIaHoX1M!uTemsyx& z<(ow1U~x}~gz9^fHxhAddR3K$?nf)H0ntKfdy3moGjESN$4+KJK{ zut-k!Cv8V}tnZC3n}7U#T=P4XOPX_tnR5iN}7Xtls(~@W8{4{c9(|e*!kmoM#`AZ?K?i zeM^~dnzis-4Ng)ve*FlIKxr=?yi1+OV^)Z^zxvq94ek7e6j;ur84~{#$X;L7%)8z? z=71`&J%5$0n{y3x9xa&t`r3bz!PxOX)fBwrv9n9KcMpWk$Le8Zr^($$cw6N4rioM2 z%xcqK`mEUftGPsxSgR=YMWI@6(A|}UX~vF4`T)x1I2}%gt&OQp3{S+E;b>XVhzpl( z+O4K@*YBe@5_wny2I^soo6(oEt99silu^(#v7N9=vq_&FhEs!YhXd6>R<6D z?6admg8xazPW-twFwlAr+E0ay#Dbn5lwv`-i6d|UjCy3(5Q@ZYW z1e%JW+q~5QBv?@5b@(x+XI=mc(%}9=Y4A_|;~&8=9(MB2F`-PLFGy|#jhCkuSSXTe zXz1q4;N`U>)ib_ELnFmY0pj}@W$;LgO1QQ>Ns45)JCj~cx6C47d-;NAWbetz8~j^l zW_Q@rjQOtV>Q{U%DV|tMxD~-sVhb@y;CZJO`7($fY1(yZ7a{4wB4QHs&XGL5QTh{Ja>P8oJt=LX z($}>k$I9%~$s%vYsa@!;xT`D#6cgzIfF1KT;@af z$ehxTuM3}6EDvNS^XMkU3S3J%D|h_PgXMg4kSNVWl(w;`b1CnUxX1y>G{(3cKR23$ zE#z8dVo5GNub~r!-{H6}0wd&OWma`T+fAd9vnaSN#AH)n=XS4JU-=0~mbE3sc&b#X zT+TP)OPArd$HR@^>DY7p%?xSdis5_#_e5+E|__`mRLbI`Ukj zp4HAtM|h2Mp{}tyj3>bf@x9GJsy`0Hyt(0ct~LnaXm&uzbScPPlVXQ<1rfw(M%&jw zD7G0chf)iDD=)hAqt(Uiv^=7e2iH}bDreqOfr_9nw5@dEb7`%~Sskk_w>wP;GfR+} zW@BYN>5X~g{I>q24p!djVd`VmFGu$D8C~6@&s-P+m@spQ^q~Z~TPs&~9gX<~4&?FK z9#yv6{w^;^CGU+M!IpR{F3K2;I=_)A3dFv8jOkavkM0zwL_$p_PQaA9c{5v=`5zrc zn>vb(r>j2n3=ZKZMn2n1l+$IErO7?%OZzNR<};FfPt0mS(j^WHVi!Qx)^b`^HNiJZ zS8L&GdNp&F&%V`;thMrU)y7;;R79Qo^1ae55&BA!Shk&6E09nV$ErOkqCoTgu@U^V zFIx1$?xU}=Ht{2FqnuptlRVyC+z8zuB8c_j3MBW03v@kx@y^l9FF(gBkTM#)ETX~f zLm>tmLMa$Y_mhgxtksFc-rB(JNm1c?9`Oz(ixf~9sg9$VJbz>_3Ar|pRATV86q{s> zz~hZqzR%qEw#f(-Dj?|7aFk$a{lik!bEbUMd9;$WRvXqoTKg%Zpcwjnen}ifsRoRusZysC0q@-6pa{x#6YctW*&VmV zJDB~J(%gPvRCaLEa7wBVONX39T{-n8Js_m{13BQrZn910 z6kwVEf`g+)heP<2hJ}Rxhs|&cX2#*-%vZ8cAn+cfIq%eAkH6af5Cg=AeZcV2)9 zVa_=BP!bfZLrqr;>*va%Tv(7-!VF|Z04*{U+{!X}z<2DjmxUPuFh(;yIxH&1od*-9ilSCoVsmXr=<9<&MVC=tGn)yS$ z;{D$MGJg`VE@^Qw8Ew9sYvBl+A26OaQXbP5&P=8z)HqdWchkj78!!LdW=|T~oY}EJ z{}v0%+K~-QH6(=@d#lN_ahkza+M`96bIRNrrb`%KL^KLeO%GKWCtW3G&vTuCma+_IdKyW4lAJNP)5)6 zzX)QPkSdivRGVlvE;FBA?Bb>E;@enDx$z_?hx~Jdz9PqahYXepNptBjwb20MG83ce z2W(Ui*f++b1>bXX$9*Pv1mZ}Z98s)0lcvQ4ir2Seejo&{DAKSX3?abK>1*9~AX~*iFw~R^v+$KAeO^tF{NTu(cxMZMSwxfw* z)JcrIzjA}tASp7%-sZtkpXm zH`XfbslO9aTxCW-X`2TI+t_H&nt_sw9D&_%knMNJ%91f)VFt5LWc)(bKc}HdR}DEBO)%( zwUBD7fm+)2iK7Q&561H&?9KXk_0=4Ccyh|FRlX(WTH{a&$dNo>Boqmv_d#hQq+5yv z-aJt$aqvqibT8_2cb1I#ba8OqbcW9-@6FQFA1{kTp2RyIkh`ml$!TQoaIjBip;R-A zOa~p^88&n!n1^#?8i*~Ed9A6`o|F3~gko^eLU8Fkj`FPS+uFV^FV9{LeqCJHi6f|f zO%%;prwe``OGijjO?A^}CG^xxhr>PXJ#@K7L3a%52#ucNpl(4(wlaiR`DXW&IILIy zgy>e+rkEDnKOI=vITKuM6ledno-w^QAoKl6q4S{yavf3Li9kknHKruxLw3_BiVHgA z&pui~{heG2UNE?skw%QIyer$drNNo9B7iF0ct*h80#(0C3nJgDO-*5dNgkV;&-U3? z%)MZ&BXzQ)>wlFp+4}N_(-KW@+Nz<~5!*+sS3J*ljZe9~NB+vGTV zZ@2i~*UhT%{S}|QkSF$0(T1wiPh=~|$cZFh)t8yum7~F_1!%mreXFxN#CXL_$I`x7 zpK(*=F!yA6Tzq=T&RdAKk%(7nRu(skf_}6SdOB*6l2jWn)m79u(xhC5@3+B9Ii993HQ)M? zzayOtQ>9HEyiI%lN#T%APm$)qHR9D+0t3Bp12zz72}f}vtiVJRW$0dlq{o7Ipb603 z{7+a=HcRXK^3Pb19m=~ovsXbV7W#WU@v7bbJ)WrW6awRk$50W=r9|k_=SfYYv^a0* z2R#)!4j*6x`a{O~v)CyxBC3owtL0kQ%g$F?7(u#+f6^u-kMt6sa&)^<@}!MtzgAEf zM-w1e+uc~Tgl{xkWff4FDe_wBN8B0_h<+MpJ3Fkw>g=3%JJA(djRwfJl0_SUL?Bn` zfpscG!^_A_MjatWo%s<2eq(PNzOEdGVk#$IO613+k-;Mg4L&4DkD;P`h(?zvv}T*< z-2-9K6odD%A;dw7^z)c$EQlJsY!N^>l~$4VH|yQL4BOS z1(s;SVH-e%ZyQz|b#`-ee*uchSo`qMI%89k64rKWlQ3Z|P%H@4hLVMi z$pJR?C6a2*-e_jeYNMUg<+amKyFI}b&Hv7Fez>2<*`nyh!AAk`KeXImTN3BbBIo}$J>xCw z&blwP#V82+7zgNDmCR0WwUUh0kZYP6Qv-zBD&faV`U_PW`QnW5w1nw|-&Zmsjhl4? zOJ*1CTcyXUuQY{?MkcjJ$6}0uZ4SuG`l!IOZ1c0I_P|8%;xAf2bJ0hn8dmTc~T%2<*@;3!i(rASBolU&2nHpB*#3DTbDDEmwDub0~rAo+k`S z)=6~XCc%X5jk)6jZ{}WB$W7=X4O?jeZlD2%^FuLr&GYC_T|37#2LvyDmJ9Q2=v-;g zci|o*&9{x^-hIDTS<}6CQ;te8NHJSHQh_2uGJ;hg{!Y7rLH%a}yw@PgcKX>7-JKIG zC^@hv&?57wydDs4mMxIFm_Xo3+dpDK$aT|d_5Kxo8lP?Ai|!71M^ zTIF;gbgTW?T$?U0Jb&V|o&-RIe+izog+ply5Vxsv=BX{9HjxvlQyae$_^VJv-`7#h=tFJtMReuW&y~#ZHnL{duZqP!Q=PKl zDDl!qYGjw;;Vp9&U!Hg9ZK&Ej>i&!uo9LJqdVjdodEaHfde^?Jq%`f(gs$rLx)A$t51Q+;8SmC{+<=!@TxTS= za$>KIyA7GXk4xNsESfI1cAwui=@!GnUA&rBWD??OSKm zu3@9+{H}3{X2?t#^FD6x5Oe24JfZ;F6OJ~NJX&GbE(`Ep8F-4D+RD4wHd?h;F1btBdhTJA8qzYI;O-76B|o!$P}d+ znV4Q$KYIojqQ929h=5N02v_x9MA-eXAVsdOdQOQ;CNS=L9UE<3s>MvdAY^)`brAsm z+TldM0D|RNIp9ZqQ0n*~$kf}mH&%-5>an;p)vUeZLN)gS3{zl$#~s5YU*(dxLLEdB zHCVE5Kt7tje&x-!`C|W440wmcJ6jANj!K&AcEIEpGQZdXvzH^O@Aazrsqb-bOMKgZ z4c`vl686@H+l8JuX^L8@5AVHnS*lFXj`tDGiGETM7Rp}P_?4TEi$0b;=UZ_cv$^z{ zm}H)(cSTJu7SwNq^aT_?(!(pM`6-wuVko#I7s1#|&hA9G6(B&~b2=A#kX!evrL!wrnO;3e>GvhzTEq@XjExXspK{(vXWgn?LML%Zs zru5*tQ!2w)zLys1am|!K1wKv5wM0rQ6_OCU?~G82)?4-xtVT{Ea*v&x`FFyR?$$ipK;_d0#M7)C^wZH2 zF;DpioqCFncCTXqf(13rZ}_8C#+P7-?^(%_ z?8ID?nfqM`S_~B=ST^O8qu3x8MEAYX+DPs~ANQPyBZALb;Xv>z^0ylYPyn^Zobwi; z%MPp$Qw1`GZgR}64l56Y&XXISl{&9O9VQP9|M0NIUYUS_j-#Z;r6O{o&U5lV>NuU# z)vhE$q>Kjr7?bc&1$lu`m4{WbKTSV;v^7Yp`E{=y1JoYpR;cpu#G?PlGBJLqbH>}P zGK04f4YPRPK%gSr*F;t-^zAd9)Bj6A^Cyw?zfSDH^fAl2WKiBiNwk36d^9B{GSOwRgY)F(_9Bvz5({F~MQLL}0;lIh)0Vd~qD6$c} zd=IX6MJDTwA?U(_dPc7Dv7n?&ROpV@MZ(kU<^l|D8$NWns{p!W21c86{_*oLW6=Jq zz>ZTsbSK*Dx918$33#qd0nZg*&XO+Rn~Tgm6Waz~YS8{QQR5ECO`DUj*=m_oJdA^|s(DJ}S$(L|7*FC|vFC-28uxBqGeI(TJbfhEk{@hI=g^J|6UPW79jXO8J*$L24R(0h#1q{)4Fc~bVhUP3 z4K6bblSjKo^+KkK4}$D~(aCYbEom(K?jllI4)A;4*WyGI#$Z8jaxm1CfJbzg1`w@r zvVk7%n4R6iX~)r*xz9JZ30)lg_MDkWg)vyB_?d|&4N(W}AbPtLhyjjwJ#SpAXykOAl zkvtpZ{+J!_wj$s`?PL#&QdTYEb+yq}|ENNmFe&CLOT@h^M{7(5lgPcQ-mn?;6U zL0cpMPJBHAMMxs$jF%lVspfoCXN@aU&8y$oebUv6f*lBcVl`hP-w^s7d&`V%{Ct5M zj`>)$4dciwguz~zbi6l${ghCX9|`szxE>efAXjto$^M?20B*dxm*P)_z2blR9BAkD zW$-1g5ik=GR=#Ws1~@o?2DHv$Mnl_cnNxk1pnQ3K&Vwhy~HA{h{cTiVDXs`B0cv z!@#@`V~63lnwEuNOA(h2!r#3r^iV6yu`!`@UUhVG=fL!k2%?#?W_C|YELEh0hTqsM z#nJXTee#=IiNyCLh#s4j$Cp~Rz@N4`ylPra>0G0N?j{B0)cDTi8){K&^g3E3RBYKa zB%9Db$v)XhDCiJUWLNR@+_0c-&U^&VkAZshY&2BXCQqM=Ac|>`Nfw_VDK-!Xzo3Hc z4~LZigYet@Q@DQl4a6e)4F?by@Xd1(^XA3ri{(>NCaHU*>C#)Y4$45X+7zT7A*ZiEavRASDM${^v*H_-+|Zb zj)4lZE$<14EDc=`mo7(8Dk0x3FTz~(;cE7?3PllOOW_tgHNg{1gFFo&U19y{ zN3wy^vNw63V0l)~KOG{P8%pa`hlj5e>2mMWZsttTd8bSpbC3`?xY@>gHJwFXxO0#q z$JfV`XbAoAWsE#|`;D#m#( zyO-nWH27k7sam(i^~qDpDA~NlE^$gn3t2~T+9C2)has1*Mo6~-$!eK_f#KOfPqI%o zhL5?6K<)A#85~nV+{pa-!@~gA(y~uqkl=3F+O*+$NyFb^SB!w@T)VCX-YL-_USziK z31y_8OiZ@1r+{^mQGLp`wKo%}eb5=F4hwqXO=Eb6=QJc**pKe6cwu;entV0jnrftY zR_5J<1s&bkg`Tdu0}5$cqtJ4*xBSnA6gl=B^ySc-IwRN@X2DAGDxI!MMP{+SX^LFD z2>udFoySQdJONTSbaE}}i|vMk@UftGJY9=t6xBcn7q%!hQ^>R;{AlTv4-2_o{f7I# z-+r7@!myz$Bw^k804hFyWyOA`6fIb8w)EEsihpU;M43+Gz}jx#&(@)#6L~VC$3t>X z@J%g5*zk+txxrk=6ixlbN42vXVFLU&=!1=)3na$hkt=-s({~#V?j?0!S1YvlE@~#R zApPWJxua)spR$aV{zQ~Mh4N1KaDwQK8A|%(R>)v*p9NO3-nXJ6?T{&zY={ z;AfZMDe(}Kz?f+Ci8wy`?kJj5^0InLV&`&wC#-&4%0XHEs%B5u;;^ zNEO%B+p*d{M-%BIQ{e;f6Nr?cakyu4|CF)GI@odjGKO;)aHyS8%KbHQ5j4{B7>L&SOIBKHkc*!27rf zGw#2y!&wTX?8UI79{NQ_SDVZFuO~i-Hzz73F#sdXZE1NN?iR?ZH~Jlv6FS{igavK$ zz7L=VD1`VDCyMc;{E9ceF)+6!xjgTOFQfdPUm%^HSudd7{RI*KM#VVhHg2Aih86Fx z%2RiIk(gjW*ZbzX{O_3gUl;@MPj!=3Utd=pqE+1Rl=`1G~n%Q4u zN!rd^(Il~CRaAE+0|b%fOYB6;E}_-(kjK(fmtJuNvu4VZ$4P9%v)QtVJUl|}@#K!* zFGQX519m^TZ)*wA9e?41}h4x6Wk~4%Z0F@@L6~tCKP-j z?urHV0-W|A_kr5s7?mF~$ZjsiFuHVcUXo!!Yc0Q{T5|rlKQs8vU;SMEY4lMyat8jb zv1H+T$n-6|z|MXbCV`1{13hHg$*g~je?3oQb+T=Q0a<)3v#~B$$Q`cBXdO}Kh}?|s ziAh5Na~r=IUD!oX0U`JcAbRcnyR#1GUm11ryO$j;vi#(03-#PyeqO0&=`o=8Nco{+ zIggZ~t3_MZ*0Z3IjWmuV#$M7)#~~GJU4R!iaxw# zc$wf9e`h)F`5Pr}5dD*9AXyNB8-&s_dbVAGr7l=Wjp3thQO*}!I*_3yXy?AX&tdMGEkX0z^jPayiuwOyxYJ^aNQZ=|qDC86@mG6zbjxUl?Vkk)Bq( zS{3ZTe|xv=vnbzPNt6fXqlA}ycHdbD@^<0Q!nF~PLwb|B`2dxOoz?r)Z&>b~RD$O4 z-;1Y|bG)+hGW;$?SNV->9BdB>P19+!S`O6heh1qziEk2!C|yk?4L6)viMR`!{c&rL zO#cb2C*<}`mFH-~4nM}d#g#)=WN24TH%$IK>_Dmo+!u7cvfijJll+BWMqB=liRQ=0 zxAK0x$gomr+7Ol?`}$%N%?eLgq3qSx@6$ofFO@!c5NOq#AslGbgFi@KTpR4-M1NY^ zVJ4#O&4AK44(aep>}(PL`e@?VzI^uALKD=&kB7PBTl&g~Pi@u<8}n*4~N??Gsf#{>{G^sxYKQj3V}iOGyLc{u4eJT6%*UiZP| zp1GOB8Hv*w>M55n?=pUDk#5SK)g9qzltpv1HXq4RL0}t?deiSPH{1{)$bwLV&0Tdw zGi#)StVDuXUXid_#%%OC66}cukt9Sg?kzB+7_juFH7hz-euLDR3aH0gZ&*W;$3$Nb zCLPrDp_L+pGeO9d1y4%0Mw^w&j4&oMYV&%shlS%$XAT~wJ}xP%Y_98gtl_#ePw4xh zI?>3aigrASCed-c_~b{SaX-M3#P02d)9G0>Yy#W+K)BX@&VOa_{BMq=K#U;fJfUa; z0HG)V2yK2=Gp3Bf%)TTtkGvZ{v9SyRQ(LIo?=4+HAGG0}CE&*NUDhT9!aprfMJ`1< zmQ!yh?J(*J3fQLSnRN0|zaGG^)OB}ZsbVk6>&Jgh`B4p}Acq^YC#14vo6vT z5&>)JO?507bUjPvds$LYCnM3WS>Y>&v1C-~jQz%&AD82JDbov%ydk3NTIj<+XaJu- z3c;JR_lpWK71g}y+QO64D_B69qUNR!!%?WA?1*!GII6%u>*L;2xy@3La5}U<=(y#i z_euM`@r+4{?OpbiWp}%V<0`j?hh)y+%#|CD3lvOZE;p|9hRb|8k`aI^!q5gk1Jr{I zrU^NLVl#)d$mC+kcX5wdamsCksfMf6uN()TZ6Bk(CvkNAhd1wDr%!7xJ3iZOYl0_) z9Exx%4%dKbjdx{37hkBJt?Kxj3!Ro^CBj&rpft2v@-2C@7>I)%WZ3ZbZw3uzGCD~) z8Lnt2bo<`}N2T=^*!jB4u_%vhB~4Gmv>X^R6*A9OMJj@CYi&sVLU8HVUn6jD^xlhE zNgy1uS}Bjf$W)F6*ol~&ww4C^X2*OIu5VWKt2@46(C}oOiKP|187y4LOhY81{lq4G z*QKxO=+HS+w0k_kHS;VAskNNWb3bVX66+yOwsSd|>QH!S2HsvJM-#L}%?(38v`-O0qNCF&D z50SfFP?GAy=u6wYCDagkmkreW>+X@RJ4dGII4#ru$)MJ=jV*Jn2tx^69#7$l5BnT- zxoBEMUkHZHA&3^~yXtfD(@K5H)5*cP%;T`ycwVh&VZlN^{pZ(uwOi$|v&eYsz>(ru zT>WND-SSq)}ny zlGG(GjW?96Jp8o-myMohaL%tm3Y>SR(0v@v1p{wTdRwh`kp$&vMGCh-hfT)oUAkO9i-;}+<5xv5{%)>KR~KH@#Q-I%NeEw{s)_8nbS}0Fe9`*QKg&K!ev>VM?`Ka$A@3XVK_k(BxPSI=GO-4k3Q_9vBF^N=>_D&Z&IdHoIE6>qkU9 z+Ebm+TX{d}`+GKKYEoD6zA_bAjs&`JZi<1>dMnOVi8F=^?UdT?XV4pxrnzfU7M-H6 z<(Ae2wZ7;V9o2lim&lMv(>bD>COTs)nvjw=-ewJ@9$b!UrE$oRpM|$-$umr@YPNiH zY?@Y$W21(CG5_>lOV5q#Y0^2xQ>7z*=6-g4~S8mcOEI61!6&i(4Dj4OutRNmCRYvvlsBP znBtu&PO1~F84rK|Hw(XJAJzF6n#?oD-cq$@&3oQt;3m<1?Z_p%tri;TQ6IptNLEuy z?IdTFGq?L~C#};$d96Wj7$krDJbtu(R9uHzh z`gb)Ncf zSP+#OonK$@f%r=sdxMm_rD7$Cm%Y!JD)482RrLQNt7rh-0QoB9q43eH^}}+v^BnXc z+vjO)m!$LN`B`6Yv_&dKuzDCqv({%v8($B9^f0Co+}u2YG8ZtfM-X+l2!D6fr9wZQ z^irWvOzG-^1?I9?HfJ)EY!ch1fYe27Robtgo$2MN=IG_Mq3Jhk%CR5{-Inpog!a!q zJYDU8ST8$<1u2*M)wrfi4ja#^IJ^wG^GroqZ^YoY?B?Zp-eB7F>E!C+twn2q$e#ZC zE6K$BR|bXtfwDbLMi_=laxy96zCbjZ8Q)Eu+*wc!*?}qDYGr;Kp|7U*`Q~yko1tJU z88Ysr+$ZrU8Om$${9WDZG&8TctqMW~l$#^KO&DIqw(@2cHOwu2T!+HnpdSIQG!zze z<0&9)7;ygafL|Uxr(qsC=0NGp{-_P9j1hzmUtvM-i=h}Hz*+J4yDj?B3gucCjB}wg zIRk*CL5s`+mPMRn^h<#Nnj-KY_D?khFI&XdAa0bl3B-s1FqIthvN@!uu^<8AkOTYa z$%PrLB?wbDwZCYry(#~bgDP@`C>AZ8>r2kTotL_%CLasKhU1CU})sN zsSCDg;#WrJ(g4h22lK07FR*}nvGV4I#n{_RI}9~An)3ttJ#odA+zOX$$wgvEd1Lc%|E-v2<0*-U`REVl(WKZdXN1PLK163EX= zv$tepX67{No5|^D)WdJSA`bG?L){IKfy;!qviUsjvEUe4u9&DPCDQR9j5;Su&kMQB z)~Z7yKBRe|AOr1ZM4SUMKshE+L#>1Jf*XSaETe>K{$578o0EZ8mJ5=&87; z{T0psM)U-K5vVMBAD^{C3O83TfnydOe~0(~VR7P*2^a0;+BGc5Xp?mR5cxRP)a(A> z?FE?0XI;U^+v6A|KnHSiXgi(-R$RHj%jiF*$25raC2ITDHXt5%%8KQP#n7d))aJQ# z*TOuTQ(Z_--uGTp4NQNJGW2*AW5sMxTXIQ>as+(d8H>nWXgKGri3=J)#(kz};SC7V zOq%mV)Nv7s2Q0B30YsOGE=+i-KM)!UMai~(y|@i7?Yc-^2$Z_20leTtE@;oT&V>C^ z8H_)4wG=~tERGgqrMzUQIYa|>v-ew<=&}SNUng4tR~`5&om20~^0Xc*ff~whtF2zV z*vEq6>yUbXce7TTe<}m7e+k|)nQDU*VL??nI|>gK>L@oLz9&;>lb^64`8LEP;GzZp z?RJJg+WxT!hLJq-iqzyB0|KJ{Jp$GGBPW;9gNF)f7}ywevkoJ>xUBZ~_qs^^#}d%a zQHzG9tAao#4=WQ#G8=L5Z+uV(Ih3}@H$?`Y&lAtQ{KM4s_KH@)GB&vO4 zn5jnkv;e-cm@Qkha-(ZC(W0PQ&q5S1vJD8W&T@nRZ9@sP4buEl7ieo>i3bRJ=Gk`k zQ~(p$*6;y<&cH;J8FQ#sJ@Q|b@_^brhi=ZIK0yB)WmKnn4}lRv;r9puh?%1rf=C`< z`4XfZd?vmPxzu3yjqJ{hX21v|Jy$YGw}V)x6lO~t3@2atrkFndSs%Qr-RIjr*CoI% zh;%|IEp}#7G>a|=KJN0{ob?D4>iq>38+7xnh4Z>pA2PGPUs}y`y!sfmR#)YJW*rz5 zDbw3}5-6|YQ->D25&&LcVBP|OQL^A=Z(zNus3R~*0k7xGBxJ@Y^WqG%0XYk&yg;^| z_-oUzEW(>kGJ!W3n681>`?orc{O=apMf7!j^s?m#|_0-bT7QIpkORW zbCwd3ZC7!8-aYUA@88eIz{fHsVhAum6Xd;t2 z!!W71f8_TRP_Y86)XP9WMkaqj^S~9dR)?s&+`S#1S;m?gt5%uMX}bz_(cM)25xnO8 z3N)usoyVIzqZi}+{X|GOJYmJ|wOY6&gcY(oX<{3NbKo1LeI^oijUY3>HUt+RdrRBs?;O;`h%xoE)kE_<+OaFZc0W2#q zt;|t%vGzZu??gWUzMBS^7%v?!TUvTHVPg9wPNk*Fw*E22{eYtXK)8=dWRK87S#LfZ z0+)%chDKRXjRrU^V?j3^F1txxi9dR&(>LA3j}7fry@!rMaqO7Bi)5{40}u%ywy9sMSZZDWGc~CSzt&g>J{kv3t^QCZf%d zdbl}5tJ*YDiHbBS<4&&~NMKa9Iz}0{rsNFOzW7viwhC(%%88cDIFeZ1Hl1S?jyk}< zExr){fK_^meS9fFGf(p5VI*OV{T2Yjvz01O(;2l86zO8gC9|ayCG!SN)FbcX4T9Hh za)o}sTdH|OGOdcudaO}6Kw`>MSLQJs9OcY%1k8U&8LWliNpqt)=Ob(P1r=+bxpN_= zqlpvB2rOuQ6@zo-xZ2|wXiZwbhOwRYXjD7K|J{1+tkgwTh=zH-n4=KIZ zB2KS4&-xv6%BOBJ8R_M*yfWcAYWCvyEE;h410a~W9haVpFGo0{yrY#H_;w=7P+6Y_ z%p82Z(rie$H+$54kXD0Df{<@5-1$17@7Mj%(b3_5tU0ywO!pjC0j!{Y@2bQSEYMe8?^;OX%W!Lq2B_iU)p7Uk!#U6AvaR~KwgX4n8kd`Zl zgg)S&O#28IHZxsEJGZD(NBnOWFS6GMBNRoF)Yzqbx7I%+FfNTnfi?@L!jRl2W4!f)#mPDjPp?Q zt~XUN7%zPzBPQ|fHSdNhTNtYETe)(PzOLn+nnr*be7tVPUm=o7StEc<%EDuFrI-C# z893NpL%ibYSzl+Zi#%vWCtNMM)A&h&lEUC#lygK#W}plx6v+MPTqMc^^!3y z$)pccxzoGqlFmYLB+RWI+Mu74Qj{iLlZTAdi7^-{W7vT?$F@Z6lu!z_!=JoXT#B87 z+0Z{auBQ!hV3~r7ZA2+YGkBqzC$Zk7rHYExDY3Tuod=GzW0xNhP5 zr^~zOuf2>-Az)Bfv<2PlC4sq~*wE+R{1&6H>fZB9&(#v}?pA z%sDg9DZlsA`+-3wckbM|+TMHZwby34US=b4m=Ko)V6VugfxYr32e%=bJr3rkKT899^%j^b2Kcn$pezv#fxqcjr+RQf*dBi> z6wlLueCEcZEYvX*5})2siY=`bKn8Gru)QCAGArwC4^U&RokRp6O^o)lq1f9i&_g~V zkL-V#Bw&CdEr0={l2fwUdrIjpywOx_>;(SqZ1N-Z821uxIx^R`_!Ae zw>EipJI`>_WXh#51>q5lzVUR0-a}u(yy<+q>%{v(Pf1v?q$w;}s3}$E_NnW4pHW}x zF@3ut>*)!z$9m!hr#nJVPh} z)retlq()Lqs^Iv0Ha^z&oU~VCXU;*j+|QuX-#_={z~93Fw%r@b#&wpaSJDu#@4a({ zR&3F#dQI^O5?p5Yxmkm?5@SRYsv`1C-v|cu07&6sIc%@)qLB`|pFP1}+XhDUtQ0kU`MBWYjcYTtfk|0c6;ftB zAiDrx<(g$hMV1&1<8SO|PQ%{;sssM!3^As)DU@6+WWKlBK%_$t)n#rru;%M$pE_#Y zM$^>W#82~OtXE;F-PG}&4~I!?LxEKxoPE>K1QXgI+^7rPt-#>t%#7@UChET`Q6HMGFVN?whju zjSq&_yq2O_W`Eje-MIz9JsyJW2(3=y7=dr32KM^vMuM+_8*o&Shv#=!xQ}wGkk#FP ztCnp20C1FqW9TLN7<$)0F_uA0H6GoVO=jG_da`v>&>} zU*s7dAXrcG!KPESZj<8c zh)M2h)Qixni`MFu89Qg}Z=fa2g55w(UT?ETI{voE()XC-*cHfA#hFXeM| zWhJ;L=U9VoFne@Qy=eE01X153Bgju8Qyje<&ee*YV|atStB! zu<-N&m@sVF+mb}TXh(C8lT-SmUhsL;CYx8NY@~MLUh^vt`%55|QS7$o#sIiWjfX0R zvU@CGAL7*MRFB9i!BzlZ5tbU>@SzV5w%|`9H1v26S|yeLBr0)$ZexztmI&P-u#_Gi z3%v|B!0$&JEM{^Ja58|AKlPL7@H{q_lQ7r>Am`S-{QvFSu0T#zi!YjC%km8GdG4rY zJ_u;+`Q%o0epBc97bj`2EY0#&5ViiI0Re>Q4pkSK7M0|sq&DgRjmS6L z?Q&0fmH9%aLFTInUdT%TXUth>+}u$DRG^d4KZ-OTvumYoacK6iG7|nt z)HMSi^ZQ9u@xXtFPCDH8YVM4}HQ5l(0q(3fG*8HYP6v_r`S1Ylrhmji$G>R?VD2%2(Ldq(=qlmCnDdk-+q8GffTM#+HNPO>bUJSXXpF=>U}yYdQk zChb|QLfBlWZE;SOwwD|w3(31K$cbX*%dOKKZ+Gb#r6(pf7Vq?v70F*@4Yw=xk8>hA z*ETn|<(jJ+Jh>%{_W**DgzRHMNj0=Qpme^0uNn0rcf!RdeiBvf$Ba%&Ne6J|kpB*{ z{#ydetRtRQ(}z~Y>3GtG}RIzK^ViO0x0YnP>)PSf}BqUMv35k_b1Ui zB{(|k9}gP1vc2}2jb;%(nn;aYx(~q#mmS9gzyF3)KZzDsfMNSzUh0jPiIXc2m~2In zPx@YTp=x!xDeLg;d+YgJhf{(<5p~=5PQp&d4u#nJWb$i2Q9khRjn%T;$@-7&pkL$6 z1YCw+kxyQ=eBC$SMNkr~75n_x4#H@y0ia#Pg3u}@|C7iJQDQTL_%Ted?mh~69ZKl9 z1F`P?yPVB2d)Co;c45+D@qo$qREC;B#sLO!%y{V_(RI;b1NPtyJ&aa1;FC zLg=r>i;I=6kSBNw)R3@NLCbq_Ajn`fYMsOitRN2**&wIkbAdP#Lh}&_2o+iKC|h46 zn~+y=kS0Sazj~;71Q5Jj)6^XJVoY1%lSJ`^^P9m)i)(USEVzmU25GFNimQiOMacB$ z^6F{~d{Mhz>hp}BIGd=lNZK7<|2?B?K^n-m5dvqqAUkjyD=! z8IHa?&lH-}`Zh|n4hKlahUEw>wHEE6n^a>YLNbecx z(ISI%A4#w*+9zCJx*Av%IWP|9V2Z^=`>5gzo2G;!e$0~HR+ksa70*wsXFZ}btq~J% z2MM^m!kX&zb$8_B?ms5ve^ajg=jYk9;mrUz4bD#iXF-M_Pe`TStITd`*8idRQHIFa z3uzfHt9fm)gMx&W4%@-QBPHHPPcD7Bw6qM^ndC?B-zT5YkS99PbAF3af}msq{{j5- zGUv73{W98T7QA|C6JZZpQ@sKnl>_GZmi*J>x_Yha7?Nf<+6zX~RD0`CU=%sc)Gr_c zDcans-YmSg?dpat9Upb5vTAX9*H?KkEzJc3Awmm45~>ZRYPc1WYKC{*j-*LG7d91+ z>s2f0XB82X)fJpq5kJ+J7he%A+Tg}S{Kd03L9(O<4af6AiS%GDikO`{R&*h8IX{W4 z8?mj$;Rif=DdFG0D;O#~i?HGT7U$dN+VvEF^QdqK=?^*Y&VxB4K-QLKjasNlwsb*B z4!cIH5=LPt)SS{>s5lqjLI~`86UEg$jmQH2w`jN7&;VAPM;cxWEIb#*9#8t##Zf)W zz3A88mA=U|-mxClMQsjNme&K=ViiT1zbUQlzaf#la1>H)W|HcDwyLKjkd)D;P7P+> z+U(#Ly%w9B@TRwmzF|UhA>o`x6WLN+a^zq;nrC>f(Uyl}ZoHCUJt^TDV<>Ml4INcg z!pJv5uE56e0_;FMR{lv@VYFh@n)%H4Z8bWNnw`h{EH@M;ESQWg-p53=%wmr`9dSii zAxs_uon3z*{WfR$z&>b)TyENaVN&2n3HilU9r0w8LW96f_vZylR9rrhI(JD~L_CAF z*hPgki>r`*lMDI+10ZWM#S8vJ#9gu;nUHKH;`{Za{-{2SJTJgnUK)Glqh#pNr+J$JO{%0}jbBNcCNwV(Rd<%alYXwf19 z+2;!cW`2(_K3s(RyT^jGZohFc`>prFZrKVfGAU9nYyhmQ46kD=Udw$H3|{~f{9`c# zc=;vRTu*)XGe=1TYCQcQfy2^JdSJe=x&~vO>~yi!mUpVT%G`gm-&T+zF5cZvrPK`S76_yvK79#5eqKTmaDlAz=R$fgXXi1C<;{-2@_iaCB0` z8=VPVlRJ^Ah}$T#W5*q$qgx=C_{eJZ8n)LUZyYZUeIl?uRdt_f`UaHXk%$=v|;J5 z=*FqCCcV{ofHbPt4Aovq-7WL&lu?ORa`V?y?GG;Lyy&a6 zmWteoBX=(m^Z8Q0UTG5CIC{1f1spd&;dsM|NrV1fa#dAZ{+StKcNs*eaGJ$O3FTTutq2@JN<8#?^!tg#Zec==|;)Uxif=67U#Pw#x1 zms_hzvr8tKH>*A=G9EapY=3Eo011GS<+%%ph4A4GQk14UT(;&0`UvAWVOwX0$|>i4 zJ5G3w%)Rb&m&656Px_e#eTw4#vhU6a?iIYO7#3d6nrai&ehqihh6aL4lEH zJK`Qr4D(J2!#5mMf;_Rx#NN9usg(xvUe^7LIytc-NKQBV&_ZxTkvu>j_0S~d+5V%J zOMAhb5+059MwHS5I6bUB#_wIV$h0ZCHBeG9+a@@DxpxdzX!WXcBKdlVF{|S~bSbKz z_7%&;2eullJ{gENsWcm1qNtVPTCfux8j9lvnIfk*QHxWP@1+@Fh?#6deXG|b?>12l z>zgJDDIX$(rxH$6j80c5s!iFEW*&Z-({lOh*#o3O?n`Qj#?2fFqG0?p^tS5Do7X|D zI4n6xW{#w8H{VnhVbfj4C)d&ENrsWWCi!(~whRsjT(-UcznRv8$Au?_q zfj6gdJImL7d4|i2ZL;Z$Ei4yRx!#VG1s!VJ@AC52(r%X4#_w+Khpk)l4ew^|VKXs$ z)35x~Mpng#gM@9!p^x6H+B!I7=rxmJE}v%&9&f1JFr)t%7Ea=zpW50w>Dw`LBvYsR zDwQcUZ~5`E;J9wRR6cB2`=cybVoj{ziqFSymz>_T)6m90!AGKtu$CC|(t>nr&ztD% zuBQhifdhB5yV49gtUU6pMf+u`LfSd`l3c&)#79lsq}H2&3N9`*pb>ROft3pAE+2qN zK-Q^H?tHNuyLQh5WW;>!E*)ypQYJ14haomk$iDo*g_Jo~_}0XNG(O-BhbF zT9|qy2j(am_4G4+mlVZepcS-c>tyeugeg%-4rS)Bz-;LL#cB}9Jv~GoQ4e;!MQ}Tt zaPA3bQ_u8ET}CaCc39@Ee^w-0$_o+~%Krv^pZC2wz3wxPr4hh6|0F_t)w2KfhIW`Ew_AhDyKD7!$UUr}6{DJM>X^TNJhVKeoM{JTbgYvt@;W zHV00=0oax_j}GknOcSo7iEwp5BwIsOWMdk08S#A5RIy`$6lNUPwiWi`Tb1_F`lKOj z^#0&tgfhm+Cz5s8U3yEAOh~k;%FArj!MYP>BuvcR>J#=T;RHewCo&c42c+Q1d8U2V zvNK0;0vZ8(s`;PVtUS^JNqb$>Wt}dHmmbQUeY4Gwef1fwb^tDctD!y8<-IlL)$)k& z@ca==)j5gQk6V<%1a@5DG-bd9Gsq2+D!(@JHM|-s>p$Nsd6(wv+xU?@HV+Y@J&16x z|LI`*s{_;&P4ZzPTT?b%zBkF#LujnXX0VM2e#QPPAFrG%^voGrx9#`tu& z5_xmgXi`lZH)HaPH648M!Co`GsJp?Q9>~luHt9auwzk7MjuwC{Sj=S6D?YAfEW{yRt$EjLCppQsq1poD;;>b zsz%ei5hm1G=Azbs$r>^077UC0CP!76ZJanqW`nAwBXlFr6E0f!uNt1|=P0fSA6>iQ zy0_;NhSG6OupfCoTM>J|^c{?R{vMSh$yJS0C?0NHr3ymaXSmDrp+jIvo_jh*>@m(i zjnHFsI-$SG@dwVRiOx6G%Jpl`*)&CyUV#mb#d0lsL6(;CAo8~#MYZ3CUMR%4G^w7! zYm{R+n&pRt<3SL^K2)4bqG8}kUqeR}Hcl^E)t79hJ+);!vPY}L`))6r>88081KN>7pAI$vv?tdE^RkiL-U>Dg@w)e+>>Zgj92 zW=)qDkDA%d(Va!;tt_-*!q@KrwD0(pR*o>ND;)vzHB|hYzv> zE>)2{%PD#uUK3+A!$jZ;j;Kx<`Mvabe7CfRy*7Vv2iwOMs5W3I+G~eJyOI?jTnpSN@Q*20D_fn? z_7asnrx!k4%jNlOz+4DBy<=)BGCQ*UFfjo_DgyPdw2QMvcK}&8f06DJu+8RLy0R)i zgPP%|LpuvR&Sti+ZD-kU<=V|f&9jsdeM{~#2xTGn>qdC;;-B|zI#YVR%AQdG`g^T( zo-y|6hAUC)c`_-gNnNj@Gmf>-6{1~4Lq@4o&vNL?1 zKPI5L>x9lkA*acWrsYzFwnoJ%S&FZg4-^ zP|c7$H>FDIE`n}Gyu&kE4!t%@R$|WX;A=wgH3bXzbqIHEb+Cp@NK_Twyuli~${KQ8 zEh$na*()c-^ulW|N;O0G0_y#gef~tmepJ$W#l95qBmyzehHkP^u!MRA-X|Dcg57pL z*yqb0`QUTDZ!Q97 zW7DtPIi{;yRE4}w5Y1P4D9xk{-2MG%+ajnzaOhWrC3+HH4X=ad!iK$G8a$(QhF*qc zYKTl;kaSc&FS=9WMZ-g!l|NmbuU$kzC+B#Jxd!y3`+Lgoz*EmVl8l;5^<^k`&OnxE zNKyc2)~|Y|oYr1pE5?-YhVdAG)=wY8Rn=8^R04?F3H5-fxWs7tlgRTifUtl27mwy& zzmBt>#FFC-GH|n?U1soRUP*F}wU|qr$&~}f97U&_518$FW9TiPn;D#F9pAy~5SU;R z^@b;gi$hN>X;wbyNFPfZwbWp`_w1=yKK3E79SSl?!I#8nqk4hNtJmRS=8*VmFZ}g{m7$FF&AB5+Yc1d%g3jOf|w?ekHs(l-1Uok=2t(xLg$;(Iru-sel;0dA{Tr_(4G5UKL z@2i7qM_p^W=izg5vA!`*jO%$@)!sMnWz9KKf7bkAXJp0Xk(Vc{v{eNWhg||kV_+Jr zUkyDR^pe&YPKFHO$8*^rL(%P$CSP(7_X*Fw?>N9r^Bt%XjLD$_qkJ9h`T-*uTftbwZc^X`aN z`tnFgPikoDG|64PX!U@nupaBrPIc;y#Bk>Ni;xYqVL;M^=Z%MTcW6BSPTH7QI_USl z_{grWv9a`Zx_=J8u$~e zn;9d4zl&b4$x9&!RrRc`m+)y$s`Lvl3uYDU@ep?h&&PDN&A8S%8(xR zUQZrd?SM0c5f-qiSykHiC159BoQrq9XM=85HFoG0Z*l;;cN;VHS(7kU_zl{S6{OW6 zx3(3^7Efp21i9FpX(OIGk)1KAaNxe~#&%RvQquWYPsw!1mR3(2CHS;cIo|vFh%Wah z*72y&;SPiizS$aJr!1KjM@hxx;yi2v?rbwH<&{MxRnGZn?ANTj5Y$)2>H-%tvY{;@ zdsNG9TA7nKn_X3kFdQ=*@t9~?^gQx?&gKHVY11;zbe!ou3l3b9YUKXF}7RRrP# zH(!OHgtcm7LVduh(9_<{eY7%M`BeNdYOEY}d3-KH)h795OZLT64i%4{-nwnQ=#6g2 zSB-)=$gga1K~IA*&l!2b-6j{-U4KOlmta)9>Pb6TqI~jT_E|d0tS>L6R4+d3WM%@J zqBiGw+Ha4DXx2sMCW+lCvtX2U9VRoEgG;&q_^USLEWlQFKRUK#tSr2l{sJj0yAc=t zDaS9jXq#Vmy?CbYky7!hqC{dV8>CpZFVnQa4lHx=q%*e{o`$uijTc?&IYD~SCM#TF zMlMS8?E7=(CU1yV6h-F5eNgU(RZP_A=|g#+uaPQ<41}OQ??d`E&GkN+>sMojx&0&C z%$jW*c0V6RA@HpNG+vsFJ$yzd_=Kg9z|daoDfN&~K3HtqTk#+y-0@N}tJ{(-0gLSbMEJ zgGGGmIC+S&ST z8S3a}+(kMQtKO<^iqq2G#U_KKFbERxN;tFWNqY96G=m4dWYcyW4P&i`6$75zU&6F0 zt9YTs+ItxWJAMa4D>|S|^4Tg-Z z6dVgW)4}c~IC&co7#~_O(Y%O-%|F3Uxof@uJUt+4EV+Z-^L(q==Pe zIoS73hoApjdeHq>dhp#Jq|^TGqN$EQFjt7(L4ms%AWJzy2=hG4*8f2#c%u5Hcc+9} zP4gOX1piUjPV^g&SjVv1G;$vX2&iz~Rw}g6*MD3+!FCckz4W)e zrcW40$Ud#yp%uB=pb=0N$W7}*E3Mt8k6rl*LI`1`Kki6p5HZ8-%)2$jJEvOF>l@gOF)SSD&JvJs3dT%An%i~3PPQI%& zd$nuky(L&qKcy^?Q;Y$!n%muYb|avKIe7=a0kWgs9Y9a>a0wDW_zIqVb#i|XmmG0q zTn|(;7d*&i-M7IEN4Kc%@AW_>vY^vK$9kI52PBKm@&^UMfJp)mpxpH%!T%(R*%A4# zZw*;#5hHjIIH5xfkZpp6{h#hwL)DpenVHEzJXbF40Y>;1-)4mJGxfFZ+n7dN{^}wdGC` zU1d0-zxf{Q{`_W;8-N^D<^|M_a(O*Lj3-`7P_7(9n1YNv;t{4HfTx9U8+X_=aRRNc z4x{)!s)q5b@~}y@EG>(x?c$s7n2UKOBokHOOL-Et zoh|8uq-p_d0Ir0i-pDrsHVu+5PihKF!e@4wENzo2y`q$@c}xoI$ZZ`Au@d*C(obI-h!d7eLe;7b%Su)3}##_d08e07x*B*-`%vb%x~7lS<$o2DR~u@BI+=qm;JzqJCxNn z`e{UqBJqPvEDUN5B~pe9+ooBgmmi`&Yl>G#WmI~mN{2BNj>}ka#MOM_z4%dxnKh2y zM3jefX1PitPL)JWG{=KY);-ke&;&;@s`O6B{ygq$u0@~e@E-Z?6Ut2NsJ-vGf;?wQ zUUYx&XwO9GA@8nw^+{Q0BKnWd+XN3I2VtF5W3D{k1tqy6v!uQ`rj zqsKgn0OZp~^&qYmDqU7jRsU?Rfsb>$&p{Gvtd29ORu>)JT4QgB+s<)^4)EIA;;&yv z7WRq|PcDvI>s~7(^o88hP8+luF==@BiH$Yk#^)8z5$UuKDf4bGrBjn?Z~i3mtw)cy zf?WLjof?^kXj2qZQJ!MP%4GrC+LC_MkGrCYg>wAiu86J5bM!Ypd=cbZhMXe^uNYmb zy^iZ{*j~C)%UF!=3JDa~TZsb9vP;(N=(YvoCkISq_SgLn6x2ghDdgB7Z%(| zwyjU!{p48jQl)-ZXPa}^da-{;tHT8Qp|sy!ekLB2M<~Y`CQLS6usk4-^1BebMG))b z6S>W5!rMkMa7jYgXZFrpd0xlB-Ao5FNi42e~S({l!|}II!I~K*s=LJs8;>Ds4TRiyi!*--lW5Jy(~K z{Ym5zc4q4C)omE7+#OaA4=t5q3v?m3+DB+SYRljnAvCFAe0Elv{0tzL9J`rR{ec3-+s5}bqO?DU2xtC&bCCj2$ z*JFn+-lsIxTG4ldHS*kQsVo^(#-Q0%^(}Nx0ljzhE*HAi$--ASzmt?-ZKgCtcv4D|o@z60evv>NdQ|CUHu55J=yxg5b{qO9}*!E&?Y4 zWP$BKD1Gu7P-)B_26eVy3^MdB?(FJh76Fd%MC@&h zM(7&^;A1Gwkcrzx&QMZnFX;|MEVIwJ`Spj*hAf=qpQWN@F=oh^c*>3B(!33^04@Tc z-yM+u0C>SeBRmkmiUxh(-o1k2E?oiVr~W3T`~e)TJj7nM6AHzZpj*{(?>KySZAl)N z^gG*=8Y;WkiIB2n{CLREXI31>QF`f)-rUDXv#?6f4fh7fx|j(F*l)lwPvF0QHk%IB zxI{!|ve-rD3ii|HNACDaO%!ftI&+*`Ap&{I@e6|%dw;MXZx$DFwaiiwWuE0V|9#K^#o;4%8;F~1Z%&JU9S1yR7II;v5MUTm8h`sc4kuQ z=Oe^%+&6bN@oa=k04W#`C7cFcLNfrJe*cUbiTTOM6|41C+XE*0T+eP6t=;Lnumye5yy?rs-KB(!I1ss=Eemnpq=Q=?Wgprr^%hUEw2jQe zO+B*r;`T~6#nz!NmZN3a79mxCSb@imFA{V(p)UaF#U~^#t5+`8<^BU_-6C;rp7?)# z5&F9&R{|EV36Ps!%E)v1!;P~queKiC--C=uQ?>d#`%Uvb*H@rU2$t;lG<|pcbLi97 zlWES=G_N|+{XQr1KC{JX14;WUhzWt1=Q|1))x~*K9oOC*hS5V(J#PLpKE@!3VAAmO z%fn)H#jCElD_citgqNqUM_6ivTyv$m|AqTh+k7am&4|0$-zzwbu7qZOpO;>oc$!i9 za+aiL1sJC-iYZ_+{~3xO{~IBMasGVZ=OdC$sv#iK71^nfoM{pKk+Lav2Q|0)t;?X| z7oOzVyG{Al?h9xg^48_~C}!|S+vO)}_S(_vG2IT>B1R#jP29CcVf+*ea4y42T^ z+QD-rQkRuDcH~o(=A(zEALKeOMAeF;HP%QStPnqx=(o;R9G?tRhgvJHhE|~c$OB5l z?1KF$v#7zZ8ZAmHK`Z~+*#2SCc07RMH@qm?#BSb>3H78n>{)!6w_Qh##UkA6+yJtKs-e~JnK*l@l?l$0zI9sO9c=&ldW6!U z%6P!=6|xBn6sf2}<4O6`+y|k5xrIJ+sRvf#JL0ViHQ~{n`zPTer?lXgaBg~~80U|I zFbUntp_jR+8*Z&)!;^LilaI;|bpt=WvoL<*-{}3JNXWSM6Gp5tLsEGb)O_GjE6ew# z8H)#PnYyMg^7X9*o{#U;CO&(8j>dMh$|NE256k`!Q}ZJIfw(|-e!6B(2|U_q4v;gx z9Yi-;(QDwGW>5QRl?)6SQF&x->-LBkuw&r`-rM#ffg^}K`&a%dBykeNejMkCwr?T6Ab+<>|J5#} z(ot(p#;7B7HuoV=Tm<$x)AgQenIw3FEEc}LNo+-++?H-bwjZ7vD?^p;H@^BwRBY1z zt!1*-sdYf(`(G>x-Nuntb2Bk@BdT6C{l7l#Jo}_Nk3Ls1(m2+NSNe9;>mH3aJ`dp` z4F_;ap7KG$fB}$R(R?J*Jb?rqq}tdQ1PDA4>q=iObwfc1s=k$#zF!@vqEC;p{OUl( z#HRiE4Cp{b8}ml!0ujBCYJ9Bu$NZhoX}e2R3BGz!g9r^d9+jNE?z1D^>A1(T`IYJs z0FJu9^4eEnPyv4yp?s{fhcDuGSpd@R%jJJ>=aX<;;Bx!}|8G=84JwV2l0P_QlQAmq zd~Pl!Bd_8>kU6*4FwDOL3?kJO@_@(+RFIGYy9l}+U1uT%cHs=DbbC_($A}E5J^1Ew z8;-jt30}TK4h6zB$L@k9IFDKC;X6bCZA4!N4X!E!I15QXBmd>?pmOE+_cxHG)*=3G zM7R)247`t1U}M*5gJxFy5W-~=FXVJKa3wV1rr>c#AS06|qgcyQfSH-BOB9tsR(=vW zhi*Eo8(B||)kFq&&ApK7sHgwN9Aq}fo#Lam@}q7K(Fn)MNP{Np4YS9Mn!O#j36~%e z0L>~|r^kAvOPk-^lbno3l$hvhmV~K6t-+_AMH?Lvfm%I0F*yA|ORs-v9$E5Uz}BBg2aX3X zXjbJ+t!8@Ve>{L9Rc6M(20`5&h0Z-mOu&HPs3; z)?pc0*K;KWOWO1B>C>PEA1TU(a8l-PwEMFhUeG1OekA%Lguq;x#kE~KQ+V45cUO`M z6ggpmoqqG-7w^8|+*IhnmEukOX+NN#oR<{~Q$<~o7^bZM!f4ltX|4%UdmqMz4 zm0-|`9V$x2xjd*G+RgSUE-aE^EriOdt=(o#AR-EXLBu)?YWDGuFkXS{lA}1NQp6|O z!HTK@Q^QWoroxwRi^khmT~Ln1=CrwFysp{plf%Y6jVj5-G~GH$)kp%Bs=v{W6ntK2 z5`TOYKc3M#qBPonSOzr5FwkLrM%*`{c3q=R$oL=K)-eugh6Et^$eV^VnOOR(PtQJb1{N#+ zs1sVqgO$1$um!A^tTY?EXBP+;cff&=+V6+O036SYa3{+DgK@}paKXsbuh^HIvY#dA zmo~p#y3nr{EKw+5Gn05K{#}R3s6(B2&kUYek&|nrb~%Y7awwoCROdI@wFb+|@6j`S z+{1dkc9%EWF{i^6;%QY2<}Sdly}A4C8kNE1KjF3|9z5A}$Ztwo|LhQ_){22;x0Xf4 zw&Jf7NDB;%jLsHzFWe64YvK6bS`jA0PwoQ9+{pH*73VGcv!H6IgaE6s=`{99JIsVB`sYAf)rE zI#!lm4-(iWP~zYH=q{W4C3^Y8h#J1+2Ep-wr8|>BXuu_d)dp;Ly#W%0>GIf?EBl~@ zF5&K)#psr3?Vn2lhhRwF)?R}p-W{kG%f`)i<`3qk6_;!DKUMGf?kjfUo$19KS4K`W z2*SZtCU^VY#Zq9i9r=B>UyI8$`=36`uk#Wn4mACcbz90tbv;LbLjVer+uuU72Nr6O zEKBGA>f03&el&n2&GCDXCeo8(|HcSHMz0zz;vxGa|HJWX1v6?VIch|wr>{``e&c1z z4Y49u^_D5fqcP1zzzTA8$$>XOW|e6AM7Dx?ne<}#1d<-wyIEc3YM;B}|HhdFDuf^G z^=s+PT36A6LkIltso}zwOMVF}cwGLao4oL+y2*cj3QkG0f>wJNfkpyd6@Bp$J7DK( zck}QyD11O|FgBT`xWi%B*9~(GjX=G2GGYEF(NPuR5uy!;%1I6VsMpJ8vb^;^RaRJi zV8gImrLy|{N%Z|KPN{PmtQMmI_(7x5cde~hVf$bX*?#D>Sq{>I&^ZGAA?6W%Xwtcb z-;}Vx${)x{PS&(I7^OyIk+ucph2ur*RMl<;pY2auFk)hHlAaB*us&oV@B{@Tz~SOe zgp;uNAs=y+ianJ^Zex*{cyrCWac<+V+BI@!zP~Z$2>J40r#2yIH7^}Yne@C?3MXeE zWYh7<&O6GJxxbq4mO?ZHr5k`MejWqgWm$Ka5A773*I2z9? zV}N1R}i`RnO=Ry;!jSnxNY*1|&sf6^eD|9Ktwb!F$ zF<1POho1LM8V=AuGUA?4@*Z)rT+?75)4ZcC{FH$#gO^27d9-_TeT&<(*C2Uh*9a9c zy%39%I;!!_&A_>6`6(tIzMAME7aA8Sds4V<8l^DzYIt4*bN~>9niK$|Uf31BvLMphVf4td3y!~nyHTpE$?2l2?bLE*l3(_}^d`*Y* z8Z8N|eP076T4hU%;vS*#S}v7tOMy(y1>rn_Fk8M2L%}^NnUfcF8pM6+J+8OEd7o#);Ab+bp@ypG4?0 z4Mz6Xmum?3Cvvd@gx6v}|M_;4pYgFIe9~@=lWu~CCFhm0uO1Vq^jFMs!rrRfxK{si-Izw7u*R`#Z!oZmC z;2YsD%F$)e9RLc}jC?0AR@=^O(z$CFmSRk6ua%bM_s^D>5-p30_7r~l;@Iv-{J z;!2dp=$4)2NkY5y%}|+&e!Usun(?&*7w;r77dn|L(d22;=E{-^XT8C3>Xj*czkl%&yw)rD0)>tv;hL0*<{ zrNCQh+hQ?~+aga1+guVC;td+pid_9kRJ!LkJiU=UOL-nAX6RO4e6?COO(s*f)#`F; zx}xwSktP*(lS1|wv5oUT%uKa3PY(db^RrxzdpIBG86LMTBCD+x-Gl;q;H!&0N9`qM zo>TNy)>LHdsut=rlnP6!y4PZcLW*h4Kt?1Eo$7TV-dfGlGM1hvqPS z;aYq_lOt!`_6@%K&Q3|Ko{P_}cykeyDGO+%J(oRHu^JMq3<-5jvW}fVvR8;k8-HDn zx)Cg^KB`(&Q@$NkWY;?iqRoIdmE@VrO zQBwSeRocwVkQKjoc#GP4YRO0Ct7NmMzq~+{qdX6#0E>B$Wos5rXw#^3&s>6b8TR*uth}MsY9=h!B9M+l~E$))sx4~$)aIq>ecW$j1e%!W zis@e->7p3TIa^6-8o!~(Z5h3NOn`x?*fc!)C+>=d@8?4HfS0;H?$-KGhiOj|6tqV_ z{un=wWOsih&ZQMDf2;>${N@jo4&of^8%qbu8@WOoA?@clo{ERjMX~JUVgHj{Bs8xT zbQx!$Z0O=!bH8GoX&A+*A#8l%{>T5Pf0*C;^1nvNtB@YB4 zKzD@)v!*|m)vi9Vc3^GYs|ewCH^%MGKz*T%wO4Q_dFU0Z`DS*i2}6~UriaSeuGlC| zQgZGkOj9rkIg!@8mc;YsLYbDV}?}c#@4Z5OVzb=cj4W>LF))IRidDIdi z@x5ChdS2ecp4H@;7f2q4o*JkX^6bV=UfGQr%yUlbKaaE5?D=}mexX`S+@~vYux1PT z2`Q3Os<85D-yb5hz6kmrhNJ`cC*lq!bYwRks*LUw-HTWzIF@Ekud6R=x-HLKO8-wbD&&$|Em9mnsF9+4jTB%gVn=lk`3jaeUggC-<4JOqa^Lzmn>iOjJ=M5_FNo8+;@k{HOCC2zPmXp``eO5docv*Yr2bRC zvTr&i?X$i-W{?v>2y29K6V5w!(qKY%aD;K*QXBdqAekI@G3{)+Z6wFCezEJ-*^IR4 zGt6-+UYju9lbZyqg_C>m=of1|%Kod>FZdhA_*qbUYb?*d>Rk3_nq4d~c>jaBpZ&^M z@qw=WKvwO770GLr5&wSjIdu@oX@kz7E0x5ITaNZGq{3;uZUQ-$BFdBV6&?00l^$2` zJ{(!8DXj2*62iCmmYM&_8WD72>_cl^S>MWWt<{Eo%-V9CW#ti6+H72JDSqU0oP5H9 zn2f0w%WX+M$;U-6O8ifx*N#UbHere%Aw7`mN;YLapIlOA9*#n6^^B{ihZP?}K62@N z*^xLko!ce+@?Ef@`r0H^N_Z;ftvdd!Zq!7zs%4ZY4gD}Tcz)!%By?QtS12u!tL9rR2z!L%=o*PjF5RdAXFBp> z4tyG?I1BiiS9gM%%53rO8uLC^vXfO4{Euoq9IZ za8y~r1ygFwO_Rr&!>DZLqew>a3lIT^5s{RHr>0(#0o}>&FzXW*AEuuN$pjO@@*pvo z>f*^Ty;VhYh zKEjF0q2pdbWkx^FtZ5a@Yq+_HP46MZ`C_ePW-IS5DLcPoZk0Q4z6H0GJMupAO>inX zK2Q|dK_9lg=(Gjo>8*?#=9zP~#qM$$&z{8k+R2!q&?LozL_5=YcCHJqR|&g=DR*Z# zd21r@E799B0rZ;blPZoxE@w~2tuCCE3MTR!^L>ch<%Fty`Wt;uUMVWbebZPCWFrk3 zFVMSIpXzg)_YOzgM^)G7j(hmXG|DBJH6k0N+Nm1D;%*tws(+lB>tX*XdeIj_kJp%x zk<6Lu#1IO{tD|)()uiOoVQbq;tWr%c`J*!{dOd=Z^RNG83%}UL>^#<9QogsdHnS&k zSftIm6@eYzEU#&d6#>_L#f%>W=sucQu8wt)eJ7)t?%(=Z{=H?!pt=w7$7{`;N+xpt z(H2(XOYC9y9b3b%qSY?ecPC_Kw8hkHP-4d4ww+}ut|J>>iN-y2weh@)SNPnSmnG5` zzZr@F=5iX|2!)kcmm+LSSl&j1M0j5G1H1YP9j9-biQsyjak2htWCA9JPqj%>bb4(+ z4shQ+VZ~UEbm?wMC~om^k9*Kp9x1w=X1jTUvX`N^7x0;la>PdWx)lnp`!7C8Og9Gx z?5}-;E?dg$lW^-bEAY$v$QG<6snG7e`G;2#2A?yUyp4nU-U9$OR+)sP*uq!iM$ zar!*QB58i6glE|xHYB1dsbWLMBo$b8tq>ppPa&R|S_h~mJm7zQ?}=TQewTf8C{dp^ zg1Yes84zdl4}6Oi)M#w%0CZp9(RL)^cw6)x94P&4Njwr)z7Nv zG^xz7m63R3aZ7pG)OfM9G;b`0(BuZ{^B(qcKl#WjUiQ>8_?Qn|iV%JPuOS>UeCpHY201Y4NXBe^aI|kFSy78T?q- z)lfOrFI$b**JfI9oPP?Q?{49s$zt`XcpNGR)9^o$^6Av7`wBBEa8#(x^!7r( zLLDk-rQDEUvngXYKXak$g&jze>rxaxpCfBM`RthWAPTib@VqU-ZJvHI5=C@5(I>hg z2@vY2{bm&miYU8iGARoVkekt{8%L`(HPnVcPU_2ks4$PAiJu*}1Ul}u$(<=)2PE$+ zz4Nzlf-Qv~eJU4pzE;DdvMznK!S>fg3@7k4eQp4UzJSA*2R5JGJs01{>+L2GaHq6r zvlt^ZZZ}E1le;dKk3J0_+~T;Nx`}!x^5Y)I>}E7&P;?mC`-@IjsW)?EPe7M}E325B zY5yn=B?9Tpr*J!C`c|&v_65$=zTNS`E3p|St~Vw1Vv^H4tG@wa*n@ztWevjtD@@ zB3yRAHCz@tUEXf~B_AU}z1CnA`3XXmzPmoC4e{Nkm0R8uh+`O{g>_vDS&-M)aq#H` z^!qzqcf{{p>cuyBM^>*Ef?w56?DsSWKR0@2M(N(M&Lwj5!r8k5_DN<6`YX$(z7jI& z$UNk_eqv4i=$>^L;FG))uCb_G?>9QVZr&RwOUt(ZQG$->=NeXOIy>Z12s{HR(G=*; zmv@htzrH5jtv{tNPx2U)m~QPvA4YhBXb`Cp9t#%+{e4|NIQp4YRw=}8ia1S{z3B)V zN+H=ja67bfUZF)!wE|HJKy8`R`_FvqA3cjA6ONw%bhORd%ke=0A7ZFw@1Njr*a&u# z6w3Rb>DIr$--!S7S(1j98UP_kS-EPyaH2Roymg-q;I99Q_BJY07O?aQ)`{q}6kjrI zNcwr=GQosiLmiRi6OGhUxxMbOWxXobLtIE@)qlWPuuV+o^J&mCd3hiINP;Bgfm1$!0rgOk1;RJ8q~>^=lFQnxW2jR4Y}a((7T1J z6k%-SdK%}04L!;Y{uIsz&IGlcf~h&^<_ch8e)D4`+3p_!q6Nc$sSGj*8M+z9*m*=D z7>;PF&bmB8;gL`oKQUPV=y=qfwg&f3=~aQ0UVeh($M#ReJJ_FFEq5Wb9?z66C(6+9 z-Q4V3H;n7z*cKVC(V^&4CPzU%0YGJ{r6OlNv8H=FjZx1X`eH@O!W=4GCIFIolX!8n zfyuP^HOvOfM2AFr%SqEW(|wDbmCD^_=eeT7d=zf;);Lyuk!2i>K3!?mX5;~DO=o4Q z`Nk8)bt8E9SwI9jHvp1f1;ji3fKV!=7ii6vfe3RifT*CSpq1H{Wyn_U98adTB54Ah zJRILX*sM%rg$6M=rSn9(OEI-rW|e;en^`h-CZDCre0iHP=EL|%^*oEB4NGCa91-P^F?cKS2D6=NX!v6{u+3+qC4H&n+h($(3HqfL z=K2}~Ez}bvJ{So1As4Y4$QQ?Z-YJ_|LJ4#&sP^W$hpdq5VSJ45Am1(hsF;c{3ub}k zdfqdE-#{GO9t356LW{{bOtEZDSzv-&_M8X2Vl7`g+$;yeR=NW=Y}hrIWFF9Ecnanp z=n>i4ux2GPMva|wZRvKC@rD#DWluXd9$dNIgudGLJ`2{qM{nLWzJPx+=83TH^0SJ_ zN3XZ=#c9@ve5`(1Wu+l6Rj_?!DEjKpPCLn;m5_!4Pd`G## zl#8n^HwmMQjoI9*Sr>8I8|WC)9TclU^O)FvRq1Sdkwdz^KnluaD5dg9)CkHXs_gq( z{E>2f6#z`w-BHwO9NknB$^n}$fH@Uk+kXAVpFY)hO;R&&_N=a?>h~Y6a>HH_kbIUS@Vli(Y7YR$6UmN$zIUwy69l2D< zkpRfu=jX~6ut*XSW3rTfj1AAFA|-sVrp>&!VmiKk4Kk=%5d=J)E$%8X!@#+mrIGNNY>MYJ^_|i&?p}--(QStL*#Y7PSq7C*^Y^{m6{5WqT9U^vitbUW3 ziBC&bJT=EBq8B}!(u&z&9o^>^H>#@~7Zi4N6=zshjBXA~rnFyB-3%@4d{UvsA7qHC>JZjmeh;@#*%KzfSZDbxFgsas z53sFl`wyY83x|PRn2V#tHwFM#2Pv6S72-79ueKR33m$khGaSWjfN2UpP3y zodT-0L*_$fV(N>j*}fU~CeEf6fumvpBAJ6{c>Fw!+{GHSOH&^s~|J7Fc%xO{J6?jJ- zK?EcAoJOf}qc5=CL8a685Z*Z3vKsat-l(w&L~D^)K<(BSH>CTQt<5^|w3Uy*Bh{z# z%ZDE4S5DWltuxVpV5}>ihu}J})cK+VCco$p88&(Bc_RZ>*#PVMPyOS!GmC#Bw>t@EyI$DY^5f5SZ^%L;}1deQ@= z2VN=wj_@CTPrqLO$s52+{SUl>ze`oN;R`^Ro3U%L9TZV3bli2@8cT#ckb0n1q2=&G z#vqeN{>ByI!S=HmR=NMc;!O7LEYb0QcSW37!Mv z6S1Gh!VKXQ=M6)ATcfk9B(@@OC*PB^g9F8UQaenn1jk_}wx!^a=aY}k>6FoEhl1GG zRTrO2X(w~aZGAE25ka>I1rE)N-~a$K;=4pV-;OTObJFNc2Zr5`=7XYx0U}l^0T-XD zMdpc+-qwo=zdze{i(N}QXJ6S7xWHS3Cnm6aV?~5+Z29+U9)1G&;wQA9DpX*6W4xE0 zyigPKl)mz6P9MSf3ta)MsszYs8TysqTr2vLbredSYVp1y zW4N=cNF!C%$=4zmKym`wscb7%jqhxH- z3in(VfmrxdO2*wZ7|Mhv94PeKwF{H*FGDeOsiC1T&1`EP7E*^JxQ`=l zxfG}GbR$K8&pW^sG95~|p4}k^#=pgO$G?&dpy+HE`r_Y#5=g zzxlF$Rn5<$6{`bc1(Uv@T7cGwrPBh7OOplw2AECEYKofg=fuoJOxf-BP()tv6~BGA zh@u#KxEX(5oGG}Y`xJRtEdh_^xsQaaEM_*fSr#uF%uj}@q+K=a+ zy=t>(5Og|d%van2(BUp3s+y)^U@e!ilSGlC3BXV}y`js#n{UBO`KwFQ_Pdo+O$%Hj zbi`^4vooW*v|N6o<&*TCx=n)2G3zF2q+;AtM7w{RV^%PE4uKd#vhvtfo$P!_{!cndE9ihpyO?wM)QsmwR-2~qTq_Jx}J zgQvv#y&Qh1x7)lWf16lHYiCax7)hD~TrRU?Tb<}b7>Kf1DtueDpjr7LYSaZOQ2`CYsfty^v@)U%>xM-yN1c`(WYqQ^!D&8B3=$P##wiQ!sK~@MD&XY94`h4 zhKW(IJZJ~&DEqUs+(4VL+IT!|&p%4~F(^sp^&TE${TbQa2q;V?2_;y0U98aSeSlwg zE_{8kC*7e*!D!0z17`5%gQoYb{9IcOKh768`Ap(36WVPTp|1jE2-X-7y#~&DG3?tg zP+>L(@T<4V$5kplrBj%fRbjIhl~3U?5*_NBYCp-4*eJ4oS8iYcF#s|nC1+r41O)Jy zqazke=jl+TPovc;nm@-qAM-Tx%ya&V9=_qJtgR^!P+4oBbXLEn8>W1UAc2UCs6Zxy z^wL7`eg-IfUIDDb-+A1Vp(s1+MinJu24xr&PFx*r{Ah|T)jUc_Y_#;odk}CKXz(9o zmx*d8hCUcEuzBN62>N+yflPVf>dO6VINRXo=iQY@ZV(hr-fR!)_%4Kkp6#Hm@u4VX z2FL=J=hoTrMQG3?runIJL z?jmsW17VoaX(il&J~|!Vb1L+`s52I1PI&emY^kg9t%ftBHu~{f-%Dz;-Id!$e6q%= zgS&H4`e9Z#|7{h0v34v@#PJvAjKjJQV~-oD;Y)I={GJnbf-#wITYr)J-Z} z5Xp*w_@i(lVkk}Rs9)%62{5-P%7=`L{r?~XXEcC_my5cqfV8#7^7VP%QBDkfN9uT_ zjxu(BH9ficbl>>7!?kerTRJPZ5`qV~PJaSo7rUM41ul{t!F;E8fklbY@q06^QAo!| zXC7y;(qYOZV`INe{?OClR7Pf z&vC#XKT7^EW46%gEAZ0Fe44f&`5Idylz#c+Q58RrWx!;d)+OT+pwDYFXuHXGFRQ z)6EVEkokPMyU2$Li)@3To?*GfRbZ6yi}G77*dV7Imq$Jz4-8AAai{=5|^ ztVybu!9o-;kKTok80{sG&0iyt=@r<7A4yR;Qi~;B)7Lf*0G%cj!ABU6vT^w*`~Yz@ zi+>NaWX+d(sf#*k$(jMcE3I<^gC#ZaJgop5st8D!Py}#dgs=VV;7r%?#(!?3@t-@{ zqDJbR1c=8TIBF6#9LRsM0ovjF3O=F0#Rn3eZrjh^Y0@ogt(4h0!hobnG62hZVXrID zo(TD2y?F;tiqHk3E4+WD8U6KF^HTyk|N5iWq5#5R2JdtZ$R6OaCW_2W^>3UaVh&1M z|MESiaBO)irT|#q^a80)kQ3-;_LCEPbZ;i!T6%cb+xg4zA7pZOd<*-P7q>70i2weS z0Q>Wo!vK8-CfZ|eB^7|g1>{UAn;p_aFKv`>#wwD0;)j5ui+7sCn~3901Bj4EtS9uq zbdo#X#rx0DtJ8>bfSR_3q5o(0)6eV|c${(rsc*b>=uu`~Ys! z#jGm;WCo;R#r>~8d)XoD3RgS_A&B?*lzRV0)XaDwKajY)8SRE??8WJZ8)E#!!!GGn z=pL=lKghGV-wZJJt`EWp-P#708XTj3yoM@{E-s|Jo39QjvcHrXvLKBoQJ?3hA5_iE z^7V7QR^`u+DY?PLpwh>W&^1K{33^htC1PYd3CJ}UJi(wISFY} z1VEz8H9j@PP4w7m-}6w2yiB!xnUsIdE>&RtA-3;e9yzW_gh)!cop?< zU+QJH24xJooq==u{MJ(=y;Vsj^XRkc#(dE$MrC{QrL5O4jvA zhPsomX*}x`qP6b&KemMV|LwZ`^*#=G02&D0XmLKF-85d9{pWGC-1+Ng{&ue`7xMm8 zIarYM_wLo!_9O`6Xp+hJJJA)q1R62kGh1Ra-%~qLc9hxlj=$W51dP7>WxtZ8g8*2| z0h9%T^peN+Q)2u5>jk5XuCI35Uw!*VqmaWM_z0^`_2_;!3#2whj-i*5q1V5LFG}#- z>wJ51Lo(_@UIVZh^`z1?KH~q2g9`}5i$J%}D|fq`wp;W3AI}M|e*A9E@lJ+v$3IT_ znJ-gZM^9Vs>PU3g7JV6SaxYU=*hPrqEIz=|aSmyweldZ3&5CWjmuq}IKf>s7G*{yd z8!k9YY)$mK1oCsHotLy_?)WHbAZU7~&qw&0sV2f#Pp|v7qx<|_vL`QYIOM(S_^n|6 zOL`A5&Qf%M926r3u;HnTLkUofnE6=GkBjo)phG61F|`O=zY<1^*W`DN*eG(!vH={0 z=nDuedai@^6W8n0*K#X*Bj>1?M+h0+Su9xN#N$86VrnwPs2@fq^Q@CFil)r(7gZ9C zji}-Wc9E z(H5n7AE8G$-l%E>%XnwHYc3ZL+t)2wZ+Urn@6iW`ba#?xa&BC(Icvzpbz!+>t~^W0 z2s@|(IL}nnU-ydXFi{PIYxGVSqg#VN_(@k z>{}k$>Ik|7yNzu69NnRi9pj=TR^ZT(Qc`TC>r&)&_Rdo+zF3_%A%Z8G4qsM-A~mig zUpYIBf;+&Y4tb=ohhZ{sYB6M_OOuLcfs>yQ{*@Hig5O~QZM>VY2YokctmZYtvo&CF z;oJyf2F8Nbh*i2>vLGK-L(eorn0z!Qw)~9+^F`JDY_celW$!*7D=N_UTyfg4*gXX<8lVpw^-TrJ~-&o z!;&ssfH(dpc01b97OETxu_;58<+^`z1i(?p51i`bP{E4y`FXQoaQ(cGAR`~ug-^6n zcIT^>%F*zyR<)kNuFQ1mJ zX>PjT9&IAbyw0=M*LkArR0%OR;5}ohy$EO2MW_}!c^xK0%S*6CKhOQ7@nL#e#X)TTwy3A3=dC$c=8S>Vr@aEKj4oXjT5Rq7 zkX!vcmlj8+dwb$>oDZT6A#?ogSsZmZ%G%FrCB0$|A1dg&8&1RcYva~gMP7_aX4&tW zI==!8zQ^EnffuJ>im00SOCx3LJOZeLIx#VE2~TpTL{9%pH-gVqhs;? zij3Ss|L3Yd9WziT(AbByE^;bMk*2ChZKiai6M>_=Q{8o(F)e{R5>L3c=VH7|jsp>e zP798tf#&eTP4_$1q=(T$$x84*A@rk3i`W5Q?ryWp*z@-&&Xh{g>j9IdXKU5Zt^|Ur zA$C~{iQPtc+d9)Ly7Xzk9$(`at_WbhTkc&>P9Xn-jK@mm53-6V_^Cimd0-ihtDoL9 zV1%Wa0}OM2(e-}vi=7(ZKPkamcA$mc##=^#c?&H{t(gF-c>Sk8$R>eh(y{1Q>fVKm zd`TpRVQKvasNA9HYbW`ahl$IFhr1PbNcL^}WEVpk{eA@U0$YVGww{~?5Yg4QWetr> z70ZKOmrW=zBT);qO;iDA)0WEF9Ok*28g%8@WX0~ye=+0lx9m$&NU;c!Ix8h8~vX#8$CeKx>i9Y0!S7*OaT2IN?#~=C#Q?cC2Mbtw0C<0SDK&KguuXI9R3of2V z>r@ErmWgfICCX1WlX#^hf}wwXOsZOnXHs39yBP3D2W0ux zx!PYOJVt1cc|yVCg54l2x+$by@X@Ukie3`Sn3DTVql$hm zR!JFs1?dvu$`U5p8)OHRZq~|!*!&K3Z)ll^1S9Mj3RneRAf$AN$=%v^-M68PEDqCF z5789m6BDREL!TC!)KTkX{;UTz(FaBQ_Z+*neq7_ZPO!h03e9oikj+B8ly$IY8QmD` zrhA_t+;!ngxzNrM)%_>WtR7Cveg`PS-R7(jr8VWzB%Txy-TZ=26pEgquuJeqlBWMm zP`oXdID85KN>Ys^y(y!MY^mhn{Hqr*-UfRb5=bh;l@#@_$z(&Gg`SiT=)*r zo+%TDx0;-8S27D9om-TFPlMYVV3-;jiiq7JW-s=9d&`q){8lddo+U{ptfY?8Uh~dimE+c_#=VGbFt}$3!3{7Gf ztS&YBRjFH4f66e)*@7=-!EU$|W>flPV=mSgTdqF_gI8N2P1RA$-5!zp+w6d|>bXR% zMUU8dNB-o2j~BcW>9Yy(ZM+o9ybx)i&u@)u(Y;7G4$zWC0mH0`1|SwTsbaanGVj2` zTQztlZ0dJ5D%{*ZgTv9?@NqmL15via_x5xjHt?C` z=l;H<2dAOFA6Jj53LBkFUQB_TKAYbkAE+qNQ7nDjRr)|q zn>|vc=(`e^^Nm5dF8(!63+Q1#FDf=iCi~}id2(v`_qsnjA-v;Rka}_)qM>Tp{1U_f z`f(2@bQ&rF+SeXS>DKTFh%K^=Rn@I&HA0I&)w;VspIdSKZJ-+fMWfSAPW^z=Ew9_f zgnaFH$3Wgcev>5rxkmKm2iAxfrAyGoIrFjOA8}qYZ}7XIG1&}%Kj9=RdklDi!E{w# zzJ+Pr2IYDG{F9ojjZHW06msMv{*33BQ+WC9V%*-xmy07@$`Q{in^b3}vUI-VItwOiN?J2$C)|^ySm;Ey>p0 zD9pc!&}r5?DuQELffOc!;9?p~w`kh&Fm`E6PJ~V!b8v9?kOp&`&oFEHX)RQE!9k_g zxi3nxO3B-rv566r9WJS}w7@}_zatCtE^}yrN7m>t%~fj$fHbS3HU=asvV8d*?GvvT z);oF&%aK18*>Xn^f?mLwF=X(KKHdrC8|9@NiTN5rA)bfolnlhW455m@m%OSm(xYft1fG0n)5MISSRg3{fWCW_HO7r?2I{ZDnVNLu zI~`={nP4gt`_?R`1d)5q*yq_)xFCo^^3Y4DedrbIe!;NEFp zQ3e>Qg=o*TG6RfZI{CQTQcJqbv|)Z*ZPCw{Y$+Q2es9jaIV-X)|E;FTBZ0_RF5R10 zFm=X6iHn=~ynrdQB)xY$yw0v!k8GVUG{-Ji-8YD*m&o zagx)p0Zb4;`lR?n`9uPgf7o8+>rN7c2eP_A2iYDN z8u`mki|jLg2E;&j_mEz5M?F3x55J~w(`i@W;6wp?j4Z%87&*7f%X$^ZT!z4i5M%+| zhlY79ei}2nEzV!#4wdQRl@dESJllTc^@gM61@3v#l0OhbFnQb?bCBt!%TAE*hQg4C zbnfR{68!C%-@j?^C;&juvH<`aA4$1gj*8zJhLc{k0$2|{uumHJWdLEiXAK}s)BuQ? zTQke_k9!Hu2pBP-H&CtTNLS~5N)|WPdDufAPs-9csj*1S(~iSAoYv?%(LM8)?~;@0 z-#ov1&u*(Vk9hxExhPT57N?4FCh=go#(k3aPodf8`m zitMhi8hyL#DyM=Z6be=wO=1Y}w_SO88uVm)Bcb*EVa|Gbdn}(a^<XW!4bdT=32z%=Dlm!k4QF{`trVk9XpMBNq|)f_GL;DFh(Q^63Cy z!lRvQlFJwDUmT;`eDX28J#0i;Z_E}{W6b^=(c`(L_|fK%1W~)O#A&6jqqp~-Kewz? zN){-QLe6fLLYz1FefX`#)6hMg30ZZDgkjK$`!7gI0)Uh#0F#38hHd(ciX%x3C}#e8 z3*n9@#+sd|ic*rm_|sFZdh_sTgFn<-K3(_uA)m^lA0+*K^BVncXD!~%G%$uAl zF7k=VAfL%a1Ty|0v>1}bf_oE!xy9G`Idmwz2e0UOA)yo-DVP23P4|OT3z3w^RQ?|_ zuq!6V)&+{ z5h6xZE3sSvU+UR-!89*_toeDz+UN;nZk-kkhH#oXm*$y@ZH?N-$&l+Yo@F+?NJjRA ze5|PK`IqWa05`oF_IHb8g9(?jxkYoP(k`r$O81YU`t_$yKQEKxggPVb0Mt+V;kaw+ zK=UYu!*kYhslM{G>yrjFP3n#cb#8ff)19S}I1`}ZTD2IU+kt<)n&8lIznp2qMHs9q zyPX$~zeVb4Tu!q+k9+ol&w5@i(7LV(jzyZJnrHO#(p#||Xy@dSIu>KRCNYvV77F2# z7Q#WfSfilxOF^AO)`mEj;$2T(3dox;O;X*ICO5M2cHzdxJQ1LvvX2uwu5MqFbf$Sl zeGWBo+chWpr%7$*ACe0n!7hjR%38`PGr}4{L%smk@>bG4eKaC3#B^pKRZyiBGvDXluMG!ynTGEwf9$?hS?l3Ei0G{=64|vK?Kv1O#eXmUp$X6a{Y|4AWyS7JekGFLm^8j;~-zaj*7>+qY=n}VLM|O2@yfMI)@CwClY?*^1YGa)SIIFy?w(2E)kqj=o zdwaHC-WQg*PRAu)%SM|P)MvCe?CbRuW}^G9pU+QxL<%y<#j(`5owooJ6s;0(7)nV^ zKQlA6V^G~am$y+@|12PWB>S~_Q4~?teF=!`u*N(pp=(KS`wnpt*5TRcAGf;W1cvyR zyh2hfd8Xfv=Bs#S5YDcYrQIdppq_@4*TR-}#lKE(iC7$=^U3Z)J1aEzlnAg!JE7H6 zecoslOEU2tjn|^YX*g|1uJDe-|1zHI1lU_7UwG*wWbNq+oG@zaf~woL3^4b-n`{w< z*>I@G^S&n9p+((%z*`Me2ly)YeC?03cMfJ>SiBS46#r7}hPSJhc;03|)MqT^YPHf6 zDAs@?dfPbSD0)&;vgB(B5sQirFbVEK!N{@h?wDeQX{qAtyDV>KrMAr^8Tq%f$NFVm zob+QQf)7?CGY52n6m=iQXNPK^Rv?bDyopyi0K3=N#+LRk3QLN|`VHGG0r7pq(B4Z< za&kP^l$9ntLA2}CKCx`SH1?PDSx6WX^^d%7ir!z-U8CbXUx_;Gvt9TFx5HD!6idH4*@y8)?|JP~h{Kn)@38^q zswsS(RB@6?dwbn~AIo*TX|*ek07n-S3^yJLgNf8LxAb?ECl0vO=1c zI$CK9zAEWw362s4F{fZXr1m@Ks}n23h$t(Cra_weG$V@3diBv#AJKKzDJ>td)E#qH zVotnVuzNms-^5gDX=%Nrz@{{3Q7<p0?Ub`g3? z#Fb@K;O_C}T# zR5gx+T$a2K{U_JY=B17~9%>c#C0JEIy5dW2XZ9d7Ea*qjRNsDiw=Th!o*mw?2e9RU z#STqC>#qPyqChs9=i$4N8RZcqClb1_w>`3Pmlt{2=+144{P8UV!vw)*(>ITBAs@%W zI0r)esH%e3O#X_U{C7M0Kl~rX&-fW3j1W;|Aqc%Oqy2MXsRtI*OxEdov7dHy1z4*(sfVYTbO}-FOMW$_W`QX3>{Zm zI^K2;*W8c&4!A}wH(`xsIW`9Bem0|#dpZ)E+E|k=fRIK6TC6lW^GGUE{8E6t?u2c% z=A0ced1;STREzq@n-be%im@Q&)&F6y|3r!?{`f70;=lWBc`|(Yuyq^gOKw}WeER)e zkn*ShZi9dG|0o7p6yg00ga|+kyN&pRtRQg|D@4+a=o~p=^~gRIh>DL}*uAfO6-e)G zEP<~HRR5BpBwoetk-F!EfMph64!zO;@lzDPt5N>D&;EWiEuTu`H|c0k{7FpNn$qRmF)h|qA)js$!dd28;A^j(hq-)`?eZ}Wfm)z_pKdc?;Iun{*czqRfs znk!QREOrKh@2}I41e}HhlR_tsfH;JWd*ONtZf<)1K6d27C!X6+6CN}u)T)Zy05Tl7 z^orK-3OZr6sf9DWj`sFUs+5w~H8D}L=U+$Fo&S_WMos2+mj$@=|KiyF&bRyX@86k~ zznvY56-zL_;WX7lOn*-m6(~$_9eh0gA#r|r-sRDpK)8cxK|(|7K;`Evp)r@Sey_;OtWlL&X zAqjpxD1RHs?Q__hNHF=1>)(q1z=Pf$W+g8BpzBVHn+9hNlI{|D0Qxl?Q**nQ2L{8 zgUFAgU-FKCfr{tLqdgU0dji`9@=c0^^>MOgRWA=~YaPYPii^~ob2s&#dEE;tg-emi z=gN?uh?PUo5@FTaJ4`-_$K28n#;^Kkl$1m;c2Y{-uus%*rZOT+)KxKmJj~p6!;K=6 zFBv#Nea~#(sOXXX<%rxxrkSAJV^i3BL5W)Xvx~wsX^v% ziBx*d@UcuUjWG1(H>R%2X*hPMvLMm_t1>U_HX$D%+gMGte^{TFZiui-q?6aF+GS9+ zae*Z8&PdemJbB5lGgevg>@xXrhH1k}qzwIqPDeKk_dOtBXrs}ejl=t#U_;{@HA-P! zlY}YZk3W)vtz-9y7KEb`!bUeQ!`8vzmcpSLAquAG2m!rz5%aLC2nFEl@q$tI3spLv zu4b<~rC6W&OzY_wwthQk!u%$@H(=-T6cDan6S+~t+ z8U2}FO8x5k`I)%gb`&6mb@imBy}gAf+kP4XnUrjcTStg|N)--zUva+hHTx~feZVn~ z=d`#<(y^52atcHbA3#oJZE=>HrZr9e4*jIQrnHxrgUr&e^7y@*TUuRikt8VMtd}NZ zWEaR`+9=Ptd#H_`EXn#YPetuk#u>VsQyGz4%i{={`+9epy9+eSDnkTC!{!F++Nie- z_u3(psq#{ykGl%zX2Xn(*aec>$X;rFn6a3#no;w$7uJO;h$i%Np4CuiH#Yu9hde|C z2Wsb0#HDtF%cDTFL@-Xoq!o({fk|Tw7Deg`v&P^oV49+E|C#8*t58rCv8IO8C!ojK zJ^fVnG--dvMFbC6V>mkcE9YMFaew$u$6e8)KW%HwSXVMqkzZ7gHIMJp#mkSWzZ(7< z0}*pOOodPc#40MMLd#$}IJxY_0Of5PC|ys!J9qWVheq$!5m(7-zuCs$g*1Oqa_f`i zi=e1r&!NA9rQf2(N@G6M2!)e42#0Do<&q0@FYyfl`|{GF=LTZ0YEHe$%~ZJ~rGfBM zTY0_D4FZoh$p?H?Ia^Xvuxo~HimI{@{HUs^9+AQrVcF#|D~)R9YoT#cXeq)*;H?Pv zviMrC@ewenP}BmTO(-+(z+-fz91CkI;&3;yM?+iu&cfS#!fbXcL%+0hOZd!E2X~@y z3Y-^Wb#8)m&7ncO1h(exeJ$SR;=3)+q#9_MSbqvzFR?a()hqDHU6A+n@}3bEm@3XX zs>yy)f*cV2XTLtkK7%HlS?H=wFHpW7dVfNeGh;9<5wbBjlk>2|nV%D(K81OznsfKE zC+U0=W~CP}C?uGu;flJNq4!J(Mz)AKP}olQdz18%1&elWY@$pLkL*RGGx>=*AyF(r zApIvep@?mms`sK|fI1Cesp{jpEs9c;?uNejlJHw1vh8Hlf{ZGUHL16_ zpRSSwzACB66+v^?8LYMQEo)-eI~IqV$9fX0rN|F01YURR-g@Fc`GX~NX(UFWJjz2N z2r#nmDOy~h+2FaA{V>TW)FMJ}QWS$6jXho++hF)WnK(zE9J$wJKPZt9b)1A}twCB| zT6&)90`w)A+o3pCj`(2)*pfR$7?!C&EU1;2DB17TK1Ls+Wz3g9R*o^fZaE zv{XLI&}wdwLp@%XR}3q$NLbNEGCdraF_no>R2C+z;8qrQ+UJCNl{s)OJgNI4epuk0+t-5xI(Wks;ad%>V!RoBWU8i0!{mzZ{31ExZ#o0rFiOacL0GPY$FP6^$vE z{iCg`uWL0$nzFQLDIj1QRO;}`Xma48ffdtp_!Y*@2Ykyd?FWcrWuek{DJE)H^~dS zHD|Io*}3I4+L4xlY3sd&2n1+Y zRlSk2z^sgs2%Bg5CaaxdoU*-fzak5x{+L-?TR?Csh>S9e>`ZfBeK|qfgO~6S@Hjlt zB%x2}@u>+5n=R0!R?-P3=yr5`2+%HYCHnGqi z;*IixZkJyoNO$naA}ecfagoo;R6oqA1vsUmaI>YXF97=nNxsio211ZBHoNb87BRdO zEf;2ddQLFht-&6eMBUpC|?_` z8a~sJ{!owb^hVCFi(xdLTc;~*x&>Sffdpb)#ny!;t~e2JM++0SJlKQN`aD5Iqw1>+ zSd65W{EEiKg*APPe>3Xl$HvUGIBHQXrSw&Yzs4Z^#)vudx4-FSQGs+YejID)6@q)2 zkBE9R7EyBaW=-Gpu5)gZyBy*BbOon-#cU2&#hqanhXr~V#bRHzsS;=rA+HnP`DPee z7!A4gl;!5E%U*u%RQ`aOTp9KqU2x+q<|)0qJc{^Py zqM1jDG0+c-*t_PCzl+aJ{<3yc*?rJ%GIxex(1A~XgL3ikzXe4N%PhV~!IgFl$cd-S zbZqY$MT+ovg=kS+L$2n~i#HQ^u_pRskAgoEC^`?#ZNcW#8Ne571fi#@?v(O?@0$z; zXQBmqCPcgM3VfrbpWgX?EqU?Oy2DSm6HYhf&_He67l{(%)N} z3pO||R(;pGc=!lMw>DA3>FcrK6}L^qx_;1q2NVx$#Yd+b5EX(ocCus4(ZC1N;rA%{ zS{OtyB@17B^Bz8>O76%eIDtIwHk+%bK83u%rD1Qw$JAMCa2jQ12k&&2+&mw7_3<*; zO>y-k!P;yn?HcCL8?9D+|17Vfzi)~| zeBikU9P!72)vW{)ZetH>B#i(fYpC?;i1aD{2B6tn&bL1W_$Q7eSjvJ^BxcX%>a%#i zxOKa3YUx_~VXoGba2E!A=3w0=1tkGDFYWDB4R&b0Q;{M=mO zbkFj(jUqd>$tzw%!KcvyW!WqJ?s(Hg3Av{nW^&gpzuYCOvK0tA>wmufuQ7Um$DIF{ z_q@!301g9Myg<0>ws@lDWlgB`sCayl4Gi>BIaiJD+n*kTo&Z$&Y-}2l0f{}GZQLOW zDNcPB5_Oq5tlio_-y=!-=^Tgx1}7rmW!cWr8V^$q_$as%>Y?*sx#yfn2b$n^h5wgi!JK3rgY@FgFV3K9A-(4%FJY}3Z=-`?%9PspW`TX>Vzm# z4RYPM@?-BVuhr<^Ql|bk9g+WT?EKqQ^q*Jn|IZk}Uz@!DI;KC5^RE~{0lE?S-L*%0 z;WAnEzp=RfpQ`?UqssrpaPCS>=v^{0vbO*GxBfQ}jUp0j-32-iyXz95B<3-x(aBNs zB@*5sA3xYqeQvBrKDh3BLg2H3_gF}6d5;nHL+VmFd++yQ*cbGp@{_xSM8&?GENyqC z8#%-L_jWFcu>F{>nY{H(P?vHtdtCuYji83z2kPZc>qzrZ!1ndLk|GY&ee5)2F|W%V z!=jUGW~l;^34e$vN3RG$+LP;_*S|m_r-;X24p9QcU_^WL8CoZ8Y3U$+;peddQf62Z`8FqBC3n# zSwG8&j}X|)J*d&Q`x#NOj^MHcje(yh2@@julXNFqgnf3!6pl||Dp^nW))?cZT_+O* zVlUX8u?Qo}0v2`VfGubX=NM6|fS~%gHIB~SDsCOZX*`nV#{DK{R?00#T~KEl)FqNv zJ_15V+{6AX-_pVw^hiyk;~BII2%ko@>*^Jab^hO?B-W-~dcbo;vsn8~a`5*}cdKip ze_O>@gvFL0__e&-CUCLt(_<6Yp8Y5%GCyp`)jXYl2hD*uNcE=M0b96_*^F*`6o|=5 zHQ1N`34S!6|A+eFS<}1sgxAW=T%0Ljd-m>`oq~sXl8bjI2sc>TggpsTxwzz_*^>fE zk9YhE*FRrh`ZBm;_Jj0ezVeS{qV|5<$$t3f`Z`(1wFxKg@ot^u`F2@o$HVoDQ(Nwe z|9#-d|KZ*GyZx>12bVuw-^PFVr0&xX7caj(H}6~jv*_8i&56B@mN6yI8mxiW9X5b( zIV6Vu=^XZV(>|e$d1~DUcePD@bmiK*x(nC7t$wJRyL4yY#i?nNSjAFKONqsvn;9VK zS1J0nwx;l-W>?*<`)o3rx%(tPHXe9Ya4Vmw!EXDdQjOBNTIa*J^<^yF*JgQ9PpP_c zYHGj%Pm#trbB2c#52RYMFljsOXZ*)s*pPV0|k7d;ZE^V=%FP1gy>$>gvf0tIS zsAw*II`{p}+#2U%&AwZf_g)G_->&q!eLzq~JALH`_r`r<75WeEzqz>TPxy{q-4BoV z<*YO1mx#ZAKUUg%Ze$5?x_0BDeY4N}y}KoGSw!-wBa*@j^D>yf+wHvT4@@r?x4soW zEVcAc*{$^*vq~<%y>0z2>YB01L5t%jCGHg8+Rqjp(p29bCvrK*G$Z=K+4D#COE{Mn zKI-26W6Mh2hrRV1m9DH4+;{O?k-5Z?HKKEqKWAUsC;X%S;QPne8)h+rz zeE0aLKD_H}-kmJMcKghwH*c2jQ;JNC{;04eO}+lq${h^A^b0&TV>JDelz#2;jcc#B z`RIOFpYO-+WBUX@-dpqe@9u-Sb=L}&)hDWd>)p9^hR>Rw2o`${o*lMD7VDiCH7I8+ zs`#_qHRbVB1;OKfwkywc{J6Jp+nk=B2YtYsk{P*HCl{~-_jva@%dXvGbh=PPW77F% zR$S^JDk9@+E-rdb4k6NI(bEsvZUlhTs)MH`8Iwb`ICQJ9J#UxHpvjbk{L# zvs>PHerx6SBlp{sAGz+Emb=G)ZH0T_#pjuC*KhIecr^X{#4Y(U8)IB;_gvgyd0WS~ zjd40l+FrXZhR^-LgWZ6g>JNtxE3nHrdGU%9dU@;f-lt{0%hQu-kn>C_ zOFPsmE9%t1zVN3Zi^n0o8y~kMBqT3m&k30lz$6-W>;WI2TeVc1b#zARv_~3&s`J_0 zLmB7iGZ)It;hVYg#RBH_Y_nFaSSY|6D#1{|upI5GVx%^eJfTr~SWQhs8s(G$8rp-= L`arUa`TtD-IqhDe literal 0 HcmV?d00001 From ee9fbf8248f3354fd41e4653a730783974f12cce Mon Sep 17 00:00:00 2001 From: Jeremy Vachier <89128100+jvachier@users.noreply.github.com> Date: Thu, 27 Nov 2025 21:39:29 +0100 Subject: [PATCH 2/2] Updating README. --- README.md | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 2764861..fd8e96f 100644 --- a/README.md +++ b/README.md @@ -81,12 +81,23 @@ The sentiment classifier uses a Bidirectional LSTM architecture: - **Visual Feedback**: Clear display of recognized text, sentiment, and translations - **Export Functionality**: Download transcripts for offline use - --- -## Note on Models +## Performance + +Current model performance on test datasets: + +| Model | Metric | Score | +|-------|--------|-------| +| Sentiment Analysis (BiLSTM) | Test Accuracy | 95.00% | +| Translation (Transformer) | Test Accuracy | 67.26% | +| Translation (Transformer) | BLEU Score | 0.52 | -The sentiment analysis and translation models included in this repository are **toy models** designed for demonstration purposes. They may not achieve production-level accuracy and are intended for educational and exploratory use. +**Note on Model Status**: These models were **built from scratch as educational implementations** of the underlying architectures. The Transformer implementation provides a complete, working example of the attention mechanism without relying on pre-trained models or high-level abstractions. While they demonstrate solid understanding of these architectures, they are not optimized for production deployment. For production use, consider: +- Training on larger datasets (millions of examples) +- Increasing model capacity (more layers, larger dimensions) +- Extended training duration with learning rate scheduling +- Ensemble methods and model distillation ---