From fb6f59e074810f0bee1924f1e0878d0c44d36c6c Mon Sep 17 00:00:00 2001 From: Jade Choghari Date: Mon, 17 Nov 2025 13:52:58 +0100 Subject: [PATCH] more changes --- convert.sh | 4 - eval.sh | 1 + .../tutorial}/xvla/inference.py | 0 .../tutorial}/xvla/inference_pipe.py | 1 - examples/tutorial/xvla/test_xvla.py | 218 ++++++++++++++++++ image0.png | Bin 59213 -> 0 bytes image1.png | Bin 50295 -> 0 bytes output.txt | 0 prepend.py | 28 --- src/lerobot/envs/configs.py | 1 + src/lerobot/envs/factory.py | 1 + src/lerobot/envs/libero.py | 39 ++-- .../policies/xvla/README_PROCESSORS.md | 132 ----------- src/lerobot/policies/xvla/modeling_xvla.py | 35 ++- .../policies/xvla/policy_postprocessor.json | 37 --- .../policies/xvla/policy_preprocessor.json | 87 ------- src/lerobot/policies/xvla/processor_xvla.py | 3 + src/lerobot/scripts/lerobot_eval.py | 2 - test_2.py | 72 ------ test_3.py | 107 --------- test_xvla.py | 37 --- train.sh | 13 -- train_multi.sh | 18 -- xvla | 1 - 24 files changed, 267 insertions(+), 570 deletions(-) delete mode 100644 convert.sh rename {src/lerobot/policies => examples/tutorial}/xvla/inference.py (100%) rename {src/lerobot/policies => examples/tutorial}/xvla/inference_pipe.py (99%) create mode 100644 examples/tutorial/xvla/test_xvla.py delete mode 100644 image0.png delete mode 100644 image1.png delete mode 100644 output.txt delete mode 100644 prepend.py delete mode 100644 src/lerobot/policies/xvla/README_PROCESSORS.md delete mode 100644 src/lerobot/policies/xvla/policy_postprocessor.json delete mode 100644 src/lerobot/policies/xvla/policy_preprocessor.json delete mode 100644 test_2.py delete mode 100644 test_3.py delete mode 100644 test_xvla.py delete mode 100644 train.sh delete mode 100644 train_multi.sh delete mode 160000 xvla diff --git a/convert.sh b/convert.sh deleted file mode 100644 index c7d4998dc..000000000 --- a/convert.sh +++ /dev/null @@ -1,4 +0,0 @@ -python src/lerobot/processor/migrate_policy_normalization.py \ - --pretrained-path /raid/jade/models/xvla-libero-og \ - --output-dir /raid/jade/models/xvla-libero-og-migrated \ - --branch main \ No newline at end of file diff --git a/eval.sh b/eval.sh index 22d45db08..45acb100c 100644 --- a/eval.sh +++ b/eval.sh @@ -2,6 +2,7 @@ lerobot-eval \ --policy.path="/raid/jade/models/xvla-libero-og_migrated" \ --env.type=libero \ --env.task=libero_spatial \ + --env.action_type=abs \ --eval.batch_size=1 \ --eval.n_episodes=1 \ --seed=142 diff --git a/src/lerobot/policies/xvla/inference.py b/examples/tutorial/xvla/inference.py similarity index 100% rename from src/lerobot/policies/xvla/inference.py rename to examples/tutorial/xvla/inference.py diff --git a/src/lerobot/policies/xvla/inference_pipe.py b/examples/tutorial/xvla/inference_pipe.py similarity index 99% rename from src/lerobot/policies/xvla/inference_pipe.py rename to examples/tutorial/xvla/inference_pipe.py index da42965c1..c60a4e305 100644 --- a/src/lerobot/policies/xvla/inference_pipe.py +++ b/examples/tutorial/xvla/inference_pipe.py @@ -56,4 +56,3 @@ target_eef = action[:, :3].to("cpu").numpy() target_axis = Rotate6D_to_AxisAngle(action[:, 3:9].to("cpu").numpy()) target_act = action[:, 9:10].to("cpu").numpy() final_action = np.concatenate([target_eef, target_axis, target_act], axis=-1) -breakpoint() \ No newline at end of file diff --git a/examples/tutorial/xvla/test_xvla.py b/examples/tutorial/xvla/test_xvla.py new file mode 100644 index 000000000..cc6e03df7 --- /dev/null +++ b/examples/tutorial/xvla/test_xvla.py @@ -0,0 +1,218 @@ +from lerobot.datasets.lerobot_dataset import LeRobotDatasetMetadata +from lerobot.policies.factory import make_policy, make_policy_config +import os +cfg = make_policy_config("xvla") + +dataset_id = "lerobot/svla_so101_pickplace" +# This only downloads the metadata for the dataset, ~10s of MB even for large-scale datasets +dataset_metadata = LeRobotDatasetMetadata(dataset_id) +policy = make_policy(cfg=cfg, ds_meta=dataset_metadata) + +for name, param in policy.state_dict().items(): + print(name, param.shape) + + +# now let's load in safetensors +import safetensors.torch +from huggingface_hub import snapshot_download + +cache_dir = snapshot_download(repo_id="2toINF/X-VLA-Libero", repo_type="model", cache_dir="/fsx/jade_choghari/.cache/huggingface/model") +state_dict = safetensors.torch.load_file(os.path.join(cache_dir, "model.safetensors")) +# policy.load_state_dict(state_dict) +# 3. Add "model." prefix to every key +new_state_dict = {f"model.{k}": v for k, v in state_dict.items()} +keys_to_skip = [ + "model.transformer.action_encoder.fc.weight", + "model.transformer.action_encoder.fc.bias", +] + +new_state_dict = {k: v for k, v in new_state_dict.items() if k not in keys_to_skip} +# 4. Load into your model +missing, unexpected = policy.load_state_dict(new_state_dict, strict=False) + +print("missing keys:", missing) + +print() +print("unexpected keys:", unexpected) + + + +from lerobot.policies.factory import make_policy, make_pre_post_processors +# from lerobot.policies.xvla.configuration_xvla import XVLAConfig +from lerobot.configs.policies import PreTrainedConfig +from lerobot.envs.factory import make_env_config +from lerobot.utils.constants import OBS_IMAGES, OBS_STATE +from xvla.models.modeling_xvla import XVLA +import torch +import numpy as np +import random +torch.manual_seed(42) +random.seed(42) +np.random.seed(42) +observation_height: int = 224 +observation_width: int = 224 # todo: jadechoghari, image size is different for the two models +# create an observation dict +OBS = { + f"{OBS_IMAGES}.image": torch.randn(1, 3, observation_height, observation_width), + f"{OBS_IMAGES}.image2": torch.randn(1, 3, observation_height, observation_width), + OBS_STATE: torch.randn(1, 20), # ONLY if OBS_STATE is already a string + "task": "put the object in the box", +} + +IMAGENET_MEAN = torch.tensor([0.485, 0.456, 0.406]).view(1,3,1,1) +IMAGENET_STD = torch.tensor([0.229, 0.224, 0.225]).view(1,3,1,1) +def fake_rgb(H, W): + arr = np.random.randint(0, 255, (H, W, 3), dtype=np.uint8) + t = torch.from_numpy(arr).permute(2, 0, 1) # CHW + t = t.unsqueeze(0).float() + # normalize pixel to imagenet + return t + + +OBS[f"{OBS_IMAGES}.image"] = fake_rgb(observation_height, observation_width) +OBS[f"{OBS_IMAGES}.image2"] = fake_rgb(observation_height, observation_width) + +cfg = PreTrainedConfig.from_pretrained("/raid/jade/models/xvla-libero-og_migrated") +cfg.pretrained_path = "/raid/jade/models/xvla-libero-og_migrated" +env_cfg = make_env_config("libero", task="libero_spatial") +policy = make_policy( + cfg=cfg, + env_cfg=env_cfg, +) + +policy.eval() + +preprocessor_overrides = { + "device_processor": {"device": str(cfg.device)}, +} + +preprocessor, postprocessor = make_pre_post_processors( + policy_cfg=cfg, + pretrained_path=cfg.pretrained_path, + preprocessor_overrides=preprocessor_overrides, +) + +observation = preprocessor(OBS) +inputs = policy._build_model_inputs(observation) + + +#### now the og model ########################################################### +from xvla.models.processing_xvla import XVLAProcessor + +processor = XVLAProcessor.from_pretrained("/raid/jade/models/xvla-libero", num_views=2) +inputs_1 = processor([OBS[f"{OBS_IMAGES}.image"], OBS[f"{OBS_IMAGES}.image2"]], OBS["task"]) +domain_id = torch.tensor([int(3)], dtype=torch.long) +inputs.update({ + "proprio": OBS[OBS_STATE].to("cuda"), + "domain_id": domain_id.to("cuda"), +}) + + +for k in inputs.keys() & inputs_1.keys(): # intersection of keys + a = inputs[k] + b = inputs_1[k].to("cuda") + + print(f"\nšŸ”Ž Key: {k}") + + # Check shape + print(" shape:", a.shape, b.shape) + + # Check if close + if torch.allclose(a, b, atol=1e-5, rtol=1e-5): + print(" āœ”ļø tensors are equal (allclose)") + else: + diff = torch.abs(a - b) + print(" āŒ tensors differ") + print(" max diff:", diff.max().item()) + print(" mean diff:", diff.mean().item()) + + +model = XVLA.from_pretrained("/raid/jade/models/xvla-libero") +model.eval() +model.to("cuda") + +action = model.generate_actions(**inputs, steps=10).squeeze(0).float().cpu().numpy() +# (Pdb) inputs['input_ids'].shape +# torch.Size([1, 64]) +# (Pdb) inputs_1['input_ids'].shape +# torch.Size([1, 50]) +# (Pdb) [0, 0, :, :4, 0] +action_1 = policy.model.generate_actions(**inputs, steps=10).squeeze(0).float().cpu().numpy() + +#np all close +print(np.allclose(action, action_1, atol=1e-2, rtol=1e-2)) +print("max diff:", np.max(np.abs(action - action_1))) +print("mean diff:", np.mean(np.abs(action - action_1))) + + +from xvla.models.processor_xvla import XVLAProcessor +from xvla.models.modeling_xvla import XVLA +from xvla.models.configuration_xvla import XVLAConfig +import torch +import random +import numpy as np +from PIL import Image +from lerobot.policies.factory import make_policy +from lerobot.configs.policies import PreTrainedConfig +from lerobot.envs.factory import make_env_config +cfg = XVLAConfig.from_pretrained("/raid/jade/models/xvla-libero") +model = XVLA.from_pretrained("/raid/jade/models/xvla-libero") +model.eval() +model.to("cuda") +processor = XVLAProcessor.from_pretrained("/raid/jade/models/xvla-libero") +# /raid/jade/models/xvla-libero +# seet seed +torch.manual_seed(42) +random.seed(42) +np.random.seed(42) + +def make_random_pil_images(num_images=3, H=480, W=640): + images = [] + for _ in range(num_images): + # Random RGB image + arr = np.random.randint(0, 256, (H, W, 3), dtype=np.uint8) + img = Image.fromarray(arr) + images.append(img) + return images + +# Example: +images = make_random_pil_images() +language_instruction = "This is a random image" +# Multimodal preprocessing by processor +inputs = processor(images, language_instruction) +if not {"input_ids", "image_input", "image_mask"}.issubset(inputs): + raise ValueError("Processor did not return the expected keys.") + +proprio = torch.randn(1, 20) +domain_id = torch.tensor([int(0)], dtype=torch.long) + +# Align to model's device/dtype +device = model.device +dtype = next(model.parameters()).dtype + +def to_model(t: torch.Tensor) -> torch.Tensor: + if not isinstance(t, torch.Tensor): + t = torch.as_tensor(t) + # cast floats to model dtype, keep integral/bool as-is + return t.to(device=device, dtype=dtype) if t.is_floating_point() else t.to(device=device) + +inputs = {k: to_model(v) for k, v in inputs.items()} +inputs.update({ + "proprio": to_model(proprio), + "domain_id": domain_id.to(device), +}) + +# Inference +action = model.generate_actions(**inputs, steps=10).squeeze(0).float().cpu().numpy() + + +#### now for lerobot model ##################################################### + +cfg = PreTrainedConfig.from_pretrained("/raid/jade/models/xvla-libero-og_migrated") +env_cfg = make_env_config("libero", task="libero_spatial") +cfg.pretrained_path = "/raid/jade/models/xvla-libero-og_migrated" +policy = make_policy(cfg=cfg, env_cfg=env_cfg) +policy.eval() +policy.to("cuda") + +action_1 = policy.model.generate_actions(**inputs, steps=10).squeeze(0).float().cpu().numpy() diff --git a/image0.png b/image0.png deleted file mode 100644 index 4bd158cf026733b544975bb9382062bd3ea57f0d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59213 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≦f(@3cs>!;&q zb7YA)-^Q$0NS;do%8g90Wjx`IV00-Do>lqaRgIL~7r}&*0Ow(g3O9EEw24zfGO|(+ zC;%BDW~QdIlCU1C94$BC7n6=f@Aac+!dF50&r?OnY|5Okso%D|Bjf@>!dS@Rdq{*P z&ovIwo@g$?j>i`3AB)2(lIkcf@G85r?;%+PQ~Ev$g=K&Mn*|)U<~5WV#1YDoP{AZm+1O4lr?y|pr>%tfby2H2 zp}}Bsh18Zxh9!%Es4$*N@Vuged@>!?R$kanh{dFYS8&31`e>;}@4c(5tD~c%g+<|l z1JtsHj2_v;XkYgTj7waW1>W@b5&E6j$l`X6eP2E?eCO}~>31!>WXW0b_K%x$=RFJH zY--(YcZ`;f?gFyd^nNbS_e9ib<@#{0k?VcS(x)-Qsu@ec9+r7f^ou+bHC!ATRaI;T2h#1zs_|nam-ITGY z4o%d=hX5>G5X-s(A>fNV3k*Q);3l#mY(im zt6V#T{HATo?#-=7i>F6q=--Qr55kU3nkR!NJGB2-8R$tURfX()!B(r8PJK*n(f(2@pT|zJ`8MY?0YN$f5kRv z1g*y0X3Dm@_1A%)fTUuunxTf2=EMF!v=P*!Bz+uPJ%7K#Zghu47t|WmegnBaE%4FJPSr1r6F_L6Z}# z+)byj?7`x5YyNe~{5LgvZOea;8pn06hDYT#yS{&_*$dQ&LKXlNfT{m=)2^A<`k>VP za1$n7-H2f)?>#2KI9+u2i{u%MdA#eUsn(>;BaVEiWy#S*;buaXkW_AR-`(8|8*W{u zL(-3=idR-lYfK|c+7d5PTq|%qL7&$Kv-mCRpmLh9#Aogjk~v4XTpR=&cNhx{4g(*~ za{(6aP4696w4OK|$yrJEqY5$eRKfD7;b2!ttaX-Z-I`X)cg1V}9+|ouZ$fn%J*KF7 zp^{;BIWFl+zV9lR-}f39owq|%xlXiR68t{s{yxz?f`&*I%m7*c6m7CeQ|4YkWsBap zyF&t!!Av_*2OIJRW#o8UR);*3c4XoG>*BGob0`*?#KqBGnk(9MLMQR*Y-0 zjsN=FV3LjTJ7i%bXDD_q*50KfDuHFw4@TCPcmUJl#&MZbAu*&@g8a`B!KBZ_6Od80JMn+_t1F9(K6gn9tDS#u{yaTB{eX6zcJM?iY2G1E zOC;U*ug%}v8ydd1wD@ig#3|7GPm9j&yQ{0KJFRv~W~q{qks%a4$Ffyf+8^C(=cp3~ z$B^QHZ^(I2k|`oZe{hf$7x!{e+%CgF6V$B^rJ;}&Y_McWX38_%8OMIsIwdPszHA@^ z5V5OTkO#mVGT-XtzF^y63o36Z{0^6ITGDzqrC4NKk5jT{`t?b-%#TtT$nK`B>wMFHUikQsnWNxy}NtcOB zI(JVDIa;56A?FJJq~@#~B(%cG$(iqWq10j8<-2>+f4SRr-c$>od>wF+;#2&JCVl`m z{_1(U6qi~~^G}Dbr{}GF*Xp~=z{A-Z!dG`|tWx*buRCFIN1~RItSZym%L;)SJ(XJ> zV?)DzkJpretQ5q>CJOawi@+Qq?@5OiQ3qf7?wt|vXbxGQ|Lc9c*Mc!UJUo!@{9@KMmIKGbKt1(uGWzCy$@1E1X<;EN zKflZC+_K5&_}T|?hfH|sZF3}o8UP4ma3C6!B|iCO~LMy*Ib#rcymL=h;x`Jy4fR!65j6cH^#--kP+0Y}EDj^{-!QP$OgGEqrwX0sj&r*6kK zGJEXdeF`y^=pLM}`w~Auj0WKd%bT2L4Yxf-?`6F+yeDCn57Lo&)1*L$1#5m2x#l1} zk*;APpRXzl4MG3SP1_q4M;_c07OMBEe<5uDb>-KP$e?7#e>X)J10 zGcjJCN!mY)j5;TYg6Nl?9V=sZlnE=dJ026Pt+bMJOol0N#5j^58uwizITx^U=Jir! zSy>sf;XiXTA?G$uOxG&avTHH|xNMJ*0z?A;K8+h?vwZSO%uGvR)i~3018CIFG|7L= zYMjU9@C*JO(k$o4brFvt^(R)!B1nhkZCDxK+iSF#p?uo}9pYFEsEci1w1WzMen)V3 zMLP95+jYE`v&Lm3bInsI^u}VJ);81HLAtymcU#-cCXh`s>?X8E-6}nKqH;8S%rF|> zcv4rDS!yly2IhUR_kL(_ zMq`yW*eKQ1p%{m4;yo*ltYbtLkVsqMPxGTh5Hqo!$h*FLV;2d`XAolzUq}a|l+`d1 zB~9T$f`i;eza+|sF@p=m2nw6TV0gYn={nqcWdtO>o#Pbwc)~xyF90+&G~NHCOh%Hq ze%|rwePSLltOy8%{W+Yz!jd*5Etb-A#l9jD!gXXw>+I%=8w52$i486or2%LaF{cD+ z{q}fme0CmJr$vQWSbITXpB`u;V9aO~7;0HeS_Z_qEXg4}*pFOcF1cy1Rf|$_&|dYu z;G>K-(wg`+55)Vu67*Ic9a6AT7d!-KFFn_BEt+zncQYJtrY0_ZCTC{Cl8${a=m{-o zBVXJR-9=X92Cg?ICNow%0SDLG^pA!nK&h_g<^ePC`DTLD$?YScJNTtkw*lMurO1q4 zM6RqmM`m9EHVZmNAIVwSgJn3|zC*a+F;_m-`K+QcLZi;fna4`i{so_p#M7@uw%+&b7!WR3>eDBA5x8v7lXAc|W)V+L<4V?(d zG`BAc4i`J%MIFGrl!&pRDF&`rD^5Coqy?|3A0%39K0Wbid@Ya2apugfs)((~NQt4M z2c^-m&|qmQfy9QD!^k1$mFyz*L@Tu}8dA!4ovEYKhDiPZ^yi^W#iE7t)xO>FTAUJ* z{XyYoCtQv;fc^=@FIJvb9%B0ujn2IlmNq>hq1Ds+^7>7|4TihI2E}qxvyT7wk*dYs zsptK}UD+F{m!BTwOcnadncf+H)4_)fT@gOV5LO08M0O^$Dw$rDNBnk zm&-MW5m9Hk$$LSm8qMc=Z6B4?PEKC3F6&@i`3J^+pk0Bm#QqM&19po}LnVgH{bfuAAPs(KO93cXeb+O6O` zz?B!f5csV}tA}(j4MKhKyUd6h+Vl;d(Myn|%=wN3DTx~&H_A&NWZ&)5MI&G3M!EKc<(8d+U6n_VWB|}qOyA;{Qr&Ty=l~&&B zMaTwRtt>jG80(HHXIvG_2tuRYKuI))%t-+sZPK>p(BDPv7_9=!sY%hl$8@ruXt;@? z=tFvZns3lh&~KO)-v*}$4uPVsRbRbt<4OZ>ph#)ExomuPjwR3mb`~6GynTM6x^QcM zZ#D@F_f$acAJI{vo|Z;yA)`vGQ5}Dv#=jzpWS3q83bsZyDze|$CCC(6nNDl(j2Fc3 z)h8jx=l$}dT%sk+pl%yG+(yjZ>(#la=1ozpk}UCWe4ub)o2Dg^L&ar0v|6T3S@Bm4 znbS}~YOGn0*S75gv6vzXm)J0WJHtmwG09|*rat<77HaBXD=}hZ?Y^edGj4qaxAr5S3}U!b|K7`TxRE zf~3mUd6sug7`!@7YLN)3k3LWSI|n;0mcm1eBU1bFZr7_`PZb+QLN~|Zfkxdg0-}`h~i#o2Kvpes_QY2p>?Tc zlH!AveQM~R`X0gX(dzl*-JB8*T3U6Zxa|yXSc1TVh;CR~Kd-0AEa`2P${~>jZc7kg zMB2p#z2`%8y)f3~Rw+!%1@c}ERZ)VLS@#w7pj~(Dkf1ZLU>Wx#6HGBvCiTGc`<{@R zO|I~EIjyS&23BEo?UGZ#0v z%k@Y)jV;I*BdpBy^4~X`pN3HC#N{QwjRndxLqCQWIF9Mz`en2oz zH0xRvR2NQ^zw8Gku(VyXw)^mAkL+WAOV7#Ns{P6>>14e~vpbM(;xH&%3sURaVy7{awl4Qm;oIBHQ4P~H)ITV0SL{yJ&pjVoyiJsqsKM6Z*0 zi(a#|0$9)as2<6lh?LO10<1m_pU*CxwqKs$bN2jtd%4jcgAk!hK#u1~Oyk2g4%o2A zCTmB@PC}P>yMgnCs7bE^`lZdd&I}{-YT&%6|Fj8+d!N+;vAD z=&csN!V5(~G4ETeGAJD|i;&kr39GC)V|zjo33~O};4q0>N^q^x6o0 z76ofm$O19yIh5KTxW64wmnQc83AvDEVh6s@Fd`-S4u9h6hSRSF-NC_(@@59YeHXHz68Fb3Nj>I|SjRahN2M zL%HChwvhUrEQGN&YT>`94}qo1anGckwPpLw_npzyF@E$Xp69Q zb8{1+IavJSx#IoK`M;GQe9ILj(q+ogS4#e`Z)!Z>J0{Yp#n;DYq?Y$+VRco(t$yt2 zC}s|ExK^pS{+P{e=o~;Dc?p>AVxu|uZ2=R=s5hczqle&uz;JHvVi9i z-S0?KUPpEPCGWRw-OE2gJ6*d=78Q$&X)s|Foy5x0sg`<_RH*jQac z0n_nSOBlp-R(Qi!X30*Gv&Tm#bab?r(xn_d4kjXBe>GJ9-WSY4g0ZjY61-WzeWn=; zzx@Woi_^vKSB$RvPf&5DN$Ynpx4ynUIjLEr*I4Rm-i_LgymIky?V0cWz^)@gUZGOJ zMz0})9ubiUnwX$A;GT#`XDJX|3D4*CN$IPH+zicPNSmhFtzVUT7499R+UXTn>#14u zR6_nyWbl?_)`{Wbv~9oSk}I+_MP=ZlP%Mlxs1UKY@C@lLp}{oj{_0!0AB4_;z0Mck zH}9nm(=UkvswbT>Coq~|O>ZuK(>`5ky&r26raWL{nXC!En>Iat{{KygYad#GmlVBv zLOPSFNw664->MYyyE{qFSpY8$!My{;3Jw9lD;vYPx~QrALS)ye^S0;O(@Elans{9D zQBd=n_C|{?TQHWiP?#z+Iq1^^v2w<{dVFmE`Us7e2q}@MON}vic0M5-#mpp@bHj&3 zra$N~M2f6v8l#dXB!s)5zKHZ29v}XQQxuVF%b3=SbU$@rRw8MfY)}MetnBZ1jCY#4 zI0Pz>Xo!Y;E3w(1WQu#cyt(^X_SG|jA5qZKVG$0&f!I^#hl=8DzQRtOU0s3Qil}Ig zhjdYRvxbzFGY9%z4>PY{-G^NYAch8W)MMTbqp~^H{ArBX!}j)&R9YmL4O8+>#aC4 zIkcV~mpnEcuX4qwL<29oA|i6{mFNllR7Ykp&Tq`Kd@vMzawTb!i2PVWnEROOF7%gg zyYFTPlHnpm;zkPxhXjTaT~jBohnl*cE`GL0k**?ph8qeXvxyS(Rb!gbb2oX06jfZS zDIhZ^$M^63?ltSRoJ4YWF9D$2^l-=b^xx&`L&nll8yQ>Bah?7qXp3Hs&T<|Hhx7#@ zh)-+WI{QUnm>TGZS>hiyl-JBSj|0h;nbUq2)gwxs;s`j-mr^j3vChj~Q_4NM!;K0M zk+pd&sLu#a&+hmEp=VMCFhpsGgZdYT=A#xSA{EIL6eQ@ie%comGlD(qL=6e+|=19#$bPTy1IVHWDl*7Up;ILZ}A>eRYcrNqQG9Pq#|cz8lZ zSLXs?n=S?xsoFRZ-eE*&Ou$&0BKdk2?%HLr0byMjCi3|hIWb>gPR7;e)%aRVg6#Q`PQegaG7KKmU z!9=mqNAU#8l2lo%nrDOzOoJtsB!v*?5GpiKWwIi*ii^601`1XU3t|M$(N}L;?0|N@ zN8Jz}KRv&|6v{3sGMW~%;RjQx{9Vxv6mXFrg- zgRv3q#WuNjrnZ`Zvy-^n*}1Wr+FBK!qCPeo$lvruu=s+izXz`g4&$~-8iigZFNDId znq?f)U9O9r35uchN^gMZk>ArTmYt2lI+!fsSuTk=8O2!kEwGz&>|@9;PUfD(Abxb) zlKL_f8GKd8z6xFDTTzq`_IEX3LvG-$!8Z1l`6<^wLG3hvyY8Rn*Gg9m233cr?LVi+ zwMqp@rWG5_bva1I7lMU_{C2Y50oK;mf~*mMK2%%0IF`0?GTPC}coMQYOwS%S`qXg0 zj=PPRr-!MjWtJ=nWy@4?on=2COy4>Kf_z)r1Xlo@8+; z8a-hcvyBOi(i?IgjfemhU`t z7&ZFPf%=ne!YkUBqeJhIy+%FB*f(V7S35^a>pIic*4F-F{o;b(d9VUY!A(Kvm$P$v zJK8^M`q=>&)JkMQHoaL%7{7emIIP@HyUQpr?OD%n9JnhFQ7Z{{t!6() z!VfN!{6-FMa)k@N2lt%W4g*UXGI3ZmJ2Sj=HazMgafZGgGlexuM&F6JGu^Q1g+)*I zegR>WM*S$@TePHCZJT)DsTk~zDrlrg_{6jz&f-|rEUMmJyab`}4|eCsK5Bb5K>=c`?E{{_63_ z1u5wIEh29H7W2nfs3iUylgP!7l67hQ-zROKVgk>3^z`+;o6-LXN=Z2z3Q)x%$4764 z_sa|_v_Jp;?U}u~8Cc9-2UEZN>Rux9igZ+}#Q>sMw?w9Zo)O&e!$?)-ZV-h@@>L9) z1jDdqV$vJ{%v?!QKD{7Vk+vE{AqYd$eH&ts1jEGH1cYI25$EfsOA~U)63H*-R!~{b z(vfs9OFs;IQGw4Vfs}BfT!TdkA}p88Z1S~ z26Gpw*vZMsk)Y~6-r{RuV?^NM;)IOzM|VU{B`yfvY)+P%nv%l+HF{02+g&eXL>8 z-FhWjq_RAT@(sMLM2X}SB-kOg=vbB_pft^ou&3-%cM?{|r`I|FNd} zdJh*b+vRK~RXMM)h!6H3QjHT!D=kH#O4_prhZf5P>vVvj1)1+J_3>imO!%HuHSv{5 z26aM{T$y_Fa9Wj@85#%J_ZsT`0Is5erj?NW+3KGn^;5ri{a-O8^;Or`Gk7UR^G=fY zsrPZ^N;vK;{u+97<~z{3pug?xZrIGk$Pi4xg=imUVfA=x%2f9GV$?d>5BJ~0;``c; zhl8rsryXG=+kb;3`Hbd6-^zm!oGtegNYx+x^Pa-WBhqvA>n+#nEW{?xXQGaqNjP$5 z);rn;fm|MNERve|N?RErn>s8~X(|APdD{F6Q7D%uOk(7!w1}E(Rfj@khE^bpTqn+P zUGvw6<6yhwSD(?=fOQ6+pP~n>S=k7^$HEunsgF8;Xw$K1mNQ{G8l`Ob@xRnMI{k`oX1gzeVdA8sF zN7Ev~r;SlBUg2w`dQ)QUtmD-G6zLYR5!{AF6COHh?k0Sjc>P_@{YeZin%#^o z!-2wh7m?gk!hFGWJM(wxo@GP0&RFNi^Ic4~u$%stROUB0iRLOcU1^EjhMpD$-4|nO zne#A|Fzd+kI(+-`ETV?_W`q6W`3@#uCQ1xcQNFbfc)}2#hV&8tVSuGLT=U8^@veGH zVQAu|9uxhzbM?Y7f$ay8+|*nstv*pGFI}K+y&k;8@^<+&fE?WQxO{3fYb)v#$rP$n ziK}*C7#Z+Res_^KEr53?(Er$&cfteMo(Z1F%_$LNl z+f2apR(dn+6Wfu;Ew{!Biw`@1#tJ-z^Ztn>C9G(pAVKnRpL~XDX}(=TtPZk-E7X492JCDOXpWLAD%qJ|2R6!u(rA-3I}%xQmnYUyF+nz z_u_8F-L+V8w*tkXxVyU*THM{;?)h$h=XsKo?7e69%&d2razcN@fllgXYmvk7JFz`b zhm&5qzLs_W)HOFa>XWul|5%e^O!RXPj)P*RS$*SHC@a8kJ#`{Yl5k#u46otqWl?qb zg%VYAT-=>V+Kk2B$Py=#*PvOsb?v8&>1zme2NLmFZMyE=#h_6BG4glX0Sf1nZS7i= z=E2hlrl8PXN~!#70(1n>z#Zu4Uzt2*V?|u26jvy1`qJ=WG1?KIMN(fT=|#m+-z$+~ zV=5X9%A8Wd2whO15`&_*ZBSCVROZjsbZv5yO#-B**5P_KDTw@F4 zQ`10lYWIt`ar)SV`mgn$$w;{(R3rm3Kai(D`a?jIhMvK8-fg}d5mt=h_bsDsSaYv- zRyWb4fg2ia_@xYz98u=oVPjj7elbq)HUHo8^uoF?636`t{T5a}37E#e4P-H>@JeYw zuyCZ1HSjS~a#QePBg*0eUwOBqjsi%lgA-;Xez$8XAkmjJCWEKQSPNju!qvq_@l}k= z5QrzH778Y=*~nk+o(^)K&WT?Wj1t$ij`h^MCcFzs}398kb zDeTa%gqjw9up{}xvIh;l8T&oa)T;mwH`NQW6iF&0O1h5?hKj0_Hk(Q$zjn~gX14gZ zap4&m(@)Hd@@f_60n9o@7{M#H01?h!te@sI$C3ltc`@`7vjPHd4mL&*W;>F$u|cPV zsj6A6l#}3uSI)2#he63&7>K$*+T#>2J)ppBSfals)g$8a&zg#jLLdL;+kJfC;G7!> zle9GpVB*m(jh3KO*xlh7Y}gHYaav_-NKAp*xSY!6lQ;hW4t&<1rr2EgDB&+5y@BzO z1gH@m-jWX)J7~Z&P25ZiR_v?a*KbCUCh;s)T zD13viY?hz8kpiErF%kkt8LOugQq%ySdNCa%P~@k#)7~lAK%G<^dSxp&H2XM3X1@c} zWAr%1{NCIBf%XCyK~khbVM001Cry@wQv2X9K;$aX(fHZ7?xgfM+&w|5W4=PQ9GI*% zxa*7Vl^X))%qz&`It<2c{;?|wfBb8JuO|!bQwbs9fkaQlNkaj(^*4le&uL#1fjidF zrNb0*7gDU6oyI1)G8cS&THvzc3+B;BRj>Q?>G}!l z^H)6b(qoCber>wwe$pW0?$;b6--ETRiw>UE&GZE)@&tvCN zHF2|Tz{(tOm~J_Z;P#W*!Mqta*}mspZPzs&=`IYRMSPJoTD8bUiN@&fcv|`2y^4H;Nwz6Ox~bI&E20{~`p^f8Y z5CS?;MqTb0S5_m~kNjT82cD7)N#4T*UIsm2)ePbrI|Xj3aI&NTC~6JI`#C%e5`VcVm_hVEvR#T>#e?dSwBZxS*{Dz4 zo|v*s-p9E=`OwVKP|A7PLhUeh%4nHT1pK=W)}Th1U8&A&I&g4cWta(>iMZ)r7io$ zw8+CpEA~s>mOB=Vw(=w}S@@YPhVJJKWOJDIk><36EG5DB%RQt6B}JtR2ZyVWqS+SR zs>s3_GgW!2uT)rRN7+#AGwTDN5)An$V%5wV1FBvhWkf-hkf6;@$L7D*Nu zjWP#+cXqPlxrNz_oA6&9!uO3*Mv8Cxq3_IKsIkOeB?scn{^%6|=` zCXO^Jk$s9SE8kM)ACZ(Ue$_DG>QT^E6d~=F&?N7Ch>9IPSlpcbU2i=>Tid&t%agSc z6%kWKOHP^7hS|%A`xYgs^$GX_k&0i-4tu zbAlM7)+l8fqKy0*G(+8dzV7+))t+J$x?NUNzpFNN+pMH$r|B{(#;&e~*Eb|gPVW=6 z1dg5#ZPJh=CzX=n9q-onIWk>m^6NuL*9-fz*T+eZrY4Wp)a0GyX`%MFl7qbGYgZ-o zpsSduflH~2PJzu3XKaNjlqiTk<4RI10)1te7!YKNx1{2o7g#|J19PCWx6*w6xp0>< zl9nYu6i(#I-|jPh3uc+jzY3AZ9z2vm7KWnP=7D5uU$kIs==}_AII8fKdMkhQVe5pN zJ{h8)ECg(ET4R|l3x}>EKf=St1k^Age7!9(L8lH(ucr_GkNY3{%O8b%z#A6G@&^in zB}i7u+3~-S98GCwI*q#|!ix$0m3#Tx4k4n1yg0y*nY>)%Xn)rEejhh^)+vpD^Zwa! zO{9le@S)g-FVKZY=qUS!h``$s%}hchkU)C0lm<~eHq@JGB!DIIIBr*|?2{Q@SwFbM z_>UsL+YFr9k8M`hT74|R`4=33-YzVzfC?h2YBUQ70 z!NH=cyI<2o%Cp2)iXekZ61ig^Y~+#-2U(bU=neuSp?vZ9RhVL$#2r)fZR|f6{$T-w zl|xs+AU7Vm0K$i2>tRrtd5=>ug5#=U7g`Kh~EiLpb zA?)FI2vv`GPryC%$K9C^|7%e=b_X93#qQ(j`F+mh8u9Dn^RkieeHODIu}`#i-Y^k`y-=7s<2}yTSZC&78tyR(QTE&pW< zLNjtewts;!d*awRj%YmTJGx7~+dX~v%C02vaf_+SBO@tZ1bq<`9F~-oa1&{3rfOC! zh9sRC^a~^^^QTzClC(aRLZ*m-!pmwQ>VpIX0YSnbDZ1X1C}C7gEFu3p?7KNWc%e=L zRAU7XVZwu_Mdx*1kASTMJ1j+gH{{!}C_)48t0IERga4gghjJUAN!q2u>QJc{&!$MM znTIZcmf5-zvo}7@9V-tZByNWyhwG~~uG|-q$J2FpnP&)+>6@b{nYP2+zt7Y)U2%~c z-g|PvpLdo7n@Z`PCD~+v_NnAwl^vf#1*uis9jz%2fD-7?)E)dpdu+eT6l z=yLxqOXL!G=mB@~YYGZ+cS(~2@gWypxzbC8cKUXZg!dowwqD9HP;J|Y2>f3~SZPfw z5om3g;8KV&CV7(=yND?trObPDwaU4Rh0Bw0nxQmIZc%|BJ)Q4Lc4hWdh=d{a;h9g&7*6lP0@0Tau%4 z^km4vU=Vw)=JA~H)k5T9QdAO`gJR6`cS?NdfY(w--wP>6MI;m>36VofgMj%liVAvPyb&B6UnB{1o?0xL|t2>WUrb;lZv;lDs8`spuD%k zrEI+FS8}*ejKxV5WqNHSSS_mN4kxu^tEzZwR zc_!tE*|QuXKex+GjtyNGvT<^X!`h{0b7#OQ@8hiEu$t9;BWID zi3HW(6My}UdFqGE38^^arfFs-|NN)0M=b9$mMIyV~*3su;ouAxxK zjLep=sq2PFGNJb~1H&cnrQ~EON8xLeil~7xZD#KAr&h9`Mt51;&XEsX9)>3CXa1)SLWEDK!Myf8=g1MaX7hN*I|~q&>|qXP4pb-LwIK+63&mQ zP2wrD!hi8fHclYAH&z;Um1Mk1gc^J?SR4q@X3w;A38PozPs2ry`K zxAFm4qq9~`Hw+hU^$s4jwJo~@$Ppo1V4xq;{P&3b`*2aw&d$Z_wU)a_^LJD8|+0F6i@<%Zwjq|B)s-_6(*Fp+u6_6 z76+>kt`4Cxj=Ch6B*G=jVht-8uAGhK)RkrK#IYL*1gruI(1>9^gsu&WGmH!=SzdCZUA z?0$}+<(3gy=U-uxWwHE82bHxOO65fjunBdL?l1ycC7XVyfiB2H20dOqOB2y$1hSQL zIU{=Y+@LATp3?Lk8<6QV_C$$o~wA3 zmCWApIa5d5+uKK@qfR`xgA~*BX*K$-cSogOxo2l*OE!12R_YboPArGtA_j|%YU0k< zT0Oj1SJrt2h0c+m-yAz%DZ@`J6n=1NKhqkKK2xF92BA4xDxGP{8pA!qyPa3~T0#NVlsS&_p5vXFEx z*gypfHOE<}%~*exLWtFhyY>pq?G(Vx$i#5`DL7;VRk>BJ$`UWp_u#Y9Tj|GHw*}$M zpsn4}nb4f9<6co(@&{3ew+v>&&_CD~s`H^o?w-lXGp&u5@1QJxA9?r;)eJ+~U~%lI z(`i|-$@TBy3>~|2jO;GXMG|KiC4q;9oqtsVrtHHn58;qt(FgTl5x5Msa>i6fjlnuH zek;O@Ab8M#2pu|<$TcF^3zM3?F9g0VJ}M}&_a5n7{s%hxR>id7)ysyDJzF>++A^%+ z7NS9opRU*I%+CvD8h^E1E5!9tf@k68*76K+2M$Phk{b>xrKy5(eHEy(ewMYYhW}w}RcI|pEkXUu zWiJf-Nq5uru~J_sd9ggkqt7;f4w=Ydd4KuA-_cUn=Il_yO+eoE)C!{{G)+H63fVRR zbc07dRUZpCPHuj!6kZlx{qZrXQkSvFPAWB3^}Q)MSZs#IOg(Rln5!1~6lXC;g%n0F z2JuCrAg=IrV9@P(hhB^6i?y~6f{Zw*`+fO+?z%Nj$1E2mKeRa+6eyR* zM2EYL(R~wF(}a`O?~7KxGXCzB4fA{%f@bLR_Pl?uXs0a}B2L!g>ThG%VDA*gaa20s zB9+3N%z?pG(EMgvmu%M1lFGf_`ZRQxH7$6j%`~^CKk*z>&N&!GfD}eHL!EVu5L81= zh6rUh#21|k?OE)dVxHleG0t`^k+1M3+oG%CC(fmxPLhxk1^0U|WB#)LUC2$5AD z`6D*=EjB--#TQtvRRh+iop+Uk4Zn-KG^6L^ z10Va%@9mS5jHv}BC6pk~y}h)q`?2vLEw*yVzOg_ssZ$-GyF~}TZUGwp(ma1YxfU`! zyCn5bSaQQA<-R{|EsvLvkak2~e+QMiWGz4{K#*LC;dl1xaj#EvK48+x`SFQm%WyEh ziLdI5M-*hjVp97;aRp#kgE&8k(rkclj z7pYb$4(&K^Wi`^hWCN8b*^;D#6oAW%6p&T5Cc(4HHlWIz=R#~uo=F<)c=cH=hAA8|y3|f8h!gQF%gDJq^1bIh9dw5o; z?Tz>8_xZnhYoy!i_!zT`6=_i;IP2HpfA^w1HIZ$nC$la-wmiE3mMv%33&~qB_fILq ztR8t#P$7-|KnEP=>YkgERy`GAVn8MveX3aA_0{63MxdJf^Sl+)+%jsuWp!( z-4Nq24BWPTtRF?a4Kj3~4mPTS$+e^h<~sYqftAt^*Iv=jw+i)!L|ZGv)o<+=Z{oEX z6^k}HsW+m9DYBf?^;=GV?6}fWQ+dDyap4hg5!v*&>mE~l8{SValq~~)jUn+kGHB%- zfAfc@w<8t?F1URTG-pW2{y9>AuAh4#{5l&?+~Uq?_ct<$PSVvqt4Y$H9}KDA?oN5y zNF`$r88`u<5_t$cXb~7HBE)igHB9uv-TmSSuA42R-!st3r;(-1xCpLCW@36lRf)s% zoIOOGeDvM09ovU<8U9P=-^NX}3u_%S33Fv*^9Jcu$7rcW%n*F9+aFY08udrY^a{0> zdMaY)OWlBJ0vM08t}tDyf%cGqPs(s^q&_>WB+n}jgr?v1Sh3;O{UQ~h`B?E7A;VBJ)Sn%VQwXolhnLmPOE3LMA1_3?&O9QXzU7> z(rZ9rAw@0Vvq*qTBQQYm@n%fpY@4m#&h0$VESQ3#cbFRXV&BoBSY~BWCLuu82D~4( z8~#_r%fdWo*<{8gx_gX7Lp!Wq7xkw=aO5DkPF39*ZJFmKzu=x?e9PH*r6)i{>SRfG zDepTByys4kJ^bP#<%C$KERD%Hpf+7P^c@7|%R!yqe^~#xl&Ue;xoY%q|+I z=z$e!aeY`vd%ukUAR~?Sy$&eo+~&?V@rEx50iI7KILt8 z6C#hlttSXZC(3rCKvGh(n8)tXA(YKRh{jQM`VJFFu!ut)C|Iq4 zK&ZNcIukMtD^FkO^g~iyH4xuG#%UixfXs>GAR7u#RQc17ASRsNjNQdzB6iuH1yo)X zC|FS7VL?S2QJeRXkFd9^t4F}c;cuGgjwIJk@m(;rM6aGrZf`M=JG5aL%nOMl$uE37Di>CSA6a{lOOww-uGKj1X!f(6xdyl%@e`)Mpuqmy-c z+z5h5@_U^)GO(&F1R#fX{j9~Gi;}3GC|O5dwPy@UQr`l|Dn>a!>!fs6{>#=t+!&Xe zBQ`Ygfx`mDX7pm<;zQ{?F=c;hz=qF$9u8FU%p*kbEm|;j8SGcxqb|i2{pZ{RUdIeB zB@qN8yH{ys8MQlYZI=vp2d4}TJ>9$+Iz!B0 z(s_h-LYJ+!HLlU;iO8^pc->Vgtzw8;Rx6V3%yPea8in5wP%db$*bwG8*q>^N-wzvo zvh<8TR>!rNjOLOY1KeMXUOhgdg@Jt09}uYLWo6y$JF(K~zyW~26 zyIj;V^uGea$Qa`5I~?(0e{vzu$(>%@E-uY)f8|loUbHN{5bGAL6J0^#=<9at;taN_1f$*GGy~%gr)? zJ>CF7{)o;UgswIR0e*xOaR(yeK_6a=kmq5bc40CK2?eW@XcH&F+{_3z63ORz*sj3@ zI5F`tgQ3439zyHqm$~h2FW`^2RpyRYq?(RUP~KYC&2+$t5oFK*M}+|$h+$2|zrPSQ zbNi=lVd!~{W1qXAdP-t&0(O=^@IkLi-EaKeZ^Ccxbel7F3)geKW;}92D_<1gVCN2K zD@_v?7Zhl$7dYDLHokJId6eo#f1G~2p;49uVt7mcRHZRLB}5-5j)HXJ?x6dX=m)`^ zE8xj2yN5n&o&h3Y{}XG4T9xu5_LGGH1>{`}cqr(O;wS3qcP|lQXFZ%RevSihaR4xC zu;jnj)6>)9qN|TjyH_eO&VBdNdA_n@#X;9mqe++3$-mR!hwf-Wlu#;$1rmpwk>^Oa z2*t=|E%fK|LZ@P&P%R1}C=mBw<#%g7cUW6Jg8(_o$sWn)0(q4oPxn>l#Rmuk8v+Q^ zdjbBljw8T8Hf8|@0=#`;;pv)7Lt7*~a@B z*e2uq(ytUb*yAQ7KB8!L z=y_<-b~)QM&Z5D`-QCx1U{0+{6M%KGL0e5vHvT;WDlhx{`>(Gqin}in1rNCG5K}TQ zU&xbkKOZXbjn2BsLh->!vUL+c53IzCh)ZXW9(akK1EM4VDyR}IC!4RqT}qOkY~NdgWFmE!Z?l7Hwto^YV_~bQsorte_da zJ@!8=+UXjz62w7}%t9o~W_m^80;UY_VG>4XM+XZkO&2!5&wTbI_pP7_L31cR@^Axc zF(_)@Bp_1amg>w;V_%OR-ezmpe#MT~R5$%f@#P>Q$a`G!eR+JeV#~K^v~UvU-IgpqAA+}j@6C!i9L;Si4)Q;%sD{hdGJpPlr2*Hx2nd_vsGK@D6paa9i z0C6Sk>B-&ayf5qqK(+NgKM!r*)}~T_`9yP*8J1}>jI;aXEf0a*fUArpVI}g5*hVd# zA?gx7kajfX7ue zB|$Ei$)&MDcOL)%t5?vc;xU(uX&)33L=dPpDmpMX27#Oz80zH2<#pDm1!Q5^IBAMX ziU5eq081iwZ&9}@>AC%c@+VHh#hjhqm3~t3O*VfJ0s?~qxuvacz8xlXQNq~c1_aW;$#}$PH#nxWEzi?A0n|gWe<#<%1!9uxJuUIYFXpjYa zGmbYH-?I>`Yh%GA62}8V7f%520jSH?8XDZ&8OV{z{73gT6oNFctPsn=J551@F+WYi_#X9!rc z?DO*RnHCsnYqtPv`QN|nckkMo6OZvUWwTUN3J6sfbgS>@{xnju%xm=2N|t}FDLPW! zC(1%(9g7?$WrMzGnrwUeTL&`o!9{%ngA6)(Xkdviwo5(W^!@^~BRtb5)YNMX71`MY z0O4o;tjdSj|MDH6Is32j3jPOPopt&{j7pV^0A?h}TR`(kA)6LMK3!lszV;0p+o$iP zu=Ts$iU6i$i34tD0Y)4^XO-;V@?_hG;hi!U-vl=>jI$6BjqQN!6yV<8JKH^QuyNqt zy7nE-30OvKKy(;6k?;|Yb6^(4AkB12qp)q}67VR)AP@2&1S#b97cC~%>vGKs0DB(4 zSD{(ql}k)W=zPBq98(Ss)f*Q#TG*!Rw=bus@}Va8B?l;fWT_p80Oeoiy2tPslRZZt$OKqf#~j`agwg{k|wLM zY|jxv7rx#eJQ)Beahw1s0~^MVyqL040hyNa=#ApR1h0pi+wE<`^x2ui#hF8L9#*m` z4?fSqbEkiaDlMW>`2yHkd*P*edEyv@5dTi?3MVZT9%m`7LE!KD`uT&mSME({hi<3; z)m#a^R&`}nRXf9tL|u1x-oex8)zzR}T6X_vF^_=2<6#I|;Nj~NQl6jtiRa0@?Ljx< zF$L{+2O3(_v3&WNOFNdG5qWN#U&r|nflmY1O4bIi6F|U+LKE2ByOcrI<1O1O_jzq` zRgCv0(E-g^adbQ!Oy!(By!ciV>1{bQj~`%iXDNVqczL%*=a375Qw)f`+}-?Ud;nr5Q*Z zSp{IX5ggwNZb*r$uNG^tVwt%5_{dVA}UiKm36FLXLo0C2sz*hT} zGS>SpM9qyKH)MsS$hS4AC`k^u2Zax}qZzg9C;2Dj_m7oa5Wa6S`yT{662EuvTty=B zHaFexF$b7`yVLL9;O7?MFP`i!pnaB^`VQbF_rSsbbqsdA zJEulutx(lm9Q$WyB*<`;5J6??F0qR9_0uD7KcL>q)6lOdng-|8_AcZDTnBHlKq7|M z%;=|og`%(aTDw3d9+if(UKdMSM>4|G4Odp4wcP+lcFw8^6%AG3>B?$hnmt_pDXlWdo2e3@iHp@4tCAjv*!zN5ZS`=J*&ML^{qk zwdF+h13)Fof;@rwtPQUNAk+Bsd)Y=qT!5DsK=WiDTXWzu+zQ#Tk7-1FOX@V7=54O6 z?MV)cwBjKkBkM14uUI^Dj|Iv*s7@<|P?4PXP^x(_0#Uye@Zy;L@#GAe-sjgvu5mCz zaVs%V$GGBusl{a|AZD8f;9LuR;p=)j8ohExL;ufQYQ|$~t@UkX=qW}VC|-D(p@VE1 zkNKBt0F$l=Vs9&d=kn!~r#|+S`1ttL)KtI#W&IqL7;ZA_-E3udX{}vJ;1NC(lfLkj zk`x3vV@VvKoFn{z_A&eMHWcSU?7zzj`lU$+#I>inv@QYs?>3FYz%~M0p`^pBIv)nj zR2>((KRPeEpY~6Ru7H`IAa`wO6}AlHS+r3nFEQge#BYU(#ymY1CCv5`_)C z@)RII#lgmYta5meZ!4`g6dPi91A&Hj5NvFucd}>;Vw0>3tMbm~u6`V`VcsyZW6#lK z8%^75A#ZYy`k9l*gcOGh|2?vEAkwU895tIjk_8sR)>{N|hf%q@&D|>Ssg1gTz}~h| zS4r?ry?u@7`_RefgOj`GtJy6xRRSWS>dMNc<3{gJAnsP|>U0Bwzwj=a%&M`cI8G$Y z`4P-Xt`-pJg#Jd@^Ja+O(dc8SxohR(8?n#nRj<=wc7-O;dtOWd3XE*DR53Afi-0Rl zg~R$^-;*5f4WEzB`Q&69&dL;(ktAGC>n~nC{~~KNBBr655CcWXAY|mlM?QI|qPSJ7 z(^Y~PZoQ>hV))TK0m$Qumt&mdS76xmU9_PwB8*Hx<%dK74*?sQuC_Ld7zV9Cr(W4D zXJ@<#-l>&Fb=_Ub`r?OvSU0y3*Z7f;%l@8{r%nSOK z+n=|?qRFBn|B6M1=-`~k-d+eVVQyjIAOrpc*#A7ue0OK107ifIH^sju5-TMw4(n2#A4y^~*+w7J~u4VG5+0#`;aKla}HK8Ic?c?#bexqi^ zvh9BaeE!l>;(+U`CnOxLRIQ<8*2ImqwaNNZK(;0&{JOP0cYOx*tc7^_1bM5t@sW^X z`nN>(hax5BCUevfi&h@6Megm@byFk6$RlWiRIgBi;OhbxAR!?CwfkI*S{fSfLe;~7 z0}dZvA}=rd(ST7(K*b`y;HUftibb0)=M$cVDrwSbs$sc0E=>9Gp_?M3KK+RZ$5FZO zFA7prsT~=W9~SYekO9Y>FBw>uwMFvjW)!&-uSh|KiGN;wnGPp!W!Ao^2dk3Ay$t8P zg{U3agfRp81<+I^Kt?h$n~I}OZf)gNYN>5euUP~HhfNLbu1D7?n(d9PjYljy);7s9 z0C5qxxE+ns@&Op)jWX`GwTA!hBl|`l*F|&kC;|4w3dHcZ>66^_U&rn1=OE!u5Vr72ZZ;OZcd3lwQeH7jzuodEjh;t7iQ={KKPxaiT{E!(so+V!;M^(cc- zy7}?orn?;TEocVFk-CGWm%_}99`uY|lRtw(eAAw0Y1H3V`?a4S4(bCgA3oNFpK9J$ zCbPJKYB5!Wo|w039j_kBH~K*!6r3*VNUpyC2tr>^Tp6N4;YEma%3?`4#0#Zq?-MQ$Ca%&*1?@q0x)NLVb!-k%d_QKIx!Vx@{m z$%u%EmQKEb^bPc~T~Z_681f6%<`~lv}x4z+w6toWmS=n zp0(1hS_E?8(b22b=jX98n<`D-kOs*`r3nzC##^B?QuctBx@fiyjov9W6T(?;`o7IN{QJpta zb|TcC8k8AVpUe)cE9O4K=UbKB_}g431b2=h##i`ez5C^?K@c z)_TC12C)9?DT)^m2kE4~HFiIzRqMB&c76Z^g*C$(kC%IUA`TW+l`)9$Ldha@bfBoA zS#kFWRD$0hzjAK?c9OQPx-LRma4fyDzYav$E#;vxtog~DNm{Mn<44%lF&;~5t_l3q zk2AT{v|AIkQ^C;m(_d90dv5&g&2U^rA|wCu`vq?Qo)_f#V5Y)oL#D-cg0LpqKGeFlIxGlY*wsjhAA$?zmeKX9B54Z$oqF!Hx)5?J4kn+z{{kvWJ5# zHKs`ulz}^g_!F4|D)jMz4d&^KGSw&@DfEThwxw#n_uU*UQkm%k1CrOY9L}_`(^>Q! zDL{G84ZsFVUEX8uUH%=_PMPaCi1(g zFuGq4_=x|22VGAnATs}49-G3Mhxn3JkE#tN>_^=qL0@_GF{*@%4Zc#!aHVh|niqlw z?LuU4S=_95vQ98`ZWpoOLAGJ*C+S!M)I^jHt+F%t4KIhB?`&*Kr;`?f+#KL;Up`Y5G5}C&w;7Lim}j`>FG(DJG@3{f7QXD{Jecz9*E6 zw;_NGyV`mecSph;xxCSZ3Q86$JW$=ZjhTv(N-&evfg5m0wVYC@5GhuwMV1Mp{21J& zZ{!Fk*P^nPr(yS=@VuTg< z)b=3cnr^<*w{1!}4b;Nhle9ihQh9AoPIfW_MwF+gb^;md^ov`Ux6fHMU2pd<;!I= zh-kh*_HTi~s31sK!ZMAj{4{NAVHj3e(FZU}K{ks+7WwC0P~dV-H<=NsIXD23+?_y_ z-BGNM|2uBz+x266viW=kKeOaAQCTJGQS0m5bz}V)59D<9X4@cdzC(%rS~%Rb=S*-<}rm`E-5N@)Wb-nl`BLZx%2kw|X`R zcsgAyeyldY7E&rC{@Gmq6L3f05mJ*Jh{(|$3yHG$mk*x3np24M%f&#$g!@>p z{*W6z1eoqA1BSVGerM^nvCzoQt+`x1uK(8Y7{AT_y?3 z+|k*>#4xj@1e3IvCOktPs}gmDR|CzkD-iTC`SIvz^g0$oU0O6uWRQ`SMf{ykN-Ag8 zYCCH6%)5Q9O#Rs7;@`_Ycka_=h+dY5G2nz%!n+*7ftcEDm8UgPG{zG5 zuks=_YgH7juNWAGQa0Ew^rQe8h?``5fmOoaguKWxz*)J?-8^A?qjBs}Ud}cvjGe8<#zko>_B7U75+d=vBH)IvMxOFTgi7ZdA zSn7>1O+{s)aXvKHl9mMGz;KO$&X(VOpwWQ-KVSajFI=P^%@WbkqzOdpqAq+Wy2`EXA%(+t(tiv)PI+%6ax2 zFo1hZVMhOLiZ0&-BvnCVVMv*cjmSveyxVZuCs3I~GMHV^|8e_qW7K_pEl2l*2ws3x z$to&KGgRY1)?#<610L}1%s8U(%g&jf$NcN?5c0$ zhD%H31XO}7ND4n-D{-udhemF175_O)Z}-8QC)ub5*WJRkpO7=Ken{$}Z(t}72nkG? zMH8wy5^yRP*v8_G4JwvjD7BZJrgvTTC;CS9-IOjiHs1deK$CKkx)u-?;Q7N7(6#1p zh?9F0SSnrN9>%L_G>@G(pE3`IuAI_J5tsF zYws{WdTBQj-`68Pk~Gv0yjLcKo;h>I*nb&Rf>LkZ{92b^L{D2F19`4`Q$K}Dhs`Uq z`+f|j89m+u8iEHn;i;R`dH%mZo0C0t#~wCoa^H!^_xLKpe@jkDz{%PGpHkB~6BMN! z0gJBqz-64BP>Q~SvAY8RqeMh7<0Wg*tdUIBqsv|hg4dA*A~(p9lgea5iDQS3ZcJjt zFi#SSb&EOG***fM#>oiiudvB8vWz|2a@(8&JgCR(2L~m7*vDuK{FjuuyC2^@udL`C z-0q&mxj#Uc~7)YT%Q*Eiy^mDOve)TR~*UHF+`}>7` zEQ%Ysd4W$VE3E@7_jwPvIl*_`vGEMNC7-X)W_-~%u=_M<_N^|%yww%&s6(HG_ujx} zQhCX*4uYFjdXM% zBKdL5b=-m06>vK;JTPO!3(+p7C4_exnTRJ7Kj;)byVs4=-Jdv}1r1aUvs8U2Ehxe=~H{t13#P{wCPNmVFmY2xVa>gd@SkYGjCxH)2*msVVeq0swe zU&DHG4VX;E`VqK^L2w@4dS)fS)Iwsrkvg-|T)@30OXhb`%I13va#K>&%I!+bDjlNA^{k%FMZxXyWT4tTJGV(@_UPizd><-LXWmqJbDja(R$3uHgcs z@v$Pm>uVc9Wa-9dV||YAc|o8NxXJBfAiJ&~Zfv8&;rb$}0%Cu-?|U9=zgRQ6oa7|9 z)qvx<+*8;GvyRtSO}4L1St~0czXN@FTn!|dbcX=#8cmx;o2Y9^Fqw)Rw2TWWUv~v_O=C{q|e*c53-y|TEYX}kSd0iBETzaO?I3^KQVQB2) z!cAiGbx@C#J&mYztngUh`=!23)A$dr_7FNR3RE%}2^DjRxUvB>bsR1A>Ez1@VH znvEajDSR{)KXZXUOw1{HT*WEe;MX4|5L!cfF+K;S6QRqo^x5!PRVShDdgYqqIf}Tw z_m!MY`dH>*#<+I{qK3YsNPPuWF8?a=PmRQ1`_gJXT7nmKG+w=~B@&XptAi0Pnjd2y zuP}f385%t0`E~CG{F{bg4`ZdI1!NyarVc68r$$m;B9Dq$9-Zbw8a)Uq3HDYt;|2vv zP9*lzS%dPu5L>~O*wETgo7E%us&Bm6VfuQQ!#y#zEOS7-i4B}moHA%E|TW{ zvG|l!0fRXk{WXbL4bJv1$xNYLifnq0HiD?8H4H8{{U1$tG-g#!?uv(f3-@21FQOHVBTuaw**x%XOEQ(@rak1TQs}Are!R9?YJ3S6M02-#DH2l6g0EolU z2odVFnlfXm^7IlT%CJSDh5-{cp$8yYAXB#4LIV*A{4BGCk(Hr7m1lLL$|Fo)gupC0 z)j2{hsTO#kp5iGODAta}MU9AYB4FdxVEdhtgG}xQwXa5fIzTWS z_V;(gIr6;Yv~#XntcF)xd1TC zFnka1&}6xm0x#aK~|1!AO@{?8cmVCQwOhfu0TKJqyhtX)wMBf*FjDw_g|8Xj(u zS|8(DMIlt)LpDOrcn)4wNKi6g=JUs&-q9NrJkigh1A9>iI5EmPkYyPl9`5b@G#v;< zm2_ZI6vwBXcC(r1$;>%T16Y3992k^D-{ceZUD?S|xrzV~fIGwjV{2>+^ahzjA40uO z1>5!|M7w&>5UQcJI!qMCkfiCT?2VH(Sg$B%HP!s9CsB%qd^~DT6Dy#Y$H*&+1lZ`D znPmh$f+ck!N&YyFuc&tR4SELtF^Il9squt4n&TXbbtWPdcAh58IC8jF@O~CMMNJl zGL^4%3p>G*e0nwszagzoDVI7P3|7X0ntKG4+_VS)s81jO(6dlk7F3@!0N`4T_lT8Q ztv78j9tJ>;(`JGhWsX)(ewP00&tg}#b;$@q684j&Vq!LtLWmQJkjRQVB^lu8yNG6? zqNI406>Xp$I-}@@nA#)?jwZ=ue-z0E{{S0IgQ5qyw3AdplcS zKnF_0WWlnWb$j(%tx>NTTJXqc5ciVkhtGy~RsonHd5Ort$I%7+h%X$2tiI$A0O ze@s>CS#VgQ04fOM)7C`wCWPSq!rt~0boW3S z9;8V~Ak(yj3n&&yErbzIQs?;jIzU9NR*SJvp69Jr%Wa&`^2+|s)?_jUv3RTll}cqi z9+|d~Oir`6a4;MqLZeE*ImTt64&yp!a6SlSQMp7 z?6hVY!zIVyIRKqeF2DtYc~zNGnNuqm(P5-TEZN6KLQvgQG@>;nD-VfU%Y%mZVfH^~ zVyw*w7BtM%30z8P%Fl>Fx4x2sbQ*F>6NH+&P79?aAT=c(3AA`H9hMjelT~OTDT-!g zw^f2;x?wCSts-R?|f4U#o-nz$|ZLtpU$Zn(2SY2HO0MP-;E46B^wy?OgxVTiS z)js~Hc%npOjc*!uMcLn5fxs*>BGqydq!_YwV6XL3s|VD#@CLn<&CwGgZFr(i4X zykk_RIf#A$<@}{+V@T4CY>`k!fnypn8=o0VWxEu#t&9{(ZcY!^2q_V%FnV^1CB}Jw z(SHP=5?+ZuQ%!$>*MO4trw|e(X;kaNK!rIqx=7+{c_pM}NZQTREd;KZlz-q(6dwqj z3Xap}0L`)zu`tmAhJQ^zpmbTmoS_4LGM>glJXE~4w&t8W*xzln=2li$TdfukBqQRb ztJiK^e=G3=Gjsq3!yysr?9r$L8XK4(;eMjemu`+5e6@4Pt2U$R81hT(7t@fksj-q& zVQ5ep4?cw}N?Nw#0YpGLRF`@H>5(=9RFOhBA#!U*o#RgcP{vE8jv3+!d@}kGO0f3~ zJV3D%Rtn@5!HtOuGg5OPl8a!{^kMkcm@cWuOq($-!TPRP6Hm5Q7$9z;Jex1t7p_YN z0j!SEtk3eErlhBIfJ6s~$a~*xHfyyS#{&Sseqernp3g7`fTAcyqmdl0tiETa4j=#w zN25tmG#fSBz{J=a9f%ld%30*fFqIzd3MSnT0*0m>kuv3Mq?E#AF*J5Tty-Q$tfiqI z1SKhga%%DgTG{MRG}`K+#fFME2%^aPKr@;l_SD?u#tB}xD+Lv2gAAEdEJqy#i0KDH z3(TcmM6v1VK)Oh8bQ4C_#UV!)Cv&N6I0BYxQ_^pZWfX!b3DH{wGkzwzzaL;7IN09> z0NE(NhKQ;IM@L6IUN#<&&(6+HPEHQ?_Y7YY0GD-u$xswUuRo|&D|sfN?0o=_=?s>1 zK(as);sYt#(dNeK84z{4_ss zu)nJ$=G_{3-}a@YrGtZmqA2>kUgz|9EJq-lN>vA9fvFDoUVqqZVkOJ0$%84;2aA-< zm8&I@j3m=fX0sU(5(p-C$kINtU8~S!a@mbWEsSz6Uro|VEGR<8s3w|3BTpjsv4s&< z1R5nH1&LXth;j^-)Gj;c!ttzu2woWzgd0NMNX)tPMnVLKs2lQNIvGKpRk1}eDe4$a zE;XPs0L>(*mnX6C(LBKv(Gk%O1;qP?F!b@Q+xN#iK^z}@;^}6qH5d#I8;5&4TdD(j zrM9@Vyu7k{@9t-3r{;KV(E;6QwB2qq7RvLy*X!}gWoMm}@n|R&l`D--03xch{O$Dy z^;(r@Oc+^Akw=CsTgh+K@f#7!S|;90D@N?;4>|cj*d=FPI%&wX)~prRvk!w zN?ao%5DkVS0BqF5sju$8b%G zxx!X9C=%gy8kcj3tR(W1l&A^-iAjKx*pSd@X8%o)U^ybWH{%Dj<$vw!EsFDEV70Pkux-6JdALS?eLoMVsFjmsW^~7rr3k z>guZZeraiGadDCNE%n|Hhr?#8-Rqv+PX`#{o}8SVot?4tJLiUje)9AT9nhb`O?BTY zRD@^DuOxW zTq=1Y3_Cpu?9feMoXaxCb~4jIx+OJ7YbM$ngpyc`H0u3)W~&-R@Z%gNdPAk>1D8bD z)QLr-ADV=5i!1;z?@{za>P`buqWhiMQ29kL3@MWk!GR<@$&?bUlyEdu%RZ72;Uk_1 z6l`EQv_*7$4soN=;8U9r@!Yv{dwY9)=zOo&J2^S&oSydiaIxU3r3Vn}pgL`1b})ksM>q)ey@kO%9}co#g7;-8pR;I9H=wKXIr4$xsp z-o(PAHD+Dq{VhBd05MYvKzyt(NLn=L3?Mq*!XL>KP#DfBH$PUTU?N~*lS?f_bW=iN z{)6(h(6MAT zWhGN=a|km45k177Dbqgs^sXtOtOG=Te|OtCx3RGSa&j2}oI7`JYip~RjE94MzuzP8 zgF2T9ABuE9JKLM<8y669G#qqJjz{BB1eVEVUBP{IKuOJX2M^6 z)*J*OWN?EJ8AZV`UI!62Vqk?)AR#V_1_*W|siOosZBj=BKYmsdDou?_5{nSQFIgsa zrHMETZiy>_3~N-%6OxO}vxY;oS;10hhXQj=UQUZib1nen{r2X)EX!C2bWfDEwYA-y z?VdSRG9DLlA00S4*aLz|F-A2EGRO$Y^)u*zlC~&(Z!oCI@N=N+lslbFiotM{BajP8 zPfeb)7+GpYwwh!qw{igFwewL5V>KYN z{gLO}iDhQ9tt>Z?fowCwt6>6t5FaO&HD+DRJ2RpMH5X!lqL&EXzzRTA5u?Edn~C`V zJ4S1Qnk2>u!L*M1LO_)zHcRW&%Mj_Vx8Ye20QB*#d&<0|7z6#jSr2|l!+eZXN;d{lfS+8+$VikahSo9}F0RX|> zD^>_XAT~UBSCt|R23O*(L`lS|xhO=Sb`|AIG>R-yiV6_HlLsP1=P*NbK^S5sVy6}E zAn>We+-#98)14R>fZ_y{MuD{*q7p8Xq{Qb3h|+zMj|9L2D56A4I+VPo3dy z7;Cj!tJOMx{=)L=nrVTg3IeAMF=G^`Se+7{l&=K0&f*0rF>KnWHy92_BP+rE!SJlt zKkM~b`cW1QMtKBTe5Aq-R%F3Qk`*Ws%kpFLq~qCe(H8*NW!SRqBTwLQVcP<=x52=f zrfT!}U~PtwC{!TnPn7=H0Td-R0uw*RWeiEORSAz)GzHpAKa?(dJ5k`Mkj5mKEG=kp z5z!+gBsC=^m@E-}kqPrvS!BBrTY>;U4?l3}AOEAj|IoEdsbRRU4jdmJ4~IiOZJ=7M zwpy)?^A{GDR!vj>*VO@tHbJU~;b_cj$~xWN(Mg9t+t-}>LL(K*$MD%2Qq!N%7Gv4e z+(o8~?UOID7LsuU2$={z#}m4N ziu`~1zx_`VnrMkrI&kmK?M|oD@Ar9&T-Jf}7cML={~S6%WgVF6))e@ezLEzh%qxK5 zXw>QUCX=GnE2d}|>Q~DYDPlP+&5xBRm`x?h@GU9>5CV}?Z-enk&e+ zY7G?oL}MZ@Wd?&It*jF;N|?NfVs{J=^<9-1p#z)u?wp;SSsj?4 zpWitDbLaq+bpT4n%2EKP?oU4ua=Wb8vK6IyTfRB|F24tqA}&@1rfg@Tkt;POwP<`Y zpFSi31_asVJ+I|GBcvcRW26hD7N%s-yNIHUrYHRu8487)v#^pz<~(5RAu`G7%8*;Ri4O zAO7y&D)lB2T=}8f>1^J+)9G}0r~53+SO?bDH|7_Y?Ylp(4otNo(SaFifQj=6@5j+2 zC9J&5A)7OVkY*YUh}J~-RH{-NZyFsmO1_}(Mg|PrT{O99nC{R86OTI6-PmT)9*pSU z_z=|=E3DG%2qC~gCG(ur8X8ijYeE~ag@KSym6%^iE0I>1sdd`3_#qYt+G8bWg6q?3 z3LgZ@T5F_wAzDS+8xG4g$Mx_7mw)v;U!Ng-$@&=pfNrO=y|vlxb~zs4iEeXqbLTHy zoSR>?@BS~K1G7lMVkh(afx>ub`7wTyfXy%%9tgsP$W#?7LqIW5sfCLUL^vofi@2oX z>on}tq8+DzghK*%MDv28@OYJY3(~;^WL4wNnIwrg7U?=hT#Q0+<0unTi{?)1AdH2V zuBy`tcD6*H#4Lx#g8}5m4y8J$U5J(-DB+X?h;1qvj_4dv%L$?;{Ux0}^=sex+OPfc z3>}~;9XLBZ+1lDvKj56J*X!+e`@*HmKc@~5SRF9BYhFnDtgqTTr2m_J5kQ;@p$QaH z;-D2EGg_)MVam#<{N`jcnt^&{a$q6%$q^dk&9bZO@qHLmR3ZrVjML!QnVDt*xsI5I z85F9z7R*Mw7)25g!{NxHAygtD7pnPctuyQ%387uA*dZl~IwNC-!BVLv40~4)f|G`t zcMxReziqSOQc0-dOK}hxq&UQI2muK>o&KtSf9;pQ4g|mVhkufmYjgbJmy^Q-AfWT- z0e~la@;LE@OP4qALg(~&*1I#t2aFsTqcv@h6g%Rr1X2OKaoFaDhD} z>!(BkV7Bv!b0V0Q%8bB#$)N=)gdox)wbmt}DhQ&?$Uxu$0Tq9?(PGQk#kdkVvC0`F1U1#sQz2jwS3uAsHc~#v z#@LQBQ&`dC!X1_N@DWvpNKM(aN}5&^{OT`%oq+!BAO7H{>%h?gmo+yxSFhKzEUVRO zM6`bXLg9Vy?9{$ntyWue3t8s&cen4S1CvRS=h@Gy1Bl@W;Tb)OMk97Q7mTBK0)UBW za7z5M8T&N1^i|P5eOt+?mWHTMq!*2oz#;(f-h1y8JgriTD*vJYVG*5}`BeBMc^2#bNmLH9Vr^iS4(E$)0Amc@+b)ZZno5L*)mKv>M4SbzJ1 zA~eRUK2EEXHm6fs0iw*4;sMmc5LEty)ir6^Sf%}%eu(oJV)bQuDKtgJbQGFqsI4H6 zTZ{2cA%h7*0rfx)(M{gP(mWDdU^lgkHF40yO>hi}qKUAt|INSgYybW4{s-r>t*y<@ z@uB{bSE`L>yIQUAzKG7@>CxdqtL2>2jj`(WIuTvCcxiWMdv1PVVPTYST+S4%0-D+GWG1vWr)B>G$5iw zN9e<(UsR4tSv>fKVKOqR$+LS?@UC*+YjhujBvg5b-46gI?(AUX5kjlk{UHS|0aa5vLMx0BX@3$SK$MbL!{w%+QS~~u4q*lX&>J^C zz46KB>gu`CXtch*0YsgXqr6gGTv}dPJ;!@Gj7P(h<6{7D4tKY=_5g z;C;1tPN&itk)0`#ch2cLVQ*lDtx=35OI(~wCN2eoiI4NZV#~uuVY*Xc(&HdKp1hgV zM??@0?V=$4l;)11OmAeJG{H=0-Gty|b8Ehm*D^$ejC|&cN|wWTy!XM4EYG2sphIvO zWf^-X@&s9BI2j#}M(3|y=3dEe;-owYvsxqgQ7jjfp5h?_;Rj7|g$9GFKya@V=^JsI z@j?IqcenS6D9>}Y!`}_0r z^WARuV1MuU=wLh=Bid~>toRvgOmWj@n56^KD~KMD#FxZQVIpk+V9p3jgvpc}+*^pi(Ka-1$j19z$LkpBy7mV_^Y`31$vj^FTyJ zK}7+G*zb??N!7#`X_6jnYq-Y}g^2A>V}_Urj~FmKgkdGK)8a`V;m)wzk(5*CtTPyT zd-#R-elnTV>vivauh%;|Iy%_fjWP^CzS!Q{1OR?T503$WPN#G0)~(ayLsj`9itQc*a8hAg*X53JRTdBj8PW+?!9wvvMB*#xrRN^|SHJgtmSC0RlarI%w{QDma&WNU z@1Ch0Qkg{Z+ne`z4~S~D%Amj3>vcMvYPIUnjx*91)PbTXvMkGU_jx*CfT?si^=p=b zKzXzr)5b=(niskMV$z?43Yw#5r;X0>{J}D=KmY)jWdO)$T1mgrXbVQbX2jR1iI#_P zWFzo~2bh85=13ETRoqrNMQuGebPBc-uq(WivoNBzHmgv zWQ61aFsoGa#vCB{VuD%4Wtm5q^g37}HSN*vo+y0Z2lkKgYQCQBau058CKs(!8Acw~sA0Hnb z9dTql8V%CAO-@O?EX3dLs{{P33``j(P!cS408+N5$T%P)iZ8_xCkt=x9{>R8##N#= z0J@ERjBbS;q+Z*UNC4on+_@|Sw;--j-V8G&0yL6jBnsFfLGBU#n2-)3Osz9y6?7m` ziUCm5&zUPOd@*FvY!ckvIXr)%<%fgGpi9MwMgst>wdNXUo@6CM*UMa9uj%X zvb^5PugfME^d zBiAmy^xR|betb`NIBYhX05Bepx3}&UVRg%l#OP?yXC0_ktEZ=@920jtrw}?fO9$fn z_tgQVhRVEHiKIj^7}f>EWC)82A^hdSQ zIP7*0Zhe&J4*VF3F;Y>TTPj99mpRvL`BC3x=qH~17+ntJi($7I_x*U7{2! zx5P^@f>G9Iw)nD9P+XHKZb6M-1VgMdkiSK;<%Yg9Chj*8jmTI+HrBZ1& zo2#pl>516LSvsJ^{+xIq5+c4Xc3Zn+ZCUi$>@z@^ zozFDw46F6CMFkj?r}T7uPEu-7fB0ufypUR2wbqE}vJ8N{FTD4h{hNaOF{Od>7MQHR zeRlerJZf%9<)9s+cmPtF7}M$fScdc#5fBFbLCseXtF=bcIhQ%Cw&t@89ZsMaJDhWQ zt+})Ym`#TLVltWxdJY|C*|>XLTbpP34~-<#0yRIVze!A`3w@#VUKAoinVX_wqh)I{ z6~$OViTL6A&ey)us5f4}@yYV?a+YP4N~K<}udJ+i?{~KDk!Qm^TL;cMrZMG4L(b?8`xKphVj0U4_C$D9BW23(OXkKmS^=7qNA9qg( zv9@~Nh%)$E)&V27C3S`XeIp$rP0R>Q$p*@k z>M9H&UHKtkNT53k%1HlA11J^8d;<`~oHRP#`N%}BF$=A$+Clf^azvg_6AOW9u&avx zrGsLYqlAj*s#|PLy@%_DKlji3}^=75sn$N3wwTksRfIp+* zK6N(p!D%+=y6%bVcQcH_5US@1>-Bh1e6?Dgo10r--yz!s?`hWBw_OtF&g$xMiZjST>tEJaC+$caN>)io)0UPNvk=&&>U^}cR%<@K^H_Y zqBj6!8FXC296mcs|JVg&fSB}JOlxV89X zXar`aT0&9wgJG)&j54TD9sm$~V>&$PZ5?zEd-)jJwf07>d5&Ex9;5OXU*Zb zk!5+76?3bLmHM2^>x8XtzqP+d$NNW<0`taVr8QS;x3X#tU<5GmSvFaihqj20+W6Q^ zWQd;XUucyJn=u90q$ppX7L_u}6i1yBhAC7=F|&$@m4hrE4_~|d<)VWvK&({HM@3an-d1D$IfZf#mRr7e+0i@6hF;5=|UX=tm+O-986XKX3-z6mS zsJp-d@M$X1!vO%FvF<%kn0<~}jk5N~_xAg{+pj$HRBvy`ot=*F9recJO0((v{qAVk zIJdr5P|@k+t=8iYK7KYF4MyF=vf$dQCzsVdGGFM&;u<10Ri$_bv%?)FqBz3jAuI) zv5*BqdXw`0F~hg+~_DT#?{U!8}!GmM&97%%=JpG;XRCoW1?a(C@Kv^-hdSW z;z7AKAqr7&gSY^Kwp-0P8Iqt)Vu%h<;@YAL1hXp3jLb89)-a-GBKhMlf8)hkt@g&v zPxvTEo+z=jv^1Gaw(j03iZK9Wd0uZcS60u>&(9wn9^AWg8$_zqy{J|FS#)6b1Whab z37<4BiiKiM6lUt6)J3UfEfvE5XtvcD50o^4w|9u=TahmyANsuL4*Q!QQ>Va`WSl zU-{NI7Zw-mbMr;NKk1yhJkMNZ(mSK9QfL(59M0MJkgfT_476$LJ$Xt|%bEbn(Z zm1;e!w0fPhvyNL>Zldc@y}+8QW<|AD6r(P{gglIk+VPPA^aC#z>mrG`#3u8oP6*eQqerOp3g1a?G3*At#8-CcRv2; zq<4l{hTc~ijl9vAbkArsaMk)?cc;I-nKhaOfO(!}`TWJpkXL#K`@_@Y{ODlr!sY%5 z>Xj1w0V3d?MIF0;3J!=&CnUNHsFqSB5$vaqfkuow*^MOgv_p0*dX9A&_ zX}8iUK5-8%<2uAkhwQ$M%X*f>wrJ$m=8_S(i|?ZVE%@%qYQOxuME81sok}xGoH(ws9Vb3xx?yW4#!C+8T)va5%s%pOb z?CE4Yl4`R)!h#P7)FgLq%nuk2rRQ-pdg!!DqC~RK@?XNfQbfYPTc$_&g5yw>LM~a1 z5IL}^$)o||4B9()9zTBfdu6+|cIAb#)gC>#hjo4b@#B|Xf4$!y&~*0r+O>K%En2Pa z=JEFWdV6&pLue0{uqdnH5QwO*s?lig_N{yGzgK+p(aPEL{qN#O{f_9in~xH~Q8ySq=Xeb76$xqR+?Jsi#Vc8Vh4+FCV> zasS})kABqMSZ}YbE?>MB=^Xi94Fj6o(79`m^nXY`VsP%{-9 z_9N3_d7KMVDkul55nA!Vy=q<)bgQC2u1lye#L%Wr8|$hrVhgEil|?&k{HY+8JCBN& zUMr8EDR&c2G^1!l1lMZcV-AR!nF!x*W)d~o1B+Im)&M**w(&N?#dD{A z>cz|NfAncl6o~lb$&+W#o)ty0vbuJ-zbimaaO5QMkMRM0N|EmWMBga?Z}Zj6fcroK zP^v>KX*85TsmZ)hFu<*$_27dDdy}FbSJh~;dj29&y?gCieYm%F@e(bqeDL9ir#tQH zu(kf;OM`Rg0kP!a1reg4|bdoNx&i=tIoEaD79i~*SPYEPxNmMKq{5@iBn z8Mxi%pHW#PKP)0Ng5z-L6H}-V~_~}nHWaN10fOd z!>JP0Bn=se-+uk8olfUZ|Kk6pEnu&I`Q^idz2E<%Ka*^#BQt-a56GxEKcYmkpPbVn zHP@pTZkcMEUzD76RvJjjH5ES)B1CXzdPF(Qp(nB2fB0~II9xk@rmp7ucRpz?50=lI zt%t+i53jZQz0GgFv2=1fp=XQ{h*MqQFw6g&czLWM07S$PLJ^Ao_Nng1vEH%cJ2!6B zp|$bym&On7hfZhX#h1r>2QQpFIhsxe-LkP&CQTeBfYb4>Qpg7XPv6^BE)o)?BkP2m zxb4n>R3H{a>v7(__&FSpijRNTnhuLAuY}8ApnEszqxUd`)|FSF-G#>w%4>gFAKPkw z;mfh6>h8@^yGu(QVOPd~MBrlU4Ha6Jg0lQK>VUy~!ztAkfx8o77yt=ulp}*h4iHH? z7?7EW;ftCkv&(OM^%Wwzb?5%o*S>WA)QRLJzxRjV%{Rd$wfsar0E;gHWSgou>Ke8K zCrNJ?HVkvM#!K z_Dq-#!)ibDi*jSNfGt3*m;15Rj@2^Ew~Eyb>UXG)aBQsu!;KT$=rrj>kx9oWl0v__ zf$fB3T#}3lGaUYrkR8Sn|A;&T%`TEwv=cu77d1iNOVUF6M_H`5eTln_Qf~8 z_9cWgTBWzY^-To$&L4g^-vslM`T*!L72aI!M+pWdGUH4(7ruZWC5K#fah_TclB`2s zCvYP_92a4KTHlDi_>w0&0Z?L(w+V1Q-rlyNbGplf)RmfR$ zj4?H}l3d==6SaRJg0Fw`HTniY+Tf3YfMOjJ4IqG6*U9gIcMIuLDIuL2CWoTh=)yG| z0P>aDIVThKTGLRPEAF9v4TQX6h?AiFkXh-FSOD?Nmn4GHEK-6Cw+12kfd59KqA)Va z5WfBGtAO~OKll@7|K0~0DoEYPeZVrBjd3j)A=Cya0bo1w!f`_6C&aiIqw7HOY@E0W zf>#dT^z`xWgZF+=^m|LEPaod9TXfo+UwpNm&tt5Pz5Gi5fUCp7@Mo75?P}Ea3`Wy^_Y$)<|`z-++#4vuhOp?a_!5!hPn$ zb<#CQ1}0jtYq*wf!qP}1D%U>!!dq`#xpZNn-@-o@#E}90kD>Q+qwO=%kIlQXuo9Rk zum{OwtI3Pmfxg}c3fMTM)?_rE?CrLeSLWk!Jsx&9j@9$|Z0A{jW23vifkmO5wlS4% zzF@l4zB)v9&5tqGbxn~7u;}(et2H?|?5uCJ27}#CKOu^gAKET=}nf4?`d!k~|2C)Jnu5+}b;H9suPVzT?i7oY9)qp_3;1;R6G` z++d}du{R`OS8IUdw1|z)R5DJ0C^w^rlypV%*DdpAJ>y{==G)t2Sl-0TAm#oh9az9y4>A3 z7K-4)su{QxuX?auHUQ0B2RVfzuhbwSim`65u2$0tA-0wV`}glu(@`~>mSqXhAgR_b z)Ugd0OHG-I8860kZ#cf>Obx1X191XK4~Ht81-lCK_vVgS{n)sKSUavB)XRPC@*%mP zik?YO{(wv?&&?QcAH3ab0)tGj(g2hdC}xiQ7tb6%|J;S&{Iy?Fdva2;`HaQaQQsYP zgN_1x{Wc%?v^!zH3L;&Fzekt4Gb1&Jq54|eZ-TCT3PR@Wv^9<7|aP;`6M zXt?qDmwKCLyHm$l&1SKx_YV&E1g-@M zZOiz2Ydn6v6SEWIOYJRwsB06@S{QJ9WKbzPVJel?i_LVK`0KRiT= zowao$NM|uLY%33tyf|@z_9&+{={GJ*QK0Pg>)C9ww*&1~1U$Tdx3h6a@md5(a|l0v1Y({etyS||_=^Ep0!9`F)NJK%1k{m% zyBw99naQgIgp@oM4y4W2zzQhoY2R&bS3-Mfu&I#9E0@mw{Lg;l$N7NPWJdVo ztRMA1-_ksAw90aAWzg$&woe@Y)qngCN|4-^W@%6k-l(byL6*Cu-Ep%0H_57oa{tMb z*}*~Y#L4~Jw>q6xHJ#2LJy_k|E;?OowK&Ht30geDBniOnBFj1>S2V0Xm&#;+A42G# zIQih+?{(KV`lrv0M#GC2H*2@Bg0IK4n;sRX$qt>jIOnccrewEh=Tp1UeVeyk(G=V` zCxn2qaKLIwXF@sxV0NH7WUp}Z5c-S$_;C$mgsvO?1Ih8Q=1>}t@nkhKxw?c`-i z^7u={7z9pIW*Y<3hZ^M=JKK+Do*|47fZqPrHv!@I|LD&elLMd&C34gF8xuh`#%d60 zf>v4fdK~~bb#m*?H@C0F@j(|nE*lr*!k#2YcRlGZ+P$Su+_Oh#~LMz zMe-Ao9WW=cx+l;q4#D&mi5x<55p|w$flvs_QrgPT@N%T9%iK#|3?4NbDhq_gm@=3| zl7K-Cq*M{2`h-3ghA~bS1M0F--y;lud6YU1DlrZrO`TDU#PUJjvn!c<4V@?>A|#A8 zz5T7L2;uks=(~-{fy53PJ|N@OBRs)Ff8J>*L+Er`0gKbyTW?L`o5 zw3o5wColrzRrGWu$@y?Jn@z@@<6EI@g>J9Cx&|>80Yce|RaLg!W`obLerlkndK~&s zt`xZ{wX5iM4<0`12V@uN~4mL zOdJFNWl?n7EdV%sdOM-MiJgGb^8u0sWXzv}GS;;o^gyOPltrlk2$)Vtt?H_tPUCDA zLYVIEriZ&?5q>ON%j7BiDA%U9_xu;R5%%wVI^Nw`d+ze+@#EQO*jil+-Tq&E?=RoH z`qNErEwq?2Ta;fBeU)DQN<7f6OhQrPKrkU8+ZRPioTVlQJu6kKP{#|oA?Lz5vg=X= z=zxOQH`D|4|7?IF0f7BV%9P229}OpayZz0r(c{PCou^CZE({+%`qASL|K2;Vr|@O>%Zp(}YZAjS1_HTrAf&aE zpRwu6`HlRaBo|ZE=Lk;D!lNLtwh1)w=R7LiXpL2qHg5!V0XGKl-)9q=D8$V=BSoQ? zfn_#@w}H%%HfaWt1y+<5MNyLsTs~K%$p@m$qJ+u)tAF-Se&@gc&+8xGhRg?)lqd_# zO~Z7-B&#foUZ(>9XSPqg^)p|;a_Ow%H%BeAH4G@5|JAr$$7KhC%_eeB`G}^XfTE~l zO(9??(z!p?bOJH}MbBis`=&&`Mr|k2X73t7SVC1@RrP#6+20@U?@tf+yC+W_K6$cq z;^bGp@`?aoQ$(6gk$)sCdzE72auik#2*`_q^<(BkSpkY5@}-zT4(TYFlcUoB%^(Iw z8hnl346F<2^N>o9@}Y|JBt**{k#|r;)4Z1_m=vARinBCvq@8Dts(0LoAd`n_JKJswZL@!G4u`D_31bC=J9gf~!WyG&fkRmdbkI$}?Q zBkDiE{0CW50RZY4%T8zX>{*O)Iv!094-rEhsjlXAjD?z)rhyzNle1Axqk-s2nj{yf z1_^+uCW;jI?%sKF!x|bRBDouYA<)}G4mI{Q8ZH9Z z$_Ph(vXYfJ5#_}td~TXQ7?Eg(bfNyq&GH!-kb&?*YwdwGynxl24}&E6Glv?jNu_!p zLs|WR1;IjA&A66}tLo~Q5(Ft1>UOfbL04LBfD$PZ*uMSktJgpNAH2L2!G#USL>uA- zY!yYf(*dCIWct<{U;FuQ{VlZT?YITenAsJib3=f?l(9=PHcOZ>K&0eXKnx-6gn;9l z8==*nO(%6-L#rLDd01Ma7-z#F5mobwghwrqTnRURirYFw?gn9E>;hEB80&cW=+WKp zzuVi|DhJDT9cNX&_2P?L8%rs!sLLB*Gg}es%;7H^k!4D@_@0;Nj0>$O-)6bnvltHI z*r-TzQW8{LK~_#fdRD#tZV`+H7YCm#kb--^Bz<&^3hpf#O zoRYO`%rUFHa`F6c{l-6C7^Im&LiP)^TdlQ~L9g2xPo`JD{^j5K&;S0Nx4y|Y$f(v- z;_gnr26bWtim9Gtn!=ArYpy{icYth&#=`xeEc}U^Wl@n^T{~v5tDoj zf&IxwH(o^fC?|_{n3jUpk%%UHyLZ3$7ro8nz2jTc(U{8C>iKj1Zusd}K9?$mO!TH{ zjc0k_wtvXtB$D;w-?I`hFDNqt6^*%VvkbF$=MD}A z#P(I;8B0>%Muc=0B1b&pEdYX*223VQV&HeZQE*3a9ZX}f2tfR_G9}4LZ|VbL50qKI zygIGc#@gzj-#;9UUw`e@|N0;Q?K^K>ML9BF+v(+^4bZ~m0T~1U5HO^}d<-NlvdK)eIY>guP0qiH>CAXjq23<`@zU-RZk+o5a;mTaOf$Le5oh3*MuvtP= zAU0}Nhsz0F?&zqkRtNK*hC&IWB=ucr;^thrbpD+;uc|3DblPr}>#HkE{odi>==ImW z^gI9Q-~HlSSDjAM$&*Yle0+34kl*pv9uBo39gL;JU#?snoDg`+ZTg|ac;?di)pHl- zlhJ%Wog5xMy>$~ioyll?`0zm_s$xB_s=BJ`x;C;%d7l~z)TM{1B{5Qrb)EiH^U37X zKmYUTXxu-2dhfvl3T5c_#e)ooo;}A}bj71yu0@a+mszUC6_$jZ<>Y{yzd(nAZZn7jN2yIP zMKQt00;7=J9yTe`>$I7oAAIMnH?CZ|knUFWXti2vt1Cy*(yFdT4 zvJ8pUATa{F-EGYYF^D}lgVs2y8VCu&%u*N ztz*ab9zL85hqG9h%Y%d6N1uD{eAL8(Jd(*Ho@Nh(?qSwN2iL0L1%p#9iJg045*XK0 zJ*qn?&KUzS;pXLAn-_mL(hZ0jO_e~m@UpPv{Hcl?8hrDB^cy*Ab*$cbqAt|;10#)L1|Kz zOK#DF;Wo7%l1@AR6!X&qzk-*$(W*a2_lU|!hZ-HsX*z3#Tx`d z44=Pv;{M9=Y&IM3?u4S8?eEcizJC4!hVbm>NA+yFd~!Pu2JLPyQVb!4P=pW>F{G0K z^A$2gRM)kdJ`wHQzO{S%V<_9x(P0&9iZngg3$515<>$B7%9k&`41Ph*%gzG1p|c;dDX-SIsqN1{ zcj5BIbJuU)`pzHx=`a4=)#sl(UxWexWfqy3xrBgq&BjbJZ-qMbDJzp$yf&&S1=83- zV{FU;pblveQ1Bb0959cF%l&qQ;_>#Wd!sRwMQgA;eDZkq!}pI}xDa~%y?gh^&z`Mc zxHuaOdaG-QScE#|nnDNwd{9pkM;+^w=ZSS4tND0$=kc{`Pi}s+_W3VNhKC0a?zfMh znC)FPs$?gul1OdeXQup1uV zGVXw=j^|BL4X{}TfJ!!}L4s2@Rg&Lgn9oSW8arafJ&OZrU?(cgdhHCG6^=YRX3pHInmB0?S7$_#o4 zA;xGYc>pg#;O?g&P-{QUarGg24DI$1J6RlOoLbP72#62V4nl53zfAs#7;b?Pn^WL3%7p`1B`TT{`>uuaP2Y~D?QJ%y^ zO$y9tjffCAnQ-($;A8LkS=S&X-4!}nix5} z1vXH_a*`!O4owgP#+aU~8$wZV1d!ee3*wPk0`HW2WmOS?IRJ3TN?h8;jG9&TafBjg zgo=X8rP#sQ%Rlu}r@wUlz4xoxytjR3ey}%u^kA~Tw|eGGXXWH@cjwvn-z|Um{@Up? zos|_V3Jlol_Cl*gRW%=vQ-XiIvojrz+G}eul(7u+@uIH(()(lRXX@T;I*ftO$VG1N?i68>dKthhWsV8`PDWMFE zXUdff{LF&V-T;8wrqB@)Ao7UT=1haDEu{TC1b|dvh@q%!GA@c3FhnFGh>-#&wbW#N zB;bcqiKJp(r?kCfW71l73?bBYWI`3qHze7|BbXk}zwq*v&F$@L@BMIp|Dd(BjHg<| zhxZ?R@WJxd@&4*sYx{IHJlxye4TnRBarX2HmPLDc70Y5i8ih``TpCcfA0rG$qnZGV zBD6a7cy#LYDO_6m>MNHEm_V<^&(#*IX0-OcfMOx4Ayto~5jNH5Mr~?AyrC&wZP^{c zGY^_-y<$duksEiBFIHl!puTUWoz<&7)6lE^$;Sqw4a9U(r`D}L;g}Yh!Rt6dir401 zIwgxpOV(!xpto^NC#Wz`5_uw0^ww|kk;7#L(bG^i;TJ{XXI=^oL)TvpVY$;25C+63 zF*z_IA%;jb5=5d9LLQX>^!Wg(vNY_JL6UV{+ih{k1{p*E6ggE=RKxA%dhN9@+^ zb+;%t&z?DcYHMTAZkK= zT}&Ov;kr2(id~qRvlpuIDw9oco@WC&$|-QkJ~T&c>`JFE@qtFAewnkxHU@fz;f9z< za_A&$cvvK;Q(6i|84l%L)o761hR172D0Dh0Bif@dd5{Lmkp$kDdubnIQeg-o2E=si zpo9*w(v;0B0*1&FOzcUeM1Pd53qX44H34FlKjMJy1|KP4k!@ZdBCR9mB2&NYCm^VFH699Oho7OHti1DA&S;8qC@#Y|+pZ?K5tjVu*DFG5nNFP_X0Sip5!_2A;E|k8%Nkrb_K+zSC$9LgPqOv086XA`}Zhq8>;l zp*Y3Zhq?E#fC+dIECh+8irSV`&u=&qY1vur-iBODN#8hoH;$&A;gI2|h3Gors0hpt zc)VB;WHv(xm&wGBvQ$bA+aWoQ7D?Rg{8_yc7?L#xgcu|djR8YU$2f?XK>QH^h$4nk zaEccml>l-~EPD)Z+*YYEz!O2*`DyJXB7#_3>=1j`xlNcfiPrKPzIKkI*`#32xB?og{bxe zYIa~>DF@P_rJ2pCEB-XKAGz+YOgN-i>U2SUjxh5*cWg6xOn#_0rqIza@4 zK#??24i=FSy(m|C1rQL?*7`EVSRFhD#I+IuQ=Vk9ywM7AOc8pmU}+g%lwnIFP^65( zwr>MPQIDk@I3i{cCA#K?)r6+ABYXzYf+v8^?^tPkD!Mj_i6ij#vD7!@tz-a_1wwhR z7t5K?Z{L@$sK3~(?l5|Kp>Jc{sxec}g;C*x14Ri`pT(4k>r$gfnDI7~7$OVOs0Ku~Q{>r$NV>5TNpM=+A=3>@ z!9-(dEbD60*XoqY=$u8WYJ6iEMzn`kVZb0ybp-`8p0A8Cia6LPO9YaPH516_&J!nL zK4`&%)q(*-C``eE$)Y0!M6d^rOM9}9S}H3p#X;F|DWQkmFQn)hg3QbbvZf^!5o5#H z)tZz|DHo>{j*&9qdGRh#5*aoKmW!@*|ADC-IG01l0EC8_t(h1sI!Kk78?z=Ff^-1j z+6npC#+5=U1YZ%i*fLK%&jY+fM+{p87svuTlas95X*ff`?3@)OvQ*qlvwf*nlBG__ ztlY*$V15_@LV#F<1aRa5C?R0r`FH?`$sMvY2)G;R8XiyTWC0&>lpblu#$b$E#3Lj$ zx)~h|A*oiyZ9k@@thu3V=|U8ULfu!aLX^R|i781+n*|7=2!ZDwAX0j^7*j6^F{E}X zX)9+229B(6K}csbC}e|MgCcYZH40B6E`FclV)}_B|0A`rHc3{<Vi0hC_*jM$3PwnU|JiB&B9WCNC^qk7C;~fp(xX8(zNUm(h?oV1|XMj5)BHQ zmc@KY3S@j1)8vEbKzVOcS?~ar?N3DxVnLeAUu)R_h`jt&;xh2qL%d4tRH$RJN7SC= zCX?);0mRvR(UIQ47OIR)3`1q+@w$0uaA93|l4}^E)d(6OUHEjZcW|ywBaUuuvSxU? zCH1>T@<4-8M2>U!ZiIFuu4I)Zzr&pqGt2E?+ol+o^#tXNN*!;YXo3Abgisb33RI9| zE=d3sQ1LchTwo|bLxeb(G(D}z49U&YXcVKYs^cK3DO$Nt;8buCF+E!#`BtPD>!|B2 zlEX(HcBJji9J$i1X|G)*{YG>qK_kj!G$@(TOEH8H>biDYh0V+wxqd?+f1zn1vpngV zLc7DyRERs0jUq*m{FqT##XE_j${5&wz$IajpIWC$bj-$4uC?mP>Rss7!}mk7@hIaa z6b|e9=Zp8?%>znJ4{~UT3FgfZ5Tp5cWUFcd{di|m+Q z=^zUwN~S^?f+G+=E>luTR;=`gGbAZv5|VyW=ESH!iv=yCB2a>YxXH>w2#C?A>jgow zVE`*leA^i`TQ!Ke$Twmagg_)~7vy(L%vN&^><}8unSH6|dBUqf&Ml-TuvO}kYLVG9 zK@C8K`(y>2Q~|>r{*f?EVv1Y(7bY=8u`DrIDVz-~d9_X#c^hIo=D?n2z>`a&$7R&< zlKLwkAfHSX5Q%hy1dy;^QM@&nNOfi*C;7T=C_%QlG&h=uQugg+Fj2ckby|#kI&8UEtq+v!?CX~pE zRet3-ur0~6W~lEViT|jjpqhCVt?Q$K}>7a&{g)(Gt)~yi;g{){RMR@?aN+fB8 z2<*sM3I8r}(x8t7GUFRUu!putbY;V{jtGzlodGc==`+WKAZQxU9ungi0b&S6DBMo7 zgt+-x;wnc=*NBWGMb7|CB7t`-t5*p7vF9`(imE{tMajiF7r`SPbO%#{DIgniIPxHU zaX%wue?;gY=`0>Qs4wYw+wpZ*SI)@zio}zgfK=NJ&vQ1UVsX}>-q3K9>Z>~M0_Q3aZ*io1FHcOH@4S<+pE3gK!@eAE*Ngo1gp*6mS3T}>em zvi}T4jf+`povnarH!t25k=>gbFORBlr}rezmZb$WcIeiG)YsH&WX6*u&qYy`#EGT0 zd|Wd;Lm644Ge+%KkZKgaK^wrv0%YPgJd$Zm0wRbGzPaik41)*d0{2P9>?i8SNgB!4 z69sbVMG=xiFihhJVIV3@e&Qx6_Deq2iz6YTcpX~L)6JRBI>icjDD}}SlaMSGEGitb z!WF)ptAh5X0at299x)}Hnct$8lNIO`u?XYRkgNo&6d`ZJQSTe2Su>fIGypamB%u1c zwk2-@3J$pVAW|p03xN1s=&S+K1LJ>Mz6>{%JEe=6;gEr<8k)EZiOhpZ(+|Kn+oSh~ zkVunlJva8p-$WTY1&UEomqwh2^1RzxJp0~l`Sf=fUg z#s7F5g9rdA?IT|bFG;efbf_$!>8VST2$c2Fg zSmtiqfQcXOWjiR6`g}T-WEEDr(KX726g1B=WYc#VKGnn|_Bq3G;Av&6&cNtFGC_wb z3LoAiO+u<{-#)ZICS-x#d?=BAmd9$z6(A7j#LsF?H8}g%J;a6!A!jazqs|&t1F|H| z1`3JKJ0CFX^?#?lB`O6{lhTWb$Sw2-CqM=Okkk-ZsbVT>^M=Oae3ac}y5KvVWg~_V z8U_(UNPLbo@`)>v3|^hW#Egs`YUIt#M9tEF_(b$u?|rAtg?Jx}EQUiww>6?lXStamz?hp_ zhm5Al!6G8YNNH?@XhREWsNf?bkIYD;%rJV*Iy2-=L$b(;&pe{YPr^gMG}aSHOyUbF z4;P&p>Na%r_9ylsQX_QOZyuvE^#V5Kh>@usSf4n4@~~Z%WayxS8~tZdFzU{(dg&-y zJW&nEv;lzT7OfkZuK6W-5Rf!^S}12>j_ji=OcE^S^9m~o5Y%?H{mMK9G}tndf9ggX z*@3IZr1KkPvhr;{DU0B{z3;WxDIxjx!tJt{7koCc3SO;OLR} zDea#GXGuo+^~KzOm5e00nW{((B|r>iQJ^jeGm~;~l@4u?5)iXiN=*nr6zjl!4CV=@ zX6ZlhqGXp% zKT-9Yb2@`iTsG6SON_T_4Z*gv%J)WotU1ntvg&+MY8mbdXYCwA+^{?EsY#mvqO7Ts zDOUi{GqWt_rRjOL7)YB-%p|Re-YSf{E2T#wjM5phHvpm?Jtoy5lC~p=pfCt#m~avd z^I$mLs|=mFAEn7QinZdbtR5y17+3KV#UKI2oWxH6>z688#>xypK>b`ie;T&UUsiZ##IpcV#$%AVSJD+E zjq#9{&QKse;Kql1aDg`2|Kt|r@Uj4>E|jiaA!~17i`g8Liy*W|2NyEsOL?|+)N@1*gy=D-RD>-XYgo*Lq&_U#D2-%NP}R3`+!*-X~@%7SnC@%G;>vQh+U%v&35JV z%&`x?K&9lg8gQY->1V(U2bzE>s3&9F%qrN0%>P^;(OfpQ3D`JvC=5|@K;T=5T9%H4 zF}NAu3<${|+IYl^WE4)Q6Xt2lnVU?I<(-TN+CD*r5JKUXU8F*!(P?bJ2RxRe~A|yn@`Q zeaI}qw-z01;+(X~A+;j8keR%3K2A4Bquuf?@2#`XMomKi{k_-b{1m3tC z+*4i5P!R(HhV%%Q^i^^TT&UH#vJ5>e9Fr3fsQ`QzKzNu4LSa>qanS{(pxg{b?x^mlvE zwg&OZgNeN*o)12%gLzMK)@K~j#XnJyw85G!i@8|Q5;g_$L=i&kxfCAla#Zw2uUKye z;*@C!Yh!2qAJ7(Z6F_>_k&!i76QP3>NY|j|xhSoRkiZsWekzpCFoQ)(bpmOeqPT`! z1PCC*832U|+e)J3#Q7zV|`}q(+AhXf#(eTN9vZ=r{3JBnrPdKF4 z60Iv4;F!g$=Vg&t*pV1C@O*|~ztT^+#?HQjJRtC|RxevAq8Fr$t)Thxu`hkjE<-a+ zX*1^aTbFZoy#TQq;w89&H)vL>3zw8rDa9}647m?bc1?4JSXy)h15(2yUk`VQ)Ygyc z5QukY4HI1-vD|?C-zb8RBFtAC3{XDhu*Oof3Wy+WHBoLRM8td`>JdY7rEGK0{XhLg zx(iI^!hBdn;qIzY-%YtvWvlYh&%zNizX~d}re7rlXfTx!(qKRt9$0!yTci3((_s=W z9sH|E!CL}lT5)~kAnOna#(EU&2_)!>NQDAn(N3#F8uy6VoA)fo2%>W|652F3Aki98$paoS_T~ zxdJB41ZboAtovx&!4`-(GyaezxjdTcUSZ8Jh;3>6HQ9i`aYn2}mlV5_B|dOzBr|uy z=g3`)A*6++ko!RDMNk`2oPg%b9~OWz7)kL|1{*3Y1UU;%5l#H6A#{y+={CwyTJm&0 z#>!2yzRX;d&8vRSbDgHFxPypWNk?wOSp8gsqcQ7QqOQk`kArGwQ3&Fq`#& z2pSGq8t9Ibu+9P^?@R|pG0Csk6)wiGXwps{TXP{)L^E0@b=zUcvs8=h-$Q9`OnlO! z3PKqeSd)Udne3!?(4?jZ>Q08)DTEQ~v0(_Zb~Q2+BvGjOJaa84Xfd15d^r^*?O`Sv zRX9l}Re4r`OZt2UaLC^(!>mbYW#*(=wai8?(9MwTMP)_G8;cBL z`QlA(_hZ(77i##Zi@dK~1SPA}u%EV4x$vpr367sy<5Qi;oU=0$!Y$JoS@6pQD}m2pK~r)m02#QXvSjs| zG|}(Ma;+8DljEG(%29(4I0BKF6;UKYerAubAhNdne$&Ibv-iG%s>;^FZczun_+#Q@baDz z(C=)7oapu@98M?-A2D}Qsm>ySzM}^s>G56@0A=iRzupNVzTv#) z!o&nE%it&Fx44Uxx&b~5&XdAQ>c*4g1HY!Jz<|b?x2{Qz7P+_9{ENk+qU#5pTXb7D zy1+B;i&T==(qa8zK*V&vbL-~0moWO_&nBAegW^-z zk3!u4e?i!=OMlTC;)i!qBi4vFSJiFG4|Gvwan~)6w@YFqsLrioCa+?cu( zCj#SZ%9lWx+qK=bBoV4pvI_IUCJFFV`PDgm`AKEX zfa}t_ddcqkoQNLj!6_Cis=Ri7e$HS@O+(||mQ*avIx;fC&CMP5o&uPyb2*rA@X!)q zzE?^}5py`6ol;NoM*)CjqR;i`)ttI zPjtlTEPu!(AYbD+Ke}E09rF+AYHO1jBt}%I8F>A}I2~123H5Zz+TGj#FUFr8Uy5as zx4!5gL(I<2?KujCMK;||s?;Bhq}~i?8h_H)r=g^jZaX?U@-M&K!D(JzUM@v+K3jW= zMD9)VX5!ZpO9807JfjfiFq-R4tOe#ItY(Z5GFWu+7ve3o`)r%8C{@2QOVtp~0;2+n zNzzjcsYs>_g$O8|IGq+nmQVKWjzJbkdoN256Ql#);o}1mGUq;>#Vj~Tqoy*2c5?}0 zv=SC6wP-qGGIXHry(Y#LHmY4>HQ}m^JuyIl3=c+#V%<{YhAdV;~dR-ZluJ+$44T?^_Cb>kOzi!bx)}N$B!aj*F3u|`>g}oTK|O}|BT*? zj>&@y;pG19?QOjReYWl1ZUmruzpHZBHGsU7@7J$)z8^k2AuVpO-bn%Cx0vHx}&H367ZP96>lpogKS9mClyXr?%coBF!Z_k*ukEP1+ro0@ zXi`F7l-JbM)YsnzczU0Y9))=xddWDhui8nl#6MF>6}&o)k2)lTWT<%WzuDmYCdxMtomdgb}>`D+7WMpTBIA5kwF2lC8IB!E8WpWio(S1Ty=Rg@ZxR2< z^ot(5!t@IlVJ-5v9esdIOC>I$j{z*xlpgJE60;u)1qX1U@x4*8w6q~hIMA<(9eC0b zG7=D4H70X%@B2&|NC5a*XdYJ08oM|fJ(tWghyK)6D7zU^i?9QS)IH5z#0XDmPw(~B zQUdQoFSMh#Dk%jfNT3C7Q={#Ijep1IVM>u@laE*Au$EOZ?}C0w^XCcj#ux%S62?>O_Rx`Ot8yQsIy+d9`f-pg2nkC=T0NUlq3COe>?b5?2_};vf zvm3TV5mQ-0Pi2n??6te+3|zAGX((twmPVRF0E%qX zIPe7qDub6i5dHf`iifqC*~b1bZps;9DSMAzarH#F7xSydlX{K?X)!S~mE_Awf8^z9 zAVUN_x*t8@DvI^%Tm$g?`5BMw@523LU1w9hdNj9o(JTZN8hYkmG5kgfYG`D%?BsD4 zK;Tc5Ie=^$;EQvbDYtPSZn!zvg zZhBQ>P)13-Dv^{2TquYQmT>m=rBz4sD)T)H7CV zc?rA#Kbe?P2D0y}L3mqV#?{|E{L<|~Pd$C7DWkZ7~ z8D4B$oalnM%!mFYk^7<4%jWo~&R$quZ=3JO{6CO3ln*K(1111K$Y&5(=MAr_AjAxW zw6P{S#O=3@UdhT>0nX0O&xUpHojg1|jEpjdK9_9pyxJRkXh?Cm_4D4lxRF&;%`)px ziEUvBwQX-v~-x^-$^GXU-RoY#NVaU}H-Kc}yqf6svAyV`eD?JTeN< zu;a&A35RjvG+yjKMoF>B|BTaXDD!?m4mh{cc&2q2clSz#_NO$-Vcwo$DS01C3j~56h(92~NZwQY>&| zO-dA?;KwIN1^|j}X^$%{yZjh}u-5UZ1wC)p`;J1-UN)=7{z7XcTiKnRO%vaAbfytY zG*y4x8hL2j-ZY^?^?7B8wI?#3!LQlw$-6uJCqt4y_DeJ59O4L7-F~`}PU&Z{Ll_G3 zi_pk(UUx{?DNU+B&>0brFrLSd`T2HypX?2nQiZd%*?ye*=0l9$oF8Xn`)qx}5Y6D) zwZF(D=P3W-wXgElQ(u)dBLHx4aPVzO%gcj(tp<4MLyRw${1X!sdzmi|7QCZtUaa4M z6|uCml#Ic<@Nv`+eC-z^hU|YIIAvc)(5SZLNDShQY$&Vf{TZB}pWiyW4lNrxxbT>> zhRX7iadDVe&ZIBcR8P-YXS4L==H{NAo$a&Gn3$PmPwem}_Q_=)+3u(@7^x8>yD{ls zxte?lk!iXdq4|p$Eb!IDUmGZ{o+ECkd#Q{iYMopu#hxmgN$4KCdyG7$2{i7-v;wX|`WDAP`E% zN5jMP?a<&RmeqW0YHGT%aj|D0LZHS3+A%}P*CWwV+yG>?O8D*5DB-X!-wQ^CL0Q7eXZ7bg=|XG95p`>{|dCV;dSDLzoYH zbg217j1pW6;Nga!^lmu}h`Ll*Mnj%X_@E&|@Wk_4($r$pp$G&bRE`L^_PzhRyd1$G z|NW*LU%h&U_v}32i>GJO7zPVO3Jb0;;vGni|0)KvVJO_)hh{SMXlmemfa+?|W8u82I>nr?Cok`xobN;w9wr9KY+fGbon-NZ70*Adx`vuk zH0a3<$^6;A3&BM;OOR=K_owG^dU5ZWF!+jox9WMW4F?zNp`+4{(%M3m{}Ro$47yU6 z(C1W!4>!Noe1cZk3eAoJx<}D3Dau?SZCz^4XT%7IF*CZTBnhxP?pv(ino%0rv*!b2nfTjd{T?#ZeUJ$+40 z&EkojiyLS~UER#V1=gJyA(*eECU7zM)jh#&SCmQ$`EMyT;s(8eH@BHkj2;woMQ7hI zbJXo_`5!yUWF(M75FLEOWvgg7;;x9}n+Y8!OUA_H>hyWHB7=fC-bvCnvmS@2L)sQA zUhp%}(qr1gH2XA;6&sGv(HCQ?c?7f%TaOVR78w2Xc^>HpvtK<~OrN#!w2@Y#=pf6z zoY^}c%9MBeI@V)M(U?wQXNlFcn;?3#$=7(*NS95t^EiTG8 zepxQwvjfUmj=j1Pq*-!oVgog-5`dUWaA+2S}S+$Syh zJR0T=xDGAeguKtZ#smh1va zBa)mMp4HA9ll&O>PXZ0@HaS2-7p@r4XInaiMoK*VmsjegSJj}N=psVL{FMCupB<(B zVe>1lotway`m|e02aMKs%m)ggz@#DOHSYqJISwFU2${$$~cKQj$TaawCD zs~D4-hDsg2gq5+hnLT^on}+!r?@j-8Qj*5|%Hk_$3;>aym**iCl%r|*2sL!b6j~Sz=yCQ_`!>9yb!Qo3+GY<7MMmODN7+Y!WQjSRqOwWceDbp*o zO1Tnc*c6|Lg?C{tFWuqFoY)A}%f*z5H)I`sIvlGJx8C?60i zXsH>{KX)tX*6l}Rti)<(Ypn@9on<&Biqd`0mdf4bXyUO5nVFdz;*7dY@8o~{e%L)rRsnm8eAu(ft*Qh(12MI| znWPNqz=ayQ7&L+awE{7;XbwI?DZ<`aT=U05rE(CMG)pkO##0f8^((U!&wE_`t7+kf z@u}bqJ@e|+darDUz3b`Zx`w^IWblu(2fNnT_P>9Vlatri*KKVObZ{3Q2J04hn{2l8 z^{*T<1L6#9s03k z3J+DvTbI(RQJGX(96sPZW$;!>X?J(`5YyMXx~`&v$38~cit5T&_Qaf=2Ue@-ZeyBG)McBYWZ1Nd57EWtfrN&{gJdE`=%bmDiqQ-Vc^2uDGzz3hq2Nb2 zDM>D>0`WepNLmRfN`VY5Esq|3leNZp>Qfi117Q1EOdz!4w_#D94&FoMc~LPG0H=XU z0uZ-5ImKujk9{wYlfH4{+!wc7ZkwF^Sv*~Sqo?n6pjUUZxY;5LRF>8Li_!VnOFi=H zC)>Y*R_V9=y41!S5q{r|7>UYKuLcP)2F;odvs15HIn@h*9F~$X^H^E50QeI%NSa>p z_8BJpou*pWXzWK=`g1Rc|eY#PGLa6xwzny|m&yYr&8}k4iVTgaUK`F84qQe1(nejY+Ko%H-R( z^6)^z6FLAY4FoNsZqCoEj{bECE+&Xv287eRJWEsZ!blqQGK@1(IY1DimGwQfHd|96gsB! zS2xzInVk=56o664oL=$5ULYIE-*T1Y`+@t52Q{dynqOX!X2Ix$ninjbP^`SjGC!1% zwy+qon5?qB;do{^6+BNeYUmbl4g9l3wtV zZ@Ro<=SrqDB5^aV2@}CM7k%9490wqN^ufS7U*1A={XqWOUrY; zaSkDb1*t}dc08qTVtGUz`Bvm{hgdV@`9 zbFz9up4U`b;spFe@j8d6O3c2uV9i0%(x96h4rb;t7eV3E!0 zrSEjzM;T+EdHDGG38(~s;_L}8>`G?jb*y^+*fdCzow>Kp_U;v9SHY{-x&y>VT@^4Q zD0$idAE^-d*VU(fFJKC$ahKjz;h2Rd@im5MXX@==(O}q{Hg}tKVz(;?cMam#(`NUF zY)_U$QIhWOqh-r2kNKSWUdog%?D&4bqThC^V`2p77YdDZmY@vR>t3RVEAdD9_PGz=*oapqS#UH1$uQj1=80aXu#-+NIJ1U#3V`ER1y6e<9iv|rFW zIF+?DikRG_o)KxMW0{zkV0NCKw@&<0U~_ZW^$-|sr8;<8Pw>XnE%kcH4e++ax7TeMz7wz+%j5LO(sZU zaOVt~ws3&EX~NTL3fHoOq0x18tv>-eIyycSj?0T*Hm2Tmg%QavzubukkQS=Z;-hNGW^W~P~x1Cdq+)SfU^LTM`)Uf}zE>eiY}=aqi>J2FA`IXd0u zzel*!*v71@jwGfQg+nCY!>=**q{+=LyBaq5$cD=bE=fsAFNC=b9ax!4P{JwYc#HMC3LOcJ8BUrIAK3`ky zxN4w<>k>KkmRRZ++Nvbm&S&g4J=g2;cTgYFdwfK?2LExbMebQ9jpsqh?8w+Ivx=dgQ8x;NgAsgs8)DPQ~kRfO9WMrhX`jkn7MC2-48h zRP&<%mRP?EyA^_ta}77jUyEPp;pliaVC!BxXo`BX zII5C7r0Aa-Oo=2c8?qgYOj<9H5_c3S5aJU;8y*Vq6V*5MlJ@B9d+b%h{-#U&uWxMl z$F~sb%!}GB`*|Z*IznfvZHkME`uqDiI5@`Vmw$;RD>EmOb-N8vti1FkC8+jgmP~^U zrU~+M;f9ufC)jdzq^DO)*6a{#ReXLkHkfzQ{I)$I2py7^deu#X34R~EN$<#dr)~SB zzwo=Up3(w3(6xPq3XqkMfp(3!QUy7AT?9!0c+WYioHOa^PE{o1<9NckHH!Eqk_?wu zo?7z7H^bDn1IX}H(?^!r1ptksC96%h2#GsW)s!mIsQ}g~;VK(0tlUzpi5zDo1r!AO z)qEAz^WT*zW)p@WBTt|rhJ%|rqj-NVN6U6NdFkBgENphTZY9~ z4Q|59A~doI4C8C;pStg{zY#k}X)6vMEos^c8T4;<^%#k$dZVMb%&or1jgleed{1vV zJ{o;g2CB@zbur~8ZP`PNP7S@HTJY&qpRz4(Hg4HsKL}wC@Zls76$|pb&&035f&6>| zS1`Kyq|~CDBd4Xlqn-R{gny)rX1<3C4$&eclL{}A_wtQX3uyb`P0n-Eto&Ae+?KGD z()HsHqUo3+8LAxU4%`;rzc=Y)fTHKFh)ehCzehTx= z9xpvk;;qkW${_cS7lUs{9fswJ{Kko?c_$gYg^nKZDq7KQNjq`KP+S0_$NjNf-O`Kj z&hgzS19~WVG*L4vzh0aglOj>!JvAEskTUIP4g&!3Q;e=COF?)7K{A>$KdRGMa7PIm zalXWD95 z(|+hv{)6ST$|z=_e&woccxz76`rIRMMmxS z@{uZMjYbSd$I0`Gk>OZ#7Efg6=(d_eH;&hOPW~6a_2c5=rbL@(+2&?v88g7D;SdUb zxKKHSrDX^+1njKe*INFGxSwu*xTwVcN+n_FzY#8_s()N zO;I*KG}^CZ*gmwh5~@s*AMyL2$dekxP>)GCao!5}~Kq z5UBBdIxkhS74h%lz9J7nt`2$YFy|JQ=9vn_Tuv4tg29XsTk%L+jE03me#hE%NOaRZ z+Ujv-JWRRrED?!?N00BD3euvmueqyhYimLVOq9vR6t~ zYbKMCny(>j6C7GZd$25C?`EZmg*f&I5|&O`X5iA>Rb{aBCq?w-6Fd_!=v|S2xIWtf zv&6<@W+ntboLO2CoSz?|z{=Zjd)yNo9DH+epu!GmK0*Qlu7`^;Y}%kUaS=!vDpxmG z#p~RtA4}DVu^Ot;pwTn%FzTfsLj(Xp#EO{FmQAn8F;M(gSdXyM`23QDAQGrbYrE4x zZWSt_#+u5?ni{aX?T{LC6ulpVv;IEt%052*m>e##S zzRuRa8**uw^1&FmUJOu%w$ypm=T_v=|9hR#qFQ&rm+KeKrNdq_XfN^W5%q&_hZWVI zp$r+rM5{c)6sR;I!lYH|3sv&{5Zu?#afo&Cozrh=eY&sdPtjU?m)!n7q0w(%+!)PO zPbrDx)EDzOXBT%n8`Bo$Va@k-b$VNb36|JSU3v<=cWuIXT$bsf0XN7Xuv* z5=Bbt>|F4i&Hq~6xnwc>DkQw5mHSR5qiOE=_bAID=N!te9528@seO}glgpA;Q}KPU z5B^TjkW=IZ)xporMv>n8CzyC>-P^DCWhvkikiQP#05@vZ^f_to(~`dmz8|dUQ=L{~ zzR@AVI1H}*_N@-t#&o3xm;n4M25t)H{#m&In;&Tv&>Tp_tehlpG;LAba60_v=6sJ^ zy*Za9Xr(jE#?o^3kKGDbNRZOxsZ~AtcNt7!o#s)PU58X>-kU?Y+O)?p&;YZqPOhtF zUCbG3VP`}x!dQFMuh;Ae zQo=z)KlWeqG1s1FW@d>zZPHPT_(!6G(Q0zz>D&PmTFrTQX*WPqxclYb!t*aPr zv;L1w$c8y^3>21`Zt_CS)tr zJ#hCE!oc^R@F~U)t<2&t8}=B!kZ#3bax8Dhunj2$A;B}F5K2l)m;G5m&&v{CQ!lSM zWs3C)uX=AQtG-!vipr9&7iK5)s-`>O9^s?h6PrVm5))@;XX}x7*WdwUSNMk~DlA+F z4o4vCCnmOk@V=DXddD>RXFuk=TM2!+G7E+&4qMJXsnpk`j<=BKur#Z01MFhY!xJ;k zuvO24x*crX4hnUv8_z4fUG8tMKyQGJ;eTQ3Zt7|D)u`V6>>p@CS?|D14Fp*h_Xa&3 zK6+Wc<%rGmJ>7Jc{#0@A%fqE_?d>Dk%AjtGT%lZWJ&!j-UT=6`z41Pbr*XfA;=>~% z#wgLy(lEFE@fv(0WK?^@@qJ>xaQLtgow>imu!PR~Gsc2`p|tnipB!J1nk_kG@irSY zrBjdyhRZn-{+Y(x{VY3WZ9oJ_%gEu#e0=}@y}tg1@zRzahB)S_;6s#(Shr}c``LDH zFCM4;Iy1lZ?53j-NZNqzC-B69C}(DJ(g2qT0q&i!>tPxVyLC5c9;&LYj*E@02TIVy z!5;q&mlTvI58H@T-k;nC+HD#L3Pc>5bG&4ju%4`QmP(0Ykx&X=%9{Co$oQ_4OtZ4_ zOEk5)_|>Vf9&+m!r}tG4nCd_p1{QvQUmvxID*(jCJ^NVe_{Gc0%fW&O0CUZP7P4sZ zDJWyn%4p000CW=*^YhvEoNrq0JZzBnFU|Us+>U;c_QXGGK6$e4-Zs6CjPHcnfA0&k=<~MBS>xZ^>`v(pZ!B_yn zr^C*#IKAuOrpsW^o5t~y6I8=&tSwJH8uY6F)5kR1i@XY0A%YmTpqRPx6MPeA)9rD# z_*u91K&rUY_9=hkQD_-^n8?+-_|*w%RP(lLK$**sM37(Y9NH75NZ#9|Wd8R|I6)ky zByprL5h!wj}Y;y?Ua+;c#&;MsS4Ok`n!jhq~ht#HL^P6P-a05WeQC zN&ly-Ko>rY^Z*!c*YC zc39-nz}DdkvJ)v>=Z9ZFzs1A-9Vqr+h#%E~1!iG-I*->T0Qurq`h~4T3*I55q^IB? z2Rf&)84Zds`<2go4`MD>5r0J|d_^kP<=N1k34PC_ZxhxHe47MhS4t`ayZiee8{E&P z$MPvDci?hCJUN(}&)-y1gvy1$L8}MC$Q}$MXJ>0mPfK%qa}ZcKTU%Q>fnj20wMTHj zc%eO^mFltI$60^)w{HHd$bP%IhqOqX-Z(OP&`8Vct1(PAfOrGVRU7NL1oxI-uiE}v)YOcaaX?3Ulo;+y|>{6I1n#8O~; z7g@{B&IUEY{{A2Oa`1X6v0NypInO|KOQNv~48_Cvim)S}z{Fb+RlfM@+I%gS*JJfE zH@oq=QvYV880qBVa?v%E365-F*_Uy=8vaGeZ*6I5dFp;A$s161zzu89U_m#U`pnM3 zks{)@eHln(mg+vTy2{uY0KhPug_6MvSXSnFah_a!H`U~E^o*0dmKXpEwm!#u$5Sen$tX|acONBpPBy7k6F(p=+9uPenWx%TmS1d zEg38$KziN?k51;mD>$+E$x_>7zQfHT=>yEBr2l{%J`8f1lxLQe=*)>k(5vx({vUDM zo>K`sTOtrE|6!MX?r*r!23nzQlp zFW3OIw6(zEz8XBtfM!IP_L(QKZ+vD!;_x(o^`%5k(u&Op731Gs>%7o~! zL&XB-RFRYQjnt;Y?ff0eojb{g_X5cC`0CsH)Y~i2y16&*9c3fV+WI9+#I?{SB%{f^ zLb#8H=yBjYS|{5SbGPr3p)f=9RhUX97%^_s>iGIB;rnc>$}xt4wNBBe66N3WZ`i|`Fap20p|@kC zg*39hQP}F$JuG8pkX;s|?Uo6#&6~JxG(NaLp6H3=Bw)Z&&d<*$v8`y50ZCIhFRx}4 zN9qP0WN8{aPXj5U|G8nnEjw`_35k!7Z!svTsnH<{0UZsq^=>0^AEVxL?rqZMn01Wa(=e_OI-d=Ds2U5MCKWVt?8+gcHxD0JEI1Cm)q1&O(+vsw}OVZ;h z`%#f{JEof3g9n^Veq}?G6N@WmAV)i)=}u*cJAEe+Qcp|)Pwslm7nJaLu)kwC{V^|{ zzlbM(&=b&ME8>aeA_xBOGD$n%Z$CXbJ*_Cl1vvB@J+Du<{2jdaVnRb7+nE2+6dA<4 z2xY+Xm9%p4`6PiU&27iawxPgloP_P>Wo9+Fs_;4a#bN-~7h;8a30ib|Dt)jsv`swh z4ghIm=6(Hr;LKJ~T>O%=7)*@niM?|VFRcf-mP}iAQ_}$k&1GQfZ8w4EqJL*c$NpTM zwx;h5!9F-Q_4fCJI&N=&pXQi>mlri^f3~rqqy+4i2usfbP;ysR2K#g;8R*s+_Qg8z zTDT#g61nUi@Lc+)&0$wQxXknS&LCVg*)BQEU-VUf4jnyGK;&f6`>Z&uYY{&!CX&$2 z#7~~-U3NQ}gcjPGp?B`Pw8)gfZTX46Gn*m?E0&H&gYE6@TU%T8*D~Z5g>H{3gX*8P zhz=`!=m3EO0t@yeQzNRC8^>mZVtoEaWQ=a zY?4#T*n8kbDE*phW7rna8A|wLyEIn(a8qnkP)s;u) zIFA+o8RxDpOOL&i$=Z0K?#zrX2m-;5vkGQYP{!ryM&o83{lC!;2`6)kzX^HHxW1CS z4s!y{P-^aidkc}(Kkg9zNtoiyWxllN&|V1$~qn%#Pw_{!G z&(}EAmCulCU^L~{41H$bUwG(uY48Alv#IGi$WSfZuJbbtfh6-#X6NthY|w9W-JqAr z4suGR6dxNsx316f<2XNk(EW5bOxkFBwjFZ=9{(DL|M(3X?@ofJbZrVC9KlLEi7Nun z*cAqX`WM=@SkAd3VIpKbT3&sA)tX62Dy38X<;E7FME-A&?dP8<1=O!!OX&(FlV5gV z>W#|UCkaO`X^S87ni*VT;8|tNfrB30x-j>Amahr}iejSo4m{AST|lncgDZ?;tUI=F z$u4IEGyHf;rgCGEk8k${_Ga#$2+19RiCy4p^rIhKp}}=((mIOWVY%j@5pC1C7R2r* z+WK=>WMQ?ETrpVh7wqkjpeRb+>RRFRuf^ zM^#yU892+B+h^oqf&&&doygs3jcNJR!I{>CmiPXKw;=*7>N}!vvH7Vv>eCyr+1?=! z2I+L#j<*K9w&J|cnc;m+JDFDN*}NXlme$ zWtC7}ok-L9XkyCr{Jh{%8&ThHDyl>8>!!P?hvkRECTUcXU6;nap4f-C#WM?j9WgcM z6qfn{iYgsce9DXOL%;u$rzsoAv)GYEM`<4i?Nby9eUb6_EC$qA)JvS*_4X?L;y!9j z22^jl9Y8ltt^RBWjQ|R+6idd%~?-0I;;Oq89V~F*4x?)0gRZ3&#KOf%FU@=BA;Jpe94H%bdO2Ak9Ju`k&G{xKCW7ek@>))NPtz9u^N{0V_Vlm; z#8Q)UQ+v+B+#}p`);5DXDsSJSsWuPpIl@XPWB@WsN^Y7a793puFXGf0F10NVRO|RC z=XVdT{h(+ckpny3m=mSlQ+h{AhE@n-bcie`;@wm@AF2u z9AD(UlN$c}_b&+YzP@?(W1+!gB1Lxv)cv_E|5L*HqoDv885J5^q6g1@$ofRg6MxyATGQ^dUKJrk=4!ZUrt_vbcl~HRuJqr zQ?{v@sT4HSG?OJLw>y^%!6KDiH)F{&y$6qv!w0btKV-Fo#3^M}!3|1v5vq_)XlnFb{TAh00q6$;2#YDv%zN#5xO--QGRd z-${PtaA~1N48j=^mz@UUA}?#}ex6bn1K1HLiQi7841lSlqSACeZNcy|E5@L=p|P<) z3cK5(CGsq9Ry4+^1q$bN6>R0C$s(tCBOy~!kQ+IZoy?m&oQ1nI8G+?vn)h`$@ zi!7qoZ0flEWP^3NYYhKMLilb0pf z-onAc-8~^Y<6p)s=rsEIvl#|XUpgcp)3ifL368I0)-fg$D3FptHWAR9_HtbQy?TSQ zofYL)fLnN!6K1y=PKCEsp!585DCLMf=1qPQcBS2OiUt!uZyAjo!8VS+-b3Fd6SG4G zs8^>|`7>W~a(cY|82c-^d=DXcdv&#uN+3<-eO_};)Fdn_`YCp8e4Ip}-Y)>G=LB@K zwN4g)qIg4*Tf@)k%N{Arf4uyb8k_p-d1gY{pC+ZDI0Qj(1{BS$n2PYwk`DcQhJ=fV z63Gb~)Ra!<=9lk*(+Vab(EAqjZjSHwbNE-eidZkyK2r7^!({_GSJU#EswzHS(Yeoj z`K(XClhO;ON18sbZeeJs6M8~QyxxZo6qFVR`m;^-WmJe=M`2H%VNkTrGY4;IxEi=O z%&)GlUSChAE%2|qpAGX4)b{cz!Ib{y*HQoy7r%Fe1KWf|_>}n4@+epT!R(6@xit~g zceD<>EKx1BM3`6o!DLPcW!=Wm^p5LsiYF(UeyS*r2@~gPm%FEjDGY9lG$O8CqM}w2 zeIKAX3kN4EaJgb%aQbels4$Kf9F&&M(apdLBzU#~f93BQtv4)euFw*>q}wZJWM+m1 z2Qe9p@L+V;(K)e@X;K+({gx2|B9GC;`BO(tS>SVZC%AKZ#S@=-xC}DY&OkZxqTM`doj#o&S1R<3(+w>b;ZW=-0r# zd8)F$XKOt!QQ;7G7*QL9Svi+?RclzSmLrnoOXY`xj>m; z4#rN!3q(e~r)a4oC&fVR!UivYMoftQjTU?quSWNRUjH!z>G2qEg?x2Ev-!)6kTcQ! zysa05@doQiOxb$ElmJjBXy*TTSr*!TJNolsYq7;QS-I2yp(PMU8>Ccs$i2M0l2ycv z57k>=f|NTJKqFs93SPq z@2zk=tL3Hb!SBLuyk7%`J%cx7Cvab{KY8CnRC&xJDmrIgX}!>Br6MAr19Gh&J{*h3 z6VfU&l$4eI4HEC@67CW>8aKRg2gP#Gi#MhHKm=ZlJJO1ZF9e$T&ElLm>LdLf<%<3Bt!?z(o$VN3FL zwHF=%m>vPZr7jM>Pzx2|hr;-u3E7lRl_g&~7qtYqQ?}0BcSpY>gptV?xg~))cRakj zym0u@c7E}Hp6U;q-+Zo8;!{Ywb+JJVH_r>oPv6C3pmRLup_KfW`{bMi&*t3P#UsTO z>G&nEUvHN%Q9&TYJjXV5+*If!7D^C5-#IT_+?5qX0V(KhbKU1U+#0msqmu~&Z9jD& zsUHLaS__N(nZ2rnms-pqd;^78K@JV#N2zmer{GmdaDJ9(W9_)AaRXLGF+p##nTN2P zyX}J*ZT;mkZVEyCH^$j5BQa^b)lV4cpIDh41Bb}WyOPhokxvfd1-$+lpx_fM!7=w7 z8|TfQg_Pp#I$%XQ#+v~}EE;FDzp)V4ws$jYy3@}Bh1AxWDrB=`R z!aHN3`({v#6**B-BL*u5xIo@9+QJ_qO_~GLGX@US1G^@~Uy9_u9Xw^g`~Z zIUDu|fGe)S!8@^+iv?wEGsL~dZxl3gF^=^tnS8XhgqV|zr0JabVh`%q3T<@XzhAVd z2M(Kkd=V=MlXz>hG=;IWTJHxj`!nJfPXs@UhV-vuJ*g-F_ z{mgj)E~^I0jt1c6tKaL7w?TLU;>1r4?qkSTNv%`hi3h73c(?cV_xw^tWo0{?Xy{qs zXSe@i%7znDa{%4}GVY;XpHuOg9`_`si*YiCf0P_~g@1+8@$iWQR59_=2=|O7zNSA9 z6e1b|O*g;INakZ)pm`1!@bFF3rWu~E;DD~Gi(tmtEn=h^leD9coTD3sLf z!N;1ET?FhE#{2 zoK^96ix3u--az9yrdB~#=7bd`%kzvG$ECC9oXIp-MAiP)=^UJ#HzT=S>3h=t_@DmR z8iJk*n$5)t0g&9F20=Oa&x8HJ#bpAAoQB5Cwq1|?fj7Bb$^>g?T2~~{5j4GlD)Yqb zLU{4|ViU>JN2KWX3<`7xnp?|)N*xlkszsxqF{_o3u~>V*(z%70?@{Reb-MIGvVa{p z^w?WiIDFY^0dIf&cqR&7QyJemSKT-Cf8P#j+=YdOM$kSv2NxHx;*MDIAwnp3cKS@q zN48F-Yz*y6Cw2%4*&;Ep2>#2lo4c*8FX+>=)0UOf0iJdW4oK^LHvRiD__ON01LUbM zN+PRg^SOqRD`CjZ6k%B-R@>*Ir|+vEJUcRqgSvTG7uas;zx&f7=2V}9QK(<1 zy_2BQhzZF2GgV3aI@DQ0Y_%ZeUl~sf_79(cE^DUb)Kqbh(*Vm0$QgCYUyT0515(_# zb4m4Fm*UM*$cz4x4dFL0SAf0YSQ!8ouY7811iiy+RkVvfPR-4Uy6h);f5u61{6thO z{)fBX(=3V{VjT1GgPxtp2_{<=53LAgu>cLNcK$Lcn@!AUlgrNZ&BB9^S*jNa)OCLa zY>^}C>QpNm+OA_uJ)8|?pns#LQV=c(^0N&!HN1R$TJ3p3W8gLa>XD@$IF|1{$Yp`I z)5h1e7=gBXgTbBipt4#V5(cn%K5&+qP}9X&Ow7 z#K0LrU3JbG zIzJv+2~%F~h^WuH(QFj8&8Lnz>AH~8LM~jX0VHqJ=G-r##@-xd>^%Hrq{flv%%Oz; zo`UFdVH2V#DanQeFRo=f!ro)(3OWN`ID2~AtRMc8Hg(B2*PTLOC`eNQ!4@iEBc20T zXCQsuXR#c$=mKb}_CTZ2zycw3-QnYfTL9{s3?fL-Mi$^trOd5Ta^A4jdwVy@7Wlwqroh7e^fM`7(CIt! zIKwh4f*{}fkVbbGoXH&uYj_gtDSND_aB>wZffcF*l{l_~R;iU0Ge*zUQzUa3?aEi; z_b1Sp|LE@`hykAvAHM}@B1z#s;jv+;sHogBcwEf9cq$u4A|6Iq+t}DZf)l6-Y$4?{ z2O(<6buKzi+=M|oWZkExlU6uu@YqoW`b-XAlmGPci@ec!Ab^0o4Etp~hiujVlJ20} z8rOr|_aWB6TQb?pe9ZVbq?m>vWqcENQ)?{{@pmtTVi+H?IsFH?gh;u)1-be7ly6+t z*Vmy|S1+F4aKf9C%1J{kEC{&)$wWo#XV6eOU;Dalc0z=k_KnkkzgmTgj_CkE(0i%a zJ2KhZZRHs+h3`+naXaNB3B+NcQWam!+2yFYAnu3Vhn{TWsx1@4{eT^6+#t4wn|ie9 z@86!$#(^yHm4jS9JIz@|buqhx)6l=7v>p0EjXT$cB409W`YHeNsyM|9yYGs}L5v>L zT`J{(J1wZ!y}LWkS(qCsQ?5~_@62>;4^8C~kaZKFTlFa*CYnyauh-)}sez8?`%^F~ z1HD2Fd^j8YB61__R*?}}{?*^*`F4xdCJF%9@m%!Jr|o~=pZcx?ubE=qKi>Nw@hAx6 zy4JPkTSH?=P`r8`xX<>!$M$h&1Ud4jb-$|lJEYNIv>Db_$437;e~_flsncDvZ{CE# zpek%;zTWKe+U*bdxD9^3ZZPS|VfgiTvrY6Dlaw%(Uh?tE%cD41LA~vLQbysk2z!0 zC0OiPu@7O&gm9_6tgiSixg#hrBtE-+I_Lla=OAy;b-=NZlR)lt#j*2yo-WaW_MIWP z#lacoGgCumq4V=_Q$$jgZfWi`Tn}Si7X0e0Uf6(~=v@<^*po0|yZ5sfktI9V zYO_-iD5i0SamR9|N&zE!|sx}M`Cjcl{tszHX45d>@G8tH8PvwI%=Zl~8^{N4{A^c?(3_8wgL zHg)}1118+dPVIeAE|{2{gZSRkwlkc5e5$zG{ox*qXTUB=C!Du(Of*H$sz^-SmJV|= zG*wQ{TR9nF`Hd64m~U_+5{Ur*(x-8malI^ASj81DOGZ+pM;~vl&QAz(E?r&KPi^Rv zbjf=`y2%@^Sz#$@NLjcFsULzr-WL`y*XZcr}N{p`GML33Z((ubW4o1wC4jFR>4MfFnis&YVj<$|DYBEsD;bM zqZXY11#bjh_=V}mU5#7<@k=TMjDi4j7e@O0o(DJoJy6K5WY*^&QJSa6YW6qyb?2j| z@b6934&<#Q6Y+0ljx`MiL0V8c0EKQ7^Tc?}xNM8ZDMVn;WW6xc7lvFao!Com;p_Cy z!Q(IY0--NwV*lVjlps zlgO}^*_&D^oH^QLS`bnlolIu?cyCjj)Kji4b=m)fzNUS z6~&%QfCUw?FBC-T`m+^9JskD2nim2XzbkvJ9d(KYfA~uPZ>teO$!3mE}iD?fhdF=3JkYQW-&^! zF`J-UG3jy?`ooLTE)ct9JD^xL;!>y~GA5!$O~mK%jMWNNGu?z5HeS zz92h$&F%H4+3RHR3mdCx?=O39hLNBja>VF>Yw;awp( zwZp_1r`>p<%1!dRCRW+@Uq)s$b<9ZDjpGaK*!dl`8CB)U*ugVYYm=i}ZB8 zdKBT`3WY-m+qhR+v6fJ7*oip@*iCQ$wn4f{!#W7glFR3ImyZ{~&sTkx9f3ZS?f<*y>B=P_J6Z_W@^bFbb2dt;!wp2{pERKAtn|Z>Dg@OR`D}xSH^cSGCmw|>0?X_Ns(KMbmGzc_RR*krD3h9y zPwr;56@wIEyBY<910nds_RGvCRu-23n8IF2+;VVGvS;hDp=TSWu!)C{Z-*b3KE4jon<24)oBn~ix@obGzl9&$$6_Clit-kg!X^evDz1qT zMYT}y5t;1YZi}6o%-9R%K1|2GVo*9Q7F5)0wDIxgWx{&CH;u3p;Ivfghv~PCxiSoz zV`Ozso>K@9hLY<_jwIuNGRqiInSwfDJ2;*lu7T(i0+1t#6VSI=uj?n3z5j~qdQ30+ zv3~vl$r3=E%$3#Emw-V?wUhk7dG}l9<5h6>B4x(?_PsgkKT)ii8J$G%fZ6WMXL^VL z7iLoH3ts=JbW;u@WvHwQNTuZ#N1?hvzx00Yp1|6duB^6!{3``^GNm~nc7#{%XnjM8 z&sW#=F}4b_Qdjb{ksXZ0dv<+eule=?{5Q~085;o9{rEM*poZ$G-QjO&X@#0>3?XKY6U5Lu>VH@U(CY2)vIAr%%GnZCmR zbF?4zi+&M3pp*9+R}*{tv$6fy4oM*VC#rtQ4mG62J0_T6ze|UR6p&tiLSpZw>gsVo zjGGeJ@p~XMFM5jTw-iO%!Iw;{v;lU4xlLa&u={8CBjV?kYVuK!dpdxP-%it1%#iNp zS*`2dnTz=51xkkh+XlKW#6>sf_u0F7fWTB1PCGGOBfAKIzROcAjs>l63Aa7R1%h=( zvVWojAzQQl{6H}N8c645LMKL5QH&x&T)a9nqe#6EdV$0zO{l6U1IEPG2m8(?-mw_y zS>4Vj@QKujcj`NQ^vU%b2?|_q@VelHDU?Ir@Z%(x*k>s54z!ZR)40UM+39IWWb5+c z!cS{AVvUMJt(b6hH3%|a2p)~tym*f_90V68q0+EQJ%B{Oi@a?)2B=)GvHWRVWL$_O zm*(z?CLQ)>$&6&?x{i`4|l3BCU{B&KF5nG;(fml>?C1juzP(KDDo zk`)B~J=LxGSpn8Vy>(nPJouIoN#-j^B5MgTs^QT|52llnkY!c!Q+rT4b@`82=iGgq zjD)^=X(29Rg@f2Nc-A~kIkb)%QdQr?%c9pJZp2SF-D9=KQ4;un2B08^5PypZAGTwN z)?qpCfE+Ri00N43 z5nw>j7)Tx3gl0v$aE{nk1%lSaSsS0tnDTi<$`T_M3+knhh3rXM-&8T?Avy|VtAdb+ z5V36VoYt?7ryQCHPgEJ`C_&2C5|CV~Qp$(hG_Xp&`t=jDL0IvOlhey|Wg@m(0%UYC_8p zsKW0EX|fIoM#312a?H)?{V>6;L_Sn!e?0tcVU4^;%gmC5bDE24Wn%N6l@S&`J;-7z zM&rU7Qvjp^)VnR`4E~`Qw<)sC70s_juK%h7+1ugPd;owoT7NA3_x?{>Ol@<|Q+HXy z%*@O;n#T|a<^16phq?SwJM&ZE5p)(bHEiY>inb18yK=~>ko?CD&1364Vuje;NQ7|! z9o9>Uo}?~KNn%$=i=2kEV1dQH!6{etb-;{{BN$Ff18zH>i(Vn6Cx7vs8ekjlX^=8( ze?+0570q4UR>AW&$WPfEQBqsnXPyPi-Z7vi^O=>K1$iQZhu4Lh5JK$RtVLgiS~UC| zP*KnFsb=wLvHkbS32q>~@e!B53IJB84mNC`t@?A~NsiD?_`Jim8)kKkl2TN=;nnUv@e2#}zlhj%29(9xNCxPUX@#;usmccxRU| zpE}b&MaO?}{v7DC5=Zv86kEl%HvIP?&bv?Il2dJBmz-<&W=n$`N|$~$w%;VtdL#jtw19tZ=Flw^8O{V^Do0?twBVMi zN#G(vl?HA^4TyRkykmM$D@`Oo6#IofB|!f<-e!RxZ4#>c*z6emXj;%XI7(L5%L+T_ zszW-bofojLckm@$SpZeT-K4fEz)0bDuApZ96tli<5a#{Ab0@ZSDasTq^sJPr^Roa3 zeu{0Ch@xUX?DPILA4}~XSqIzHC@uqldwaf0OkDGg#b7^DnA|QM+Z3SJT1Ll`d#)mz z1wV}@S?xWp`mxPbJ9_vowIZ)bxBH*#Uc^-k&o6tP5;5xuXb{Ji_jIC^x+na0VfpZ4 zCC)ik!?9CQEKY8;cjKbicwN-}kDOF+7sgGAr5S2|m=R>cPT#wNiq~rAVlwrYEiV>+ z?Q~eDY{hUN*Jscu9K={h`)_8~4>esf!xrSo!W|hol{sy1N%Ewc@GYwkhXoz{ zlN}2rDWbzUR)}e%n3k=)#7a+hUuOyT?=wSorwuQD^~FFepujfC0XU+h0bfrGq((ic z^Os1{vKGSOlJ!}(Z77vpTP$BH8%hF+3SoEu)GheJ^bIfz{ry!#nGC*E9Z#`q1q8aX z*_uN8GSE_SA7n_%pt(<=e(sw?CSVLju+A|(TA2Os42002vxnv)9u@MZohFOe zwOj&C4LN^snH4*{a|0SAhZGyEc~dR-?EJTadDm1}Zw(fVwa&?RWvE zy00FAXaT{XFkPbyCPZSnvN5rMVc2Dssa01{QZn=tVB8I4RlHoG&JcsYX11e(+asUk zTxL{)wN>kFTI>;7<#J?hr8UAHnOsuf_A}T8*WjyijjOVuGv@UA{@N-$tHyPBZIvBu ztXUeyrVCzKDt?}Ty);?WE^6gXKPjX5j;14%3rp~VOG32707^A7Q*L?|o|X31r&={6 zF%SqQM~WHqs8i`HZX&KMt@aav1^_4Lhy?nC6qN~M*l;ahb%HcwD>6*J=Uh08kgCFQ z{v#6@x_NrHrc|Gf_}jJ*)G}7Lk9y+ImfMsBaA2Q*}=%k%<0Tppf2p!8q$zpK#+U-$SFms_+^-{|+^EqPTJP4)cglpZ6B1mH_1mRJ957BmEW9*%{ zO@k{+7E6s+4TZ{wAc&{#ZE$b#N}J${d5=`f-F@M?U=!k|P&Cq*##(n~ z0p*;jFw$3Mchk@qR5u%uN_52@w-XG}O2+ z*9?rWe|rnphEp`1YNpN^({$8B=nBsJld2EnF4fi3GdYTqlZvE@Wfdd~O8lgO4R~*z z?iERBira8>BsI2n;4c{RV0k-pk7jRW_J$Wv4Zg`4GRP(T{?vRBqnh)|wX%t+K|R~# z?1pM?1uz<5=$boWjfz5MZVpLq7|-HwtHQuEE8IhP8HYLnGVyx>G*$@XD00Em+BMlE zf%Dp3KVFquskMyB3l`@o%7)hCJg~m=5#>}O#h8c#hl2oElSTJzOj!esb(2xK+Z z#l=A_#J%TSCA_$CI$<<_PMC&=j{ns%KX7u`n(g=MilOSE|x3p38KoI=hKz5?2ft;cHjB zZ_Wl+z*r{RfKg-)K#Ndfq7qLT9qJ|$A0@=HTsEU2XI}(JQ1*NKS0~4G>DFajeY)>L zC7%6axP$j19V@Evo%nUT_@1I`h6Ejlqm-kj1vCglhCGhPPF87&U86|fAqIirCM{c7 zu?)M8<`1CpgD#fpZp5b2kBPxe7t1^s91!rG8QEe1ZB+^~*}TMq^h?L1q`6Vtym>VV%oLY_pqRPr%JdKV1#$7% zCPMAxy|vU)DFopM+kF^TCbz}?0b255aqV>Jex)$%;mSgM1`a5i46Ao(%lWkYyUnuj z_v~vMUu-OnNO2xDO8WycdfDjkkO)7&ZEYHP!fG(KEBOKWRpsy8B8ZdaHT}Rly>is75H0(5J_; z)#!D{2eURVd`S#KfVK_{=}EJ5xH>uQ#-0SiSf6<^nV!x89*24VU?XuRh=G#}m%))h z5~Esi1sWcumtR1(dB0Hvj;dMw+f=DXt`!daGMJ)^8-!b}uYi97NuAu?i zLDJ+0Gh>f5`R}n%>3h{Luus4AV=Y!5-GdF9)6XcmLPw@}$Pp@=pg*&H)SScUTX9_M zKsXF(qmI3P_fLLvL`fnoik(#6#wxgt~JpcE$Q$ABdsTrw34zCQFG$c)31114c(>X z=_V^|iFhzHT&Xg$lQD*t+-9mv!WCwxCkE60 zV*WKO_r@|?++7nIj~YF&v!KOU;Pk!ebZkqH)(=<5rdpY*fS-_aG&|>(T=gYMItZx} zSejy`nV?s1!8E5YZWV4@LQX77?|oyG|IUhEUHDbgZ9WFG&SvK9uo9IiSEL!sTJwjxq7|K&d3pU21+F%PBwQ7QWUs z3N-Yv{D8BS=C~jn3VI&vC*xC=Yz`8`aUVLmCLaFj-#h7P_d?L>>Npd76QVUFsm04F z>$U(e7#!VP%7bX-NKPgSnXImHo&uFojo{3?vtC*`NqTat=-i;59uEjkhYCvBIW3Dd z3^kUul?@OFG{ufcRpD53KMpzAYSI0g!^f`H*I3`#^FtmWq<=5Wm=RqZ>+B}eHOg0e zq5q4=-C##1f`tZFNn^w!f;WqC3=naaD)+)Bxd^1Avz@+dvbTUc^j+7a|6LsSPv^y$#uY(=sRV=pg5n@suH+UL%K^2Y+a zOChMNI}VT?!cktpC}rWSGp!CEQB@i+0#hT&eu%7kn#we=!2n3&S65UU%iRXJcl*3=tA{00lx?~`DTzCc};=Lwp{Ay^c0m5(TSFHW0vCyK>M{$44i zP;X{1UUUHXZ6bsqbpY~KS2kKIN?r|MR$;6LFn$rGtLAN2E&gI~Af%}ylK?FPH*6av zB`#j3SVB%Aj`Y+r=xdv~;V{M)2pdf}p*%9Ta&TIS>}j4BS#8BkOI3bo2r7vrne#`c zt<7OuJLc|ECARkMUw`AA2mQ?!f3MB8B zRFXo$w~Us@2l=V_o+Vhpn*7>TaWV|6LKuxS<2}N<{tGa88{M+jTfjX@YNmjfR}KJy zQR&vW5#3vPpHrcEPHHQaRy!zO*Q&-p;xX zEX&JHA*Ng-ie~pTBq;Jkpg9~GrzeVQ*}KUAGjbx4%R00;_#$!od3?Ukj7b6#P2JWJ z^e1ERF*}0y$<|bsjvIMmaY@-w_25ecUOjVToR~XcEI{p!7Y0DNr3<*|| z-D~5kv1p2p*N<@E$z&^R_Q$L%^gpZ1(k_OTSkiO~UzFc4+?U9Xjc|{%R4&lnLS?xR zP!l82k3ea_Vnb0H+MH3RI%E#RDU8x1hWbz}$I2sM<3IF_19>%jy*1(3;`z?9J}1l$ z6OkNpUd@wX$$}`key3fgi~l8)kLOh9p(_9&Ai|IX!$XJl>7K@Q?1rT18?q>7!(L-b zU+sLpr(9u`Aym0=UR3PJ5E>9LY(Pop9%@H4lsH3wt=C)-FEo%p^a-gL90T~ae^uy& zhD!#={mlN9%|!`?3A7a*9Wh^F74cDo6JH+*&x~(n76XD*>}X6MCi0Oh5U_p3z#iC% zsOpAK=tp;m*z8|jZ4h(sy_D4u|KJDdNoB-sNWbOw#8sbh24*=0!!7@18gvGG|F?T~Cykqp?U~7A37& z=b!^s+AUX>3yk;}?%7&??wMxE8lF1FjG=wwHb#i>N-DxufdmdyxL5@;JV;!P7iamT zdm7s25CZ~kS$IpLYaTtR;VU3cX1XfjGyqJ5gS8O#$w81h!OzljH zng$djnD?9aref#3Glrh25Q=N!8idb3OA*106Iuh^&(@mKQgmAUY}j-a_Gz|L{P^>i z>L2-`5VQv-HggRxZ3&d65V2C2WZ=e)K-hG&(%TstGIp$g`rW>*N|^gExU7)Yr+UN9 z_`}(se^zEyxugGw29Qp+Ly-@}DF7u2y|>PV<55azqZA*OYk2x^U34axm83afmsW8m z4q+ewsB>dv7MlgF`NQPF^Op?j^RS0TB(Y#9DX0;;UK>OxkmINYJys2GV=`S4cVh7y z1#~n(<22S3A%fTxRp0J>T_XggoE5l=p^^R)LksZCfOX@uv7mG^xXL-crREk*YnT6a zi7jGk0J z%oGy#D7!2=_ z)nYB}s&R&>32P2=bgwy5M2Z9V+x{ujZ;hx%EU4GrU*xD3=1xF;CF`v;@$br#(~SD} zd3Wre=&kstnm<$Um;%&<^k}+LgO>=3{`B0Q(9_zP1Ei^b$5sQ&^CFf~6xd;<&erk2 z#gAl1mif7*vgjxyC?&_chdwT!RNyY3obn4UJ{Aq%QGM(ALeT{c1aVy^+gpIvv4+D* zM2x`BF=;c63{(QOk!epY1}or7{jmv7(sb23E*LRa?$+6A%m@5d?tz317CD777^vnQ z)bj-!cY4&Ed3|buiEh1b?-E-$Y8>Cj$1nyH2|g{~QDbOOtTGEGAQ|B6hqpc%m?DdI zqImWsXvM6v+G-ve)=aNoL?>0&|IJH;Q|kLEO|+k&JZ<-9`Iww5qZ z=4yD(ky+k3L^m{(OZieKII#dP2zA#tc@XTGQ2DLd&D+wC zh*VoEW)0c*C;}{QF|bSj)0<;-NSOfyI|P%a55H8FRUsFqB(-k=r-q$<3dmfp)BAKA zLcRD>*QdI2>Bah1vf_N&}0D9+NSLGd#V&dUJ`AOY$?ZD z-r2P7oo}Zc=u0h5bkn%>BkGoC%(G*cvNB7MK}RQS8yf9eH_uR+hqgX zmqJCf>gWB+6eqR3-|Ev9@pL7M4JTDq0g4rKimWA8cW7r-`9`yWT`@gt4c(Z2AR<#HK zN(m@W*l+$;vgD%rNq!MM7^vRWm_GEOfqR|4IIL;K=dWLRi+h5Yp zbQSy@E?n@#*p5rCw zNJd?si(RTPM=gaF*Jycu6}bYCqCmSV zQ?vD^M$ufE?c$sLT6>z01ZuPJdQO&OY#_&}LSVQJ_lD+pAXpNup~$SjTK^DVrDhDK zce;sB2#D)^oj_~SNglyiisBu!3~&w2=|(+Wwf-cbYU2JE{sQ@~9&fpLlVD0gZagvx zF2S0sj$QCa39(cGr(tn)id&1P$b{`KHB6fahLo&l8Em;oKmb0**b=d!ilcVw2rgVg zvgmv6$I*V_>sBc|UIM8x2#WqIW?N4{l!Z9)uwuB`a1tgJPg`oe}1IC6tga3nk~fhJpYCgKMlPG}LMk)0tXA z^(R4fR{LEek^T5KwCmO*%}JE2%12f$zGIDFls4iq23ma^UNqRUpBFY%rs$|QI7Ky*chPd zf0gLV36EX-E_Qo5`!?eCw*7jslueg#;oIG?WyJV-)+ml69D1yNmCJpQS53?_QGcz7 z0FHFsd_w$7?25PO7a5(7DcN$T>lbv1ktpDt zsos^nP4J)~AFSW3X~0+-ZT$#pnSrUit8~d#7HImpt)I|fu#E;ZC>-SD!+19FWSu8DPIs|cEe_0@KFpE_<4N`z9*j*kT&CbvTpKw ze@U|-6TQOc*-M2l_rVJ=7|le=%Vi7(d&V_t7Kk`+$y5AMyn`k^;Ji6f@ zFw5NN#*l+WwB#K0#T(=JR23^U3L^a~UfIdlRqgeP626|%l~j(TQV@WOJH6ZYbMs)R zGE{gwpKYmEWUDBzanCAH4pDegY-=%p(lZG7DDu45pdwPRZzBLWUMLjcnnfI$t?3`N zDS@iDbR3`=j0f5|bZGP1rkr*Scrpwa^|;#aOEL#I!ax99Z@?{9;rqp*6W`OcD$CR~ zbDc|Vtt))8M;QtN0_OD$>`!lAhG4q$ z%L!c9l?EPo@^Fx(1Q44^(?}Y~p*z3gO!ezcalGx$XBo#<7Y7;uS3+MK14n1Ak!o&f z2PAi^vkY>Zm?H+@sCrx07u1AAP#dz^OLQw|dKc%;I%KosS0B9|`F&1YS&#HbBX#0m zqEKHr(bboc;JCYsDq6`AU_6BlN*QNFE*lg6!4%15Lj|CgW*IZ44{x0go0I{7@l3mJ zoC;s3%4_%@r&UQrIvac2Z`b>1T$-`=^p487y(-jSdu&2k}Z~Q>~1=J_evUk9@!K zg~X<5{;s}&qE7qfn5jRSoWs9rrO{++2lW%dx46M)tXPyp8M+0K71Rt!I#an}o%`Bg z{Q9u-ck}-@q(TO{p^ek;zMo<^)L7C-uFZofD5bz<;cIU)58)T;_Q^(|=RrGv+6Nnv z$!R9&%9>I1JBxTjr+hLmeVZKrUnj%*3K7+z`T`Lp?*H`iLt#tXFn%?*YYiY0TAO%> zQKghK7i+hL&;X>uAezH-UQn!fdNxf*V%idhTHmZTnC2YaJ}*Q9jDQGACW)|HVv_6! zhh+ca>;%ia6-{Yvh}ME8HrqF?JYh5`GBSEN ze~X~M`@QeciN19)t-4Ols*nk_cDC@Hdli>w_r|hC(2;^;Ly+YXm&>s;j_D<3X(`j* z;;DoIrmvHDe>^cX>K&J;9&2BG!K00cbFN4*mY00&P`_u-W)XZ5nlB0EH|qDZ5Yuri zKV>56(N7A!B3`*1Ay`|d6g~t$_@Lq&s&)E!Q2M6Vvt}m!WN<6c`d*&ex{C z3vfgrw~IR(4-GoA6kkx3)l3$@1>JiUvlRZ4oG3tf8h!U;%gHs2gysP4ydou;h?KFL z@~<+GCi8jXh}(jNp{Cosvtp*gONR?F)nodh;sF;znl^bdyaQR;xLmTDMxKZ16f$1~ zm91jaxYsEw@}m))QL~1xH?K>Vk}&ZedWoeN7SbsNxMF}jz#(d%ulbI$@$zzlbZvL2 zYTL0u3_yRw$K!DjO`&)NgvOPj zVB$$j;`g6V?x6&zIMCQmB_4V^okr`>TgH266AE8()Lho8k$(^HjXqAP*Adh2{7JwJ zUGPJVZ=+hP{(0PymORDlfn6t=Tc^7{_juZdG6DpRaf3<%CEk~g(gtr}ts9cxPHx0D zbr*90Elt2klZ1yqO*O`Xq2UK~ez6ySoz!D}{p%Kdb=3#&mi8bpe&|TZ9`6{{)YhS@9An1_`1*Dx5WrT4{SwI8>r-QxHfdHCOBq|B{ zOnI(s>djI)<)rcQEQ<;XE!H!E?5h1&L-!_lz?wLTPP(ImI5_0MxTq2~HT}T(8yXz7 zsoXU6?o>aOlghlbzan;wHr+!ax&`wn6E`K%iYQg(znaA^LQ;-@htX<;m@p>W=fZAu zb*LDF6h@pW={VS=ndHNb!Gb4-YZxz_v2laGly3c7&6jMl|9o zrtROEla+$?cGK09+tG)4{)7kLrYrsTLN%B|?nlgPZ!83U(uvP?CyFnltQWIMoESWm z2>|2AmMrzn2H<58xI$BRk*eu}6!?{^W)5==GZcbSoxdg%ppc7_YgnpNJ;! z`t!Inm#HBvdEdZB;>g@vjZNVRa9LhgjaBuCNphZ5Gxud@8RLW&@gu;3BoGt{iuC|S zdX|$8*3+L2^Vkm8F-7R)Fioh(lTTx@`*-b%=N1V-P+;_O>G*kvUm6Xfx8SLCLMT67 z@Hqa1sUI%|RC2z9jCVU#vi71pvt&d*d9%v^(tHI7m9Bz_5t0}EsmB`lnp)WB{qT41 zb?TN1-q%-X)op8I?Ghz%{+vb|xjz8!vj7qXn_cTnj~_84XUypJNufd+ir9)aJ;t6N zp1saPh9{`MHp}EzV9H};iL#V*T#C@bNbe}}>$SaQX!UKCgtzX-`l@m{73G*ow{`G% zE-4QAQ;P-_o5Dv^=l3Mp2Hl3%fBed@UU5Fu){j4lT{Z72o$ddSJ|MtkFr|DcI%KI3 zCSQALJlap%?63)xI*<614bAq(IS&I;pw+alG#r?!3sIMLZz1LxE>E#HLqIU)558R$ zeOa5-bDNq~^$58CTL($ky8*7yX@Fo%7)jXvNenBXyikDpH#YG<4Sy7km63M=;2B$^ zfrM+Xa)8V_ zy#^Wr&$#~kPH_U+cJRf`d;Zqd`6wTmKzb3et5SB@iBfa!Fh;ZpwCV8CFB!XlU+ah8 zI-3Rn=d4`0Xm|~HG0J`FC!ycN(R+(CDP24h9;!re>Xff^SOCcg$(v9_>w@{~B~SW@N{&wfpK>pq4Fw`Q#3HQx!A;3Wc^djrRWj4^3Sa9?Z^~ zES-t8Kh{_L1oj@G<};p-XwYn}cxFrw&{HIu%IAlnX^W-sQVR~0igUXE&aE6n?+1=B zF_GU6C-ERn*N-p9SAAY~s{fC-elKhcGT}>5qzZSHW(@H*$$^=zEtSyYXLy}&mx9J$ zAbp5L{Q@3|;%=7k_xwa&?ai$)PEsWrlflf`L5G7vK*rz6yCi^(z#U77kYroI!SFDZ zD`)Zo1y`n{*s8033d$`KQ512X_L);rCgTJie=yUh6*F#FrYeZ8^EaX_b<QX#c3LR!1h2L}>re+2?RJ{gsjeo8Vm`oueS|XMYdV6xvGx0JNYy z5e%@9a?ROvU@@AP5-;gLwup_(&8Bk5!OsHqszEEh4qkQAnP3@Wrwe*Z;JqBAtz6MK z#ei=hqyC>Wf4pQ*uDV|A@I4JTNj+uiHSBa7+10N8ZYeG#WrVY-WeO^0rW|=E4_x%o zZgv>TaXw?QYVLI)#5K3mb7^zfiHlJ|rSq!G6OZWtM5{lMHL)tdx+8=?=!#>1)Bi?P z7eQFyWsGC#m%r{%aErKWGcG|xLm`{pPwd6 z#Z~zhbNmj+KD0gS{tTpy-SIzt z75j+aflPfk3W?~_8bx<=xiG!QWgmZb?6xlIk*Ah2(aLbFpHq!(1-~WT&H-Sehc|A4Jp2}c%noUSX=Nc7tI_^ zqJu!*3!>_G;{#dg#h;fH$kX^8&qom;Nt9&9swq_)9@Aw%&buJYFr+SKo1sx_9{*HJ zop2LMh0JA(pxqJjz5$$=M6!Y0L9B2LvYwM%6!MJ_-|q0UPnQ|-btz&@z&;cm*@WD<4irO%}5Q^@{l`Wouq6a4WJz$OQKAm ze%vuomTo6&shs+nCxq&)sY|#CXxwt60GgbFK}+XT;P~{DI8WDCFa6qw&ww&HF?Sg4 zV7t62&Fani47Fhbtw~vomFHjFu9rLZ5|ZBYXj}P%v9cF%j(>zxR9V&s?RJ1xkFB$! zw?FLksJ^$&VwDAK4g@K9N#Yq`cwQ>K*M^CRK%^inc*K0>GjOVB8LBgVgRxtA#1mRti$A ztgF&gBeoDFX_w@uFoS~5RRUPAv}kp`hYA8k2 zB%vMgqDITY3xq)5eDVB0`^0a*cKgn`Cr|8jx|eU<+TQ8ZnA6e-ZhyEK_##H;p)5}c zaX=s!5U2tGB8pTIM5Q9?j2&f>4FHEsm5Y=y71P8yO%CsU)VRZI6r%TWo>C?J*#9$2JCBn zgmC1bWpvv!xt~hcP7s5QC|6>+tBl1-cIpn8S#_bRW4zQE{RNAn00o^&>JczQ>#`+L zYJBoAQ5tVmRaTarG@;%e+aA!PZ~@#-&sr03)Bxl^)|wjJ$*;m)QS~9IdN;oHd~H-C zosScb*Qc9%$#Gkf~&j z4@E%0sv4;NQeDq-UdXx~Q=O zVsnfc9CSD1AVDV|IaRkqzhj;JHFE&SB34CNFQuEDQCC;+r>wC~-gMFCp^Z{ ztQ2h018HpH{F^Vn`Y-;~zqxq%`ojFo6UPqi?sl%ec4vF1lT6GgF|gh~Qre5rM>COs ziY2)dq7@@Xl4C6#Ac+;vgXqbW7EBRkj!qAYlGc10u;+^wCCDQ$lczI+A7sqnl@5rw z$f{e1wK7HxXJrtDh=@XR$H_bt527q{PSlLQlJ(PedHaLBN{qyJw3CEgU@D+&tQ8p$ zgcd7V4`;ot&nN?eE__hys1}XnH-4y;^f73V_);cQE_h~pBb6XI4&&j*KvPA_Ek&vhUN}}B(=7W-T zFvUoEaZro|Rb{-DT`Ww=p98P{bCu5(k!?m{m(jNM7)v;$oRs9=x?k-Bn6;_>p7=Il z64m#PO|4q4&>)s{#Qi#wZV9EhrF+_@OluhpDYcA|Gx9Pk0cjd@PfBH|YuPHK>_gVD z>@xvk;3FoS4XP zM8r@O$m^_#;dq6a2#qQt)6BUpVz{g>d+w9lX;Z;|VHxne=&_u~Nk$^Hhf3+8X3@P?0A)Y?Y8z?#B;@{j)Cx9{A4;^@Jx-QBA*j)zG ze#0;A1(o&`gY;Vntbbxe8AY^{iZx#dSnxJRkh5lF`IZnPaKv5pgVZUJctDK2N){1A zD2f!P_n_Y(jgdHM&CID%W>SNI7U|TVnS0gpK&&D~(y9A|wG!IOpb`&ru7*|BQPOtK z(5RT1F${L&ns2_e&Dm0ock1{WIRFxDmuj^vWl+~-wC8f#cC=8Xv8(*G{1U$umlk>D zBRXYnx=Fhwql*$wwNX~-V^c3+;eYlEA1Oj{?bhAvuibkc?tk>8xQv`c2=O2OV%Dwt zZ)yP&<2h>}h&ja*5CGCW8lnjju%yJJdKXYS6&~3eCXjn(9X+@Zjee3TSJ7xx=h3{! z30f$XSUroaFh_FeMdMtgk=Sc*{o#8ofJ*Rnnis?ryhGod?UVk$*+0 zhMM$gt%eZ<^KVf$vSkRNVwY6VAi13il9d%UPgaUrjWIc608WwVdur=JS&;AOs5}rUSc%6c}zTFWKm4kf;b@PK@ zJ3$u=w`8$k=7I|uV~jlIBF6(Eqc%QGIti-0gY~gQNc$W0yPBC~6Zsbr3XZV?+uwBE zG$LYDb7}GBTh!e49Rs)ruq&#Vr~)w=XtnOnbx`91jxwUe&C#JZRdyug)5F-4~ zfAOQORs;TO(=dh^rQ}B{{)by2IlqX~f)Mk1L~$^$$EaY&PgLz;lRzPj`%H$jz=n}U zBB33>`py-U6>Gm`{UU8GXa(vasCb*T*2##(6g0w~kOLqiQzkhe;^=gt{bQ!W5E`Jy zreu$)3_=pmR7*wzYo%jOdt$C_f?${v4@fNq0r5Nxq9Ous3mo-9#12ihDb{0cKpBOJ z2;jM=pZt42_fz9ztwvewLA*DTJnLirAC2JdHww7)o?!nX>aG{nfy$a z2G`h6a#>K^t7~&~UFM8UeP`v1yqGmMBM1WWOt52aNbW@92JTA2>Kf+N>ah0N|2vd2 zA+YOcLI?#z9hF01uw%h?^Wc@Cc=LV|EL3VbuOe0IoEuORB8HS7a6F0}rIdi6+%5)3 z3_j_W*SZ-1Yp^OQ(!)yl>^Q~?a?M>NBKoDD{Ye05G|CY&;K%Gy(nC0UR3VRGC$jfM z`vd^_Pwh8z44<_hus|#jgB+hr6^Q5uKG2F>h@amiDP8m%P%0B3L3;TtD-Cfkb`u0b z5X5YY^k}@uK9H3!tD7PK1%TjgMCOK)*`*;T%70D2NeC!pn&0@)gjhH|M!vg>Y)P|q zU!@$)Cgwdc;{mpMT(ph=7}U^B)==%6SqsxCLNLWG1_gtDB>=uO3NZ0&f?i3%>yspx zX-^I6c`K|@e(7(22!>^#Hn5K<25&^GKRmBhXxRc^Smza$#|GjBuu@|}L{oDD3-cOG zwFx_N4~7~;48^b<<}sGmg3$4kvvtmrIXh>;e=`J`vrt2KmMtsX z;FDz(Q$zsp%Rl>*|L8yY-w;8gQMOtQ=LddU=?%(&{pXBkVtrp&kQ;u{Ie46p(jf?P znv!0Pp=u7)2}+1a!)Gz-Y4qUO#q^yWpKaRB+v^(j9rtJQll4u_j>&)zP(w}KS}kZk zWg6s^LkqAk+6-km^(d_Sg;_l9ExI@fBOvQJ0LYc_3NeME0TaNYaMjL=Vfn7pkKC`EUUNu)t7aLc&RvDsj{n16Gv|ppFtil>hwJE?~yh6(n}#7Ky9q z#Rin;g0N(+1C@gSOcEU2%JjXrU6e3@6E+jL8a;fiLP`SjHVoRx&j|pi#JgABx+csU zm>7xiIwEhg3n57CDCkN$o^{h#P)kDqBr~V=y_&jIQ@bXMoB?(C6vqP@Rs{VnlB736 z`lJoAs1zcA9U~$_5DLb_KzcL? zDr~-|zDD6icideDsiRr;c zz#0}p7#nMiyixd#rbn`GP?M3-3*;~5qZB&w3XJ>X2 z1MxpWT_f&UK)`gylswW!M~LbEA}%3QBAz+~BqujJGpBt}ILERj@HOqhM%}?1d66oa z$uRZ~ZWN?AoBWbv2W(}x7Qt^mckaxa&z;GLM37v9ZzEyt-;p^+j!+TkPA=USsACtyU%P28yJMF=?2Yd{2fUjb)--Kr<&G%c#A{1W^7R!a159YeZ4S zuhLYfU>1T;=HGl>Yn{@w*1|-epw}c)x)w6!6rCMvcPv;2XQ^CohDhTrT>`P!M}Y$+*pP|Wfqx+Kaw zMU{pRQOs>>bzX(kPNDz+0Og8yp{lo#QV^=^N6$U|C@1#A$TtUv zKih-sOGvxV6ICdC!OHRY%Rcg?8|d14M;88_InEy`$8ArpMn>h4L=$fWLDwp$hB5&Y zds8Y23|!;)`j=5)3gs8K{$^RCV}tb_SE|dXFO=4=Vlo z`@ir}U$n_UC_<~*DBqAN$oZUV|2|SmnPr_qTJxN@64P3s;ltY=S_6?R{m(a}46!d@ z9)v+7TyB(%^wyYRO*`C0H}XU@f<~Dg8(q|%6&P0ZeZip~)r+f%t93&s=CW*im}UJX z!K>P@WDAoJovFw;*o02ZX^s2q1Tb$o|DPVbp|b#KM&FnC+_^K)J)L<1(pLfiXq4q6 z$-o|3UabPT|Mp6?U$Jg|98aO42*0R!lm!@(f?S*$tE#H)FXNz-sbSiKJ1qm458yuU zkzW*x&#B$!U(6xV9)|Fcz8JjC(1Po}H!r@CuE4~OH6n+=hf2u81lAYHzjw2QR!(Y| z%_gTxQoAy&?!?>FHK_haNE3C4{=iNvJCzmmdI$hO;$>GEvQ_xLtjBi>KNOa{j!j5Gp89)= ze3Y@!D{r&%UOXV@9@8ts$!{6S`7G5wqMr`C4@-!NmR`Q3n>ijKB{6t}%&JNuxMtuU zZGMD$$?nnd#w}O){Hqxm6R4EZeb@GaeHOb&zIT6f;vK=#A$3+;YVsQf6iPsbv&Bkm)~* zCfVJ1*}(6qcR>pr!TSF7WVuzvf*XFwIbc`_v+DK$;aUQ^rJJaHyq5zYXv$TWGRjg2 zw=*CEs;Y4lA@f!;M@Dx;6)4^VhrSa0OMe|H%pGUf+!e1?qy`ayU1nei+_8_As1S%i zjM}e^0zz4r@DW@B8u4u}7JqpDgchKt2$gR*P8vc8p%l{ONLupBtO(eKc`lY;_aRgd zyK9Ktw_&u#s((c@V%9gd^{Og^Tl%l>4Eff>8Ju9?P=0VWFaYYAwNBaseRvjc*Zl%s5i90DNNt_3De zAzQ{k&chN&mE07=Z2$zn@^?lHKx!BOJj$YpQ9M058|5GJ{CeVNQq0Z*lK12Jc*BfA z>kY6vbZhKL&05p(_SN&DJ@?{aX_#eGfvG4Fo?KL&p?IhhPh#fl4_)zs1MDMcG#QM& z>TML=UbA&PW9W%fUylY*8)9;=J5`S9;RSqlYnycY>H%r z{8**g^?{a><1i|Z@0SvGG`#dp%<6XFV=uYZwGCd)NV9@oB|AKnsmt0!1AR6)di5Y# zyU?FNj8dyf-J8#y@$+JPHJ7{f#-c;DrhDgQ_$vSa1i&D_I2RKDfG}VY0DxkQv8tj* zGgGujxk_!UoSfqaevfvl%^99u&f2dkQqe_$7@Y4V23H&{ZIsm>BUvEJm6_og`!G^n zi!Kn0Z-?g$yDOq5FaRkQX4+^r5?ci6j+R=h>SgM>e>E@l)>*~+;?PgpDW;yk873y- zLUn6xAo%zbRc;b_+96awl|8N;u+fS6o1>Y$y}K7-$BXsn(1(#QdDsY5sz2!oZ-rn^Hz|oDhH_J^S?Q8v%q&1|Ak6eK-($Xev2q z!?zwm4NnAilH`IsG6xsHV<%~=c36E}3Cx*1_}1Ht!%PV>a^^o6K;r=aC={eeQfClr z4<{k7C>7;l>t1X~DgeO8=~4Wje*L#ehy+C;H$dvGTiURsM}$Gtu;f4v7)-$5|HYq? zW+0 z6IYTzp$?rk{qOzVpZ?4L^Z)Z9qXWuU76fZG8~wpxFsMdkr9E~0!&7PcKq;YMPuBj2 zfT1WG7>YQkL=W*;Dn)hDvIe75xYLSdH<~Yn&v`D>i{t{bgcKnnA_5Xdo{of=zvVWk z@-st688!Dfco%Cc7xYYw+OMeZBg#=1|KbzB^)G(ocY<3ii5ePFDu8U6dKfkrMa{~! zB6#-PQ_nwh)-y2_fW`@hK|ckhk?P+1UFNL8VlBfr*9}ZW1m6i+6Ob+m;w@By5BIJh8wJ9 z5+PzyK-s`X6B|uzG@vM;C?OPp0Yd>r0YyPYK}88gL7{-6grcNSLQzstLQz85fJO_N zEoio&(Sow^;wu-qwIVyoh@e64T1V6xV>(9yO)FsvX{vhHJPG4?OI7RcP%U7tvQ!gH z^i}?9J~~N&6i|&pBm($*Klf31y)@J&Y?MW-S&qt^UKx$~$^ECP9wSeg({nxVSf}e# za^>01x)=??*LAQxNd@HI!f;nIpk)h(YPlRY1dY|2Gy0I^o8js-E1iX6oIe2ogorP^ zatX^aG#a7N#72WcK_O5G5CRoNL?pzBfdUdj1cXpTfQSeIBOqZQ3=|3~3TQO2(SWjn zWm)+-6Wvy!yk;%8EH$alIZyw=Jh`9Q0T#=)r-GNC46Cf3k`WlNl2| z`}CRTo_@V>5Qq`b0s(kiS-ZJcbjaJp5l{24rIZ>l9pCR%W~0%>5Qrkl#qklS;uBIV zM3WDL-RzlA4QaHLkpt*yStFWWdq_@W1)W~kZRh?iv=gTVYR7btvNK2AjMuk9b~2d7 zb98ZgTg_$&A?|Dj1R`oSoBe7~MTjwuO-^*ScgnJCj*S&%1ArPB zs;cV7I2Ld)7<4+F-e3@8oL)H4Uwu$vn4FjyZ?{F%0ZBH+#o7Q4F{($|O!~&4A-YyF@Ah zFhI#$8bc^U0GcEsph&SQLclmc(Gd}`0GQ;Xw)$1SdE!vJJ+>L?&Qv2K+R(s(Bfhu= zXuo9RtiwT8PTk(By(1!jTBLCu0RqItPRsx?y4Mky><;=OU{pRJJ*!Ub2463T%t&v3 z`pk1rpMBw#N00&M3D{K)50?S$pMFL6gQhZs5F?Vi{lOEuC`;}Y>0~{LCJ-KF7Y#vI zMGCSMO=C>StLU=BQ5>YHeHb>xW=XtbP0o`h0$sZ_If~dv$ zxs7{wrweKYr~-D78bE!-fTWv|p#ZruH6R3_f#GpP0xSTce8CE^7s5^`HzRb9pWdrd z>xdDApJ})JrD9l9dO7rQz>k1{B9UJTjSL8qN;in30+%-Ihy;azk&wG2Efnd(On>X7 z80qa;zw&b*dEp;leEq0h-aIb@MF{=DAdV{GbxlE5fVDY^VikM+ zs)t1v%g)4fcWkCxwz~_5yU^(Mp;wOg4xH@HAMSLiTZQiQVz)8T?L#jXy;yXs&@0Dw zi*|SZXm@g<6I$KS?#v$QOf7UMRDMmH01ESll8{qs6+f}z2x$SL{EE(4q_RMkY71a8 zB059CqzH=QiFEq_s=Bk62qHp61i2quI4K?Eh;9!Kr7qHQ=g$18XAz-W7 zD2vy339$YNN+Mz-;NIZq9oW%s;8@MnjIyJ*)mFT<5{aVUo@>wR-OE&3mTNDjSN&}j z5fMQI3L|XDaCJG#%FSQ8!YHfPH!H>ntu~!GH-HL&pwXaaD*%LMJNEivY!arX%d*+I zb-%z?>&TfvgLvx(1_%p>;>vwIbPPigC+A>$0|$c`2_Te3(d+eJdHMW%e)?lZOH@qF zH8T?6ZPp;`y%k(&>$Gd4Bt0?gqiLXe?+xasKT^EOlfwP<0xM`I2a6g36NKW zsLLMJY@`dSoN7lzSxD!%GWtajhJQx&IfE`<7#w5*P`hNS&-a4+{&@(83@@GMy1Z_Xb}AB&wcdQKKZ*@>qaHYx{>rC|B_sS zQG@5xMLMUAplbN-nRim0C9ix9xxz?R59WJ4GP(EUp6?T2^>cb zBP%ayeE42fRW<53fy5a3wp%I98;YFXM*iq~oDqu%5CYih$)pp3yM|b;u0r>fI5rLt z2P+#CN@%r10|`r5dVnvyRPNh%xYI9+et&Hp1JeC_*y{pZ1Vrd{0Wt1BNP_{kC*sSm z;MRIX8uUAG`jjCSx1u%xWULMdfR$IiBN#F3FOZ$eDxFb+YYdP8WS1;e06=M%AEK=M zw&GHSpyvYwz=|jU1`HL~5hE4_sR+vuAn1V$f~*kn@BPA0Kavp`@gSR2ZInf$EV{k^ zUM>OTVo)k#PpaEj9AgZ@&T|~zV@2E%r3MOmvhAlTqv)<`MMY*^?lqJt?MRpqo11OqR)x(KNoS3M}GMqXMWijaN zVgPEjLaQYKm$5Mjp#r2v6M8+Gm<|(@5NJ?!2dyzkk;<&u)(xl$t**^CeW88KUNz|J z*o;xW_lXJQj%#uxAQlYOfXuc$z-fxoRvy{pwuoFEO{$^x?*aYe|MVaHr~lXg*PgT= zos!ZtKOKM+Az9^Uc69C^#LsdGGZ z03$$wC>yb@8MQ+64x&BrkIOka+yt3{8+J=lb3?N=`J*3cj!%*XM))5B)OZR-b~Ix} z2%#urRZ&0;1<5t8L}sZFV*m_cu(^&`UL3*t=EVYN%vt;bNT<>`_z(ILLwv=e%qWNi z5WE323x~##G8Lfps<**+zbfn$VnvDt7Q9p`5*4Ieo^UB8jhOdBRuvIF^QI@Cefo?} zgu`A&V0bW9&vL2q^&xP`W0(?@Fk~<-FWso-T5cR>MMVw}AtFM77))UJWGpV&TnGz^ z`f7X&#iS$Z(L6vD5x}NWd}dt|L+rl=48yR-DMjf*2*E$`^b~`FL#o$`LVys;xrN5e zd_R&#QAH0EK#Xy)yHyrN(H`G?7#tm;ix7>X&BIK~+c-3gEM!cwIeKayMvp z%RQ;H0`A0aih8Z3tg!<`fM5FCAAa%tB}m-$D5*BkDzFkE#cpr#5E&3B*qOSatg0!Q zYdr|5p>|YkWtf})h9KzNmo^fYkLVj&xh8a8iO7CszoROf{Tk{;P4T~81F~+qw-}Q_ ztSXk6SPiOPr@OftsM@@BWqfuq_IsVBn+M+ffsGrl7G>GlSZR)p_qNvOPCh$x{OLh= ztGl&cG{+j_lSQ+|wNw>>3nWNgdou!Nd_N42HD+WsB*_EtR4#auYR()ZDyx`jF)za0 zGh6EH-7W0~#S}Ia`{Uj@#J& zECVCQCxU1X8>6~TGAG&i3^lGi?CioQ-ts>M-Oh`AOfOK*zA{qWVOiI`2gLWF!dFqt z`EYuh`BJ(^gtP0x3Cx5oD!oIQ57>i3Ff1K4t=w(KFF8O(7lGeZZELezOO~yfg?fNSr;QSL$kIyb{ymqPTcGhoQ+F7|b=t%7DQpKs zk!Qpz0ODhG$qv-2DO7LS5(*-9_B3181WKN6*63tFlCM~2d|!y^Ii~L(*d}Y$$O7f{ zQ9|My41o8qU+><%R*bdV;}f9>JIi-MQN&)iY>)Rl+pAY!>~B6e_|_j=zw(!jW@~%- z_WElVcb9Ktfn}rJnwl%y<7KNI0#v=7s=K{%>BiW;1I7HYk(E9~5324S)mNuS>XTRY zmnA6#rMNFNy+nFNHyH;bfQCFMs^Uu!OUmLcheR>ot-#!pYy~-__Dete;TQj_Z^Hw{!pHe}`qcapx*vsJc4~XWt&X zJ8L&y>TN9XW;@dhlrw8B?Ioo)gwkMl)~>w@0?82&DMqwKE+{AAj*d8U!NHD75#Ccx zYTBN`0#mS{#8gv-5+NPPO$eo!+EGl!mpxI0 z0t<2?VY0^ag6cSl*O967B9QDONJqhq1Sj5N@Q0|k(GX!Mkbq((+sbPm4}eN%knyNl z8{?-MT|x+zo?DtZ762hdM%1HH-mv$J*4WC;>*F(1Gsn*~#%DHeUnxSE+<$a(@hFDS z9-lyr)$a1-zJ;QMfP?Ybxkh_BG}>i*V)3cB_jb2tk3SXr-Obxq+H(hiDjM_#y)HWX z?1jO6r?hKS{}}+%k|>7i1p*LM@^h6yKPD$2F@r97W2}S3OMNWxl&m`-K#UYZQDI~~ zuQVea0#Td+F@^|4h{jQ%4df;u0sYd?e)z@n7q$D}kr6Oj*;l`Yv{XVTa;NnrL~0mO zPOWsb#Y`)qa#R+=7auFu50dbo_d-NPQ4ld%@!|a!CBh~+KV`&|p#GLyn@xF7WWaTV zQ9_65-56uQK(QL^ZcUs%L%p3i=uI6y)ohQo+7m^i1#x$<@mgp3JXSjanp71r_F9uO z6Z@ZSP9G|o6VnGz5J9Ba+gk0eKiIf+5vig1o#->CshN!dtpvm|Z^7C8E~k zXW#VXvww9)AW=wrVG&X}=)t;yE<3vcd?--RSiYsv09ud40y7uRCAIv{x63|T$@+>w zFe@R&pInXFR1AA?zc1F_0ymZ}llwqKadc6LSQKG$eqr|H+3lrU{mtdpMJ!w{U1zv$qHj1vhR>u$z~Ci-8w79fhe1j~R84ap%Z84(RToo^@)j&_TOd;l`l z>JHae=g+!dU~H7sT3ke0Xv9J6b$6F;70q^0Hn#75Yj^ch9}ct{i<67v*k5bUv>Rh( zbE;Xk_jNa}^v&M3_41`mCgrq7-WlOYlg7oz;MqK0)&F`QRcr0Ku(Avf~cN^+d!a&5)px1 z4=%G35>X`teD>+HzxcO*>NkGtbHhWHx9)YJQA*ujzxGO~xpzV`!4pCuKEFHFnUH$+ z8Q5*e<2mFG5*_BtJ-a3AQ|z?H2Px|95s}O>!K^IkT$z z?z#2=b{E*ixc~^j5+#`-$zfX}Wd#XZA}QH4!w&xmKl>Lr{0IDGJ3>B5+GfyVh;%5( z2+I;FN)|~71aU8M?up&GXZou2LsfP6%+5fh`(<|ftjfyD{JyNJEIl0~=S8{|OwUle z5+kbRI*`L}W0&*hAC-Y_1M}`Y$_jZXB*#YtL<%-&u4s6LdY#N?j}`^ZJ&g8uWe@Sv z^A~=T6WFgpzrhIrfa?@~K%fo=AYh^QX8wV3X{D`E^8%G4KU8ptQh^j8*|&xZOSlM2 zjCrII`6Zm7zWc$9s`LHQC#=yh-~0d+ zkrRDmA@++OUju@VE?-w=`?K#oD?w_!fb`;XPrv;7TTnz=_M7~PPT*0VLGvFX01!k7 zzz}6IGEP8HmQwB%v(Jgv@|5v;}eoAk+TCN@KQC&$#SX zW)29)MHyzp_Mo+1tME#-<^}_qfaUse`>vhN2t8WGiBgmal1#WgR@8D^(r7qqf^{$f zAIkfU7KomTRrKl{0gao@95kVhhZUmE&6$2u*)uR7AOr@O&)Cw~Nbf?e+DI)b)QsT= zFaPI1y!ysi75?;vXZ3o0!k3=EaQW)ZOINO|JdK<)nWZDm_BovZ0Yq_vW@)z2=6}+o zSoHUN+c_OhC^ti{PegjGL^(ljHiyg)b^o-i(WO!ruEuO6ig|S>-k+D}vv`30&yGHl z8#GgAb2?WhM3CK%ym4Cw0a1b{jw1p(oZ354e6MzB4r$Qe-h9}-GQWI`QI__1lR?W5 z8&-V=fMvs$jM~(0f#t&T3M?K1CTQbMwzV#M1H0dRw0s_YkeP|5Ny{k1LqxSsLs!}; ze+l4CSR15zlIs7e4=D3qU<5rPW-O%sqIngK^i*U_EfD#qSAJO5ekJOE{I@qQUcUBM zfB6^r{g0hKdGX3kDWzoz*YlESm?UvtE?w%+>;$l6&PXkaFDpP<@XTzFtTO^>2?CV1 zAsWG;loKhHDHcgelXIqIa;975Y4_wteVTHQng3~5rycrps-4O~iYa#z5e~Z9N59A% z5ii#0+!v+e3JKY@U-oDNu<2L0Oj5TtN8Du;3ny@bhV9j|c-Za6S=4giVKz*AQ6yH* zpl}c+yL^#t_Gpl%N0&<<|9m75%DS9`)KYu{M$o+K1Nxc)LSW45*r$mI8302jL1OL` z^s6w3zXZgJ^m-=qtf3-Agn)#I1V4D?hcM~5eC^gJH`dOs9{=^#8~^;;kAD5hb;ekw zQn7723`56pHrF5Ydfk$ICX{xX6Bs*0QH%U#2nM|Y14Cu>UB!!u2v7o*GvccfX>Mae zZd0KSlpspkikGjN^K8;oosrwrH?($+f`t8N$~;6>CT~5+I}8?kbVVFW zclfcSYPZu(aYtr@xVPhZjj$2gl_~;cnPkFuYXPNcuhqWuX|GmAVjZ+7^8XKS2>?QkO(V!MQvCSZr>9S?CbF`= z**tOXtDfLr3=eS2ircMt7^TtBwk)^ap!qE6XJ=2G4QFTWZEwH*;gxg84!!%{&%gid zQ(*Q-8uI|Tg&yOw`EC16wSG{iZ=EohK!)GtZ=QsCMn3mwp_umojXqU=dFG2=H5|5< zhOu2e79jS$z_AV;$kKuBHipek((eMZ+s!WGVCE3>+_d-bZdh~t`U)4GaBg@rbHgOK zcZX-Rck(pzy}+u^cNZBG2f#%C;gN$UV=^piise;~1&P*%L9f6nzd)-$=Aox@2v9Fv z(O=Q#qZBbE)4LRHRC7=Bv@*unDny`tjEcDY`HSDV{?~ug@AvasG#ZVSl@-gfn$2bu zMULYrrT2Z`^Snx>;(1<{Wl55pJbCID@4pB6CqAbW0K-!R8iS!6ljT*(Z7iN>RA%Nn zTbqj%53YaG?sno<6G(E~7M{nr)$4UBODsPSK_!io2OI0$b)PtXqB?uDmfNJ z1d#2H&3j2>iL=_7EbQni9wB&*wdVUqG@uXAXjZ3O}M=fG|dM9k*G z_AJCo7}-whxHDPO$tWRTq{9ekte1|I$tWqxqvJ}m1n;OGry+2uV!Pm4qq ztp~Gbt{Gg`Qy+{7_0LE%>Rx2t{Kd1Up8nQ1uCLwg^?LL3^N84JG?FA43ZSF6<^ z2o(OQR4PQ2BnbedX}Ytsy|3=m)P1^VFc1hHY&W->(a{s9UGBg8U+*k(kd8$%lTjo* z&zqeKmkvRi$~2`o7QW9G7AZ;6eh(Q74ldS?9`A2$G}mr!U%FU1yt3j4>(|y^_}+`} z{pv$sWam#F24nlRkA+<5u>WrWE#LA}Is?ZPU-7vP!wd`VF?v~9Dj3n2ed863bJyW6 z?=-^9^{djELy8#@A;p8H*EneTOKE0#&9>}isqA!`y~csXz4mO#IE%L#cbQ!ka(BMb z^Qs4!V4e0bj=2aHF{Ve=Yz%pfUIU|XXdq4ruYl5e-6M3x3OlW|IXCpej-~H|N?Y*U?B_RaoTzy5MoiGet*R9vfdFqnJ)`TZ(ehWMpRV-FT)V3G<=H4?gP`!3p! zck*<-=5`x3*YbUkn8p3H_t17?z(7g_8oHjd`dd|*%B-LEwymwLq}fR%;nJaHCkTNO z+3CxqpGG|n;`X%;IE}>vG41Riq?|J54~A_Iol-BvIUHgBQ4sh8*-a z-~ZVYD~D%RpM2%D*X5w~;&=a`tfS*p4?)8uO-l&@OF7vg$FZtS3rLD;DqO*y4S*?m z@+rilP=nH?u|Eh#I644GLXs?QM|-XNjb*TGTPE!^?g<7~cpy!ww{zFBw}63d*J0R( zXqXN-XI0Kq;WQY;B>T1>W|jcpSxSQePZJ(=WSWgf2*z4i7inUVC;Eqi3lt|t>5alH zMjj;$rP#7biGqlXNTp`V)6U@tUelvMC`lzSKq_|*MXrGI`KSc&%s0OJcdx!Bgit%N z1Aq|1vMkqi+wFF%)v8vj3v>0aoIiPZVeXTa`Tu$MeJV;f<^;wYy?klnA)>ptcQ)1$ zu(Gsd+up%il{K5~_4|ymV1C}JRGnH~I9}XrCB07X?o}ojC2=+!B4bIn>&?z3g8_FO zW;@(*D#wq9%U06w?p?jox_rr=o%0SZP&C+l?`MDfhZjEhkh#Euerw0ITD)SpZZ(P@ zy+^bekwVI=JR1Hq`dFY%0%Pe%9RcJWfg#Ewl8q{6qsTD;05SbdWGd@`k_TfPO>9m_ zozNhEM9SBQDPo)}rGc@kkf%t9x$ z<@}k|b7xjBT`4Ei9k=ddJZ(Hbrc+2zn4MS>tNJ#>NV%^vNwM~ctQXE{qC(# zlTHhWgky8g{n(V7&t=)S9`|s}j z@_m1K#a~$5{p915L0Es{iFbbd*6)1bgyNBTuui2mVGJ2(DuRlLGRr`3J) z?Is%}mPft^!9pn0&R}mHXI8lFXA%Hx#=UshtvC8^qsy&mU+Ycs>eG4MBzu>ONR@p2 z0W!#b8h9wJ2+-P1hH&Q-UCfqnX1D;9-z@2RIgD*eNJJ#%w}0;|fBW*AO5+icbFQ3# z@B2{{z5l_*C%^vXyml`=|IEi%u2cShQCs5#V1Fl=>I8&U37KVYJlME<^TwGY%d z=S(G+G^diiOBBNU}7|;s_z;mP8z62^)5IGICI)+=WKN;SOiv1L0_lbE$_p?BhfsTh z5@-YhomrF!^$ew=voVvV5dh%S@s-8-dM}EV6HtA?vaB>sJzO`7HeO4Ha!kFvz{b-{$)-`d`~^Xa*>rw^Wb%nPf%d-qy5uAxjTD@UqF zj`{QRPJISZW#>dtp)ke%8AD+K5f>H!RDv*EI+XPL2itp{_08=|mxkM0{=(Aox1Q;& z-PpZ$)t#M-n!7TJUU>T3Z@m2uUAcMwOr8s0qa4mHB0X%P2It7kC@tfA!|=2N(2F-m z)7MRqKG9WXr&* zR;^0Kojp)LveLYHYyE={qUP?*>gvj&!#kILO~~4x-Wu*beD1>2|MKszoj+3)P`yt| zIX2OVq~2qCipt_dUC&WaL6ptilU_3ND3r9yd}RESM44Bs)vAj^xVxVYCECLW5rduD z?3@_3Ezjj58|)>WURAcKR!zgY5EhR+1DTRco!)N8t;k_ijb)7qr`nho*h#xvS*K?? z$HvMt#@8vg&oojbBe4%f<;9 f7WlcGfIj{Yk-(_AG_r7h00000NkvXXu0mjfu2EO0 diff --git a/output.txt b/output.txt deleted file mode 100644 index e69de29bb..000000000 diff --git a/prepend.py b/prepend.py deleted file mode 100644 index 8e587c431..000000000 --- a/prepend.py +++ /dev/null @@ -1,28 +0,0 @@ -#!/usr/bin/env python3 -import safetensors.torch as st -import torch -import argparse -import os - -def prefix_state_dict(input_path, output_path, prefix="model."): - # Load original checkpoint - state_dict = st.load_file(input_path) - - print(f"Loaded {len(state_dict)} tensors from {input_path}") - - # Add prefix to every key - new_state_dict = {f"{prefix}{k}": v for k, v in state_dict.items()} - - print(f"Writing prefixed checkpoint with {len(new_state_dict)} keys...") - st.save_file(new_state_dict, output_path) - - print(f"Saved to {output_path}") - -if __name__ == "__main__": - parser = argparse.ArgumentParser() - parser.add_argument("--input", type=str, required=True, help="Path to model.safetensors") - parser.add_argument("--output", type=str, required=True, help="Output prefixed model.safetensors") - parser.add_argument("--prefix", type=str, default="model.", help="Prefix to add to each key") - args = parser.parse_args() - - prefix_state_dict(args.input, args.output, args.prefix) diff --git a/src/lerobot/envs/configs.py b/src/lerobot/envs/configs.py index dc526114d..639c98f1f 100644 --- a/src/lerobot/envs/configs.py +++ b/src/lerobot/envs/configs.py @@ -251,6 +251,7 @@ class LiberoEnv(EnvConfig): "pixels/robot0_eye_in_hand_image": f"{OBS_IMAGES}.image2", } ) + action_type: str = "rel" def __post_init__(self): if self.obs_type == "pixels": diff --git a/src/lerobot/envs/factory.py b/src/lerobot/envs/factory.py index caa6f91ed..57fca8af6 100644 --- a/src/lerobot/envs/factory.py +++ b/src/lerobot/envs/factory.py @@ -97,6 +97,7 @@ def make_env( init_states=cfg.init_states, gym_kwargs=cfg.gym_kwargs, env_cls=env_cls, + action_type=cfg.action_type, ) elif "metaworld" in cfg.type: from lerobot.envs.metaworld import create_metaworld_envs diff --git a/src/lerobot/envs/libero.py b/src/lerobot/envs/libero.py index e2623c4f5..f0ee22503 100644 --- a/src/lerobot/envs/libero.py +++ b/src/lerobot/envs/libero.py @@ -115,6 +115,7 @@ class LiberoEnv(gym.Env): episode_index: int = 0, camera_name_mapping: dict[str, str] | None = None, num_steps_wait: int = 10, + action_type: str = "rel", ): super().__init__() self.task_id = task_id @@ -185,6 +186,7 @@ class LiberoEnv(gym.Env): self.action_space = spaces.Box( low=ACTION_LOW, high=ACTION_HIGH, shape=(ACTION_DIM,), dtype=np.float32 ) + self.action_type = action_type def render(self): raw_obs = self._env.env._get_observations() @@ -213,18 +215,25 @@ class LiberoEnv(gym.Env): if camera_name == "agentview_image": image = image[::-1, ::-1] # rotate 180 degrees images[self.camera_name_mapping[camera_name]] = image - state = np.concatenate( - ( - raw_obs["robot0_eef_pos"], - quat2axisangle(raw_obs["robot0_eef_quat"]), - raw_obs["robot0_gripper_qpos"], + + if self.action_type == "rel": + state = np.concatenate( + ( + raw_obs["robot0_eef_pos"], + quat2axisangle(raw_obs["robot0_eef_quat"]), + raw_obs["robot0_gripper_qpos"], + ) ) - ) - # add new obs for XVLA: jadechoghari - robo_ori = Mat_to_Rotate6D(self._env.robots[0].controller.ee_ori_mat) - robo_pos = self._env.robots[0].controller.ee_pos - proprio = np.concatenate([robo_pos, robo_ori, np.array([0.0])], axis=-1) - state = np.concatenate([proprio, np.zeros_like(proprio)], axis=-1) + # TODO: jadechoghari, this is an ugly quick workaround for XVLA states. + # we will open a new PR to handle this in a preprocessor. + elif self.action_type == "abs": + robo_ori = Mat_to_Rotate6D(self._env.robots[0].controller.ee_ori_mat) + robo_pos = self._env.robots[0].controller.ee_pos + proprio = np.concatenate([robo_pos, robo_ori, np.array([0.0])], axis=-1) + state = np.concatenate([proprio, np.zeros_like(proprio)], axis=-1) + else: + raise NotImplementedError(f"The action type '{self.action_type}' is not supported in LiberoEnv. " + "Please switch to an action type (e.g. 'rel', 'abs').") agent_pos = state if self.obs_type == "pixels": return {"pixels": images.copy()} @@ -250,8 +259,9 @@ class LiberoEnv(gym.Env): # Step the simulator with a no-op action for a few frames so everything settles. # Increasing this value can improve determinism and reproducibility across resets. for _ in range(self.num_steps_wait): - action = np.array([0., 0., 0., 0., 0., 0., -1.0]) + action = np.array(get_libero_dummy_action()) raw_obs, _, _, _ = self._env.step(action) + observation = self._format_raw_obs(raw_obs) for robot in self._env.robots: robot.controller.use_delta = False @@ -264,7 +274,6 @@ class LiberoEnv(gym.Env): f"Expected action to be 1-D (shape (action_dim,)), " f"but got shape {action.shape} with ndim={action.ndim}" ) - action[-1] = 1 if action[-1] > 0.5 else -1 raw_obs, reward, done, info = self._env.step(action) is_success = self._env.check_success() @@ -302,6 +311,7 @@ def _make_env_fns( camera_names: list[str], init_states: bool, gym_kwargs: Mapping[str, Any], + action_type: str, ) -> list[Callable[[], LiberoEnv]]: """Build n_envs factory callables for a single (suite, task_id).""" @@ -314,6 +324,7 @@ def _make_env_fns( camera_name=camera_names, init_states=init_states, episode_index=episode_index, + action_type=action_type, **local_kwargs, ) @@ -333,6 +344,7 @@ def create_libero_envs( camera_name: str | Sequence[str] = "agentview_image,robot0_eye_in_hand_image", init_states: bool = True, env_cls: Callable[[Sequence[Callable[[], Any]]], Any] | None = None, + action_type: str = "rel", ) -> dict[str, dict[int, Any]]: """ Create vectorized LIBERO environments with a consistent return shape. @@ -382,6 +394,7 @@ def create_libero_envs( camera_names=camera_names, init_states=init_states, gym_kwargs=gym_kwargs, + action_type=action_type, ) out[suite_name][tid] = env_cls(fns) print(f"Built vec env | suite={suite_name} | task_id={tid} | n_envs={n_envs}") diff --git a/src/lerobot/policies/xvla/README_PROCESSORS.md b/src/lerobot/policies/xvla/README_PROCESSORS.md deleted file mode 100644 index 1660f22a3..000000000 --- a/src/lerobot/policies/xvla/README_PROCESSORS.md +++ /dev/null @@ -1,132 +0,0 @@ -# XVLA Custom Processor Steps - -Three custom processor steps have been implemented for XVLA that encapsulate the preprocessing and postprocessing logic from `lerobot_eval.py`. - -## Processor Steps - -### 1. XVLAImageScaleProcessorStep -**Registry Name:** `xvla_image_scale` - -Scales image observations by 255 (from [0,1] to [0,255] range). - -```python -XVLAImageScaleProcessorStep( - image_keys=None # Auto-detects "observation.images.*" or specify list -) -``` - -### 2. XVLAAddDomainIdProcessorStep -**Registry Name:** `xvla_add_domain_id` - -Adds `domain_id` tensor to complementary data for multi-domain support. - -```python -XVLAAddDomainIdProcessorStep( - domain_id=3, # Domain identifier - device="cuda" # Tensor device -) -``` - -### 3. XVLARotation6DToAxisAngleProcessorStep -**Registry Name:** `xvla_rotation_6d_to_axis_angle` - -Converts 6D rotation to axis-angle representation: -- **Input:** [eef(3), rotation_6d(6), gripper(1)] = 10D -- **Output:** [eef(3), axis_angle(3), gripper(1)] = 7D - -```python -XVLARotation6DToAxisAngleProcessorStep( - expected_action_dim=10 -) -``` - -## Integration with Config - -These steps can be added to your XVLA policy configuration: - -### In Preprocessing Pipeline: -```python -from lerobot.policies.xvla.processor_xvla import ( - XVLAImageScaleProcessorStep, - XVLAAddDomainIdProcessorStep, -) - -preprocessor_steps = [ - RenameObservationsProcessorStep(rename_map={}), - AddBatchDimensionProcessorStep(), - XVLAImageScaleProcessorStep(), # Add this - TokenizerProcessorStep(...), - DeviceProcessorStep(device="cuda"), - XVLAAddDomainIdProcessorStep(domain_id=3), # Add this - NormalizerProcessorStep(...), -] -``` - -### In Postprocessing Pipeline: -```python -from lerobot.policies.xvla.processor_xvla import XVLARotation6DToAxisAngleProcessorStep - -postprocessor_steps = [ - UnnormalizerProcessorStep(...), - XVLARotation6DToAxisAngleProcessorStep(), # Add this - DeviceProcessorStep(device="cpu"), -] -``` - -## Usage in Evaluation - -Now your evaluation loop simplifies to: - -```python -# Before (from lerobot_eval.py lines 165-184) -observation[f"observation.images.image"] = observation[f"observation.images.image"] * 255 -observation[f"observation.images.image2"] = observation[f"observation.images.image2"] * 255 -observation = add_envs_task(env, observation) -observation = preprocessor(observation) -observation["domain_id"] = torch.tensor([int(3)], dtype=torch.long).to("cuda") - -with torch.inference_mode(): - action = policy.select_action(observation).to("cpu").numpy() -target_eef = action[:, :3] -target_axis = Rotate6D_to_AxisAngle(action[:, 3:9]) -target_act = action[:, 9:10] -action_numpy = np.concatenate([target_eef, target_axis, target_act], axis=-1) - -# After (clean and simple) -observation = add_envs_task(env, observation) # Add task -observation = preprocessor(observation) # Scales images + adds domain_id - -with torch.inference_mode(): - action = policy.select_action(observation) -action = postprocessor(action) # Converts rotation + moves to CPU -action_numpy = action.numpy() -``` - -## Configuration via Registry - -All steps are registered and can be loaded from JSON/YAML config: - -```json -{ - "preprocessor": { - "steps": [ - {"name": "xvla_image_scale"}, - {"name": "xvla_add_domain_id", "domain_id": 3, "device": "cuda"} - ] - }, - "postprocessor": { - "steps": [ - {"name": "xvla_rotation_6d_to_axis_angle", "expected_action_dim": 10} - ] - } -} -``` - -## Implementation Reference - -See `processor_groot.py` for similar patterns - these XVLA processors follow the same design: -- Registered with `@ProcessorStepRegistry.register()` -- Implement `__call__`, `transform_features`, and `get_config` -- Operate on `EnvTransition` objects -- Properly handle `transition.copy()` to avoid side effects - diff --git a/src/lerobot/policies/xvla/modeling_xvla.py b/src/lerobot/policies/xvla/modeling_xvla.py index 1e9437cd9..8eadffffa 100644 --- a/src/lerobot/policies/xvla/modeling_xvla.py +++ b/src/lerobot/policies/xvla/modeling_xvla.py @@ -402,38 +402,37 @@ class XVLAPolicy(PreTrainedPolicy): f"model.safetensors not found on the Hub at {model_id}" ) from e - # --- Step 3: Load safetensor weights --- print(f"Loading checkpoint from {model_file}") state_dict = safetensors.torch.load_file(model_file) - # --- Step 4: Modify keys --- - new_state_dict = {f"model.{k}": v for k, v in state_dict.items()} + # # --- Step 4: Modify keys --- + # new_state_dict = {f"model.{k}": v for k, v in state_dict.items()} - # Layers to skip (reinitialize) - keys_to_skip = [ - "model.transformer.action_encoder.fc.weight", - "model.transformer.action_encoder.fc.bias", - "model.transformer.action_decoder.fc.weight", - "model.transformer.action_decoder.bias.weight" - ] - new_state_dict = { - k: v for k, v in new_state_dict.items() - if k not in keys_to_skip - } - # ---- ADD THIS: Fix shared embeddings ---- + # # Layers to skip (reinitialize) + # keys_to_skip = [ + # "model.transformer.action_encoder.fc.weight", + # "model.transformer.action_encoder.fc.bias", + # "model.transformer.action_decoder.fc.weight", + # "model.transformer.action_decoder.bias.weight" + # ] + # new_state_dict = { + # k: v for k, v in new_state_dict.items() + # if k not in keys_to_skip + # } + # # ---- ADD THIS: Fix shared embeddings ---- encoder_key = "model.vlm.language_model.model.encoder.embed_tokens.weight" shared_key = "model.vlm.language_model.model.shared.weight" if encoder_key in state_dict: state_dict[shared_key] = state_dict[encoder_key] - # --- Step 5: Load into instance --- + # step 5: load into instance missing, unexpected = instance.load_state_dict(state_dict, strict=True) - print("āœ… Loaded XVLA checkpoint with modified keys.") + print("Loaded XVLA checkpoint") if missing: print(f"Missing keys: {missing}") if unexpected: print(f"Unexpected keys: {unexpected}") - # --- Step 6: Finalize --- + # step 6: finalize instance.to(config.device) instance.eval() return instance diff --git a/src/lerobot/policies/xvla/policy_postprocessor.json b/src/lerobot/policies/xvla/policy_postprocessor.json deleted file mode 100644 index e4c499d7c..000000000 --- a/src/lerobot/policies/xvla/policy_postprocessor.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "name": "policy_postprocessor", - "steps": [ - { - "registry_name": "unnormalizer_processor", - "config": { - "eps": 1e-08, - "features": { - "action": { - "type": "ACTION", - "shape": [ - 20 - ] - } - }, - "norm_map": { - "VISUAL": "MEAN_STD", - "STATE": "IDENTITY", - "ACTION": "IDENTITY" - } - } - }, - { - "registry_name": "xvla_rotation_6d_to_axis_angle", - "config": { - "expected_action_dim": 10 - } - }, - { - "registry_name": "device_processor", - "config": { - "device": "cpu", - "float_dtype": null - } - } - ] -} \ No newline at end of file diff --git a/src/lerobot/policies/xvla/policy_preprocessor.json b/src/lerobot/policies/xvla/policy_preprocessor.json deleted file mode 100644 index ce9da5010..000000000 --- a/src/lerobot/policies/xvla/policy_preprocessor.json +++ /dev/null @@ -1,87 +0,0 @@ -{ - "name": "policy_preprocessor", - "steps": [ - { - "registry_name": "rename_observations_processor", - "config": { - "rename_map": {} - } - }, - { - "registry_name": "to_batch_processor", - "config": {} - }, - { - "registry_name": "xvla_image_scale", - "config": { - "image_keys": null - } - }, - { - "registry_name": "tokenizer_processor", - "config": { - "max_length": 50, - "task_key": "task", - "padding_side": "right", - "padding": "max_length", - "truncation": true, - "tokenizer_name": "facebook/bart-large" - } - }, - { - "registry_name": "device_processor", - "config": { - "device": "cuda", - "float_dtype": null - } - }, - { - "registry_name": "xvla_add_domain_id", - "config": { - "domain_id": 3, - "device": "cuda" - } - }, - { - "registry_name": "normalizer_processor", - "config": { - "eps": 1e-08, - "features": { - "observation.images.image": { - "type": "VISUAL", - "shape": [ - 3, - 224, - 224 - ] - }, - "observation.images.image2": { - "type": "VISUAL", - "shape": [ - 3, - 224, - 224 - ] - }, - "observation.state": { - "type": "STATE", - "shape": [ - 8 - ] - }, - "action": { - "type": "ACTION", - "shape": [ - 20 - ] - } - }, - "norm_map": { - "VISUAL": "IMAGENET", - "STATE": "IDENTITY", - "ACTION": "IDENTITY" - } - } - } - ] -} \ No newline at end of file diff --git a/src/lerobot/policies/xvla/processor_xvla.py b/src/lerobot/policies/xvla/processor_xvla.py index 1b7fec659..e5fc96704 100644 --- a/src/lerobot/policies/xvla/processor_xvla.py +++ b/src/lerobot/policies/xvla/processor_xvla.py @@ -235,6 +235,9 @@ class XVLARotation6DToAxisAngleProcessorStep(ProcessorStep): # Concatenate: [eef (3), axis_angle (3), gripper (1)] = 7D action_np = np.concatenate([target_eef, target_axis, target_act], axis=-1) + + # Convert gripper action to -1 or 1 + action_np[:, -1] = np.where(action_np[:, -1] > 0.5, 1.0, -1.0) # Convert back to tensor action = torch.from_numpy(action_np).to(device=device, dtype=dtype) diff --git a/src/lerobot/scripts/lerobot_eval.py b/src/lerobot/scripts/lerobot_eval.py index e19e25ae9..15952e16e 100644 --- a/src/lerobot/scripts/lerobot_eval.py +++ b/src/lerobot/scripts/lerobot_eval.py @@ -167,14 +167,12 @@ def rollout( # Preprocess observation (includes image scaling and domain_id addition) observation = preprocessor(observation) - breakpoint() # Policy inference with torch.inference_mode(): action = policy.select_action(observation) # Postprocess action (includes rotation conversion and device transfer to CPU) action = postprocessor(action) - # Convert to numpy action_numpy: np.ndarray = action.numpy() assert action_numpy.ndim == 2, "Action dimensions should be (batch, action_dim)" diff --git a/test_2.py b/test_2.py deleted file mode 100644 index 2adac2715..000000000 --- a/test_2.py +++ /dev/null @@ -1,72 +0,0 @@ -from xvla.models.processor_xvla import XVLAProcessor -from xvla.models.modeling_xvla import XVLA -from xvla.models.configuration_xvla import XVLAConfig -import torch -import random -import numpy as np -from PIL import Image -from lerobot.policies.factory import make_policy -from lerobot.configs.policies import PreTrainedConfig -from lerobot.envs.factory import make_env_config -cfg = XVLAConfig.from_pretrained("/raid/jade/models/xvla-libero") -model = XVLA.from_pretrained("/raid/jade/models/xvla-libero") -model.eval() -model.to("cuda") -processor = XVLAProcessor.from_pretrained("/raid/jade/models/xvla-libero") -# /raid/jade/models/xvla-libero -# seet seed -torch.manual_seed(42) -random.seed(42) -np.random.seed(42) - -def make_random_pil_images(num_images=3, H=480, W=640): - images = [] - for _ in range(num_images): - # Random RGB image - arr = np.random.randint(0, 256, (H, W, 3), dtype=np.uint8) - img = Image.fromarray(arr) - images.append(img) - return images - -# Example: -images = make_random_pil_images() -language_instruction = "This is a random image" -# Multimodal preprocessing by processor -inputs = processor(images, language_instruction) -if not {"input_ids", "image_input", "image_mask"}.issubset(inputs): - raise ValueError("Processor did not return the expected keys.") - -proprio = torch.randn(1, 20) -domain_id = torch.tensor([int(0)], dtype=torch.long) - -# Align to model's device/dtype -device = model.device -dtype = next(model.parameters()).dtype - -def to_model(t: torch.Tensor) -> torch.Tensor: - if not isinstance(t, torch.Tensor): - t = torch.as_tensor(t) - # cast floats to model dtype, keep integral/bool as-is - return t.to(device=device, dtype=dtype) if t.is_floating_point() else t.to(device=device) - -inputs = {k: to_model(v) for k, v in inputs.items()} -inputs.update({ - "proprio": to_model(proprio), - "domain_id": domain_id.to(device), -}) - -# Inference -action = model.generate_actions(**inputs, steps=10).squeeze(0).float().cpu().numpy() - - -#### now for lerobot model ##################################################### - -cfg = PreTrainedConfig.from_pretrained("/raid/jade/models/xvla-libero-og_migrated") -env_cfg = make_env_config("libero", task="libero_spatial") -cfg.pretrained_path = "/raid/jade/models/xvla-libero-og_migrated" -policy = make_policy(cfg=cfg, env_cfg=env_cfg) -policy.eval() -policy.to("cuda") - -action_1 = policy.model.generate_actions(**inputs, steps=10).squeeze(0).float().cpu().numpy() -breakpoint() \ No newline at end of file diff --git a/test_3.py b/test_3.py deleted file mode 100644 index 26a2f6c5d..000000000 --- a/test_3.py +++ /dev/null @@ -1,107 +0,0 @@ -from lerobot.policies.factory import make_policy, make_pre_post_processors -# from lerobot.policies.xvla.configuration_xvla import XVLAConfig -from lerobot.configs.policies import PreTrainedConfig -from lerobot.envs.factory import make_env_config -from lerobot.utils.constants import OBS_IMAGES, OBS_STATE -from xvla.models.modeling_xvla import XVLA -import torch -import numpy as np -import random -torch.manual_seed(42) -random.seed(42) -np.random.seed(42) -observation_height: int = 224 -observation_width: int = 224 # todo: jadechoghari, image size is different for the two models -# create an observation dict -OBS = { - f"{OBS_IMAGES}.image": torch.randn(1, 3, observation_height, observation_width), - f"{OBS_IMAGES}.image2": torch.randn(1, 3, observation_height, observation_width), - OBS_STATE: torch.randn(1, 20), # ONLY if OBS_STATE is already a string - "task": "put the object in the box", -} - -IMAGENET_MEAN = torch.tensor([0.485, 0.456, 0.406]).view(1,3,1,1) -IMAGENET_STD = torch.tensor([0.229, 0.224, 0.225]).view(1,3,1,1) -def fake_rgb(H, W): - arr = np.random.randint(0, 255, (H, W, 3), dtype=np.uint8) - t = torch.from_numpy(arr).permute(2, 0, 1) # CHW - t = t.unsqueeze(0).float() - # normalize pixel to imagenet - return t - - -OBS[f"{OBS_IMAGES}.image"] = fake_rgb(observation_height, observation_width) -OBS[f"{OBS_IMAGES}.image2"] = fake_rgb(observation_height, observation_width) - -cfg = PreTrainedConfig.from_pretrained("/raid/jade/models/xvla-libero-og_migrated") -cfg.pretrained_path = "/raid/jade/models/xvla-libero-og_migrated" -env_cfg = make_env_config("libero", task="libero_spatial") -policy = make_policy( - cfg=cfg, - env_cfg=env_cfg, -) - -policy.eval() - -preprocessor_overrides = { - "device_processor": {"device": str(cfg.device)}, -} - -preprocessor, postprocessor = make_pre_post_processors( - policy_cfg=cfg, - pretrained_path=cfg.pretrained_path, - preprocessor_overrides=preprocessor_overrides, -) - -observation = preprocessor(OBS) -inputs = policy._build_model_inputs(observation) - - -#### now the og model ########################################################### -from xvla.models.processing_xvla import XVLAProcessor - -processor = XVLAProcessor.from_pretrained("/raid/jade/models/xvla-libero", num_views=2) -inputs_1 = processor([OBS[f"{OBS_IMAGES}.image"], OBS[f"{OBS_IMAGES}.image2"]], OBS["task"]) -domain_id = torch.tensor([int(3)], dtype=torch.long) -inputs.update({ - "proprio": OBS[OBS_STATE].to("cuda"), - "domain_id": domain_id.to("cuda"), -}) - -breakpoint() -for k in inputs.keys() & inputs_1.keys(): # intersection of keys - a = inputs[k] - b = inputs_1[k].to("cuda") - - print(f"\nšŸ”Ž Key: {k}") - - # Check shape - print(" shape:", a.shape, b.shape) - - # Check if close - if torch.allclose(a, b, atol=1e-5, rtol=1e-5): - print(" āœ”ļø tensors are equal (allclose)") - else: - diff = torch.abs(a - b) - print(" āŒ tensors differ") - print(" max diff:", diff.max().item()) - print(" mean diff:", diff.mean().item()) - - -model = XVLA.from_pretrained("/raid/jade/models/xvla-libero") -model.eval() -model.to("cuda") - -action = model.generate_actions(**inputs, steps=10).squeeze(0).float().cpu().numpy() -# (Pdb) inputs['input_ids'].shape -# torch.Size([1, 64]) -# (Pdb) inputs_1['input_ids'].shape -# torch.Size([1, 50]) -# (Pdb) [0, 0, :, :4, 0] -action_1 = policy.model.generate_actions(**inputs, steps=10).squeeze(0).float().cpu().numpy() - -#np all close -print(np.allclose(action, action_1, atol=1e-2, rtol=1e-2)) -print("max diff:", np.max(np.abs(action - action_1))) -print("mean diff:", np.mean(np.abs(action - action_1))) -breakpoint() \ No newline at end of file diff --git a/test_xvla.py b/test_xvla.py deleted file mode 100644 index 6b8ab182d..000000000 --- a/test_xvla.py +++ /dev/null @@ -1,37 +0,0 @@ -from lerobot.datasets.lerobot_dataset import LeRobotDatasetMetadata -from lerobot.policies.factory import make_policy, make_policy_config -import os -cfg = make_policy_config("xvla") - -dataset_id = "lerobot/svla_so101_pickplace" -# This only downloads the metadata for the dataset, ~10s of MB even for large-scale datasets -dataset_metadata = LeRobotDatasetMetadata(dataset_id) -policy = make_policy(cfg=cfg, ds_meta=dataset_metadata) - -for name, param in policy.state_dict().items(): - print(name, param.shape) - - -# now let's load in safetensors -import safetensors.torch -from huggingface_hub import snapshot_download - -cache_dir = snapshot_download(repo_id="2toINF/X-VLA-Libero", repo_type="model", cache_dir="/fsx/jade_choghari/.cache/huggingface/model") -state_dict = safetensors.torch.load_file(os.path.join(cache_dir, "model.safetensors")) -# policy.load_state_dict(state_dict) -# 3. Add "model." prefix to every key -new_state_dict = {f"model.{k}": v for k, v in state_dict.items()} -keys_to_skip = [ - "model.transformer.action_encoder.fc.weight", - "model.transformer.action_encoder.fc.bias", -] - -new_state_dict = {k: v for k, v in new_state_dict.items() if k not in keys_to_skip} -# 4. Load into your model -missing, unexpected = policy.load_state_dict(new_state_dict, strict=False) - -print("missing keys:", missing) - -print() -print("unexpected keys:", unexpected) - diff --git a/train.sh b/train.sh deleted file mode 100644 index 5b73de847..000000000 --- a/train.sh +++ /dev/null @@ -1,13 +0,0 @@ -lerobot-train \ - --dataset.repo_id=libero_dataset \ - --dataset.root=/fsx/jade_choghari/datasets/libero/ \ - --policy.type=xvla \ - --output_dir=/fsx/jade_choghari/outputs/train/xvla_libero \ - --job_name=xvla_libero \ - --policy.device=cuda \ - --policy.action_mode=franka_joint7 \ - --wandb.enable=true \ - --policy.repo_id=jadechoghari/X-VLA-Libero \ - --steps=10000 - -# # --policy.pretrained_path=/fsx/jade_choghari/.cache/huggingface/model/xvla-libero \ \ No newline at end of file diff --git a/train_multi.sh b/train_multi.sh deleted file mode 100644 index fa3668d75..000000000 --- a/train_multi.sh +++ /dev/null @@ -1,18 +0,0 @@ -accelerate launch \ - --multi_gpu \ - --num_processes=4 \ - --mixed_precision=fp16 \ - $(which lerobot-train) \ - --batch_size=32 \ - --save_freq=5000 \ - --num_workers=32 \ - --dataset.repo_id=libero_dataset \ - --dataset.root=/fsx/jade_choghari/datasets/libero/ \ - --policy.type=xvla \ - --output_dir=/fsx/jade_choghari/outputs/train/xvla_libero_multi \ - --job_name=xvla_libero \ - --policy.device=cuda \ - --policy.action_mode=franka_joint7 \ - --wandb.enable=true \ - --policy.repo_id=jadechoghari/X-VLA-Libero \ - --steps=10000 diff --git a/xvla b/xvla deleted file mode 160000 index e2f0554f8..000000000 --- a/xvla +++ /dev/null @@ -1 +0,0 @@ -Subproject commit e2f0554f8ce8ab19c678652f9c30c431a37b7bbd