From 01b65abae099e5fede6ebcce2491b49ce1c0a375 Mon Sep 17 00:00:00 2001 From: RichardHoch Date: Sun, 17 Nov 2024 18:11:24 +0200 Subject: [PATCH] Improved description of hooks Signed-off-by: RichardHoch --- .../master.adoc | 11 +- ...bout-hook-crs-for-migration-plans-api.adoc | 49 ------- .../about-hooks-for-migration-plans.adoc | 67 +++++++++ .../modules/adding-hook-using-cli.adoc | 132 ++++++++++++++++++ .../modules/adding-hook-using-ui.adoc | 52 +++++++ .../modules/images/migration_hook_process.png | Bin 0 -> 35556 bytes ...snip_example-hook-for-migration-plans.adoc | 54 +++++++ 7 files changed, 311 insertions(+), 54 deletions(-) delete mode 100644 documentation/modules/about-hook-crs-for-migration-plans-api.adoc create mode 100644 documentation/modules/about-hooks-for-migration-plans.adoc create mode 100644 documentation/modules/adding-hook-using-cli.adoc create mode 100644 documentation/modules/adding-hook-using-ui.adoc create mode 100644 documentation/modules/images/migration_hook_process.png create mode 100644 documentation/modules/snip_example-hook-for-migration-plans.adoc diff --git a/documentation/doc-Migration_Toolkit_for_Virtualization/master.adoc b/documentation/doc-Migration_Toolkit_for_Virtualization/master.adoc index 125507d9dec..876a00a928f 100644 --- a/documentation/doc-Migration_Toolkit_for_Virtualization/master.adoc +++ b/documentation/doc-Migration_Toolkit_for_Virtualization/master.adoc @@ -312,13 +312,14 @@ include::modules/creating-validation-rule.adoc[leveloffset=+3] include::modules/updating-validation-rules-version.adoc[leveloffset=+3] include::modules/retrieving-validation-service-json.adoc[leveloffset=+2] -[id="adding-hooks-migration-plan-using-api"] -=== Adding hooks to a migration plan -You can add hooks a migration plan from the command line by using the {project-full} API. +[id="adding-hooks-mtv-migration-plan"] +=== Adding hooks to an MTV migration plan -include::modules/about-hook-crs-for-migration-plans-api.adoc[leveloffset=+3] +You can add hooks to an {project-first} migration plan to perform automated operations on a VM either before or after you migrate it. -include::modules/adding-hook-crs-to-migration-plans-api.adoc[leveloffset=+3] +include::modules/about-hooks-for-migration-plans.adoc[leveloffset=+3] +include::modules/adding-hook-using-ui.adoc[leveloffset=+3] +include::modules/adding-hook-using-cli.adoc[leveloffset=+3] include::modules/upgrading-mtv-ui.adoc[leveloffset=+1] diff --git a/documentation/modules/about-hook-crs-for-migration-plans-api.adoc b/documentation/modules/about-hook-crs-for-migration-plans-api.adoc deleted file mode 100644 index 4715cf6ce52..00000000000 --- a/documentation/modules/about-hook-crs-for-migration-plans-api.adoc +++ /dev/null @@ -1,49 +0,0 @@ -// Module included in the following assemblies: -// -// * documentation/doc-Migration_Toolkit_for_Virtualization/master.adoc - -:_content-type: CONCEPT -[id="about-api-hooks-in-migration-plans_{context}"] -= API-based hooks for {project-short} migration plans - -You can add hooks to a migration plan from the command line by using the {project-full} API. - -[discrete] -== Default hook image -The default hook image for an {project-short} hook is `registry.redhat.io/rhmtc/openshift-migration-hook-runner-rhel8:v1.8.2-2`. The image is based on the Ansible Runner image with the addition of `python-openshift` to provide Ansible Kubernetes resources and a recent `oc` binary. - -[discrete] -== Hook execution -An Ansible playbook that is provided as part of a migration hook is mounted into the hook container as a `ConfigMap`. The hook container is run as a job on the desired cluster, using the default `ServiceAccount` in the `konveyor-forklift` namespace. - -[discrete] -== PreHooks and PostHooks -You specify hooks per VM and you can run each as a _PreHook_ or a _PostHook_. In this context, a PreHook is a hook that is run before a migration and a PostHook is a hook that is run after a migration. - -When you add a hook, you must specify the namespace where the hook CR is located, the name of the hook, and specify whether the hook is a PreHook or PostHook. - -[IMPORTANT] -==== -In order for a PreHook to run on a VM, the VM must be started and available via SSH. -==== - -.Example PreHook: - -[source,yaml] ----- -kind: Plan -apiVersion: forklift.konveyor.io/v1beta1 -metadata: - name: test - namespace: konveyor-forklift -spec: - vms: - - id: vm-2861 - hooks: - - hook: - namespace: konveyor-forklift - name: playbook - step: PreHook ----- - - diff --git a/documentation/modules/about-hooks-for-migration-plans.adoc b/documentation/modules/about-hooks-for-migration-plans.adoc new file mode 100644 index 00000000000..6c5c3642645 --- /dev/null +++ b/documentation/modules/about-hooks-for-migration-plans.adoc @@ -0,0 +1,67 @@ +// Module included in the following assemblies: +// +// * documentation/doc-Migration_Toolkit_for_Virtualization/master.adoc + +:_content-type: CONCEPT +[id="about-hooks-for-migration-plans_{context}"] += About hooks for {project-short} migration plans + +You can add hooks to {project-first} migration plans using either the {project-short} CLI or the {project-short} user interface, which is located in the {ocp} web console. + +* _Pre-migration_ hooks are hooks that perform operations on a VM that is located on a provider. This prepares the VM for migration. + +* _Post-migration_ hooks are hooks that perform operations on a VM that has migrated to {virt}. + +[id="default-hook-image_{context}"] +== Default hook image +The default hook image for an {project-short} hook is `quay.io/konveyor/hook-runner`. The image is based on the Ansible Runner image with the addition of `python-openshift` to provide Ansible Kubernetes resources and a recent `oc` binary. + +[id="hook-execution_{context}"] +== Hook execution +An Ansible playbook that is provided as part of a migration hook is mounted into the hook container as a `ConfigMap`. The hook container is run as a job on the desired cluster, using the default `ServiceAccount` in the `konveyor-forklift` namespace. + + +When you add a hook, you must specify the namespace where the `Hook` CR is located, the name of the hook, and whether the hook is a pre-migration hook or a post-migration hook. + +[IMPORTANT] +==== +In order for a hook to run on a VM, the VM must be started and available using SSH. +==== + +The illustration that follows shows the general process of using a migration hook. For specific procedures, see xref:adding-migration-hook-via-ui_{context}[Adding a migration hook to a migration plan using the {ocp} web console] and xref:adding-migration-hook-via-cli_{context}[Adding a migration hook to a migration plan using the CLI]. + +.Adding a hook to a migration plan +image::migration_hook_process.png[Adding a hook to a migration plan] + +*Process:* + +. Input your Ansible hook and credentials. + +.. Input an Ansible hook image to the {project-short} controller using either the UI or the CLI. ++ +* In the UI, specify the `ansible-runner` and enter the `playbook.yml` that contains the hook. +* In the CLI, input the hook image, which specifies the playbook that runs the hook. + +.. If you need additional data to run the playbook inside the pod, such as SSH data, create a Secret that contains credentials for the VM. The Secret is not mounted to the pod, but is called by the playbook. ++ +[NOTE] +==== +This Secret is not the same as the `Secret` CR that contains the credentials of your source provider. +==== + +. The {project-short} controller creates the `ConfigMap`, which contains: + +** `workload.yml`, which contains information about the VMs. +** `playbook.yml`, the raw string playbook you want to execute. +** `plan.yml`, which is the `Plan` CR. ++ +The `ConfigMap` contains the name of the VM and instructs the playbook what to do. + +. The {project-short} controller creates a job that starts the user specified image. +.. Mounts the `ConfigMap` to the container. ++ +The Ansible hook imports the Secret that the user previously entered. +. The job runs a pre-migration hook or a post-migration hook as follows: + +.. For a pre-migration hook, the job logs into the VMs on the source provider using SSH and runs the hook. +.. For a post-migration hook, the job logs into the VMs on {virt} using SSH and runs the hook. diff --git a/documentation/modules/adding-hook-using-cli.adoc b/documentation/modules/adding-hook-using-cli.adoc new file mode 100644 index 00000000000..a282cee862d --- /dev/null +++ b/documentation/modules/adding-hook-using-cli.adoc @@ -0,0 +1,132 @@ +// Module included in the following assemblies: +// +// * documentation/doc-Migration_Toolkit_for_Virtualization/master.adoc + +:_content-type: PROCEDURE +[id="adding-migration-hook-via-cli_{context}"] += Adding a migration hook to a migration plan using the CLI + +You can use a `Hook` CR to add a pre-migration hook or a post-migration hook to an existing migration plan using the {project-first} CLI. + +For example, you can create a `Hook` CR to install the `cloud-init` service on a VM and write a file before migration. + +[NOTE] +==== +You can run one pre-migration hook, one post-migration hook, or one of each per migration plan. Each hook needs its own `Hook` needs its own CR, but a `Plan` CR contains data for all the hooks it uses. +==== + +[NOTE] +==== +You can retrieve additional information stored in a secret or in a `ConfigMap` by using a `k8s` module. +==== + +.Prerequisites + +* Migration plan +* Migration hook image or the playbook containing the hook image + +[NOTE] +==== +You can run one pre-migration hook, one post-migration hook, or one of each per migration plan. +==== + +* File containing the Secret for the source provider +* {ocp} service account that has at least write access for the namespace you are working in +* SSH access for VMs you want to migrate with the public key installed on the VMs +* VMs running on Microsoft Server only: Remote Execution enabled + +.Procedure +. If needed, create a Secret with an SSH private key for the VM. +.. Choose an existing key or generate a key pair. +.. Install the public key on the VM. +.. Encode the private key in the Secret to base64. ++ +[source,yaml] +---- +apiVersion: v1 +data: + key: VGhpcyB3YXMgZ2Vu... +kind: Secret +metadata: + name: ssh-credentials + namespace: konveyor-forklift +type: Opaque +---- +. Encode your playbook by concatenating a file and piping it for base64, for example: ++ +[source,shell] +---- +$ cat playbook.yml | base64 -w0 +---- ++ +[NOTE] +==== +You can also use a `here` document to add instructions to encode a playbook inside a larger command: + +[source,shell] +---- +$ cat << EOF | base64 -w0 +- hosts: localhost + tasks: + - debug: + msg: test +EOF +---- +==== + +. Create a Hook CR: ++ +[source,yaml,subs="attributes+"] +---- +$ cat << EOF | {oc} apply -f - +apiVersion: forklift.konveyor.io/v1beta1 +kind: Hook +metadata: + name: + namespace: +spec: + image: quay.io/konveyor/hook-runner + playbook: | + LS0tCi0gbm... +EOF +---- ++ +where: ++ +`playbook` refers to an optional Base64-encoded Ansible Playbook. If you specify a playbook, the `image` must be `hook-runner`. ++ +[NOTE] +==== +You can use the default `hook-runner` image or specify a custom image. If you specify a custom image, you do not have to specify a playbook. +==== ++ +[NOTE] +==== +To decode an attached playbook, retrieve the resource with custom output and pipe it to base64. For example: +[source,shell] +---- + oc get -n konveyor-forklift hook playbook -o \ + go-template='{{ .spec.playbook }}' | base64 -d +---- +==== ++ +. In the `Plan` CR of the migration, for each VM, add the following section to the end of the CR: ++ +[source,yaml] +---- + vms: + - id: + hooks: + - hook: + namespace: + name: + step: <1> +---- +<1> Options are `PreHook`, to run the hook before the migration, and `PostHook`, to run the hook after the migration. + +[IMPORTANT] +==== +In order for a PreHook to run on a VM, the VM must be started and available via SSH. +==== + +include::snip_example-hook-for-migration-plans.adoc[] \ No newline at end of file diff --git a/documentation/modules/adding-hook-using-ui.adoc b/documentation/modules/adding-hook-using-ui.adoc new file mode 100644 index 00000000000..ba83dbaa062 --- /dev/null +++ b/documentation/modules/adding-hook-using-ui.adoc @@ -0,0 +1,52 @@ +// Module included in the following assemblies: +// +// * documentation/doc-Migration_Toolkit_for_Virtualization/master.adoc + +:_content-type: PROCEDURE +[id="adding-migration-hook-via-ui_{context}"] += Adding a migration hook to a migration plan using the {ocp} web console + +You can add a migration hook to an existing migration plan using the {ocp} web console. Note that you need to run one command in the {project-first} CLI. + +.Prerequisites + +* Migration plan +* Migration hook file, whose contents you copy and paste into the web console + +[NOTE] +==== +You can run one pre-migration hook, one post-migration hook, or one of each per migration plan. +==== + +* File containing the `Secret` for the source provider +* {ocp} service account that has at least write access for the namespace you are working in +* SSH access for VMs you want to migrate with the public key installed on the VMs +* VMs running on Microsoft Server only: Remote Execution enabled + + +.Procedure + +. In the {ocp} web console, click *Migration* > *Plans for virtualization* and then click the migration plan you want to add the hook to. +. Click *Hooks*. +. For a pre-migration hook, perform the following steps: + +.. In the *Pre migration hook* section, toggle the *Enable hook* switch to *Enable pre migration hook*. +.. Enter the *Hook runner image*. The default image is `quay.io/konveyor/hook-runner` and this value must be used if you are adding an Ansible playbook. +.. Paste your hook as a YAML file in the *Ansible playbook* text box. + +. For a post-migration hook, perform the following steps: + +.. In the *Post migration hook*, toggle the *Enable hook* switch *Enable post migration hook*.. +.. Enter the *Hook runner image*. The default image is `quay.io/konveyor/hook-runner` and this value must be used if you are adding an Ansible playbook. +.. Paste your hook as a YAML file in the *Ansible playbook* text box. + +. At the top of the tab, click *Update hooks*. +. In a terminal, enter the following command to associate each hook with your {ocp} service account: ++ +[source,terminal,subs="attributes+"] +---- +$ oc -n openshift-mtv patch hook \ + -p '{"spec":{"serviceAccount":""}}' --type merge +---- + +include::snip_example-hook-for-migration-plans.adoc[] diff --git a/documentation/modules/images/migration_hook_process.png b/documentation/modules/images/migration_hook_process.png new file mode 100644 index 0000000000000000000000000000000000000000..745515213f5e05434707641d56126482a6e9ca78 GIT binary patch literal 35556 zcmce;X*ibc7d@;LlBAMUQW}scA@fiorI0C-ArzVCSyYlKNkRyz@R++pGAC1#p=8Q% z8!}}kA=A4q{f_tj^nUvv{}0b`=rP>ab)Ng&d#$zCJ_9Z*D{Q0PM@vCLvF*ZnIW-E3 zjg1r(8{W}S;s0FONjgVCafjl9+!+nmA7fotZCOks+LpXcZjMWsmp%HZeDBb4+ug?% zHPQ;3jq<+Fm*)NvbU`eAmD2 zO1Ja$*7a{sGatRfwEpeBljkXT*Z+2f@#Fu?fAAgNWq+6<^Kd~)OWpbtYVQtw`64x> zC68xAj;m!sro+t73rWezUxgNFwh-^!pRLU!xwbqjcR19KkNazgtL1=wltpW%s)2zD zC*w!{hq=~Ih(A=ZOP$g8VkF;5F|p(LOYYB=IjpR#r@IF~Br6S{6p0=)TMXzno?BXqJ>niiy=nYAR%$$L;((yxsbus^?D!RCc zL?`VCsou-X{GopuKldy;`s28BQ&(4Tm$gXz_B?8iYdjIV?~aa*@u;h-Yx6Ma=;%x> zdUF5Jx;+tVmG2Ox%U3--%$cwI=)nW3h=_ybh8|OyrM=s>ZNrM;6F8ZI+AM{+!fCf|-C8tTFY#Q|?q0dycH_K`3rBY@ zd#{n#6cW`EQc?nBR+?nwRT-TpIxh&v9E+)YX|^vw?q2-zPY%4s$6o%_Q~_b(Dud-p zgBND|%FD~2OL;`Jv|I_SJe;T&pv&i%WQGOei#!spm|(VV(KGH6`&p9qYi%B*T%EpS=qxCPfAGCs(8)pDkv$}-L|9QLM*!+^6cq}(N$A2j)hFD|b-JaIo zba!{h7A<#?R}K_pHg$JD>KGra2-tP$(xs_t@8xQQ+7z)&BEiAI&t<&huJik6jygIz zPIWpoOwY!zJ=f(^(9=7B%~&2Ym3ftz=&Qk1DYNXi_V`+!^~qDGD(6erZi|bHzjqpC z!UHWYRLfKuk*0hOF5kI(cLO%2*Y+8=R_4^WjdzS}!iU1ilA!ATgxuWSk+sKsl6)EN z{3Oo3t3Tet>rZyPs+N|5g$4Iy(JXzqqOYTPUG+ilFA4{5%iX>$g=69}_w83fJwj{` zpYEY>#SM8J+_%ilWm}z;7|EiDRPpm$%Tb6i;Hg7T?LgES;Y@hQ~-RP^;7PEFkze2%2eb1V8mlG#(mW3;{- zM;!NsRF|h^l?1kqR`%L5(EE`(#(&Pb?F`sdx>Q(NdzX@W0WVxLH2YqcFWaS9E#;Zi z&*-ECPTJ@s!(5%a)!bIc?zin*Pq}s~l}4fM?N=T3lC!cxe*Dm>e=b&@aMtg#W;2Up zp7)xUb?5stSSYm=enCOX(}zP3#ne4Hf0TLe-h|7X{30R>c+1P23^bc?D48FeIl8m= zOO)WzunUaxy;HsAzkmOpT3woS=&RULvRG&H?d#VKA3l7bh&*ACgijla_l|q?h@NTB zo@rOf*J{Uc?xtN?3cKp@+9EdHKZ8z`d>F8|TbMF@Qgal??}k7?m$j*p(LL<)+jgGT zOubjSe1bwk_v=g$1a^PMuBxRxB|_^`AX{=v-^txU@~cB@%kh%)oel!K5*T8%^L0&3 zOdePYUle6Ir^+Z0MOSwHvE1RihRjGTj(Q@LEeL#m=8DPruuJSwv9XmV*}VwI-$B>; zKYjc5L~QuP&Va`?H*lE0x3BqLbsN5B{;gqbusnSMMwhDI~AlJhV9TA!oeZTM4w3%rUsH2|g}z!R&+Xz@r&y#!WSeuhZ?EWx{Cl5TkJl7G`03a=I8ZCu zcLtn4@muiqsJMaG;<1_=YX2~lzf(`B$BT?B+(=;2(b2iqvk@qoQ?8OvO4iW}2XlqtwpE#-cfb+Rs>I$z`l8ozSn5u`hmAx7HGgF{1G{K^+ryii^y zOP2V8f`VKnS#_>m8~OE1wn-@c3iqi~r@qwJqsAl9kkNp#9vD8p#Ga2L1<;|XNqkYd zJa8flk-_~YZ~hzAt`UsO&MEr$y7EdQ?T*Z%56 zBhAdrh)jw@Nzy(VQ#aETzxs4!#098zQ?!`sZRr|-fi?7`?T|XR3)=HGO zMAGm62iXVB_Q9Rg?85@pbet|uVZu@rQ zTpc_oo&%VR)NZN4wR>h!67Ljg;1%`vuREd?l`}x@zpN|{){wB88%Uxzhw5V=hJ?II z-Kib2uf=D>m=>-iE2c_ zC$FuLO&uK>lbZr6jZiQfo15iPIW@R8OaYbvSNj+;d#){!hh_$90a<`p1DeeTM7(E3 z%xr8FG&TQBl2v$^2qcCzE}1W$+(EOc?VZ(rA0MB#ac4l;rTIzJ=<}1=>nV=u1#<|) z+};Oe2CD-GZ>>6nv8!68J8Dx6G`vrEk9(}#F6G+Sd@~};WAXNU>V#cs^<;CLL|$!i zOMW!YSG@PC81V;@VN;5#`mtQgzmsJKhQGd&d-at7=LDr`{qt4fpsKq1Spx&|*+{+F zGxw*`PXDeayGVOwl}@@Wsm3k+H|nKr%OlmW9-h~#3!a^q|Ce%uW&dAZSZ-FOGdxr`<9gVP%+V{-jQ>i6t;99kuMK?d6|=u0NzoTGM!@b zo+>7O?Cg9_r@=^kjy4DD@jJqFK7eO{G1z{CQDK|os4WJoGm+Q0f?sL#L^~B$`dsB< z0;EpmD&Jf2>Li_y5$SxsuKs9}CC!zz-D%AQiGRvu{rxr^i1!rOCe8;qK=buv^2B;K{- z(4=1()e$*ML!!Sx!P}CU{B>4ROsvLWZO#CYqxQ=eI*&hN1QGL;-hTS%&N5_OY3WBv zX2{}5d|xE{u}Kn>MIcobMx@53rt<0jY8+}uCnr^G@PPw~2?=-e$X+q_`InHY<8S}j zE3@3Y9Vdb;kRmE;No8+8ZL4B`%!WJcTTV=MDs|%n!$vZ>;lqbJp66M=mfT*#q1PKV zu`~~SX$uNfRb9PUF0*{L`}VwEx5uOuvNl-ni;RqI<@_|hvcTa7wZ&>rhJ3==(j=L@>@sefI!R`mbGGN&-=@LD&Eib1hmq8EI#3 zGss$U0nDMAw&zJvfeKgmhg!YclI~8CF)B`=Uu_<>YuC6ndD)2c+XXl-?zHf9gfH7@X{yL#Hl2`xaiMh=jMFdEb z|F+}-4*Z^*n+`Hq{#f*V)IJ{=606xeyGT$q5a{h+LYRz>ycb+sQlM)TR8QS%wr1Md#&)JBG|i-ZA?{tZnhk2>*5@ zeIS9#O8EzVep`HHv8#iFgZ`C9@4KuKl(vPso!`GRA`=#S%-e$j;QhiCHv?E`hHG%i zr)V6Gx}?U*cs{x5`}gmcd6=SNVvaD-q|cc!^aYF*D6ex4h5$Lva7DzUrErYcf|jPH zhGwE#%JsYsuxu2rdu1=K(ptM+_8c1LD(43*$BubQlLJ58UVMwd_FNo@B$98MR@Pe^ zvUEW~!9;%duj>Y+f}_WJr}3(iaXR!lgx^ke}Jc%v2qDHbX96LoUyvqI!WS zEj!)?6HFY;3)|#2UAbp^X$1^?3m|b}m*_Msk8GT2(B()Sna?<9eG)aqGUSQ zrm?g0i%aQ}9*TYSqXXpw_R~o9V3oH}+S^FR|D|#j-!MAM4X(Pjy7XMq?aA7>_YxV* zs<&EZ^`zhSgXfxr`1A_ou3g)Y+S=P|2;qe&w4lK~OXM|afO}WTddM=sJBYpCzl9*= z1js#$i%Y^9F;nH{=B^77!NI7zHsCFnHFxKA1ef<73Ox^L;;T?F1ciIrJXOA1_aOYg zx3ma|i3QXS00@BC`Mu;^@RXiae9R#0sVCrn*>Z1c>bI^gt3Q`Ps{li~y1Ec)_&f?x z_urhh62p%wja)KJ-4+Y}{Baf(HSk)S(a*Xi#Koa#RG!^#iPDKjGHr-E7On^m+Me&g zfpF}6Z|8#_|1;iEjiaCMHp>n+ivO|kE(PMIbTOv%jHV{iG{P(~@fbLto}ON3ky{x4 zLGfpztM=0;8V3glV2~N|+LCuN4&mUS3641+-m%d0w!@9s9BOcH=q@<8T`uICmX;5} z=vG&j7N^R$n^{;GFZ~&Z1e4)@iiNEr+s?G6EtkDU)Tk-ND}Q3{*fnq_^V}H#)ftu5 z8kvNoq^f0mzS8g4il5kLEltjQxLFMkglr*&?tO5#Y2*eN>2q>&c|xuB_Js;OD$ zvle^i%}Zpm&C)Bs)g@U&+Lv;H=p7;|Bpk%J!vo!>O6~d|T%E{_{%ALJXy*mHo%`ia z4do+ShlcKe#z#p>3F!W9Ldus4-)%*|G&V9okHZlMs7tu)UsZMP?-HSO0kA<|5fl`JT!3(>tE&S-HZVBo zD|;6?CE@aiUfc9Jc1Bsr2jFCfL$BN0Ke-`rfut=Il7QS=N>(|0mJ&R{!rmT=ZktA` zpx?l(80_5(D@i8<9|L%vXWjKum#?Y4y#_mo zCx!I6upkOXkdks7Do;j625RCz^m+r-zI1i8bdbQ}h`NFTaj-UK7M2Q=?5}NYpYR6? zG66+_%w3DSbGt2NC7)ms5C|RbtUxOusel39imsY3nU}(vLXdJ4cN@*f`$DPbbgAr` zO>re8F}}#4R(+4)va&NgOj~(*dFklrDDu+UkgfLZ+vk7o74UJl=d2QbUq367ygE)c z@$`JISLobppMROr7r{mlQBKCg`-1I9TX?f0miF5eojJtt_#{othgeFbNV1Em%FmSv z?=}GeVYAzfPO%_X$o3bKn_Q%>a56rNjfJfG4VYMH-|fNO%1{Sl0;~Ib^M~U4i|4zK zL|ys@pi9!eaqE`J^ULNm0>HQG%wRO2pET7lO$>eU(9Y_^FxN6G)K= zJwz#FIe8BciLkIRB0G}*W{{1rp9nF!@)r=`u;!p+IRA)Kh$|No)ouvveP=_iUz{Df z3f0>r+wSM59VK%aHW_m!yZRE4M?B^y^y~~26#U$74&d_952K5FUw+?8`Rw7T3 znNE!>97P(^63Mul{@1Tx&thU;X>gsCk_v7b0q1J`@dLWzv8YSY684Z8kz%8h5U}U1 ztazdIzHQpQzbdwWQ))luo!xnnCzf6e$&4iz)DMh$wF%4@^0uHkLTMDjk2+Z2+GK)&KT%B7*4Dm`$Apd`C@FbKI^Gmv zfsIBA0naxX`5Gf)V-E_Be*-fERv`)C3*;7u+gh2r_+v4PIn%D4md28-riO-Px|83& z?L>EAa2)YE>!hCY)U*By0>seTdLp6BK@*E=ZC$@imf`+J$t%1Y@Nd&bM;905m9w0T zMz?N#>SP<5b;F5f4WY&ww6!tE#>OJdthOHtJP-cQ=p?HPY1M+JQzVJt~ncY{JLn zRUxmvZZbon1Z+Wme{*}u85;hVU9k|3pnU8-cn}GjPrt~YJei!45uA{~hCN1*%Qad1 z@gm*gcY2%)@rItu)72lw>7Q!zJg74m05rh zsM-XLimW{e5jDvS=n1+21doTo!6zZ@s;F!yu&M^v4q9JuWCR%swSp*%*Xx`ecHYg4 zjI2%%A7_pdA|($~ot<*Sy-kfqO{$vVtp?t)mcl{hy)Qsm4VH2Zjxf{BY+vh@dHwDk zQ(E(9B6(qhkiD0C53aIdCxP(Kp7n8C%okTxbTaa{6@7?~MXUEpE0pa`K4$>kzC2F{ zRGC~`oirwCy8_t(zo2lMn401PLHM(oGMYx7p1CjUucV~PXl`z9E6Rcs0A$d&7?Q4)-xE1+s*A9>|oDZoI(5K@hTQPFP~SoyM@TaT0R z%gjUMFk~9A8rJu`bmiBf%@~n5@BXIL&S>$ou9etLyZQ6LjG$FA7Etf4Hjl|bAjj9n zMvBgELnlYa#;;#VebeUKhEmTTecP9df*<#Od_Fp&xTK`J=m5RnqdFz}zy94xsj?Bxa&K~~1p3zMIq$~e0Iydui>j?&0 z->Ib)?$5O5(dQs!Tj%x9E{Zx1KfZb{$2~k#mk+!f;v%9NwGqrCr21@%hO8=MHb+OV z?Tb{dLYK)ZK<98{5R>R6a3mxl{`jWmW-I`|N(4QN=$)6G!v)}OXk9g5+7A(7xS*bp zC6c0yO`*uxTzT%sps5J~65`=SiWQ1x_lc-WgQ4+A{dH?i*$}?9U64e;pFVGqlFL=j zWe7=w{2-Rnx5^bBX!%N$DDs;&QkZnDfWP2fOmZJ)Im~4hNZ)~uwtHTSTSy~0Fe^1B z9@QTl6Ak9M5a7_|^?WT<{mYZSd2w&tZelr&n5lre zJeNAi?96o1EwjSz(xlYXkS=aENa{P0&phV~$+y`lt*?Y&wEq*7gqvv=W=8uu)k1;1x}tMadG59pQHC{$G@d4 z&dFq09VMT%J28{*THq;t5E^GfLIQO}_N;rcNqd{=c*-Vld(;u^=l&9{DKj-jqzoQ| ziYzv0qbMp<)71w-zFG>z41!Wqi4;s;Dki^5PBzVmIa0BUn~}C?X`;|`q1Vskc2`zf zbhi8Kpwep3_SK$D4GOl3!GzS*_B6?pC(F?0iBi_=+Jo~edNdyU=w@whvu0YT+n}K1|ki%NA2LjWMoUUV$syI&dX{ic{fuIn|n2i zlrAa(h8&qYtwmlwM}H^ow;DNM7e}01-;#+TbCq%3m7E>S56W=b64fq1|1k_#1XCJQ zzv_~x=4L*M_T-6Xa~^wVc`T>4P(jE(Fg|lH1nDRJN(6^wxM;esFbDxYz zkPjh8Hxx;~admG|Pk*1JsxKW+cHDIaxVb%lE8C{L6IatxKSMxT7{v0+EuE8BCEN+9 z@<@@mz#OMH3~zWhE~*t0f}88dylx4sCtRNRLMfqtLOu8l6Po zI&309gF$Y$5gLsbFK(5RlJcCX;n3g;&-F@^O+UWH)t4crE{W!aR-vDY^Pg)zFFBz* z16Fx2MtawvZ`-;`{?|(&+Ip8YHKi{SqAz<+FXgSE%D2CcnFECD^3^8J^S)F|d6Sa^ z3ygL+#SiGHS%d~n3b1M;T3TQpSw%Cn$V6!c6QE1z`PO6OkNS5XPIU{P-}+)(`3Gb$ zV3*{kr?msrR2>ft2^Bj=ZmuwW-3Jrv%~nyh?S-ahB3j1A)sGU)ex!yUR%hI-)PxdG zw{2S}&i&tvKqmbyJcRY@u{Zvm` zu62YfP5WA4vejAYMl^!qmw^}wu-BIAX$TFUyfWc}#`LXd_PdQt$!7b|v0;&Le%Mv$ z(r+tz%ff;%X>6BSempWV;t^MLJaFdwuZvsR;;GbOkh z*h*B@HOW)^h41K37%rwwrQI1cyjwS;^UBBq#w8dKGW7}{08x@iJ2W-Xog$G=g1qAM zd3bozhpjSMwd3bZ|5HnWItRgRW^uRCZjI_6%T+eZRHgGCrPWK5r79q3kdgXyM3iVq zRl@QVEBv7KfDG^zLD9HjZ$DEK*_tNRpq6d`GK-eJKU@|o{RpU zfCPHSV1Vha`g7T{>F)nQLNqouhV)kYVRC-9<(f^6sg}PcK*Il;Jm{~SZ^&k_xFuC- z5+i-bIbWAhJ_*aoyLZA59y}mK+Kjfj%f70ANO>qaxt!x4VD7oiU88z0kbFL_L&OYKu zi#}E?I%#?&IezBb#S`e`u!^3ax{B;h&3%PyclMv0%+a*JKOPv`qC!1a1|r0{+Y}>; z?&)T~^1IdjP|-78zl_eo7J}$>+1z-D@)RG zO15{E$7Hbr2%N$rmaEOJ|CMadKa8Ail#!li+?cfO#VIA6s{@29sMcWh$?c^-Xly}_ z?T0x9=m`f3Mg8g3{t7ARvg~13LwA)*^7Dl&&S&geO;`SyDtNHU=;Z1`$l5d6geeXE zYsy^cD*GF>=MYsBOqie=4!s{YOaC1{0*z(b^*NAy=n(}X^XZ7FryD~m-!8pC5mfmx zPRirTrmra)>qS95S-ER|)7aH`UahPGqH)wW@*`)1P$&KMBK;H4M`2cQKr{6btCXUa z)*hyyn_YVJ45JrM&AV7zKZ5M#JlP$bIZ9MzpaTckLr@lP$DfdTCz~$aZnKrG#YgGD zX)TT`aMwWmgdl$rEqThVX<8o4S{{cY+TMfWxlR_(zxP~(fhQP`b5dCNT%uaO>Eogz z#+M96a~c-e9z-z>WH1Wq_`cz{ee?A}!!y%5O83}WA~HvZ3%tl{9*{q5ZKpEJ?z(uz zMNl^ggy%7&RhwiJYVho5?kw=_f|j}+vXaK58R`xQCD0*=?2R2A7xnbI^mgw?oy)iD zuR41%G@veR-`J0FXXo)B@@LPMx30$Te{dI6X2j8JJY~R_q4X_`P+lvo-m#ZCk7~Ky zXRxrw--B%t%@1gA*yC3T2^%yuQ4I;J+kCf22tKLP>0EYEvU_ptxPLQDQ;@)*8bJZ~ z8oHaU-d(#w-yQf8olO7g{%>1(D_UY1t~w zJBUrnd}+Hla}()=XsDn*uZ!IH(ER*-59#E6qG^!7_s8fas`Yl}JHP;df;H*h$xjE~ z0bb~G;C1bQ0K8X6!)iRdlu?&Bl%K;7>YsI?Nr>osL+5#vISREkFn;xSvWe6hfvcQ$ z!T#8YqIOXDYdM7RgWk(0qmxuqG|)uYt{ZY`px6muWkzPTdhNaGqDVPE`a=UDtHU8g zn{ZlNJa%wAj|{oxXWRzIeBBb8;9G3#%|V3g))Pf{U_Jr|RFPSE3I`GL#KLrch0)0( z{Yf1WO&U_Agig8n{jvjJuVSch&1%zIwaZ1$k~ zh@gj$09`lMXP*Ii?2(*cVkFoWN&Dx|nlQv|w2$Kn-S;1m8=K=X=DBL{oqBth>Uxn6M|kgzG;l++2nTQ%9o3}!qo$G9 zDJeD2YwQ<~a?AQRe{F8Agbt42|2;oXL3c9DBV8P+lge0#zWoR*Ykx15Hv)c$C$ANAn|B_EPM^|I?ACh+gWCkEoHkg&7(cf z=3s-=JPQRO?7+=2-^sBjNFH@=D?y*JAwV3oY;jNKn8JW__F2!%Zl|N;=jXR=HU3u# zkjN%zUu3uQMDpqNRR!;VQp$Ddf#DQHN92${at#LB+K)Tk*d}nWL_HU#j5p_@Y(jaf z9Wa80roTEQOgVXSu}h7yQa33vQQqV@7{jjp;&-Sf+GlldX17ncT~KMtDg6B8LgNu2 zn;SRohlYl7==*s-y1x+q>vShJ@DYpHOk2Z=a798ry?ggAwO1Ythj%~6o(yf4cJg$Z&D1Uq7dXnjAPEscT76e6?wEHg9Hqs3_t;w{H)BitUM zwmlT6LS+N?AlzuHLI5d@$k10C`}GU`z$XnusKkA-F5PTlHRl6OI{ZQjxg{fDt-h10Mv@lZ98MKW@njE&$#b_B&Kx6ls8v zp^ZuAh`716lPra~i(y6}eP)y|8=3`ES4iCWj zxLvPh#1X{&{L!6+B!@Is{nz?<;74>j;=TSJM~V}Ttn6Eh=ZUO^y*L^w zsq|Nik%D?cTOS`EK>u?6;nQv`%9)OqCDFd{)#inJXRNC*l4!1#jn3JRwVi~j3SoS} zXS;Myn2K~lc6JzfrHed}-5}jRB(t_yATG#cB=sNtVM(W7j1aQs_4t6BpufN@4%RvZ zOCm>ngUqxAA2088uirtqJf|B!=+Usn-3NH-EaRtxIuAV>coTg+bS&Vwgfxi$GPwWF zpi0)`dFuWd>5!-fKJSL{z`oVEnUO&HhIt*w8EHLN7l%}IgNhYZ83~^*Azh)X+NF?5 zariz%h@##o6<8K8AK#Oj8<4e$Y!^}uix3h$Tu0Ep+4cn!ea*~Ki!NO@;dEps`UB#G z&8)OE9y%yYN2Pz6{x#U&RP{T(M1s4hrqC!rU5wD3;fHP#2*AW#Lr$0JKOX8DKEO}|jj3)fo&dy8h zVZB7T45;oOG&X2O>xl3)03*66#lheCtmPs@@yNzouruDebsg0jnV6-VpXje5Q$<8D z)yK;;5Y1Y@@}j@L(h%2EI2BonA%1O=j(VoZ0a^yP!(p+*A4Y&d@5B>{Anr@@)yvC8i!7v*QWjY=OETAh$8OsfH+)9piAKWE2YSn;u3(1I9L6QDB?2l2!P4dU{?g z>LA|?j$@VZ-B{(A`HU8inWYuAQ>O`MQnm2S-H-5taI`_-LYo`TlK(Wg@RVR~L}wqu zqK{@pRdY*A6|{#pkifr>r7gZnO%>yutM72>&f6#R_11d2f`fHrJFaKf=8*TCK;1+e>QtWL&Y~TGP+o7Iz49=U4`%?sQ5uK z&EcyUPx&vkAoFt_bSdC_kWRv^TOppEw80V0Vayxo7P;D~|K5m4!K$=0pD}|!jMA_C zjIr^Nvg?g>^l4>w>|utmEKX0`5z{D~YQSOmXvL*h5^4$jWb8F`hh zAidCQS)@I+-MO!vabn6gXVB$jB;2W{_0J8VYUuKr>g#ASZid#w&wK-!V~ku%PUkI* z%7{F4))Gm}7Y~|iU8M)19@zt}t}G{Y@Tr729f}oB(=FJerlzwN7HL=MEnlfILMrzu z?{ys;%19PWo#PCvvBlgI;ZWrY7f3cT=q}fVT_-LMJ+wzSAcQ8dBdD^aU<4xJZ%%b@ zsAKNa8XJdUiN}UxCMV?k#dlE~KUIrSz?KczfC-9gqb6C`VD=y^s=GLpA2$qXJ+}pt z0JFo6BTO0P&$K$>^n$Ap#>mKky@Uaf^y`Wg;UhL8eX6L~6m`i&o}yUta!G5?nDXgZB|x3p_t(ucQ{de(=d&f($0JIvoOIzuxo$n&-&)J#(!F)dTh! zbJund@>c5`&r9Fk-~8GDR}frGkl%=|FyT_gE`!ALOH0=y!$n=9qKK@O$A}ElEK(N_ zQ*8vzO8`>RUMYrn#7Bd7|c2x-;gC5^WPQywp@!nkRv?O z_kGwOwMls9^3gX9ePlFc`t>a!SSkm;u%i$n0)Iu`UF_v6XOfhbP3U<6Q=G z+ts=R{cT8c$oQ{*6O^6zXVj$uDa`kfm+Qz=u*liL6kwm<8A#E=PlqlEF_Zyp)|)J| zavXhki(;#aeczm75d-jItdm5-M}kn*Ep#S&ls$iHw7?L@+OyFSqGy%#Zx|A^kW)c} z4o$J|FA4F?rQ6L9rs&IjkzbvqtMg~*>K4e_a|>jNC7XzGsb{(@O6F$XGG`DW`x>aL%+N3FsG6jzh`EkMLYmKo|#pqZ$iq{O-qx+gLDh{=C5IhBukiIOMpAd;U@)? z#)*e{0q(rofx~b%G&RBVJvfR634WT=n{f7S!#S3YkG!Bl^edEprfhC(b}tH$`$%^W z)n&14yVnN@Raah{pdX~~wRqEOq5NR9lgDm(!oMIYdW+ALnF=ofKf0iZh$$79!4L++OxAK{uWwTAAeP1=yJyUlp;`ku3p;E+oOo$2kXYzHx83T}ka|D-ebck=cA=o^{ zfc@V11_hygl>_!)TU!$5`ko-w^h1w8Qgt;lOfekt4Rt(i7VSC$xZofYG0#_Hkz-Jz|A1 zf>$3HH-JHd`Z%fD+7qQ;ddvM5J4#osWt-YyywE=XVUihY7SZR6i$k^h+RjS5ct#;(kzhds!2mzMS_GqZl#gIsbOIyw(iIse1myEU4SYh%T1T9n0Ni+tLYw(&7s3C@5)zRtu zo}!L1*I3N2p=1Fd-oYH#y89o^W_Yb|xG*Mw6~r(ZCjg0V6Tm`qHZl#(cW(Pv`4Wy&#c7A3b`cP;&3hvZ5b@ ztYpA1is5FS$ov+%a{lTB%Lpjjt#jWGe>4}%;(}`#mPUXJPiYm1U6G~B#~^L+MWUgB zH1lh86p3Z9K3SZ`(v5En2umS^6=ue^vE!M8nSVW{0cjy@@N=ldRe%W3xg#oIp$;J| zr|Uy@=nOmoRf=}YX?BLk!FIY&9t(+-gR`VgH1fQvgp`aM;-sL1eIt`Y44JX^&wOU# zYeSO*79e<{(NlqQX+zJPyBH=l6E1_iJ%C1blFnFu=&K1DMS*r`!}`wsUi2{Ek!Os9S7M5&M81TOa({QMxC)g^(lk?Q>yh**sPk(Pf?rR%)W}53iQlyUNHc97tw|0 z6P(V3`h%%o1Q%f(MN-5(C|n|d@WgkJ_ECGw#+`|AA&60MC7wQX8s`cpAIt^O{MG3I zRC{Z-3; zzim0yX;h?%WF$D3w3Vb2r%0if(b0kM!3R?ypl+bQjCoU{YY1Kj0%Srz>(C&jfT>JK z`LCNsI)a;o@M5q+zArWwN2dbmCa6*t2A9zDo6?%0KJ^i%o4SHRjL?qhIg7_G|HxX| z2Nx7FF!~3;6Uar7k^^62(ZPm_rao>3&qU^Gx5RW&{X`d$kz&mK-iLx!&A@kT3+FdT zz0scu4fRv0$Ps8jLo2>N-jNp*zn@4({>{I?yT9ON+6t|OAp0iUC&6P0=O2J9oI^xw z3#uY!Y0vu616ql~@4o2C`u_Ib65_~jPvXQ(FU5jpoVk)x@M2!;=qbt>a|VNq4|v47 zfy1HxZiV8aZwjRII;@my#~}F4A1RytkqYV8gS^Bl;WF_PMp|UQC_x>aj4O~RV8ArS zfAF)9@Di|4IAPA-)7u2xvz!JUKZ8j5V;Iyg)@>s1k97GrX==51@kR_n;Xa zy`LB^2JGHlHX3_(teDlKab~-R?#6*!m#mT8UT4iTttavuC=oG2gqaF{IslT9$w^ZalPWqI zc!LPJKsni=%SveaH&6;PCg#YvGbuVR&dFJDdrJ#MJ#?#-qao#MNNk#zpD&Nwdd*{v zv!dzu_gY0TdO{HDb{jg7oiq#ETYrE5AY)g!;>}9OT43Fx)xV=qSZX7^gP?Teb-PSySk*eXX#9%w923*7hWc?I+1SNI`gUGO!f|d=2b7r;H zfGX+sst)s9Sl^Y9x}h`TH~3GU zJi`^f(K_;g1<*XKVDNEbu+~^F^~ZldgO1;4$OFXa_FlV>GffKg#k<4a5|284KcfRo<0DD9B-KXsF&joCfIG;?;|(W|ScH2Nc{Xz(@;BC0Ww zpHQqa{!`Svb}cA#6vtZt04T{(Bcv3{@pb+M?d-SR7uD69A_@i4Q@JpufPOpXyzC-1 zw-eoaICi0npdrNi-f}KTJ9dL@8s@GbX~JmNT5ufbK1oCK*uG#O(3XPZ2Kb1I{%H>S z*J&dUG4P(&Z2pH?j{vLVRd1B{MR)3a#X8JuFa zv9J)FOp9>E7Ik-bQ)gzElz3@=Gitd;apYax+|%y4@6%@82wjwH7OXty% zO%pZeb`gzAyo@|1qKGfp{=a)n(k(`L^)A>Gx1acH-e9gOkZ7x2+F|7M?YsD zl2iEgc;I36yFpII#h&!X)^A0*0#Rm@PnlAyF}L6lE$InVRe!%H7vIZD7I4J!U85n{ z!DLdgFI9sJV!0DJ8}%vxc+3vB|PpRMy?qwERXzTGXL?nO*4Id{3xi3#bY_%e=nA~_W>zWTy@=PL#)96 z?}aTf74Dz6?dr3;kYUGGaqg}3gBG|Wo*6PDx-mP7l%3p^f0zLkv7G<1=3Ic!7;fCi z9L4n?3OdrU%CF4!(fb)^h=eReqoJUFA{X;A;3~ilT;Z~AmWcW;wp~#U!%y; zCvcTYTTiBbu_7=tq}`!7k4Iozf^C3DM8?FYq9cX*5sb%G8l6#Pglr4?4IL2x6;d0_ zC%ZSiuQW1*`x7u10yPBR#QD^_`I)2OiHAcetf?ENW^8__LSTXTOtil?==ySk1lwV&$pOHv`DieQ$dg)6;;7Acr>~pCW~>5%eS&v3Hqz2(RMrnXZw zXoD*6!Oo$2FnPKFxDL0ur6oooqsbnOhKCgahuICkObH2 zm)dTq%0TmYWQ-}|S{O9GFuF<72I}YLD^G4BZeY0+^%>pdxZ#<6L*{=Pcl?Dzn2cYa z*ExK*5a&G%r_=H>OjxjRBjECN>C5>Woeo6S`ZkSVHW)fRPz|hB81%phkfF141nkI3 zW*|H8USkU}qr%UOW`f`cDxJ1AqpX?@LaEBnF~Q z-X&nXG_K)lChXni{1`h?Vc|I*D2t;|c6}=93ZMe|f%(uyJ9V7&;RlG7uv5d1$!)W~w)A zr~01L@`B<0XGT50|M5J~a5&M(?F~Dt3SVSD(TR$wd+RWy3{ZiV3G9_gX1MI=a45k# zArgSKpk)S6FRqP=RR(=V1;S)GZsdR{cK#?14@YF}4mzsDC*ToEl4=wgoU~AF;80}A zYAtNB>Q=-4LHWf5O$G#1?H!_9rw>74`2M{DLnmNHgmWHORX{WNlE#9T2L%Cj|99yD z@(e}>p~WDOuz;X*7&*t36UI8D-Tq)p!6$ELkW(4@_G;T42ng{M@*K}4=1DEOx_K{X zHY>z^KsjmgF`u$vejsM+ghT~JK3mvz?it|HosNO+OMm|o;1q5LWIKpFSOTO5Sn$x! z#jR8r)+5HiR)l>S8XDaT4ljJ#kW=2<#-AOi2Zjxx)?MuJuM!Vn(FCGyT)$3%kym^H z9a{cJ72IOCtgHrb@eI+J|1dNQ8Vg;N$PHp*7ci{`vaB8)qjbnbf< zBHafEozA~c!mR;yzq5vzR`xf0Rsn#_mYhFo)NOEkVnw6r?0wfCE$Tn+Xv+v| zQs{AoV_@qBwgs^ROBr-QlMwJ`f72mVt`CwEE3%SX!SMiVkPsoHB7Yf?m{YlSiDre* zy;Et^*nmOW-X+Xx!aInK|1;KZTz`kX!d-(m>|M7r-Kc8rp7ZqAW&M+tTAjRpzdAS# zD>DiUu4wZ9Lbz01Gh&XlgevVmot6q=zhb~1QeWu#8yPW2D<~mq=QFN6)6fjRn2Nvf zdBl-u#?7p)mad%uUSpATy{z2b8Zh^EjjRD@($2^J!KYOjQ!;p3is$S<>}-HPi7}{> z*G&?62719PaeLEs{_{Lc5SDD(tx!UKZtA1A|A~vKrcXB*QT_Opp4NQ4H2#l8fL|eQ zNP=gv>)WpX#&P?Byy^lvL_lp8FLkO{ddhs(8w?ID@Sy|ibVdS%^x8_!=?_~9*Vcq_ zh`IkB7L1C!mbokmH~{SeQ_UC!OHfNmcM5Bfb7Jbr@cia9(J8hw0RAxJuJ)%Mk299f z5GH~fc^zP#Dl1M1GN8gz^4cYR70Kr?uYz>zhPFiue?IEo@FR)t#W4dFpaRw!l5TvQ zJZ%WW{<@^DYw*{uW3sphO8aq7P=)#9w{EhQxL-zcX8yfSOsV^la%yU{mLjWZvC(Y% z)8j1mDHr^MapecB9d8E7#+sUhEe@?u$XQ6E(Rnrf(~VtSyu0MKO#34>KuQK=hsQ19 z@+Z1G+sd_fEbm*lW)nk7@eN4KZTSw#SNB3_MTx;h5=j{5L7N242-H)AA`)yAcZp~5 z6PXe*tIxRqj${`L(-f>{U%!2OJ4g)`8Z9r-%gi|wP(O^OED|>y?Fv5E3M--|4JJ|g z3DIfX8IkVRA1s2V0Y)D1M7U!DdG94Bw880#!bxHvn?TIC;{zs42!4oQxbqRp=<`&r zO?xjNM7fzA@?ITUu8ChphX{9ZTm;`lJ;$V2k{OsA8jW!m+|Er~5&%|Pi&5SXCxu1S z_Ie#`)`K>ygEsFh#ZI!ZY9(CmfssIr@E}imkc}bwp$TS>ffV#|aWaT`F^q&jF9TCU zIKamZ?E;#69C(!%hS>r5i5m~l-Y38lT1H=ZrkUye^3l*pR*wCMtH{1Oe(yG5|UumouzmPu%d`JhukRJhj3 z0i7AtRWvd14}cJK^^&kcaGO3mz89CNK~;v?5JFN(i8L-CQ(_M*!*x*&Luhj$O+k*s z><{iKfd+%xLL!lJyIJ~4PiPP8TokG8yKdWZpbfe_=#;qhf&|+dJ9eE19e&7pOcW?;;27Uw?T7-x}Y4KPp zjBRbk07qWwiWOSaSat}m=} zl%7*j33+Xk{$x<8_Btqvy|^G88LdZvCu1z*61bSZ3T{CwAC?{(-C|9n5c7VTw}m zlhUqJFBV;3#MEn0WvonZoW?{2(mb?G)Jc@~`rWn8XkWG+#ETG0Tviq_5C;oS&8kt@ z6XM3mJ7}>}AN2fy-s2*1?FKL^P!dot-eqCngm+EpU#+#k%bYi;T4nv`ChNHsYAJvC zZO+5Z7sSPd>mBA0$KAN~WctKvW$EcAp)GMDCyB+}2oQ!w00kO5@WnK2fC;?3f10?Y zCd7N$7-6*7yWN{J_nB|oMhq~FJ5z>8SKmkSGs(U%RaA3Iz*k|O7GZ_)6$Ja17kO{w4nt!{S2taPxYYBV=hQCJTX=iT&vM+ga#nG%ELm}o~rr&st9hiu&o8U3w{&XDlU?Kz&q_c0SN z@Uuek+g8q&SFp_T!_!jcL!FOK8E`cs(FUgYsXrYyxNETS00}~iU3Bn7X(2AdIQiUE^Q~M07CW+=6|SPFJT2x0tcBw-oF(3c8r6MwouV5#Hb)LC9RVObVbEjWA$c zLXg8Y*dYxFQf$TuvN8GrIJjV4fPxU29rZY3l^r1cf)W#O2BuW_`ayo-|M;gkqjG>k zVkq`JoEgMq{;O9$U>e9VSR&k`2fOa|>mTU6N^utlaSs@Jmtf|&Vl2swh)cZC>dc9? zC#br($7|dfP8JNq;-)U3OJZ&SQ~j`9!Tm$rHb%Xj6(&?TSF1z3ejmXrU^Wu0NP3}% z60jb2En^L$Uw!R=!-N2v$E&!x$!gcoTn=B8LphwaHdTPjia7z)xu;fWoVzr8bn=pX`V5SM2{_qWf7xP;$;7!9ePSV_W8h=oUb zCGO>1w`yS$84V9&Zw`lk7y$*vtSIQiod;;~;v&u-9g&+|@b%%a;h;cWe36ya@Z8JuRalr$Z~_`zYolv_ zOL5-~tOgWdSa8*$a|EXiaj6jk2$Nap!$FonGZ2i%-hL-!hySO&GY`u-{onpgGt5}Z zzDB-g$evLomF(HGl%&$w3Z)_yZI}#Sj9r^3vNYYL+>N0#PPBkr-U~)3_WUqf| zNE#SrUSc;nSB$L+Ru|q3sqHPoZJwWI&=mJb@^EuSN$YqGuTLF-Bsed8jClDM-*k^@ zPYwPE8wF?}GhP{GL%M|kT+01e!!xL{*urai-(NspM|O2A=Y^;R`!RRty&39Zp_8)W-|^AoM2<67O1bQT8Ev6b^B z-cF1fn%^56y?-A9GGdV?W-u2|g=4~m}DWx&V%{5hC8tDZUH69xEx3R@~Fe%-sf0ysS&5jbw z><=H^fbe2)MBQBId1jq^U30r0z2)V~#E)w@o2gCiZN~(|o2>9qH)UT*l}*p7PVWxc zSWO7{?&+IYL^cxw?m5QueZW!C;=I{gF1cgeeShD%04=Ja+3wkC&p+rm>;IE#(*$$1 z9RnH`n>7e^3|5;4^9_c!k81%NBi(x3$ahdT^f)6ZKOUZuSE6CR-WMr~^T@Gy<~t&< zkU9#<8hM6jhyRi8^IlT_J!w0wQ^(f)>Cx*}^X|H7KSoWkv<_W2fJ!jhCUq%xpCm}p zmqUuE-ssSf5tbh6Zj>Hi;bV!_X}^9McTdnVOqp^3fQ_Cey`;e--Nv4zCqyU0AWYZ9 zCm^+igoD>m8sX}xPDOMLhnq=q+Hs9CVMtiIV_U>94@1{(fK&VbImJoCj=&c4t6bF? zLysTC12z0vacSorWI=cLI@wFpS%GAYp~o>w$$atMy@|rdmw5?46g*&};PCAeJ?~s5 zpv+cCMT9Vd4>R&EzyGH9RP_S$crp)F5M94cq&vu$`*UjrHpym15$?PE!BWAD`{PgQ*#v%U_H} z#e)mNsi4k9*ugO2Tc?;I&&}OV%7dnVXP=5~g8?IIz`*A^EU3_*E)9R4QO0DJ)CH6& ze7}ftWK!X=y=9BQ5`oaO%Vy&n#lZiYd$N5?>@M59=a2Db0EdZuY5CV0{nA{kfF8;m zCSV-0=D}h|7`24AVaz>`Q%`FmKt$DpMBD#(I~2aAtr*wuEgsT;#l-;)z~}(#A~<0( z6b7jX3emHdFBeVWCCey-!v@9tJ7mk3jwwS?ml^U1?ufxhb} zFTwB(bBDXRk>()qbfRc#S42nxC;$1{t)h$#`sVX3i_t2MX$(@SR2Y3v68LA%G z78FiY(LnCJ8(UdW@4v9EqTYn!tZTOh9w7%!@H&8J03Ja+sNs;h!J`s0Ba;2FBDoyu zxd9abFXHU;6B<*U_fj1YVdx8}#Ti82oFhpNS$`=!ofNklSvdQ1X4<|*L6)KX^YS2%Fn!|O5>GcIbc|D)5~&IiBp8>B+U&yv-7kc z@AJR2?1$K%0}srkx6n%ZBu?!Hro6SAW*N+xyaaFvAr18a_Obr%h*H>hviOFz(%w-L z!Chn+B%ESO_U0EPS;Z~3iaY2&nZF{U@46@Fse2!+&++oYFO349*FaT5A;o@YsVTzF zEiF4-SM=h=92b{rL(db)rg?XXMLyZ`n`^F3vV1-0BH?VaMP|+s>#Tw+x^Cy!M?8MzfCSghvAgkGDScn z5DRXN{WA_q|CzUfgxuh3RPWo@@TFRpug1U<%G6eSA7#AH5t5Hxtx+E}O_9k9+0nFO zVhi%4XgQG3&;i{vT~>dY)q1>f$D;4gsFg1-$`CH?BTxTg_ftkYbrlo$+0+nB5Eovd zsj>C&5RUPMh3Z1&!u*NaTx4;qjK(fOZFeHQ6jr!mSTaU9VWW8Yuu&cIY(hdq@nV)y z{d15l#(i$1Y8 zD?`5EOe%}HW@Z$XWa3HTo%$;elHq>XuJ%nw2Xji$bFi!xEWP~vd>k(hTz@&Dqdc+3 zbjT|U96=x{XGYyE%*k1&`tMY-E0CY?7KF_#+kd`&PU(zh7@!ORE$lQ}yIzOzO@zwA zJ_hXScVyFp%fmqezZnOp6h>$9RX|SBAw$EWUZH!iJz6F>enfd_Fib5jn2w1BaRH$a z{=IB1fcg^zDAq*GZU|DAxsZAe{EMK0g~ zLAIhcBt1|*6SEiwQU_tAe{z1HN=vg(s^0fEIrLO0%&i1(NM{iHzC(QEucp2`tmSmj zd>u2QnB>|)Yl=d>C)~8Rp95XPwS&6x z1XSc{QO~_Ty_!ikPeF*h4{OIy5HIs(ow3~_z!AZ4%=pYkdj?X46a#3PpG6ks0ueBA zL6ISE!hREP3q(OQSX0%fEUHehn!qtk9O-|R5_gCTEzl**RU|3zf|Didn)Qvl6Ph@@t zm5zL7_fq8_nH>S3$B_parpNRnqzgSg6D`7`r^U{X>pb99K}qY)-G3M{eLCzm?s!*{ zG;Gwc{F~)1-v*^{u0+wOt}5fix#-<8yzY!|p(r4D$;BSZ@zvYsE~oCA;$*%Emd@W` zm>I5=2%?mwNTF_~Awrn$lf7+R?1M%b92>0uDejmJP-qG;i^7Jf|1Z^H)L;-Ej`Y`} zr$7xIPG4tcMsySwyOeU+BB3Ur%mT>(v7{4$*H3-V)+R*4e&pa$7vQhR=oxKDM*32s zFqH?2KPKGN=I|8YqF#jJobL5B{z+4x?7TH)nS&1C?g(;nT$uNu)tm&7N%NI4=%!Gm z0;_%*B1Q&2{VSWj%PRC2#g0C_{^|nCz`hu)c7K%QqOts1g4GqN)M8r9wC5M2l~dJ^ zC59w6PX={6uuh1XksAslVjv{<@#f?D380|%rG0%%t7oOmA2EPi&CkOF(uD;q;g4Xc zSbX$`N&eJ4ZwZCW!s(%%8S8cwW@YT*%;nNtgNvJWw)z~B`u6_TPlz)CUQYhmvgJqm z0cuOOJ|HmKVaSoTS}t)`88iumv2UQ8pqcX;srG1y_$sHIn9d)t_N_SdT)$l~vEABa zX7s2o)E|Ya5vE%gsfF~6OkW?%wG%GcE0$+JgZ9bfLyV-rRrl;M;yeo9O&}W~-l6dJ zstvuN?|a$PuSZm^dhu>c1AV}13IfbCKxN>wKt0TO(lb{gLm|SMMp8O(Vn;#GM&m+7 z;U&NSv&mLQ`pgf3Ua70#$$*=-dLCQH*!f#yOs>JNspN|XM@dLmBTO^a))~`kicOX& z9V$RxmQ;{()x0$b;n)tsI<$@eio$#V@WP6A|*<~A8 zVR}zIgIj#6$0bbD@a8%j_ij}E)cLZh&8I)!@80ge^ZD~Dp|VU6*CR6>d!U?`&w zuMgR!d3u4Y&pG&G&dyJx{6*cRp#g%;WEStmpYd144Wrw=VZ9DL<-~Fa4s9*j8(5XD zPN1@Qs6tbrdloJ>-)3GJclYzVNa=6hgz5bdOJrR=ZXQ(ps@BRX44bJDB23qB-TGu) zfSmGzgFr5$%md40^vKAV)>NDbvlG;`Y zDUWAey%DXl8DBe4J2Nwq8yE`7FnCM9+@5jm47dZ_47SHJd96S&=zi}0+Jk8!zaNj< z>V}LEWx0}a9i=*RlwXWh0W}Cl8KdV$j&Nm7S$kkl;nNB|*DbLn+Mrz1J5@N-$OE=Z ze~LJc7sR%0*VK32molCeY-;B$%lCx}pcbk`ZPGdj$_=E^k7AU_?EqPAY z(w_{ovD1LW1R%!Ok!}IFzk&Hqo`G3{PpV>oe`<4js$c}O=AVTmSiqPd`NS_kQTBD# z0rLp~a0bc5aQfIAqJE?z0PJ$40CUNx$KanS7;7fQA)!1pANEvQ~vWsZrNIo0Zt=mU)OM}4H)76iHPsS0a zl|loIVBswj3c@6_RKOe9yD%p+_w7Z19%PZO*QX1sI1`p$KswkKi35G>%W*E|5vB~F z;HGJ3zQdnNOy7xVWN{dXZ|L1wBz~PJj_9errdwIM$LD-M(vQb>8BqG zYdPT$BPcRSkH4#&DPi=r+mTAiqDmL~f zV|U9?mX~u|#P^N?D=mTI+My(FixM&ys0N)1sSk)>xPgj-h?1QvRA{qTEskjx4o_k} zua<3-<-_!c z-Y(|Iq+Uja>|-K@h_s6r2c8Z$jme-5XNE$P2Wbl8F1(4k%dfAw#%rR+%N+ZHPsRAD zx{Iu&N;eXT8(A1J6n(ak)sNnH0Ub*rh zshrk`2V*Ktp8|J_(~DC-&5q*ZLGm(<2rseyIy_3>k)hc#UO&JgRXfK7Z}^Oj^?l|` zT2kj*bCcIRah;8Dwfe;6Fvy;ta0d$wh)K=l(4SvrmF_Sx7>1Vvt51x(9i(-Zu`I!k z;2~tt`S}Z`hmtc9X@S|D=hw!O6GG) z`rOI6>F}+vQJ{_5Kcu*TlWo&hu5HWFXgQe>vNfMub8e<0Edac#K0Kr5aNT*XR4dv# zFj+tT;%e)5dPG$D%q^2woE+-*bnOyixQ*~g#zW=wkNra4d3&GVw*35RM7JtT)o^Ws z-$L~Y;&x@lUB$aA6*BR@mu(UFfM3ColbTTuJL|=7hL(ny*q_oYCJ#(tFcPCKLnAFzWdatTyrWZE^0+J+_v`ip|D7@YM4||@eEsl9n?7OyU zU7caM$I!B-&!eg;)+qzVDkDvxXWaLHhb#xx7|uwA(rYW9>&&|NRC~*w$?-d7&vdrU zUHE%;nPtvt+W`lH(ydDCnyMDs&{h7cPnRO?+;w^%E?R!rzT!836C3MmyJ{xpc9a~K zat+FafXp>nx#}OiraP^@vdpX|y7xkBxwxte^pAKH6Ssu9a)$cWfo(qt$$`THo|X}w zL#}+Rp$!J5 zojqF*kkf%pI~VUZ7`oG1cszl$(Upn5q21gY7A;xwtl4eoDw~&vb&9VJHKE1DoXedH zd4N`EFSLirb;LNHa-AyH{Pr|xwUzeneynfsk@n%shphbc z{XI+`R=6>9fSCfxoDmFNzbK<&*G*ODTiTN*@y>xdVC#w-9Ec6)^xXkYW)15B6(_KF zG-?Ck>_IkQi-_t3^Q})W?PCC+0O<(U5IdL|Gq=XVt^x|zu z@&?Z#NFaS`u61gg0$pBQmukJdW6bJtr_xI~wS0UG#hmig`o9UX@;xzhAifT^?RsZu z`8&7-22U0$O)7liL6tO0T++uV5$>Lvl@l{amVvvO;(U(GGMG#x;g=(Vr-y+iD~om^ zzT1t7T6OYI)umBPknbeH))xX7m)@hHcxq^F@Zy!2)0N z$lixB>=V8-GOr?x#HshVcU1fMbZ%nB!krG6T*`03@0yRnrlm88C;Uw z_82|SXK3qB`&U~t%TH~LOchu9C^}3H%|>{d@iG}EFKlT%(eD>HrDigjWB#pRgCw=o z7QCx&=qvMAB`MgnDfck8f0EJnTHcv!DR2peSk|aXW<(+O`r_T2JqDY(j`@HFg$)cJ zpTJE~kuj(ci2vLV*Jxt}(zwb61A+9s?lfWvO3FG)QI}(#U|nY7f2uB{OA`q1!Yl6* z$L$S2_cu<*dXb^KxGQGC@#G$nT%34}no=0s3wsP)Qoz8uGji$O!ITuVF#V2D+D`SX zjk3t08-UUAh|Z8XzL(OnB<$+d10cWT#5P}yU5h{d=rZj**fP>w@ODvS#;z93VDj#3 z2AY%V=Q~W}_=+2o!9z|jyn@R&JsXl0F4cftKp*MlRk*l}@#|%otT(Fw>De(}M#KYy zlpA z+J4#rp-2G|1#|fiM^zYXK-=iqEDRc$KH6sH3X@p~A551>F}mqdn333pdJ98-GKCjP zQBg>PYg52eHZm#&#LY@=mA9?=%`SHI_?XY?N9UOv^gA>sqaa;#d4f$%aFbu}!kgQI z^@4yFQ+bDC%8(JefdefA^biy!Uu$bS2CnR@g~%Gx>)^rM z@hZ4UFf!T!B_A<1GW;q=ICF+mrK!ZLy`z5OnDKxpR@1+GntLwqTCW+4%mR*@{ATxg zYJ2`z)6N{2zL!&Mh)v;bF0p9q9v`k9y=MCO&+_w0>n>q(K6a!Yg2>D{y}q>5#rOZ$ zo64i~PaWYxy7h*q)dfqbx-H(_$!JGj-Hu_QNm$*x>G%xHkyppr| zofujnJ8elhXpdhN8;prdlh3Loj4~nOjE%4E_$sgZ^nia>hTsKFe|4eivz3{dPm9vV zZu|CM#8`^iO;KG?h<9zivUqdHy#>ZIR6L*5*Y6TP$Z*~iyj;16QYTg1HF8O#<$d`z z?+$kk{?H-%HMiV6hIoFC@GhL8EUc|7>gG#6_RN~0;Icg@UpH+~40UB7+;qZ>UjEPLh{-(=WN;<D$!YT-TjBn z63M7x7dl8T?A_Z*vbST$K@v$9zWA!Em$UzU~ z^a%l!5YlM)B;=Tnr_cUBd4Nuhh7!rgxiw3569cBKsH$a&bftQF zXB3Z8e2#Z;*WvTXpB8<5_vJ`cxTl+Tgw*GFb@x9{?;CR|+bB?RGT%pSwnmLdG9DcX zB^$i9A@r3>ng478Y|ZW7?5VDT1y=i$Zm=j-+sS^6h|?{R6(-eUh&}pd|DsZ8h5qIg3xdaMg;Cnns*@(eQO-rmMA0cLftc z+fs*9W4fMpDcO8^XJV1gAl?3Tg~?(I3ES}9A7j(RwFH;3$iV4qpt^d}Z3RUJOp%2^ zWwX@`&m1~*=;z0G?#w`1g^oH9Xy<39l#ic1TQL;OD>5d*yJ`CEYt8KAQ-p1_vhMLmm0%hB2 z-?!QpYxDyWa$0sb6&|ws;Gob_Xk__i*%nWCpLD6|!1Icl9am(2wwF%wsW)z^v6@zN zzR<{ZR9pQsE$v^Xo=t5_PtAPs>HZRp0!MdUr{soJ$nYLCe>!NC@iEHMv&7ybx!An* z&5O-CJ6`|&yMu!Rp2riNQW|V;ViHIR08BJeUthn0Ryy>chR;-p$?%sp(#oPM4F&v- zii&!NLO+{Pi+@0Xhz6KIOio^_1(|W?sdr)(2Ml<$NGtgaq6(6*Lim8vzCUxA;!;_d zz}69_xyW;9mgh6Hg!prYONew$3~NkLWjHnEJ9X&pjQd6@IN0u%8u|0BagBzm@%b~t zv)TbB<{woY)2 zQdGz^znGVJ7*uJs{h~R+=fo| zgFG;`+vMmtAw4~vP>R*^e6ezqCY=I-qU;=w%d7~~tj7%i4!R(*ACyXE(Al$3xP{lq zBfc~vC@MPoDx?)oX0}1~Vtl00bev>dtOJu{*4a#30w$<->X!kIeZ^9-opw`C%HrZ& zYsSy79CGda#xVJbs@NDf0-pt1k8}!kar&pID3eiud2|89rY~Q1vOW6#}4N)ow9>=hFec;LgR#IoTK++e-e#<I4~O5D-tgKq-pQ-pQT1r{Rm-|BkMl9pR-k#NIb zY?YJwoxePbkna#1%3++{C6^JFiRTSG-p^k;UTf1f`=1Uzv~&5@p|O0R^26&xFA`#9 z4~S0Wr{P9T%Fs=pQ~Osl#Z{a%9{LzrPGieXm%$a4l?u>qn}+DwviuC}TZ5q;6mke) zZZG6@^Q4>>wq=M<;|H3`2}BgKpg1$1J~@k9g+{$GIpCDukef|11ZTUEe+3?Wj&@%_lyJXa~&NQyhVblw> ziIFxfW55lpY=+ZQCZDj;-d(@*!&*pd%NTpS9p0Pq*)zUCG# zQ0J?vBNmjuh)_0~*vMU1jOaakL&L`Y$Hpv(iC!6=6}m*rD=9kQb?vgN2Q^pjX?8E! zFO{a`71S3NcqAKHPuiKhEIIG&?dT)J>pbj@T6W1j3VlT6?&{rowlv$zx@_f4t38iz zJ54yZFSu;pnEzRMac6?ML{b-cJK9LrQdsnHm4m0|g$}Q7SB71CTNyU{wL)jmQA*?R zf{I$tGX;v^6pIt&L}kR6oCn8rcWM4@Smvmw>bUSy&ZB?+S)H18>(Y;#CASXD^Bm@T zJo8FxURF`>5Hml;SLf95z4{^iOZ&~;Zcb`0>)d46>3Zk<-&MX