diff --git a/.gitignore b/.gitignore index 32d8f74..75836d1 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ /target/ opencode.json AGENTS.md +.DS_Store \ No newline at end of file diff --git a/SETUP.md b/CONTRIBUTING.md similarity index 59% rename from SETUP.md rename to CONTRIBUTING.md index fda2524..5deb920 100644 --- a/SETUP.md +++ b/CONTRIBUTING.md @@ -1,21 +1,47 @@ -# Setup +# Contributing + +Hearthspace is early, and the architecture is still changing quickly. + +Contributions and design discussions are welcome, especially around: + +* Wayland compositor development +* Rust desktop infrastructure +* Shell UI architecture +* Infinite-canvas interaction design +* Workspace persistence +* Local-first AI systems + +For larger changes, opening an issue or discussion first is recommended. + +## Architecture Documentation + +As this project grows, you can find technical documentation in the [docs/](./docs/) folder. As these are not intended to be user-facing, there is no website or rendered version of the docs. + +## Setup This project targets modern Linux systems with Wayland only. The initial proof-of-concept is planned as a nested Wayland compositor built with Rust and Smithay. -## Ubuntu 26.04 Packages +Ubuntu 26.04 LTS is our development and runtime baseline, and it is expected to have the oldest supported version of most packages. + +### My Environment + +I develop Hearthspace on Ubuntu 26.04 LTS, and I run it in a nested Wayland compositor inside a GNOME session. I use Parallels Desktop for macOS to run the Linux VM on an M4 Max 16" MacBook Pro. + +As such, while my CPU, GPU, and RAM are all quite spec'd up, the VM is not a perfect representation of a real Linux system. For example, the VM appears to only provide LavaPipe software rendering for OpenGL, so I cannot test GPU acceleration. I also cannot test Wayland gestures in the VM, so I have to run with `--scroll-zooms` to test zooming the canvas using the scroll wheel without a modifier key. -The following packages were installed on the development VM: +### Required Packages + +I develop Hearthspace on Ubuntu 26.04 LTS, and the following packages are required to build and run the compositor and shell: ```sh -sudo apt-get update sudo apt-get install -y build-essential cargo rustc rustfmt pkg-config clang libclang-dev libwayland-dev wayland-protocols wayland-utils libinput-dev libxkbcommon-dev libxkbcommon-x11-dev libudev-dev libseat-dev libgbm-dev libegl1-mesa-dev libgles2-mesa-dev libdrm-dev libsystemd-dev libgtk-4-dev foot ``` -`foot` is installed as a small Wayland-native terminal for early spawn testing. +`foot` is installed as a small Wayland-native terminal for server-side decoration testing. `libgtk-4-dev` is required for the built-in GTK accessibility test app used by the default `SPAWN` action. -## Xilem Fork (git dependency) +### Xilem Fork (git dependency) The shell UI is built with [Xilem](https://github.com/linebender/xilem). Stock Xilem cannot set a Wayland `app_id` on its windows, which Hearthspace needs so @@ -35,7 +61,7 @@ winit's `WindowAttributesExtWayland::with_name` (Wayland `app_id`) and these dependencies to an upstream `linebender/xilem` release/rev. No local clone is required; Cargo fetches the branch automatically. -## Linting +### Linting `cargo clippy` is run as part of CI (`.github/workflows/ci.yml`) and locally. On the development VM, clippy is provided by the apt package rather than `rustup`: @@ -43,7 +69,7 @@ is required; Cargo fetches the branch automatically. sudo apt-get install -y rust-clippy ``` -## Verified Versions +### Verified Versions The development VM currently has: @@ -65,9 +91,9 @@ foot: 1.25.0 Note: the pkg-config module for xkbcommon is `xkbcommon`, not `libxkbcommon`. -## GNOME Host Session Tweaks +### GNOME Host Session Tweaks -The development VM's GNOME session was configured to stop intercepting `Super`-modified scroll gestures while testing Hearthspace's nested compositor: +By default, GNOME uses dynamic workspaces and scroll-to-switch-workspace gestures. These interfere with the Hearthspace compositor, so tweaking GNOME's built-in settings may help fix the problem: ```sh gsettings set org.gnome.mutter dynamic-workspaces false @@ -86,17 +112,3 @@ gsettings reset org.gnome.mutter overlay-key gsettings reset org.gnome.shell.extensions.dash-to-dock scroll-action gsettings reset org.gnome.shell.extensions.dash-to-dock scroll-switch-workspace ``` - -In the current Parallels VM test environment, Hearthspace receives `Super` key events but may not receive touchpad scroll events until after `Super` has been released. Treat this as a host/VM input limitation when testing `Super` + two-finger scroll zoom; the compositor code is kept aligned with the behavior expected on a native Ubuntu/GNOME session. - -## Smithay Probe - -Smithay 0.7.0 is current on crates.io and requires Rust 1.80.1 or newer. - -The Smithay nested compositor example was check-built successfully with the feature set we expect to start from: - -```sh -CARGO_TARGET_DIR="/tmp/opencode/hearthspace-smithay-target" cargo check --manifest-path "/home/crutchcorn/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/smithay-0.7.0/Cargo.toml" --example minimal --no-default-features --features backend_winit,renderer_gl,wayland_frontend -``` - -This validates that the installed system packages are sufficient for a nested Smithay compositor using the winit backend and GLES rendering. diff --git a/Cargo.toml b/Cargo.toml index 409523c..08ba242 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,6 +3,7 @@ name = "hearthspace" version = "0.1.0" edition = "2024" rust-version = "1.93.1" +license = "Apache-2.0" [dependencies] async-io = "2.3.3" diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..41bdc4d --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2026 Corbin Crutchley + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/README.md b/README.md index 94872d9..cc9768e 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@
A spatial Linux desktop for persistent, local-first computing.
@@ -11,18 +11,22 @@4+cy?r1%2zx@yHtYbd+y}_T5tXv?E1v~w(M^{>sgMI^VcWdUa~ qj|K|J!`e4Mz{W|`h-`xUw$pSqG$ir z8GKhlX1f1x^grO9xN1+?_26IMzAw#4tI=5Y==1T lzv)$UU1^@+rL>Y?$O&4 zex7nt+tZQo{dLBqXTd+pX34HoHFslccX7`=_ejfowS7!<@%2;>jeipBUtV(XVc^X8 zsnS;%{+(z3B+)&2O}l `Pmjrw)p10{(H0kd9d;KPm!1GWC+Mp^E~ AzX?bO#T zYDRXI3AwAIURjiAMoyP$-yL|$Zf}1}5kp-#zW5OWO**f0oL>Y!bAa!9>;n0iM_p?t z3;BKVNCDS7OvkUWoIZAjZ>!gW !#jc!{-qKamR0X|7%_) z_s~g`@1VV0PT6dhGYe(YE(_-62%6u% Q9Y25nZo`1PsGrJJ1IyKmTR zO!Y2#YoGbEaRDE@nDrjh*KcNCmo-ycd l|m#fTjAI|Cz4bDxP;( zW&R=A&Dw&FjowY+2Q9y=pZXH2dTYkDgcA2TjO}Ot^8EQ+`7BU5@Pqeb;VJW%wjVQo zYIq@f;SA#gqKpqert2Invwd-H#;cknccu-P>&4igW$D41>5S 54?M6&KA?|o4NWywOQ|%d|W*5@A^v%6+XS4&UQ&5?Amm`jVhh66@S>h z2wscp$T >Y?eC90kkH>z5FZ^nK!}0-^kb#@11X?>{#5n&t zD9o7|7&v(rNNn21=Z8ON6(2G%FzGnXz5@%`TMWnEEp&{P?|123_4MUJNB7UZRoZg* zPhIUgQhoIGqP1&NR;{z#aM0eue9^b$tqh;5%`2yUNx3@5DOvyfe|gTRyxRKQKc1{h z+NI6BWX>oqW@O&a`+Lbgr7d%Fwx&JFt+?j#(09Vr^1EH!r3+>@?7Dh9vp8wOg#ULk z3v;GB{gB?Y`D3W&k|&H?G@`aiyqm#e!&!PiM(Ll}p9iPU?P5tSVcr(KeEF&cH#&rB z@|L9vy-C 4jWvoGB3wnqL_?e~|FOKp!%uRXB-O!MsEEbVNQkgrqU zN=*p;x$AnX1IO*+_MPU-H&|RL(&sa{t<#ao|LvaPWO==LcYi1AMJ}l7V4Y*qb1l?z z?F)} (QO3JnQ}ENiX3G z>*-(Pc};<1&j$BDzIKaruSDtk@W0sb@lHd;gU!=Za+*@tuV+8|c*d-nM$7r$GZcCl z&z(2_xZ6)@mlp31tJ(*?$Lp5XFFa;^@b%{YhGvIXecDPdT?-VH_iVEK*K4^ia&5s= z>1qkk;dz`-H*Zi}WPVWUnL fj#E04Zk?0oB}X8G#WghX-hk#l&G z8S^d%1_oEh`M)69KxP8h8gNm-RLW_sWiVB1?%Vfsg<@JaCjPw+se7 6LQ=N_x!0on{Gc+;_dufF*|+hL@t+Oo60JVAM8A+y+(9~!PE4!Od+o= z(keB3?gTb0!G96}GlMy32dN?BJZWg2VEt9o!h8FoKi)jS7s {#w3(W48JKW6e%?>i_Wxez>x#lX)GiRDtJSBnBfh1L#D&d3KN>W@a$h z{w?zAIiC6AmcIoSbsXB%7!)A8(>#8`r8%(+=Hv4Uvls&dgBjzzSa28%Ztpnf;yQ;z zoR`}P)+#}=791 i!iQE9Hq1C(B(TK8R@N^tkkv?^(RgqWn}ybgk>( zdn ~(b0qtpUoR 4*e zbs6U!hxmyI4Im$Hcbs(w oSSsK7r-?njI1AET*C)WFyZNDx2!H8YU zdDqqFfB*CT-e@WK*!B|pg&z%9J2zcQoxyMM*LJ!_O_ )HG1B7G4TYI^SLwCr0kuRE~AYL99l`>x*WB}=1CCB!2-e$Biv zGxYVl)SULDdeJ$FI TOzyl(|UjHj0;yUIXo*=>)Oe<=ZW0A+TH(3d~N+%7cTdI?}P{j zF|YftT=p%@ wEDT`L$5fm@};}I ?U-iZ-PwG95WUQ+bU*xS57v-@#E+o)hQ2se-huD>fnUgLFynU7% z7q>;&_Jnqk&(q3tXa3*L-_xZ#Q9*NAWmQzde}~Ij_1x)C6!UY$>{Svo*ZmE>{C~cC zvRlWy%O`7hPOlGPi@G#x^*nF+@+ &Ex-aoPU_p9!2 z{^G7{Wz84f)(N!uV`H0r_O#u)Q&FscBCfSoi)Y)eSh@1>sgsHNj31XRHC||#YtVb~ zL}XlN_YKo_j^o^3OZ?79KIMEip?{{>+m@rgziUe+makY@W}AGhAS%iId~9}5Q*D*f z7wMapY3I(H9K8FY>Y+({Q03m2=~bJJeL|M8_s%@oc7*rl;igOmg;O)cW9RrB-}rLf zmc)0r65sIlb1QMPUpw_VCFyCac~I_O{i931e(}BA`S0VU38@QNek42IO`4)3_NMC~ zcmEFaN)M^Nr)f{crGHH@-B5HtkfVEDvX!_}+xySU=Khl{eLh|KXm*;_Zc7W3%xCt8 z?-b@tJ#(%*KFNk lnR?lA-YZanvQti^{qGn4BVXEdR^R-yt>x6N z?aF0#6P`|IU)FW=MW{u1HT#k2k9OX8`OfWAK68YD_&$f@XLdv_at;d4neU$eLWB29 zbjT`(%X_x(n fh{)GS2$ kTIsuf zQItG+ZU5bqx2#T_I>~LhJom1PPl-lgrr^Cv%_1wO>1#grH!NYgA@L!OJJxXdbITel z$I!-jQ~8b}8@;j%m7ffcrHU+37W?8j`<;pLqBlNn(=*;L%4W-C&XfLrBWCsCaPGxi zVRr*oGB7YyG0x|9DQED@skjih#%RKZ*PtSjf$L?>`z@konZ_5kG{jh%pMLP*q>rom zaciHddbc-53wM5E^bX JikR2Dz}(mRED!6mOa0d~og!Bq+M z^N;4 fWC+&+(>$7`v@bBeG4?cL8YVAt=Rc`Q2nb|VTqvhHf zuO>&M;FGN_mh-pjU*~cX*ErW(C>g9EbX0wb# shA%`Grhi zGRHH&qr3SE`TyoTFe$BnxqWljg)F%PW}7P|b=T=j-dp}!$o-+fWv&FS58tGl`wRMZ zy-k*yaC_(Hrbjn2^rT)gr~Fr7`~Cjpq+Q|j-(B7N<7sf%KE;FUPo{EvtL3>YP0Zoc zV36hO&0sktzHD>8TtLcfcr#`@uaW-xt@0g7zn6hm$}&cMs5W6>;M#U2sZT4Z*?adR z1_mxp1_lOy&|s6OPWX}Qk&e^;sLj#ih0SbnT~-Rwl6fDvs7G4(GyA_ZE8ftLc%}ik z OTP4)|K0pk0mA7#NtWk%yONUf&nu9dVh% zfo}`9o8HBFdmkUxU9(m#apC_b6S{9TFF(0iH}cKpq#ILSvQ%byW(R()yrRb4!#UA9 z;9rJ?(uxnCGVigac`m-% 9cF-eaR_7`SCqSHr45j0dZuV_OsCY^HK< zz0I$G?nKq>YNPD3qvuom`ug7G9!hoD&RnQ-CH4HA+w-T-`!gY-rGQl?; Rirgw}7Gp)PoIQoh2$+On`K zdv}$l3AcT%Pqvw)e_A73>U;2}u!8E<>=Ds-{x0CPNt>N2v0|Q4?-E;~DaO2w#wQc1 z^-E^oR+9>5y<^89CFr!BX~i#Rei`@TDg!$P#c!8)q`wJlU=V8lzES1Ug5 C~>~#(7t-gbDHLDhTB>z_SncdPTGbYdWYw><1eE64eQ3&-Tl_ z9NMtwf76_l)Ke=!DUZqW|H;aHk7(1A+)Z-|L>oAyCr6sPEdzHUK^Xv?zEK!IL3za# zGCsv&;QW$_$?2E su907Zl2EyYPXX zaq)UT*;U7ulqU4mE|t~*o!E)#2CxXDI=FW;dn)Mc*oTb$4)RsX>+QbmkoMOXZV0q6 zy{xQU61Q#pnHAF<_qw{@_4CY#Ob?XeOV$3bvhP%K(X`oz&C5exdS1$3sg=?&(X8$L z-4vOYm=ij7s@az+b9JAkJys6ban}sD$0R{V#~pB-y%Th*?Cn< v(9n; zb?{-eJi68ed%V9N+9Z*uaxqjxHY;Ij+513&Ppw7UWk21>O7$(;^lab09lzbnmevb0 z nxikzE5|FiBqUAQeDF} @^ofG5y zZ=enlqigfKXx=E}l$*BB^QSU9dDqN)k!|!m_#&Y>WAGS(HRJprF69h-f?}slE39|@ z)5%@g!nl)DRbfXHfpB2bV_;xd?l}7|sG7c$XIGTPc=~|M#suZfkINdB#oRWzIOU3c z`4;KA?$}AO`OhtU!rX5}-d?nH>TXwqEge^$KGR&a{symjT(MFeS5RX6G$vK{6~Btl zTjg@Nu8roB(Yi8~?Vi{Fj(6gZIM-a=VYMJ?bsdwy>eB`KzqcO0o!~p;%!Bv(uOv5Y z{g{*uZkeFuIB+n*MZoLbd>!XWgGRL3_*V$MS$1-6<`eethPfN0uk=s-^|}2ri_x^# z9Dm$Snr~xjLn{za4Fj19-V+qaIM1rYy`G(O?foLD)p1hJmrjYTo6h-Xo4}#9RRve$ zYQ=volVtxTFWJC&?fbUvgdEAhVadS2V9Pkq#-*I?-{vx13&G+=iI2|gc(Y&K{s220 zf#_ghW?(9ZoV5!&8Cw5NcH&9L7X`K3?gsWS27Fo4#o@sAF8TgilP!H3it+PI%L I7jr4h5`fT#K3yoT_6Bl3nc;%b^^R0xfW3U39&}Zm4FCNtLW>b~QUk+}7 zfC30J$Y3JiGc=7D=hcCNj_0b#W2H~{mMTJ>A!`U(ADKW(haPk#Ln=6R7R70nP7ry; zczXZkHu &zPn8P`S=PJYrLOb2N$@DB{?}uiuSKdy=j#ydQBdqTIL lc@`hresoaUH*+o3X+;rOIZ$~7p zI(PR8>&)f4dj#v4w&>{Z`gc=L{ZwV9P-bp!_fr#9r 7X0D89_~I~?jX>$Hw4@Y zKBv^!arRD7Sb kT@MM&yZFX z8avJcSB0d<%pk1yjG^@&>7E&c^_?-az9ZQ)gRxFCMyk_D$}{r^VKrt9t;R@?8F1}G zTy};Q0Fb(e_>xu^T=@`Z1-QhpAXv{-+ c`tYu6731{u}o1_7Q @ zyZEBM;&a7yHvX{M*t|uPd*U7+b$a|= N#c57tV z5g+$jY?Yar%nYxIkF^{;?0Y%byc-!l-^h(&yH;^bBSgjK%Z@3})v6Ch{=fNk)>M1N z@4r8H&WPJ;aeUjAHg3&_y0>@T__*ct5_h%>TQqv|9!MU(R_gboA^lj@-bp?7k!yd% z%C}DG4{G`6n{s|HpJv~`XAfdi&mWOBnr9$?;9ATYxk>xxCVz`7xawnXJ1>}NpV~^U zoGsz|$|8>b)IUAH(J#{{TE*A>#CNp_6^?>Wfp<4askO%iXbP@K-F1BG`kKQEf5akK zY~9S5Pfo~|H1%GmnVir2Lo)iGMbX7)o{29MjgC*1&iL<;yC+C!I|vSKP00JH#6H zxM_dR;yq~2vqWdby5qmr71RlO&bPZPU(@bvXY)#6qlWI{cb#7TUgG?l7F2%z^HJp7 z$+Xq4kF2zeFFUbZM*I7m -Lri{ucUDAA-k|ZDeWaD54S!wXL)<_ zomKnJ-V}~)&$?E=ma2&OQ0!DA|Ekn5?k%^(Y|byogq|D4E^rh4xWW6)VTYfRXZu(D z+#Jwham8$3m{#PA>)+Pjm6S|! avt{ZNQ=_u}B7#FlT zY4N_|wM>#Kw%wD0y%*QI+_&qfU-_KD@!e{LpkVjAJ@ap@di#9Wsuzkr^{3D18QR3` z&0=i(-CijpS(dxfevwnk(m9Kc dFn#1Y&x(kdOOJ*>;Osd?l zkh$pCqzixfHh-C_`1Qi(1z(-lIJ3K)KBfLu@(-Kx*Po949;ZGE-@6~Mi7Vz)bhg2? z6Pj`xUiHS-J-620b1~k}c$UCoxA$h(OO{`8>5{D8*gh}KFfPnCA l0sT1YA9HW)s8d z1s137-TeKbbQhccy!wAF??ZOD9NXPD%Uv(k|A@(wn0<9WjI=|i-xIxE_{oMvHjy## z@mhv5i|eXW&CRVO{LJbt%- U|QtGV=#%;!zg?hA4a*F5Xm+HK`_X6~}&sM+U!#jc7gS^K}XOq2W%Egyjzhk|U+++|C|4P=FOX372eTlo5Cd;0DT5>pS)E>^iE*sA8&e0mb2 zk#TeX`G9E$nPQ|=*B#z-bWV%i8~KR66SR_bxAUB}nRIzxfV*R0&i)l2`u4cEJX;pY z{P4#7X98xs=jH$54y&GSbwR(5$-|DB_tORGJ#QB!gowUQuWp?9?67qCPKyM0om=aF z+ (K##N_Zr9iKbKdxt~Rg{4=>*&v(7m6P8i>Y=xvHeyNjL~AAj>S zZIOKRY2TNgp}bGqn*8eJQnWAp7TY4F;!=0yqJtLi#08b>%7t^* 3*ubR&3FIRSN$-VS=TJE32YuHUL9$>Ow>Ns1wzrp(D zAG_vNE%Op0>b^b5(sHz2e{Wm)y~QE>GK$upO-qw1XYdeOFJiFVx8<{_-jsal1Fbjj zGYd@go3`Wt^Zou^+Sy(lKe-Cs>a!PdWvqE^AHZ5AyzoTJzektWzdb+m^xv@NYJq<_ zUdO91DO`RR!gy-$@ntJxEP_9FoZDyR*6J H%73*LgwW)uj+x{pdy?5Hnv1gL5v1U&x&)cm+HMdMkSWjl%uGsU7{~OQcbn(bw z!>}g*sqtFc$>uDJ<3!mNPhZ*>Q)c)oLx^*Cvrl8ehhL#e{a*}ZpFdiows)Vx=D!MY zMZ){lmg|RnO|H(J Kk^&eaKnLFSY0WzOLh6zvp#r z>M(yCEvC0uIBxnn$&VM4TWlWuU$9Pp-fp=$D{g&V@6-}+-0mE^X7{c;@4x<7C^7X> z{Y=J;<&FVq8MS6g``5-;{l0qeVU)N+#`RBKB^M4!9PKr?y1aE?a!2zmW4(W=$2yh- zTsrpkxuKEQ^JQyW=R7WE`gwhh)w}w0G1or`#OeR5xP17+gQ}I`CvI%>+a0>{@*a_G zb?FTY8@&}5e96BN>1^z^@U;0tzQe1|@3+f6`1G33*Lf$Nzn7l+#n@QdC)}~{p#9^^ z{EZ>pil;wL?LH&sKJ|O(2bEI2NM+r|=)<+j*|pBI9)9?|Auip);nv*8$IjhLc+&T- zp7FSQp6mPr(n~-sY8Rygf*rnFISd%iZZTnya1c>Y&k0$y|9kX3%Y!CN5^q>?u4V*( z`~O F8O<7WOW^PNk9qv2#*fNY&DEQ_@4AiB zyq}Wg+txqZVEX_0Wv0@J%U&?_PkT~4MXlazm;QCu4@G`9OG (Jd%;WnjOX+JtmjiWG{wdEr2kC~v`Q6z1o9hl16K^RY~I6hUYx6_PC7!8 zN&nCb__T`k?$^1&I-()>*)=`C?Z5V@_^|YouHzrs_oFT8WRYQDV3@@?uO4~yktvCR zLj*F>ptOEnZm^E 2&-TwGD2?Ttlq^g{bksY6$us!h7J ReUI>q^Ch)P4Cj*V_LvChp0)9Nwa#kspB9O!S}SVY8@Fso zsX53vZ=#IriqF5DuO2vEAs@J-%0BU@mVi~0hgtO=p`5&RDLr}aAJ*PpdS{o_ktJ7m z91OQL3HX}5UrYV;^8&@Rjsoq^r($QvpRN9OfZycW+PjM_t0KA8dzh{F dmH;{R$orq)vxQ$->BeTk{`$Isw8A^>yAc0`&-?-B_}r}c_*rT zI}&p1TqRRkdzM=3EFI^2Lh{x3>Se#FIQSW4+_jmTHd~+Pt7nh-or?W$Cv&TcyUNXG z)RNu$?%~?r+-j+^TB|wLGx;@ar^m!S&d+!%eO{Z7RrO&i+lTxXzn^n2Glf^AWL>xT zS!bMgC*}LUX_s@psXx59#ph?AlaaRM+@kET%b&S+)XAkfoYGw>k;W1dkg4&=?t#y~ z#A2Fb+$uut>PN>yBi@(K7DcH2 zo0J+c>t==F>sxg!)hx#1o||)0W_B>J$EiEb5{)f5_qXzQ7?1Ts8ylmTPw{UV7}$%f zx5cO&R&4%0Pe=S?p0?D1_gAu*FL7L0r?c1FO*+l@;PYp(H@D|Zy&oInTHXAtn&;k` z|J5RInar=g+qmIu*V|Q+mfacYhvrRuy7}kj6O9WdFFTVY?v^%zRdZ^_WrOb(B^RR) z?|%9G;BkSS?)wx)USD0W6>##)&8-cLZ|456R@aKW^7`zl_3e9~CES@^U$pUu$BX7* zz9U;6W-obKy=F;pm9qC4u|97z{`*~%|Hf{++1hx W$#Za*vMjbD0d z6=#jjtTxrM_o-2;E6=J$?z3~4X+Ptsbl#2ZYa7C!`1C1F(i2U)Ql@CE;l_DtpB?k9 z=Qrh^oo?1X!6mtcReHT#-{0Ma>hGQk{&m}@xsF9rU-pC8L{UknRR-mb p9XCI?=wSso~( z$+=WbGQ4PlY0O6+=?}HF)80K*z5m9 gV%RZC32f_L0dx%cJxC{S4nt0+Ii`rH*_Kh~@JwUA^AL z=j*p$W?dmreyr9sGQJ$5Ba+y7xS?z0pRJ0@EwzNl0bBtUqVr{m|FvvUbp-0&{lX zhs`yc68|dyu037h5Ot!^t!$fEaO}b-Y{rZdCvP2)-NTjgLTcKlO|rqWwHCf^>Q-5Q zO{3kbXS+?F$n>QZ4t9OIORS$9UeS`fU}*!#hR>mGzgfRIvWlub+#O)r7Q4dYl!S1u z$m{IR+XkgEa{Xmye>scKHcf435L|q4fdx;MK*oi_pLItP60`J$A4Dx;^WNx{TWxyc zcwS6iZQ0buWiK0bcv=LN4t!NH*|ybyQI>~w?_1SnlO3vOYwh^EY}WQUTTH~>Cvz{# zY`FdWUxM&ijf0)bUsWp4s`)6NdAW;2NR#n?gU# =%4Q#45MhaZcK{PvtZNtDw<~ z*qNNMi}*b(clyjX7r60>flc6%*_MT=lg@?t*95AzJ fzTG%= zZte}iD^pH#CKNgJJ!@mJKJt+{@4oYf=YLma?)r97qs;uI*THD%Pnn(PTP8N_I~u^| zU-!U=;pDY%Piqbo?NGkX**L98tH< zpwdQZ!S-`a?;Or==)b`~ +1 =F@CtAd`*bmDPnu uWmz3vYVP5<2O*6y1aG$FwMht&D-RT~Sh=*^y%y5M@;olgPGhjtY$ zd>R;3WzbflD{KCiF^tFSy~$T6+tv3@%io#3#K4E4dP`%*wv98+Zru}>ue0rc_`$sl z{Tec7CoOmpP-!D*pD{ISbJOG%kN97j1}d?2IM<&JG%F|*o)=uAl`)%p>ww-1PTN6LlYp`~G zI-DQO*{i-Z-DYjYd#2<2{5!eJ7hFtU*&B3RT(|vtjk50Tb~F7LZ71bL_kKC=ugtq! zdgE+W>vA2Xlz =KcK_yE1+(GFOQBnEC%g?5Wrf8{ALrDV%I` z{Qsp6b(@LjI2*&XC+)qib7E1$AJ-*zF;Wv>%=bPNUY$0 PRqSzG zqcgM9Ibg=gBMRoP`7>WB-O%?53g4Puc_E!u;o;P+)m2VU=TF{dn=3oXdzTI0ga0DO z5AZr!6@RY%l6*6%y<_v-&%)`im#nx_RKsSh+R7Jk__3$i<)&!6WmUh{&34_!S-n*4 z?-h^x=NZNCaipAUU34V9Vy0m7yhL8@)E)ZYikhdzik2 |!bxXXj?mK(hyS2RsG^Stq^WvZIHrd55 z0~i?NU+bSa95^MZVbi^=>zj4?d)QNVX -iz2vj^oaZRQCz^*kG)@xN4o`FD@5d!=Y}O@_8Q z|9fVen&%gKUG8Q+cfA+F8)LiVQvG$Aw&OaB-Zd^T{B1ek>cBFUtdH}bTOZ)Q6RW;? zUc<-9?MeOi5ibLH7Tpkj-=n|sQiIgLjO%CDuD@cr&R_pxo5S{^mgb1g>Fo9_zpc$z ziRO9)+?e@c^((QhoV(?mm#kgqn-$f*h5h~J?BFARax$xh-nxI{oc4~*?a%5%;?70- zil6%GwRz$^-p5OPWaVo;wj?Tf3V#5P4rfVV_~H5*gXb&c_RsIl_mVP7oZP(Hq(uC$ zBonX2dBtSWgK2-uT5qc~uU+uqi1tlCn-b-kzIc`Cte0!jAMcx7nh>!)cs5gm$TGpp z%N^1?s)AU*-?{Xo?M>T+>9f8tiae0k60FaW`EO+P?AYO6yGemv-790_Zw2hWl5nYi zYW1^^m0g9eJJ=kbBo~-1Tx5S>|Adh0&keE{&I giAV_al 4Zn!g^Mr8+!2h9x8}Rju+8kLzP-oi z48A!9$8TMKFKQNM=<+ZsCsF$4 UHu4I`j9I$cQ{rG?Drnq}9 z66D~N&*WY6FQM3T^7hMTk9|2Ww^Ka&>tjZn(8u2xT3d9z80N7yO4;4W+Tl67&w)Xu zc=>^}3lsGN+B!|&LWNW-rX}-FR;Q<&wpbpHfdI9k|MIfqOa2 zr0VPMvaig%(eov0{^hVGrPiSb-t=wXzu?#Yj1G41AEg&eK1gZL&-)f|?D_)zlkyq% z({e?u%iW(p<&(a|SF}QU!pXI%=~L8Yc@HqZe$4(>P0epDyYQUr)3on3msGTGTOG}` zLAdXiae3&=+|c+YhLCTQB-R-+p81;l%Tv)`nafDJve#(q3f3nKJAx`NoX?coFwx}I zr^!r{r%5Vp4)T@#-Imgl! #y66U&5M{~b_c_#oKO!;+xPD8X^SQ-gtlb&2D=CeZo= z(0Y-T2@DMC8f>AUu4}J##%bNfy9G5S?%eR&@$aSSvFmz2gxi_Czhl=iSEeaU_cqJI z=0_W3-5vj%E9kxd+;L^Y<&XNGf`30PJ@`PH(bZ;Op2nR!YgX=hdQxfT_7AiArmcO> zQhF=XG)t%W0D~fT>*7j=-xKnFTwCKVwD^lf!k5V*PrKgrMdtQoGC5C>+bguUWUkSZ zzTaW1O1E Z8Fq|F;kwh#JFRfn&B7O{Ci4eCT*=Rm~(eKl^E+u&QuRzXFMm*lIAdX zd4qSF?jzBoTs?b>y^hSxa(Fw*-8Y0$pK;3-1-5&4tXG5_xyTdq-N^Kugwx7J0g)%Z zK4aKEGtqYCw@%~rk9(xlHhkeSw0?T5W{Tf!;RC7N)^ZOF18cKiJeIy`CJ`Ccz!ais z`qt;qsU7xzrma~qVbO6#@BGrv+mXkYy}7mjt$B3sm6KP3D?{AZm1MQ2n@UdRw!Qhb z ee?gpS9#^rJ-W$}?Q7=C*Czins1@+*NNVhO z?whdk^>10PP|sbP1Fqj+>-LAwVau5fAwrffYZH%6$Q858I-kXw5go@7JkxOZA=W+f zAFBARusSWGv8efY4X=m8tZN%wjdP7PxBL;BwlFWP!M4>+^GK0^@rSC(Qf}+!YdSP8 z{kehj_P>VxEBSTozZAbbb4 -6J&0C>R z!&Eaf;f!?kJ^Rw`_bT0w9E&Y=6`Tx?&S46iw#N8KP>|%}BfWCmald)yZ7*5y*?B^U z!qMxi%uULC0v68uQl)O_5q|jhwC9FzH$AGk(R80lV|u;y(+IZSqtR!ZJLXmxcD#^V z$eft`yh-V`-z`}){~d+fIjfRq6wV0b-T!d1TwJoUaZIPC{loeLZXP?P{y$g~y?mX2 zK<#p;BIak|^UiKw*E;dgvXf cKR8=tu)sA{&lv!`xul3 zmn3Sx-O1PBH?89Wi* koz{72elw=@+V4STUBFX;~Zk;3(lmXtrT(mz>kz_Xxf zdchC5;|zy{T5p88x)&Z Tpav&G}|OM6rW{TXGeS{K{#z30q- zxlgLAC?#ao>EOMBBAO59c>Q;7dRf4DMNHh;V1N3tw$$FjNh(+6{ut_Yg#DRzPb i_^+9Hms4U&1Q{Qf4HQgPVt+?_q!L_8D#9e0#^UM58Imr9b07YWnf@9z&LLq zc!^%aY9Ic`r_R8aRI}I|SsLi|q}bWcRV#_Bk*UU~RJAM5ZkEczgU6obWlnyjUw5r; z;l=d$6HiOC{0j4zGrrq 8*F}-*>$ceC;dQ?_s`#BeTQ# v4Hjb-}GC2ZvXi+tN2&z zf5!m(sn)viOXy^l`E1Z%@K1Zs9Hu?-Yi1oWzIR_f@ZYOX7b_ODtIYUSX8%FfLA~;1 z?H$+fsY2W3<@RMO9GPjsv?XJn{2q-v-|X#QAAR+}WG4Trs}98zGXG9f;}OzbzVvsr z&i!o*r%v&37J9eG_P~bir>E@Vc~`e%C-~NvRxid?_oZbwCT=^mVbb=yi`h>;E(vgT z>6*Uve2bwZC{Uo0$jrcC{E&fx^`PUd6`(;=(88KqGw+D3e%RbB*b(QNzhZ{-nQu?h zR!eWLzu+9TDTgJma{aBV2aejd1ijCE&~5p*m1j*V=P})N?cV3|Jsi1$O&-k4U-waD z>i=e!$G(ig$L#JDOUw&+f10_)Olzxz{TH7rv!n`b^X{&e?>xYy=6z-x>%@RS-Gk}Z zj~egT7QjAl#qwDi{~aICy;qzRq$lX~r<7NYiT~0y)=%8!-urTSk8=o4$jDX U4p1EwI8#xx*1@C&hJnu%ebJz!6iS{I~`*V!g zSgRkcEm!%@Zoe#FDQCCRNe*VQ-wxS&+dG1X$`8a=8`bm>2met+n0>#i;54=yY5^Nzi-N}M$V(*cKXLwo_g4M zctZZ^wyLkEFAM8CiN#g=o{~wFk@)62 7I(kktN-Mhx7i= z;c1ck#oWDgBF~OLIpKW*3YDElT@24o{KeK_y5?#5+~*&;A3aX+Y&yf{xq`1hcI~(L zIj&W0SJlq6duFy?4e0(GWU3VE6eY~_^6PTX12+%oRn22rrha~+yNQ4U+syVrrhD2q zPB@F120RX$HF?!XzveHey?j1)TzVaS{-46nlO@&5v<~di72x4>zWHam__b$urG9oS z)I6m0G$~-_YJo#ervB$bq`hSS=2%Vm!;-SQ%3k)zYnx0b2HzJye+f@8$a;48Vl2z^ zhLF51mv|fRKGIkccizD%>u<>Mi;LDu{LQ?=nECDgiu2}E?riQ!oq8~(Yhti!V*PFL zZwV1OLK>^NETWaa7D;V87Gz@7Et {J`#&xz z?W6M2I}S5=2uCnVY}gRB<1YJ!Cy9CyjFV%SIq$DAmN;El$nV&Fed}A@dak*91$3?| zh-o=r Hj!il~d1l?^Q|)1j%opB!z5F;kK_IF; z?ab~AJJ#LdUmIF6HC5 gBY! zw_a9z_}4P5p7N-A_rY1(Wv)xkO(@Tv8-D!t&4XXmB0>sOo>a_PV3znW%za**&FM## zElihKjs&`HTE8gup!Lc~DYnoSx0kUS9=tJowrT *B|^-e+s^x1o%K}QdeSg;*4Zth)kfKp6IOoGP<)kE zV|Z1_U3lU--K}qSFU!(et&qD)Azx*J$Ucc3f>T$e@ci2^EB36< %X$$ z?2ZcSr|-lJoFB)}u2a-3KN4j8g-cMOf0FwQv4yKbFMrs1;Johx`L`dQdK)j_GO0~> z`RAlHD_g&uS~u(1(^L6>wm*CQ{GZ~^0-LDNviRGFb|i7W;N!dAIiu*;kLOuJyDz#n zT}xUMIV0VH!S`Ur$2so`1s$Cqp0MZai(8j@XHm(n#EmT(A*lzov%NM1uAR`p`02zjfP3EYxiGohG8@~$6f zp93>f9j8{D|JIJa2~01}gq&u?xaz4Dw2>l?ao$r x@n%g|E)>6wKwE6YyI2@3=$_q zq*1FYW(L-`;HCcap2O!L8Sgt^+sJmcxvi9^_zwfC=N6NChuVzKhh|+`KJBvFgg9&~ z|G9TCFfd9x&Uyo?_I`-YOxbp>_C?xP^QV*3-ZvzC^)a*f7<~9)Rmt@*-`md~G1hBt zxwl=-r^83>RCHH=ephl_QpIBCgQvm^B;MV--}PU x8hU%bMHR!k2-WQJ#T;!HRLdW{G?KR-Z(VjEs&32Kky_%$XNp zJ37n4ULL@>cMOuO!FN^}GS1hA$1+5mf&a0626Jg?>jP8=gPU~W2N)O_CpgYF07dE( z2L?`+RK^ss^$vwgemW`K<(n@N57NXohw;(feF+iWB6q{|^e*gpvB*mIum6q}7LgxR zjl?X19SY7x-=2A0-!Z+$ZSuaUM_!q7fA`yeCSs9I6z_+O-pR2_AErr(wH5MQb8*~o zZRZK|Q?uLu_)FAz@`$!@YkGS*e-)X~qUxmA8 C<*si?}TaTsxX|;YQZ*X$`54R0}wX-rr z9d)MOZ;5|zVl`^;rkwrHh-+zMo+nv+0NQUIDYn)JutnAAM{PU&=XM&cyaZTFHhd z&qOb7mf0w!qw(cXQ_PG7DR$47oio04+-fm{-?_3QQ9Qo{FCNZ+xl%z!S+aYlfBo*i zkM=Fxzs}dpb~nrJql#f)bME~N{w}>t 4WTB- zoijftCoX9&I6Qw3$FIeXZSNTs?Y_M)uw!Zgg)lU#z;Pl1IttLualRiYC80{X1@BJW zyC{Fom%Vpe3irHCW!zWx;NlVRb-{{Bsu(AI1%d9OuwtB_3oTlpwy;QOg|a;2?0Poc zB+&HDT867R*U=XSfUH#pon#lxI6ogHK_O`lU=VNH^zQ&`mC Sfn|x~>=L9TmvrjA14sh{GXt}gZ;#G_P0tVH zDNVWka^?*GzE#hb@#mHV1PQdCNW1wr-A&M;OqA2^W=CvOdnxbNf9gt&v)Py34(^L6 z@tmR@;{9=b!-MdNZjKF%r9l}o`m;`5%yNid-0ZaKW8lZYFiUv@>m`ZlpQVCRoqA+G zJ bAH9n0N(0ZFUxEL3EckGJ zb`-nAjmR5J_hW^$W-{)qjx)KXyRSToPt&j7I{3xIi*_wyj~q=q9<6)1VUNc)4@D>4 zgcrR=^RF0%1mF8y+Bh-CY08bP{DMfw>)DU84YMxpXy31xe`eM`gLQI#X{WQAw%A2J zxtuET{qWv}i}#-Kv#h?h!)WXI{Q~<`0_RPbzx#lMgyfrBAO7F0zH{NDcf@A3Q)`N{ z&m;wG;>?xQ`n})5%{{!daM6mnQrri3B(_)=E@+i{-RZY&*|HGP=s7{JzXkfQ;cjA) z`m#;<#+!ffryV?3Pc(SpYow8EvFUt#uasEK2W`bW=bEL1CoU1>=aO;CuPfMJS-E@B z1vT!L4$o3 YJ3jAtO `^^&zG(N}ei6}piFIlj5`VaMFaI?sf4*nU8bSY= z ksM2AIXPn=Ktz@YkkaB^UBfg?@Bgro(e8~6MI?VCbMwY*CQLt zz5blozke}zOPTO-W!;#Ysh35 PjFt<#S37hSp07BEeGwrB9~ zd44t}b(_|jt=hl1Q*!y-+-3LgZ&=^po-#kv^n6q@N4j!BUW-^}vC%bdQ}Zi7uiT9} zvUAUEyGgkdKWcw#%eiP?yyt7}_EJO9NuRz8JU_nOP$_+aQqzk3c|DKytTKY4F1^zF znYQm{mD5wzw%I)TYeRNDnf&o>(?*_~8(o*^S?`|CGh@LIF1LFwHJsUQav6)KSTVl- zUaQdl|HEkwd0{EPz73nE|GD0F`B72Uo}+S^fsbyTowDxD`yU++mOt38@TA;#`7&$w z&A_>5%k@9Z(!XbG_~>%o5+32H@t1DTU7wk#b8_X+>v}GS%XiG!dQx0n{KmH>iv*L^ zB!VU_H{YtN9jkbH(VPi&>>ERPY$O+z*^4hzHn3K1ozlBY`Ke+2RCDL4ld{vNeHXYX zxx$g*NRGk!{r{Zq)TL(JJz&D_^5N0HllG-fQ;p9~y1ma;e8mJQR!^13@7>;h+bUv$ zUQ96*f~v;#j`JtEit4zZc=UH}Y0U1%3-hYD&Sp&E_mRAxZpCJ%*!w}}+vjMNl{uZu zbmQJHc^j;g7|Z^-ecJ~a`HLQ>h1=QVen0jrYoC9HtLn)sr43htZWL#zu3OF*ab$8Z zd*`RumkvtsUV5|TP=134yMbhI{W8YOcE_LZ6tiKRF>z{B<;Q>Fd-~?He5=v?`Q}ef z?hbiH*&Ag$UQ2Ah`bF7g#~Gc8v(Bw$;MKOb;DD63IZHZ>+}dwQXee6uoH95S`{Gi` zy!}xVYqz=SYHqXs< euXoK*shkUjCgcp6q|N zey03|N7>6ALd7zJ#CGYobY?m$v2Qm0!)beQFZ0ZQJ3sFFxqZgYC~Y zl>eRLu;tjk$GndtG?qV_wQlB}C;J(sS1~ 2VIKHszMx(6NCefZdSGk1IQpS~Yk(ljSregD>L#lhVs8yPk3_sx2*a>TFg)0xnc zaMjt%`L&}jOupG9;?eYL*?iZRO}W!R#zE^eaOENbx*RlsasEc+`i_ZdYM1>hb!Ny| zR`z4PbHQFBnmR!$A95^Jf^rmk>=)n9uAOQ*`)#5Bp7*)iKi}1_p)##`&9F5PM;m zIKtIjZW^ >Z#gax0@pmv6NC zS>r>7)z_9>R%?0lnyc ^6)4*R?lU zyT`jr{WFp%c=Y{t#_3JjEl Kd|cmsSV#Y&RJi%+xJ}8-pKfi zN&mw#nm%6g`~9M){OHFk_Js<8N4i={<)g1yWSrE`+OfGq_RXu%UUS_}QC?f6{;;qP zr%2Z?g#{j`wu!FYxXfhB-k(PsSnDmSFUrQr_r#^MH7Ur<(~fj9+VH@c6&Z$ z*`O6)j%eDcoUfU@d&1VFHOgsE&Xvi!HXK>Ty;WdYk;B(tH_Dwabvc_)yZL?XH`ggQ zf1mt)J=r;Ew(@No y*yNr#39^byNwq=?>M`cvff)h*k zFITq8w_hOMeAC!~Az)(1X5lwnZg;s3H)x%;J1DEcYSwP|m+R3XGq%;2@8y2|o+@%M zOj~r#e{H44PQ#TYHxrgv-q~mPn`7%~gRIr@>UFc$eR&(jzJIv@BVUK-H&I=ei@RoK z$TTpSZ}b=I6DbYfbs>oPWm|^;cSFo^gI$+(&dd>Qms7dA-9(6kRby@92`_)!+d__A zDNW^C=bBdi>#nc5b7XzF>DgK7D(+?Bh4&96iAOxSt8!RKY57%MWrxGj=`0pM6SBQU zY-{FDtusCn?ETkU#^KoZcOFcO*lg @P%G^fGX+u+;jkYOk1C``!D7&dq$qHMP@D*rYRvFRjsx%?&xZzOOm?{rc;h zKgD@3T_mfsbo%TKAwl1gW3S{*`w^LV_~71aP4&9c+k7s!m-4o4&5CpX=k~2K<$#pq zqd1A!b6-O?SGGRBqqro-V2v-o#3XhXZRf69r-oNw^7#sVXKO^c3(w)=+^)c_8LM%U z=dj}uR-KtwYbq9aL^!nC^xR^+FDZXM-N}FRkL;JsE>|zEP36cttrDa-{XPHdHvXnlFDgD2C|ES;k7kS;dc0NPk(M`PDBHp&n+JB<$MAy{k3h|#U zJX^Sr=giRDSzchU{%cR{ylvkui%(XYzTmCVgH0 CrTNj=IqSueUYF_%_moQZpP70m|3P<@{ok`&W@o28ih5a5IBEIXH@|) u~ap(VoHQ!fEc>Oc|Q^%PZ+>WcgZ~UFkIQ@{w`!wD+8J9N}7Aq|8GO+jAx$elO zj%oZ!&mFs39cIk=Th{W2^RbA=r?n6C|33ad$tGp@3@2U1ihovbS8F})sB(Fo`daD2 z+vJejGiMjAmtgtj*jJD@x8+}UKx&__TL0mDIzjSl7)~b7DDgAau}>EL^6UaXcV|RB zEB6PP!0CrW`R#tXtz^z@e7#|cMBQxrJ@w+u>PLUp{hY6{yzy^$|GNJSBG-(n`6g`N z_DS >RrFfz`y_+m0~#PFQWcxzB(({KuC4U9)+8tN(0x zzaaS9H{DV*ucPWY>#P@LU3r_}>```(EBQ?ClS@hayJl~ Ofq zIPp-7hWWHbQm;yR6F#j-OL+PBtfiB{tsU|gv$cv$Y9?nNuGw><{LadpAKH?B0s)J{ z`;U3_T0i~2Hn`m54@=ML^{P(cIS&i|itanW^P}0VWG`#@;=jvoUi-m$@<^(F*b$4h zW?b_Z`ih<{w8%7iuJlCa;Bxad{^o+y4?NHfyS$w}is|tAXM(%7U+lb_qraDR!_BFZ zlKZuVr`%ls`f^H+N)lV+Ti-Ct{3{6(oWK7YZf0v^`TJ2I`x$%ELxwGRNB&kv8ea%4 zli+!9Hmde!z?N9$Do}01(#x?fLU;P OzMnfkEQ$Z#@z*7+8X@tn;mOuvM=QiWiPd@a%=xp) z&C#@9>1*ah{WV`K_sf2HW3k}*jEouFTaI0He0z*})%068Ew=n!sS`F|MBC?L }$E&H?WZ!3eO7epOTPSCh=ut)B8e&CVrt4U&?dAu6R&M%p+m$oLo zKxvlg;um#>H!j634mCf%X=Q&$L+B&L^>frJ>zgF<`7c||o_RMU4v&|BHY1r7U2E z>#W!QUHKgnlG3S}flK9PZ@JBVZGMJ)k%mpq&YcJPbnez0$$mJpe8#yd`=jUGe|Akg zr*q4yx>DJp!cF;XdU& z)|huOU$=#=`4DsJOTTb!sZQFB=^tEGxu!5E%#FwB=qrLwKzhzN|0{Bv36#7Tm>JU| zHaR8ko|JKC`9j8pvl7Eu>fhhse j+Fe|G|pdTFIYyHMS2Gku@Gc3Zsb&V5_*Wjg4f zC8j;=Y`Us8O9Wgu }hJbfZ*#*^Al*jFUr@7EHBX z6nEqM&r>UY=(U|-&tW)@zQ^M(0|S$- C2`M=^V4 }UG*7Y9OYix3rzrI}0{gn~N zGq aTPOr-Qjd!>dn%WKCPrQG<&)dC6X+wBvpKBJ^<%^PeLKoLs&S2}Fe`oW@r(D}i z8P@!nuEW4GlYL@}&J(!_(gJtBW%=tiSnXLSw0P#{zh%F_)qdq!tEYEh_pS{U_YPH_ z{Mu#4WwWYIz3-c%PI{vD+sLqY>i@aYuRjy9v)R64(MI7nxwpHPyRj|2WT(FKdE8_T zXO*k`Q*X}Y)nF0f&=^xj6F3lZ8F4ER%K#SDC5vGcdIZJQuZl#=yYf z +Z4A6^&& )})^N~&4*q4DW9{A 1A`soJWJ5=WIYdAU?XdwWNxFV7k&HyqulQlo4Fm+Zf5w`87ypAwfr)w z3EUQtTkEV{%Gsv`X<>AY8T9;Ek)6lP0J>|3Ki?5@0Kn$H_V6On{tt=j^YVB7a;jon zeE5V|v@D-ekpkoV>cTC&ZhbBhi|3dATk%jLZ~~Kp@xN={G4nY1H&3{|@uOk=gH^i~ zt%aAkFlg;u5dR_I(xT%GXF4mUE(&2?{%=lbXmhRY^{7ghRop+69A&L~Ij@Q@*y3Gp zRIyoTnViY-4|7jme)hiO&6^g!%iKv9BhBm<|6jVHns?)x8E<|wy9UUWMBD%I&zspl zNnJsApTtAK7QN6e>%#MkA1Qjh;F~OO5V7I#ou6%Mv}P#p6aTwjp*zC%eb}Y&C%eA> z{G>Hg&p?3d)l>BjS%W=Kl~-S5I{C9)X3pMjnWLpwtFHYrUb)kB)8oVMTMzjjKD%}y z=M9~h#g}Ia&1$%-m-V_&!)HVLk%u?WJG!?mnIm{~^P9UDtNP+6)yXe7b+!7~8y3rr zZ!T`IJhr`PW81EEWsX^*{I{3vbdktayHoMqYTe1^8Lrn?L 2az9(CefdxKu7Ep5lN=T|XX;Lp+SR1-C;6AN!z;Hf z3i?{9tBcYFd-QcT8%t*2y4%+O E@>F2{d&aLWRH>>m4oKD6)Tl!z?eK@&)Uu9h (GDQ*H |Gth< zFk2KLR{ZV2kMN?KpLUnD^e@}^Y)8ZT=IBM%GILjzp9uMXw>ri@pHEUZ+*|m?5gT2W z#xs}xHZ{J;sM50MY>iu3Sdu+GBW^ 6-v@>%tQ zk#5_MqQ8!(PB7oycADqd=hs<2TW+s&`Q1A!mB*?Z0*1^MgVkBtGc ArwfbOPA_XIyWVzv^T$sz z%U`UO$=!YX% E&eC_w`1|C3vHKgrs_Jy z9xu&(_GW(AiBpTKGoF5LJoIjZ>?YAq65M~< {`&T1H1G={_n7H=l1> zt?JL)wsWDu>TT}=Cq&PlugYO&yhZK6(#zZqdzbAo@HNd y4e1*edKH9!&v4fAdwT9!ibig0U75_i zpJH)u9yacJ(!FZlx_lwE1CQhk{pGZ6I}-JG^1c4VrgdQMzxa7#c@y4Di{zWL{_ez^ ziQD&|^x3w((4u_u33k6pO`D(p+q`DZ$v5mw(_d_8irQ_$Bhk?q{I$k$PU|5RnfJeh zN{+FANGoHOS`(nr;%&4$t%2KzH<0Dl`hPP*|H()*pFh6ou&8tH-TDI`e*XB}z5iGG zwCCb)FS1nWoaFy-rO#D#)+a8LoY#SW=cP~n{e~(1&;6)ywHXR}|L#8e-}F&&<@>J} zeYbKP`w+XRp}AsN!5jq{FUK3MAy0SJILa*ge*Q=0o~ch+3K$}9s}yqo`MD!oa>j<( z2Iq#n^lhs}Dx=Fi?uMRP7TRFMc5A}{o=t0;a(S1v>7?oD)GK(}zD)4Xe{yc-Kg<8C z4c`BJoFymb>%KB+$Bj$x&j`4AGqC^tWO~eORd(WiX^k0&mzGS?n54qVHuu!A2V%3^ z*T)$uHOm(9-cU;VXJR(t<~RPUUwYRjFBHm{*miZ&xyLJ1*4*Ywv0QTe&h5$C5sKEE zCGwXu&JgDDIcR=g=fStOsmqIfx_?f-J%dZ6qQQ%k>1S@h=eLtw8@}v0@-t+?^>2mO zu9 Bzh%|0qfd*w&nrgq@Sl1SX%-V;6nIPN{~k+; zOQoS-Z{K*AJ!!_3?10LM-Z%k$-H-R}T0~d1_+>Jk;NJGd`x|>l_xuydu1$Z<%UJC~ z1@}Mb5fsZdns_`fWbe0^5s#k6ZH``3BipytY*FRa0;kq*KSdc2+ ugdDEx4zt*}QU$jOsFSm7FWZuJxfA{wnhd9h# z!piqR; hqr?^L?R*twv}UGTNhB%f<#Q9^U}1ejc3x36`h9bc_Yz1gC` zzUQ1FYihiTd%j;jvUR<&?1O{SA^SD#)ziJqe)d|I{J1xZ>yp>H-o?+)>3vP9EDo5V z=pWXTu7A>DuiCTu>v;-_ubq5$@6o@ }-r_Qk4t?Gu;f z--KWCdMdtnVU7or=E)_W=1o?0s+?1Q|I+L0tXmlmRVe&4zIIuh?YCv8T4#Rf;}?}j znUc#?%iZtK_v}{7U2UgPf9b81c6@ce*-DkQ&)Cj>c(KQ }p{wJnww*Kb_)T2gEO{Mz0kAHTnE zPd`2r+ZvLnzAU2s@)FzjyZ=6}EDE-d`_Sq8(=X>n(TQ1hrt=eaoGB@v<*@v=f`pq% zM~`uhr@7`fqp-O@Wu5Z7CvW)1xJT@t_qHuj=Q|#3e8F23kQF-Tn19)_W34hO7ZeV2 zZ!hbL`uXA2s>FVcZ%QTVIc3?xP7)4BUvB4LmJqh>8T-Vbf=egL!hiknIMQ6gxaP^8 z(@cs^jGv228r`$stv-^bVf@rJW5PG?eP;Ucvm!Zk=4990to3xiYq?qM^lQas>oSzo z=0;e2Gq2t+dhl8}`#EN1nRi?79#d0qZI~UpbwhT_!$5=Pcg#J-Gb8)lH~A$-ww*e` zb949SnJv098DcVr jTpP0 i`l^H8~#r{Wa54!=R{-2X^}s970Tb6 zP1!#oB%(z9dCS}-oYzYY)I6TPRc$@@kYD!T*)Gd3jqS%=nlJ8V;$ALqFmv~7>xC8X z+X6z;I^Fqn&Udc;IjMfzsx65pgQw?dr5Fe%{CWM_bS0@ne>fA0HJ}e|=Pso3 &sOVO^)~`FPB=wr1p 9kgk7#$> zs7);Mdzt(xBQN4R$Fxi3p=I@!?>cuqsaUZh^3K1K*l^ }q!Qz54SA_oIbRxK^rW`UP)H zI~nZ$hIwk|)W9`fiaH!OwS=q<=gqv{npFE+;E|cYw%ebts4bec=g`OF4>{Dn@>$;E zKiAxJKBj(6$D7}CeZDr!g=#l;?TMQBO7mm0>zwzSUH;lM-uUWuoaq?frS)s)xU65Q zwLRN2P{#0<%&)RTn^YUh0(iH2UH`vJMk3*w&sY6=8-`@(MVE@AmRp^ktr&jc%j$fg zrKeX&9m-tByISLW58sj*|KqJX*PIG!&ldW(Za@371P<2=k<%;BF3Y%B+p*=u;zV_g z1j+5m>Aw`;OV8T6HG+Ts-lW@BijTJ5b^Jg1M0LT3qci)Kc!t%aDG2lba?{%OGyA4u zZk1t3N0APxG#aP~;SL)JpcH>;hUzc`0x6PD(r0Qwx zF)La#({K-qZr%6dSmuzwUhlH6#FWqUzcOXPkt4D-^Tm(75w%<*@3r>%x6`*mi{7?; zXkUD)=kG&*PGRPUX&UE~f0kwj&if(4boT#;m-94B6MbF7{%!vImM>)QW$A@1Q}%z* z>5 t>}xf?3DUg>&3qweBI$!j%mcs)sI#GC$s5ZCI(&$Lg|c zt5I>y=Jf0wl?c;5VdH0Za=VuM7tZwkF?aRn&l~>=u*B`!sJ75QczqT_XSJ)_TD$j~ zXY=sLi27J+Y)cQyn0r)r^8SviA6{OS+_UJKK;exql6zm?RP){#;(e*vBy}P0$$;{e z-`46(w2=>=e2mLeS!qGQe&%)Aude>xp8vI3Td=I*;FYxwYd6o@pgbk}3u9?nKYw-m zg2O#L>CI2R9WmjL_+wZ7FHUU1?bUBT?H0O}BzSGwwHb3)+?h7@pqba@oE6F)-ET^M z$4TwY*>mi9;~{_6lU!<2>mmjI?Gff|*_@lXtHQPBS@Ft4eu3{Uot$89b+Onul =_E1HQY@cYq#b4e$Cjw?6Lg8 zuLkEo?)MN;=-*vrAn5$X(n0(1&OMH?huFEZ 5x9bEkW