From 061117d00b9ae6ce0df2fbbafc4ed1b92961efff Mon Sep 17 00:00:00 2001 From: Chris Ridde Date: Wed, 22 Oct 2014 12:46:16 +0100 Subject: [PATCH 1/3] Updated readme --- README.md | 82 +++++++++++++++++++++++++++++++++---------------------- 1 file changed, 50 insertions(+), 32 deletions(-) diff --git a/README.md b/README.md index f4ae9e9..efc3519 100644 --- a/README.md +++ b/README.md @@ -1,55 +1,62 @@ hobknob ====================== -Hobknob is a feature toggle front-end built on top of [etcd](https://github.com/coreos/etcd). It allows users to create, maintain and toggle feature toggles and keeps an audit of all changes. +Hobknob is a feature toggle front-end built on top of [etcd](https://github.com/coreos/etcd). +It allows users to create, maintain, and set feature toggles. It will also keep an audit of all changes. -The benefit of using etcd as a data store is that there is no need to write an additional API to query for toggles, or a eventing system to update consumers, as it is baked into etcd. Etcd has its own implementation using [long polling](https://github.com/coreos/etcd/blob/master/Documentation/api.md#waiting-for-a-change). +Etcd is a good fit for feature toggles. It has a good http API to query the state of the toggle, and an eventing system to notify consumers of changes. +More information on etcd can be found here: [etcd](https://github.com/coreos/etcd). -###Screenshots +## Screenshots -##### Application View -![New Toggle](screenshots/ApplicationView.png) -##### Toggle View -![New Toggle](screenshots/ToggleView.png) +### Application View +![Application View](screenshots/ApplicationView.png) -###Running the app locally -The quickest way to run the app locally is to use Vagrant. If you don't have Vagrant you should install it from [here](http://www.vagrantup.com/). +### Toggle View +![Toggle View](screenshots/ToggleView.png) + +### Running the application -#####Running using Vagrant -`vagrant-up` will spin up a vagrant instance and install etcd and the app in a Docker container with the application running on port 3006 +## Vagrant +The quickest way to run the app locally is to use Vagrant. If you don't have Vagrant you should install it from [here](http://www.vagrantup.com/). +`vagrant-up` will spin up a vagrant instance and install etcd and Hobknob, which are exposed on ports 4001 and 3006 respectfully. +Hobknob itself is deployed in a Docker container inside of the vagrant instance. -#####Running manually -The application is written against NodeJS version 0.10.26. This should be installed prior to trying to run the application. After checkout you should install dependencies using npm. +## Manual +The application is dependant on NodeJS version 0.10.26. This can be downloaded [here](http://nodejs.org/download/). -Hobknob relies on you having a local install of etcd. To get it running look at [the docs](https://github.com/coreos/etcd#building) it's incredibly easy to get running. Make sure you start it up with the -cors flag: +### etcd +A local (or development) installation of Hobknob is configured to use a locally running etcd instance. A useful guide is available [here](https://github.com/coreos/etcd#building). +Or, here is a simple way to etcd up and running on a Mac: ```sh -$ ./bin/etcd -cors http://127.0.0.1:3006 +$ curl -L https://github.com/coreos/etcd/releases/download/v0.4.6/etcd-v0.4.6-darwin-amd64.zip | tar xvz +$ cd etcd-v0.4.6-darwin-amd64 +$ ./etcd ``` +### Hobknob + +The following will checkout and run Hobknob (accessible http://127.0.0.1:3006/). + ```sh -# Clone the app $ git clone git@github.com:opentable/hobknob.git $ cd hobknob - -# Install npm -$ sudo npm install -y - -# Install bower dependencies -$ npm install -g bower -$ bower install - -# Prepare config (this is a temporary measure) +$ npm install $ grunt +$ npm start +``` -# Run the app -$ node server/dev-app.js +# Preparing the config +To generate the client-side config, you need to run the following command (until we find a better solution): +```sh +$ grunt ``` You can then access the site on http://127.0.0.1:3006 -###Testing with Protractor +## Testing with Protractor We've integrated protractor for end-to-end testing. To start these tests run: ```sh @@ -57,10 +64,10 @@ We've integrated protractor for end-to-end testing. To start these tests run: $ npm test ``` -### Configuring Authentication +## Configuring Authentication By default Hobknob ships with authentication disabled. This is configurable by changing the config/config.json config file. -#### Turning on Google OAuth +### Turning on Google OAuth First you must generate a google oauth client Id and client secret. To do this visit the [Google Developer Console](https://console.developers.google.com/project) and create a new project. Select this project once created and go into the section "APIs and auth" in the left hand menu. From here you can create a new oath client Id. To use oath in Hobknob add the following to your config (config/confg.json). @@ -78,11 +85,22 @@ To use oath in Hobknob add the following to your config (config/confg.json). ``` This configuration is shared with Angular so you need to run the following: +```sh +$ grunt +``` + +### Access Control List +When authentication is enabled, you can control who is allowed to add, update, or delete toggles per application. + +The creator of an application is automatically an owner of that application. Application owners can add other owners via the Owners panel in the Application View. + +If in an emergency, you need to be added to an application's ACL, you can use this command: + ``` -grunt +curl -L -X PUT http://:/v2/keys/v1/toggleAcl// -d value= ``` -### Configuring Session +## Configuring Session By default session is stored in-memory using the expressjs connect middleware. For a single machine environment this is fine. When you have multiple load balanced machines you probably want to use some kind of shared stored. Hobknob currently supports [Redis](https://github.com/visionmedia/connect-redis) or [etcd](https://github.com/opentable/connect-etcd) connect middleware. Configuring session is simple. Just npm install the module you want to use. For example, to use etcd to store session simple use: From a9323b2d014b2e30ead307570df7feb6fca276bd Mon Sep 17 00:00:00 2001 From: Chris Ridde Date: Wed, 22 Oct 2014 12:47:46 +0100 Subject: [PATCH 2/3] Updated readme with badges --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index efc3519..ff235b6 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,8 @@ -hobknob +![Alt OpenTable](http://www.opentable.com/img/common/opentable_logo_reg.png)Hobknob ====================== +[](http://standards-badges.herokuapp.com/?serviceStatusEndpoint=0&logSchema=0&githubReadme=1) + Hobknob is a feature toggle front-end built on top of [etcd](https://github.com/coreos/etcd). It allows users to create, maintain, and set feature toggles. It will also keep an audit of all changes. From e94d55ba8a49adc5b339bdfc209a80ad9dc09348 Mon Sep 17 00:00:00 2001 From: Chris Ridde Date: Wed, 22 Oct 2014 12:49:46 +0100 Subject: [PATCH 3/3] Added ACL screen shot --- README.md | 2 ++ screenshots/ApplicationOwners.png | Bin 0 -> 32571 bytes 2 files changed, 2 insertions(+) create mode 100644 screenshots/ApplicationOwners.png diff --git a/README.md b/README.md index ff235b6..e06154f 100644 --- a/README.md +++ b/README.md @@ -96,6 +96,8 @@ When authentication is enabled, you can control who is allowed to add, update, o The creator of an application is automatically an owner of that application. Application owners can add other owners via the Owners panel in the Application View. +![Application Owners](screenshots/ApplicationOwners.png) + If in an emergency, you need to be added to an application's ACL, you can use this command: ``` diff --git a/screenshots/ApplicationOwners.png b/screenshots/ApplicationOwners.png new file mode 100644 index 0000000000000000000000000000000000000000..b46b4fdbc29b2e13bba699ea6b561fb03867a891 GIT binary patch literal 32571 zcmeFZWmH_jx+a{E5Fijpf_rdx_XKwh+PHh;E+N4+xI+jQXxtrwySo!;TpRbVbMCn_ z=U#fg`8RXdtjmvHbnjiYU#qv?dg`eiq9`x%<~82yXV0F!k&+Zue)jB@*0X2NqY>et zzkH>-o`QY}u@DhaloAp7py&WJwXimM_KX^{I9fpF#izG{D`8{QNI2x?ucP6`=npr- z#bm4c5R!t$f?r#@)~AJhk6L#ixp}c~UG>%mVQX3u-)hrK;pnFHrLjxM4g9}}Q1sNf5;wD=V)PM3#9zKQ%&U>Oh6^cd0q$dkQids+a3uUnIBzJx zC6!U1)Qk?;;7RT|$*@POs&HZQA4@DzYko-@`*FoUeIWgr>*dGe0+3w#i;l3igUS+| zP)Fh+;f4E|h8i~FigkEBg6+q$qG|S3o>#mQ3FqD>n(0;^nI0F4H_ypkEmpH+nqr|& z$*}mW;iMra%WDL*VKguX8k#V=+1Npy_UswI8!z-<8xtpk4{kQrwvN1R0;K=AgBSY$ z-=CRCKm6ksCo2I`4LQXRB0vX|4;+l_jLf8huRnbF!0%ve%Bw6Y{?F#nZvv#|PEK~b zOiZq>u8gj1j6er7CKetZ9wug1CRSDk=p77>?zT<_ZVa}LWdGL5zxN|*;%MYxVdrE4 zwEgh6Ujsv+vy%WR>E8$akH3GD)5Oi2ZR*ZfTX!}fx&nNKO^o;~~cOiJ|AXSe73OTMxTmwt~YT-OG*&-3NdOyMgG zHOz7-B#jU8qKUa;c4XzTD{QY0H|+E{lxp4ha2w!TQrf1T-$eefWN9S-tX=_XuY$KC z-1qRa=*s7?ZvGN8{U$#r_D6H)241Yvq7z46b!^+^{q^jt_dWrE$EVjj{z4C4%ReEE{7+r|b^d4I^qZBEjZSin6-HR zJdT*YKV=piq6RR`^!(*!>ofb=J74kew=lv(zZ>cp)9{!;SmOLwY^gS=A!CI9Isoq8 zfTW%DQ|Uxx^AILXy-fkDzdH@GGFGN|L3qPxBby=l3=|YK5gy9r2Jhuz>ico^c@sUZ zN9kSZBS}g?vCeJhe6@p?`UscTBjEAaRKXlIPcji!1S597G!;bktlX{VikqHEXoej5 zdL2~jwOq{mKJ0EYg8L;RkGNjOp`*f-bW>bEZ=Ly(Cm%0R(+5(za#bP7N@eqBGe$3t zW{Y?#!-s41{?@3gtE%6pW!PoJuCra|Lhc8U5aUo)&98WdzWC%;NazS z9#OcpQm1$U8V8bx9!mh7(h?uTmK%3(eSHDvJ!_ODF6_NOj|f%qLv+CCup+n*aqxJz zZ11SGVARCc=g#)iQmldyNoik1=X*9+YBS>dL+^T7I;Zm?$wJKgn+IQNJ+{Y9ItPW8VUj`4Y0w>)9a_mSN%~`Dhy4HBthpRBwu%>g5fYatNK&*hx?Tp^t z?n)H-qmoT7L|wX1?_QMVTB##-tlD^&;Q>ZsMx-b7GhySOI_^B!i5EDJ7rBgY9f%`V ze{|x&Xn4p+Jx{s2c{o?xz89jgn4MVhBE3M5ONK|_q@vZ!7`zKqwksAV6DDl6{hqII zx0K-jVC!z4v6xjwHSDTQ=!52P$rQN(l$DzFJ(1aESiACBD}TJYKd)Z7yIkqFD?X0Q zwUX9>6>xqOB+MO5GJ+2qSR}lnJ&nX6z-3$>_>u>Cq?So_nra1K$HZ;7^~KDGxB?z3 z$Kr}?1bIO{l2$?71ih|9pbtetUQG&bXb}rO3DQ^=h)L*xrfcY#T@UZ-7fjDSKkmt$&UZnY94;eln z)tM|%fRHNQS?|vdRlFM=%PGE97d~NrTD7olwXy9(s26(0TFz+${x!dDj) z>2geMh4c`{y8dME@Pm}P`ri9@OzYq!PzZ0cBn)lG;W23upZrgMT0`&yNjzj&=*s-wSGiCed~ zhdlCM-XEzqtq_B-k^6*??r%yTcS|2`fC`q%ElunAzUmJHdcU&KXKsV^K;f!uFry#o zZ}c;hRIO0o%&at@+@Joj?0URj2&H0Wo6$Y^o|WiO#BduR_oic`{&44RaDKgiFIEAB zzb90`ZgCO_A&XJ)WpfN=mko~aMB`Vwy_-56ZuQ=j8z`yX!q-g<>lZa`sd#*_Bc&|u z9pitaWSp8Ik9Y688>PrT+fayh|_oGKKxV zXunDLF=ml(sY`>4mEuXmd*WaB4Mu!0m%c2~Yqe#@Nnl9rjw!|U)pWoJR?Al)&@AKF z?G8`3JmN8Jyo_Pv2P0hg0g{e#xbZ-CZSc-f?E=qDZn<>@HtU!TX<7vEwQ|U3V zu&_Wjq(pfStB(RC?G`Wh29-^dzMW7dnD%;(3@vR}gL+0`nL3Z|BLSxlOFt}o(d$En zhrc_<;e};tC-~rwJUVfASoVUa|42~tg_uZ00*0xRN}%3#>Y|2aud*-DUa^iljJ9E! zdIA#~GbK1+Sc+hkL3@SsaYG@5Wu}I|F@u>6s}^p9`x`TDXi-_PY#^%+^=^Y<94tjN z+WyAO)f$TvEF0{+E=sZu=o`?3`Ue8HC<3@H6o!K4vwpYQ3 z+z(}O@NSw8G(z5+kx!$Ho(JkDip$<)=BIvwHiRxwAQNVXPYv1@1090^hp03p7@Esy zLKXji;DH(}05()7kA`-(|Ktd{V>7t8=ci?Bj0BY^oU+TJfggW9#G39-~RKr7>zfSPO@@I12hT z>t&nWl<89Fuf@85vVpCq;O}e|8jq_Qv)4}>X{}3UHSP~eUZAee&1?Hw)#uh}>dLd2 z^tESPm`3GpP0nc*&n)d<52RSc=QLRwcSV`fF!)}9?XY5~80>Q%dkw{*h2ox5$rarNdt!v*p?EMdC1 zgX^g&qxF&Rpr?k1J{JXf(1jquu;y?f4o8!K(pSU5_*3F?Ll3zKLwX;1ia>i@v5yoN z5=lpSS$OlfBU&cA2YLHi-Iwn>w_ZrIEVWa%u(#+Hy7D)K}g@vw#X8i-(c=b3T^LMD;`|jPh48w6TEAQbDCEw|cOiC9 zAk{Cfg9^g;??XP!d|bp~t|L@kH#JzFCY(aahh-`m9sRjQI22!m$U&ysKdzshb8~)mTxdfAe|}1CAok6%wYGYwPseSBkxdW>CH(5L zva&+DIk>sE&pjr_$0=!<_hv-=K5CF^O&m9nc_hbdvbvo-p_lh70tip=p#Rgc@f4b%O#5 zSR<9jl&}n@@)}wmNQuJe^O;{48FVUigN|fap_8NxO|sHZ+!4kz>4~7?be+;CBR$RP zU)tiJQ;*7fC79uO0)@F4GR*p9VGZg$4Covh6AYuzXK-N>`dx$aUWJe3Iaei#E>dS6jdBOdSyIPfkvfQ_&Abtlr0(RxIsQi4kxTGW5f+0h-1~Q-dRK zv&RaOa_w8i#SRdW9k6ogZuH={A2Rmx&8|7F|j^n z)1PGNP|2fl^Q89on|u5HHh`hUmHg;ytX1cx9iS?pk(Yil1z1_vcsSm4YV{+R-)w97 zZpE!VmD6V2Bh@BhNnvi+JBv?7;0KT-lZ~mgi%-+6WxD-E!e-m-bN{A*niq#9_J`pN z1F$eLKTm9pI{T#2ykLw7(?11)DX(34Q-%yq&-SA$^P`gar#zAI&B)Bg z0~Z<^@6n?amd7m7MMG_yc+63RWjX7mQo)q4Vn-CN5<3XKsTf?-lpjadqo%c``o2IB zG_h%2zinaP4?0hWDE}y4PEO3m=&y{grB?6kx*2c!+TAjXBD|c?l%_m#>HcOmeWID>@>Mil;h4=rfuSIad*Q*Xxy zXz2#_DWe+meif()-!$?w_B>DR$W>sW+F>sSC$w88GS3b4@9*&sMc$=DOgcK9yj?w2 zJ@<<{WFjJMTLtYWQT1))Wenm6%mqHX^zPcL1L)HZD;MCx*KX5E$X@f3Lv7q1tV zDbK|-=VNEg8R+=MwhfTM(Npkv-`-YlD=mcu?rI6aWgbW9~MPOKJ{A6_k?so@rIy?=2g#UT;VV_wX! zY@s`&t7Bep+B<6fbq@aSV5vknRU{uLwQ*_c+Vd3D0RYQJw5#Z7yz4_c+WlGz%ck#= za*NMId@}WtEcZ}TonjdIRvows{aN3{NX!+m)$j1u|JW-q^$l&Vv2T4(4mM4-=0oF7 zD>jSTN)7o3<4q+=rIq6z1tZo`a5%{ z(JQJ1_>}qS&u&q)#u(LY0!*6G8Anp%^kxdy^%UTUXf1F&W>2gKY`U=+FcOc{dq9bd1!sP$7!`q?Tc;M3vY$ zrD0jXy=VcHoe@8z6VvV*A_b2ouiui}$h!o(Sprq^M+ofdyHjy*jlRo3OXP6DOfKUBD}M{khOu@qJFb(?Atx@$ z1dCEn8RZJR@>QUmuK}e|$F~iPhWu?R<4=hN1T*<8-Nu$A(gfG|MDjqA!PQypho*lA z-q;Ld>ErK-OPlQD+xuk~-%uWrp~xF;R9CfJojt4KcYlI)vA1{MwOguHFoQ=;k`8VP zDSfNv%z}clOshGLk4rP-Jr8cw*tM0jtaR~*K$NRXVxUUFCg?7 zF)}^EB)D!CR2e>*qr~BFKINod?t$j-pW`mj$n}w}CVs=1!gOd(9yifz9MA8;msIbH zd%yc@5TTa#Yk&0Tvx@~WVJA*`PCgY6!<;I}Oxn9*&{U-M2FlaYMI#5U5+kVZO>2!N z!T6|kH8DTrd(M=N6INcGuY)lguPabaKPjyryM>_)O*vH0 z*!kqJXC;iV;=k#~CJE0g-9pl75Y$QiW9NFv3=vp=G}Px%vvskS$q^3yFv)?SSAO z;H}SublQj(R-SxvSkiTEh{A@1#!6+Z5Sm-QkvMT z+$1kJIIqs!#(HJ)nWSESAC2fpP^7_fdPch#RRk1oRnru>ND5Au10PTF@tx0Ut*N#~ zJW7Ca+#Oy#gyfZ4=N`QQ=Sl>wS|sdklB$vpS-g)EbPS@J*|MK@GToaRA482t)s9FE zm7UuS_~N)ApLlQl&FANw80h3FVvMZwvDVR57@`w9d(u0s(>(HUyxz!o>KxZ*ZIfH- zv}0@2x_#=*nQ&BmF@PcY@NE5;UoTGYcLp}5TBFj+uJv<|-Pacl8y+R!OgV1HyqkMz z=Tikp>3}L{=iQPf#VK+1)(JN?^3^9VriK`^#$KoIY_M20E`Fk`tynutPFM#ADYWVW zERK#2vBa|nLs2%ru}(u1vh|6ROTV7hqRu`x4Z_f?xgwM#e${IS9Kp=muAT24vqtf_ zX=`&Ll&vxkE+(lXTUJ)|wW^H`hq?$@=}O!;G`o9v3ydC9z;$`O9a`VaiS=`L0S3-` zuH-UP+(}%Jb4*1s55%r7<5#Q8f)#X5zv)1cUo^L~$|_!Z zfy=ULme#zhj}d86eU>W|Y7_JwIRxv3V+o9#v{c}`{b7o!tMAQ_F2 zE?U4n{#=jO88c}-(xFI&(c+Dmno1U^p-d;u0>|~H-d)~`TcN_p|1gzH{J@G#j0~}tncOm?p(vw zvW2^}Vrmbsh#H5fo)lz*0Kek{tF2edp{T&sys@kH$U2VQl=4#V5&f0i5cQv57Mc?U z@A9z)-=%Wh6^ZhVV!rQI?dv~JJ!-iwkko6oZ{{aP@i|V+oEO?xOwrO)s`OZY<&3F% zWje#7SK!$7JCias79j;B_^a_pTrcBIjCaovo2t4VFPAbm0Ri`IKLS&87DiH!#6QsX z4*Y+h?NERg9W&|hTv77yed!ntZo(p*U=Crk!tAe_jZO8nHHVHFZw7?}=QxhEp=L5P z{1%4G4!qI?54{U~M8smo`E$wiS)F>hW?MJrtl=h`>s!2G+EzpwP{d;Jlu91SWp&gb znac^0AXRb;s~d%iigC99sdpsdfaDsIw5*+b4$;$<4HUg!9$Kz(STed~&0!+&K94p& z=?nAq6~GI!krLFx$Sgw2EP%8a%Ubou4*amyX=J6&F6F?pUr#?gsv)0F{I#G4FSNI- zVL9R*{2 zkDpde(`saCY28d#aLw?N#X?=V+SgKyEhIO8(R#OrP^y#caL08kxH#+K(r>7ORp)hG z@mpV`Mt0~hkG>cyDR;^s`nS0RyneR)5mCV+;={0Z@66{dhnYJ62gQq*nn~7%vc=J+ z@jg^2DaKv)hp$Lm5ex9ErylG)*VS-Z_)hxBCt5wbjqs8iM*d+SSp@ATWq=<%%@57{ z>>0HvqU#8mW~Ow2x)QZWrb4RkRjac!YxM(FK9Su0Zc1r23N6Jq-)sAaOg_;&G|QM; zV4d??{6M^%ur&*N95r$`%80;EV}oX5E!1Vj*IRhInG-pO8b{s+AL@)$A(ZY%fwL96 z11F@5*X5V>Jtk}VW|x&h$`_se^mpUPjcNyXHEu%%pVLcwina=wzt!zw| z-F7CoteyW@&KFZw8Vr_l$!lluJ;^Iy+R~5~TgE(Z^MYejg^IOXl}nC8qY~{$LM7Du zp9@&~oJdu&mYM9vlm*q8{IZ{o@Hvl=v{$Le-2JXO`)j>iVtr#E{-~wE)Bxf!A+hC1 zywc(`XQVDzKiX({d*knApKWz3f@i;X=lh1=^fQ)8SH5rggK9NW1cZY}wc9cC*UHvb zX29DZi#K2f;0RIX;wk9jc;8t<0fwYo*oc?vM0b^3T93#=?&r~ylT#x(g;I%igec;i zeRy|uu8QW+t!~YYgWj>`r9;Ad1`k0Tf@_QZ1+HvBk}qVQFUn@6c<639JIdxgDS;DL zNW7SIfSnyP4h?$KxdAidqNi0F<mkB;|F^sm->cuZ0^MxXv44u zJN&EVW=a>^??67Et6jdRJ9CMq`^msTE@4vV^9#9wu81tucXM_=`*`KiKD?3VdJ8SQ zJojNjw-&xV2y|Sw?izCp`|Zx>_x({T4Ke!iI$7`5PIu`NmJ`3txD?ATLvpi)9yabU z4<;JbD0)^NxGyrmlG&$w)_9GFBc*<9cu!Fc{Sai)6+?pDV|&Fz)Eb9V#*>7~OWCa- z!FtsKt`RW-@CYe-hv>p{eDq$YHCjfJnuwg^o%;J{H>XT!XRi{ArF5DddphLNbhL{GUQT^dJ4`e%F?G4I8+o zHD2lkp*W|7S+ig8+@>s9LiaOGUG>jk;Z|ST2BEubLrpXcFu)$fK>!q-a=$gl!Fe*D zLE-QJ<1OjM{OVLefv*s-F9*Rd!R%X>k(~yP6bh{{qLdr%Bw4SS@Wwg~KWuw^HUEV} ziX#WfpR)Rxe7&bW(kJli{JPaOI$ErNfCa{5;VD@7{g741ZIa^XRFstMvxD_?q480l z;JKXPcx>ri)7I6Peh;6>ix=y08oh}dd@(1fa;(U)6KNoKsBz=@?_n5s9l7@xHTXDe zePw;u8~M0m!yA44sav6DZii9^0o)^@(J(qeT&#s6g#Wc#YOqv_G<#h`2010Io;v0k zoQ(7b28IK_Vb{R*G6aD|1j|qBux^9mn~40US6AY|V@(N)0fIQT5zwiGnXc^uq zva+@~zlfNa(ZMu51+m_r1d``70S7lFw~?QWvQ6oahuAgLGXW77ap-9sHe;Kr1Xy-k z3-l#2+0LX}|HN98@JTWkOe>xG6zMh?stD~|BN$i<<$qM(71(&5+GLdZOyr3I9pg^et$LL8cX-=QkJ{5AdhV4BPvl+EShUwm)h10Y$p3-x3q$)odYzWBc8S}wLp`}kPYr}rP4~P~WKz%Uv%u0QYzTPlY~crl z@j3!!(ivDI(xN|EPKQ7v%S@DpYGlsIe&4ddp-g0PiK@KsAWLMWa`(ct#@mB2 zwV83;f=w&O`M9;|f}alLHp|1)!JhKE77GGR-n@C9j4-yEPPL%>$;^7!!*_VKGg``; znufNCOtgof#7|IS-?{@q8ISf2hGUFvZfo(W9^uhnx=cN-hthulY}x8 zP{yJqJ8$JL09rq#r?YJrF?P;Vt67-RSVUnGRP@SKuDomK-OrH;`u*YkjP5@vw)fE! zW&o{WwZnJ9ts`l%(29;8a8i9(g~3^i>?xJ(J<_n5@+W=F75`RX=`aOPy*sPFpVi8@ zaiFGAL$0d(K=RC~noE5)6cj+v;H~hraejIq(b=2`xr(Z>#mdC$h@k5?Zk*@O% zsBsK3nGyRU0z!-gJR_vQw){TKLJh&l-z%}Bgtft!^^`cp#ka7*lI?26e)b&UDMNxfYeEZb_ep z-H-V(4`x094Q)}6Jhn|d!=^F*n*|6+zRKfZzQLZiVg|(4&+B~Q*04`bwKQREueaYf zz(D&>Cjrk<$~~iL|J-eZeixOl@~x(n+~EsLDofh@+6-HIWsm+o&eWTB8_}2R>j2(F-Td=FXth?L^cU%Pt&OW7~-HZ0oL&)qQP>Zu|a=yRrU5k zE!eD=?h%US#?xDGAi~Fa?Jmr9Z&NJg0nL!26tK{!iwOoJ5?X8GGR{V;}MN-@|X`*?jN}bOf*CNl02?mlPo9_E(l`Bl@a)?4UF_h316Ey-P z66|puqB1$$7gBcx4h|SyJ#&6RY87($8>!}FM^n(WK-M-DF4iq1VoL1ly(Dz8=(`(> zI$2HO=C08@QTC|L)4hF|Nk*{~$p;sOFXSu-lt+wZ!>1CP=4hf%%q2?17>}`^aL>!g6GoCN-e?5pvgb(Q zaLj8&<}8o)2~zEw=gJ<46SLajP061{*5)q$F;C!$n`+62?7iyQRu`1WRZMwFQLmB! zj1Y|L!zIO*)zrgY>$UqyF$q;v4TvXhGhT}8OjKOp)7yEthm`Flv9eC^M7Pc4k9TY< zo}D;C)DuCyS?@%eb$m;#LcO;fz5FyoJ0?H(fKMtvINo>fdaT`;OL zj}6c|uVGnQp^Cph?T^>9Y#ME{6#K{0Wwua7S$4UkMDZripM0&<;_Q$McQRqa)Cj@= zo#)<*yED3r?Ce-hV;rX)BPXZIjYeOTa9f|v8g5k}@qF#C>~W0462VqLRIehdk8fE( z?+@#CNK63_ga&FbfK`&ydYsDaeXSkNInq6vc}p}{cve}4fs_3pjtHAuIi6_4jBfM_ zaPOiaW{?p0G3e0T{_54!{W>TrKy5;6f$`{ zn|?JtoCo%c{ZjZr7&Thz{@A+6QSre(;N=I7eFW)Wm95#SrD`WS?6QE;h?( zRE|^aQnMzFiR`K)V8;MuZ}#v3^G(k=0xf~I&D-bw?+yh%IC8n}QMl{XuNBO1S)bf^ zL1s8@80(d0E2A;wZA2Q+HF$|-G&W?#`X?Nh~*Pco6kV}>xS6!Pj87`z< z>z%WHJ?OmbbbUVkt%D(o=%9=ohA~Ir11A;9uLcUybc-4;e%{?mA8ToJ=9gUmE^!xx z)DtdS7o$!jrNG=sWxm{&8otu_GG6R5p1j7o&(YD;Qkwl!B#%_xqDTNHTHCDB* zwA8_gb#B)QpY-=^*#@KEsh^UgnT@fN3z0#D0c$E|5LET)Ej|K-xL5Jmlna(AR?V{z0Uh3W)XX;*wS}z}0zCZY=E{UT~K{o?zx!ues^*--Dhj=kx z{nqobd@K{Ou=Exi+Ks@URQH{9GqQ5&B{gfWtL!XWh>!rl+n9T#uwO zU=sTlfbxc-|0_#}V-&Tf#!*nhH?Fw$`oNnl_5!|XPdyyOLyh<*spUqJnxY$rCPY`C zeeXkiP43yb`~9dm?0r_`*0c5!RlZgRT}N8gtv!|n`&lpNBsXn5Z#A_NpFg*YFi2mU zimMk9%L`m$X^Rrp;G1}d0ClgXa8EV<24&P8gVQjDl=v(Ll|+AmDh82=4%;&jP&72P zzgRJ7uw9%mN&t^auf*$8jsrP%CRLC(^Y-fEe1NDC(igC-x-dhv5r(g`Ks+7{*m|^D zWy!9frW3pmJ1;GiGmk6nD`3sI6}=Y}dW5poPPD6}czU7~lmZuEtceMb{BP;d9_H{5 z?*6w(tw{3{-woi*i0IU4KX?91dtX-MttCk3lH~0x$L%8 ztDR4?J*Hh0pRYw;5~*Q_iOEFW+N(&7tJyA=V9G@k<7mg$f1=dwS7tpL$XuRH|K4C^ z19hKnOex^?H@sSSCY=Xc)tvHw;=0bb4r$5Eb8l6CP_%~hof}JILB>z${(y2)T#1)Pt1f4j;{2<-3(}S zjR87!B`tc_Cjj;Lg9UW#q+Yt-UE{Y7$MYpqeSj9Hv!2Yf)}P)UGld&h3&cIkl>`<} zKIw8sGxygVcH%G&XVBaGZ3DuyF$7Wjmwv0+E>kQ!Tx9GJV4Q$zwn~&L%2q#~4tNVw zdj-s)`{gziNI0`_nhi-1orpMxDKEJ&wc&!BbGJNM?ki(K{WyJExCOFo{x>fKwfE27@acPWD~n zxCsZZ;e4mtYc&(rsE{j5-gB3oa~2`tOq1M^O8UaZ{N+#Twg!! zJ@R#omjtU%rIe|`UuYQZe+dnHJ;%k&CGfGo^VDtzLg}GRKw-QmyK+zmX>k8NRk5YX zq72JJx6s2HjsLY;(wVyaf`)9y+$)PWPZlR{Kk7>%<>clHj9w4h5nTKTy8Xyt{&Wok zy>09-c>UA2Qx@idW>F|hweu@XCaM?{lwrJ0%z_Tg@v1rq&nR{d&XD$ z_gw(cr$afzHxh#{pUkq*ksuBwKa10I!x|JCXHaj2J-lQ41j}3R{4mM#Ve)kcU-;QY zmF91nm#w!eGIOH^vc-x7hebt=ET)c%Fq#~#S%GeFNynJdBAGjMBzV@38n;=4_J z69S$O`a`69{>3x(U^B=T4OP4D_`&r;=o;wk7$1C6v0*Lbd;>#r%6Hp5KJ4S~Ozs2wrGnNMd z*7lk9SpbFr6uZUe@jOm=u4g8r(mb(K1WmARw?tk+6FVfUr*2KOeLB_RMTZT))t?wF zNeIrNwM?v@(YmTEZI!?_j8np1qjzg?zzUbE3fG1W?A{A7=UY8|jri{0pj(ycx+6Hh z1V~!C=c(^H5^%msYR{%d(?!Sxl$rbCkZ4g@uy)9F2QL*$w_d7!{ssp2hpeU_Su;NK zmlKO__EFC0t#Eeqo1MXYdDFcJw$Tk^Ie#dfR;>zvKRkP$l~H2rds8VftR)cO3HF_5 zt9Ebb+a2y~_OzeqS4wi4FJF2Ch-mJDLDJPPKpY(3E&E6T_`K84;oYUP2ms!x zOpsthAZ=hniUPYXWFV0;of8n-qe5&|x{S^+H>YeCb{0(q@+6z0+MQ3>I&;$^)7jdH zuPp$z{%^UrbQRsHVTkVFUun+Hx$gal4v^O=hS@P4$2A<{2&QzvbJ|$-x^9$@^=|oq zwgoL)m5-#hmQ%e|{Lb=XT14*f@(OxR1sa3WE-Qf&E%!UgOcHuR6W9FEhv7Ak+ItzDtW_hy#=&#y@eyi*oL^# zTGv<_l<+IpQ2kc1QIWoIPrHu9GZ6f&scEWQ2+)f2w`wmDSYk{q*3f|Rcn^@4h63P+ zDx9M7HGxc0`xaGGPJpO1pT=^q6PSoZ`68+EGAFp~4*2txm}F$Xs>($2Nf80`#7=X2 zO|6u-dR6I=1x*nIuh_&S2qk0FFf3OtPwn~R>~qA3VeWZ`e-ehlZ=rnQ9kt0xo}#gR z2MSup>WkV&>&CDnFNUeDMatj*3LfK@;P9MOCjbaIh_b68lDY0WjT?o3S+>F@76Jv0 zH-G40?98OXRo+$@tIZ{^*RwuD|FieFUXz5Duz_2}>TZu@Q0nd7YLWid-BhJ}_=PH! z7Ft3s9e6PQO^_oBgl%!7WVbf6V2KH2hA+GT!H-{XB|_@ZGa>}za1418>Ije+nI*ox z0Rm1PVybv}aBtx9QA)jvsVH}NK^v1N{3dU4+bd_r=FwSQ8^qL->n1&fllu4Pq%463 zSu19vp)U3FHh*5BnbDb?Pa8#u0l-r77nF}RccJLTn;p19Oiq1LH3Y-aGmb+5nOe=X z!(oryxH`{g4eMe-G7W~dB*55zqX%P*?td8&(CYNqcN$aUX-~7xHUPAoor!mU2opEe zac`iINd9!FW>k>-$1cB_MTf3c95oYEr*$qf%}2#2!e3omFkyyTr_FYjV@L?= zkk(*L8lt;9Yp@|bm^qh9Tt2RK zGu+(yK+=KD!F4j3hEGj7lW`^sUf4k7qE@WBque!>jA9_Ama23=*dV=Tf=zQ~j#4B? z%G;yn?fLVpXh7`sy$`Tas4Fci^2Z3+&P;W_x@8)VBy!u?ucQyp%O$FUQl6)32cg&_ zb%8j+YHmZ_)%nv89s*P=_GOpr>J#NhwcN?1=ZkB392+g((;F5*dyj|FO@{$)#_5Kl zl!~4lV;#t7Uh08ir;4u9Z!u@FPnC)d`&Q~VXKpWcc9e8X0@6DL>o_h13ZPhWnE$qQ znzc*jkra){28@!$R7sz6y(})A{9v}gB0#pg!mux_sdOx&2ofr88m&bWl5HDqV?G(* zqR1{6`#i>4hiE=0t#-uJO=}@FWlv`cRlWNAUOwco-fHfvIHk-S4XW!_Mp4`$dIWZ5 zQ42bPHftaHa>EN$l|Gt!?Lj{KZ~e^TLxP`@!_=}-YRAooPC49%+EzH1fP@x`txunBVI@EjPCTg)s)BrJsKahXE1Ju zx1gu^aD&8r;2ewz<|PSoqW6+4=e^Xf@v zi20Yj1D%|kyoaWi`YjoY)x=eGMQoL#?|u?wc$no20zlmc(R4ng&pe zWoNsvQ;}&sst{$BBQyMDEwTC>aogokUa|$W^q-;BX|RIT~LH2iJ1F90GRyz_6iSso9molJa=28h7uOumc<0T&1C^2GjvO-ibb=X_xwM zYPKdFJ8TR+18A8(%{Al8D@zRF;>nnD<3F^$zy7lKCu@o1g>u#WlAhF z$pwMqgnT4=6jxEAeg9(4ST_9DXGA z(e-bC>#2Dk8%|YYgICnQ&a{&XIuD__49(+U8A?>v@XCtwXD_c#;Dr|D39CCBG;&W= z9BFh!8v@EZ5=s$wD`~Cb57tC{C@{yx^r$gXl&a&ou#JlQ2F6rPE2!ZIN2JP zGTL<4y$St(Gcpkec9}J*Wm8y<^k@+d~etZr8@9b9PM`Q^-Z*om9$e$IxsBQy5OcYiZl~uc0 zVG|SX1Ri9A^%r2K1f_r5DnfkGE&sNWA>^C_j{*VNXL_n}JgGtZU~@X2u9is7M>3)Q z!gS_z*cp>*##Wnbz`t}+BcsWnUVO0ya`Sk{xop1jj^+bhF^Id`#mLKdh%NJw|2m1D zpygz)`Uj<|)aWap>kc&CMpp0@@WQ*U{Cq#IE05mp8e;P8cbRo^%95O>76Y>ts3VUk zQq7ddHSe>^OtMQz_CgcX`PU@;#g19n)E=o4g&bcg750J-e>D4tfOSldJ6c zI_!>3mX=&=4g64My-FnBdaM`eeEdP_ej5nD)~(l`Bk#l#5ea!8hnwLk+Sl$OR7KE~ zg)z)ADU>g@RK9%M{?V?da6=BV{HEMwDsf$`?$qeWF>0Xw_wb>aZw~#(CyZA9(2h;I zvG8!2#wlaY@ayw#T#FR(Cz({A2KnC^toR)Nk-;h*8#KfuXrX4EP$1JzG@p>wZNPOi z#YNgB2UhzfVrq~b*+Uc&%cS0No0k&MwrRS?%_WII_yO#6RGfJ>VD%fsxiChhf2DAP5Z~YwEO!`$)2kPfu2o`^=5k-CBl_Ch(CZ@8Wkrp#hSb)H&4*Av=OLc`TNeM4>;8XGSVTAIrpA~5C3dX;yO-wa5h3X79Zo;C zIZwG%Lw>9;=6^%&;l~+vLM0K+pD2D%l6?TBB+c$vyR!bJ&WeXM{D##oq6D26czzt(L2-UrmM78@FA$MUb++d>Y|!V-g_ADZE$^8=W(SU z{MH~0E5ILK-F2AGaCfOA*_y7z|c(Tlj14hogLh6a>?MWzOc?Csl%m z#;3t)%&v_?hUN0~8H&Id_=>sin?eYru&`k>+1xj#16O5fEAHSRfpg&u5WbU!_Czse z-CGO*@2X`rxS57Lk@CEn>(JY>1MBoQVVf#5Jftik z*>OCBwro&-c%v%b%#3T9W5sbkWh0JBKCNOx%Y1p7-OoG?hxo~=8Va%>s^~MWGiOcp zD~XGmcSopN^?F|}%~QpPO*m@oAwxm|GFA%dK5RltrBNI$c963^!fv(Gg!YRNq{*{0 zoVU4;nv(!_z39=alCEYwtRP zn(EfIy`cgkU3%{VBA_(Efb>pip-GX@q=sJP14N{k&=C+KUFjqwASg&Ep%)1tCG_4) zfSYgT+?hK=&YZdT&pkiR@3r^ZtGw&o&sytwpV!CQHlxI(6mnz46j%jB#-$7mBz!p~v>(bxz1dLse&gKBgppm;)4n1QdaM=DFd>vkWFJrq4Fz)uW zpunj}m47TA%v0(BRI+j@62urpK%FMXN7s$M&O7ppQzrqFscra9?QEeVbrZ^%QUOne z0pSg&THd{^T3dIohM)bWp9WKgl9#x{(j*z=8|!v_#=g2Cp1IYOz$&`|*?vR9hI3Jw z*+sV0NhaautZO zC&=w-B-TM_zl4g#E7hueT?DAOfbuy`Y}3?8L2Fc2snc@i$3@@nYZQll%~Pb=QB~RA zO9`K8yq6832T=>Sd5f)e6ciLRL?XpbYS)VE(8nMFoMf2I@DFT40>cf}*7D3usx;#< zgaE^~7zQMNAL9K?o+AFu6SN5x7Y7$7n!{qh_>pA3U}C9G0w2FRqH7PrS{t68P6Obs ztE*{iv>&M-;Tw{1c;F66TK!e?M1O8BDOLq-P1?c<(>AqN?h**78vN{%{7auIZD0&7 zK9?j`O}BHf+M!8!cHW6w$G8?!=Qa2+J&G+!IpbM6?{@8+e*JKA%DS>1V=rpVP#pF# zorva9s(#4zssR(o34kRpC_5vIwxqjDEk=<0U{0&@U{Jc9)Q+no(b{rM2kSqS#=w>Y zy@4Zn2NLkSC%-CbmXXCC`nl`JEk84(lE%3b!T{ISa>nahHT61@x6K~WstlmXn|eOg zj2Ho`RY%hyVjk@aOhx0xa|RirALs9lf9T8*y>G{DWaP2l0nhqYdD3+^RI)Ke;Zs_b478<#VCmA+bz$0QI%; z9H6ySM42rx^!=3U^5%}p0By%ik-*;C(?n#U;xESY%Aqe%+D{#+jg}dXK7PsxZqTA? zub{#gXI?|%$$RrT&nopNGc4a0;)ZmnaM2v=6uqM1Pbzgh^qTc*$$hxwX=aX z+V?tS8C(}_eWMlFf#u;*cn@yKCPSu=MB_hdh?I#r*G~d&_ zruM^ODSKIebwQ#0=k>?8OkSu%mNWXcC)A7#;|d6@Tk`nK942I0;W!5d@e)sBq;mH8 zk@3JjR>VE(w9r>U7Z8H{j&rkrQfbe!EVx^)%d4Il^Y$4|L=dK13!^k{oz~Pa5=dEg zQ*}^PFY%9Zt2asOwV{oG_j9Ig1B_04Px4f%H2muDV|w2(lg!pRd8$i0Q~b3Hi3v%a z+gdQo-zbfFqh)f$PNJsQojx;&{=6e62Z?UXdu!dm-B+D$pP!G4P^dD(ffEDWx;Yn# zXTfs8w+S@j!su@NoJVCrLk%hyUYKV%ukFU6hoU>Xi+kBx?xsDOMToj*>3Q48b~R_3 zM5YtDpJ4s)r#i?eGB3aKTQ`lvb8z`mOb=x@ZrnK9Ps8TNof1cJ-`%JC)V7u{L=nPpLcqrP0BUdzc4HTloD|ocOkjc(k#2% zB*Hd&Lk^>j?uV})0LA)*!4^2$9B7WQn3=n=$=o9quqM-3le@dEEf|ddQk+5p@gk`* ziSZ&iU8E9IF|heHDuab7o36&h&}OCaFbocYXq}b6=ti}!k@Al=9PhmQ?UbVRe{NelP21MVo_sEtAuO0^7Y|Dm7PgA zRY~{o@bCW5YJ*j1Fg|JHTKe|OLRk?(-pR^}h6%7eKSo>p{=l8+3O6R?OUHl%Esqkc zyu(iX??f0q>4vl^$nW#u=(r_$WTXhKi1lhDwfavJG`)a9NkOrNYP3J{Ekc=75ltpw zgMo^pEjus&vaw-Z31cst4r6Frr#o7U5qO$WR^VLGkT*YrEYt<*kM!H_b=4L%41p8P z)f>bsDi!9PsKa+qm5uU}*D{85P&HcNVGTvf5Rd9_D|5^aU6MlrYfnx5CMKOI?}^E? znM*h&OF-PkU+vd%aCJ4x zwF>|?+AB3+WzLrYk{!1^#|AeY_gY!fd>_P{LbiWRUfC&^qWuI|m|s9w_$1N4?O^!Y znBunqc*=k%-_mpPOdHG8mBhy5kK5T`;`BDJD;rjqjS={n4y&qMv8#Hu@B@Al z(dCQ}?t>&-h0+lR<%wbm*+EsiU~N}`rEZv8sC|2`^vZ5a@yCfykLvKOhPIaU4=o0+ z#jfu51|V0QpeJ+D(NQ59U6_|1#Z{H;^^sHCu}8b-B|e)i0_T_McFXr@lHd!w%ZqCW zzx0RmMFEN%5_)_m9{X@>C!DO$NzW|D{!GA07vo%M0$T&x*`gx?JcYHH)OYOB=i;Dk{)`PR7sKMZgf5RXCyNF!kwzC)$O>=m?Z(}lO~Pn4S^t{) z(#LbVS#BZBL8vKE7r)r|+OIl*I*Zj+J5y)!d@Q2wWq$%!N{4&h>x)dM}=2bl*s6Vtylf|Ws&E4V?dW2+M-pr-K@Zcl{#51 z-mY0TYXTK^WE1OLHv|SXxD`~~Nfd&P8+BwPF_f(@y!A3#PKS#mRpjdxLu!&-cpaa) z6>llS4%|3ebnZ_fC9=E_pf_x+iY}D%4a&%FT!Np&1Z`H8;PbNMqu+4H&_+#Vc-uXb z6kd}hO>QRV-USz&;xuh&f2G&p8%5BzFCue%^o7P39PQ9ww8z}pZ=YYkfN3AYuH@K! z4qJgvV#pX}yjevwuu_{?aRt{=QP-Q0<(Vhtx;Ddg6u@EIP8+Sd3RADn#g!M)^?|js zKig85rO}LfEn5>mdp3Xk^|&Tu94a&w^TAJUxM6$xC$MwxWHMke@}>>L2yVsFH8$M- zM>DR;|47y|@@Ogh&Nk;MYL-+wccl!!RCaGeFgY1C(uA1lW#_(aJjE2WvzH?@<&HlE zjby)(3BZ64O5ZN^bA)~;qbs(B9F&$B{4IFU8rm?$+@)*Iw@OL*lXBzK#9q0!7U463 zqO-&%(y&x(Y~T*o0ep!t*Rh+h2{A)Jh<^WzJ z!-bm6wUK0W#=W7Ye)i8oRjA2@SLP27J~w)Sq^cHgKAQ$_d^=kvHyZ1k+-h;=kTU`u zj;_#CI~_J0x;MD3_)FVL-p^nUm6_FB%gtAsD&c+tiF%_OxDM_x!^0GrM(A2f5pn(FDYAsr>Fc{zSnfxxZB?M|2hT8+z#Fidhy&qwh$Pdwk znY=mnL+vy&NczfM&B~X(mxW-EhN#>;md;3t$_SD{c${*sEkpBCWOyJVkS9Y?n^`Ji z(AKrhL02ql{+6rfB+7lKQ7Uc2b+qy2Ypn|lC%D<4{8s$QN27=vuj{-NIi=vuaeq8I zaZ*=XE|v$MfSY~u5xnvrG0GfB;N}32Zw;{ zzQIOAMQe_?ZEmH>C~WG>25{fs-{%{TWr$+^Ss}{G{uDWjZsTypNO^5WX9OWiPq*3t zuJ8~-3?{!4U6#3B;;3g(;JwT~A`Gb)f{%BpX1T){Bd`qocqRIu?YJ!1?+N+3H>dMA zlli;)MmA3bS(1>grl(hz8A8$WU*kEkt+1)a;}evI(qias)u*3@ObcDjT{a$>;fEl* z3N~A*^^+$EQ82x{0m^fNl9Ql`FlNg^f^eJ8NH~y&&aYwOzQ4dc|7@nX=!GaVAgHhK zAx-mdU0A&Y*5Hk6GM%qTMmnjPVYpYl(phAM?pQ}gl?u+j#bvvcmmLLWOcGKj>r;Cg zYs+@k2cWS5ouH8#u5`_*nxPZ8_dgubvq%o}Mt&djO1%qmj+d|Dwf$4enggm~_ZKwV>Eyu{Qx0&j3}h|nAr%*naG1(`(n9uiLG#=fIugv9U-uTX47 zC-K_$qC=74E4FuI@TZ%S#>ZF?eQX1V4d0;v=K&uF$h1UjgCTHK8bmvw}y z@JhiFT|wEDY(%;yj|ZycRVcFfe)82!7l5 z4$yHtXAZ+3lTWbifGzIcAmU`3p>n_e{P|Sj;9NHjt|>Qd=m&;H;s^xfy-?r;i?ezv z=aVPR&}?Ol7DbZ;3>NKeu zm`rp{L}9H{5}k%VLK|VUsGks_?K3|{UKw~40a}DJkA$gjkS+K)xS`yJcl_h-k`ik; z+v9H6RICs`&2U)s*-HG*y+csHA_nSy(dRZ-TrZTozvDncG>rw>Cc#@@{y(TIUnX$V zsW$)jI?(^(gUyfHE%~f=%tTSOVk|z^FK00Za|Mn2RxRmUKjpa($^-j4!y@&0h)e*P zoE&B9ti&pHWX4C|*{ayn76@aZW~A_$_0jK0jB15A9n)FIZySmVt&1!G0$vG*gh)oW z=9%Mj4Hygz@rB+SvlMwv=4P~;ZZ#{lZec`@Ipr>eoKPFSJ=cdJZHLhhqsbP|2ew;r zZA@(_?q@MRaKre`?I6|1iea5mGsc*O{A19T+psMX)T5!>aVxaa9+*CC=oM1 zHUA^T{HYT$&RDmo`=ZL@E#^NPSKR9fN`$Am+`_$Eu%Pn^ z;Hi8SJ4fehT4W8ku)eLOw0P6v;+hd%jY^?;cCUj2I6fil-md?alal6})naarHab5- zOuZPL(_9uwREwB42`fOpPsnPB9g6)@XVSvF`mGSqJKN(*bqd^#4-DYehl z5rLy=X=M|$)Gl&u`|^1D?S#ek--eblMDC5w1RmR!v>M=h08sIZf(vr^atlPta+U1WhQa%)c#;;}%EugY z12!QRx+bY}Y%7MhLS68qo*-6FK?H!@!gnuZgYq&baGRxT&-`%iN@|XS3K?e{?uo7T zCzUJaB!W*$l_i;71_4g~3r)^?#YuSLemT9lssd#KwYd7aBNJNrGY{ z+RwL_pqQ!tg7z{xxVV%KH5I~V_VTIt!U@%n3N05$7Z+2fQO1+a{i~W>CeC+Wn}Qwd z>!;zumfwwnrCke&#QI&UX*Tt*nyai4wrm+XIf@kC=IS{>hncF5DEfQvqNxRQO(=I( ztAtBDPNmWPk8L_q51C*ksJHOB19=$-Z?7RMP^@l4-fEWY@*Dhb)`Py-0B%oR(+`cn z3EifqwU+TRale<|j?3HXDj9ArA}cvPA4nl}ryJRq3$|@T6T-$&r{*U@K?SJLqUtVU z4uj153QK5cD9RT1-H{ZvELk-4~%K!OXm#;M^q&ZlPBb;o|o>C~E$!--~&&wpR+PfSuXxnF(nV)#rD= z0u=;_(A>?0#x?`(oXma74)hOKg~-aESF~^?PFT0!Ua4?;h`V&dw@O9z7%#@6S+w~r%auf;P!t z$~x7MT-k7Ct0S_zz14+ke$s9!RM+uR0#%EqXLATkNx1qo%VL6^IjE}HEv z-VnbZmMknRSFc`u!O=pbpM-s!yj+`sNMrh{)&_Zm{S!LGgv^*?5s_XK#Pifhu=TDA z;lRW-oU?1H+DKkr9w9m0M2;K?2OD(Pt*=orG746G4I`lr4+~Q-#u0i{DUkNQqjk-T zB0^my1%2@ViICWqoq6_aZ?6{ZU+Pau5@#DAk2v`{m_PD6hBGpD6B$K