From 780e2126b0af8c098e71652aa28414e50fdbe797 Mon Sep 17 00:00:00 2001 From: shiyu-coder <3122067540@qq.com> Date: Sun, 17 Aug 2025 19:54:33 +0800 Subject: [PATCH] add finetune scripts --- README.md | 108 +++++++++ figures/backtest_result_example.png | Bin 0 -> 499292 bytes finetune/config.py | 131 ++++++++++ finetune/dataset.py | 145 +++++++++++ finetune/qlib_data_preprocess.py | 120 ++++++++++ finetune/qlib_test.py | 358 ++++++++++++++++++++++++++++ finetune/train_predictor.py | 244 +++++++++++++++++++ finetune/train_tokenizer.py | 281 ++++++++++++++++++++++ finetune/utils/__init__.py | 0 finetune/utils/training_utils.py | 118 +++++++++ 10 files changed, 1505 insertions(+) create mode 100644 figures/backtest_result_example.png create mode 100644 finetune/config.py create mode 100644 finetune/dataset.py create mode 100644 finetune/qlib_data_preprocess.py create mode 100644 finetune/qlib_test.py create mode 100644 finetune/train_predictor.py create mode 100644 finetune/train_tokenizer.py create mode 100644 finetune/utils/__init__.py create mode 100644 finetune/utils/training_utils.py diff --git a/README.md b/README.md index 33aa214..85b4c91 100644 --- a/README.md +++ b/README.md @@ -35,6 +35,14 @@ > trained on data from over **45 global exchanges**. + + +## 📰 News +* 🚩 **[2025.08.17]** We have released the scripts for fine-tuning! Check them out to adapt Kronos to your own tasks. +* 🚩 **[2025.08.02]** Our paper is now available on [arXiv](https://arxiv.org/abs/2508.02739)! + +
+ ## 📜 Introduction **Kronos** is a family of decoder-only foundation models, pre-trained specifically for the "language" of financial markets—K-line sequences. Unlike general-purpose TSFMs, Kronos is designed to handle the unique, high-noise characteristics of financial data. It leverages a novel two-stage framework: @@ -158,6 +166,106 @@ Running this script will generate a plot comparing the ground truth data against Additionally, we also provide a script that makes predictions without Volume and Amount data, which can be found in [`examples/prediction_wo_vol_example.py`](examples/prediction_wo_vol_example.py). + +好的,收到了你的反馈!这两个建议都非常好,加入示例图能让结果更直观,而泛化“Backtesting Complexity”的描述能让建议更具普适性。 + +我已经根据你的反馈更新了内容。以下是修改后的版本,你可以直接替换掉之前的内容。 + +--- + +## 🔧 Finetuning on Your Own Data (A-Share Market Example) + +We provide a complete pipeline for finetuning Kronos on your own datasets. As an example, we demonstrate how to use [Qlib](https://github.com/microsoft/qlib) to prepare data from the Chinese A-share market and conduct a simple backtest. + +> **Disclaimer:** This pipeline is intended as a demonstration to illustrate the finetuning process. It is a simplified example and not a production-ready quantitative trading system. A robust quantitative strategy requires more sophisticated techniques, such as portfolio optimization and risk factor neutralization, to achieve stable alpha. + +The finetuning process is divided into four main steps: + +1. **Configuration**: Set up paths and hyperparameters. +2. **Data Preparation**: Process and split your data using Qlib. +3. **Model Finetuning**: Finetune the Tokenizer and the Predictor models. +4. **Backtesting**: Evaluate the finetuned model's performance. + +### Prerequisites + +1. First, ensure you have all dependencies from `requirements.txt` installed. +2. This pipeline relies on `qlib`. Please install it: + ```shell + pip install pyqlib + ``` +3. You will need to prepare your Qlib data. Follow the [official Qlib guide](https://github.com/microsoft/qlib) to download and set up your data locally. The example scripts assume you are using daily frequency data. + +### Step 1: Configure Your Experiment + +All settings for data, training, and model paths are centralized in `finetune/config.py`. Before running any scripts, please **modify the following paths** according to your environment: + +* `qlib_data_path`: Path to your local Qlib data directory. +* `dataset_path`: Directory where the processed train/validation/test pickle files will be saved. +* `save_path`: Base directory for saving model checkpoints. +* `backtest_result_path`: Directory for saving backtesting results. +* `pretrained_tokenizer_path` and `pretrained_predictor_path`: Paths to the pre-trained models you want to start from (can be local paths or Hugging Face model names). + +You can also adjust other parameters like `instrument`, `train_time_range`, `epochs`, and `batch_size` to fit your specific task. If you don't use [Comet.ml](https://www.comet.com/), set `use_comet = False`. + +### Step 2: Prepare the Dataset + +Run the data preprocessing script. This script will load raw market data from your Qlib directory, process it, split it into training, validation, and test sets, and save them as pickle files. + +```shell +python finetune/qlib_data_preprocess.py +``` + +After running, you will find `train_data.pkl`, `val_data.pkl`, and `test_data.pkl` in the directory specified by `dataset_path` in your config. + +### Step 3: Run the Finetuning + +The finetuning process consists of two stages: finetuning the tokenizer and then the predictor. Both training scripts are designed for multi-GPU training using `torchrun`. + +#### 3.1 Finetune the Tokenizer + +This step adjusts the tokenizer to the data distribution of your specific domain. + +```shell +# Replace NUM_GPUS with the number of GPUs you want to use (e.g., 2) +torchrun --standalone --nproc_per_node=NUM_GPUS finetune/train_tokenizer.py +``` + +The best tokenizer checkpoint will be saved to the path configured in `config.py` (derived from `save_path` and `tokenizer_save_folder_name`). + +#### 3.2 Finetune the Predictor + +This step finetunes the main Kronos model for the forecasting task. + +```shell +# Replace NUM_GPUS with the number of GPUs you want to use (e.g., 2) +torchrun --standalone --nproc_per_node=NUM_GPUS finetune/train_predictor.py +``` + +The best predictor checkpoint will be saved to the path configured in `config.py`. + +### Step 4: Evaluate with Backtesting + +Finally, run the backtesting script to evaluate your finetuned model. This script loads the models, performs inference on the test set, generates prediction signals (e.g., forecasted price change), and runs a simple top-K strategy backtest. + +```shell +# Specify the GPU for inference +python finetune/qlib_test.py --device cuda:0 +``` + +The script will output a detailed performance analysis in your console and generate a plot showing the cumulative return curves of your strategy against the benchmark, similar to the one below: + +
+
+
p!AfdhC~s&f+(S==|RVdRcI~erOJ{I z<@yXj*j>14dW57t{Z2R+st7 A_0qFrIkOV-Ma3qakxEN60TbSdJbO+c}5(|5KFZ12%pu?~!cv;cM94xzU zj*$ZqQ(k6?YIE#oan(AYR?jR`@Z~jT>aVR_p4I%FDuIu9=_DwOuLYernbzp hoqG{GaP6$PRw&upo~G~ KLm*!RS#mY^SLFZD&POFkT z+RmCtf9NYv-X#%LOISQmBmx5h9#(8?^3vwk7W%XhIXE+o&Tf3u0 K z9dm_71#S}Uk1JR7Ad8+X6yKVv@m1c)4=A)yUJ6dPHtoHZuj3@~034}~$MEE$(o9Xg zcDKx{LR}JlL(;&7cWXk%E0VvZBD%yTByDPntF$Q4Gy;!Z97w`Pv~ai@jxS3fyDH>H zET~e`01n`Ie+U#T;I0!Pi*%s+b|CZQ__&ckC0MSIq6#yGC>WunffPjAF}QBgk$t2V zp%a#LgH+IrGK#9biE+op#Fl0|5~aJ2%O3BJcxp3?JL((eIr3X`APiVqAEuM3u>QFk zWV5qn{XkAvW_6~a*!`d&L6?%!wIcTc?pq9>Na}g7TetW>5O|=R>c8EM5qG=|X0uyj zRWDe+g(Z&F&J5#a;K2dP@0sOMiSO=SIgzT1!Mfnqu)VD6>AmKV>~`JkPPVgZ3EB8X z+rapK%i%Sw54^@AuYK8N%>pKU9CjHFmU`3)LTPCS*SN#fx25mkLWDE;y5OsGe{2Jv zA)x&&`#1d`QYHh>4D^iT-xuIf2{nxpegw1f`Zx_ge9_q4Y?!mVexy=0n75%K`t3}U zWtYKkHkCk1*tV#3#Fy6`p&-G|OooXq;?aSa-MzJ$2Kd~S%iZ_#O+LOM*xHz^kzADu z+HPFaue80KYM*z<&0f9JJbLs^@Vebp(Q~38kbTXhT~&r0hL{3+BaCI7YL5|hY&r~~ zYSkDOWu2sQ$A}|ycCWmAR0+HsZ}~%Jc)M$7=XEY{9!T1{=MkC+8E{O09$?W &3G1%rzOBEz?HfT>oA zG*ui^Dzz^jSSJ7`{Q368Rl^8@hf{U*0TE~U0?ob2tWDdrpf%Q|- (6(u*|Kr zxe}M5*El+#@u6-{bv9o_$i6Y?QNFVCR&u-NU*EWH{o*1=|1L!uNje +y(1V(Zl@!f+l;SCQkU_-;{| &BqzwYc67jtWxiy@O^e%lE v_$mTALg($*O%eo0oW7qFAun&X#{Oj#VT zSt{MDu=a*W44@!O$dwgkGc=_5VqUrIs|B3+nlp8z5HlR;nZudl)>%dxDFnMyRj1Wp zvSUs-&WJWk=|I>-Gm}$?E~pgWs~QaE^3r&kghe=79HYpdVe-x&dc^XWS5(`0cR8kg zZ5B1d<~vboX G;fcIJf Gjot e!_pJL|853Z>}@M3#N d5y!KIr+-k9v^w=f((~PWS9|ido?bzmFjhOy4-y$1(2+tj1yppa_A8nFB(CW?9eW zal8KeT&1NU&U38h!A3Npkqg-aY=5!UK{iVS6+MVN>AtC)k*?X`FrXGjxOI?7?jsmT zywIV#5z`~bYk_QLxo{DbiTK;Xu02^a-`V0z-V%z|RMlN~&v0LISPqE}k9O5|8=Dw6 zrXgDSO9_^QD|~5JWNvIWp2E$@WPoPmbc9v5b;GNTQzgdLqHn+IVGq0R 9Ko z>^Szs?J2e{8CtI_vy4&c2A0iP(rvGm>NOhoT;3Glh<2UO>}U^kpABt4POZ@HNi3;R z+U3r=Q+q F~ZEL5qK1#^Erjczk&ZxJ^ z;mJ7xqt(Py5(8^1M&$@z0Dn_2{1|s8<#B2%H=aFNpi12ucE8kZ)FhcN_UO+i*PLf^ zYEUtJ9?1<#@L3gl^F606*~mLW;S1RiJ49n$aid(t^j7gwqE=U8{Y2T-StU2-`0LEx z3?C#>vR8u{98R$qy!LD1jw;!^B9@CXg?*=1zRKN-IN(Xy)30J#ZuSbwzMoTw`ZIhp z;!6@L!z(MMaY6GtJ35iFf|fM0xp7lLY?&r5t@oYHesp*_joim^O4;T$mv4JbyYp$& zD}FzEPeQMuQE4OG^30dUp&>%Y@hSWk&e9S9nrDmiO)o`XcxpGDaYC}?%?Gm8G1aBn zLCpv08bLy0c%%$#xZ<@@7N$~O^Vw|z!tF{-wFZMzKVPKBa1U4K?DyD`Xb<`$9GMC= zQ Yu%S~1|BB8-@m*SQ8|;J%4mSkr( FIgxxId_ zzsV@|+e`Qqz#!V4m)ZC#R>Y=C-tt?OzI%x;GF{ZF!il?^RxP{o4|J#a8b>NH=xWRL z=N1?Za cGG^aeKI#Js#UlIX8!I!d0Ab!Opu~ti>>?>J6McoBHkH2x*~XcFsM0Z#z-E z5RPB{UTZby-TR=>_oR<$A(}Mk7upBU6{z33=Xd6d^Vd1OVHvw-7hm2mX0?5Ecd|Q; z)5lQa2IE+?2Q$;fZ|`bl#n^s6_b|Wrj_dk0W`X^b%<8p}6b%$U&=9AxORD%WStsB5 zt?=E9n_Ao#Te3S|eRR$nJfQBDLh+@ga>tiTCYrs|j{DNZ)4XmadX4dhM1bK{v%4PN zZ@UIC*5HhkxU t|S8)N;%*`>51^aeaW z9a5edELGzKT}ZTWQIJhMTkDp--*gofjhR#rS=Bk9uR8bE&K3_^J>~S>aE!!N)(Lgx zhd-(DQ=Q%3toM1z*tKfY;N`2*L&PzCV^7m|t@oAWP(>vFfdiy3e>t8roEN1+D0Ip= zi;HSqT4T7>g&kH?J#~ofG+XbZ4x=zcsD?GTBZ&p+C`^l{=w$qS? iyK4-XS7w z?eW~|bg*hrV3>h8*;sHg#lZ+(y`k#Og0D)EZsY1sB;|_06Ng1a?5%rbcr @4Vh zK0-6@^j_gx14qN?H@Vr39U5o3SLR)3G)~;~Sj|saoxfDbmGp!-#uePR2)b}xzfKf! zYH#_Z6EN6ucI_na;a)C7uDRO`A{w(r<5W?JmCd_`XEg0y!-Tr$Eza2dTv6J|tZWav zMXg-FHupt>l`P(3FaeBnaoxlIn*9YSU4@w`t1~PUC3fEDr24*B2`x{)uO}2{z|{YB zT;-D&sr7L}h1C-dbvR$)(QhM)vo43^Y=6PIq7 v#9<^>D=^XNYhIG5TYC0OBdaEGY0>LbR_ebqeFJ@ zpmy`?vn=&eo@q22uGhJj7Re01M*)@v(;Dfwf zA&0I`^$$oV8bQxQG?B{IR6(vb&d0k?%YGl b{FYPv+FZkDA~L7KYxw`M+An z^2fnv@w#O-nsIS2-~0WOjHWI6kqGyu?NR&dI1C7KTW8>$6Foj{bJ?cp>fk}BQ(V{l z!G9GG27av4w+(cL@U!d%2?pD>!%mL&6Sp&)C?;NUQPgL-4-|QoWk-ad;&QyaVY=c4 zM 2flqUrT1^(i4uQ>@x0NP1qD8}W`eMUS*yl#U2qRc8y{v5)G`s+Vl(eoUaV z76|}Ngu*dvSZcigT{|`OZ{A32Hh{(goA*z^3oV$ vBR_$<++`j}20fV^B@&dE1oV2op zz5V}wel#Iyc-Mh&vR40QD`T@8@^#W}3lFqrnXd!?*>T)n6L_EyQb&)ZZ?BZ5FD=w2 zSQn`~TF%IhMB?`s*y{0s;2VO0L2{8=T>rG1qkSKQlrpaQq+WDdaz%xbB{eNg^&!2^ zY#@Og`+1;9dU#wA|KoPW{1;xXe~@^Ood~0)o974B5(@>X*wJ)R S{`G9SRvx|e48<%ckq3+Xgr@IK z;W(BX#jjc)MOHe42eLe`L`DaZkyM7 ce0I~VnEf&We08$!SAD3;VC#0I zzDMfRD<-e6Cq fL?&M_r9pA>a%Ssd=4M9yv(O;_tt z;X)WCsQM+LqEv+=Q)oy$YF*6-FJf;k>njT>N(!gm~+D@b5d<=O$ z*{A`&`1`p{tLo2Lgm5ngE 9 zXu%p7CLDsERv|Q?D(~c-zQ69D46FXclH2|He5XH{1qT5~?tn)QV@9?fSJX4jHElI3 zs)iTa!v@NF^}76F5lvhv*RMR##s`%{fPYh2T}k^@%5dS?qtiJN-^}xlay07E_IOsy z3lR}#$2FU4Y2(@ (P?e3brq^)6VCauc&f4Jv*TIel# zgiy5XT}AlxDBW@mBpt5i!QuJC;ur?NCUvTNFYCgozEnv`k;MDz7e6`Z#Q)T)f-cXE zBnFMS3#Kidg*I;ROi^|{o|+FG{ij)$>SB97i0JhUpYC%#&u?wWYt#TklfO(qx34Z`csKLTQgLz` z;Xv!KffTYOub6F=?X^$%aCT 3H`FSXEG~a9a*n<`wdnWi)Sr#}#_r~N3M$gzhf-{ycAULKbSnc0&i)V7F%!6W^7`;&$t8=&fg!GACDg7 z&8Zr=b?LnlQi@(+GXS`=^g?}qeVc2EvH39Lxb{puX7}@LoIFZ{%3m@`n)O+OTu2Ls z%787$&(k877+SZ7zc0D|+3Wo)Q}4mSi33;f(D(1?-SC)_K>IK@_cg(FIvEoNtF-1s zGFO5oSIVX{tr`x2mK<2Y?YBSi85gfOu1H!b=gDoqj6-9xU;+aIOmTI*zf?>x{M&YH zx#-`$dhFTdc#b~vv|iM?-|k{UlzL4wP9SF0dfL3i=gb_Dd%Tc)Vb`p*&y@y4-CDf& zIo; ?ETSf4j!DBvurX%tJ91gi>o*~!p|otZQ}+$ zdJV!^6aQzTT`R<_>-$N*t=W_aTB5X9jY7nCN y0Ww2kw~f+q5D3R^s%V11L-8T?h7bew#mcPjG!{GU7L;FIsnu;tFCQ9s@gW) z=g-XcuT+>?Fd#YWOVxo0W>tyLLGIvFyXt##asp3t?K?evn <=!Tlm|2IqZ;E!4EzYtL&+@5=`y)w_~{q5v~WA_Ra zqhmzPL?B|@-&L5KQa^QtHX~G4I$tMSAcrb9%vV;%*L&88fX*!y0 }Xil^Y;;%qvOTcwRywB+vmpY*KTSKK!?L@T9Zuoa1Mxa zJ^cOS;TU>&LQBVZj|}qSLTbxpPYS!a&$t&v0@{pnsnW5=lg3vwtMg1<8OTG^R-8Oq zczJ t7omq{uh?;a{#C)4z|Gxkb^u>Sd*knQ}?}!^6zJ&qr=RK=w-RLS3661ul_+ zTAN@NP}Xb-8Hr@=dZ6JM&nfV^E6#j-*{RvCqR?OEbz|HcpOR3x%f(-YTvWmEk3esQ zS+&`2Z&^{!I|X;A7*SvC@Bk~M|I0|-wxRHONq~6GAM|j&(;QHmvqix3U;PG#e_E>d zs=WU@^<2=OHEFCJ&%0scq@Z{GRpVe3lZvc%gwYr8gR{GlE9dKKyWJB11o}0{IN!^k z@d*hh6~(9aK`o~u8DWB2N=jk(8%RVaiwZ!nDh1*qlJ07OzQDBmF^|Xfz8P+`L8Vy# zVl9osk#;AahDv&Fpm5Z_eqB@J)W2*w@G1Q{S}nU&$qVyJHKU~CR0mSq0eJE3ZT(tw zdE8k+%w!dpvYs7CbgYoh0R2v2c~#R+qs9aNh>^CZTBD&4?FP@$dXG8nOQKE*DG9Vv zVI}6u5qU<96R3wwH=rBap70mo9~gi^zKSFL{4opS$Xt2%sq^{oUf=>oL*CGg0XRUP zx%H|GwY6sGpFGbsmY)um@gE*EpMW-JrgZ^Hmx$F(< R zP{Ebxry1^nZc~-^ZB3t>?+BtM4Pygs&RD?Pq^#<|pf+oMk4;MP(MJhzQql0a?H^WQ zxD?M0hdrM34)D4$LgHj8J+Ak%JPmvbdgvfOR-bNY><5ZG^w|Y&Kq-8C 5 z#)=NyFfK)tat{P4n7g(=m9x~!iwg>*Z%uML4E#i?5SB|#(s}7FD|)dmmecr8f`=G3 zO}8n+vP`qv?j(}4vVtp8Mg^!sAU;QwX5^O7A55B3mek58t_>Q|!Ta5x97s_EX@-vi z<5`v_JUrZ3_7dCwl 5Ny;M(Z{brffhZ|Bnrw=HEG}=T)m+>l8 zMs3~I-RN6HC5@vnxkmw|W$R{4G?+!^OYsQ*b3OPryQAh46LN=u0VN|^ap&%09@5d7 zfJe-z18ZjwTPpE}4l*^ro56(&!c8NRB>m&FH?g~^%S&4vh96sdbyGN00ON#KJvSfe zng1ydn@G HXLw!9#a3XQUK;z`)}^W6iqld?W;49ttnFF(_=LR%s^M3E>V3GHoX^Wp zK5X_#lC2+LAS3^smM!Yh_ZnsRVxxL7l54 KdwLWd@q20qQj68s~j-Y6RsCc$T1jm=pK zw$EY*$J%*9!OvMYO>Jc# R(Av3Ki^|HmctFOpso z*=(92e0)+Xu^3e@u>=%ha9tytlsst{=^6fQbN1rJnhE%Us9FE`n~4AO+|AyCnv0;j z!N47=a(M387TK(InOce4s!|-vfttyN7|(1;>Ir}5JF+cTpTA6%=E=F~kxYPm({xu9 z=|}K1J#ot_X>R|W6xdo4>+5Bf^!mwdR*F^JP^TOEnFi6dPD$(;?N6^0XKm^V?)S!n z&mw-TIfkN{je Nw Zu3*P)$g% @#fy8H*9VeRM;Gu!^P(05e8(R#A+ z(=1!^aN*UxHLu6+n0L|VBkRwxl2 zSFL3({Kp%k4t^n!5~ge4tT#4PTVAcAHCBZW^A@~5vwFc?QsVLtpGs$S$wrTtk)CkH zd{{(*G$OM5X DY+IRQJxDFY(ZwoKh z5fJ@0<+L_7w;_9E=Z6cqVk{$bY@$tMZUjBA*ztey;jcRMJ3Vmj71`bRS+AnWzn-b6 zH?dN0(F!%DLBlCD>>f$ABLNj275F$b)>5~BFr3}2CRCb)7!95Lh4cZ8z>AUg>Ho2n zG$Mab7hR}!oZ<0SPaW)dD~ZSAdvd6jdA5KK=v)BvEXj7 9}dzXZI}+AT%FZH?rH%wjmsATt+aR6E3a{{bsCb!qtyB z0(Yt4>QloEz@sh`lmy?^g6FCCO}g>UaNLc*&bB6-V(q1~7TbiG%;*mW0lnG?XV4C> zs+*iN8}6&GPxp0LN{mtZymSmim1x`LEvV3@T^HNWW2f^X@BXTaE@ays;mc0)Tb?cN zJjQ`uoCf5|eX>sw}V|2TaoQ*LCX`E?)!7 z%0R1isWsEGf2tU+>O7KSW%Bo)Rjff2mtx-0s^2uFq1j6WIx=#xW3DB|Y}fa|f+ZJ= zdYmL0^)!|eg?Rp^u-ZM$Say&_+t<5+wKxd!n5LrZnYJ;pS ?^1x(k_;*bjzhxK3N zl3B&eTCP)mAL0ySprb=)VL^>+Ae M|c{5?aK5%4~1r2fEOJ) zKnEncp^0f{A6Oe%X!ZumY6ea$C^dKlQa0)Ud`eKeBjD8P*DX29wC+BG7}EZDP6)6W z18> YRj7P zdDsFoRSH*~>i8R78Ls&1pGbT)L))H8Bi6zh?u%nx+1V@|mrH{i7`%1zgLP0!KD+6o zkjm~mb7!7ECntv))HbWKV0D2w__X`Fhlgv!Ws~(VBcmfSvg%AjI8%@L%aFc=m&L3x zmDWkn!uFqJ6t4D*_z-*ys)4@%z6&|%H^9muwEd}4rY(>z#ZN}lgqUcs(Oot?1=@c; zy}7HxKDko27YgY<8&XoSqF4L>nP-Suf1Y^3z-)D q?Tup}v2u|G!^$Z#h+6sJ*lVh^=R1!kD zm- 9 zqKMVT$}?S 7e+@W$=IFvzbR!IzCP~ z3xmY|)kZjzbS#u22<5`ut#p2Sg8>EaNKJqQl;}AY3=9@M89Tc|5HS!0rCV%|_cdT` zVezNj$0$bWis7@0)q(#&hKN8>9VmzFhr9Baj;Cizz(O`{I-Oa_wdn+PFjF3}4KXqz zdOx{z&SkuhLl+>LDp05DtOq~Ey2j=B<1Z7EqJ)=AKB&CzIc=&VHvFKX#JcS{u&UnL zC8YpoiSFtxLJl~BDp8LLO$YnNK;5o>pC!7T;=K*jAgkw9NWWK~;ls~vtNsgt^ 5$%zg8L&aW5%zqFJcm>60DGB{%imS|VSiM80rSOVV6r+|Qh3 z!8za7#@RY_qoK72z~g)JP)sWRRe0KVIt^6s*!cK bJR3nDR@rr0eGM_L-aJwswNYSo ziw?A4t=b?Nz@gG2)~`|PO^cN@wf?iy)A$I(BLfXuPu9HotWsQa&$(wkCzR@}9$n%i ztB378?n8GnIpo7uBV^UaN-ti9u1Wj|l1!)#g^8Jd2S {g+7_jeG#E&K+ucy#RSs!;d@lo8VanBf5HG64q36oRx1lyuto z?@y{Tm>NL?Yz@%JIB>at07Fgwn??i{ZaiQN1B2&3U_o{q8GqGfT+s&*U|_{-0A4$o z(Io?nzO-OfgLv>XG*SW_+MfZU1q9qHHMR#V!FWq(E*m !gRvLSu_+-LYZ)khkj%$nd5OghTOEWF?PBK$LP)LBM3 zcIY^%mv6%#_z!gfIX&rsFkIkIL&y&8a%`!DekA4=#_yh4_L=Jt-a)^4>~7DLOF5yc zQlxtM6~+~hkrN=|V3X+3OCgq8PNY7?RbNMTOJ_DII)vj4CT8fHSELB=t3Iu;03RVN zk2`joPYST$O5Z)$J@`s|vj0$}q#AlKOLyRh6*-s!V)FWRE2JlU$3KAiZcB<)m#9)Z z4?~`yhxqe_e;Og9dLFmZV7>W5mMCzcvGQQ*bDV*lyB`l4-vewJ_a|+<99!~t0A%C; zCVF8Jec=lyQ3OxEjnU%P##;7b>JlT9MH&BYlB$(@A*uw4s)%R6!mO3u?K3jWM~_c~ z(vz{9GR~~Wzwte}pmsB> *dy-6XU5D2a_B z8BqpR<&(&F@Pc)wJc|%PuY{nbtnf$qzogqh?QU^0M=aUL*n;@-X5<}u={8`TicnrZV z>Z|$#yeH7!it(;~@sGGhi|FjObP5OpM5WN{B_j?num%A&3_TGNd*U#v--3C&5RXow zPZY|No%HM}mA9#2-Niw6>D{y|qo#BtyMZTAdH;^Wj1sRWgoEG@kj}BaT535KXxkY+ z#uUT^p8=Wa`3*!8@(q#`eN_QY|KJn&*<1Y_>q3K^{nBY9%?5j=0wryC=d7q6LN(Cy zEj&>(a4DKrgI4 W+ tp~8IUpPXqjGXa5;hU z2OwK?%f87#r%^zo0wCPr1K{Vif8^5(EiybLR#tk1uDN-5{sG?g7$|zm01pUIW|Tn^ z6|_sMpvWF5$te~}29g_8D#Qg&SLFW)PWr~U7XXo?oD`DbV_2I-?!l2~g}?H}J!XUf zTo&Y7ak04rC5@<`27D{%>|UtP*A7%I6sLIEmp(ULwB5B`ENM*KhBFy0spMI&@Wk@Y z>{DA*Rk0S&pS&NgH2Y^aX}NqpFnFGMnh%l)%D|EXU?Y87`=nLj;j$x)tiaK {SVq0l@hzLOttPm!Ovl3?>v}y`dIap7ao|) z5T%gESNd9j@+#>?cC!z95ncq@pct;+yB0S~S%ZgZhX*fkI)$>SYQH?Z);hhh_M)#T z51bkV5KeqtcExAgXTTVQ^FqD|u>LvKU*^5?R!J+3Fl`Ea8NNG5pA-FHO0HA?u4$}P zjes>yk+!-oXlAS&-v2qi-)00(OKXx$@J-p~I|O=8pCp`kn7g@6rwi)kg`g!-aLx!4 z3v41a=uhhE*IjDtX9!4Zn|Q}1p7?BTYYITb!hqW)XG<;>nPHYp=t&hQRee_}=D7`W zza{_-CGS+jKuz7$G{eN4iD^3RG8PyPa>V-SKD_zhX+IqpCKVn-J}khlk#6OteABor zgK6z-RZXmaRSurZ$eW-AGrolyCxe+YZ#tvGC77GU)ka@bvbH~@RZCA4%~!hV(0g^z zACA>wRX^J&-&g1xDZo=?Thj #)2Tcq`1VfpVYSGo@Kai !-w;AAR8I#e*BBZWWQ?FWF6Z=rDDD==gc{F#4)G`P{H)<#1x z9|?+afu_ho3<(%U0QF*PUFnohSB^3cy2U`+K_5(}(Qfgq2}UJKvCs#jA_4P& b6%jFj2 zpZ3QWiA`}$3)5D4!xmhNy{#)Z(CUFsQb_1d=uxp?lYvgY`aQi9ke}kg7&N2e9v~@t zTnyu26cG}dIS$w@W~rWNFFU)&MRnm9sql~Oz=AZPN0WO|sfAt;Wf1M(&fnBb{SagM zL}fI>`a=C`IqkX;ZbMeQLNUODy7kb?^wDb*-226?u(`YKJ>Vfwzb_p5MNnB``8Ixu za2c^#-B=>~TKs4d?3Z~+_BE}bKx_NmZtSS#dQ4Db+wfC&8w(8ew{ENP{@b_(oEoMF zgDt^ydG3<;C+~g6HUqum 9(=3^WgTtyxR?VQhK<07CN!k=qi1&`;zJ< z9rp)K=oYnT5}E|QCXU)|&2EyVqBKj01su^u38_o2BRgLqP zNiVWkJrNy;wl+HwH>>RjM>J}2abfuEc_ z$Aw>-p0ug-Z|FMBjDFJ1ep$RVWGc|OqZCAr??=^Eu@mW8_t50XoYbs+b`)u+VGWtl z#%PuRTHa^3E?Y10Hkr^*p^9L|a0c5}M>p^_7HM6XH}>4%dpRb?1;*_V{>)jGe=_$o zkuoAxA>+7OEjV{Pn@E>Ci6>7cB*f(YM*$z*Fe^BUPg0hzAf&cNSB7~}I;cL-2HC+2 z*J-Zrz$gbEDvuS}EuTdjEPS}aSJ2&t4SI&eLf83+%(O$n?+CUI_H~YD8$e_giQg4W z9e}=QfMf}{L49sfU=&;mr%fRMA3_7yLHcxnT@5&88pg)i^gO PGY zF4dS)921L_!~Ct$bfE4o=`Q&Qzwjam+mdEQq-_E_43lO|c_~cP!3_l#eZ#hC-n7cI zO(^lu{MwdZc=rYzG_7nmEAxE=L&;8vIB|+$60LTb9_xq_NiV?2YB?p>grKh+hTBI8 zVhm$~Z;2lHenyGvioDH>fHQRd>!|iK^W@@K2*&fKbc&^wb`J}2 ko?)LUf}kQCYn5rR;Ht3 z&qUQ (_!NdKAL92+%!2mNYSs}i33_1hlTjW*pfy%mykifpLWK)$m^P7$vX2us$I@sZ% zA;_mvCJr^P0*^{O`VxPLFeb zbLbo2S<{~2(3P$KF7qad``vYSOwnNX(bQsnx@XhUrnbEYtQF6!2m?+|X9EcJ&VdHd zVW*_54=ZH;Rj+X1fIx^gu_{+X$99_2ZkC*MKzYE 6vrWSq^S_K_m>s1mc{r|q z0|#(EAre`N`bdQuOiQ-2 T`a?AdxIZ>IC4SgCAhqLZ#?^p6Q;V z5HC$M@w#=*p5d#nqan>E{}i-E{-qQJ>EVSnYj7Ij $iJ$L7xH+?M+oBm6Y?(K)@H8Ge7BqEL9NOm{0%N6U- zulR>OLH@<_K*RaXVaHvQSMvAAdepZmKQ%$1Swb^0$a|JC+kCb~CpWwdW=(U7h5wV^ z$0> p!#oXnwKmvAHPur{)ryWe!uMp`H&<1o;;GElahOGukR{2o8K+UK78!- zYmxA)eCu 93Fw*Z*=9G zzn~kyN+5I!kvxV D4ug4E>EVf &|+||e|&GN#WZ-sFR*^OjzEDQa$u1u>~YUNr7)CfwDoYU1dF|0BV4A4 zt52~{9$KN5BaWHfR+ z1A&&Vfy>S@{1x1m*LAzgMi&kzYWLs3u8L|Kg3}{QXMrFjEJG#g_}PGL;|F(s{R$t% zYq~uvco+aK-&<;6v(>Dqs1BCSrL9~Z9!3erX6OJzCtzSivfct>&?^W^hFG2=H74S= znnbGwTE*PpC-U->XZ?oK1_5urioQV;cU&zm(}GeZ=76^_jtsHzm!m}Gnu+2Yb*mz+ zlhpL~nVeXRCi!d#+uboZ<}~evYNZDPpZxssEG#sa|NUch?G2bg8e1xAD4^6BJd=G! zb{OEkoxjV<&}ktpV_JK|T++`TA!HjxAghvVwA|vtWcK&ObVw>Kk`IY5i|Fy_Y29KM zL5NStU8?21y&IM5E0Av~fGLW|w_Wn5 xpn>Pv*&waJ%h6f*Z=Qy(?ynzrhb7BRm}> VJme}aN1MM~D zz3PF=*BtMLJ!D?`hQ@CytLU}xqN2gAKg5DI#_*gqU47<}TJlu8jdz61&(s7f`3)}} z-~^G~djCDEIefUHr6iu}TnsCv>p{s^E}9R=JJo^dWd1p6jC%ZMSzK8@w%~cOWOZz+ zie|r23#W+%8E(|BEojH`rK;Pp=F#T;Sr>X+^k%5o>Fo|dR|LLIVF4Lwf#|VLuyBs> zLRf;LB!3WSC)n>T6GW^{8vyQ ;iRl#laQ}E4$+l+`SHeA1V zk))zc>;-+IS;f{qI$ =TVV0)xtOP&UlC {U5#YBigcr> U!?`(9a;Mf}F z^6LqHASkXya(^+D#QK_6k?xD}nGNa5IN6qND{^Zf8E{^FRLzwRCCsWstVe_K&zHvf zPB2yWTPbCpxHTQa@64lf^uyMhP;Ft@85O2i+JfKfTfC9y=lgiPP `0>A!+7Cu53KKWz}sm~xW9R%vM!ly(Qki} z!H osRxxgGKxSWDHq7ny-be29aa<9ww{V+? zPdb)loCfLZ&l5d!qO6I)RYXeP`AB@Ad0D|F?O(&-O|UMJ5-pwA0shd;xo7c7%(St3 z(QY4 jD#9Cn?4#JHqn>XMOjG3w-~TyNBk8|HrY zAV%og#R1dzeIb90I!eUX{wA3dPjcZ0({Q-2`V9P-aew(f&S~Z~WBsPr3mcM4g@qZw zpo(cVB3sIn3o5o*)KDJF(xCp)?EYq}$xX*5sn!a<%wtt_Ppx%yjegL0W!vMH=~^iJ znAWxX+t{0*e%*u!_n->PFc%arR~bJ(J2)=uT#bIFv@-sROUG9%=I`^dp+`smB|mH- zue!KeZ{c3lF-*j2AiElV2V19{tyVNE@dxd9DA@FeVy?K#)~^MN?~JnEMUb|>p2Sz^ z47^0BPxYKt6~gjDBp~_HmCq}o@+OHTC#J?4$2m0gkD!O!iDRjTw)^!pI4?=&UaHZY z@yu)>T#Wa0f4JFK`;^MXRIMN$ afuDf~D2=p2HL2rgZF0VL@cxhH;1Z RRixhOY?8YPi!qW^DQ?f68FzV@E{r+2?NKX5HQ&Fh4Pu>0JlhusLS+J=DSxLI+ zHe<-l%Ud|mNHWa+;)dzBThwUh+b##}&oICoz`$@$2Sged?`G3yMc-JnG!!-Z5WM2C zymMgtDeRKBues<^(vKp($c*<6hd0#^ty=qc$vx4^MI;g(DCOsteAu4rZxGa1wT87` zg3{;x6bELOZI2&Ey0u7GU3qf#FBwA|5&tW&292>Qa }uw+Mr8T z4CXC$QJk$QJ J$CxYui|GvfVZKqiEZ{+#x@{qU{sw1#88|b(qK^#N!f8 zVv1O)@b)@PqCm-bJ3T?HB+-fCapF0NG^Z4HlhnPGah7}_*7}n}qDaZw)GaTZ;GGWa z&F#w#ZEpmGJqCS(%++t)Q|Dj7JBoWO;%k{GOaNg({jTDGI9ap=u7(@o*$N{kA2w1M zeOG`w5~6^@-ZAQ`fuHc@n2}+Pw#u^0goWX^4w2ESR|=$G!D;xJbhx9vxty7{-BV`F z%$(GE(KY)|==YCH-$H+|+o496{Ymg(Q#Jd=?}i#$WsY;~$zj4vcz;#&W0VHmWZlP9 zzx!k; Rryn-!rpAY%L)KytK$b8!Vu>;oqZg@NYKpQ7gfFO_x zyK}S1@;fB^^u$PunHuwxRxPqGoiAPMg_ENl_K|yHjngdBJHvhm#U{cLugi aKpfh4Fa`lH|>RYWCBhdS} za-z3B2fsCd_5Z+y(=b~`c609n ER+`_~eEAZ3T;zL>xlg4KbLGtz z)7}Y}{fqXkr@P47I&4-R!b{?ex7>Vxf6cW28h}qtMGBOL7cE8fmPGiZQxnkMe?PJ} zK>9F6vvHe@@WXc0(BIF?m{@#o9k%yxpe$&}eQdR0((R25q;9{}1(!5S#fn( fZ3UIDd0RXnu>(G@Gq-Ut3&xcKPwZ&)-C&yL`=~dI5PxTIdoZ zA2xt-(fm1mVIz7#>S;_xZe5oBW^m&|BD3ws>RnyTn=8sSprtHHaY!P9lRi3eh2czp z%qu8^s#F7QMTkLkqj;XVZ`+=b{q^;7V}d1eZH-mTi{g+OKPGBB;`8OEzlGE4i;heN zJypI>>tj_^OM;oYwvq+szeYzS&SNRQsdx$hK52$4ySt$M5+TJSMOYF4ovNek$WI() z7azu-Sk3FLlM4bVnxS&1lzJweLU$UpQsKFRKcW99bCQU~x`PucMor@=*n^*;tUzzu zf{P(9%N#mz1>S!n@|~c3XjeN#Y%0|=ay!JWL?fZuvC0+oI47Ta_pZD^yGHDZfvEiD zivAeI&-8}MXre%UK_u^x0gQ6%>>M6c!)y2r1P)J>Kk3O5+|^IMyKa5oSdq&FnkRb1 zJzTO*Ca5t7bRy*~q6C3vPgA{Gs8$r#lBitJ1>lWYvj^)N8v$V2OZ(y?0T4+#Bk r >G(>&we)4|rREI(&87=4XEG+)ZA8Y6DB;7#I8fLUt5G8d2NW&>85*gM zwf@V;vxVrnDI1ks?pL`*6KDPX3f$wLy@R7UTWx-%rAFY2BgboR?nIFzJ%v+JHg@!0 zHvVY-%;GF1)qOolK~8FZ`}+3j457; WndaBMlwKYx=Tj-=h<@B@$OwAq_K8FEl{V!v@lTy8go!V!L0k~V&W zDAUcJc7|SFfY{}+2FEbS;v2?jF3cE5IUU%3t^zDfGj?dJQ86`=9V+{G*&*M>%t$$f z$n}C3?`lO=%Kl)vqP2*?%9(;y8Pg|tMG{ZdC&%F}DS2D=04HK+_qwG;$!r%DeAb~; znSQ~7bV&Xz!E@j~wa4Q?RD1ctxw{^ek=?v6GGM}Wn0ox-;ABr`VGW =OPLquK zHdtS=HfYLZ?mw!O(dOT!RaNY3yD61xpZSahR$G4g=mIF5|8B$gO>d)Lkt{s=_hdxM z^|lmVlfKlnEM(V}uKzaES`vC;OS#%rT{S5iu;y*fp8oY%c$v<0s0@k0N88xACG;DC zX$mb0+sH`!!ie=>W@K;Q$9D~ZuS5w*5Y%&E!N3`aWwl{V$}R+_Sm%23 EP `eH6;if5uvwmxlq%1ccTY*fw0c-1YzXpUMj zjHl}`_OQ-h !`T8d+zgN1w(Y0` zYP3?ic5rj!Iyob&yJ_1vRy4$UB7mRg+G}jscA5R4pb~6!j6VrMaU~c%vjow(vq>pd zbt-n7pD&f1Q4Y1UZo<^Mj2}bKz7JFCMS#LPu~sjPvsEJI&0yu+gEP~PZd#z2#d%c- zBg>mtH7OVsH-F-M?%B7Rq~2kfn5gWb+WV+u8%soeTTPi> 3NOT2Y7%eBiYnt`qQ0@ uY|ZeN81u6MTG& zcQBi3bq)vVFne?dPbK+7<)n7TZ=c`OlSTBrRi p!ry!Btq#~fwYeW zKUk^hX!E9`+-9(@JHAK7&=6$~r($&LxrpO)#r3iFkS)tYQ1nHTPTSkE^$bU1!IoUn z!%~I!HY 3qU_TFuN6W?Fl(adIMbE~YQpV@7{PMfeMHl#E@tqrZ8aDWzBv!WATu z4@CIes-w|&a~#A-hlDEN)$vC<;aosdy5OwlqWf^CD)hTzu6iimuDPMfY@~Q&^x4tj zfREqccb==wUc;IN yrIry^jX(ZS~*#7uyib zx$OBLl9^kS0_ruboPT#EJtnwLuJxJ%-o1VgluvLmy`B|=0SfS1o~uyujz6^>$$t%{ z6)P~-b__Tp3HjaMN=6Y1gTV?cVAS2qmoMK_P{0FJd ~RETSmYL zAut(4$w&wceY!ld&N$sYbDyiW!~iPQhonIk)4sP$jV?&W6}LhB68|+YRzSBvd m1+adoo<+y}i|U-uicB z9h0h-xDKW-mDRR(;Ux(q!Lknc&Top_gPHK-@Uz2*#2`+_(k|CWyBGJx^yI@CqEqh5 zGy&HqaAfGhE)c=<<7LU~{y4>ukkotJc Y^8i=QnbK*#ee#}F|P{)_8Ru>c_flSG#iP@s>;NCiQm=pYv ddr}?vS ucG`Kof|w%f#E|MN?W4PH4U2~S8NA8mZ1o2|F5C~sfx23mC% z4Mi92nAa|*Yh(#cz*cHs??OjaY>q-1a=ronyuq9H%9v%%El5FDXso}KWJ~9b!Q@T1 zj$s%*o&GZR=onE6k&|g4K=oA@hzlQ=QmOLC^l`u+bO9*J@4nhm^wProN*`zC+1PWx zbkLP+mICe&sf}aPfkrubeTW@r-9O)E;{3zd(74}4Y9`afmoj7WQo61rKy;NEl@BTJ z#Cw~I0ycs{iMI<;M@DQlVGY02F@6imc=`KLzi^Xs!r@(9%Nd3XpwdFT8cZJRV&R9g zL3+uoRfkK2V(4z>#wNM3>_}x?37AUK5@Ohdh~l>UzGj5E812j&qPh*Sv##wy&>7Ov z471#fxQaJ9$Bps!kPp>42&^F`Ui(bX(g6O8V{oYS)FEsOJappKBGgN$0DvmPrLQ zen`v}^dZV)`n1+?;8yB{ovQOp6>DQPANqG|$Uc)DlF-jq>^_Z~U6ZD9kMnIj*NxX_ z>lLV*VpU472E797pYejefwwPDC~e&H%n>lh(?vZFhJ8)?+xZg=Rbb!B+c7>2WFzu1 zs`DE!5kiEV^W%7VpR3%d|2YoE6pD@{yE9_oANCS_BGJc^35O1aQvx!)I{jcscsL5a z`J +xZy7+P}#zUf_ulExoN-Vea z>Jcbl=HQJ>U3>8@-62-7?Vp=H_Mqy!3gpt;Gd-3cRy2n%Jz?9}Nkqo2}!qdw=uf zBo6TYhTwGp2 7}& z>Z#Iko!Dw<5v|}*wL?MJ;NTkKN?liPW~6z)KsNfQH(_rtZhiio%?rt+h#Iy692 y&4elK9>wCzL$Xm(fbo4+ZlR|My!?)bM)%eTbO(GEyUHLsc~uyeZRkO zPE!ArE@(c|6z|1fACWTHh??GsSj72+RG5{D OD} z!_qrJpGY;daJOL=iLE?%P-=eon*=mD%R67{(00mdH)8Nd#jqZ87K-ng=thH=>gg@C zJ+SKb$G$(J&!)Kf`e!lwQ*pdgfU}-YmAr>JutZI?E;;&IyGdj~+4hFkXk?1*kx+ zYSC!0W#V|DO6y494tir$a=qvYee~1(2{D2tMHATQ>l1!BA2yOQX{d#lW;Pyw!;aFt zMPr`$HCIkHkcXDA`N!wIZO2n X4Ef {Y?pKudH 76Er-9rpVAwLgnc zaL_13sG4>C1YWtyL9^zDN~JN?1eSHh3YV&-U6wIV;P`@ro$EPaZ<(9`S~@W8$c0kk zie|8}#po%7*hmRI2nUr+Q#!^*M8D|Mo$2Zl@GX)&;$Ik~=7;!pTnLbv3Da4c97I$0 z&YJcqd=3NqwFA#_S+T3&{jD6fVKqw>xIU})yXgM&A*6??jhL(Y8s4 I`714)CFdz#=Zd1pJ<&B7wC(c)~@Fp~S)UNQxgmYagUk^4fxK#6M9 zJm5wsA)I6<5t >&g+;5#GkAk4K^g{k>p zrF}h{UoDJ50ACx%%^w<=;{^p?vQld51gA49hb+)*Y)AkXUH(RQzz=5N`6>SXuN~Oo zf;csPL_|w04UmgZl@Ts=q^TQG;eauJ$?ae0=4@#dj{vR3B*_Y3F@zgFagErq?0WZS zO*+GoSd)}ppXe6|__jXhTL_DpOsoz5qTa)qK-`Rrla6Ex*;^fJAl<1=x#-@d*XPc# z&OH6_q{zOT=b<_?`YpZjyCX8{60zE#5OBHdkLJ-+{a$QJOl?=u<`FlemKaK#J%V`0 zR=sI${sdkKrq(%`6(Ce?y*$g2Ap3YzR31mf#YT&Lqlz?ls&(isQ7BdVTd* C0I+%GpFhE21=bANyQ*4A{QC#-soD>zm2M*c zgez$DC@rb2;#eA-6uR`bn3RXcr+Wv2X7`zvzdXAH%~~e-9N-kOir7O`fDF|-wiR3* z(eTT&_}sCO6lQoALBrQNvv(y&E2vpNaYSa4gEt1172cR^N`*r`Qr3hE8ihdhHhs;* zrYEMS*`i6Yoa@!NT0SsQK9oGIyD0BWNRCB&CY_jQqcn4P2b_7p()0}fW#-`e%m6n> zplRt=K^o_V5%mp1X}XC{-BlCuT}1k<6O9;R>koaI-ybBtCKf<27pmR(Wey2DKt(>m zho{xLSn*z;jPH*m%B(e5;%?CUjX9_?$>=91-CoS~Mv^gImXRq(GK|qMLqwNwB2^gA zW9iZN(gtG~zS`!(v-jUDKBDw=(lPv;N$@UdaZ6~m$E0t@go9Q|Vh!?XIL7d7Ot$zq zH(_Q*eY5D2=bBFh4Wt4*{Wp<<^QJR0pP#SrQDh6MJ8NVfchZrF(`o-%OD+gxNajVI zT~V=6qi{qL-2Q#gSQKK!iA?y**buS#C2Mq|(z8SC;Sh!YbMdeEgyaC{?^-F}D`W?T zQWASFuAal6OtB1?<=O@!C@Oc<$|dstew|{>!KUowC-)<3T3j+-E@Z+g*N^H^4yy*w zer%$+@I%&d&%l*1>t!1l&7Wyju%SA^210?Cf(;?~gN#7agrYv!hGX_x`bZiK=rS4w z)Cz=QnvyJeTgrnb7Z8qd)~QN|v+nWF{`QhXVH{Nio_% x${;z%MmsCAT99x9H1po=fn$ngi-_-) zH3A@aNVDILi4HT&FjO~`izdNDi(4u=^7eKo5lZkH47-$UA&U;&IMj(5=L^-tDJiMZ z3)x*7t-V9Qe8XxtxX*!Y2UqajBW{UV17o&Q1Zcs*VCLA4g#O*+j(N8FJ2)SAo>_`2 zU_fJfjn`bMAR^heV5$3h;BSOBbGG^() _I|O(!mm?XH5pObY$ZenBZp(ed)IUJ3~b27YA>!H~sok?dQkdnn%wU)jjnz zEPoW5^~o#g&ht(NR%Lp=NiyXG;ps6ahWn&7L;>E$TQFw!7sbsYH^G*pf*vt8^z6UC z@mvfq$3jV_32rZt0DlqnJ j!GOtdv2AY6$l~W9r;GIlHc}RH6~Rn2 zC-UEwq;O>*hhl-|p`T|*M{C?C4`TG^9y~m!PgnT8epk3P=uRSGfXN;p`&Wm>m#2nP zVXP62!04f-6fTDlE1jNs-#yjCWTGiag@!8GIoFYUdqbg;^d_ictvgZyzOMrwpn4xe zmf3c@VU5qUN8pd)-kNVsBD_twLj8CLewpin#xNXB`l;+5M3>Ff{Uz7hKrZBR>B>`L zB2F@O;7rB&fWO;Jv4*(D EPUps=6a~*K2P?w4G5~QiQfbgl!T1Np01t)8(*}(Iy57Q1SJ@_xa z3BUm!%cS0Q$VzOo;QU;!{eG?x6{rp1_k{5;78(u%O$)ZVSR2>3qf%mQn_1>=9ezv5 zdvKq6wShd6TKe?^))gj#_oWPloSR^Fim$np{`~Z7)UxG=htsR>kYKmns1GTne7Y3n z6p^M$(O 9!LPYsa9rjO#?7|9zNmwlTKmuw$a; zRzh$ilu*fb)Z!A9=bx|Ezw^ePj1NnY r& z5E8wu6~og QHxm5ncbkCmU~X&-W?ra12ir$O;dAg7I@->uf+F$u7YG0? zh(B$8sDAntN9wl?t2rEnZ!|bozhcfV>al~OEPF{y-&ew?9t7r2;uhQ9Mw87`uEXNu zQ82>ymE-5Pdp$*xxu!ZKH=20G{o^HbA~`%Mm)3-HqokHj4~jwOF$M*~mt~9CU~Z7W z4P#QT_~N{ByYu+25VqI5-R{n(dV?9_=Y|q2P{SyOA|R0vLTl{;pz*BODJ+g}CW?x% zUE)$#Mfdi#wweI7l3gH|V9vb5qCR+k*$t|7vAM}p(RF)S!Tb(4XQ(ant_q+c5F<7H z^}7bdn$VhpFWIIEMdRX9WKFy}@gGp>z7H4B^zsGsqK%`3jpcZ)Q%Qyzt)2R!FSs1} z-?9~9wCrtr-E@0g?jil1v~3c9@r8h{3x7|X%|pw->am6J+4e7-kG6J5bP=z1Xtm~a zY)F8a_aj$myjZa}mLnGLq$sN3@N;{4kRQAZ4A#~`G_o7q-0K3~x5u9^=j_|eM5;RW zv5WJLGf%jE#eK%PLTkrCs|R2KqpfM{Vu5@rH|{fMvbctl%z4#!>tBul0pUTeiUEg0 zX}N;ej%sok8=}TQd;dxe{aLi$Xx*1D((xg6z-=+MAMIMO_Y-d-57VRwt;}Q-q|E|^ z+Th%0@#0TnxynFlOv^(n7v_PE>PjA(*H723!)W|RzNOy;)i;^1l*Nnaqn=cpd2(P$ zSzCgXUh*Ep-Tj-@FZAu%FKU^}0FR5X?-eHVA!*4zVx1~LhXA%N_3NHkKGY8&V_s~t z$Fgnf!)VxYyqxcf%&O#n Pd{q&@pw_q^2cMj0Q(CCBQhSeWkH}>3Aury# zD-cuT_4q8Rfqz|hza#AMq*6LqFz~03$_w`GU?jdz-MI~{na-}5NQZ~4(3#i3s@##` z4bNnywn$l13mkBORc(OZqB-^DL&$QE=@EgLf5G^m=-lzLJ=xpfX$_YkoSl(n+S`L? zF^JB9aA?h03)~-Xbco(P2-4pmrRpk8B9y|KX!WDz?U?O`#pu0DlHF4DxOg?-{{xVL zK7THiP?s1@{;kdmKG*Ay2*L|EX^q#r6wJc{X5qo53Y&m{B!!`Eu(u*VQhK4t`a! ztu1cyF7j$zhU-d~JUv7xA aYMRBF%znE zHV_jj>g4h3V0}3GXRxI1Y~wD9EQRRymh7mZ`a4kCh$o|Jy1P&w7p_R^tk&O_b(!_? z|7}IN6%=lUbCpc?XKl=ICj=kh06;r3d;vTQzTN&TdasF<4j}+1$0#)@<&EDz96Hc{ zuk9t*^r6sxNIE)sJ2*)|oNS&uJJs9z2Z{ykPgq~PW2}+8ew6um@m?~eY9_5;tk)R| z1KICw1A$4jHF!bRm8bD%T}t}D8qS)^#{~Y?@;u *nj4urLc&6O2(yV^J|)B^C{Oonmb8*Nyo2s8@!a|JKTL ;aDD5PY7F_6kIAbj-`xNm!R& tFVLqf3NJG#&PXYT;iUAj}?Ug6xignQ~q?(K$nZRt`*H z5rGRq0- }G)v>~-=qqU`xt_q+9@wMSzJZwDZG5|uzTc5w7)daj~e*mRW< z#(Z&%a-Fo1^eq}g-7wX_Zxi>^Z|>a#WAN>74Q?0jx;1vJ_+9H=SkHG;Q xj}JWlrUI{)Q7mi#lZon#EJ=5A5VU)FJr+xJh4Cjx|pNqDh@3b5Rjq2 zS`-ydW}mGWqk)iOG&n?g5A;EdhckKv;NS3kD(k4I;V1oy&&J_XQA6{N0bw@j1?9nV zR+g*c+@AfMLVZ UfCxml z@(Bm&jWkQ?yx7-irh9y>Qta4B=NH|Navkd3j5|AOlP5S{R3aEDQCW3IyRT4X=~+w= z-Vjn|(?JRFll6WgV*a201iy0>k31k!eklC&PR(0#T@+UH)r$Ymx!aDRWMe@Ak~}u| z0OZq%ciXom9B{-d&b)50M%`ZnTLzG$D4a F4oE(8k*P(p_CAisi@>zBGD6QXA4U@$~M^Rs(K=(D%qE zc;@TNQ0P 6nx4ArZ@xqZ4$pXE`n^drMpzFxldxH-l?A?FvwTGz+@wRa7i{MU@f&LIHg z@|wPXM5;Py0q;mdHuz6rRu2}0LgysQtCw3JxADq8?rW91;2rw_AWq~JEv2Iiiw}m} zM1$xgqW6m;IT4Xi<6~&$>MYRN>*C`FkPu9nNV}Wk`KqGyOLA>twDU 1 zN2PX18L2?m!eY18v*2Kvb@a&6eH 0E_(-%?y{0V>9QiZX7fcF*<*w9t4l ^}~>D-k6E|ZN;`*fg|!U?ot$WCl+$A<{zU13v8S|e)73T4B}%u z_9hb|O=zB#)$l)WzGy56>GsFaKBLv1ohgwBLxtUVrC73zh`9uLKYMS1`kuS(Ikvsq z72Ac-P%Ni{@35O&;n{7254D%J9~wc9>#o(aQvd%uAVO56YFy)wHK5SZ2erRH^_(V! z>Ev*m%MVaxA%NTgm>rS^gZm^fkV5Q<9s|x+@En4GGikhEXrlUtK+p@`cuK1MMHI{; zz&hW8M;B}NLO&-HWVrSPs0Z)mKJ=^5f6jRf_l=y_zt!vJqYutNTt^L5Sq3sb?^%$m zUQ4&bsi8SGc5cmr4FVZDW(7aQ&WFmHMz+?-8Q0>N0-IziDa@ePSP+mvv}4Mevb;&> z6D#wZRb9YdnqxA$fkM{P(>;eQhbx)P)+t;6k(rAiCnAo`IqdvUcC0Td{AELK4_TrZ z3c_8`{Y^?7fijP jWeWnNPb@@ft%A0s!@DciFB$0p3rCs|{mUz?0EMe}35{BS1$W*h z%CW^g>1Qx*ULJ?ke*dDJ3(h`wZ|?HnVxsCr;ybH;)K|#{5uV=!;&(c8((Q&e;N_rt zc9S27u7y^pVKn8*_9>1A#hAUx#0liVSuShp$Qk0jIyup1)KvLrFdq{ gp%5A?%r76&bc`-a3LLewj%q5JoPzTFopYL z=E!|#CBS?8`{3q_+CSxB2xbm?%z?bv^|qXw_(Itpk+^5dd$-CdQs1Wf@XUKm$FXes zfeIyxe>a~_(;i5Pym ;i#b&^eYVs zCYQ?IRXQtn(RMd-mFJs8kIiJ=SYR6}n+~`xz@!^cqcGvtxF(L<#riyS0vbc&`ry-E zKZmmYCz&*E<_iK?R@T!DPGSY|Fe-~ !BT`t5tsM)u+-~0OO<^U_9;dcuiE)i_K$cn;@ zC+tm0)dzTpU`=sT)0n^QRvHLG(du(~qR5cyD7c2(JvA)S{-*QA*nnUShLH0(z`1nf zyG29WajMh)!SaBZ>i1+CS zyWDu{1kC3aAfz0 z{fu72{U^g0`1VegV3Cy+YVa&*&Ia^QhIK}K#7Bl+|F+?!!k7pT6BtdF5vt8`k%aS} zxN&;+(Nhu<;Jm+GLWC(KC5g0tbMufH7r?z{F{cWkbqs(I25=8DXpZb!;p^Z#pVDWt z=;MNk!k((1B-In7xWE&N;DRg(R6Gy}Fm1n1_(}a5RGRUudri7gYK(y7FxTv}_bt6J z(i4KoVRT45Td?@}>xYz`intBt^+Tom6Qko8VwrnivYGYujQYphE*@Nl&JqM51xXKo zCI6@Z+bu{+Bz0 Db1wNbGqmJ=1{#mYT^Js9=rWtn)2eNX$TIFIpNpEy9&z)w_dnQyx zAT gg?fLmZMw9ik8^XJkYTidgt zS3vkA#S$NzHLaKY4&*QrIHab>@Rv)R#Vu`_JpcWZY<nSiSdOex{BOkq|GuN);t$`hgH*cAbBEt)Y zh5-yT$s|}8s0$?_{@t-SQGDp+U+x#DAmxbh4ayAnY~DZZVb(f0NQ_pf(l5CE6Z<$* zqx}X)IyNm16^>>sEhajKIO GB-Vy#+N^;KpFhYn)D0_#O=?nba~MX+h91HBg~Id<3jhLz+U(%l?a?nX zyS?2Skc_Nk(eifTz|8+vI@%Y2pyL0xL3>r!VeBUYi<<-eE}hAr7}HlGN&9gbD(IOs z7&aMyO|%!Xm%$hWb=VkD03it&x{m^!F&GB8p<_A!8HcxPh9HFv0an^xRGF?I?~@f3 zAyz$YBCNu3(aZQ;^*#;o#$QcnGJx3 8onY{raPu=j;p2j7$vR?E^WLVu z=!!1nv^VZV^!~FqLe;0??~v;Zu78O)z$$!^dXD