From 531bffdfc41f6c55c9320c55639610859f7dcc10 Mon Sep 17 00:00:00 2001
From: lithr1 <1102340779@qq.com>
Date: Sun, 7 Apr 2024 14:30:24 +0800
Subject: [PATCH 1/3] sgmse
---
bins/sgmse/inference.py | 75 ++
bins/sgmse/preprocess.py | 53 ++
bins/sgmse/train_sgmse.py | 87 +++
config/sgmse.json | 42 ++
egs/sgmse/README.md | 99 +++
egs/sgmse/dereverberation/exp_config.json | 69 ++
egs/sgmse/dereverberation/run.sh | 97 +++
env.sh | 1 +
imgs/sgmse/diffusion_process.png | Bin 0 -> 243841 bytes
models/base/base_trainer.py | 6 +-
models/sgmse/dereverberation/__init__.py | 0
.../sgmse/dereverberation/dereverberation.py | 25 +
.../dereverberation_Trainer.py | 190 +++++
.../dereverberation_dataset.py | 107 +++
.../dereverberation_inference.py | 75 ++
modules/sgmse/__init__.py | 5 +
modules/sgmse/dcunet.py | 627 +++++++++++++++++
modules/sgmse/ncsnpp.py | 419 +++++++++++
modules/sgmse/ncsnpp_utils/layers.py | 662 ++++++++++++++++++
modules/sgmse/ncsnpp_utils/layerspp.py | 274 ++++++++
modules/sgmse/ncsnpp_utils/normalization.py | 215 ++++++
modules/sgmse/ncsnpp_utils/op/__init__.py | 2 +
modules/sgmse/ncsnpp_utils/op/fused_act.py | 97 +++
.../sgmse/ncsnpp_utils/op/fused_bias_act.cpp | 21 +
.../ncsnpp_utils/op/fused_bias_act_kernel.cu | 99 +++
modules/sgmse/ncsnpp_utils/op/upfirdn2d.cpp | 23 +
modules/sgmse/ncsnpp_utils/op/upfirdn2d.py | 200 ++++++
.../sgmse/ncsnpp_utils/op/upfirdn2d_kernel.cu | 369 ++++++++++
.../sgmse/ncsnpp_utils/up_or_down_sampling.py | 257 +++++++
modules/sgmse/ncsnpp_utils/utils.py | 189 +++++
modules/sgmse/sampling/__init__.py | 139 ++++
modules/sgmse/sampling/correctors.py | 96 +++
modules/sgmse/sampling/predictors.py | 76 ++
modules/sgmse/sdes.py | 307 ++++++++
modules/sgmse/shared.py | 123 ++++
preprocessors/wsj0reverb.py | 130 ++++
36 files changed, 5254 insertions(+), 2 deletions(-)
create mode 100644 bins/sgmse/inference.py
create mode 100644 bins/sgmse/preprocess.py
create mode 100644 bins/sgmse/train_sgmse.py
create mode 100644 config/sgmse.json
create mode 100644 egs/sgmse/README.md
create mode 100644 egs/sgmse/dereverberation/exp_config.json
create mode 100644 egs/sgmse/dereverberation/run.sh
create mode 100644 imgs/sgmse/diffusion_process.png
create mode 100644 models/sgmse/dereverberation/__init__.py
create mode 100644 models/sgmse/dereverberation/dereverberation.py
create mode 100644 models/sgmse/dereverberation/dereverberation_Trainer.py
create mode 100644 models/sgmse/dereverberation/dereverberation_dataset.py
create mode 100644 models/sgmse/dereverberation/dereverberation_inference.py
create mode 100644 modules/sgmse/__init__.py
create mode 100644 modules/sgmse/dcunet.py
create mode 100644 modules/sgmse/ncsnpp.py
create mode 100644 modules/sgmse/ncsnpp_utils/layers.py
create mode 100644 modules/sgmse/ncsnpp_utils/layerspp.py
create mode 100644 modules/sgmse/ncsnpp_utils/normalization.py
create mode 100644 modules/sgmse/ncsnpp_utils/op/__init__.py
create mode 100644 modules/sgmse/ncsnpp_utils/op/fused_act.py
create mode 100644 modules/sgmse/ncsnpp_utils/op/fused_bias_act.cpp
create mode 100644 modules/sgmse/ncsnpp_utils/op/fused_bias_act_kernel.cu
create mode 100644 modules/sgmse/ncsnpp_utils/op/upfirdn2d.cpp
create mode 100644 modules/sgmse/ncsnpp_utils/op/upfirdn2d.py
create mode 100644 modules/sgmse/ncsnpp_utils/op/upfirdn2d_kernel.cu
create mode 100644 modules/sgmse/ncsnpp_utils/up_or_down_sampling.py
create mode 100644 modules/sgmse/ncsnpp_utils/utils.py
create mode 100644 modules/sgmse/sampling/__init__.py
create mode 100644 modules/sgmse/sampling/correctors.py
create mode 100644 modules/sgmse/sampling/predictors.py
create mode 100644 modules/sgmse/sdes.py
create mode 100644 modules/sgmse/shared.py
create mode 100644 preprocessors/wsj0reverb.py
diff --git a/bins/sgmse/inference.py b/bins/sgmse/inference.py
new file mode 100644
index 00000000..9e5e2a60
--- /dev/null
+++ b/bins/sgmse/inference.py
@@ -0,0 +1,75 @@
+# Copyright (c) 2023 Amphion.
+#
+# This source code is licensed under the MIT license found in the
+# LICENSE file in the root directory of this source tree.
+
+import argparse
+from argparse import ArgumentParser
+import os
+
+from models.sgmse.dereverberation.dereverberation_inference import DereverberationInference
+from utils.util import save_config, load_model_config, load_config
+import numpy as np
+import torch
+
+
+def build_inference(args, cfg):
+ supported_inference = {
+ "dereverberation": DereverberationInference,
+ }
+
+ inference_class = supported_inference[cfg.model_type]
+ inference = inference_class(args, cfg)
+ return inference
+
+
+def build_parser():
+ parser = argparse.ArgumentParser()
+
+ parser.add_argument(
+ "--config",
+ type=str,
+ required=True,
+ help="JSON/YAML file for configurations.",
+ )
+ parser.add_argument(
+ "--checkpoint_path",
+ type=str,
+ )
+ parser.add_argument("--test_dir", type=str, required=True,
+ help='Directory containing the test data (must have subdirectory noisy/)')
+ parser.add_argument("--corrector_steps", type=int, default=1, help="Number of corrector steps")
+ parser.add_argument(
+ "--output_dir",
+ type=str,
+ default=None,
+ help="Output dir for saving generated results",
+ )
+ parser.add_argument("--snr", type=float, default=0.33, help="SNR value for (annealed) Langevin dynmaics.")
+ parser.add_argument("--N", type=int, default=50, help="Number of reverse steps")
+ parser.add_argument("--local_rank", default=0, type=int)
+ return parser
+
+
+def main():
+ # Parse arguments
+ args = build_parser().parse_args()
+ # args, infer_type = formulate_parser(args)
+
+ # Parse config
+ cfg = load_config(args.config)
+ if torch.cuda.is_available():
+ args.local_rank = torch.device("cuda")
+ else:
+ args.local_rank = torch.device("cpu")
+ print("args: ", args)
+
+ # Build inference
+ inferencer = build_inference(args, cfg)
+
+ # Run inference
+ inferencer.inference()
+
+
+if __name__ == "__main__":
+ main()
diff --git a/bins/sgmse/preprocess.py b/bins/sgmse/preprocess.py
new file mode 100644
index 00000000..22e1e860
--- /dev/null
+++ b/bins/sgmse/preprocess.py
@@ -0,0 +1,53 @@
+# Copyright (c) 2023 Amphion.
+#
+# This source code is licensed under the MIT license found in the
+# LICENSE file in the root directory of this source tree.
+
+import faulthandler
+
+faulthandler.enable()
+import os
+import argparse
+import json
+from multiprocessing import cpu_count
+from utils.util import load_config
+from preprocessors.processor import preprocess_dataset
+
+
+def preprocess(cfg):
+ """Proprocess raw data of single or multiple datasets (in cfg.dataset)
+
+ Args:
+ cfg (dict): dictionary that stores configurations
+ """
+ # Specify the output root path to save the processed data
+ output_path = cfg.preprocess.processed_dir
+ os.makedirs(output_path, exist_ok=True)
+
+ ## Split train and test sets
+ for dataset in cfg.dataset:
+ print("Preprocess {}...".format(dataset))
+
+ preprocess_dataset(
+ dataset,
+ cfg.dataset_path[dataset],
+ output_path,
+ cfg.preprocess,
+ cfg.task_type,
+ is_custom_dataset=dataset in cfg.use_custom_dataset,
+ )
+
+
+def main():
+ parser = argparse.ArgumentParser()
+ parser.add_argument(
+ "--config", default="config.json", help="json files for configurations."
+ )
+ parser.add_argument("--num_workers", type=int, default=int(cpu_count()))
+ args = parser.parse_args()
+ cfg = load_config(args.config)
+ preprocess(cfg)
+
+
+if __name__ == "__main__":
+ main()
diff --git a/bins/sgmse/train_sgmse.py b/bins/sgmse/train_sgmse.py
new file mode 100644
index 00000000..11a7a004
--- /dev/null
+++ b/bins/sgmse/train_sgmse.py
@@ -0,0 +1,87 @@
+# Copyright (c) 2023 Amphion.
+#
+# This source code is licensed under the MIT license found in the
+# LICENSE file in the root directory of this source tree.
+
+import argparse
+import os
+import torch
+from models.sgmse.dereverberation.dereverberation_Trainer import DereverberationTrainer
+
+from utils.util import load_config
+
+
+def build_trainer(args, cfg):
+ supported_trainer = {
+ "dereverberation": DereverberationTrainer,
+ }
+
+ trainer_class = supported_trainer[cfg.model_type]
+ trainer = trainer_class(args, cfg)
+ return trainer
+
+
+def cuda_relevant(deterministic=False):
+ torch.cuda.empty_cache()
+ # TF32 on Ampere and above
+ torch.backends.cuda.matmul.allow_tf32 = True
+ torch.backends.cudnn.enabled = True
+ torch.backends.cudnn.allow_tf32 = True
+ # Deterministic
+ torch.backends.cudnn.deterministic = deterministic
+ torch.backends.cudnn.benchmark = not deterministic
+ torch.use_deterministic_algorithms(deterministic)
+
+
+def main():
+ parser = argparse.ArgumentParser()
+ parser.add_argument(
+ "--config",
+ default="config.json",
+ help="json files for configurations.",
+ required=True,
+ )
+ parser.add_argument(
+ "--num_workers", type=int, default=4, help="Number of dataloader workers."
+ )
+ parser.add_argument(
+ "--exp_name",
+ type=str,
+ default="exp_name",
+ help="A specific name to note the experiment",
+ required=True,
+ )
+ parser.add_argument(
+ "--log_level", default="warning", help="logging level (debug, info, warning)"
+ )
+ parser.add_argument("--stdout_interval", default=5, type=int)
+ parser.add_argument("--local_rank", default=0, type=int)
+ args = parser.parse_args()
+ cfg = load_config(args.config)
+ cfg.exp_name = args.exp_name
+ args.log_dir = os.path.join(cfg.log_dir, args.exp_name)
+ os.makedirs(args.log_dir, exist_ok=True)
+ # Data Augmentation
+ if cfg.preprocess.data_augment:
+ new_datasets_list = []
+ for dataset in cfg.preprocess.data_augment:
+ new_datasets = [
+ # f"{dataset}_pitch_shift",
+ # f"{dataset}_formant_shift",
+ f"{dataset}_equalizer",
+ f"{dataset}_time_stretch",
+ ]
+ new_datasets_list.extend(new_datasets)
+ cfg.dataset.extend(new_datasets_list)
+
+ # CUDA settings
+ cuda_relevant()
+
+ # Build trainer
+ trainer = build_trainer(args, cfg)
+
+ trainer.train()
+
+
+if __name__ == "__main__":
+ main()
diff --git a/config/sgmse.json b/config/sgmse.json
new file mode 100644
index 00000000..000eb3ab
--- /dev/null
+++ b/config/sgmse.json
@@ -0,0 +1,42 @@
+{
+ "base_config": "config/base.json",
+ "dataset": [
+ "wsj0reverb"
+ ],
+ "task_type": "sgmse",
+ "preprocess": {
+ "dummy": false,
+ "num_frames":256,
+ "normalize": "noisy",
+ "hop_length": 128,
+ "n_fft": 510,
+ "spec_abs_exponent": 0.5,
+ "spec_factor": 0.15,
+ "use_spkid": false,
+ "use_uv": false,
+ "use_frame_pitch": false,
+ "use_phone_pitch": false,
+ "use_frame_energy": false,
+ "use_phone_energy": false,
+ "use_mel": false,
+ "use_audio": false,
+ "use_label": false,
+ "use_one_hot": false
+ },
+ "model": {
+ "sgmse": {
+ "backbone": "ncsnpp",
+ "sde": "ouve",
+
+ "gpus": 1
+ }
+ },
+ "train": {
+ "batch_size": 8,
+ "lr": 1e-4,
+ "ema_decay": 0.999,
+ "t_eps": 3e-2,
+ "num_eval_files": 20
+ }
+
+}
\ No newline at end of file
diff --git a/egs/sgmse/README.md b/egs/sgmse/README.md
new file mode 100644
index 00000000..ed46552a
--- /dev/null
+++ b/egs/sgmse/README.md
@@ -0,0 +1,99 @@
+# Amphion Speech Enhancement and Dereverberation with Diffusion-based Generative Models Recipe
+
+
+
+
EDBi1NJ+6YpU z3kPRV3Q;VJT4>alAfW_1>so}V# zF^DG=x>T(UBAB6U9RIl~v&+t_k@xd7Ygp19n`sMoR7FP7fx#w%*UejO=8Fus+7D1< z7*IbJB 59VIMHN+X*~ zWk%=TX4kq(av)qw0S9zy`d7z6I@SR?)=2;GW5Jmn{O*O#E!!Y+w6AwNl{T1v2HfSs zFFpFaV|Q)qevy8>%Y{fZlZ1eOZZ!fzHnGBm6j6F(b$6_|D*sX29^E1=B(u@;dzTes zwYa$Pc6)@6S_s-K*qn*sz|E@)5M|*zkwZ!cqshi&2<+OhHdR?h8*kIvqs42i3PqPf zO#E0pe-iQq`hEmy8$HCHKf7NE3XG0VgsJE7^QfQX49p3LO+qu=%#w-yy0 zDMqyZynN<2a9kI;79{N%4cHoy>%DHmT^|&7Z$+*C8oQmRk^I)GR&c_)xE{OP;sLK* z4FBow`^lPt9hW+JJ<0kC+9p+(k>Y2b1b0P;rZt6=QJ8>F8rVoQb0kN@-DNs`QC3sGxo zcc!38+!!~SLgXj~Bdx7*M|rd@qT(sjCE4^#TxgP8qa n*h&KGq z6QX%kvTmBT2>z~Zhwd_%P;cNY8mSa2KKc?0X27-2xs%dxs_Vh@+3wVQO(O!4f<{L^ z!Yh|tEYC8v$RY7yLO)cWeM_}@Fc7`ulMY!jGI#=43F9=q1mlkwV0HaiJ}XZ po$n%^`pVe~xAg_(*av7emF=z0U1j!wTtGBF!Po?a) z$^l|~!^sr8kXbmvEKClzDQ#({pg2v414}uE&uL{qof97kpR$da!GVB#y{iuGhZSsi zR6b%qU(~x~+F+x3NZR?eWivv|;M2>clIarK`LQ zO?+uhLO}3`N}mLMiEE%ovaytnfsm~f*Q6xFP=((_&{z=KU{a5ZpOK<&ELaFB_U_5} z0GSfhtL7V{k|3OE_8^NkFNz{Gs&v94^I54%(AV4)%unc0NyC*(EeoHfBG@Q+q8M!& zXMpyc3LiKRGEw~j`aF)`TXj_S0i+X)?ok$nZ-NqvIN~TPD #n8w=@xV#J_kQ093o6ctw^km+)9|3$`WB5VSD)| zTN~^Wq QgR0_@o2Z^Cd_I$>UPSD| zLei^jZ|T_P!ssk-^knuA2@;dUwl{ *YGWKQQM|SkTLN-KF+*LUQgbl`2+s0+1DXHWuW61c4=rn9q3MTo~L_%i- zd5h#B^8V FTJCn1(M zhJ;(}jD>Gwh$QDEnq?O<{`ASe0xhpFKoY)|h eR5|8GM8n z5?a=bm>ulResp^z PRPr dMo`f}B9rp{ zE&Liuz@|@Qowvt2t7KHTK^Y*&A_>`19CuK2?cQXXr3=Y-C8$`*K`pzql~1rO@}T61 zfwi1Bj<#Y lL78E*lD=jKlq X;m+NE? z5so^0qger5B_v^Jh-o~Ru~fm$8sbJI(RN{{rm_F?A#MiEqCQ^A`tdJPf^y10A99h! z7(-m7-ejXzTvhc-YP889JRgzhxsSaRKPJyrZ<=Dbm8-BHTX%9PK7sSp%i4gHMO?Wg zOVPwQG^~6o_=v!31E|BJ_G?&Pwf_8|+H;-Wo<3G>=Taau61Rt7^;n4gRSF>ub;H3j zth92&JZ^-RrR1(*a-mDr(_YHY7?2kr&Ny{4sy362@7Yk?xcAwV@TSSfmE@pKQ^?hf zW){yjA{Sj8O7pX{iu(kOY&c1|{m=r7_9|@S<=fmsY)zw@?Su8K0ke#|Dw@01H?j~2 z7hyTme9U2fM#S&v&Iz57{0Y=PAI5XApY(B9v`h0B;zMM`YG`Oc5xP}d7ZPf+Ad)Jm zdAS=mLVlMF?bX2x6V+;DeavANnAM<^cEI%! < z @`G0nxx !^>rUbokD=9`xMj5e5W)*F7PwFJtgg;;;5kr2H$R%? GxBz;!4{BP$>1M+z3t~3Y-@5n_*J|}z!9BIyrKPJ9rGi2paN7dQQn&QY)$5w zV#)@34Q(UjlJ>oYD|6I_(p$%Bpw<0tL)C4=^CiMp$%g(%P#LTkcEHhZskw(4nPM33 zIsu||Y{D-SIDPIXU>B5`0s{(ZIWgS@P{F- 5b za{B-TG%Z{0`6j=A7zhKW{?f-!Z(B=Oe(^XK5*ii74Ix;+hZ#=Y@1P@-k<5IXlu|H^ zVnQv)PiXi99*)KVbk^ab0+;@7`Zhnm1m0X25_Gf5FGTY`QYtK{EpHMOHa*iSfuXQ0 z_IyJ@3^PtV7Shy%pa(5ALK<*EkqDNPiE4rDMQhO@_}nk@{4ArNQwu5o#QlM#&lVWb z>PGe L}6SMM1%~Z0_jvuKRDPwPty%bLiML9oJwXnK_n^u zPSXDa %GDP&D<3S(n zr&O3Tv-1%7-A}&Plipv&B$ZrP=zfuksy2#9RjCShtLJJ`&d`-3tJmzM5as8Q 5VPZ+vXxpIaorXGns4O{1z)w<8! u^JJA~{hO z&8>myFm{zviC(f#MAYO9E 3IY=hG6@)UWO?Ac2zT{Tm6s8TWd@6` z^;vnLcm+wj>$vLe9Dfdj$qM;5I`5WNhQ)1nAN4Mm!T;~O0DYhN=^!k`V8gc!@?2WY z9&f%fol7te_neookq3Tyx#9h&4TIhykWVxpzT^49A Dw`~*QLa_nS{uKU?Mxt zb*x +>d(>UZ%gpLuRqK3m{#?ag zgAO4xwBS@pADnoKTwX-3mrH!uJ0l}DeNFnlRxo?rOW6K4(}-(j^~(}%wG*yU=iS}R zp8S*Shk9Xs@MxZ7V-;oGnw__IT}PB3#xCMGdAUosy+T&6WxYxT&i2WLe;3=ad_&ox zO8^FHI8&f|c(7GcCFxuJuJrkjBPOrQrmbC;DwB^W92;vt>{6ZF+eRK{1^b!qzZqjC z{YWF)H~KYRL2@h<4dX0BQl1F8_W29}xkct`IX*iSxg!D m>rx7u_? zqehM>1-h$cvk^hO@59KE4e3=#t*mF^6|5t)qvy*%uPkJ4EJB@c&n3UyT0F15c(@h+ zJ#|>mXN|WiJ!h`h&A6&e1Z(ZOYhRNZhBXVMC_<|K^oQP6*VLtty8tKPcJEKjGP^F} z4*o%V0vi}tA<{EruvV4Jv=t>x?!*^YLsle_n?3eRvHpny&D 2DT_Z%K% zD`+?Qae?)%rZ;L2ujl>KuD*`e)_bjr$5-jML!RsVjt4Zgeb^cL H17h+_R7R63WXh0x{py%8BRysl<^&{3CXVe8m1M7l6%8F7T7vWa`^!j4DTY*O zO+!V%5oKWMH$YAo1Gz9%v1ON5%(|x#0{60q7^(4ebfLnCf?VWGl%|b=V|y1;q)U#C zyJGGx`g9RI12JNkcEl9uf&&6WHReE1@OYePnd%7>J!BI$gd}jO=8ie0V2X}+85(j2L5FQsqZ{nk6ATzAY0KwgCh}AH2D^fIcc(%UfGF(#o zgiF1 Ws~ -cK7V;yEp^q9Hda(Cb s`%K GrupC*zz0#5?!Kd3x-W%uq=tIx0lPoJuVLL7=L5vnp$2v4bvEew= zG(jP4OWS#zmsHMB1 j;^z8UBW2I#476G zn7M0~tpVY=TSDb6xl#;F;L15(RuLm4UG&_|4QJzym$m0*x8kFb @|`F#$@9VMDSJ?R+R$j}CY zQVfQIM>EGdY+3j%A5R6fw_MbM`-6xQfhK6aJ8f8Zn%}J(mK~JRkZa9k1WnQ$$v~zc z$_hz8@KHjNtKNeCopHx!D` e>3xRen1rx zJ{n|_Y;(z9{5mHa2o4`8o^1`Qjo_m3{PX6LXLZM)Ka6DB5rZI;f`@~aS)+*v8lTuX ziBAC&JRg6kcrk;@_1NjWbhsdSy6ef$or`oa^1*-mect==eW1_L`U4>7ZGiN)9`v;= z;Pv+Wf#1I=W$0gx-?H7e$tZfgs}S;)=JyqdOz{;+e8c><2Z>5(tS$)A5vAV8o@Kq^ z>;_D}B3Ji7H-$YreWR_7uYh)MM0<~zCaYhI^H> 3rZG4A;6Ef$;nwT7|9^F&KkzzOT`gChwj%mGRoGUe#}mQo#1#RbdM zlBp6GYot;HU!hWlR(b#2;1N>x?MZ==KEsNVKua4|gcPu9h!hr^My%aSM)@h3C}~4Y z7k3~dI%TM&@u8-2Gh&M5X3S8X5b#9lsnd?NyFf^R)CbgQwU>?zky=xv$=+nQrHgA4 zjwY>0B64p2h#&*k;Y);&WO9m&4Iz3emOYM7j!X~Hrl56OVr-eaC$wRW(h8|El4}9O zs{Xo9!m!6o)jb?7LQ5PqK?JlgbX16>i9YVHXGAV1xRmHpLyn;ij>~QX$ukg#l=g&1 zY{*nX#}f|BgiHSdMUJ7wn2r=PR$)ae>YkkxkwRuzF`!Kjoiqx~X?B-!I^il@G1Z5R zwM3 $st1(HGUkw_-(sa=8yZ$&jbp@!5~Bkm3{XTa>WU;4GD4v> zJ_SbNkab)kM1cwg6>APv$u3sRc|jE$>bRjaC!A*Iq@-wL!!9haBIi^evvil-FHh)1 zPL~=?DwxPqlsX|v2^iMyg3^q+qaU)CE84i@P@b_%Rj*f;0}6GYOe!w?HJh*_7YCfE zGcutOvY?GSwxK1b*bmAqr^Q3+5J+g|{(=K}mnwLMreuw0E3PRh8LC6(e# 3jI3*v1VmK@$VfM|^_M{WF%`9ipsR`!%^SbV=Y- z#t|p9z t4H zC>~} 3R5Sec$y!%nk zqgwFQ;(}lPJmX>6aGnKPXUPX!cI%9x7UU}OexWI~XRacT-Ht<3GPRoHX+staAK1Wk zYxqAuJ>a9U eBu^@~t*Xgs`O4A;b+>y*bwn@V^1J@l~68 zuzUlI_k(~}m;E+q{Wb~8w+%*a%N@RrF@C*$p(hmju#a|%o=tbbEIdZ*KEADs6+?Zp z2cspWIzgczK@q2Hx$fs1l<5-(Vn2vcQWK&hGb4QLX#5%_ER*a3bzD&SYn0Fo^bsKi zw8}^+(1;BJ#n2qmge6_5kV2E`f-Y{5N}=~rXSJV`>k(2|l1yyE)jk {lltj4B?>~Sh%pd^ql!zq)SzO8r$wL;QsU_u{U97j zux5yk8AE$Y73Wxyp@gMkP8TaC>KuV4;&5?`h^aRPlHo){ zj)9gOW_8CfN6nczAvEn5@ zv`8tja)6PRm;!BT@Ki(*$jt;L6jEAz>~pDI3i#fCPDp`myk?@#h~BXh4TtG2B56kA zfQ{c_g{JY27&|gC+)t}I-m~WbxF9*v5}zEUA0b13e=||C3xSv#j&(*R$E@Rqkvb!| zj)oOlyn{_s8rg8HCtUiDni-Y}m0yu$LPtZzHD~HRMky}SbCOJil#?^Shkzhar~xVN zS%2x7`xk7xIVa{_slc`8!{znQ%#DAb@HHEMmpm~v&4y(i9V)E4F_4t=k;@p7&8 1AyD+n EuQ$dJO2G3e7MsF?W$g%~gqV >n> z-)uRwmiH%$%Uu9pa%ZYJA4q<)id?i6yRPJNm$+^n6H{_lB<5}6y6wo*fSnHrVHg-m z6B7 oncwE)A(Xwh2KRwh)?fB1MCrWMjs%m&v*A!wvD>HsM zk0d;e7d$8pW1V 8a=UFD30t z@}4|n-G2+yc7orpBUKkTE(Dp M!I2P5OyuWR86Tf^6w=dl zIg5}pu^#V-T(^!te@}5*M4r6JD5B@ZBIj-y_>bSe;`2qpUq2pmoCQ7@cl`MWTmH+V zA-|nx+#N(DlB$FEi^OLOuu?J7iLdJ&N4DgmN__Xo^6%~*@sF35=WWCJK#&Q~ oh#kRi5_})I|x9tymx7e+9H>++6V7zWmA|aK=$ezhj zLZf9x)vfmCv-rkgUTcbPX>D)!jp$_)ua`HO>l-$@mqFzFW~Ls16X??-`o8P+zr741 zMu(INA+lZu@hU~4-~Uw$QrdUljqxqs0>a`}555VWzj<%oUcQal|F+-v>^KP@Tb?(M z39)BIrH~xu_YoqeP8&pkBqAX-xES%NVW>_SrbB#c*v2g(IIJuf>N6VFblnaa6frqU zd%!>+(&rdtSef^%J(3U`5WP0HahtyQg=nc=FH;z0ClvaCotrU`8Cvu}EyO-uBSc5= zo-#k6Zs! ^ZqcX{rrJ|0Hir(=U5CyKz%U8Buiq)>fAMM&g&KpQsr zBpBKwT-?wF&)D3f6BWDe8Z9%t>nO~WI?NENPr)tZ6fG2z9yBT}wOjRi>C`8fME1ox zXvi2M3}~_4KP#S?96@-hINO^KBT1%So|AweaIx2FM?5hFN^wA@hg5Mv7q`8vA?$FW z!i5T}%RcoYX)-Znqb~5F `a z2^N7%p7VT4N{O9!EYgB4TXJE!4ofmd9O@Gal~V}Ik(sg$HFICH@M|mu5A63@rxi*j zLX3>W0R<&mC^n%VgoNmcbQI#0E^QghAyZB<2$pfifx1VXc3gxfH0hWmz*5kp3Y9eT zHj<)2%bb;1l4H4a&*;n%F-WW|IZ9`=VoWA2E8o)KY0?%UC0ga2ns*p!gN~7{A8^&p z$yA?^VnjkSprWFoqmVg;9JA^cEc_Gx)%eGlRC3krsAGrsFcC+9q!b0{gc6!roa0lC zP6LGYT(~(qzXRZIDOicfymfpu&RK=X(6m%Ra3GI4A7?DPNJ++nf#Bf*2$gs`3#>!S z(<( r}gYQg*YJw`@R`9N=Ejoc{=FRIAY2r3^q$UINChT1_BB4^fclttE^V%ADb zh!iq%*>>E?Ejy)AGO`OTAzAL0hOg@tm(DS+HSZTg4l+UPzXJH9L(j6YtX=;s{p1La zvyR`cC2cfJR7su;5k(>4(PoYinoBn$!y>)puAT5`>sWis`2Y}#LPaVU@qoth{-opm zBgtPsReZjJkOV`Om^)AH6F;4nBuaj>bWE(lO2NiiG>Y>QmR;n!akO3%Riwkyd3fGz zxNZ$y4BR&b_e#q@trs9lJ{W4oR#BS3*R`Vyk;-{?G!#(~#Q+GL=7xbW6k6eu;kto? zEb+&Ol1J+ii%xNv1uh%-a@%JImqzf#&aw$x##)h!jAevf9r?2}Pp%SAYRSe&23j&( zB>rM%8R$Mr?=Ta*KME{6!DpMuRRbRkp-COv5cs$dJl!hp79N3M)j{P9?+z0ebz<2` z&dR{bB_3Zz+MOhqP#PF(&4+h7r1yOO(vni*lV!vu%_Qp!KMA2wqGRm?U4X2Oh!m-U z;L$3Osl;{(AB-eRA34txBhz~&hNfqL2Qs1Y{NxDE>H(2JrXs&vNNTURGi>?6Sz_S^ zT-JhLZ&oyF#Pd4iei3Ore6~`M5+QZ`;-%#zhk0EPQ)J$1HrF{PSw|)nPb$mr*PaJu zZ!xR9WST{Yg0YS$6 #Cw;7g *Io@r$n`X_=F&z@qUCOeB(6cCYb_{x*Q~&DZ{GGKOyhOm6~Iu@??} z6MDUUo*Qt@Td#{(;4h`bO|>>s1d;ZKNxZIj)*s8Nf>Ixm5_D?Yn|f|Avrzl!vD-^8 zDR@&xuxEH)#jJ@}*K>1iZ$^^QS30}dkDDY1MM~loD1IGvcEc2>eS$>VZ*v2}_x v?`H8QZQy<#?+~%O`AOvT4LphAt$tH+ZWDIhbYy*S-q?2O>YAh z-Pah|v&Jzbq6)ZFGtuYx OH1pwsFY!BL5iMC59#xhbsq~T=_|HT(}flzC4veg z3$|TFQi550!NNbK@+(H!Azf-2h$D7xPHx9kaZVC}NMi2RI67347-86@1y%|gx4`Km zN~_p~4Q-cUFx0W7O*KP~Q9^TQPgulj#&W`C_mV?(kFz3Yl7_5fy`P_PSY dj2vgjbRLARh#VnsWK!~?TQk*D7XFGXNsjFS&$=aZzvNg=d)<1-saOz`XWrF> z6ll_lwclcuU?>VkW{i`9 fd-?;`=@Ki3MClPE4znRX zz{Xd!cm{IJ%B|S=Ifum|V>x2(C0(qk<7#ihG@t}hYP6Ir-IkaBDIJcHJf=&Yi5ycf zp^6 6&F5vL5b;?O9BAM?yTK}tbJU(7}&Ma!HsqgaF$ zYd-_vaeK|nrb1iCB$NDZ=D6&x`PT=>oaCBJXr{*T56cCEtYEdxxo#mQ!M!qP-b8BO zuuB_eFZ&sUX>M3{J!AA>013@i?Kv+7%<9C>ckEitqNy3^f}xW9 bjypE7a2=~I;z;be{eUthwmx#%c|IBo-YE@# zvsj{pVxZToeTkMiLp5MxG?M;3*cXdXOpRdcBCD?DUmaO48buowH!1n(;?t%Zv4h zmGiV>!}rT0zN%U#Rx>t&%SMvxnkW(jZP~a;E)Ave{CW}bc)ouSF`I(H9m{zkc=Tn& zr7@Af*WHX~ts@gh+|5h6U}$3hefsq_k;y)WOzV!eYY6OkI5^^Ivtgiyd_OsiNK{_( zqE;Lh9o7aKmK@6?3ga+c;;L<#lo2fqFKUg8j*Zuh3=A~f9|x9Q 7X>Mg zoECxOLF6nK?40DK>L|Tp;uJsr(*gdg6^n&p;T JkT?(b%gA_Cv)E TZ$jNS_r8$;{GpuRw_m%}rUW k<*PenZu*dl`XHkOV@6JpleD(0lWm-fG7;+V`4)O(_v+_w4R#4f73P zf1Sr0_CQ|kndlC<$^4CP^j;$NS;XvR5N|N&Z{Mri_ww7A-f!Ff+kXG1B*rqr$BLa_ zkclBykFlv_<)5*L*T|$u`>}`(IhLZ2A`=dgH0yNHOC}O@VoQpG=pu>GOB674p~9yY zFIu$9@u8(KN0j=AZMy7>JqSrIM@S5_?r|#S9smF!07*naR4b&CeG!QmspEn^`_}Y{ z1XN7)8BR1v6j>S*l*7fE5Ic6Pdr5^kM9YjIJdfJH=gi(`8@5Q%7s}WP-^XvI9Wi+{ zB?5s_1tB=*=@KCXt=m$_1GLaIVS~~+1w$+uMrTxEPALyrcF*v>W-RZrOIsRt`=S*! zxfwH12N+6}G_3p!Qiv3C!iJVEZs<}?6b&iDpg5y-JH&oAKnaBw2CXz>bIdL+DMb%D zgi;t?(6}|EZeJ=CJPoDUPd#@%BQ7MQ=y9}IT~g=?D=vu1VN8LJ6;_l)0g|2xX#5hZ zheRR<+ZQ~Mpy*5B-nZ{C5M!o#KovWlZl2ME9TRiLR2|`Pbg88hD>Rx+DoQjyMKU>L z!-91k8LJ6}(x`Aot~4VZA&sbAMV%HDa)3)6+tzc>-s3@WmqpjI^c{^4%)<*ZhFD65 zR$^1mRNdh^ydck})M-cSEr({p($7%)XG+NlO^BT9dswM3GLZtTe1nfI4vkEa K1Y jHS#*}J sI2W603bu}KY0YM9C)Ni?|R7{~*Hfkk{tBTK5-5tE>$LCD0RI;Bg2 zZCX;tjsYXa@-FLmMMgm+v589pc@I*R1vDmR)TuYs5hXMCoJQpkEJi7$5RAl_MG_QZ z#5yievSlELEaQq?9C6)5hVqbsJ_2A9Jb}o2#fVHN4ot}|!ch_FX!vqva8YnvY`L2s z^0ew`qT?j*^^&7O;`7~>KOK$8q~bU0HI>(#Sb>p&Om *x`9tlCkzk^^Hn8zgoe%r~0#_85b}YRSxbtgdMjWHNFu zJLGQRXi~$^=NsM|PIx%Vk=r5P8EIy%;Ma2vYRA|r4y@p+9dd5_&-aZBeBI2j3^~uI zTsLr9Za5vcRDQrj4%oPaixML;I??jUxf>uzWm8{B9{2XOcEVX074g!1K%1 zjNdGdIL-{q7m4c>80f@*c;NWwr6=FrW# iSfl0X74@}NVLz5al%p1O1!!#SQ z> 591_~owUkALVndS?0T>qDMw`r=gY>d2#I&dO;r1tZhP z-+g=_csNKrUs}GnC@GC25J=HrWk&$=((!JBVJ%sC$J%9F#RY$IQu5WjM5)9F=WCvS zHsGr3XmGq&4Y{a#Q?!*GAt@F Ys{BXeIU-c1@2j=({mbn#m_Addu8?gHJdU@-we+g*4DSfyp6p_AxdEeFt ze;XjX(J0*LZNH7}?0>Y%dZ$0oh7DD>Bt+jcu86)OTkJ<&w`CY_N(bIN|C?7BU$-c| zW=wk~_eP(a_Kfwd>q-HH+Oxc2AC=a-*l#oC{nj_v*QZeQ=@R|aa{u>DIp?_V&u_bb zf9T%azM^j%^t{aqLzj9ZQEtbi7!eMvE}4q^?9vQm&%$MD&;v$4BU59n81G9FE2?h3 zFCw9F^pRXseV-yt*mB(iWg;Va2GWpc6T)6UoA$*#tQisoRLwPo9;4(w)(o>}>7nv{ zb*aLRAPI~Z5b$6W4LbxdvFG?$k??e>Ata9`qqI|Yu|vvUrzp`>Zidw*xg1f46;>4p zdME!jT%oi;i;_ UT#PhsfmJz$ zKEuVmp)5tJxS-^KCamZ}MIpxf;w=5lfmVvjRTO$e6E_s*urK!EULuXeh~9MQV$%;0 zlEkNqp*o|WppJe1@5Wy+u!n@$5b?NBGg4E0tjX1oIxI*ck*N`x9pYq*LKA?(jF7_6 z`1L+Itw1V`PZe5PN}Y4zE;yE&ZK^2JfCu(H0)e5<80w6r-!iLL7)I1-MaPh1c}ATo zTG3I(B_nx+N}7r-tw?lHk-7nOYAM8|XWx@S35}78g`X3)ASJZ1<08I5Aj#E$136*S zRXA1%G=(^1-9d*!ri_j2@F;enkLxQ%!Bm|xu?B(Xt7c0^Mjc%5ZcmOZWwcltR$R6_ zCY)i_n5nqO+Rt#JSI%DgYj!L-k$2Ha5-4y!XQXpF8jQ5$!tk5zXE++}*aIwvb((V| zAFvX03 ;KqjZLgTb6!~mwo1Irt vsu3v)q}o!64I(KdiY+rHVnn74^}br(lrcUAo~1d#)g;*)dB>bkhXr1g z7*S$mL6$5owRCbHK%WdRYKKmeWvjW9MgCz`@&7#2v~fo%BDu2MFCLPj;JnCjA;U#@ zy7e6Ak{rwD>wpo0QXQg&VA=M7>d{*8;Y9JBLBWwW#FTinmiQ=nC%Z@E9qUFiRj}*? z1rvUFps2$D1)L8fpDi;Ujy+HQKhoa(M~>{y_WRr|)?8~ZF5PVQrj|6LnWynAezsxw z`G>Iq|KR`BfMFOg1~8sS4<5}TP3uW&sTY#XrO4W{a*2%XZvG*v$Rb6}`@umFnU!%P zGHyg>#<}O7?>SqAz_BM3tq)97K_UgI+TkFx{IZSQ&vJ}Ve6t266LwS0x0{|%%Y@x5 z^5vz+MTe1shsB7c75wW}M;FgIPVaHAh`eYb2tz4zjEpD|`TYt$j}s( zWW>abd0KZQB!nOsCz|~t@^mBE^ns5ik~0Er815sVkEX v!e*#<6qg$N@O6c=tt i=@V6JCW7GBkndu7T< z_msx)+~(XFTapCMD$VJ}pvB;We6QGL>jeLD?wKTTFM}$D( V5Wm@}0fl9pZw z(&LOpm(mAM=LE#TQm_z)FQ%TKpXa37^TT;fA|t=MEcpBLikZ&&p$eQ^MePM&%q_3l z8PC3V#9p%Q6~|@IqALjAb3C$8OSV1imOXdJ5WJvX3N}l{Wi#CG@8^=Gm9$au^<`kT z8IdZFi;~V7&ijV_Jf$S^SNk z{NovH+#nPBAj^k>x5RL9s<><= zg>?LIs<~_xBlZ|8us)(CG)>M$WBBSSQmDvrX7KTd#(VZs&+ji2jL>{G3w%1S`Q{?! zA1*u(#|b~08SbQ!RWH#B?iQART}=3(h>UdPS)+MSUI%kb1KVJDc9QXO=}3g)gOM8U z+a~hsE6K*D>=y#ntjXJiJ_J74@0sYx$0A~V!lPgHbY2poq|k3v1^SPJqTAr;UGVfS zqx&vn{4R@pd(#^|@W0XK7Jz-9gyN=&xCYQ~lHG1?f*{05XRB)&L%^t%-fan?zh-|m zG4v2`1N)n2HyYzN`r6k_^IOMv`?#+Ej$x1`2z|Zw+V3|G_GY}L4ZbO0d;7e_>r*A- z@MH7FB2BzL-W%Juw>$n{0=w@X?|-SSc (NT39Z?s3mddbF?x&>o+RdUaj-61_b+jxCs*S^ zqstnM7;eJCpd~~B(F<}tp|wNtS|rfMHEEcVsxg&6rSn^SuuRMWA_$@o*Pf>>ZCFz# zJEY_+`xgi$NaTp#HwYo|ShoEVlV!AFiy =+|G zV>xE+mvnB;s^4IAhD;1br;ODBMwN7NeQoD9ShFQEqYgvNv5pC~UlE*Vn%@~dWx*4I zMMQ}Z5rrXyp0#~N8cR@;Qtn}6%~an(1;tf-L2Fl}(qn|i#x1EXaG|5I8;r_Gbb*Z< zTDPS%Q!MFqvR%SN91_Iv{Zi3z<(3r5;2nJPoiQS(5T31Dpv9aJBUQMfr)DC@BqGC! zj ZS}bs}XHV~w#4$p8&f61=Dk+&$#T9MXk}zQ=4(LV4 zT o23M;fs>7u0+lWVY6<0w!l`e0e|lCj*u3p?o5MNb+_5}DJmWLF&^@k~`h z)q8^M>0*lyf>aokwz$|Z6Jw_G5LC}I+fi|eWB}rGy+bAx=XOa5VvwlBiaz#40e!TX zpvY806ME{{flwq;^TIu)6hml=(T37b2sp0X8biT0uF2(?PHef1J((}jWY #R*sDKCxEhC7?ZZ6sQEuTybe}7r=gGtH |1ZQz;u4xRVQ-1p1)ZvgO+*GLd7p&XJiZ z2u~D}g{#?>b5MhK>3JJi^@3NmVqz5gS>&V+Xz6Ku;8|_yeB^_2m;nmWv6opc>Wqls zv>vAC#|B>Ymck6frAJ%K!aBT{{QA=K@!YXjSpIcYT@Qx$a8Y4Y;Hq!QbdC_P>>XVY z>?T7@^E?TZ+9QNwZ9Tu;JjY1EPo{I8w`;D>43#xl8oDU)F}-$48vJ_4#?ZJ(?E gCyfHEtu#LA;SHUWjA-6*}*DKA^3W2I38P8{V-QNGl9b*@Zr?6 z^H5Mf_H=fTRR|(BIJUjvU%sERn+E3Nj+dR{$z{X{O=%p3POwo@TTky4yYq^NQ^7^Z z_;xksVPV-zBQAOpCHT#`CRc)odp(<8@n9;bD#^%rKHKS#Lhx)0FKWZ_#G*vt!nQP( z 5bW@G}DO*kw( z=bd6UI2O`**t*D<%NijDOF%}E`QDZ U~xJw{^I;G^l@|AAKKdc(dl+b? b19>Yzm z_sL$~E{HVJkWe6zAPgoc=|W9yuP`bhkt0kj2{O>TivF7Q8Kt|Zn9%w)Avk)wMM%Xc zIi$9i_~>wS*wE7ZhD2p}-Q$F%cQsN(Y-}(T2rud4ka(7v5hJ-v%Nm4727^&4MwKKY z9}NAYMhHzGYeI #oRjNvWo6 z?InpCF;P2oeocsxlrf#G@U|a(e&v{v+NWVfsb*N;5%Fx|z)lAj2*G1yM!_6U&&r?R z!x|$Kl2}r+AW=C)$+A6RobF>(L9TXip{Ms-QZ*q}6EHAS2Y4B2SmUVSx-TL^7dF=+ z28vV^?5O)}{5b-_RPJ-?o($j4=ou$Rq;ka8T~O*dO6EianVu0uz=kc}OIo)^3QfTj z7dl$EVq%UlYOvVKMaI4y^U?>bi 8>&zvg(5-H`ikS^0f`jXc2i)a=RoiB%%0H3hA1r4WQubceQ>nmlnqyGoJR@G z6)lYijUf?=T{)$t<4!iPC>Pxsqc~-*=NKtjyMc{&K`=J38;2W8Arw2Qpz=`1nkER+ zkT79N5Df_hP4M76sK_=h5m8c#f+I8Mq<=+iw;Uu7sKS;P?Q>@47%c^b8nI*cIkzne zg;WVLN^GoIx>HhJk_v_Pl0*wOc7Y@z;>eZ23CEpe%*t&^=ZiQo`J zLZD_WM+kP=^npZ5eCX(-q>V6^2LSwNoT2tIo^2JoY0s0kVol9|GvCFiH7OI?xS_XG zgj_IEGb*d8e9!$nXO@hpt> ^S&vQO3Ex)*g#@7S^cXG{xam(be$6X2L z((}TW{Q6vC %bd_>)nz0EE9~5N*rPegT5rX97y})G0@w^|=DbIiZ zKO}tpOGmeCm?p5B^-Q$EhQR0ZhF(b;FWJ8@xO|rI<-&pJ`CyXJx_~tvDFY|9WTI1= z-f*%C>}8gpov*oDN*<(#RL&6Sc`!Cywvt&g3^bosiXx9#X<2lVNg{ZBWmtBai5|i! z_D$q@9ob^}VpLEX!LARy>euY)8RwnlH>-vZM Yv;2n#uNSM29IG(mHiIrb(S z{_$kQ^R_3IhTSwl3Bk8b!^3&cU*DN9|Fb*%{oe~pB^dAY+!KPcCbI4WI&}Q`4ydAF zSx5F#7#Yj6TJo|DOpRnGjr{tmr}2`H#~CM$=W)H|CwJhx^OQt-B7@sW9BC|p%6q n?E z`+5U>2kC;kr4#1$wr~38Z@qSN{%@YY8}A(X *+#8DyMAwOQaC& Yfq^xX=-GWW )TkJ_h9)eaLm$B@(c3XkNYbc*wajUAZR9> ^%|CFzr$9N*S*h6`kOO1+# zC@o9ZB8B9t7nm>u)>L6b;!C>F(D*f1@fCNHj~J_xQaN6>Tcm_#STPs-w861uO`$bo zO3qzP8!Kc?*o0GZrX0%$w4$Yt73X$A8YXnqSUN%kq{0TvMC@?to>P%xeTz{gO<3a) z93}hg>M7eW*!tMmFp`G^eHWsl5CvCUa3t;^LW;-o$}JG&)N#v{J$Cg0S}BYx2~<>J zgNu$*j%Z^`8d4C750m@6bf;8)MK0%f6 xX6%%8L8}W9~{Y?#tB|EJx1v3013e)@tpUPksN9c zJ}k@-%FsDZyPi69?C3d0rub_nb&^I_y<+1R?CV2Z6cpO=$<*?TOGO^1ti9!L{ 8>R@pjLGLt=8pTCtc`%av zpg5%Qfq&^L_EX5UWn~kTP}CN_y2v@+tN8WH4I`uYbZ)uY4pIphBZ(4xd8sJGbYOXt z$Y~qsf~R&h&~eeETx}&)FIn3_VFXXR4O1i7+LZ4$8`g_CBPp?`5Rpt1OXCGmf Gu z4};9Yn4X=9;5TQQpMRN>Bk4oJ=X1?`Z27PS8x$JYEgWAjA`d2!uUCp6?g@Unx5IAX zIp4yvfiLzw`^uBZz%Le>qa>m8u(#8q5wtZt+oU{M4Z&NJQQ)$Z+%Ix2I|;61(KkFS zb3UJV&bpirj~ua(WG_k%M*-UlR&B=IL?-i=FHbd9-;#=w+6sRDJmb<@{`Su`-#+(z zcN*ExJh>V1zy746y=wV~zk3C~qmUUtcp&JO9T&Y}l4ug$@w`s?+aEZ7QwJ8p@S<{j zv*~z{7kp59x;VIl7^ATf#))S)$$4_2IIZD%6PPE%ckS@Fq(759S`};^Obq }gm)6sTy>GG*Ic0v-~Nbv028 zZW~%9h!AM~dPp&o8W|HBe}Rh~P28f%hJvbiiKfIwOCKsUDPwVr(Zx{YMmN}w(V^s^ z`&44kQwynRLxqrvU_DMq#%2%87B70P`Xz}hFtQ*gqoE?I;WH9K579G84p@g%Vh?M7 z$~r(}SEOc4uLo&_kP1RT=%JA8wELQIaxhqd36R=c2T=5Akup+;^sMPaO=d D^ ziOwN{iw!9WxtRmp6OzuYSu{^s zixZSi@u6p`kI40ys0AwIND0=rXp=z<*DiyCLe6laM<7Yn2#7RpMW)9XGPYsy`uios zF!H|Q6s PfI}-o6Dzu~Wmg{Ify=O< z6oyZVKcS5s4GkkPW-lILNLcwbsYvi4VAO=UnlUmd2?sPTk~7CBg^n3PwoLVejo&g) zN>2NsaH4mHvCf&xyC@+D!qSC?AOeoTmTK7#zot7$$yL|0wvurS_~@xw6J5 cX;7XFhVoYDV?{B;v7Ye50aTa8g#q@5>i&-f-1gbq%u;G z <-NpqFikL@%j(kHe9QIR}ZP3d8J*j|Let78gASsb&>5|GYTm zX*ER)Pbvj_$&^(uP%`q_Sg^H_Yk0a%*{(Go<$|v_7mW0XK6FeH! i# z>n`xCrAEiVk0u& ETVZ&Fygr7aiN#>D0!bnCM7x=+$OHJVK9wp>ijq|Yb9lL2tsZzF9 zu(AplhOn23b|@A2=Y{7e%?VA1au9vwfBzQlWrn*ufvDiC(~<|HilegS%aelh*7N5( zftPK AUN^Q_WU{uFNmr%JOy4grW1oqO1Ju%!V;ZEKo6U(j% zT-J(TTqJxvl6*WiXzB3R5$f<7{N4t5?=qq93J~4}e18l)zi(gge!cIzjPlL1+xA^I zZ0Svln|0z=yIb!ohInJa5c#P@z~}_y49?d;M9P#9n%Dh^x8wpsn4w44R%k+AgU{DM z`S$sE8z{$k9mH{Sgz-A);&$8XLb#iMA_i^>mj>B_WUy_!2GG}3o8TI($7?x+;Em naY5&xs vQuEWbb&Cj@T?CkPt0Ea<})trRZy!!S^4j7*RSlt_lpmne`bA<`od)L}^>2k_}! zO>GyH=^hjIaMu!T8cF4Oc5+i*eS7Wn8e zD#g)ZWP!r4ZO_qZj`b}PK~#=ZjVZ v31naBgy@rs&?-bMPjq4WoXbr+U(I49W1CSDPJPa{@19EO}e)FfKqLf}dN zm>o4^*X$7)vGxlZQ85y8QVCXcSP_QvPoSk4yl#0xLP;tnNFkZaJubo%Ui1sJNSUhx zn%J^tG4we&dTIjIa9w@PRoHMZ$vI$`Tx*1#v9XSso-on|>tPgfF2aJ1?}3_LbkyOJ ziI}mC4Y^E-(vd68L}bijN#h-T?9mv;dMM^Qaf?AGEm|ajf-wk9>jIgWfKaUc>EH?? zQ}*?k#`j#=4IdW!d>1x!zGdN0Kq$Q5CzBKAa>6oPvIz?S4w8HHMMdyKs-h2?=XJ-( zNcJ*A?IM?*XD9U>Wrjs7uPFgZ8yu%?$A?8S_ {b3u25M=g<*&*+vd&*-LW{` =D5*s3WiDc125_fsD8U~n31dcMpSLcS>1uohK z+pihxBXTijN0;p7mM> VMcA5T58_Z& y-`Z@TYqU z*Ey`$%u~U)Rf|CLqrHy(7S?^u#U|%JFI#e*@X^Gf0=!x#TuHd *64t_X;dFqjP&f1c%wjDp1L?{A{jYy$*zV#qHTI3uSJ@+!tZ!QeE zl>FDn9bcXo^d8Qez>E3~Ce`AGNqrB~`-ed2U5UiMwY<+A;u>1sFu0Lh>)_o;-uFc( z3o-oAy$N@Cdk^9@YdaXW7it$RazY%yi_saK8~lEi&>#)oJ8t9z@tQ3eY|11;7^KjI z*k1$Tc Ib5HIo7Zj~>)Y)7n{{uW zyKw9A-D~^Dw9N0W +2Y2 zhvdoRdMdpqlQR-Ecnfd31yU+p=$Yvqq!b_(Gd;zIj+UB)f|veVY^bkYI|Pm%XBP+r zN@$``D3Rj)C8gM &FkK#6 zv`m@lI|LDtGGS{^alXY!jq@G5<_?+IrScbaZcV9nXyRZAm&qAj*pSE(Su*9Sd4}}^ zgI($|K6oztV_fJ-WyVL@7bGELWmlv^GiH}4R&)-W> NA34mA!u3Abt@t;(qm%CXhTm$Ln<^n z&hgRXMNfVmiR?wkfq6g{$2cDuX~j4ZiK+ L6kN3bxGyn&vq=2D$O^m$ilXK zJ{|)p0?(h%k6Cn*ZRq)S>uGIdKTEkY^89kSLSgue9nH@!Uy^db+A3NX_;3V$>_}zG z<8>I~iDx}$9lWd+9hN(J&ODKPUj@G3T7I~*q3TompgGF+X&uO@DWzmpYu2^kv>Djt zPv;wBxMNOf$iER|!AAu%x=@ASvhr{N^O35thH+7u=n;yb_*A3qkI4*4BfNEPKUn znQ%}BUTy^6J}s%e=d1~IG4i6$Iqy0q#`3U~tgPUpdo6#l({tGi%rkgiSFEk(_nV<^ z=zbwNYYqDo$NdK#+gFO+S&td5`RDTyy&v@Frz?pN9slpM9*ty{B>ZA&I64aa U8@0J-)HYuO)HvG$3PoAe7Of-Mt?{Pft`Q#(dv)|-=ln%#gW6tl_9shc% zdC@)LzIlk0aDUXW^^rTJV_7Q-?bzCkkrtdanq?o^^n!J-xv(qN{fJM-kyJ`z9P{za z@!`0n2n~AyF4~;q(sSN;etw$cyri;*XU#eLSw^N)uB@P&ME?4Nl9O{u-3eZ;pbHg7 z6kPStg~(6tSdMI@aXA-u#r*?ltAb4(neRYu5{lNdwwB*rXuiAB+!?_v(M*$o3yzTq zr1FjKLH{9}`xcbsZGd-sc^8=eTYBL4?c;q@?C;y}8+P~o?QR~gLEVjHKnS!<5l9^E zQ0x}LNB0_thCgswxLvpxU$d}L+_0waL@58kamcq{k8k(>-ECsDf3Uxs-rlg?11o$J z=NxYV-Wyp3uiM>-N^YOOH)s9b^LBgr!vT%BwpM%hy4l!(hzQ|n!;0QjIA_s1!N@@l zp=3g5YlO-$Iz>cDCZ=rtCF}MCA01LCobMn8_RAlT$dWFu=vd>UqYE{TmQqDrXesm# zj+#V`5X#WlD>}bL3IPH#J)sF#Sl3dTJzQ*17@Thgy{tCZuPI#U1|M7!TDPJOXUy{t zS=bkB-5M |(AZ0Aw?PPr5)$hhK$7bTR;Fy*3xrf?m6M2qQtk~h4FYw%MClCgdz!Gt#g5F3 zQNq&)g9|OC+@}r|iSEecj6OD$dWXg@aG@pDB}!y8e)HOTO$b4vi$M?Ud!$LZ@=uXc zai~9`W=)|CF#M48ev6WZh$BxXq``rdL&!()Xq6zvz;ucbxe80X=phIiS)tresN!N^ zU(YB=sltXQ?KvxZPA2!5#=9UKiE*e<& l|vXjkObPkQ=UOMNZwbXvgSnZMM$fAEi?NWMjUUn%G$@AuSO!O{C z$wzo mAT G-eahQ^I4 zlE6%R^r&Z)lzhJxJlSsfzD~%~j1ehWo{{Sjt6nlqV9|k$fr}PaeamULU}naAKF&Ch zf>4i{=NW6iCPvBHcZ`){W;DO6w*2&{ Ejx80$UG zWjyXSOf>voCk $70HP6Iol!ak|e3 zWx_b=_-c`|wvn$Y%S3_DfumxC2nnqXv@X!aju*9L(J6?Mk0yaa6ufjj&$?4Cd&R!F zPwPFc7j!Nn2rMm34fI}dyw`9{$Irf<(geXL(?PoN&1S<+I)Lso-?OJCoO{dT{)GK- zkJd@bq~b?OfkCjpZ@H)?Wet~|;D<*&moF60)}C<^_^3=!Do~~t+opW|e9XbYhB1b3 zI!A34JDEl+Xo6>6SYE6pd(v@v-tx<*8N1`i$8$qI4LH5!a0h< PqXVUWJqmt8Q @MX2+ax>vhl2dAf-3lIk6Ocqsx+Ol0 zIjK|r!v`J9P0v3r8bXot=Tk+hBqyEWSI;DOv%uqx;HNv9Y3lgm-kSgPoo3Z2{-+<- zESD)?o+V61j(`8bnv;v1yTuzaPv4&Ge;1s+0Y>iwt~c%8)$QIaw+ph~-tOI4-amZr z8zA|%#Nut1^L^m@h7E-nB_Z^5aYZU;h$u K_P5#J_W{b=y}kvm;~RGNjZbjA4&Ar`ythI2kYDvWyn}aB-QLHr-(LR)1P^Q8 zcdcHFJ#KA%``W&_MlN*RND7R~Q9_YrJGihV6(vD9`miBWB~d` k4dNx_(2R3tJ-guz8aW0>e8y09Hw zB)rCohR$yg5ppr2^5;zT0hXSvThRIysVdR3pr-}`QW;bjfTWg##ZMx$A@xcq5P{6h zkV23#LLkv1Ll9{N)OPS#6|p5^F)_o*jxyQBhXySSQKWQihJcaSUl*V`wA8p@Y5WEo zIwtY}L_`XK55woe2Tv2W*X(Y=CS1~l6^Y47 {hd-2Gx?Ss}^h+7N9!=vRgkzzr?;W>B01rOZ&Gpido*kL;>BK_pgjMM?@Q zN5m8<#f(0M8#{-j2@N$X)}3QlJ)uoCF*x?r9V`Xs@|3MlBpIn cF?Xr$b zjGPcfG1xp(&4oWBml?IUER-0g;Yy;TVih!6j0p5tkuy~fvB@Cil6jn>Qh`E|sWF>y z!oGOG!|b~hQX{0H_XXE+K%F&CVO64VCAl7$q1Sy+sWT=vQaQyJ%?c|N|NgXPEDCfr z;_rUl@p7%H`U&?ljgpeB>)FPNnI4+MMp`n}hK(!9`VJozPd6SV;k}9Dv!%vLL7f_^ zpvk3WrX{O3Qfk3iCw$2Hd>z@#EmjI9(s0p1CJi4IyEn1Eit{#LrD9>G?C8YbT{)&k z@VxR|Hxsl>d^i?-G)}a>V5S5=zwFrr&%U-i)DYs}X_N?#TgTVc&|sXa5l4N+>e_Lb z<;;!c!AS5`H6zO NzP1_A<>y zD+pdOR)PmJONc`wp_YnK=J?H(AXf>O688&D6LOBXYp&fn3p?WFb-`F_j+=_}*6_G2 z0mVh*$#vi$mmo@@1rJJq2vDdYUU}&^v F%ED^Cs49N8+%T34rX0{mPj};u9w 6l+FB}cX6U;JLj`P%aGvgE)@j1>InFtF-NUThRQrQmz{2i#AV zxpmA`qM*abp1M%XWX`B_^buZM=d61HBGIP?BNt>!PzRWno|BE`=!+SLS%j$hlLsAR zB~hj1lRuRFum49&?{i!atC+B(L>>z+SCLPz6NMhwzI&zPy3Y~JnHL?OZ(9y>&BqxW z7LGsK86m Z0-bC2i$wGT!?+HKiyD6W8HiXi zUQ|45BV#)5h+U>C^7Aer`!WC3;Uhv4Tz872THuzN`E<)@I&gb0`^b+EBz0$4Rv9C5 ze)2NnYQaaPV-s?YnwFQ1rj3!Gy>R@a{lF=jnauGzak+wDUP>}sL$F+~EvwGHrDb&D z-K4c|tK|MJad%r7e_O@)+w2kVinVuB#NPdRQ-!?|W8$sn_wKfG5SBNGjmaZ1jN>j6 z@C0hPL`h3bfuVWsmenF9UNxt^3X+JgFRW_VXXtJ WKi|C;4{leqP!`g$wS;`R8wd+gs;z30~Wy&AV~d(5}RBfq;HH(?6dP36|nhYF)| zGCjuomdan@lS5LW F;Y{U2-N-pBQr8F=CXTE zu192QLQg~G&v9W(vL12s<=2M>DJ2R+p=Wr}qh&^$R>T;XWQW7K30@0KVGN}jc&=Ss zqh*0ghE6PL*>E5pa@Q_6@mD~^rEajjBuT=PgrW|YNFj;ABQUJP5lB5Sc+-kZmb7j| z6W5e-j#ie&4UJ(t*&|ln3qo{cdPYi-F062|CD#+IDiI-I iAaHv99ET7 z{sKh8g`V1P27w$kf*O|^LU6 jLxGSOnEpsMffse2W z9a3ggY+1)E7R*p-5VT`CoKwvfCpvNzweJT(O`xTvVo4P)=u$mY#uFd~nHbShQRopQ zhf0FE-6h7rHq aqhB|H7*Z0ZO7!egJl>{PVS<<9S z5D}8%vTxZ@Gd5y{r)42#Y*IxaP PP>H`vz&PybMiZxbQ zrn008TSU?&H~c^$Z$2@VTrqGw@CcC*M)w_+koCQ2h^V(TI! zE&0&S*|>tLQ+%=zJh|U<*1%CMSoa`rKI@=}KpTd}Qi0;(MA3VR7Kyv1;G*+%$$^BG z%Q){FjOm%G2`}o7i%zi$ju+jA``HdDNm@T7q=g`eakv&)6z>-rBVpw{N+i}UF*T7d zE6qm}i%~gEfGibkyu%8`-4d2Aaoz>SDhCpm?wZHt4ws!|?L3=Uao$}}hxb6hK^8d+ z4Ft_u?-|=Gd>WC2U||jKjUy|sxNZ} -@C4RX~SQ3*?p}#DEhPhRQUSfjbpFdvHtvp5UxacPQ>>`p&`2KEW zW&=J*CVAwKMu|WAaLd`b=6tEyvx%h>990pCW~2q5E*t*kdo`ITXkE^Zm3*`pnA(i< zO~OaXy~CEj{5sKii?@ouIFsDV6<=N(+R!4E OZc^wdjvlbe8Lk36;vuq{vA+k6PjMjHW yuUeCZ;jhKc8+h_9KLPx^7ie?llS?vKl@kwyFdRc ze)H3FayiGxA$2X6Q$q4=-35t&lA0I;xtbzGBBX#-C4F3j5RCO6g<8 f-s-lqyz6mo$`;9^H XViX4rix(+IBaezp^6wirI<4kduXXyyEB~MV)cmDSGd@*$R1!~PN8 C5$Q;hn{6dCdzUPY zh&o~Al$p3o6|PY!BNB)yVnjivC-~U1?XN(l0ppfDN?2T|iNaCnIf+E;uLp0v%K7jA z^?ysm@jw4h{~HNKPsL2n(IO*7iA^OH*LYe;l0LRHX~Tipr3x!HZ0XYGwe82n0gfJs z1RRIv4hl&U8Y2`QPs<7;G<$lNFZ B~S3^`3)v5i+4C0K #< zTCrg}@SepCpE|azI8b+Q2o0VjA~TayXlPQ;sXt~DS{wnB=JX-4j4Ohu8OxGfW(3)? z@fD?<0FbMkTpBhk>7yVcM+ifq6qXS_1}@VDJ8I6EJ7ya%@gxibJ!D_)ap7NZ?q1L* z!+t(y>1)>MoT(Vo#ekPRK{$krjAYK%pR#B7s8dZJTl(b4nKBj=uERNAdKTgUE#cA~ zQ_9gzKth0+W5}^db0=Q_0UsrIi;|s8)5ex4J7Tb`(;1h|S3`8W)YQqNMPkQ}aIuFZ zsM)g6Gqe&|3J{5pe(;F@@=yPOFaPbYdHL*$RoZ}zoHdTeV}nK01vsi5J_Q_pn4l#1 z&QwA&v_A28+VQMvP${PkiSJD(Y@KB5z_Dd7x2&AtqOAx~ai_=_8_CIaV%rH7}C>R1Q!!0ZKQG_r028?6w=U#NaF)8LeH8uMRY2; zXeA0sNS H4PW7#V1P_ zG*8B!XH7%vC0|!?;Tn#cj{ErtBLy)juDZzc=7_s?pFg>4$o0V2R!ClUN9=rej}JaR z >Xj%$OFlCg+fY$RW9B8x2X zoq5kyr${03{z7tZ?C{z#*OBYagG@Nl@Zn^{dyATNA9%VJY&yeb@95LeMDL=Z@{Z@# zGaj0fyh_}kMV!;@jy=ghzm+`O8jfp=5sB~Ijf{-o(%0-6fs2B>yFFDe_|?mtUtMTk zde5{_6q!TYC6_H6 $~^i?Z&k?LQLEUJ1Jk06mG?B+!B(%tJ3_+ zj__(R|LrR9o1d@j3tE?ycEPT=k4g%U8=^I1H&pD1gxKCR7zti^g@rV)1*no4QVk~Q z7`vM$IQ`a9ZylL$P7H3wPiTa&H@}NWX@-Qk8!xd^1w*{Cys113cuVAeTc!Km #}EI1|H=FO4}bQr_;-K)ANl1^zr=->%AE}n(Gud#q(BHs)2%7= zE ;7IdxnjrA7%$N|CAFN6DNfT;oE^)ZV#SYHdgiWQjhsgw&%|M#M2! zhqPhK#-9TMB_#`ahng*I*brmF)7{t|6qy>Ku*}4q*00(6i{Z?q#HS7yhvc{* 1r1BQXvt+xn`$QdkS?sr^>{$F2@6O<>M*(>qrk|VCT;Md zp$_YTA_9!nJ_%1BEBaU=wWJdjTYo{JW`mGVJwnRYK`BO#5F*jUB_Z`lr77$jBO-*3 zHg*HHjf^I)KtS8CF|t5NfeMy7UgK|KjQdpM(~#OHL}F_15OEYtQBqU8B}$sXK7v4t z4Cg9Zzd|d6k@;{g`Vgy1{=0wu&l&5SKmT9;ij{BC!jLH_WJX8BNq9y|kv;hUgQZJ7 zN*X#G62;12Fc (^0eLZgz F zpHN(#6Js`{z@;rOx^qO#*)0Qt92XT^-;pWHW$*c_-m;Dr4#!;0*fAsSmyjvJBn$lG z#~Y5 sB$dl6$4$S--|dMHisdnuMSUiH{})SFK ^FQ zv+9^T`GiakjdE>Taniz%7Bk)-jXBy1oR@gH;r;QHsh)8^pHlnCwRbFg!w1urt&b?7 z`MPm5p{Mrnb$^K>$12B2DQd4sQSke_L#p6jW~f7A8*G3eQnNj$lkw})kz=@i(E^$~0nxL_xNbr%pEOF*~X4>*(x8~8pbGB7zB+eUt zdfnoarcJ{+%&npeg6j@GdZLI?6P;qDH0xd=1w0u=_6tqp$DFp7M}IKo YB68(~63ntmNqxJX Vt*Acytz9Gus?dGwYJ*31CRQUEWUJFklZo2XTA&6