From fbdc4b8564aa13c61e52a42804e7031e3c818208 Mon Sep 17 00:00:00 2001 From: gjulivan Date: Sat, 21 Jun 2025 00:53:10 +0200 Subject: [PATCH] Rich Text: add custom fonts and image from entity selection --- .../widgets/richtext/_index.md | 140 +++++++++++++++++- .../entity-with-file-upload-context.png | Bin 0 -> 3440 bytes .../rich-text/entity-with-system-image.png | Bin 0 -> 7241 bytes .../rich-text/image-selection-nanoflow.png | Bin 0 -> 7599 bytes .../widgets/rich-text/js-action-setup.png | Bin 0 -> 7165 bytes 5 files changed, 139 insertions(+), 1 deletion(-) create mode 100644 static/attachments/appstore/platform-supported-content/widgets/rich-text/entity-with-file-upload-context.png create mode 100644 static/attachments/appstore/platform-supported-content/widgets/rich-text/entity-with-system-image.png create mode 100644 static/attachments/appstore/platform-supported-content/widgets/rich-text/image-selection-nanoflow.png create mode 100644 static/attachments/appstore/platform-supported-content/widgets/rich-text/js-action-setup.png diff --git a/content/en/docs/marketplace/platform-supported-content/widgets/richtext/_index.md b/content/en/docs/marketplace/platform-supported-content/widgets/richtext/_index.md index 168d736c722..56fc058c02c 100644 --- a/content/en/docs/marketplace/platform-supported-content/widgets/richtext/_index.md +++ b/content/en/docs/marketplace/platform-supported-content/widgets/richtext/_index.md @@ -93,7 +93,9 @@ To configure this widget, follow these steps: * **Syntax** - items: blockquote, codesample, codeblock, (view/edit)code * **Font colors** - items: fontfamily, fontsize, forecolor, backcolor * **Content type** - items: header + * **View** - items: fullscreen * **Removal** - items: clear + * **Table** - items: table * **Advanced** – if selected, you can configure buttons for different toolbar groups {{% alert color="info" %}}All the toolbar groups that you configure will be available in the toolbar. With vertical bars or separator options ("|"), you can separate different toolbar groups.{{% /alert %}} @@ -128,8 +130,144 @@ To configure this widget, follow these steps: ### Advanced Tab -* **Enable spell checking** – configures to use the browser’s native spell checker +* **Enable spell checking** – configures to use the browser’s native spell checker. +* **Custom fonts** – configures extra fonts selection for the font family. +* **Selectable images** – configures image entity source to allow rich text to use images from entity instead of base64 string. +* **Enable default upload** – if enabled, it will keep the current image upload method using base64 string, otherwise it is hidden (default value: true). ### Common Tab For more information, see [Common Section](/refguide/common-widget-properties/#common-properties) in *Properties Common in the Page Editor*. + + +## Advance configuration + +### Custom fonts + +This advance configuration allows you to add extra font list to the font family selection in Rich Text widget. + +#### Prerequisite +Prior to adding new font, font files and font family have to be already included in your project. + +* **Adding font files** +To add font files into the project, you can put the font files inside your styles/web directory. + +* **Define font family in styling** +You will need to define the new font by adding the font face custom styling. +```css +@font-face { + font-family: 'Your-font-family-name'; + src: url('YourFontFile.ttf') format('truetype'); + font-weight: 100; + font-style: normal; +} +``` + +#### Adding a custom font into rich text +{{% alert color="info" %}}This feature is available from Rich Text version 4.7.0 and above.{{% /alert %}} +To add a new custom font, simply go to advance tab and click new on custom font. + +* **Font name** – this is the font name that will be use to display the font on font-family selection in Rich Text toolbar. +* **Font style** – this is the font-family declaration that you have set previously in font-face styling. + +#### Display custom font with correct styling in the toolbar +This is an optional configuration that user can do to display the custom fonts in it's own styling on the font-family toolbar selection. + +* **Font name variable** +The new font name will be display in the toolbar with data-value attribute as `data-value="your-font-name"`. +The name will be derrived from **Font name** configuration by set it to lower case, and replace all space(" ") with dash("-"). +You can use this following custom styling to display it correctly in the toolbar: + +```css +.widget-rich-text .ql-toolbar [data-value=your-font-name]:before { + font-family: 'Your-font-family-name'; +} +``` + + +### Image from entity +{{% alert color="info" %}}This feature is available from Rich Text version 4.8.0 and above.{{% /alert %}} +The default image upload and selection method of Rich Text is to use base64 string as the image source.\ +This has found to be troublesome if the image size is too large that causes the string value attribute to be big. +By using image source from entity, Rich Text will use the image url instead of base64. + + +#### Using file uploader widget +The default and recommended way of uploading and selecting images from entity in Rich Text widget is to use [File Uploader](/appstore/modules/file-uploader/) module. + +##### Prerequisite +Entity that being used for Rich Text data source value attribute have to use FileUploadContext entity generalization. +{{< figure src="/attachments/appstore/platform-supported-content/widgets/rich-text/entity-with-file-upload-context.png" alt="Rich text entity with FileUploadContext generalization" >}} + +##### Configuration +* **Selectable images**\ + Rich text needs to know the source of image entity to be display.\ + On the **advance tab > selectable images**, choose association to **UploadedImage_FileUploadContext/UploadedImage** entity.\ + By selecting this, Rich Text will display a dropzone for image upload widget. + +* **Configuring the image upload widget** + - Drag and drop File Uploader widget to the available image upload dropzone underneath Rich Text widget. + - Open File Uploader widget configuration and select Images as **Upload mode** + - On the advace tab of File Uploader widget, set **Enable custom buttons** "Yes" and add a custom buttons. + - Set **Default file action** to "Yes" on the custom button and call the [nanoflow to select images](#configuring-image-selection-nanoflow) as the action. + +#### Using other widget as image selector +User can also configure to use another widget as the image selector for Rich Text.\ +This widget have to has access to the System.Image object. + +##### Prerequisite + +* Entity that being used for Rich Text data source value attribute have to use has association to System.Image entity. + +{{< figure src="/attachments/appstore/platform-supported-content/widgets/rich-text/entity-with-system-image.png" alt="Rich text entity with FileUploadContext generalization" >}} + +* The custom widget needs to have access to the System.Image object and able to call nanoflow action when image being selected. +* It is not mandatory that the custom widget have upload image function (e.g, using gallery and [Image](/appstore/widgets/image/) widget with onClick is also possible), because Rich Text widget only need the selection action call. + +##### Configuration +* **Selectable images** + Rich text needs to know the source of image entity to be display.\ + On the **advance tab > selectable images**, choose association to the **System.Image** entity.\ + By selecting this, Rich Text will display a dropzone for image upload widget. + +* **Configuring the image upload widget** + - Drag and drop the custom widget to the available image upload dropzone underneath Rich Text widget. + - Use the same **System.Image** association as the datasource. + - Set the action to call the [nanoflow to select images](#configuring-image-selection-nanoflow) as necessary. + +#### Configuring image selection nanoflow +The nanoflow is needed to trigger image object selection and returning the flow back to Rich Text widget. + +{{< figure src="/attachments/appstore/platform-supported-content/widgets/rich-text/image-selection-nanoflow.png" alt="Image selection nanoflow" >}} + +* **Nanoflow parameter** +The nanoflow needs to have access to the **System.Image** entity. Set this as the parameter. +In case of using File Uploader, this should be automatically set up when creating the nanoflow from custom action button. + +* **Getting the object GUID** +The first step of the nanoflow is to get the GUID from the image object. Set call to javascript action GetGuid provided by [Nanoflow Commons](/appstore/modules/nanoflow-commons/) module. + +* **Trigger image selection javascript** +This step is required to pass the GUID of the image object back to Rich Text. +Create a new javascript action and add a string parameter. +In this example, we will name the parameter *fileGuid* and *selectImage* as the Javascript action. + +{{< figure src="/attachments/appstore/platform-supported-content/widgets/rich-text/js-action-setup.png" alt="Javascript action configuration" >}} + +Use the following code in the javascript action: + +```Javascript +export async function selectImage(fileGuid) { + // BEGIN USER CODE + const img = { + id: fileGuid, + url: mx.data.getDocumentUrl(fileGuid, Date.now(), false) + } + const customEvent = new CustomEvent("imageSelected", { bubbles: true, detail: img }); + window.getSelection().anchorNode.dispatchEvent(customEvent); + // END USER CODE +} +``` + +This code will trigger a new Event called "imageSelected" and bubble up the event back to Rich Text widget to continue the flow. +User then can use the image id instead of base64 string as the image source. diff --git a/static/attachments/appstore/platform-supported-content/widgets/rich-text/entity-with-file-upload-context.png b/static/attachments/appstore/platform-supported-content/widgets/rich-text/entity-with-file-upload-context.png new file mode 100644 index 0000000000000000000000000000000000000000..49160dea8586df52c9ed30b3aa39a615653ac041 GIT binary patch literal 3440 zcmb_fS5yD&pjS`%%J*D zn9XP@VzFuW4ax7N?aq&%8|8sz49!p)qEAH2SoZua_S?!CI&o2bqI%jG=mk*(``PEP zC+wfWx~xthu~SOXP?rDM^z(R_T#Icj63wYwt7l*u%+!wq>g?bx9(r+UH{7HlPN3m{ zLgm!cO3_OiCYim!3>|-Asaw=XeWFcCDa9L12d&Y+?QpQ9tSsdSIo{rfi(QJL-nE|a z*1(Z$l#0C(yvg4zbg*%k^ss+pxP%h2=6%wio)rw7NK|={xw| z;zP=ZrXBjUDRb5W0pxGXfkry#LorG~2kof6b%O;X_8o}|tJ1d)2Ur14GI?>nu}8{& z&o?a(H91T1!}ZVl(aAf3(47irP?sJ2hg%CQENM@n7#{2B$k=NaQi$AgnNGi7#h9$2 z?WGQ-K8%n}AZ|X=SfwljuzU7N%=^&!h1a)g7zZEEpL!$d>7oQYpK~aQj+EElqMq`j zd&Kiqsc~;O%h?o4qW`d^(aAW!yoT`OcPJnC{AyG(OjL9LNTrADPn&+iOa*a0mv>Zr z`}c-^S&T4-*6h>AjeDDdgUF&1&85t1z`A3iOslQ(Z09`x3mnZzx8-vJwVNC$5J_$c zI?7^$zwzftUDFp21bH$f2x^t`Q{DLv546y>5CIbYDRw+|tsxDoo*`8?sG2I{&;`#% z*X}Oh7PG(H5%Euixo15OnhWClMEK|~W+=-&bDr8Dt-IGESOX4L_H_}}+$VsQ9YEd~ z{2-qKJV(5@Q6!?(#N69cots3yCy?xQl=>t2St26@vwkSD(9g-!>lE`D?AeW11sSrV z2ttZM)Ccp|fPQwGTX|~FPoq8%5I*4Su#o~d+n3%z&;WAa+bePOC|35_v%{mkfOQYb z=4|W?%$WN~17RqwGFjXg6+Xb_u{NfxB2GTo?ub?V9TZl5&-v(lMR0nIAn)H{nn!v8 z+bDS3FM5#tpJ5sgd$RQB?<^8lC5H0jc2*({>h_l|g_0|wZn=;p))4(=SCyr77ZfyTu!bLs7C5mOF zN;7>~rZ{Mw8gJ2RTI&@P3%PmcveFj1<}`Qunx?bLQ86^JYSZ6LwcchF;$M3(t7qa8 zJd_4IJ{S$68UjX7kVp$L!MTjFK0-^8d)%T?qQrLERj-UkGiUD}T|(-JWzG$o|AlFA z_E0aWFLj#$2i09CH^{68Ba!N2nbfrP2LFSjdnSPvU#ejbvxF)xCd!ja^v?`)?5<|C zqKne{qjLDf-Hz^vUM(49yrbLpXiwb%D+bL<+#2HBO8sJ;R_g`2n3Kt?mo05HeA9Ax zW~&euv0eWc>{p~Bvc&N99HCof@~zfprerxSAPn;8H6lj(agA$5+Z)f%oktr&@cR4>@#>s?KSGQ7kGP+#|} z&Rl}cYeOJX$9%}#AkgCFYuG}C{6s9jbuHw3`0xTs{h^t40cJM7#06kvz%Bx>hlN?q z1KSTY;zqmwL_ReVyh9F7p@#(Io`--1LWnrLA7~+ zGY1_G#c@&ipSx1$(rUOZQ}!7R@&}BEGiREyKZH}&2v_Qa;Eld;OZMI|MG-DC+ahHM zj5SogZN=RJtJEq*-z?`}3Fn^P^%8)Hf~IPF+cM^wKf-hFF5*q?@=VP|-#|0P&TF*w z&~@7g-V~!;e&M)V^WBLQayq$KjG@@QPN@+&B*3*pcigrHqK>s9qg1fvo;cr*qUAGV zFVyX328H*g8BLuOWfJoY_JfTWvN`B&dKFoS4+Za`bgZ{$9b7j$4|*) zg!~d@``WZbQufEAyr!;3!+9(RTFpS8zpgO3(W*Ke;ubAqqBgHk&4*<8DuS@FSRz;PGhE+=pf zu(yGB_*G33eQcH7czvddD->^pl=~G~;7PjcReK5V`EF#)L9|bShxxwig~13w3O%hq zxrc|fB`#={a&XM+VW2jR4uzB82%9pxqFk4~MKcBv*M1Z(Cxok%CtuK7>~E}w_-P;B ziG=e9`;;q17ktG)C$tfTE12kP1Tk5jchv*Wzs5sCuN|1NS=N;~g%;S3eywoa0x1#s zGF6C=ZSj-0-lJtsY-#Z|uW}eC7L~ysoDaVfJKbWS`4%Bv;0EzF_L3&cNSn%Qs;^%1 z@aErU4qivSXP_G35q^DIjO)l>aXU*eM3`^qyR3+7*1Iz=mQSi>^=h^fV1y>jh>d18 z0U@*>*i&wicP-i#pRGvD{La?w_1zy~B_K5!fP&R{n7{ID=jO?GUhpc*wBIN6xM`3w zi~D@AwfFW3M#!WArOFf(zjmh z<(1C0z=Mr}p#l9OSS6hEqs_Eo21|v!uNC|23iX$=f8wzF2lKg#P|UiyIpHVnijf9u zlp_I0l2IVRVs+co){dG9%D}G8#~Wlr>N(=>v$HrFvL?wn;gLqi9Gsu1rUgOC=e!>T zdQitmAICIrY_-CUv~m@051`MEIO0M+(xztB0#bK$D_lS$MZR;2xlzFhA?%~wI7)6S zjk2k2yO5wF1o4~Gs{0}7%0K7_T?$1Q-xT4%1@N-1V*tF+jybkyhMEl$(U-y*e|T=b zora2tDBUC{(!jDV+;l5)kibm$AH2*gv4M&_^ z?aD}5o0MRBFSu-Y7t^Nybe58gQwd_-hTX2q7F!d(Z|G;6l~l45TY}D4yPO3PWv3W9 zR`Y<9r8KsNuk?Xg_;R&K{p%P1YdWfJlsOkqG((hzNg<`g?z4nEF3+t<`BkkK2pTq9 zQq=!1GR(xKIw9eTi>;n&zYXT{fYfK@AuH(jhl457`tsAM*(uPnO4q<|;J*Qd35Un3 zCbjCXlCx_jJa;p;I-a=3gnOrdZ~1VL{%^=^vu?h;{qCYhml4E_#$h{i*Kp;E$D|Um zD$pRc8F;z!*Nu?Jy2_u59Wj3OcRnadFS zP_(?!#elTaUa##7jceZ?V|yNOly?Rtn*NVHiEDnGEs)z`(33cgXqI>;X_tP6S zl#U?kHHmCl6TwU_CB{Zw`tBfj`3XUzJI^x_dLHpp6B1^^?LrecJ2CJ+xL2ZKi|*i^L~FmSFDwV z3FIf}PaqHoa_JYtt02%0DDeG@C>Z!m@H^TIoP_+Yn&^Yb9Y?2ti=FN$a})?vnz(24 z#xCG`x6dzjejw1kM!_M};{D1M1cHrRGDKMiI?u4y{SLOUS{5b~1C`g+7ahL6wr0Pc zAXYuhuzqv3`Ml-Vi_Jo?hw(=v#Ts1BxXf-mf;594gZ4z0e))oYP_23|>#Le(Qq=>m zsf}qW(b?Xhc;FC|p0HADQ#>@7Hk)|^`&l;F&35|=8m$UIIVO$(f%MMogn&Tedr`sw zRs#kw{OCX!cXu z_L%N!y_{uOuT;ZjF8HbQk4?(JzERZbH`P~ zzMuDb%<6r=R|GV1$s@A)0ZYa031^|G^>@~BuCh_Ps&JYe9y#dkY`!ErV{&bk61X7+ zlB3?-k63ZKt)_nD&X+6OdOKWit}8tqC7x((&TCij4i^SZSe%ZGu045cAYgk;$n{ot zrYj>5gGr~>3xRy|$D*R0P5V(OcXbW)lGsr_igOTdH#^iOiaHA1&KZkp=J}bs=`mos z1Ys~kN?5~heJ5x!8~9t8WaK_k-cp2j!`g>@|HUl+UG*0jf+uN>BcU`@ToJy`lLpCY z0;|Tk%tMYq+QM8WT%U;8O#5CLX9JXQ(bZ;%zjZXY;jh2 zs+yF|qL@V)=Y4s0BBkRO>=>iuirUS9 zJA~r<<5$%W+B;7LKon{$sLV3uA+iISnHUXa&5u}ImN7btzMVN_%vmB|WVVN^zQR!N_OY38H;8MMd4$FLy1Fx(Vr zq4SWrrH7yH28T48ZsZeXj4*tKm1D4RC<88&@CvJUZ`G6`8YM7O7dtZA8Qw)#nAJMP zl!8dl&-jv~j4SGl7_DNFV9+VaC=={^bo~@jpC`21`N-i=zHzGv4`Y_`(-hU|js%+a{xFcLdI=zhR8If{@+?p_z+p5rdaPZibkk#_ev?hU&awzQC3@ z#dwdYXb8YN!LisgCFNoPZhE7hiY4lYpfVoS91_{Hik*Wp=pU>JNS85adpPKp(HDNJ z;dg60r(*S^HJ>ty7=(dE7I+L0Y3Fi>8xb&oLxkc`Rzwbng z?Ht8QV3rzd#>41++Ug`OdV1t!rPHWCjW%7jJnaq<(a;<4uVI0ObMH6ur@@fbq=eL- zfE3yY#6X!*(E-Y@tko(EtRXd0|}zBv6ANbI@k-=74a1uuaa;7acenuF8CtP z*WF>5FnEi~URpMIL7<7@YiVe~UIM{CY$^d~t(-%W6#K8n@lxOIW>94eTB@Q z8F7rzW^X?$?M` zID!eP5%M$HaTmmCZe-(KZt`ZZJ)_ERlI$_;2+wITPp)4IHEFiYRMDLtKD9bGx|%8i zKnl#kMf9C<5%I_S^kWFs>Y^Hs1D-3nQFYp_CL)_0_H!)5XLY@TKPYurQ*^Lw_G27j z@C;jkf$atE6&iNdD9vt^Zdzt_1ao|GsRn~mB2EbuckZ{a<*ScE)Ug^U17f8LlblLr zS4ew-A#@;F8e)GxqJ1xKw2G~@s(<4B2UFjz_a~}x>n7Df z-&1erli?%v=^(|Q1N0KgglW=igjMeWQ>7_4M4=VRpfQR?gfp$iJFuLychWdvP6974 z6@z9Eke;YQwLHeU8umkUTUB6)KV`5<8MKwQm$$Rhe6ooqOKNRJOq-FdSFCEf6CyD#kG_Y0o<$6drRtr>Xy&EY7m>JW=E*V;1xoSvZ`;T<+ zGHR8NEL4m#00V$#~V*a(iKjtuwyyp=VrEHbZ*1+u{w+&o86;GiZ1Wog%Gv zbLrr^Z1vzMVC|i1@|GcLTo*XBsDxnc^v?R*YWEyjDl%k*C z;w5}p>mL~lhH#dljeK<7D}}U3RY9L{@30Nt$nIv8V3-!`xJ}#zpZSLf4dhl<%tnoq zjeL)LC($UE&i>ZRbu<>reCj<`IlVU`WBh{p9ow#I$*K0A)O` z_%ddpJ3L+d2AZ~V^hvgSGabEcdvliQgNA8(6FVnWH8f*u2vEI%e@)7Rq-;L7sZG86 zdy&x9pslYG{9?+=jXRWaRqwa*Y~AV9=x7ssz=h&>jm@oXJ(Dto%XMDERT!_sIziv2 zC1!T$l?qaOHOgQk4cW|F(Txt2#Z)f6PP%o{!qkB|ez#x+2;ShRSA7>kmmW}cK#E|1 zD{`?6E3La{Z!Wp2$9-8radY;Mv*(|VcMtK_O3!aB?uw6YHkRVG?Yt1Y`I4%0F!8y_ zvhVzzoYUGPr@x;9>CVUwSyt4q@vb=T2MivHG7ydi$oQz2Y=zs$G}UzK>>14nV{{$q z-qw4}IzWs|zH!AmIKrWRDEm{TXI`<;ASaol$(DrH@|C>=OjSq9Uh0l@*6%V^nhnn7 zA~$Y6-3(-ZlOS3e$7d+GcVvVwU3yuaYh+vKDBoyenN)WosvFrBNq$WsJ1flHe&$6_ z;+u`4(JG5qf?gC)@7$~i-}H=cjT^nV@8~UjWm8zRfT~mASjAc;Ywvx%>4vQ3-g9`@ z&6k5^UgH|oA#-80l5ESY&p+>YP=|2kNGQs;m^~$kD8HmoY~kC1Hg)K7lyO4F^M%y_ zxjKbuue1Du7V7a^0da)|OREMA?oMB~PY?a8Shf4%i&{THFU#V4Tby%74+l?hc1x+> zh%U5z0O4=#CG0So8)PuDHN!{3t zrrJf$f%f$`VDI`owPjtuR~xDi=&yDRV{N>k_9I)YDII))u*#Qqzg)iuwebw8GseZ& zuT^wxEO#UA`})C;5|K||{3WgqX$kO?0VS#5wV@o!6jv>-?Lxn~t41qUkcJ7=`LZ@d zylxpem}1m#%n*G{x-TvYeb{cq2psAxa1@C@cI_}-Ac0Z&AGqwWbGRHCNY-zIy%3qT*o%6$vk8K1ca#?C(>HgR$e z`6P1>bjXvAz`8==j(|F4|E>Q5tJ>J^7uHgI5ANXjR9A@A8);@8oHjGy?*+TeEa6s4W2i=n zDnkjd(65h3`;VZ6k3IMa3h=EZKjK}y?IH>Xo--d{cQYDRmd;#6|% zZ*fHY8)wDe0>T_S<*}T}FjE+0RAaR~5hjXzQW;eaLjdCW7iczgrTPHg%dz!XrK5;8kk)~Q41IO!Y>5?a<5nI(SreZy3-DRb*o{X}n;%-zQI3D}Z zO6xo=iU!Z$1GOK8-~dH5t2so5AzqY=2ZZxx`|ho}C(>ClOxv1UJu57&dnSKv^5P-H zWnvM6K0B62UlGY6_jIaHhTcYQ&n9l4I(H6#b*6fmk~(MB+atvLJXOAk-sXptI}y=a zJ?Uz=rU%wiEGoc+f1J0-W#Te)_Gu3=S8y32M=6e@TRi#~8QH`R{VEKLH?_l1VX`G- zxuiwv+vY&P=kKD>;A%tF^eS$l2cU^v{I~I0bkhDJ?!Qc=}^OBnINz) zwKbfI!#igenhv4lOY(K#V4N{oMv}|vj@2F*61qY)5joFtqZ?Cc!mp!uYPSvvIfz^@ z;->l$f%4~_9&rXV4Hn1G+YZ%v;oYUD^}M!^QtHUmYz3ZsTz9Z^hAcjOmSQ#8vh3&u zc4D~9_Ar*~q3BUB2MWqS#3iJy0Rpu*7V)7vBg6-USbPs=Z%r4E^4PTBh*^36cn|3d zSVSd6;pnR8=X#8U*RU9}FrfOo=` zP?*DmJLvnCq#<=)3?Gr3_(2tKccm1{YfmQ6%Z`9g`~ViBjZh?)E51vxvS{W+Kf({s z!~M)8WlzfiLOho{9n_`P1r&Dya?~uK*yL&aJU~C_C0;@Y4zBucXpJQ;OB4Kff!rT3 zOnK4bmiUfbz7eY)Y3#BS@<3b*JAlz{s1|;$&8cSMF0l08(CgA-JlqgK&J1lKFMB>L ziKl;nHivQOq;j$sq?1szIQX%VYgutD9vs>*EZ96sCZ z51y*j+2FFhvga--n5D^=>!MvK>)&vx6wUB=2hy~|OGCFl^e+Z|<#!g>tC%EaB@GSP z&yD&i{77p12Wp3cr&7pcRxo zKV0p1Jz#d|Wch((<3-d_qBB9H{qf*;40FZFExp(xrNjCUcZGh&>-SKjsU4ktDfKcE{3 zO8YffeUrGmbG{Uj02 z$HIvpH_EK<+?jn;_x$;DcHfM$gl$q*`ow%!vfAw-_p$(fYN2Y*#{uR|USGqf<9iZ! zRA=)qZ9H31MFYHBDhh4i>X67)hdCOfG?skZCTcwwnV2>tBH;SP?RQ@<&3eRi;MUx< zmuR{gUW0InypO4G-av0-u_>vkw$)BHDyDSXwmcQxUmP6L5$7~dzW-n_7(V|nR4c4z zH=>L0{~!b*zGD?TammxEHbv%c>ZlHH^wqv2;e2G;5^?~%R$HHI9!&N!{d5yspH^Ex zIJ_~=b$_Uv(aRWwWUx64_UP}(xq=UB{(Tpfwr?a}4E^<_NkV1{pjYYDhEIN7{6uwI z`TDIA=3Dah_dn`=1|2oJRF61NzG}}QyN_Yzc19X!X4Lk|$$H&>rhD2lGf++fYGtZX z(f;MGBV0*AD<@kW#_OG&gUFnqdS9pWH^f{&4VkNjEqd6MRGH;{`olfbWBn%J#Ls{2 z6Ym}vP!wqOQVI89rg_W{HPG4hIvrBB<(OQEgsc_mFkNRCx}?scW%ci!_nm&ZR|aWe zZ*Tvx_DFoZxi4q_tQ1f&;I_Y~F9y%y+27aE>847&Zn|PiLRJzW*@Ky;f6WTA8bcuV z@?9e@78a;mrUB~qc_FLB1}Uv;z+2h2+FIE1N!!4@K3aHQ89&F;T=lj-dI8>OY_UWk z?gQ8x=vtE+GLQ~R68U^ni;UMPKy}jAKG)a21i0<@KIuQ5AG1$gr$6^k|Aa~5i-@Je z^y|^IHb<{Zt3Sty{bK^B`g_+>QwVqUe~T6+ysU(mju5`R%&oMUWzn(*Y*i#xot`SG z|M}eR3C^<2P+BM8>gB^SfXOFCp#c0lvdEN2jV-RzO?H2dJZ{cY@KcR;R_L;e7mi8z zy|bvuGj{%pe1Wa^lh^8#d10%ubC(XUhG?%yzdExT{B~(UITGwEXs(^La&nUAYIr@1 zy*Al8!jJjrVQg?Kr+VR<_W{B@$rkST_H;oVTJ@S+DEy>F<^ttbmTQ;PK5gbgvxD%* zxwk(&01Rq+5FNi9TXNRz{oe0P_@#*c|#a!#f_xw6&hC1D)8tn~tIXTi`@1Uh(% zzSoPLH0$}#e)t3k^c_K;DC*q_nK%kG{#-bEdJH`>(D4HSJ;onz8vd`In>Qc1GLBUC z=(>P1{w0eDdYJp&fIwFVUH}2L6QGj+=W`CgK2qXf;)clHzuD(ei-QoU)sx1+f**u& z`GT(cKWRsx)j<=jKd9n}c#Vq0VBkAlENE~b_|gRXS)1v}$pYwGKA9ottH$t(z1fSq zecgCl6CTZ3wv~U?J-`i%VGl$(RO|dl?P=MI5oV`#jxAobD^q>evQ!o;XyGOdjt1Ry z*Qk0N>A_(qwS_PzsPrTPcA9+HTQ_cx0Ku>SJ&!rNj=4P*qX>n~dEZXXEMQ(OKQiR) zHs`Iey0yj=)O8@aC*@S=M59X4Vhp?OzHsXU@aH5*k?)#)s4B4vu+$Tgd@qewptLFD zA;zdH9?8`$Chkq41VysIjB-bS$AUzofnWd$+!7Sw@_%$#?;Cqt$j7z8#7O~ zNtc%BqC^D}AoKviL=r*>7(*b1B3X+gZEQ7Xe^34ggl^t@{UPk;SRr0smHoU$i|5RFKrzVC5J86X#C= zKow@g%GI@C{ny{^Ji-A$vF*oi6*2VHbpTL5efIPTml$vEguFq`FMo) z-n?>@XwaOp|Lca;)}Dp4o)eCOa(qK*$bse8O_iG7ET$XOb;5LzTpsnwKZmJtqke`60U{(U@b)vcbBKLF6qSHZ|Xi|Id$KVcvKEZY2VNcmZ`1B)*iF4?Pr zVvx?;kC5#p!0}J*h)sHjVD}FK7tDW-=!fg#Z7`^y^YxLnfcOV&9Q{YHL@ikSZVaVv zE7+|NWE((VbokX7cy0hf3?Q2ny{NwcI+_0^>(J|o@>20(3yt8z7S+oyYyB3&%l*1s zIKlAX?kffM(Lt@&>N73n_SUk#+C&aM;`-=L;8wUjR{tT$=8`G0Nk_MneQ}+2SfcsD z;n32IqPp!k*S-1^8uifX+VYX5m{^VHqr#gKY7Hbq;$5Gg!>ECjqtJG~{5$J3zR=>5Dov~c0Q=k7FUwSMvF&H}dOw+uxmr7^1GDuVJ2AEe={jZd zA=<~*B8)N+4F8qyi%4ge>x`sZwa zuVd7z=Q4Urhe{d8h6>{lR-2l3(yX0TzGR2isJ~!T)s2wmcwJq4wPtxKAuU6Uj@7m zqAy}c_9Dm3`J6c&;BC}@_RU5)V-{x_JdxN^H#Z|i*?BHN`!3fz)J?jUX5@6GMhw>x z`+f5pB0mw`F<-_Q?3rpq0AM|Xcqt**18+m<5l(LDl;X{n33{!9YUn^`-`GRSEZM#x zxm3|0ShwEFyFekp1V1Ko^}u!}8c<2yJP)kCR4v-e!Xvt+T+fHkB^XN@J(rs$mv*pt z(Y@o(c=g1F`=g9u4O~^iRuWI>hM}zBR{>3_l>4bbSJCf_Qk^LqLsR_W)o)Yl z_QTwFJ|^DyWoo9IJ;xJdzwY(o8J3yB_#@r*o)ZPMP|NwVSjYRiz;T6tw`ROtJ1&QN z%4A)QylgLJoa%xigdfAJP=hK!?crUYj4bi z_&KN4{3bG3^wdOYb5UZ!;A#NG{4`BV64R=Acs{rM`wyFUGYZDg+hDs*^X0iRlQo+FP` zR@iw%!>?y|Z+UPWd(=*`rS0qcW(f1+ksR%fw?QImG0C59Meo+1hQ_(MNuvKRFRLrM_Qbvcu5!!6&t=>)H?A{rcX*L9r#x7rpVZ*elUKv0ywv^!A|FaH6k2|anHBFlgPlWz z<|he1FLNq+iFymFj!?+IFbc9h0FT|5pD_D6;`{sC5#L`V+rSx;o3X<}>ycWdm;$wY zEL&ok7B8=Sg_4yTi0>){2dOq{F`HV2HgQ5*16(p*&N14-Ax1UTW7aHarBc9gn`CO+ z_NOLF`b#w>BM!*;bj}rmPu@|O{EK^ZgVtgt#`~GIfbaOHr%Zqv0K=^;?WEPIf3Dl2 zFuAU4*}K}Rm0@80sJ?~shjE(VnsfvyK5TjA`w%k1CS@KqjbHp&m7JA2ZGqyY@Hsbrr$rBtGy-LomOkw%DA(sq#?BRdWfMc z_omhDCTnnA<-cPUoPFZ9Cr<21J6EZ0UhAL-6^Y1>oo*nn%F}s=V0lI*%GQ#l2v#Ve zSEZP8?MgaEfIV@z%^4cg6doH=1V+AP6VSP=fLSq|s9p|aOEvN4T#5KGBa5Rc`_jdx z+e0V6XR4bHb2`NI2or@#QP5YlR2K3c(@MVhc(L~}p}-Tw%oVle7}|>c3q)f9r0jwb zyj4Dad6J})zk_itp=>zI=vCf+7^AhQ$D=p4t#%6|FS1o3k|7c$#I2hj;1s`VS1?2QVYhKdT&vffz{?&qK#f` z!Fn~2w=#UKkYGye4u)@<|Y2xH!kTbH2q zl)6Mxe)h*NcQzQ6It8ph}0d3WV`8c_2%y-kU7Q^C7&iLA@D zw3B_eSs%t~oetjSt~RGOoWi5dbMV1E^UZtm8>Z(Mr>d#m=Z1qD_gK9R5{-WOI~}{! zahv9w_INFyUJkCwC?GZ%)1b&`bJSCj>!I*JQOul5Ue$%39J0rPq1XAc;h>^LOwO1R zQnk=i)k($uOZ0tKOKz#qH{NTxtU!PTk6l}*ecvZ!v!#o49q`ffv0b}T2joIKN?ZE9Ks<8_z z8dblGz+jgP1>=o1MwYC>D;=8Dyd<@Kqe@6IhM8v6ob}R!F{#&*Zje z9A1b+i6!yNp)uG=+50aMAL=nf$}#t#sAUC8yuRp?IQcF)x?#<#N5gX;?&=pcd%ww|xk+OaZplVJ)Rs5WW_?8Vj>=8&xH52Erk5%!P#Mj<0Ckk^T78(jY_rXwvIWvtePcowzl~Ttz zhN`#`uH*e{z%w{+ForJ8UH-*kLV7FHL1T0l3CGA z=MtlQ5G!#x+ER+Kw8jELoV(hSy}-=7pz$*FpB&AA;B{xm58jc|`3=?-DI z?Mw5r&xu{*Z}~O(UG8CmI@2h9_$O|31Wj%kLgg2erupK5jArvJGAAusN+wNb7|5m4 zawv-?@1ae)p}4v4DU*?Xwv-`He8W|w_;wf6Lp^{t9Or<%I^aLQ0xypYNtlXg;`Gk6 zzN(=wzBkp}N%YO4zF9LV^vPCt@h>pTFdSWFtymD4N=ZnlDbGluFk=ldgi+(Td55k- z_!qPVVO)$iv+B^;?-A&mrTSwilUB;Gv1q*EBb|PxG-v z@rF$Ug#lYaBRvknELg|YGkU5&<&e)}VfnuWcRE_hal@4aGP6(TdR9p3aPUdU5F$B% z)x^-zkZOljhe)cpE6fF3lsE1SIkQf<*wX-}B+b*BFCtBs<`iu353^Jhnfzs3xDvsU zASjGo%^?$%#uoeG6>QX(c!Tp8FR{CTl^u14)pAX04%j`qgp3 z14TN6?F{bWQsB*Vqs=mi7eb=@37qzE{!LK-%|nx7JL9~zMUUAK5edfz7Kvx>Ljs>v z@(U}h3#@t5&Vs^C>WSK|e5))sg?U!&{qspKVy=0H_az9up15!?#K zkbO5Sx;tmn&c0l5>U`~V(-4_a+bDG?D1D&|a~~Tzw`{78Gb{Yom+!c|fnfB<;`*a8_>twZY$-_=RvV6=%54M(hJ;CI_A(6+} zie8A30>hAriM2dnp+O}s}!Gt*fg%^p$)HJrEMMDOZW)H3$NhMV)B(j$twiAzIN z7M@TcGAmDY_J=97$HS6~1L-E`Vm+XE)JpL;=E$P(5fPD|x?EztwDM``U7JD{;h3gE z0}{)uf*3ABxN#vz`oZUGm#8{v8xA8|92EOW3Gam3>^o@&j?r_dYts;~qwD+o_@U-2 zs^yTLlVM>Jj}*#H2hKiOEWMUdb@&eW*7f4o8YX$r!0^ODaa+If?Neu!Pj}pR+?2rb zN6=0=mQ*Hii0t=9MDsPq7)q~tb-vgS@%48Ry5&)x25+YB>6_0tRx6PeRMs8O^4n6Se;GD@fJchN{|v z!kkZ|-NIxS+xPlb{#5yMPdK*zj%glT;HzdEXdQjSvVQFmTQM%M;=#~br-~uX5@tAz zyjUz{5{?SYaJxd|R%Z#FE=F4lPsc6nlN-0jQ>WQh3-U|i8CTO`O}v}{UvVCj_6+wI z8KjfSOpsz>AGA1B_O&O1)gaGSbVGULrG2-9zaRCHc{lXku4oKScvQCOufb||O~unb zl~=#*}ait5^`S_)X$m5N? z)8bwh%_gW&zHd6AJ3yV=5^9g`~~0G@W`YTK~p`kQSiNsVDBiM zVw0$0ySCu?<}MwqEXCFWS=&=$KSBDfYH`6jtW1$oDSfq`g626uzEy-2vFuiS=VtSk zhF+-npJZ)kRK6Zc6ExR%C3I&dxRP%ogx1JU8bIkl z1dyJa&=0Mw>l3O`gkx8p(thu(MV&)aHv8KWB4#kI&ovyC$KOSC*7~XigGwOWgk|^3 z4eTl}qpM9J%#X}o>sVgn~-o0#}vAH*yKgl7)uA)A-8mz>#1 zRrzAql2`--I>83xy5+lYlQ{F{CWhVc8lhQ?cgRv zvrN<9juDu!z<4PxH&B@D^M4UV>kI>lXv2~}sf{MkeP7VS?HP9kjExAXG2UQ>@zSlD z&3FPzkpFTi^M6ZIu|ME!6(*&Qgh|l`Y|=xiio|#+bU4W$l!^b8Zg@VOEmmGE$5`kd z+gkWpk3bf{g`0hOL$uF|^{<&@lJ5X-J6Uy~b4jxGfb%WiPH zGrt_M-MJO{`MI(CUU&@VZYaDXDNU*@>D&JCUj*_(eOpmh)5(^(X=$W%v*dMb&e8Uy zxiLanp;^BpsAc!TMwN1FPG!7%X`J+$=)d~nvk`-y?Zn^w?~<&;|Ac~?6^5-wv`gOR zZa6-ZJOZDDM$cz!OMTHtPSc;9KVW@rpY@s})_1wg3n2fMc-%@zAoI;K|**MEd?*Z0M29LB8~%^q)} zM-T({(!%;nC zYEU#>o!i4e6N;AV+jQn^Ib?Jo@H6Ncucf2$fw3A$k6S}s{zQZZB2s8fO$){}WKOX9 z-}(86aC+4{=(9*wYL^BjW`bFjp;g_8nK#0Xnp|tP-!pkSlz-_vacqnykSzm%?hgvOcpHCR&eX#Ta~mtzko=ZfFCsUm9ig7+s#otF zQaBdkj)k?V`y@PAJp4HFz!)YztkB~gIusLJwh!hTyJYPOT)GcNE}&+)`2KioaxKv4klty=%5L4z4>nNEL+7i_DWHq zu1jBIi4pFqQb$kXdRM?r>;K@^NvEfef#CR|>_WZ52ESZNvh<4N@*-*jS6**pR|MuE zf!hAtix z5a02cY1!*68N(VpE?m16cj1-!aRbkXBs8RlTmdUI3w~yMZ|H<-7r*9}J#`xncw&P+ z`H8;KUpUe!1Vu<6U_g%qf#)?9$2w_Q-@3X WFL{!E1n`m-IC}n{NWw2zq5wdQ2L4{$z7_no9hde78?ivtc?+PlS!Dve`04r?#2El6Bkf$d zx&^!zzjeVS5CEiVH$GxqKk79AP)>ncoAA9^KcRkfsW9-hW(S}a+tq~UoG#sum$tajaRwbNZNZSD9E_Gu z36hov7Z%^8g6psCv$Wc-=Gi#C_9p-8s$NK1e9!M9MJK$_$t<&YQTx;HwwLZtej8MO zGfQ7wTV~8x_vN?+);5g#P7P7}h|6wvrLH#Z1!X;JLAK!%g+b5a>rr_fyDc6miH~2; z%DJqTf3gF@etE?H=2!hDeM%#B46`d5!$sW`JWB72Be`Wa-KpiPDZ7+@(zD=*CP5 z%0aAswpD)KHAiM%S{o&0yF}a@b~%QpOd~E|tfan3F?@J`#c;c~=R987rg9f= zBHm_q2YX+tp3c2_0sIPc!ce&*r%qNiRfNh`J!%50opj({7ep4D4UkyO`Tgt8#k%dW z10*w;9{(lrWeL+EvT91__@!!2sC%&OnxQmmvHc1zR?8P3bRHP0kJS#Z8Qei114bxNgsKZf*{~O^(&8gSUO* zvnpJw9^y_fPLR}KuzhS*9b#f^NqIo8-OT(!Ud~WUNm9XkLm}43#7v)6Y!oadhxNlz zv)#{MaA^ApsSPQ*dcj&d$SNPM@uac>adPIZoYs@%7hjOsB2-RC|FrA;J?0ED;%ZZ& zc(eVTc)yIEdNY{7M4r!n${^_aN9!#I_i(0KJh;-T?vtV9c0A8+idoE^E?X7nBu<(d z`QmMdaKaf!T*AJ))9SGOS4mB5^*s2^ckJwrXiVc|a zt2d{SN6oh5_+r&-@9ToQ(eI%4tEN%LvxdNlZ^|+Dc{-4E7(8K{4);LXy~%I zO=|Y@V7zjcL^3` z^jRcfrp${U+I_x@k<_{{teQ1MI@5$V^Y4~13)b;=nVOp6PDSIPcusse)bF|%%>bAVlWvGK!tr5lXyZpNu+#YRKv!CA#HG5w~WTerhY6G6oP!KG!=InqW z&KD@M+zF>U>N~^-NCR%mW!x!t8Lr!CW=RB#_S5>ZRN~XMB*bl);DXkMyU@~kJCID% zKFC^yX8JZY4bBCaXv+u7cD)}y>EXVFfH!(D_BJZu`TIc{P;#7H(MoHEjjdd(vd=Wa z+@Vr7SfoMce?uV}f**|IGWKGK&I76TnmA<>5LJ8z4FJi;}D(PPb+@QZ! z9lHt-N^_X&f_o_1K&Y4}9;EIVT0Zc0MjCFULC& zgCW(7t1+ihNLN8^ir3iiB00W84GK6*ddrX*Gi3;?53vVmt*tibln0iwL`pGLf2n?T z&_Us6CdKaH_n;#1Frs)22ojDednnBtS4^jBJaa}lZb6Fu;pLJ_b$i&uf3+IYX}YMu zY_iJ7AZ+6~2x>UIxx>Zm(!vsKsEEz_gh0zYNX$&H3iUt=Srs0rY;l&nJ(WRfCb{pC={`WY^A)WIEjb$J++I(7$GD6XdOioi;jBlF zYmD}6d*HLOjCz!NNe9Z~A1S_8LTR&iO-j97z!0@DnhW#o#h8-~=T16M;+M_Qz~Swii971;4Un0K0wgw$ zIg0AF(HeoREegGowF|hRc%N23XA%Yg2mr}@NWx=bx-;}~vD`rr1La?vLu%Dc?Bq0o zsLwOKYm2qljZ}23Z%RAX+j5w4un_+1>;a?gYI$)F^4uPWaURaM{VTvXJ{;!SNB22I z)TV2(W4Jk?V4U87dg|+i=(@VacozdnN~0p&D_jH&SyOq@?^*hWxt+_X}`4JHVG5OylH}CQc2AU2RB6-{{|itJGE0#3GPa9n*wfd z^44ITlP+m+XeT=@L`}F&)&h(BXr;{U+M!30}+Iv(SHWSeX=}d%$e% zGAod3%$#rPuv--#0nFn~4XSUWP?z;>@+sdj2)vP)2vZ9&&9cRC8y_PaJR z%mW!FbUp=}KIpp>NFH)k_T6=Y&S4%RKSLqK5zcD`<62P2%QuH~poAwhX~)UPfc;{> zIHUEUS#Kk&8Xvur;JBF$!*W&n?4C3eGmxkIz2(V6YzG2V9o+v`GO-b2Xm+#PvM{{P z#)j%6kUMmqo;t>DC$ZsmlS4C?syUxN{G3d>B{kC;`X`w!qo?zSqf-gV1dLQsZ7A7Ydanm*#yjx+p=}D>W=f?ptse(zyXd zK?_&ncbq$~?*wvd?N1;^Ke*;-rvt#FofMj(iB>_))3dQe8Nht@VV22Wmg(zfhw{&$ zmCBz#S9~%6>lR|~N?SYvfrVdlHWYv(e^1b4LoO+2`|E;*dwTZ1Hr3+r?Mk@0@W;JO zEnWR;r%Kf8TJM)3jY*myMor%o6zq!5&j&f2VeYQn4J#`;6m*_Gh+B3OKYG+Jdh@nl z;c4C7Cu-JK>GS(+KuQ*2H^aq7;!3xRo^~Einas}2yo=+?AThR?3Y&n0*dug%CLGax zElk=m5wuTuhf3Sn+Wj2|+@&3Z&Y+Kjp=1Q?(FZ;C05mG{44Q{QP#A>t8{JD?zk5g~ zY_i;vY%sis*FE-FRiE>{;u`MfjEJp!$ZMYTk&%f-_ef2nHD#ZmjkOJD(2a|#p*O6m z3_8^|6QSv7C22<{I5HT}s!%GW;1*fOpq5IUx^JBlU)R1DIk9IT@dWmewN7g|!RF$f z$>6MyrSIhi3g{$ye|TTO+?1vjfm{%bkkO=UQiPRJ8&mF5pLDI<9$Od?xqfxNz$scHDV)x{XW z(f*wI0Xb>;KfZO(4%ujF=8rN!py=6HuzV<}Zkwi`Mg`dJ5sksHiA3n;xW=XeWtr%_ zrw?^eL(h%&q-H2Q{Am0X#}!0IcwfIkaPvTHLW(8a^TWP0?X6tvprDf;TaMCGY%OTB zP7d)U%J8Vk zl_)1S%!9nj_m4JhJk_5_gBQk7HTGU{l)R&nQPJqN=|9lbfI>qQnsV7wFS1!|e%z1y zZa~c?en;bPRN(s-q@w~T7mWOHzdLV=>OG_mt-5#p`Ywpp^#CXc$1jf`?}(M!r*91; z?+gq)U(324BA5Sl{CFi{-TUgVTU~;h=H_e%$}IocA5-j)l{L4h>bMp54Ib|`!_>?C z3$5f>uVRKj_~l8DGVAm!Jt0IxExP^GBR(W#N}NcXmM?eP3wl>d``p}b&tITH&psxB z+j4#RZ7C(~f6zssH<>Gg`si<4MQ60A^V?dEa_OjhU53^AXh<@Fa&kQQ)el)z3`eh- zjahG%xg<6I@|;?;|BqfY1ghquJ-i|Kj>TGA$?vpi3iiGQ#u?)vFVCR09kzm!X3@tf zD+GarYY!1y%A;fG-%lZfqvUTYrBZ*9Temy%FIpYr{21SAksfaVto=ZwEDVNAanZ z4d>u-B{@{NvrVkh4C>Gn+7B~e_ja@w6cQh|c4$Bw>V~ukwe%DI)GJ=f;%Yor4i$wH zH-TYQcXCxLWxUll%mjW=*?+d?SgS1?{bK*6|G&=r|9G9nhB@eh zDA{nSU^}~*v$0YN8`8?~M949ph~V=-#Lll*uNt1_;25*~t!mN7KzOgLlzDX6{7w4s z_o3_`at+7Clm0`NOK%9KdwtyquFfIdj)OHsj!gAh20NM%@on%hp?LAcYi?az8!B}5 z51&x~>88Q%vEbn97#Q=qdni_9J~jgYbDNR8=nQwE)pNotOLHak1`$NM+WBfR`VMVVu@ z{J?3s5;33+6mAFL*~`lrxAWR1S3l@7!#;P%QGTtwfU;j52;8R~H2g6u)&$#c{5=@C z8F-#jN@??(-pD*sf5bh+Jat_Gwj>#$*BjKbnte>NZ~v!P zL#CHW&BE3Q^!n|^s-}K{FiSEddb(HGM|q)=%?%Aut-nTJ%)9-Xu3Hf!oL!~w$tRC1 zlAWowCxd}^Bosx)|I~>`P$=$}#WY+gC5_YO=vy`X)nh7l-Djqe?&h9$X^5VC@A$8x zKco9op-ow_13OHDzv^4-7{cp3EYQGI?wmY1NAB3oE{zERueoy>jttuG&cg6Xtl6N; ztk6iDgH`^_$8A~?SFD8G5^D2DEXSU(K#Fg(UWuk-C6xo~NY8lM3z6fozRMGLWihQ- z4ybB$z#u;3HDG*>;InYja^-Z{*gl{=2Q`fpil32n+_{<RltPS9;i13p)w!#j6)(+$)DFC~5WeypPWHI9ejJJkWX16|r>T zftaVe&^|d`j^J_T5RLalJn0TJ51M)9H#sYoo0uj;&QYmA0M&`e80rwrs@LvVkVjia z*u1H>=T(2hm8k(-L12WvlU+*MI)iTcd7#{SHz~)gQ~S2m?WAz#%y?6!=n2}zO(-;g zz4Yn@-ZT$gf$VNZ^Kgk?3#?62_lydcC6!yIiDLdJe-!7={yv9s!`ahR z!wtLz4*Z&$8V_W-%)TOmRM!mO^Ma{;g{dEqi%;7_&LBc`^;|u~w0rv9k;0$_<%+9K zMq*(r!SRT6qfpOh>3gsbR5RsHa;oIC&k^=tCuAA4!+f7Z55Ywih}!^aI<1pNEK<9@o5 z!u!!n=i>li>yILc5)CYi03AF2FXfZJ0VEd`5mGuLwJLjO3>c8Ydgjkfy zsQ@4CpJ%FKzLhC|u03CBYE8NEv;M0HwfEIk=mh7GdxjZC+L)?jIr7%vfoi9k_wSVl z|M;!j`iRN$xh~E+v)Sy!=BUUAdA{p8uWsembP`f2VKZ;E#%jXY9M^wZuX`flx9rSQ zU1f)W5n`!gGJ5)k{wJQJ*}dZ%PpAZ+U}PQSY$Yvk-hX40T~%F(GDs=h?Grov8rm;H$jX3~zY(E7A>yy)WCPpb{4 z=PwnfQeS*EWADFQ)_eyPZ(EV%4J`+T{!MKSVL{=e#>9@o#OUBnB*zM}KNLIeQJgAZP(AW#8U@F32DofH?*Rdu}&q!aYr> zDcTr)sfqK5(!=wuxhq9A2Xi zjj9AEeSxYmo9&ZW#SLL9PN;PMI2vCu5z3Syx7>@}rPT?}5*g|vCl(w}%uxG%{ccih zuY@HU4@*1J4N))peYZg&a)}v7Vp-HW4q?^nST(dWCdwV5X#S8N#v??=gowVe6C+I=~2$~~SvKhSQ$<=T{t;h0*%VouWP941$`pm7aaW1sfO)q?{Q0Q`zoZBUP&aJ~fS;nCZpOndkPVEgSCODwuAqYfDdZ zfmYG1g+rAp_vM#mhR%_J40?+jy76qCd%=aij!z|LN(2i|+HznXdSZBwoAVKk=9HdOr{ou=2_@gP1YnZUweTg$!vIKD7krI8ae8S) zg)#Ynt2H2%(|xO0vFxjaw>}ot7^xedNRm5CFgdcOz_%oLy=O$YlW* zzA1V8!^fZA>e;;Ov@`?)sVSmY@BKVBMudRFWL>