From 4952496970605680bbb79e630f409eeee5396331 Mon Sep 17 00:00:00 2001 From: Christian Lopes Date: Mon, 18 Mar 2024 17:57:16 -0300 Subject: [PATCH] New app logo and adds the app icon to Cytoscape's toolbar. --- pom.xml | 2 +- .../org/nrnb/gsoc/enrichment/CyActivator.java | 12 +++-- .../actions/ShowAppTableAction.java | 46 ++++++++++++++++++ .../enrichment/ui/EnrichmentCytoPanel.java | 5 +- .../nrnb/gsoc/enrichment/utils/IconUtil.java | 45 +++++++++++++++++ src/main/resources/fonts/enrichmenttable.ttf | Bin 0 -> 2956 bytes .../resources/images/enrichment-table.png | Bin 23422 -> 0 bytes 7 files changed, 104 insertions(+), 6 deletions(-) create mode 100644 src/main/java/org/nrnb/gsoc/enrichment/actions/ShowAppTableAction.java create mode 100644 src/main/java/org/nrnb/gsoc/enrichment/utils/IconUtil.java create mode 100644 src/main/resources/fonts/enrichmenttable.ttf delete mode 100644 src/main/resources/images/enrichment-table.png diff --git a/pom.xml b/pom.xml index a9c8d5b..1dc50b6 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ org.nrnb.gsoc.enrichment 3.8.0 - 4.2.1 + 5.1.9 3.8.0 6.0.0 diff --git a/src/main/java/org/nrnb/gsoc/enrichment/CyActivator.java b/src/main/java/org/nrnb/gsoc/enrichment/CyActivator.java index c4dafd6..36e6129 100644 --- a/src/main/java/org/nrnb/gsoc/enrichment/CyActivator.java +++ b/src/main/java/org/nrnb/gsoc/enrichment/CyActivator.java @@ -1,5 +1,9 @@ package org.nrnb.gsoc.enrichment; +import java.util.Properties; + +import org.cytoscape.application.events.SetCurrentNetworkListener; +import org.cytoscape.application.swing.CyAction; import org.cytoscape.application.swing.CySwingApplication; import org.cytoscape.application.swing.CytoPanel; import org.cytoscape.application.swing.CytoPanelComponent; @@ -7,19 +11,17 @@ import org.cytoscape.application.swing.CytoPanelName; import org.cytoscape.application.swing.CytoPanelState; import org.cytoscape.model.events.NetworkAboutToBeDestroyedListener; -import org.cytoscape.application.events.SetCurrentNetworkListener; import org.cytoscape.model.events.SelectedNodesAndEdgesListener; import org.cytoscape.service.util.AbstractCyActivator; import org.cytoscape.service.util.CyServiceRegistrar; import org.cytoscape.session.events.SessionLoadedListener; import org.cytoscape.work.ServiceProperties; import org.cytoscape.work.TaskFactory; +import org.nrnb.gsoc.enrichment.actions.ShowAppTableAction; import org.nrnb.gsoc.enrichment.tasks.EnrichmentTaskFactory; import org.nrnb.gsoc.enrichment.ui.EnrichmentCytoPanel; import org.osgi.framework.BundleContext; -import java.util.Properties; - /** * @author ighosh98 * {@code CyActivator} is a class that is a starting point for OSGi bundles. @@ -52,6 +54,7 @@ public class CyActivator extends AbstractCyActivator { * environment. You use {@code BundleContext} to import services or ask OSGi * about the status of some service. */ + @Override public void start(BundleContext context) throws Exception { // Get the services we're going to want to use CyServiceRegistrar registrar = getService(context, CyServiceRegistrar.class); @@ -74,6 +77,9 @@ public void start(BundleContext context) throws Exception { registrar.registerService(enrichmentPanel, SetCurrentNetworkListener.class, new Properties()); //registrar.registerService(enrichmentPanel, SetCurrentNetworkListener.class, new Properties()); //registrar.registerService(enrichmentPanel, NetworkAddedListener.class, new Properties()); + + ShowAppTableAction showAppTableAction = new ShowAppTableAction(registrar); + registerService(context, showAppTableAction, CyAction.class); if (cytoPanel.getState() == CytoPanelState.HIDE) cytoPanel.setState(CytoPanelState.DOCK); diff --git a/src/main/java/org/nrnb/gsoc/enrichment/actions/ShowAppTableAction.java b/src/main/java/org/nrnb/gsoc/enrichment/actions/ShowAppTableAction.java new file mode 100644 index 0000000..d46c0d6 --- /dev/null +++ b/src/main/java/org/nrnb/gsoc/enrichment/actions/ShowAppTableAction.java @@ -0,0 +1,46 @@ +package org.nrnb.gsoc.enrichment.actions; + +import static org.nrnb.gsoc.enrichment.utils.IconUtil.APP_ICON_COLORS; +import static org.nrnb.gsoc.enrichment.utils.IconUtil.APP_ICON_LAYERS; + +import java.awt.event.ActionEvent; + +import org.cytoscape.application.swing.AbstractCyAction; +import org.cytoscape.application.swing.CySwingApplication; +import org.cytoscape.application.swing.CytoPanelName; +import org.cytoscape.application.swing.CytoPanelState; +import org.cytoscape.service.util.CyServiceRegistrar; +import org.cytoscape.util.swing.TextIcon; +import org.nrnb.gsoc.enrichment.utils.IconUtil; + +@SuppressWarnings("serial") +public class ShowAppTableAction extends AbstractCyAction { + + private final CyServiceRegistrar serviceRegistrar; + + public ShowAppTableAction(CyServiceRegistrar serviceRegistrar) { + super("Enrichment Table"); + this.serviceRegistrar = serviceRegistrar; + + inToolBar = true; + insertToolbarSeparatorBefore = true; + toolbarGravity = 11.0f; + + var iconFont = IconUtil.getIconFont(30.0f); + var icon = new TextIcon(APP_ICON_LAYERS, iconFont, APP_ICON_COLORS, 32, 32, 1); + + putValue(SHORT_DESCRIPTION, "Show Enrichment Table"); // Tooltip's short description + putValue(LARGE_ICON_KEY, icon); + } + + @Override + public void actionPerformed(ActionEvent e) { + var swingApp = serviceRegistrar.getService(CySwingApplication.class); + var cytoPanel = swingApp.getCytoPanel(CytoPanelName.SOUTH); + + if (cytoPanel.getState() == CytoPanelState.HIDE) + cytoPanel.setState(CytoPanelState.DOCK); + + cytoPanel.setSelectedIndex(cytoPanel.indexOfComponent("org.nrnb.gsoc.enrichment")); + } +} diff --git a/src/main/java/org/nrnb/gsoc/enrichment/ui/EnrichmentCytoPanel.java b/src/main/java/org/nrnb/gsoc/enrichment/ui/EnrichmentCytoPanel.java index 93a2a57..726f932 100644 --- a/src/main/java/org/nrnb/gsoc/enrichment/ui/EnrichmentCytoPanel.java +++ b/src/main/java/org/nrnb/gsoc/enrichment/ui/EnrichmentCytoPanel.java @@ -30,6 +30,7 @@ import org.nrnb.gsoc.enrichment.utils.ModelUtils; import org.cytoscape.application.swing.CytoPanelState; import org.cytoscape.property.CyProperty; +import org.nrnb.gsoc.enrichment.utils.IconUtil; import org.nrnb.gsoc.enrichment.utils.SessionUtils; import org.nrnb.gsoc.enrichment.utils.ViewUtils; @@ -177,8 +178,8 @@ public String getTitle() { @Override public Icon getIcon() { if (icon == null) { - var font = registrar.getService(IconManager.class).getIconFont(14.0f); - icon = new TextIcon(IconManager.ICON_REFRESH, font, 16, 16); + var font = IconUtil.getIconFont(14.0f); + icon = new TextIcon(IconUtil.APP_LOGO_MONO, font, 16, 16); } return icon; diff --git a/src/main/java/org/nrnb/gsoc/enrichment/utils/IconUtil.java b/src/main/java/org/nrnb/gsoc/enrichment/utils/IconUtil.java new file mode 100644 index 0000000..37dcd7b --- /dev/null +++ b/src/main/java/org/nrnb/gsoc/enrichment/utils/IconUtil.java @@ -0,0 +1,45 @@ +package org.nrnb.gsoc.enrichment.utils; + +import java.awt.Color; +import java.awt.Font; +import java.awt.FontFormatException; +import java.io.IOException; + +public abstract class IconUtil { + + public static final String APP_LOGO_MONO = "a"; + public static final String APP_LOGO_LAYER_1 = "b"; + public static final String APP_LOGO_LAYER_2 = "c"; + public static final String APP_LOGO_LAYER_3 = "d"; + + public static final String[] APP_ICON_LAYERS = new String[] { + APP_LOGO_LAYER_1, + APP_LOGO_LAYER_2, + APP_LOGO_LAYER_3 + }; + public static final Color[] APP_ICON_COLORS = new Color[] { + new Color(5, 62, 96), + Color.WHITE, + new Color(56, 120, 158) + }; + + private static Font iconFont; + + static { + try { + iconFont = Font.createFont(Font.TRUETYPE_FONT, IconUtil.class.getResourceAsStream("/fonts/enrichmenttable.ttf")); + } catch (FontFormatException e) { + throw new RuntimeException(); + } catch (IOException e) { + throw new RuntimeException(); + } + } + + public static Font getIconFont(float size) { + return iconFont.deriveFont(size); + } + + private IconUtil() { + // ... + } +} diff --git a/src/main/resources/fonts/enrichmenttable.ttf b/src/main/resources/fonts/enrichmenttable.ttf new file mode 100644 index 0000000000000000000000000000000000000000..2270e41b779ead52cb8bbf64556d980e6b708637 GIT binary patch literal 2956 zcmdT`UuauZ82_DnZ<2ON+Qz2I#L-sI)sh~cLQjkqkf9K?;&A+Pk%|p&T-}n1| z-*>)yzMFFn1OO*qfsTo>v8T?h9{&A3z`jV-cly-m7!K14`vmpg@#Le?@dwYo1&F7q zPtD{~i^lEt7pUK4eO}Jon2rp9|0r0+zM;bZYj{`St6x-DV%2 zCt$cW3w_;7bK3oE)vb3AbhUgP>qq9gLg;{ZD z^A5r)lPyjqBk8aDJ`MqtRV1#vTzmM;Y)?^>dHZ1C5sp@lLOIT|O0uQoxcRZkCm^g_ z6M-*KnMN|Jt#KWy_-;nsuyC6HL;GIb(r#$CU}Mepi=SDE$8e67S;p)55ZAa?QO^O< zH#8XRKO!EsS?guD*KMYUeyW99Nl03y zaVPEa$^9n|oV?GEOa3qOVohAfLpX#HoW%tc@fzO8r}zqp4-HmpR+pFq^>Suu>Hs)Ui`iqt9frWLMgQdLPY8;tdilDZwV zo?0I!;Ba=8KXEx74yQ{z$0A+{>+Xg6XF*tLnPBmVB z&?Ud!E@A1EqpE#CZe8Nl7PbGZW$lN!zFhNQKUY6Ke2o9=9&a-gY=pcmY5(1`DGg3w z3%CLeg)lT#Phm+K#tMtyLeq>SmuLrLlVcOL8nhDTBhgvDS6^QeSOXS9GxRrFE3!m8 znChIGc;T&h(v&UVlV^qCDd!aHJeBNJYPYuaJllrQ629ZU#D?So4!mogY66|`o3h58 zJYmW@j^L^(8|3_I$`;sp8xbms6`dj>Pf??tNH4L9tf2z~rmSNMXH3~3=NnVDz=J>kF5oShy-kttwo(d&dgcs`}Q|;XXZ{hd+*==t)7sIB#CvKj}DKn^?b*= zUsY1R?elvL__4nAT>e<<{EyDlP&&?hb**_z`EROezT7cz=4jx|kW4?D^?9 zd$4E@2G-*P&m7e<2R)s~F<^87vLifKWrL9gf&=HV0l%*TqI_uC8?EC3N2&o3Q)kX3 zARGvK*x|sLyMe>#b*}sen6xjtfxUv~&dJ8zv+>@@YwFXk`oh6AGosPc zMIa8cHgjq{=G$BfhQ+EfSsSY(Y`%_j&B>XE7#TRX+rr~&+6c2l`ylH%^Vg}MY2kGz zXX6#wcvm()n2k+=0rmwp-?+m|RdSi$C!UR^>X+XZWi!G(ytZ&n*RpYBHrBJTnvGMk zu`3%J{M!8fPJZpN*|>(^FQ0>(vTZG|;&k`@0*^ zs;ZcseC&{TUVn!f=5^Uv$;NFSAZ+};YCB-ss&tjb&=&Q}-b{P=8UVD8&c-o(yEhwm z;|+2KgVsYB43FXeJ(eHO!FDe{pM&6*_1--O*=_#&p!NN3W`OMR<6q|Qb$vE2=f^+E z8xw5iD&DC3`R}g9KGP+cD{|(_{yRT>Cbb>9rVUrq8aT`lhvDk@XLSSCJzAT*Z4WGn=fYL4!*sD zU-LNz`8x!ay-5d`&FF3C7YPip4lvBGXI}uqG(uIzA@^=Wqh1uarmTKKu@avQ^)7;Hqi9_L2+4xE}Zq3F=*aUDV9{|%* z7mK0*>`;W#&1~+Ujb8PCX7R}I~A#4 z`RjJ@^QZE{22;FWHtxZ;CV=Cr!)n?fQ15SHK>cq9(D!BI_H2BWpWliE5XsitA%E;) z-R#hfP28qY+x#>Sf}^tWKdgIt-9UGGlxspZ51+wR=scq>|(gBdGFl zFkM2%9tZaJd7iWF3P5GQ-gchYnP1zU*Eh*&1+&giWaBRbuK{4bFdJ{LX1c$5iSUfEgSauz_C9>N}iC*YM*~ zR*;nCWpB5z1D|&+v&JVeP=ZO`Q|ERrax1gYcQI(bk=6PeX&5rKh+tSGT{iK2 zmRV+zz!~%%WFiw>Fif3&CE4pIJ>*;`mz2o|BFHWaD(jrG=0U22D7Q zVDr3$S?9q8XPekRu#^8KugNlp$LESz(8_#5w`!s4-sLwLVCeJBCYp%-1t67b|o|+Yx=u3ZfBQ~IZKQ9}9RPz0? zUw$VWucBd?R>%w`*%#+>&@3xpR;@tf0-jCl`vPFrZI8;o&yma?kxKSr2FcxuH%ldb z1`CAXAZY&Y`0q`ce*U{#V8+hyB7tP2!Xb@-|8F8=r`=iMJG?s^KT0M+VBnaZ8teF4 zM!@tLirq>q_QD;IKa?Py(RW5R2Rzzv;`}U`ST&Tx(h#8K7i1P8ko%9x#CQHL4V^^k z1bf_DhD4)YWjBU5an{fzd)?Kl_A*0!&;;)Z8!qz7KS2vrQEC~h z6)l1XGEYwgqx`{ad>5Ilo1Kamt(W`ocq*Cn!hg%g1=%=2!}P{(jR$I|y@MM>kH=sx z`qc@+5(3XUqC75IB*4^Iz1d&yz04?|%>&^;d-T$%1OV;*%;?UiVNK97MU_(;%^Vtd zz%eP%yx`>dAu`UYI*1KIu6~M)9ka>!m>*850_N;4JW>^5?|BKU-)HG%Q7Iv?b0UlA zwPXr|+`x>p9|44Ul7rhjs*J$N^UY*Z8tbyFgFz$b{Q5ZoVIth`Ip&VUy1rU*eFhVQ zQyI>iUn1jGJWH9qN(DKd2U1>zBfQAT;H%#d}1BlMg#tX<4D2)7Ut~;3^Fuf zcz!3VN8e7yi>S<9WgfE54D)xh@m4aG;x{XT4c0JRxSR#aCn_o&^E+2mjH0@HwVm3ax);~qY^ z&t>qujn&<>Rf9GAyj6Wv;p{piuGjrbJ`#20X_;$-00~&4KmezTJ7a1IF z3hx#NuzTC25vLRdCd{Vr`Deq11h4lmlBpo1qS7Qm2oM}Y2z>t!GU=A<1$!yK1xTX6 z?`bpmp4eCS;r)7$C6R#W>#rOAp&m6 zwZ35Uh^6fK48+0x2pO;8-E=>yERevSc~v%kj7;HPsVdSAW~OhP@pnUL6vFO4)%1(F zD1ez1fTIg|c8yBATvSzW8+vo2D8`?%`f#l7Ka~X)?28}I#>Hej(|wC+Vr_qnX7Ag8 zjTM~(-rn?!wis zs;H>US3p?q&VZRlfTIn1IWz3j6nmF1LoT@sh`!dM_TLDlK*j^g<3B{#sftQtG(Kp0 zXpDBi0y|%B`OMQKn+}++0k`AaFA4>4PZ<2)scb9x9R^Mn6_sWP966}?g{Ei+oA?Er z2AIBL8hH?DrBDFtJ_2>0OQ!#~ii%3}*9V=?0OyBc;)}EVsn`fW{5K8b+%RubV|RSbA1501mm~sCH9{qymYkA}XJq5$y6#j|7ECcNk) z0;x(ow^A;-9bJ=>zdl5aBl)iT%LbUp6hIG?7wDQ(QCV2&GVy`K_8|G&)40qr#14}J zV1&4N3j3IHUbdc>O!`Eq;EZL_xGwKy(PG?cViX&r%7WhRaBNm z&}i^P0R&TlAtnM)`k3p)wt__gM#+AGQcwsR`aK0p6_uruEiw(--b1F}58486^W%Br zLsz|?x-=y<(!K9`y4>nR#P*FJ%*L@JOWa&rr5*njugZjswC0F*yK#)GD!qO!aK zoOmcT!#^>#T=I@brA`DJgk-es)3^~g4+VHiHh!5*(=rtmmE{%`_7=IB|f^223{=DhEahOkF_*lQ)qu0;{N~v_s(BMUBkQ)eMG-qYc}cLtOzd z?~-XS%(5leVqS|_%lDIJ@TjP?O^}p=-118TI3aViM76!aQZYL8u zhW|y_*e+Jh@IHI^5Z%F#=eIiM#>g1s)G!E7%S>uie0tHf!G?rx}P$D=4yS9f%E_a!^gfz|lOvI>6^4Z}=Snjt+VQGFWP8t3*! z<{@ssjr^e9O11r|u8o=5 zg}}bPkd6Ofl^cukM(03v=PFiJ_JN-ShD75v4(+;!c{tIm)Gx3Zc(h7nLxpd<~hxp(@j}1wrM$ju+m=%p|Yn`Psp2 zOH!|kz%ZmX+u%nuS|=c(IoYEk1tBeu%Er@JjX#aFLe@M4w)DTw#xK!?Rnun)n27*} zQmM9%u#plE!@!R}l}vE@*}5*KA_sU}%qln74vnbNQt*si91&V!ZZKN%_u1_Z8Wq&rS>pPTn&O|=V*ZfOU07I7$ zb{yR6lmX1xBEJdAJveOj%eF`1z2M||nXZLe1)&%4Zof4f|C^0Zunh>Cx+kd0Zd=iT z2Rz#>iK8hU$@hOf8xJ5;hU_@KOj8xu*Pow_cSQoC)VtiRMwF942|!&*lgNeA3A~{j zMPG((pmfu_X_)q;GC5F!K_c(=zq0WmW|^xr-YBYyXL*^y&?W~YkOABIWgj9?4-uM# zLbvDua4#}hOq%arzu=mqCCy)0SmVnd?-mfd&}Wc`D5Ocr1y$$fg7@)X7&LWpO(uD8 z`CG_Tb^4HA5^-Zl2fq{}Dv^ZH=7KF4f$vDi{CP4#^60C5lukkIf)bC&`Z-AB$qp%n z>j(tFP`K?|_wO=E#R65`EChDTpJY3bg5_i$Ooq-Ps>*J}g~Sp= z%&@4|q1y{es$dhPetF)rioA|Y(GrBtJ(bn;-MXAB6NdX+hg;oq6|M5jLLQ%uzbE5K zREZaOy5ar)V=^(7w>3yrc0HBu{k+JA-DWwh0E#}{^C)8cN-}jgRVHKVXEYTseNppW4=~yrGB3J;Oo-p5(fWrf zVX%A?kMn9^hl#)tJD%r@05LXf!@fUo7-gCE%F80CwfUlKJV}@L!~)0JnzTZhKmQ+6pnYy&?A>0;021*2eDELUaYon*?~eLXNg60?`uh;}{y8v;ZZ%zQz; zzB-k$vdmyE zkIr$STu7!O%U@a7Pnv^HK!q*>sL*`56^4Ay6iufr&R4b%uE&$sd97QJDR^25z)S*~ zS7`1!7I{c|`E_2Fy>+rGnjn}0;2ymCZ)27Z6p*IFb~HBS}J^-PRUdRb9XKuO4pavynI9>lv0`I zC_Rm|I;5}t1Zn5T&?KTW}h}@k-uGU#{tYv3H2+DxJ{i+B~_U(3Wq`#%HQfzpSr--{|F`=TO`NzCUugHX#nO5 zpRNzr`4k1&IKP$j3*F zH!60mSD33t04BVGKSdgIDajXjGyQu@)Md#l={i)pG}`{53>dmVD8-2ms;XZVem|-a z!O8P5UFtKD9^*}3k8~yjHfcBD!Z!j z!1GwG>Q{xmgreBb)}=mEK|JQ^WU4_e6kuX=AVB?5jQA?U&5Y{M@RACP;z3v2lk!M(9(OrMTWjj}b+9%jX+0w$}O@1c@VQGm7$=N7aTnQG$VE>Rg3ZkVaL=0$e)k(F8g|=G=Tw5OHR$kKaeSo ztulK77NHdg96)!}ysuK1T=dA_j?!fvA@vLH{TJ}9ijk`rDF0>(sxr~IcUfYHG0ZSj zijBx$nAc^9ZDlvVnT-eQa-XZ9DH>wFFRfv3N&D;YUIJk5q)`KXjOyjyM<~VpNSi$6 zf?h7KA(O>(umTuLDS365VoN;?(aj#}>vW3q1Uo%?Dm_mx&D`ZI9+yUFUOr9BEpj88 zqI!;69*Sd=!Zz~z$mx8D&f8rAfP4dwn`k_iFeSPFb*BUv`sT}*^5p};!4j*=Rlra> zxO_!v(3|Jabh$S|kXZ=F&pQhkVr*qEFZT6lJWZ&m3bw0$Ar9)rq{V^rYlBJqcUH-F zlD~vh6*li{{~DSrEw~XE1>iFJRM=?wwZ`UrrC!#?2<8cClBfu^PVr7k3XqI^|KusK zckLwr<{_#c)C;@Wvl)0bP~DWwM+VOqDV!EsG+{0%`n<{thT&3dB(Qm3F^*WqaZhHJ zC+ekdlsuZ}pD*@M z0a3O^5y{ntI@a}1O0tb2(*``@NIuYxkIfU*$3y`8mr1VT5!IUi&2$x5Of_~cARe+1`txeq&QJG*Stuc zNb2NiI$%DKF>Pw8$CCgi-1rY^Iap%TA%h2wo~uew{bd70*R$_am17I_h5%6l!caGW zI&8hjBzbuWAXk}>05DG`Q@5c}fQbNg^cin^fnfCE`A0H&tjh?9QjDmS<>huCjcw)N zf}do{Ad*{c%&N*f`ck3L^Su<08ZYSkep(X&6F~Vm8utHbquh{zztd?04U*u)(m9kqUNBi@_41Sm$Nq zP1)FJAQ+}pT$7Rt)a6)E^s&XD@x|EX5Pzst~^f=L{&}a)0mBkPg zZ$64<--vyYfH0rHP3)C;@d{v&{us(YU!}d z0*B_yNPAK(qTGYz_8>6{4qfN9UF-HPTm)e5E?@$w^Fi=L-M7UP0k)6g#7AvvzMjOKNhIkHFo zU}`BJ8S416slCn~q+R`71yz}7v_iSd-s{RQciEp5Fs~_? zknu6>r-JH30zn9oj?@nFw0rg@G+xmLf|Ri1S_+oP;CV$hZnZ$q1w{M0bW4I^NL?-} z)GJjaQZNkLq+Irnjsefg#;=em;E+GR!h0cC%aEv%*O492Xr0&%exGe?ZdR@N=~#QL z>l|cV>wf;aL;QaEVY|)WC*^&+%J0>;zAN!_`S%|1eS6Jx`MqqXZ~oow&mrOOb$(rb z-SYR@a`wPB4ejWC>-Xi~ch&lhJFU+eIM;fI16o~&Ig;~R@R~DOb3SN2mQXmBmmJMY zitD|rfbhW*$o;HCIz}e;3A9A#;{nl?J8v0cZ@&E4O`#JFMq+$B;iuInm zcs}y)c*r@p#@Hg2PjE=f#9;Wd=-2G2ppeO-?M z!TzkC#i;Vn?eODkG;GnZW_{m1{Qq74T?2mq4*zYxZiBzansre3S*y%zyXN0F|1G=t zd+g%xe#inxeE*xt6z4f)eg9+l{cN5J2Cac`lHt7fl8d++1YJq&;nLAtU4ryKkixsC9d!5@n#WGBs6i=achFRP~ z#w&iaV|TJ`he<4@ZwV+$Q2-KCEbFO^F>Ofclo|yPo-2wlZP<^MZLi#O=A=V%3al@| zLF!N6Xut%8KAYMXtPYz0mTX+a_qSRMgg)D0$e~hqmHCi?UQHYRxgzqnSC&j0WvfNG z*Ly%=XXV1SSB?QpTu@Y*esl{L-Bo1LANREw4DH9d!X_-!gNP{HW`hLN#=uga+jc<3 z&R54XFG&C}J0&!tqSh#b!2B)MeDxw1IP8~gEaUc}Y+Sg+>X*-xJc;_{Q{}t(HG7Zpk<*bz2h z5g1B#+Sn+7SoNzdHr^OU-z9$(K+!dH4yn0zCl4&d1>yGZcD z!FG9Z12>q<{zB?kOkK*V>X)RBwOw8IA>E)P5mqpzFGJ72yi03R^M z0Aft9`51<%^CdUU^W8=zIP?Uy+`Z6`rS=7?qh0PNYEVmjVH;ABjZR=g7O7v8Fho_q z;!GPMAdEF_P{Di^rRiz@V+8J1FJh-dEk-?0OmUR z`(dLH=eaGKB>ZmJEiVnQj1Zl-?TV93n9t@Uh1+Prd@(zem`K-Sh6Q^aMxl_Ozt1=BAOVlWUcy>rs9K&0sy)u!% zU`D7YO5@E?A;3JRMeGuSPLS`XVcT2<#9}8(QouMSRh2{P*V5)IPcT=m!_lW2OPxl` z0wR&@^wtS`Erg8-v1a#XgS$@e@P3?VgbvR__BrY+~9s$XSl99Ch6J|H9-Pn~r8 z5~->jR+Xi$qD19`uqnXIeZZ$t0O12{%sH9&0&!o2u4_lN;v21>Zy*iiM$*RCNY zzgM}6`sG%Rmr^RFV0i_^(OW4Cg{XS^t9y;p0#%tjK&Wg!Y})7qG_8&Vn6}(68^^Zf z0-}7|d5$e+))VH&6xN}Bg+exLHsZEd)*$Tg;pGBkR{%=)wPg>lm^bUsfV5~|Nt)JObCCB$b{nOiOQX%#msRi^VY|Gtf^8$Ea5Jy6 zp2{S!!AO`uJFQaHuWITSIdhl_OtCB&68RlljS9kU_*@Yc$MBXlZAfH;BFq}84VZ_V z2}57sW2hY-a$MvOTNf~t<|Q#g7ck4(qFf+M3fQ3rVTaj#QDNRPrPzE`<_8fBabcT$ zO?j?-YO?PTE0bUDV~Az7uPBw=7E~xYsU;JMxXaJdFn7EYP}AyAzkKO<0~+n!tedP{ zJ<6);S5ZT@P#plRGCw|FodSj^fnzM2k4#+?-3uc%Bx zfSh@xCDgArwd;*xh*eA*E<+5dU+(7WdjPcUB6VaaiUJ@i=lCkKucV4YGhy>m;QD>3 zJr#=3=X%!Z%~s2lX~>Ktrm9U{>X%ftJk*Cs=PP_bg$i$!0YeE0eGJjf{AxrI zYzZ(=CX?y2?1GE`QNG=xaA2>hU&9TPdhAW1mH=gX5EZFkZd#t(4N*PIe$$4;5T(lV zRjUsX`TNYLG+CL$M$DxPn6Tv?*OG;F1DSB5J4ij1A@xhjMwv7SJE7us8{{yIGNz5T zfgzE<_({mgQgyB)Bx>l{*lY>C5I}0P0Q?5vsAx|oL{Mj8LHjTKUYL? zHp8;*m3<5`6u;ZIROQyNc^5FDitlLwSYmQ-%f{79tbP>*U03l`5{=spiQI&!%@oCmhC*&8QNKd@%Dxh9 z3WnhZU-le!10WiEfD!o<9PC3&O085W(XJPOxzl=ZZ;JpE#WvO#KvlNYFJBP$wA3$2 zRc?FB-l8U72^ELfRBf-E1{k3)6HJSv$l8}{!tm91=(sAm-E;h;lBe6E3aYAKIm5+N z)bh2c$VM6UYv5rXF+tcd*P~4>dwo^P-PIF493StLX$T>RE1kmE9s6ld4}5IEISAs>G+i`a*81nl^~Sx#b!K5S}ZdVL3zT zP?OA4Wi(DA*}gk+i1k=4&7XjJzSe??xH=LnW6DK!BVHG)Du?P(`ht2@{gUTPIRgS_SDEH{W!bz0ghiTH>de*Q*8?y&tv5!{I)b>DJ<|vF%j<>7NoJsa z4N9;Mq6G`=oxuj{1k4{I z%FqT=RXNNII|22%s^%4n0w_Aj8aE#{U}7P+!Qq2RKwI5)Dh{zxFf6v~`npt3sw#&9 zt!JWsEz#i>ia(?&m^NY)9u`h)z}!ot4xnY0FVJXofZC$UIZvtt%#(-B7pclxDXRQ@ z`Rws!st@^Wyn_M_Y^gOb8!*vs_Ouo(y4y*vG{0;cD-AHhq`(#xt12e~5K6WwpM6)^ zd^yvGPd%>UObHc5kr-jBrl?WCL^x3!g4WlmIVq9TU>iQWRFyCra#%%Cj=3*HN<{{^ zuAmYZ<)BZZD#tKHW%B;(pV*#a#9$t1$suvg0s*2gsJ9~kr`wD^77P;##~p?oD(YE| z%UAXtW@XzehX8I6VcJkIlnI5@XMRlc$^kQBcG-qrd6QHvmsDk<;?iEe zc(#}g+!j?iG+zl-%U7nrd`V^35~>!2-6nQe)LvOie=T%;^{f{hpmy}~IWVIMBM&3= z*`(ZwE~|bKg^RrsX+P{(RXL^}C6zpQB~UBsa#;58Y7?99L~3A?xua;F65rkeU~cgP zXiu@xf(wq&sXL~y!9ts>F7+#vuk5O1sw$7qSBK)OMG;NjURj#ILBZjs;%|ZC)5?gd z2hA5HH;l|70P_$(05AE`bG}faFqLiRLT=O0X@%dAx5@?RZ?bt|n}6sIzK_@KD>$vo z*q|m+ze2VsA0yNt?0EGnltMX45VmXcl~|yrRF)?jF{Fb^%vq6**Pa)Q-iuzS#+DIcdo6c3dbggTd_YE7+XqaE0=dWw+W4D;^K){o_h(a36cy=E+)aLuUHpZ&`S~>(2Gj50 z=hm(7o3rB;>*B8P`>s3B?cfXEmv!s^bCPugf1ku6ZTWB6%ij;g?-q+NdI59Mn8(0kiS`L*7wnZn zY+~4=6og$So=qj3A(RBzV5h>`9F$~;sw#))OUnC4>zd!l#<>hKJNa4y@NUk=k=Fli zS?`fE!8Hb>{5_9gfZEBoYZjS0X#G!OX@r}6zsJCu|KGqOT3rU)0}QM=TRp`8v+meQ z5AyAi49wT^@BCVm0W%3~BA;y|rSgS(DS}<(lk5w*QJK69Th%J_WgRLChW` zhjiR48*j?S8B2bxP%HN#KEUkFaD!2S&Cq9`Dyx3QWTQwnCP%cD}3U4Uh``VN;~#HrP(!4?(c zJn0uqr~+cR>{{1zz;&$aS0%qZw!*vyVTb1{)a6jJA699vTofl7N{KBJV8t;lVVH0v z9TX0+#O`Y&WusK7kRq`O+g??rX;hmSM~HPKp1CTke)-hjqVO6$yvCV43FJaDYfNI= z2xX(VrmAUaUhq&K*@Ah6r+k+Hn1@e|)e5Sz+w?0`6jnD^IA6J_FUq8j`MUgIp<*pX2pRY5MJ|yfn$^lb1 z*f=9h1m@vu@KwcA>9aejX(LWmw&$ye5mrg5l*+J$szph~RF*~Xo9;#JXu*xKpFAN{ zy%uaPH&s$%h@l98D&?Yln@!3sS7taqZ(R@Ig$ntWi2?|Btyeh^@jZQfiy_9v;!?qji4=92*6k!8Y2BVJd= zgtClt6`G$;B+0Pn3+ni43)VVfFZWYH0pV%Wd6#h%6>Uf=FphzsIv1ttsj4i`m(RXi zwOwy0Upb$zf#=X7ov)x7$~9~F_MZEA?B2?+{pr+>EFYAAyQXf287lTl1q`vwge4K` zmoHCQH=B$zd-rP2j++Nwe?RzwV7=gp*z9skmB1(S!V8dLq2;#`x^k`THe$sML zK8K0~gu20st6p~^fUt`CCc~Uzhx$P-X0f zMe0{5eR7`aS5w8;Zz!fHN)vX<`bCutJIJ3-UmptwE`b7au8>D=UFs5R8 z*|@_HOZ3^LNH^KYVN}%U%h$4(N`j(Y8LFu2yvB(7%}|o&CE4f^pZy?ePg%E%X&6q_ z2*8vK@4mE3pZXQc5T(>EpNgyv+2ZC(YOm~Lh*j8OQD;LJFqO^w_lYmL!KZmiMB~_O zJd&2XX09z?rD5Z~75|idj!;9TqWj2{Fo1stR27Fb&{OXr&my*mKzHq2A zbpVQjuzhK;I$y!0On4bj;E3YMi_FmXv^Mkh50(wFL#spdSQq9(d%3d#n&^cF3l^H z+z{K0EiLi8R+wS7Mc^IZN5ig|-UNrdTG1rxSM27}AZ&k;4IhIqTZ&CmzuXkczUP2T zOR)JiwO97pdwm*M6*Cl(KXYgh0L*EydA!%tsT~D3Ae&_Dm+KT!!mbxkzXlO3Bxb_e zvblUw02H_-n%uKoR4qzM=~D?ixqKZ(Cox00W(}fnzo>ad0iaOuqiOlex#a@F_=y6| z>oBAD<&vxV6{mjHonP)#ztYG-I#**VRh2@$W#@`0zA&%E5St_?XX8<{{0+}?xsDm; z0V=Ncbr-|jP*pj&xyp2=EMq_Pon&=1`Dz0oN*yUfjIgS@90I{mn}jhwo2Yc^~~6uU=gE>7qJ6rBO0iASpmM*#kj`$VL}Xiehan737lid1r+HWF9OWa z#)|P)R$&`HAPjjab#skg=WYQw5=~wUz?Vy2)HF}$OTPY66adlWRpxCo6bYJE{x|yd z+>hGR88R1ih`gA>4xcgY7l64^QT-|#gdI}9LLnR4T=?!%CRYx3Wk35s~b4X>M(7D3Ss-| z!RC+Em97jY&oilAahH$-7Q0-Dn5)Bckhj^DPAgx?jWWaW4dZis)mc>8H!poEw(;tG z`OO+W^~(mvl&aSfm5N|f!NE0)%3jFofwSi^)Sf~cx!gcQ`(;vK)))iKL#irAsb5v1 z0LpBz7_)|C<5e~AroFPScX?CUJj$BAgxVFT4nZ~f&yoo#S}&`4 z_4p0i3Wh|}%P;qBu)e_NH4313uB158gu)#G${t>>+S{k%9#TY$ng03<%r4s|z`VC+ z<4!7(;bZ@En^dushHW|Qw!W^)HQ>i>)?oM9?vNZ}(|4XzDV~>T@AGjobpoeh+K^%o-RIMaY~HpH+6*x!#HKB59%~js>gTi&FtHA< z$;RcA(9=3L#DmG?p#qHV#$PPo)O~(@jThw#KbM1E&gj+{9M<@I?PkzA#`?cJ3}C>Z zvYY?jpwYNDfY{L%)3fc52N@jJY1q?fz@NR#+ORp`cB~Dxi{E?IVym|?NDXLMUo`i= z<&Sl(O}k=&S^oXj`15vH2gWKtm%q=db$wR&e>W`f=~|zg9|{A0&rNH=9Ld*U#k&66 zd>!!n-kXgtMgpe2;UurJ9UfKHv|-1G+6!Om9O_mwSJTG$e4U<+=kOkA_MTCRhavjXm5Iu?NWsDMPzKCh zExpdL@4uaf{l_N;%p&zG-=jrZnEY(rd5L*BIUBl7&9PheU;1_Nwi$xC|T7MqxXQhB4=s$KcC@xrsWwdL*ZPNhQ9DO0iwTEJXoxF$AF%aPoYRi2 zwpT9d8C6wPCh})_Np%|B$bc&Ifp}u{>3J-*t2nSLNP|S|r+ zhW;2AX5%T;&J2P@lfTc#Te5LS3)o>%q28j#c}an)OeBXwN#H1HYSTEJz@#3TjpxxY zS)#4-c1s;6@@IMZ5*rTBR~~3xhv0pXas)4{+A*6gZ_36$v#PSl%rK?#^vRH#T(t+0 z+cV17H;SkkMX>Sv@12cbCzD9hW`Viszbs$ah&Ck{OroAa_ z%1bG}$BfGCYq)cVYloiVe?TTkUB#H3URQ%QRT?mT6;VR{l@V5iGD;8Ed7HcB z6^K5|n`}1~2Vs|0mu-e9HEGk7%3?NeSJ3j=c%}J*=NGkTpOcLz>m@zBwmzMWk4)nL z>(OZ8S6?G3Dye=U_4(`HN|&;aOWiPX*>YTT_wRV#5i)+ffkmqmz|>XH#d28Hr__2okqt2 zIA2%F0gYE0Qrn@t$?URg9Y=kZ7-Cr_@7r7X0d`V0euzwAjU#kQ4hsU+k=e8D(Ue2& zm3^t-hlxV3fCWnZuqi_Qg5B(91w+38clmuFdW}JwmHge<6Bi#_H91N0Y((I`TFEfvhjn=GF65Gg77gK_O>d+be_ULjSlQ)n_oJl-$CiR&gP>JM*o}=s6C4B}=*w0STd7PPmdAyHm4%Tgu zbOlv82g8))zBUx8E+;e|>XbTb+HJo&zkVm(+tc|(*#U>c{E0Y9dk|Rb!vjrRdDirW=iIj z81XfYl1j0aRh3;JbDfeo5cVx_u0{Q7fWWDPQhbk7W*Ico;2M2(79TcEzyvk^9~upt zP^ni?E&b)$_|GYtKco;FH}fkdY$GPjM#?Rh(kh#xDo<0snN{%bPz^082qStg&8W6( z-GG@m$Pcv~0qol6XF7tDb<&C~F6c=%#3B{BtXEm;bT|+gVq0^|pGBs%#N!n#gYuPZ z{0&XFT;arkDXCi0=E8u-3U2;0bmD6lw3v8pHm;8ZLtAz33hH!Kc1R8w68W7eB;2+Q z3`2r;637YveZJq*OX3w^%e%@akc3hwi~5$^p*n4qBw*IauiyQcSw5FEdne{_MikDQ7-MD%m}?Zy za45UM?9GBx02x0Bj@Ldv^$0>I{+dii&km2u92z!- zV%^9{xev2S6aYR}mw2JTUXLL4PgYo4?*1sXRsoo+6#-F7p_Bqev9S>+rFrF(3!FTE zm5mE{(ew%!jjyZWfX3Ux`cm^$T@H7plp+9%OdGhS+YFXJP9`AzL8R5aVg=6RSCj1M zOgx8FBCKgib1Gz*9p{aTy5|+CU#?t3rXHgL=468Fj$Y#Dktx5Q2ot|e!yY%%LRj<$ zU(;fSZf?2#w+)y@npaV4mV7Rtah;QmpUcJ*vT+ZchG>Bbjy4>(^MMnp)$21Uxu&A% z{b2VcA9%oU(i~W{tN462zFp^fBDsJ8^D1W%NDNWg;iz=U--jr+?@)|sBcWj|tdu#F zck28JGR~c+vxcV^MY9Mdb=&|RDRpe$gnPkDp&88Ee=@MMB&>CYe&cX>!J z#|W!%yHwiMhkR<8PgPDl1R?ckS_6;f<%UT?9zmx4EgU|2HnSMSHCLmC$LB~B|}AYqy!(MOLbzi%x_UcOi;-T-al7$ppL(l zw4m@b1PKDyFw;cH#Z5dWnYRv&7VPa5fMFSSmmp?KnfJ+o9C5cagv_ByeQDC>swa ziMt(wFMdXzUu195El0Q(mNgZL`YwWYWfH(-t@wke_@SGy4A{W8eHB zA6$Ls@bj_5K8@N4`vPmUnPd}H<+|m8d>B27!E!HYeDO5oPqXofrhO>@=I%&!s|XO? zmH<-SLsSPxIkJ1|dYFkIF!})uo{wh62~Q)MMcqKAcl<6I&nqWdoE8qV5I8E4!ib#j zhw?$RM>VCX2{PJH82CWbzF5L1WC#!kf+{v3x#zO0ez}_q{e9lcn^uX_z^q$ivp`I8nFt zMq+_upT|yq4GxKu$prqN$sl<$ugR{0PD*+}VH%<}}EFM!G|%r=pJ`B7${Ut&P569|dMV|d*t4sz77#MwlBi&@~g6B!Us zB@=RWHW{bQaXi*Yz1;H_sNip;VR~;z&~jZs98fsZYicLiI$1dOxy9g# ztc%N8je?OLp-N~*buBOUqP+GlFZ3SC9V=ain0Pi$?yTC$sx?Zc-Hq26K=B*M6zV;K zfpZrFq^9RKM-a8~2V@d0Hfg-tkdzMVg6T|EoLLJN?9Yq7AEU}2MXCTeP zm2PJiisx@7?})G1y(t0Jp-A?_#jq$^VDc+CBXLYc!05+(o0g@9NE73_;=YUt z(*R7{^>4R(?OBh5fgqgaUb=3U5=grYd^;U5wZ$&D(XrTN{+t~~Vy`2W<&fXZ#`{_G zSQx1Sn2E4C?BG$iGPV?03Ki|^3Ye`H*O9X-uveAk6od~UQs$;b(=>Y?FqB$}b_F0T z$|v`A(gR>3-tTd`c2rbaB_AWxV&xi|LY(9*0CSDPJ(hi77<$|-)*$7VBY+)_funQ{ zsi-WyY%@rrxbn5MpgxQqt3qYVd)X(0-H|N^#{rGEfpq~Dj-M@EM=B~yFWBcW!9AUC z7gp@rh%P%!X}p|QY)gQc(*sVQ%gA^?Ra8`#R}iy{24pw zfK5)V0#RAOoTs3G?bQmHDk@7Q$nSp%nNn@IzgnPzOXb;o)rjUQ^G+kntKg`ps4Rz| zmca9}@gXwluf8xv03iG)o7UK1fZgEdwpf+#Q$xa#=FKp1K@g95kSV*0ipt^&n(e)k zjDu&>QmyS~dOjN^(E`L~&I&N4p!htK=t{o03YaP?i!1Pkzcw5HOr!mwmZ`OJEr98! zO4=;}a<#wXq2&<7XrT<)BXrHFs4S$wdHeEgyp@)`nO+fK+D)T6G+ubaeyr>H-=yIE zVaL3Qh81d5R8$s6;JE!oW|&Lgd9>#+K?w*G0W2v32;J96Ap)>%z^MDhY&=B)Q$=NA z1pD?A*?19|H0SL${Ad8?ZUNkiDpb4AyQz|PkqvSlvtNhzf&CKU2j5Gk?~00wO7rFQ zWbBonp%xVb?|E2V;sHa+)8+Ou_W`LS`QsPS0+xDGQE92b6aJ6X!p;eK-{nDoAxc0Q z1BPV;aaRa0I$hVIib`Vz**ovd#_y0R&Dd|-1pr_k;2)k$5fF>yAfHxf>AFMLrHV@9 z1b&A1WaD?KzW(&d3^ArQz-&TIN-)g-;adev6_w@)!0anzdhncI5-i>RUiodv8Qgfl zY|^A4#OO#}qbe$m5O}^nn2lc{6Dz&xJl}Ed+ih$Tfk8@UK3XJ}*=x{ufoTA#Rj27X zRZ*F{z)bgN*?1R&<-pSZ>~_YXb~bJWB9}=vq5{#P0wxLyBV*u6r16+4D)W>Zv+=TQ zyqUGWH4h+$)NmIV-L4ITMPims08ICU!UepDPc{Wi6_xo2RB)s?zKuo;X!ror4KwUJ ztWk=;URaqHV1`mCJ2cvp+I}r2=(=otgRWZ@m6-~dUgC9;7qi3GxseS-wMhHLn>U;D)dT$lex#+LKCZ2WdM9Q?M+-2KNf=&;~HO#JsIO`xxS+bpF_EoW}q)Yq=mB zKbMV9Ilm3n;J-N=e@dod+Y!2SR2EQBcNR{a_cN>P>m@1AFnbm|+!mPOCJh@A<+pu- zA=V}M%m>T?FyWnlF`3Y&ZQ(mz$!aGDxoAo=%fyn;+gwriDDRtLhdfEpMCFad<%_Nai5mpcmFt4vwSjr-~nQfaurC-84% za>227H%Og269HxuW2TUT^$eO_W3=CAH3cQBR`~N*`Ti;c<_cf04PJz34}2Merslt^ zG))j5^j1jl(KKlaGaWGXv+l$=Efa zqVLpwsxoImXb_y0aO(UGAMABjB7#1i(xju*$vidB5^$)yIV4`>(U{X&UCt+LND00odQqXTG>I8*d=vFnU5Z zewZ|NQ)M>N=Yt#T?^UcR?epv{qS1`JygsGW_>eqgMFL4_?<}RAG?~L^C6*~5ap=AM z7^<)TWj0Ql!gqm+@>ALP4>ER3Th*RaT{(gWvM0VT8}}q*|5Q<_8z?dUm9?ZVF{@0S zedRMRRoVM4nXr3$4QPpT$m;~mM3|(|NoG_3keo`!SpC2${O;f6_x}16Cm7D6M`q*O zNjqYy)GKg2p2utWGS-${Ev@Qa9(cgfWsghCBCD$8iDR$uQFC8`%Va zI)jKWeRejE*X5@YsRs8MBvJkRLK;>SN@_rH!l65?fb| zg`B;nQX^pQt#IN=whcSvCZT$Ib)3Me#~C%K$1fpcAire}*Vr{}beJ{6#`)-MJf9DR zHC>V_WWs|!z~jFeIJca=rR;D{Dmjrqu8J%WwBr$pW>ZKMz;byFfca8ZXKtM`D3S$; zu4$tym^D60#=H4?R@u=2?rGHAgaVc6$u_SC#0Gzmf$|_}fsDp6%vHzsAypunm*Bho z8kzL2svv?)oL?tXoh7Y!jqLkwtBtOsa#Kaq211Vzf^;&OA|PPb=jak$dO=v*`K)&1 z;JluOAwwz+1k5H2fal3%>^N2O%HcFZQH={pP7g~wpcsk*nAFZI^=NiY8HnRVwWbHL zx(>6+vASHBO1{7>5^DE{m`!f0nyr92sXTzy>9T!(V5@vCFUCVO>g~^&Vvokt!6v;X zZoHZuve6g7(#Pa;JLf$ZJQ2u`w9C^;okWW&UnUcw@lgiKFVc8)h>8N{M1o2{s0{t2 z692Qos{Gr@g!H%p^^>wg+m7poYz!j6ue}@KbFC>$1e>zRSScyuU+{PdY2hIfymbcP)VEDZEmwoFa6!WT! ztAObNM9Hh{+7LfOrm*jxi1$Xy7)rKXMRKoXcS!w}(-NoYEEmwg0?&VE=85VwXYzpp z^Tp%H*n2fZX*Sa5^@^%h@N%Q;>1X-=O>RF)|g1)@eLWbU@45S2;gmPT^ZPx{fB(OzsE<&66f)5QnwD8!4l!sz#lDCE@^fUufcDn_DDK`$ zNsiXAHL$dXgV65!Dy2}WL#hD8l7On5cuulO#CD{(0rR=d2Y~$N%$!y|?}NbacaW*v z(#HAgkX+-iOQR{7_aT#E1e@o>`L%obIx7nuHGM#(MqSoVF^hx-1AF>GDqqe_VuxuM}#vpkK z8SnO;43b;Uda{8~(zIMNR9$oBvnRSy9HgK)n~l370Hg$z?n&k{!)ZHH?oOr*|6{C0 z`4uvi%|Al*HhQWX5Z!~QQ{iBW1q9!r<$|SebLHOy;JC&ID!_A{uRVa`ELQ2^P(obj z$^5>%`F9OyH05@hs=i$~cb&oR06&J}x;HaJ1Q=e*fO#bY zl7Nt?d8x{+m!7pye3R0Y2}9-%3JO1t|Hj5ZaQX!^2FsAAGS41LXQX~jBMKn@zb)&! z=0!^`=ijhqnFdZ|;JF{G^Sc;e_p(}lCV#J846u9o{Z8P=bEdY3!7RUy_}}aJe~3Th z5MSRf@%?>lYuwMTJ;;m^fcbSM19{tq12h^!liPMzghQ zq9pml&V;ayALZ|jf*c>Ep+~$fFqA6HyQ;u+wc~7LPt%IXO zqh8z<2Fgvoe-uA=kpJGp&+TNO+{g2}i%mU;7^Lsu_dUd5w@t&i)V_0Y*^IEq?^OpF z+SlCYRqlI$FfDjLl?4FIMUj+MDH!9CTYet1imD7z@>EI&`Z|kk*bLBhel>~BPx3pZ zN;?~@0_SpV!Q7-CHt!x