From 7f4ef8efd38f9ca7afc118eca06fcbd0ff2c370d Mon Sep 17 00:00:00 2001 From: "Edward A. Lee" Date: Sat, 24 Feb 2024 09:50:46 -0800 Subject: [PATCH] Added README docs --- examples/C/README.md | 1 + examples/C/src/browser-ui/README.md | 19 ++++++++++++++++++ examples/C/src/browser-ui/img/BrowserUI.png | Bin 0 -> 7164 bytes examples/C/src/browser-ui/img/WebSocket.png | Bin 0 -> 12114 bytes .../C/src/browser-ui/img/WebSocketString.png | Bin 0 -> 12832 bytes 5 files changed, 20 insertions(+) create mode 100644 examples/C/src/browser-ui/README.md create mode 100644 examples/C/src/browser-ui/img/BrowserUI.png create mode 100644 examples/C/src/browser-ui/img/WebSocket.png create mode 100644 examples/C/src/browser-ui/img/WebSocketString.png diff --git a/examples/C/README.md b/examples/C/README.md index 9829af28..50e9ed67 100644 --- a/examples/C/README.md +++ b/examples/C/README.md @@ -2,6 +2,7 @@ (in alphabetical order) +* [Browser UIs](src/browser-ui/README.md): How to create a browser-based UI for an LF program. * [Car Brake](src/car-brake/README.md): Sketch of ADAS system illustrating the CAL theorem. * [Deadlines](src/deadlines/README.md): Uses of deadlines in Lingua Franca. * [Distributed](src/distributed/README.md): Basic federated hello-world examples. diff --git a/examples/C/src/browser-ui/README.md b/examples/C/src/browser-ui/README.md new file mode 100644 index 00000000..5311ff19 --- /dev/null +++ b/examples/C/src/browser-ui/README.md @@ -0,0 +1,19 @@ +# Browser UI + +These examples show how to create user interfaces for a Lingua Franca program. +The UI runs in the browser and connects to the program via either HTTP or via a web socket. + + + + + + + + + + + +
BrowserUI + BrowserUI.lf: This version starts a web server that serves a specified web page and enables implementing an HTTP-based API to control your LF program. When the program is running, you can point your browser to http://localhost:8080 to get a page. Adding a path to the URL, as in for example, http://localhost:8080/count, will cause the ServerUI reactor to produce an output that your LF program can react to and send a (text) response.
WebSocket + WebSocket.lf: This example uses the much more versatile WebSocketServer reactor. When the program is running, you can open an HTML page that includes JavaScript that connects to the server. Messages can be sent in both directions over the web socket, from the LF program to the browser and vice versa.
WebSocketString + WebSocketString.lf: This version uses the simpler WebSocketServerString reactor, which is simpler in that it restricts the messages transported over the web socket to be of string types and it allows only one client to connect.
\ No newline at end of file diff --git a/examples/C/src/browser-ui/img/BrowserUI.png b/examples/C/src/browser-ui/img/BrowserUI.png new file mode 100644 index 0000000000000000000000000000000000000000..dd0d006c8fab63ad3ee856baede4b23d41055c2a GIT binary patch literal 7164 zcmXwebyQT}_qGa3gLEU^&CosMNQrbe3{uh!(hWm{%n*Wz(jhX^ATad6NJ=x5Gzf^) zZ$965y?@+$*V=2{^Xzl>-p|?RIZ3Z{HHh%(@E<*TL+5z(8J}Y4URKYI42s+kMV)Z%IjLpN&<#&NyzvSefD@{OVKKC1Idi+UC*`jwBJcKXQY^eW#l3<@Ey%z9@@%jDd$amrEq8`s8^G9&!tO5SzE)ZIQOPW<*fVuqJATZtC(Bi?hoqy!6X6!Rsg$_5;tJhKVEFk)?KMR9-y26Lz6 z4&Xb*1IRL!l=c1u>hnp($i`8@cJ{uOC+Q0Rb~lhJB(=9Mf+d&zP&sd75BTcZ>`%`| zg(Oe$#X87iXQ!Nj-yTW)a&NXT3BLr#}^yoVS;SPHi%{R1dHMVM&ZyWop& z-FLNZcbC6VE)Yj%9$ZH<7P_~29ak%%dvZ;wo^9*#f2Of6&+m^ruU1+}8YrYppU=K> zUk$$!2*8XsB0@KbLA9~;9Tx}rPGSJ1mlhlyf!}Ca=j~JMyYDWwR9=uK3{Y9r1RXRE zk*!DEZoZ&S5$XzRJZ$|%<<)iVd|GXD_r=r`zLo5hXI5z%diWKkRl)IaJsDZK`3dSX zvN5eCB+zwxHfo=#Mg>COE+0qaUz$0jiBC6biw)hK<#+QNn>pp$CvoI)U#>|)Dj|MPJ1O|?A&!jhyaHYTjnh{-dq zrXXcBL;l+-HEK#NLAYZ`6rgDm6Ip-nwJ01a4W?j6ZA}}I>j4lK%&?|;LI%`@siKc}&#CaJ&B0}U*0A0Q*<a-@+k@U8{?G!A0%Z{XBVI^Ej)DLOK1(MU<->yWa8sqiV?en>{C1eoMU2>%kaiqusKj0#TTQt zc4dkM^^a=nI%#kL;1nWhX+2`KcT-a(fSi8n>hxtMz#`%B`|BMOpN_QLAlYE`N$DME z@(^lX5WQ0zdc=L!eY+(@Dec8g;}&<@aXvw>7BS3`Z-^F&2h`o1mpnkxk(hGe3!Xqn z{zH}Up3zX#*_>f#x8Ea_1xJP2)}oW4{Tl9)=uEqTDZlkNYEF3fdeGTi1WN|br*s1N zx!N;o_4z!5#g`Av?&m<4J*ajg#M-vme!g9p~Jh}_5 zM`yk6@H$bzF!KTXRk2E)RqRrmj1PSD48tHFSa*KP?$NAH&XK? zjNC4CF-AYO>x86q=l^m;I5j-|OF1F6naaL1K!PYFx%Qv4GRZtwhAhNxJ-Nka$@icR zIvt?q^C6AviF~+OO}6w@dUr02mRt?KP40gny1=hy~WGmjTlc4aF z`^i!$wjnSIYn?O3fcY}kK(^Ad6ql^?5%offGYnw}4i6~wC&h4YRHNm-iQEvd1X&FS zo0p4X0dX%NUJbp^D7n((g_cwV1?gAph$7F&CH2nIBo?_pnnvTC?AtuZ3s648j*r%*wH|Vx&pEJ;Es<(~g3UqY;A%^A363E1u zy0b2w6{L7wnU<@!-o3NwxxyE`tF#^%x)^B@d{+70r%v^|TEHg86%G~xbs8gWa1c>4% zQTV%7&@qvknyT=qY>O->6K0Ru*C-zT4k;#+>&bajnEn4mr%%o2dhF=v*diFh(E@qL z6NuRWYoC(F_<#v8h5{JgBiIwW%z#Bvbs!YxYhtQ75mN2ZXG$7^}=HzE6 zTi>{}1>=!-#5MWLy)u*9Cj2(K9kEo@jj*a?n{`Eg2K|HJamng#Tk^TrsRa~$uF6FI zq;8PV&iHSJ`!l~90es{Km|jGOefGrZAHp-snzG?Ke&t2Rr<28#1d!xa_bmVBB~#p$)zP22}jr8VG+~3;z6hX@zFwjDijw4-P3hI z_XAdwOQJa1)TGEuvI`juo-%4+M1nbKy^&6s+1S0x8 zXIqx*$%xBlL(btbfbh*Qf3te;+uq{_vS%{I0UhaINH={L$1q)y35I|otHxgK6EBQf zr9zK}MC=KdT^ASr>SH<2iY8??exkFj1hLXTVdXB^_#8t5l+AE$P}-cH-xer}9(FXT zK{i+B#vm2;HMO;Vaw~6&>r5*k27hSS8wekcwz%iSKO=hK>IcA@nohsamS=-mv&rD> zlz&`~)U$P^eP*<3k`ddg;^k1=i=C$LAd=sL!W}ml>%G1^j#MNnmud}p=`1Wn%cJuM ziBvib-!7F#;Er#23&JYWqiL&Ox{k%P+9!y#`JSvTYS=}ZTTmLDnrxcQeOil3?~(JV zm|NI2G<}NjTnT0?3u4{iX4fYn%{2S8cFzTU+vg|9Xw25qvZHBm6=>CLjW>Sanj`js zvd1+B3GnA4qho3R{(U-rJ{kKh@ocmMB-uG58jlX&gKqUPPQG{Zd4gCO%^6tE!AAjk6 z>1M}LA(9R6F6PB;DNX1>BWefJW(XCwE|Z2fyu-2DNR(<8)p^XQj&R+4C-HnH@V7`l zkq9(DuhpGY!@3-oaj`_Dp*=k{*Fdlv8^dw(A4?u?cjOf`K?H(I46o}Cqem{j7r@74 zzvgY=WG3$!2^OyfHQ|N}U!}qdUJTl;{gVq@=|O~$0lgUv>Lne4ky>E75KL#Q6FD4~ zJ}vW_Y~YQG?@K~`-h_^W2GYysAN=qTlQJ`o-Pk25AvB-?8{cQW>g~vBTLSb-0===M zslv4BfqRyf(4X$Su+a?7@<$zo8h4dW-$ zo(FD<*7m4QWHWx$83p5 z;WAwCp99P?eQ}oMgg{hYX1{BHUDX{cQsf|_{{8Q%MeqcFEBM9 zh4nO8pz9g_l$w)fC-0LRMGuxAEOl*vrnNF&?=@0koaFd}=^nBb#5(0=SN2wb9EaGj z^wvSS`Z-y~*w$&6a@<2Gzb>PZp03spqJ4HGmr$T#@&R#27LX`J&-`^igzGSjfw`-^ zQ=Cpdy^TYs=2SQiVqBjJZB!~6#>O4z!2wdWJQhp3uC)t!*T)c10{^Iz7-qAx&Qlw3 z=K_q}rzp=12K(2+R2`AVg$r0y6HY)2jduN535mHWT&)XgOe#r0M4RP%b6Su{Pu%N* zHLj8{pO5_Y;W;1G*ca#fz#Th?#6M#p>9mVXWy1$9VZ@hW>0(rY(C6{18&(&Eds~v_ z2SQ^2lr|4^?aH6`xoc{93^LPt!F|Kn#-I=>gKQk6t1gJVzeW|bwGUGt5+_IbBj&`A z^CC~0p3{>i%qk~tZR*PJ$BO?LO$*y%D&}Fh_@>NHWLHilKFR7* zUf+-5Z|u$75F|kY=~{S_ALG&I{@asF)8w7%-39mIEs>k{&NMfNZ~#6%_E^*eYdZkN zOjiIM-$bk{8m0G^s?$rgyUtRpyU2LsDQd8#$7`N17@?P8&9kXhM=fsxhqBru`sqRR z(2Ud0cwUoVVtJ4Hc=4uh+-yj(`%848FKTd2?^$7S& z=JELqCyA6TA?ev!LGCYk^cEzmk$@a(DMY@u%UTW^HF_icfCKS7gpdZ z@tX!^_v4f~5ZLPp_hP#~#bFUb`<6&7mbkva=JEO}^Qb}u-gAe5ZVu* zN{q-+*!g%qRRl=_i^qXwQ?^{-rhxT>XxT^5Zw8pdg!GQ~VjC0C*LZNzq{pQUD=Dzl zfK=h<^X2aKY>HQt>@_%(Kbj$fRWTWzPAiX*baNcBRtgO;^tHaMTiH@!;t-J360-`#Tt?L(~(3m9^d2rP*j!#U8#yO+% zBdih1Gq$Pz{1YoLjW`MP>kUUD*y8lgG^W)_ijlSDf1w5|1@ENX->O9RhGu*igO%%0W|F49bq=5A|n z$HMHBdB_^m?f?-dXR$Y7da{G_beZ6L^VrKy;?F`3;7Pt|Wrrw5#^hTkpKh!PE?NZK zOuBB>1*9w^IjMv@9atRag7BGAM(Q5LeAJ)7b_4k3@e@jul3Dq&*EYeKCO>^QRh9?4 z0a0z_IspCO*A9uV_}t@g$AIs1B&K)4#tzF(d6$qc!(*zdU2o5%CvyyR3n$8_raOS_ zOro_Zrh_2djrE~musjiyYrzVgRP&NQJ(bifJnroIVxy+E!}Kkwa_OBP_lVGqB`1J& zYAK$bA+R$TPAW6_H4F>Tm_7-=HcFkzedZJCY}81$MBQ9uiQ~%MZ^nJA>ASCbTdAw< z87(En7yFdW%hoT-MYe`)vS~(QQaVS)M&HDK*fx${ETvMWyWQ9xk7#p+G$xPoywVEr zq#`K|iuD{|y((*6PFTxLRVVh=)8W;oi!)QxbgPnz2CTJ!X^5vUEAhHEF@{}a-KI+< zT6EIkUSxwURpcvilv%Zk5_5Nbb|FS8;fqa|YFRDBh%KRGr zrV6Gb+_YjLg-&^(YwY5rs~*c8>bGf?dcVV11K&wA5wOY-Pl^4Dw_Gc&(g72t8n0gz z`_GzX_a`+caH`lAc~duM1^ncTUs3=7Hbg(Cg{H+J4nIwaO8gk#NLRjW zxl|30Gh|`TR$6?c-dAY$xJcL4+{30Uk^BUx&fqOEEMc;-WVQO*-c zsv4~IN@j&_EI3PCnJU=N0W5mcY&z2XrEkR6EY`BJWc?9*LY$0`P#);H`?}a;;2+Bl z%@|FR_U;$L+JL1HHovh10?m{KQclrWmi^SQ8b z18%hFmWpTFt75KkS`BMK^Bx}RGj4NR=w#viFh;<6JifqB#0ZkWXs{7J?gOd?z4*sQ z^YsR=Ofq`{Vt$Ycb&Pp4f~jf`mTH6b&|zeZ!1hm!9&!FGQxx~k=*X6{M>WByu!UDG-YG<8(YMMs_T2h?YEk;=K%Apxv1 zS;&?aIcHr8T~W!^iS0n`Md9isu3zC9N3O}^N}qz^`{pN|RxI+FmD9MX90Rf+nbbEm z{`GdLadB*A71pk?j{b133gE||ca5E}KH@FV`IwJFj0c?-($@8U>vy(K&QC$mwO_fl zO{F_NBc41OkviYzW9sFZe^bO$v90Qsai=`7RTsrAoH$lF>-v}TP0Q#u%;(Yj=waSH zLxh|G;{X|)v!`X+**+a#_5;aXlwJ0fh58V=jFOuOJh)3bebG+LIo;fumMxr%w~~8D zm5uiXgQ?TgYUz_CFEK1FIkJdRab-WA+QBqQAtJ++_#^4>lzsY$=-G$yMO~ z;dyLr?w5$gu|Sit5B1lNS;ddaQ!%nxtFle!(ufR8`tRm(PVcXI#s*e1&@L&#V0Z$_ z3x#BUa+z|E9+w`{d3r#IfxL8uxsDb+J`LHQkG87B7EX@0B&_s_4uTg-c@68x4VbaM zU#Zr5Y+h?!uFQ6)0NLliDi<3VU6YoPVDXiHT*y~|9{dTxOJLzZrL77ZAfkqdk+1&p z|M@?_m!tff&(Nq*k@eD~owYd*tFqAfy&-rCh%CH3(DUr3VhJ_41I)Nv3bTE#sL-OgZ(CK#AZXU+HR?caE1B2y2^b@#>85{CPyOg{Dlbpl@rJ$;Xcnj z$^0KC^XOy?@=><=GpdbTaYnBo#0=U#;3iVOqWp7QPv!eJUs|}I7=)ENw$i3pZ2joN zuR}SD>MQBUdAlWvIynMe`~YB6XCL{A8q+k?6C8lN&NA+y`(^`5KPTVgh(NSVOonQ^ zkBvyfI1hD`xk&aF77Iqc59)pQldhA{f6{1@5Y0hVlk6FW< zMf?KEh*9~?R58vp`RC0RE~PP~Y(n+06_fu^+49&Bs>!4T>kxg}!7iEcZyHLJLDJBF06>^Y0-+!6J6xc zto74TSC<6>LF}2rZbeohRhH3JD@%uO3d-V;Bf9=PGMp0mnNyynaP8csh?~P~6zCS7 z+iDfCz+uEp%WX)k2CfXGK3R0e_~7X8ZT$S-wN`r}@0ZE~{{;$)8cNTjf9Vx8pKFPlNG+h|XP}j{ uyl>kcqRSLguc~^_)NLNR^XlRru<-xT>|92Pr0Ed_!UDHJR2S~PfZ4;1&{F8A>K z=biV<{cvY8nIz}zz0cnH=~^rLt(rU@_H*oK&z|8aD#&O&dxqo+eEx!o4!nQ9OPhK2 zjDu29MpDZs<6sHntCjW`#t|RwH!~>`u%cWNW+w<$Mvv3%jpUyU82!69UvX`)KC{}O zRj)GA|FC#QD)X-U%gY}hu|Gw91f2zLd5cXgFBI4oG;a+L?JeD8yL;QdZ(45VSbQuq z)UJQ8Glk;4=qi7HyZqSJbT+PB;u5%LI3>`2J?uDFWj)9rd(er)QOe$SwYodNT3-5a zQQxlpcs&~IH|EJ#@-QfNxu|)+DbUWcem`jXP}OwYOI2d%-1zebm@kXXu+DL=pmND? zuWZWn@n$CX?c=t*L@|5&-AQMkWs=~*ZPg%qNzi$TsWx!6-H$tnF;M|rKv#1_<=l|d zw4S6~yjR{H)YeW4YQH^f#tAWXALip3YnK6TI}2HGX>TRGHhnnx9#@(mNQ{jq3JeAv zpeJJ|d+Vv#aOF*+MFV%*3A|i#+~C~XEh$%Hd%8sqGb2ml;W)nJ@!_(4>a{_`%dbxp zenEe@M+B3D+V_4p7wfNf_=lH)L7E}Jy5)96=gW`B@xdNJ?U!)>k_G4HGCPXaj_Zeo zf$a+Kws$?*#B(n>!!5L;5y7tQcywrLI74nQUa-~u(kw@`b}3Cs|TGVZ(P>5 zotI6O>Q@(6j|i9CwT+73YGKd?e7H{I4;+&v|8_LqRjzAX{tsdc<28 z-#6PZ@O-L7;_e^8MvwU2QCA5HzTgjc`11Xs_Y@kr(OcegVc4j|st?;rhYdc8bn>s zjRtw0uadVn%zG~f4kDl~ZN3caB8Zl1zw1F$6Q|~bI@uEO?H{27-pi+1ms-jktsb>q z_##?Rr#k)GwKx&7<`sgVqtN%^q&mMwfN>|r6_a73K^N7s3&HTyEM2klB6YSRu+-t@ zmiT4klz~H;cAfBTTz>~wobc|iaRHPbTiekrV==&(IRbh012%cGi)b$!`bZBX;?fjU zF#da9L?FU{ihsdT(@jcrjdJuQYRmbw;rEwCc>J?J1f9fzvEQ@jI-G=p?$+o`?*S7j zh2O$2$%NQ4$=U!{&^_H8X5~0ne37XI^UL&{W=RgqbaGsXx^XbQH4wVQ5I+iee|u10 z{s1@>*>&Sqmf`x4;D{oM{A!I4aaiR)QNR|R^~E@E=}+!27Rm!gM@{c{b#3=eAY^Lb z=odC5m>w}~b-(aM_AB0xie2uf>fJpI=(be_Y=#l5{n9b<-8i`g&c;X~tLr2a5nx*j zn678s#;rKj55<@Uzdtx8Z(-@a-L9)NkLTsV#teP6TJAy3#NAiEeUDrP*fb2g!d1 zo=T6;`*88(wov@M$U@HiRSs6Q;X>-gZ|~NU`43%qF-*z)Z94@}GN+pi_mLgDzN5y` zz~6Q|Ij+^#U6Fw4Np&)K8y!i+3iG;NxYxP%kz&0e7SO@X%6>R2?12!tZw|58eEa_v z=TsHleHXtgh}HgZUQT`>z$lim6Jv6gn;XKUROcQx0%-$c2^kMMa-l1eZ=7N~&*(l7 zd8Xc%l<5Sn5@)~c14(vvOF3M$d((>F@2G!Yo*M{lus`ATPDa%rFJfd1w=AuP`}N2j zikM6JPC(&WY}G^D8_m((9t?`2Tx)MqU|hLsvwzZ*cXPrOpvjsPjKh=j039KgG}PH@4f7=e!}|@!H>6> zF@B2R0+8Y=5W%=Q6+r4>P&AQTlFw6|;=F;ldP(8a#4d5rqglXuuGGNaS-93uG|rN6 zaBwPwE|RKEBkq7RG?yQNQ@V-lLy{u%l!!yA&E)YKsV0?w%V@kYI+ZzzvUtXf@avy5 zlV(3*I6BRKY+)*QVW3kU38Fg5zTdYM+X%wH8j^9_!WPu!XcUiJtW^PfA24{UBOjW> z_R{$JlKkZu$`?BJ+z@&l%`?h}#(2K@m(=Rcufs$gch>rQdLmm)e5_wLHhl(eJK8&$ zHOIa~Z(V;1BO-2G7sUMsAMt#bdL>da)EU>$-}87jzUM`v%7rA&c(h<%!-*pqK@57viFt7VxWG^P-Fymaa z6lRPkW(Qu((Od(m>mkkvRT8Eyc0L)mxS5c!a7T0n_|0ESVlWW;_hI2RXl+N~93Ja*_uKL!ZgC9>!TXkUd$0o#uCI*2$4Kgv**1KW&j~nV zI2l1VJ2Z{iDB{F!%Xoq|u)TloH-v71INRB7AZ)q9&p%9e3r| zPh_`pwHA+n5qZB6_2;;*?4w;sgmNNx3Q3#jj_jT^fxOle<-OKDxr+w(22!-J8OmAJ z$BDyQev2w55}q`jfXUThdrIRuk+k!PGvBhL@rCjWjZlf^ycV2h-Z>`}o#8VOFh?vN znz{LtOX)MzBfVbF`AR==f4SVwMDR1r2*%n7D}Ku@IJA7#E8w+GqO|h%yW1xtOh*~} z#Jz0G87_usDB7+7&r{y!L78vloE3(EU7wc+5I!aDRQ*}mMdL>wDUfYMLg-Uv06ORj z1CQ9loRfji(H9KTxWv&i7BcjN(#4y?K)n9%%YgF8?b9?|vF8anPl`Oh?{y zjAh&h0*aPtCq!WjGEfotWN%0;Lc4J%hjrE1#)88w%$%sei{H&yFjqiI6%r@78a2&( zFLcy_vb9jdH;|gpeNa_Qo~8;c9n?YMP`KR(R1sCubNFz6-oQ%Dt5nOlBIm}96#Lc} zUSu;9&v-*T9D(InLTe~t8t>8VspiKM8cEP5^wrekvSi8ht=f3Op;E#LtrznS;`&d% zoyz@kCFih+n%{}hEwEC`%%teWe!3DSo>lrZW6{(PidVw2o4@@mGJsuCpmMWUNsscn zUXJ%NgOk_Uij`DJ!Sx!2+85em%p)SWXXoJ@0sjK3uoR74XXmPI36`#97%M+WH;O^R zE?W_SWfQ&Dh_CjQCN?gwDuA@0?Z00sf32S~z&B&${?dv1-Hhg?6mVp(LSBHPyDJg| zX!VucMfF#|4d^*oNd1UaRvua;uGNA@OjehaRw=#s`MS*X^IU!V{Xr~suoUR~o-RK8 z={dB_fBeY%&9N*&K3W-t_zfJ(YSzWj({4{T|8~^=&5MInC?}5 zc85azu`1iINyK;*b`_;~KJuK>K zEUHF@Z@Z<~b+TwBK`X|)Nomvs!CYIDOcxkD443X*b@%chxc z8c7C|muLDj8$RprmNh*--|9ZuFqKoyJ05khM1|L!Z%r>l2m;K;%ut3fL=I{+?K`ni zc2$#{+V3x>Y@kj$y94;|(YaXY^>X}T*qiKXd&mq)CRB*=N1~`~+u^Q#G|HxX1^9fN zq20zjno$NByB@vga+)#8i%JadxfB?G1=$JMJvx?tnp5+P zL=~Lk7ADa~bv23mv-dy|TxxQX^j#&ryUYH)Eej(x4)4k@M+qYMQG~!yy_kuk;H?iw zz-99?Tb*m8O@yQ{KXG*T*U;W*AN#*uVQ7rb7iSwOhQA5nKtE&jAaT8(OjQ{THA>j= zF*67PYESWhwFWs+3PmpT&*Qt7sB9p~FwXxnuyhFVX=(My?p}40#N0j)B^5uTt=FtS zqP66yIJ-HDln}K?7RdQPJ^xPlU65-w>9inGQ|$+e_-=-pW2kdeQTeTYUl^F(iP2vT zh)a_UblwsV+-ky`*fK(M!$NJN0lBIddg(Oz5b_>Y2=e2Pm*0*F4Sc+f1Ti2*IC3q^Ep)P)ZAk+iwPyueby2|g$`U~-~;t61Ji?_rH zs>9NCIQtk9SCVy<@4p+lDfXY(Z)KHD6EmwD{9Q@!d*x!|wx(Wf=}J-N@ro*T22MUQ zCTWH|3pAq82G3XvDG>P&m+#sZHm+Nl-eed=tD8vQV?LpDpRg|s@j`hVpCwZF=YO6o zESc1$;xzHVHf(5Lcttk`c6x7{<-6G-n*_8{`)#Y;g;asEg$j?UsX{)2yb``FK7DMO zY|B-(c|E6QeZ2j0oq6vfQtih`)^e7&zoMZrsyG9#nReKFpD@P47WpTP0^EUBb;M}x zV0s$h+i>ReK?%@b>6^efpVys{CT1etCq|3y}q4V3$nPP~f z))+xhi*wMFAixiFI$TaIFBDhVA|!2@zoLo@tG?!1U>Sa1=|zr=c{K!dge_{K6}FD* za)Kj*%Hh@5&7(+t=@o(qnS4Ik!*@&|B&G{hfu$O)*mu2q{>!%}*G8q->(n_t6Y%;) zx53>Xq4=*7pHsQCxb`E=HITL{j;%y7M~Q_SD$K0%G<_D>`au%}BK;OIhbqaMbzb+nQZo%=SShuzKizSMo26OW>`wesvk)~IC zj?FNmVEaceN=Dyqb(Bl7K1u={LyylD{n2;SJR!j9NPoYqKfloUg5jl&Uj#nBsHb;D zrLb;E5E7{^=ClkUp5(#b%75&_!a}zrdG)3Wj%Gy{r?3hAdm#j${kJD$DH`LLq{tc9 zCqqn?oY3ChcO4k#p3Ejb!bO(hz)flo8a9&x3GC4UbqCL6D;oK$B$f3YH4t6qbWC@i z*g69N%lw6pRhFH^m#)K`6sL}SYACPb81YH0sn5UgGKUP2n&biobiLV>Ow%0IQz`}a z@&Uev7yGd(&52V(<9a66_@E0|^Z*xgbi5i>eD_|u&?(kL^rkUpU!k{5Y@c%@%>)B^ z*|_ouK3zI5+wFE9p6>I+r@zK zsX+4gSO7#MY#}JQTfXpIdNo}M@%i>We2mkbz7HsYPJ`UArD3GFm>@dk!@$Hh(MFi& z34B7$f{lco38#%=M)}IHG(9QyWd&H8LGEKHnIf&{7e|lJlxg+;ucOT6(rq^CtY76x z{uS?4q7!=EJ?D1w;U$9}ZScs;&^H?1_=;+fdC+jiTGUS1#qe)Me}b)X9|hpJ`Dvpi zR*(o@hAvx4=)lZ#?>j0tq>yUMdeu05iqU->O(l<19nLp779Ps=Cai3-R>Q-fjPGxntdqafR=HoYAlg7M1Yybdi&Ap;f^?R(%$7EnO0kvZMD8E1M{av2?IX3vJsP6J1F-{lA;zdq-IYE{$#$ zd5Hj1D|~4CHqLXqZp!$XnI@yhmSF0xo0+nAeYSh;eXlSR9r(*JH-IwX;PdG$D#h~7 zLlCUV@N&6#H@Fc; zdeen1gz^6VM%rYQg@Hg8ws+y{<;neyJwE6xukVYUPd5|oI~C5jcrf8-h~pRIrH}g% zCz%pjoPHfh%k7X2u1<{?wom{i~PHSY8|4wW04V>&+7(awn`^wvGtjAd{)Pq%d zIbz*sI?e^MB?lybN#-xPWp4;tL`1m@x4Z99ZPhG?Rs^D($0Tqf`9^1-<-hob8vwT) zlguqxjJ#??+H2rCP7o4ryxrcSw+WmG_}&74yzxFSn#qsuC;*CPhkKfR@?66LOB|tU zw5kky>)+%rqTo3VXEBMfYFr(+fr`{a^zx`(@7G3T^T^X*RHtL*urQKyGrteh5ibVE zg*gg-U`rxXj9xJy)Hjx{v8pk`^|hOL!nX2bYOaLCgq!&DzXTZboVW!9%SWIyCQV^* zRGvCl{6V)4N3n=VbV-fP4ah*ydzyR3^;E}m5;?$T08;|Bc75rT93k2kloCwD<<3Xy z;c6jnbCErQ$%|JJ)_cpC5S66C)@XLj5-V&OSiZ8YV)onQk z=N!yFI93nyZ!F&AJ&ycqyZU|EA2wc=cqzTw3q9=>`Da|UNDjxyO1w1_4c}4IV7nA4 zb}FhkY)y#Zr(Of;9~WN5A!2aiY0}}I%k^&Qaj*DBN(e?~>PVZsqsCbrtLQLw$smjT zyr4{tNby67M~BY-D>T;pU_K(pq*Uc+mQ?`#5tj407hakQ z<}L~pu%gV!4B#Vtt0W9%8-uWsWw+Op)!BV@2#eZMyIVORlRNVb7E+gs=l%u#&4!gc zlG6gZu^5+iv7TCmU~lYU*vfN{Og=#$Zt?V|W*9+j7%P%phxuk+Z<5TnBA_1w==!M|hUkOj9ukAQYyG^5YWI%Pm{as} z&*s)iO3;&IqS3A|n-KT&-HEU9o>P-c${XnED?7=}^1B;(O+|w8J<>K16I7P@k(f^Svr&2dGp#Iu;kMKbzBA z%;!)N0J_{-Z6yH~);&#r(Y(6lWCH1QuLHq`yv8H>xHLbvI=8fei8d?sw0r-3zWioj@IP z@xYd^wETqCms*undlUOD=8;d?mzZ<)oHD)sSb?~{kN&Wnl*Afl^=W%a;&LX?JzjOC zMo}rL-@a)ji_4OGgU_6n&zCP}HoW}{4_ro&_JbVN;33}n>{(}Z;n+%od4k|LzEEfE z9kxXcMxfch$ulW-fE@^*Z277>)D)*G?Xk}v9)wpl*Y|AwnM^n4m(1sBQ+Y4$)DI~= zBVUXQ24?kREBZ#P!s#w5B1tv=lJ^z%k1N=FMlltS_&~CFIK--?$ws6N1%y7!{rGnh zyUpsPktfC&NE|Mn!1XPhnuWoldyU3JEjx#Whvq6%-!fU1pT%mkNA?p0EBa^6#&^>; zqZlMb%WtNJ?FVsuzCMRFMly#6f$(N3eC2sos%EV2SAS$ejMB7HU#CKiO0YW4ZvyVK zy!)ajMEf+!Qd?3rI=Zcp$J9%}qe%Z6{@*I2jvI~8{AEacu}?pC^}GF6&8~kbJ9hL|1&GB$59P`30qwLsYt2iLms{nR6U%GO z4`gE!=WFq@t4j-rMBmIBa=Etyc4J)$<%kah+}2#-WdMy6J2&e}8qOTR)w<$RdE2CF z_qDtA2QNwb8K=MuN}Wf*wltkV%56$>N`0Jw{_Xb%J@Hp0dy;>DBe!g2s2D&M#N7+O zsO<^FFhn}HI1Fi@zm5n{T3^z~m1fsquJHge$O%kG0nQp@Ucac+=R;p^D^NPPH-}f& zmiwq9fHYtT1HSCJv2v7<$Jttm{z{U^v3+g3?-^(FEs&{Gcak$K_E<&v63edMy|JQbhYpE;O}H zyAdW{CO=b#Q4bg3{nvq*#Hv;uUz)dQE-;w2v2 z8m`AP6?zRf&Sd;SqQnlR)Z(Qw-qZdFx;4xal;oI~Wyck7=^S1n2@qt%t<+7k3=sLgH9pNP|cIk$E_n*O)*fb~aojNo$u{eL_d7FxN@PQ?8 zSU5J#bov)a+I}Uq^c6STVna42%#ATO8%w3>ZPm{xW2Y!;^SYlq@xwH0J%M#JQt1f| zQ6DFJc&o_eKyvCfc$(UuC2fA%g zdNkv6)OS94P6{Bzry-xJ)mqA$H_yY$#u8nG7lvwnNjFuzsN0QriQf&f|Fkf9b(Eh; zGr4XpyV$#x0nP$oWu`Arq(I^}$^|q^^gUHlcXJ2)b+qn(cx+eEt9MS)Nj~KB6i)!F z4J~CRH=~`qhY~=|2(8F_8vbv$zKYx5fSH!;)-LYA$6Ou!>;g3qSM@h`8nC5)P(2cB2wA5(|oy$+A#!gDY(B=LWcvz_+z#F`V3FHqp=+Rdmh7jjMv8 zT-PnpAF_U~#J-gs93*d2zHWhx+vqfm)DtPqp6&6b)EUOigpGN+&#YU>z0SRgM)C%~ zk;WIPe@IH)1>O?3Xe(u+?gJrz3!~v#F=8l>{IP4u(Rg>x;C+BJLwnLxwL+@~F5f~r z`69*MZ1Pcvb3MzxqZ+@_o1T8p0@lidgwTMs`XeE%U_a|HXLab@5Fa|4X-@p!;aY;% z&ja>6eOqr@xG3D9aAa=6h{aUA44>6#n#QFOq;Ll*_BIK6S!dWDi~WWUR%0urlT6YT zMa9$-PVN*2gR0p2`5#DI%XcHR%LJx2larg3uc~aoZ$$t@xEHEfJfARwQ8<~+P);yX zxvp#CYYpt)nUUBOxHu>G9k_U^=LWTqGND^nx(Q$GCgU^%C}PDw%G4*qEEEaAFtzL* zX78Z{5gQKQK+Zj2+YY$EtKkK}RRi>C*GGT2@*!n-OBUN04_>3~yz(IprjM=Ep)s~k zpI?7#GQ*`BdP^5Wxh-nxVCyN8CBu5JTF2}TvjDoZNjzcEVC>wp4f=Hr22_DN3@GTiGxjoBv6IRsu+0evdiO;{1M8RQJ=UUH#0eBTwzx{WWtd#n8DZ zPW)zDgRM88YvNKUy=^cS7jNs$%DHfQND;&>+1pU} z4I*GmWQ%n&L*cdKc1(8~rpbA+t~P)?Z*{yN#I74xV&yBy*{v8@QsGmzTT59pAkNR# z5MJf1nHUvp67fo17vD0wSBbyDs|;Fzl5DuK2y@_P+f|FKb=vRV3onS)By2>1)a+) zr5C^vqy@FyR*eYnsbD3R)HtJg^ita5iv4NbQFSRc0i=K4=^y^|gM3RrE?z$A?T+`< z!1Hl!3K`SQfN2l}f}rO7vu2^Ybqmf=71J#g4YLBu2-Ji!<}3H?+r{^ZvSda4iyyk& zG76%M7O$Q-Xu02&rpN@SiF97G=E>s0G$tfouFtQ3T#Du@rkDm@zkg~*5uE@Xqzi#U zbR;2U#K%Av0pI3(0m}Q>rf|p1;j4&sKt%?Wiw;<_ExW}fkcpY=4}eyS98_=V_V(l+ zV3M^IoY!Ine%Ap+Mz5mLB>on{3c}VW=@&}q^DGhP)^T3WS^XoPt_nryBJ1S^ATA89 z1tua(#*GBKf2O$Yha(!c;vNAe!&WNNpRw{s4hLx2B8Kfrt>>_vTv5cNBGdLHH`A$4 zL;!pqO=CjOM_5Y2j8m55=@Ui-$&w}z^DuK7`C+SDxN`_7nq+w#KXmY8!m z^VGOMA(zrbJ|A}m!Sp1P_x~Y%d6a@CWu>s}^HN(+FX-ooqCuCo>rF;mVu3^#0PzWr z3ctXU>JT49YJAd7;VtfVuG{lX=DVl!k6=L+UaJ5`h9`*Psz)Cg%Rm3it`NNpu+;mq z)64SU`#s`;J*aR3HF8i7tI500<%qFu>SVcxC+6K1G$SxZ-6bqo-gdKFCCn*_N9E1# z*9Rug2{}x}(_G1ce(hKNXxZQOdvsb9NNTI0Z#F|Ce1yqXO|8Fae|8C@>_M#tq<{RI zT6Mx7MuShG%ebEHpy+q9rrP%MON1fuXcQ;bzUQ|FCc`(3w$u)Wa*I+-4=6|5alqu9u?Zks6qye_frSW zva^Xy*8ltpFNqD{j_k@3dL6#oY93FdTt=OI)l^H<@<0JC+ZSeH>+{R5R_+vH#d1d7 zeMG_EzJ;F>si1|NO8zZS2l)9AMDpzrMrAihnM9=34pb8Mq@+up?(R|?P7CP56X5k5 zj_!W>g9Bu%YzzP>5uY1AAlGSyEs(T5-XjF6u2DlUJuOk3KXqH4V)YqoE+8yPCkPUm zj!1R%a+T_ z+qd;jo<@6wYpx++j73Uk=@ODfhf&)vi>d|0-dq=uZKs)^&p#Yfy{H;GJvqbqi43UJ z1Xfz7tMJ?!J$Ms+MwFBy9#)vt5u!O+%U9XOJ$}hgIn{|7q-gchko)ECUL~NPN3IYg;vNk|Y_kYdo z>n(v%2u)lz!aM8O2YP73fD9S&)&?9GY{SxI=HR*ThKU44g~`#dr~>wlo0N!QP4X%y z$ww27mA!I_dfusdE0NXuRk=hW1*rmGNVn4n)Vgp*i;RzgjJH#u?Krk)M2*K$Q)E3s zT1n#<8k=n-ma#CZ>k?03d^6NB>SRL2lk_K$W$3waqNxa~zv}b&Jn21$J=!-z2?bNVMxs{$K&vxQ z35a53ax+(8B(wDSBAl#2W;&AVyeD;OI>7J1_7bFgKM^)4)C${71rs&()JSPRZg2$a zJLYS7*TMd$Ef0)6)zA}Is3&yRF7*o!9c{|azsc4)jDZ5F;x;hPuw1q8sr&YS9*K;$qmLsWLhK;uT)yCdiMN`_k#@c=dKFj5I7lRTy_jl)A zK4o_{I=8*I=gX#x&Ldo*;F}d3iBkCOj;XH4l9%=AhQz%vFn$)8=!NwBf&cyW_Sw8c zRp;q92kqs{agVPOw_B>Wxaj4G(-~9K+ru!4iv5oBrQBVH1bJrCh`v#*9YhuUw0xU- z`Qr8Ii0Pek>;WDF@b7o(NQA2Y)lVa8;KzUI?yhFK$Tbelo7=Aqi?RRv1MS0~$(Y|jn;(X|M{uS0he5Oc ze|TUU8pFl)^1aEJhIIfvu(J9ne_)3$U(POkXN*1E#P5&u?m4$$_m>m?-uC{3v>pWY zOSd;05>@uCTg9>W4tg)|1ZRvif5foi2O@=*eUC%VyJfv5WhvfVWj~6LX?xDi016_o z<}ff*Q)DLH3;MV0*h?5?j?*uxV`$f~?a_5@eCazbyrBhLlg~0EgB-1!)@kNU`(J-l z@e2;P=*mWLvCb zBiASLX82iEMXD+MvcTy6tf@=e!T)-`{Pt|V%4NaOp`+pIM_T7ET(YktT^Id4I!%l2 zhL^h?O?lPkU~VF3=rK}R92sSod%J6`i$mvWcAB+(Q+&0p+hy>r{ogQ4+$`*0YEyfW z$Uh`gxx~#M;wcr;JuSPsu@|9GD9_iz8doEy{>SSgRc-sNwW=EvJ+R7*G7vJSeEGL3 zwip}f&tPUyM4wTQ(;%&`)#U;P65TQad|_*)N}_SX_q*y4$PW9DM z-?oCPw?+f7dR-pRZv3x%jq{Z^sZz$yLoDSyzJKsTA+Vc?Z3N!YDn(bb_qa>0X0nZO zC-5tBS@_-MMw;KZ>K;5x!(rbrT6cDxms%caITd5~xGWwP&+QX+^ zmtzjxAr@)I?q#XQ?z7vp2cB}Xaktlm8Z|?#S;=c)xC&reOt_MaylDtI)v`s;wV3`2 z?r@K_7$NSuCBbRE!qIe&`6*q~j?vAO$3>oF@v0(QUl^@(XV|SH7x8_EIZBcba!)I) zwS9JL;N z#ahxhW&`1);R-1yu8}OPao9T3QE9v3Fo<)6Gf406%RoE+wyNW78^qSNXXj8(B(jz)Ggr0A#ATc zLqgKJZq}y&57jmzMYJNk)xu!Rt;qsM{reOB#k|gvCj;KpP=b;K$4W#4yHYFx_$bpsUqp5Eg~O`_DFKyR+-Z zCE}-LHXWza&lHpT1Mc%`OE||6LjvR&+-S>8IDr#>`z})kAHQi^-Eg9JaDsyF$3=E3 z7|+KwcawS6Ie$;yTiufh&R{$X3Jk)B>AS!z#P5#c(z^61<1-N-N^*2!u`uZR#bJ;j z#}B`7yO(?pj4KEb=0TA7u0Mnh>^c}VIPwWTY23jw=HBrk(1i4;{B#Oq*GW=GoF(Cq z6*-A3^-E>mgZATb+0V{AYVAn$G<28iX+sBNBXn~xU{m@!IK1G-cR>VNx^123cXrRNlyJ#M&c0{g z(#n*8&G8rECF9zq9H6(^7rpRXEiXgv6RaYBVEr(q%C|^Qyw&Nf~)-t97o6v+NBjh-;tyk^pkef1yXl{7bhR zLdq;2i1|OmfLQcjR$^5FqwaFyS6fBK@XK|vb>Ccc_zzZL)Avc)JT+Ab;s%AvL?akfD=FLbC6uB~q0+!8fWA?IPJ0=q<(~A4aX^yxhPCC@ zA)2XsQoD&%Q{K%dYWqzNib*Pk83)i!2;$5Rx^A$X}ferE0Q_CId}Gl>@7&k810Lf=*GIk#CTgh>8* zEBDHvPQS*ka%Q4P!g%GmeV9-h5?QE$RaP%CZW#iFr0f)y{8o!3qfx~qqXqe-SF6e} z#M6v9at!kw=b0Cp3}(}mZ`-LFtT?|)1WTqrXE^M!ZCOt(lI?u%i7o~2!DVwriFhNm z_3>Z6M#`$3Cw3k99qb_8`r^CpZx0SQBrZ`&qRzCuD7;3{7Zt%FiHmMxcT`Y@6dlJ~ z=vaB05keEGDt7uS_NE7)XO}})pBwd~9)l4fUD;{~bM-)WsG+MbFq|i1fjmNQ3h8g( zt9m6*VyXXOh;!wGluj#g+i{_OjAIo1@EI!V4K@1W2OBm-?%e%(uuIw&t#*@t56FbJ zrAvBW2z~x6QB()Hb9pk(g&G%LF_7AS;xojQLcCBO-xl`9d4dr|@|if-7|EnvV@OvP znok_^iVp*px5Y9uC{=lY)&7y;yz(?r&JXQy{8PJlwa*}MkdXm3jHrRsfSRJT1wAt7 zcUmwVY2?l$%CZ=SDpjqkAxrU)c5w!EP7c&5u7a^io@c2B)xRr{^kRgGbJ166lRPsT zzmrK?FF(f5tg=b%;=J+uPk`@Xq4Io!Y*#}&kI>vWq)gaOZc#QyA?+&Prxw++KNe$@ zX=`gO63&zgT(S#ntY)8dc|)Bg1V}Nq)K7_0|3gq&Fp)y{e&x^zEUEWBD+lWDSq1Op zzHfs%>7U>RQq|C`{b%CEm>SkQl~FGcEPbR!FFwuDZht`P)!1WW{BW?G9Fnqm-an!^ z_+-dN7;mhlTB?qGD$VR5^tBYC{+qn~1JoleBx(>R5fu)(EGz^?0eu&{{kHNyD z;h>pCM!SHhbWy8huw*<&NdCUb?!!=1vXNR=AWtyz(uSKGYX+|BRG=mMi6NV)p9V$p z>)VtS{SD{Je9ErjM7P@iI)dyag_E2)p81~|6J&kw!=gtu!Qh5~X)Wk`B9h-O6Jknx zkr4r=v>cG=C2~-WGi@{}!*|Ak&vd^QWB%vK=_M zODat8MRH)(zz*T1*8U^6q@d4|(|1#v{wc?iogNJYzpT~hNsYY%ZA=IZ-T@v1mQ3kE z`TTKsVx*YOn+}Z7VspWv4A9>@$<962!#Kk!ms$t`d)9c6p&bJLt4&?^U2UBY2zIli znfoufHWtVE`=^uuS&;tL<9EEDIWc#t0eINgEWMJ2p$_0^hoeVv8ln%d3jqH9u^2jQ zL1~>QMJ{9m)a0B5e8h9gep)T+0StM!7Mz&LXNgMO`U_MaD_g9dg+MDnc+m{c7WY$L zORbCq6N@)DWF-Sv%1_1kOPf?{oj3A3I~qUU8y4lq+r@nIxdiF?*Ox_X7&7H)xIP8( z`f62VBAgeuLIBp4DrHwp5!zXY?}?(+oo9u8?t)SCc1^|%Ho0TfiqzdTamF5t4PWk> zWWfbPFE@#Bkoi3i=R#VrN?2+~^xbakE|YO+9$U5<$rwduDWcDA+A+f2rtE$F=EbZ< zY~ph7DgX_hUH^VS!8smFE$nZ1zN2BOmL=86=-soTIQef;m0^q$oB6@4MWbR$)44hB zb7gK)X3LcdTX!OfkcR>$zWIE~XXFa!rq50$plRwNeB$L=w7GpH&lABMwP*J&6Mps$ z07e+A$^ZF$r8iG8wVOzE_xYfKK(Ex{4Up9Z2ZMAq`+<#UPeaTaGHhYc5t;cALq4>cWSpFl*B7|95Y3@I3&a|+;8qTOu7bnxy*Xt&${C9_*)l+w z-MB zr5gerNBQbvvD)I|Z5XZ2zq^t|ZpsjtnLl+1Ork;LdCz992U8sZFui%=icqmi!DEFbay=aOKh*ZkpP35v*gmqPKQ#er(p1ajuuz1^46nY2oDf8IKdS5t z&GdDsUm5N9*Ih6&l9Vg{^1=j&UY$Xh>cb6Wn>|Uzq=;Z1I+b(!E%P>{~O~l5np?2?F3h)8sblL>Fgs_BBS8ar>;{9?pmoS zHka*vx>ike;;c|jy4$o2m)?upuTehIa{Bp3Nc&l3vw4k%Kni2$#cGt&O|Wf3Bh;|l z7ETuYrqK2%-|Xjq@q||v9I4p_*OPKQo3++`K;Rs0*9mdHU;3Ek|7czyJ?z*qwk&VS z57fi0cfK`o59dVq6qwO&TIW)jAr%7zl*u&5_)6DGByK-6Jd`9K(aT33YSIcEFvfCc zMq5RQwb+jSw-ReS6`FNdt?3fU_sk$XBj3|_05 z9VkK87(=Evdg+ph8od?@%9Q5X^^3h{M@)1y#^<1*16M&FOyIV_IwRXuwiMW!%? zt4M^W>3OZEL{-trl%JPBM=IvOpL_{x7{DZcRo!g;i|#wc>(9az6U$z2LL3E2F{~Iw zl^z`6zGpW{IMtj!6_WnO9;l9|0Pv^hJCD(o-Z)gO2+qcj3LOoVta+<^_jUUX$N_$w zRlex4+;N-%S8HsdfCB|5`Am=2^viS(Ghtp#2>|IUw)|1IF;}<1R{>FJr2~7?L|Y#r zkf7?~b>Z&f?{C?y9nn$Z>2P(TtxxH#EbesjgQV}UX^_e1cCPeR6Ct2dXbYSRk0UYy z|FdoNV3()5^vmW|xN8ECvCBf6i) zC8Iku0OCjm=63C3{LS}VMJMPI9msrI=Ag`n9p4az`d$njblu+tcJX@-6UBRoPtCUP z%~xoZ;zr*573!Mx?9d>UT_u*%!(p6<=4%w5h{;Ieu9?Wj_mQ69y;6>*1Mtd?nk3r; zVj#-@r32L1uce^Nxo)s0riO~`F`taUk!1P5T?w5!-r!@_5Fzn4KSg>h5VFP^@O+ff z!~HwG9ThS3zt~oQjpbH>`TTtmEHd@S)N76nBWbl?nBGJcNugkzOu)b1ViP2%d$`Vto zw$ict2lAv3UAeL2D8_+PGHJ%d$4*I=ftMDjrPDE!5f5CAx&6&_Q>V6xnf7pPjOy{| zSim}W6p=%uM&5G%t13Y(?-qh~`marjMVg1QSTFD6q+GahXkFD9aC%|tMQ?-_>%YyX zrFR3NB>itSEhjJkXY!^Z(W(eH#r{KTQVt3;DJD=8cKp;zUO8p z9*b^MENMo3&SRPU1BY)%j#ZdPpuBWQ&R~U=2P&}TZEsJ9_L@(t*^0fv-+FoiMyoK! zK;x{d<+CCNyxDmN!yT=>@6{&$y5GkQV<@9lc$Hn8O% zcM`~G_@X2+u-`kN$g!h$KkM0qL;6>_?Y0qY9-Oe4vS^D0jpz3_e!e!bT} z=(k-~LcYExR5P4c+jTZ1_E`NNDu_Ce!w7eYy*Bs;FaOc2jm5X!dcYY+6_gx~?PA@` zs&YD&`_G5n8oYdOlbFmN_ZGE6M`PS4{HSHXP7HSL4K11^M-X*Eog2 z|KMyt%{%P2Qg$n7%<@6~PZdj63(<{resi=0@o5J%0fa%1z&FfUY{A>!QA3HsFYnHl z2%U!|mauN)PM?9RXJ7GsWIgaWGJzgg9W4>V;w7#osW8_DwS1vxMtRbkTQ(GBLF*`fy zq3EpsA{2-oo`}QT4Yf%PvC!Y`i!{f!3_;|NoRoP5#ExZuT;?Qgq;Ru^Hi?Y{EoTUZ zmNS~osszR=fNM`bhL=vALu^x-t*+oYCD1m;8U5_`;DPvWjdNdjqq1V0r%g$86@|co zW)iZF2%oo!f6`a&Pd;+<&MSO7uH2kCJ1{~u=Q#~fSEQGpy0F1w2FnY`lJ01onr&;mLP`^s|p{f@6rkziUAR z*-hTL9Y`?n(o;xy#SRgeBjOPB+j&Hv4MOU#|60=B zw(p6Pj>xr;ihfO;<>*~IKUi+`ME?oRJY0{MZ)BzGu)S56S2>!^V1y46sC*P_&Y_yp zILbc9hyDag$c|BHo@ZgTj7{@beJomx6I^hAI{*!4&UWm*yTL|U%~FYo(`GhABT-&Yi_dHiDb%^M=U=<=U6Dgu=ZTx#Smc{G^yHZKvR2l9d*7vr_aGo{&PsG=j#`Edlk$IJON!e4(sEuqF6*)Lia=D^_=8AnGO(5PSfI4Rq zq8f?3#O!MGj9yD2Ed@`Kj-%WkVbr~<9enkdmqk|TITJ;HyN=ZC>ylF@kR)q=Q8?A1 z$=1i!w^F=yL0)+{Ls-P0%&n&BUytLlO@CVW{Zo|=FBhL1RZF?;Ttl+>&ndvkzn4%b zd!{6T5*;9XTDpULSn-spHJiq&>wGK_jjCS5nu?tr_eGF5Q>&0l%!J$9NX{6{ZSG(w z20l-_Bd%8csNk}V0Zy%3lfBfT|NXiD`au}bvvC2HvRbk7jX+7#QyU0CjG0^nqIGGE zVP(S+g72(;7{31;s;HKKFc;2dMs$J^P2C!d_s}Xyi^ln&KiZ0Y>-EjEHpXg)=qZ^8 zV~|7y;s(7ES$ZE&>7X1AQDc6)o%F9)7kOfG-W_UWA@=iC|A>~*?&uPy$yeyl){Js3 z;o^Z83)tf1$v|y>xcJxSxc|=irgpzjZ>GWdRbcbFEc+wp z9RJkLN0Eswnzh684dVp2Sm}ES=kGJH%o;XPxSqM&Mlk% zp96q4)CMNsUd(+NJ?fpJKuh>4Jw7o=5ynaRlC`k@a%Y`TVoO2wsrJxZHIWQWAXKbB zlE8HhG@%N6=W!T68ubDLt#IJWxX(%$ZZWDbh?FS5BQry>VHm6?fiWAfxdj9R$-;&9?W!jqleRv)twDht_ zuP}p1wyOYCcVw@XnMsTxPzcjxifA-L>|O_?4>vij?cE~ zetXc&pD}hMya2Jr?szmd>HWOgsWMfZeP{)9p`gjxekYl@GwWofUp?`D|8BgVYd!zt zz~Y?ZPGlZ{vag?f&9WFP7#+%THn~I7Q$X_X%CBQpYeyvAd#E!9WxKd#P}uU7$YmxU!|bo)%k2U2uw%C3iM&cli&si)DeSNYPj9A8Z* z4N287g_P3w>8A5ySSn2t2E#)T8C4%TvsLcEV&{>?~8{yQ{5N^rPdT(Kq z`XLbFS^0HZ{i5-+T29yPJOvB&h|)Yo#;sZ(d9V8BkeE89+*lO*i3NRZ_Z0+ht`T+h z1-{oL|452qc=4Q!xIEDBW$~0@ygB&eWUKX#t^f=ck zGu^5iAM4yJfmdyFgS*Z}H#FD`PhT{F1K&C765(%ri~QqijY}yI<6@ItFR1@v1kZ+m zP(zG_@|c>Vci5~FRw-=iQGSsFEZr0WW^rSH^)lr+h0hRc=p(==-pS=)3J6=2&B-7t+7 z-{M~!KlP%A&H>ctuCV;epIt9cjO|0>Rieta*QFh&*1G>jtOaGVUkQimjyJpi#_QrA z#Z-bpf9~*%iU?YYv{FxePe?Yl&M_*C^6r{93!?rjY8jZVP)H&y>JZlLD<(uu$H^P! z;99o2NS5Wc{kDdAc2UVtELFd4O(lQlF4|>x`C#Y*&@-E~ z^xuyXf9Jnnc>M13+x@2K>L0xo1XnTXd3x@@9ey2nygH}D^&n=G23H6p?2xW|vn?Kq zq;jUNv8$dZ>w5RSq704wVsY@HxsV%uXDTCUP7hn3)V}KQ7K*F3^BMjednpL_OO$&u zUd;#f@Uf0e@I#P&p8}~@@BAHYV3Us_nb}p6>Ao4N9gc*W=b5Z}cXqlFA?x*czj391 zQ&Srz<1f-YsWEaAA{fPXR%EogvkGBsA3I^kJfDu%PGC`t;d_pz77ZpmuGy*ABe(<# zEHTH+HIooT=K{{~#IC_-=JT%kKHp#Jaw)SPav*Bk$>>Ek`A*;Vh55)Y$H7tE3k@2+ zWY|9fnX4i3Ot0WwzciE{udcPS^Np-&WH#2&|9h;X_ZfnBjyWsc${rIx&y(>n-)!_# z{8MJhSLj7g9j9+C2|q*hON^q9|ExNyj#i6Fe^hHe;QO#U|AMSy4ss?(!X%TMVN2BA zu%EWfAPi1;jn2eTInr_BgOAzbF}~cWKC#UID@-iOZN|7M9(Er3qZ7Dfyrca0x6`*j zm$R#Uf-H74b2$><@G=Ri!v7`VPoBUT-i$ALsQS$P6qzygUwXs>0^^!*JRy;^2;Q0S zYBufs$!0_>6z>y&^kO@u_%e2|XzDj{Hr`+7wse(9Rc#j|G#<4+^rd?a`)Y7OZ;8^$ z#TQlfrpbz02V<>RK{7dv4ix&+T)nK%vrtgV4AC>L4=(OW@6cQ9tSK|VHV-WHs`=Zb zUyUAz5%(J_sy!s5i%3x}MMx33+iT_!U&x7oeIS24!hl(8W`;4(AY>JJdP{6@*PIs` zkSOzflxCFKEpcBj$UaRHdC_{g#laOxQKqIEBpX^C*mwe!tIaO-*}BV&;I2h7vZRSeN=7`jENzm zo-|GO3k|#+(;Ns$U4|eN9LQOyr~Ol~^#v&9G;ra#a$+SxG33*MVV7hOqnogfs%s1< zPi4aVz_m;S0}ff{eRqfZol9YLyo*bvCP&|koEXD0AGe>9Gl}x`ufgo-w2sN?&efK9 zeVp$Zb4*n1v+ObPf_qZ9Bs0*vym_R|z86)GR*agHfcaUY8D=@=Q7dD9*+|Iq zjxf?jRZPE&i^2m2Fd3ejyVZU!u7+-05$up%WTWXpM}W+oeHCh!M`lyuy!DEm?_To@ z*^Begz0t(6E5h9Uyn8Xs^RZjPbJ8TY4hOZ`n=2#SNOASbnvU!3xoqhLQ@p8L4<2@L zf1jgl9L8SXeM{Glvv-Dlh}%c>u(zKgXw>y=Yx)(VaV&>AAa$OKd6s=gt+?pxG_&NK zxcfLoRz8ESOS#lNk3!G_^Rve``=QOI!9ltSxtmGjRG-~wb3691gllD>wML-vZvJCx zd%}t6Y$Y6JK8Q5mL7-)?-5M2xi+sR!8L<10*@k%I{6Ew5D&{D!8T}l;UORCw_~y3YleW*mJeZ5{I&aocl1fd3~lcL2X*8yXLf)H=+$LTWHy)*w5J5%WZ)($BPDQ;7YBCGlH#F zJMpCg>bG#M@J@jSjqMMyMKgp=3b2_hiQiW5Dau#-~z#c&`f}IV+XFV5fRjod0nm(OX78v!(mGpy^ z^I+{ry2%l1Ql9Bce6s5qr5UW!eX13=wBkT6sc`M*F-(nRlfOn>lHd9byk9=(#;%|GxvD4*pC5#Zms-}UXQ46!w~j!K6T1bfA&-NPp%i~@BT;ix zxv}+RlzFV4BMsbn($RV$pD@c36xiId|GQ~TlsGaeNYL?$upl7XOJ_VLD0(kPf~ttR z++bRh%DC`Wcp_euZT_mm=U0bapHj1KxT%FXXfhvm8MBCwV)?;fTr#mrh-@#9-Jm2n z4yabM!Nx#g@H#FVIY5H;*W*YqE!vg_xBb2?`QI+usfUk7i){O~&4{;N`+C?$UqcSM z7eYFvk7^g*xD&YEpMD%ktkY?ziEek9?8=$XPtiWr?GsK&=VL(3Vb$=8#u}(pQjn=r z6+dMNm1IyB@|JZ}-5{-XlTtG+i{&xSr(a*8+1?5zLoa}!3a))|zWG6R#s{s3%dRtT zi+%26XAhcDXCy~xZq8EV@H>-#VBh+#m&D71yxzAj;HJwCUnE7~zcfk@nmYYABEMC?q}5MX(xrA%T1?#IR|y9-qP- z#5za?&Tw+%3qg3U)76T%~Q?#yk2zgm68e5$7i#@*atVlIZ_BL##eUzF@$;R=_NHsJ^h zC0zHJPS}ZL2pTPjD(bH=pX(Tgph@!TuYC$9o3O9`>muj4(P7o1Rs3>LDoF7n zp+3tACLsmEY)xSyv<*6$Gn#?UkG@yG)7!C}+>`~IPe}_xF7{jUE^hTVq?~HUc@2pZ z<*K2MDb>4#iTqVz&xpLX*fzGGFjG`hJF}j$3a9BJTdbtG^^!)yL(P7l8ZJDlWISRt z(v&B37MyB*<|egr=a|!aCSwjME^<9m{v_|D><^a~VgNHjHN?n8`PwqG8ZPU`qNm@0 z&9`i25Yajd-Oa%hrUWC;r_qNElK%V=BeURm(Tib$p*tVW^j%Nsr$%NvI1%Fdd5<$# zUD8ACGlrlQYr#Gi!QX#_vsVrK`BEt|MUAW^o@fh%LB?2(DzD#`qcdc^7Af9M3Z*b< zwy>&yOKav9-@sS;lImkjkZObsX%KgPj^*>GFz}ZNE`Xp81 z-dDgHCDoEn8ZQY+(4Km?6G`e@dH+WnUSWr_tOz`P%*x=2wv;o({dc;2HtuCe**@EF zgIxcRB*6d6Kyka%dyjR9q1%`iBh%%)!bO{k5+vMdlaZ>#ffDVgjW^*Y||uwW8PDM877h$85HTO|4(=bf$3;Uc13c-CT(Vt z_Ms~6V^e2HE9TO21V&2@T$V8bSab5K%nT%tUXrTMHl7ipo@@6iOWe#cz96%669-`| zb!4EfeuMV&rc_{~aJRO<;!_}JaKp60$IN{_b5;gi$pSVRwH^FbJWzrqb=5$0G>ug| zBKx_Sfv`q#Kl_Uh@xhUh)1c;fJryzDr3bAg(3k>_RZ{4IKsJXz^ciK$vmefGEz=VC zcHq%M&>D?U$^{Q_*TD3E?1Bya)Cf=sZ=8N$evRe=!4SN8Tt;QBcgf@8{0PvNK!KQn z{&5Kk`Vni*(XYVppw=;evwp+zqf z+>s1nC&~2gzu(dV%@Wh4gc(dyp0?fESfg0S02Wr19F3EV9DJ)N%^ejP1!{JdsuVF; z0jS(9TAP35HLE9RYc^8)}foMOp4{oyWh0N%t|= zVG)mC8I#0*^P2Z?iVvZY=bup87QuN;(~BMok$-D(5}hSR-_8)18+pqKhM!)T3D2@# zMzH1nPRR4wZ=tOS%teKDlt?^wzHyK$ zmwlEh-Cr(y3?8Z&``SqhV#Ip3?5JFI1phY6xw14I(2u*Ku3jTgV-UD(+20d(l+gV+ zQCAi)Q^L!KW^=;MJi|;A=2B?9kDT|=P6PIT(le~~EQa&(vqYc4M-c%9hG6uWZceYk z(e*Wxgy@vMsLH8D95*k&m?O9|ma$YNQZ;GeN8cM~taq8H$Y+8>VkZGMu5X;56$lP- z(b77n>}8^cS%ikx<%Nd0Mt?C2;p6GmR4H(mhz78$>TvV4E5HFMh8qg#CAk#d01{HW z