From 2bfb5c5a9693590b2de8572c96937bf220052a62 Mon Sep 17 00:00:00 2001 From: Leo dev Date: Thu, 13 Mar 2025 21:10:20 +0100 Subject: [PATCH] ui --- .../saturnclient/menus/MainMenu.java | 30 ++++++++----- .../saturnclient/menus/SettingsMenu.java | 18 ++++---- .../org/saturnclient/ui/SaturnAnimation.java | 40 +++--------------- .../java/org/saturnclient/ui/SaturnUi.java | 15 ++++++- .../org/saturnclient/ui/SaturnWidget.java | 10 ++--- .../java/org/saturnclient/ui/Textures.java | 2 +- .../saturnclient/ui/animations/FadeIn.java | 20 +++++++++ .../org/saturnclient/ui/animations/Slide.java | 24 +++++++++++ .../saturnclient/ui/widgets/SaturnButton.java | 6 ++- .../{SaturnTexture.java => SaturnImage.java} | 4 +- .../ui/widgets/SaturnImageButton.java | 5 ++- .../saturnclient/ui/widgets/SaturnSprite.java | 22 ++++++++++ .../textures/gui/components/mod.png | Bin 3212 -> 874 bytes .../saturnclient/textures/logo/logo.png | Bin 0 -> 21142 bytes 14 files changed, 130 insertions(+), 66 deletions(-) create mode 100644 src/main/java/org/saturnclient/ui/animations/FadeIn.java create mode 100644 src/main/java/org/saturnclient/ui/animations/Slide.java rename src/main/java/org/saturnclient/ui/widgets/{SaturnTexture.java => SaturnImage.java} (86%) create mode 100644 src/main/java/org/saturnclient/ui/widgets/SaturnSprite.java create mode 100644 src/main/resources/assets/saturnclient/textures/logo/logo.png diff --git a/src/main/java/org/saturnclient/saturnclient/menus/MainMenu.java b/src/main/java/org/saturnclient/saturnclient/menus/MainMenu.java index cc7a144..b871b1e 100644 --- a/src/main/java/org/saturnclient/saturnclient/menus/MainMenu.java +++ b/src/main/java/org/saturnclient/saturnclient/menus/MainMenu.java @@ -1,11 +1,12 @@ package org.saturnclient.saturnclient.menus; -import org.saturnclient.ui.SaturnAnimation; import org.saturnclient.ui.SaturnUi; import org.saturnclient.ui.Textures; +import org.saturnclient.ui.animations.FadeIn; +import org.saturnclient.ui.animations.Slide; import org.saturnclient.ui.widgets.SaturnButton; import org.saturnclient.ui.widgets.SaturnImageButton; -import org.saturnclient.ui.widgets.SaturnTexture; +import org.saturnclient.ui.widgets.SaturnSprite; import net.minecraft.text.Text; @@ -22,9 +23,10 @@ public class MainMenu extends SaturnUi { draw( new SaturnButton("Settings", () -> { client.setScreen(new SettingsMenu()); - }).setX((width - buttonWidth) / 2).setY((height - buttonHeight) / 2).setWidth(buttonWidth) + }).setX((width - buttonWidth) / 2).setY((height - buttonHeight) / + 2).setWidth(buttonWidth) .setHeight(buttonHeight) - .setAnimation(SaturnAnimation.FADE_SLIDE.offset(15).speed(0.1f))); + .setAnimations(new FadeIn(3))); draw( new SaturnImageButton(Textures.EMOTE, 14, 14, @@ -35,7 +37,7 @@ public class MainMenu extends SaturnUi { .setY((height - buttonHeight) / 2) .setWidth(buttonHeight) .setHeight(buttonHeight) - .setAnimation(SaturnAnimation.FADE_SLIDE.offset(15).speed(0.1f))); + .setAnimations(new FadeIn(3))); draw( new SaturnImageButton(Textures.COSMETICS, 14, 14, @@ -46,16 +48,24 @@ public class MainMenu extends SaturnUi { .setY((height - buttonHeight) / 2) .setWidth(buttonHeight) .setHeight(buttonHeight) - .setAnimation(SaturnAnimation.FADE_SLIDE.offset(15).speed(0.1f))); + .setAnimations(new FadeIn(3))); - int logoSize = 40; + int logoSize = 49; draw( - new SaturnTexture(Textures.LOGO) + new SaturnSprite(Textures.LOGO_TEXT) .setX((width - logoSize) / 2) - .setY((height - logoSize) / 2 - logoSize - 10) + .setY((height - 8) / 2 - 23) + .setWidth(logoSize) + .setHeight(8) + .setAnimations(new FadeIn(3))); + + draw( + new SaturnSprite(Textures.LOGO) + .setX((width - logoSize) / 2) + .setY(height / 2 - logoSize - 24) .setWidth(logoSize) .setHeight(logoSize) - .setAnimation(SaturnAnimation.FADE_SLIDE)); + .setAnimations(new Slide(2, 14))); } } \ No newline at end of file diff --git a/src/main/java/org/saturnclient/saturnclient/menus/SettingsMenu.java b/src/main/java/org/saturnclient/saturnclient/menus/SettingsMenu.java index 51570f4..4bf8643 100644 --- a/src/main/java/org/saturnclient/saturnclient/menus/SettingsMenu.java +++ b/src/main/java/org/saturnclient/saturnclient/menus/SettingsMenu.java @@ -2,9 +2,9 @@ package org.saturnclient.saturnclient.menus; import org.saturnclient.ui.SaturnUi; import org.saturnclient.ui.Textures; +import org.saturnclient.ui.animations.FadeIn; import org.saturnclient.ui.widgets.SaturnClickableImage; -import org.saturnclient.ui.widgets.SaturnTexture; -import org.saturnclient.ui.SaturnAnimation; +import org.saturnclient.ui.widgets.SaturnImage; import net.minecraft.text.Text; @@ -20,22 +20,22 @@ public class SettingsMenu extends SaturnUi { int modsX = (width - rectWidth) / 2; int modsY = (height - rectHeight) / 2; - draw(new SaturnTexture(Textures.SETTINGS_BG) + draw(new SaturnImage(Textures.SETTINGS_BG) .setX(modsX) .setY(modsY) .setWidth(rectWidth) .setHeight(rectHeight) - .setAnimation(SaturnAnimation.FADE_SLIDE)); + .setAnimations(new FadeIn(1))); int tabsX = (width - 43) / 2; int tabsY = modsY - 17; - draw(new SaturnTexture(Textures.TABS) + draw(new SaturnImage(Textures.TABS) .setX(tabsX) .setY(tabsY) .setWidth(43) .setHeight(15) - .setAnimation(SaturnAnimation.FADE_SLIDE)); + .setAnimations(new FadeIn(1))); int tabSize = 9; tabsX = (width - tabSize) / 2; @@ -46,7 +46,7 @@ public class SettingsMenu extends SaturnUi { .setY(tabsY + 3) .setWidth(tabSize) .setHeight(tabSize) - .setAnimation(SaturnAnimation.FADE_SLIDE)); + .setAnimations(new FadeIn(1))); draw(new SaturnClickableImage(Textures.MODS_TAB, () -> { System.out.println("Pressed"); @@ -55,7 +55,7 @@ public class SettingsMenu extends SaturnUi { .setY(tabsY + 3) .setWidth(tabSize) .setHeight(tabSize) - .setAnimation(SaturnAnimation.FADE_SLIDE)); + .setAnimations(new FadeIn(1))); draw(new SaturnClickableImage(Textures.SEARCH, () -> { System.out.println("Pressed"); @@ -64,7 +64,7 @@ public class SettingsMenu extends SaturnUi { .setY(tabsY + 3) .setWidth(tabSize) .setHeight(tabSize) - .setAnimation(SaturnAnimation.FADE_SLIDE)); + .setAnimations(new FadeIn(1))); int modX = modsX + 15; int modY = modsY + 10; diff --git a/src/main/java/org/saturnclient/ui/SaturnAnimation.java b/src/main/java/org/saturnclient/ui/SaturnAnimation.java index a36cebf..c09d09b 100644 --- a/src/main/java/org/saturnclient/ui/SaturnAnimation.java +++ b/src/main/java/org/saturnclient/ui/SaturnAnimation.java @@ -1,41 +1,13 @@ package org.saturnclient.ui; -public enum SaturnAnimation { - FADE, - SLIDE, - FADE_SLIDE; +public class SaturnAnimation { + public int delay = 0; + public int lastTick = 0; - public int offset = 10; - public float speed = 0.05f; - - public void apply(SaturnWidget widget) { - switch (this) { - case FADE: - widget.alpha = Math.min(widget.alpha + speed, 1.0f); - break; - case SLIDE: - if (offset > 0) { - widget.y--; - offset--; - } - break; - case FADE_SLIDE: - widget.alpha = Math.min(widget.alpha + speed, 1.0f); - if (offset > 0) { - widget.y--; - offset--; - } - break; - } + public void init(SaturnWidget widget) { } - public SaturnAnimation offset(int offset) { - this.offset = offset; - return this; - } - - public SaturnAnimation speed(float speed) { - this.speed = speed; - return this; + public boolean run(SaturnWidget widget, int tick) { + return true; } } diff --git a/src/main/java/org/saturnclient/ui/SaturnUi.java b/src/main/java/org/saturnclient/ui/SaturnUi.java index 42ba492..8dfb7d6 100644 --- a/src/main/java/org/saturnclient/ui/SaturnUi.java +++ b/src/main/java/org/saturnclient/ui/SaturnUi.java @@ -11,6 +11,7 @@ import net.minecraft.text.Text; public class SaturnUi extends Screen { public List widgets = new ArrayList<>(); + private int tick = 0; public SaturnUi(Text title) { super(title); @@ -31,14 +32,24 @@ public class SaturnUi extends Screen { continue; } - if (widget.animation != null) { - widget.animation.apply(widget); + if (widget.animations != null) { + for (SaturnAnimation animation : widget.animations) { + if (animation != null && tick - animation.lastTick == animation.delay) { + if (animation.run(widget, tick)) { + animation = null; + } else { + animation.lastTick = tick; + } + } + } } boolean isMouseInside = widget.x < mouseX && widget.x + widget.width > mouseX && widget.y < mouseY && widget.y + widget.height > mouseY; widget.render(context, isMouseInside, mouseX, mouseY); } + + tick++; } @Override diff --git a/src/main/java/org/saturnclient/ui/SaturnWidget.java b/src/main/java/org/saturnclient/ui/SaturnWidget.java index 0aa7555..c4a21ab 100644 --- a/src/main/java/org/saturnclient/ui/SaturnWidget.java +++ b/src/main/java/org/saturnclient/ui/SaturnWidget.java @@ -8,7 +8,7 @@ public class SaturnWidget { public int width = 0; public int height = 0; public float alpha = 1.0f; - public SaturnAnimation animation = null; + public SaturnAnimation[] animations = null; public boolean visible = true; public void render(DrawContext context, boolean hovering, int mouseX, int mouseY) { @@ -48,10 +48,10 @@ public class SaturnWidget { return this; } - public SaturnWidget setAnimation(SaturnAnimation animation) { - this.animation = animation; - if (this.animation == SaturnAnimation.FADE || this.animation == SaturnAnimation.FADE_SLIDE) { - this.alpha = 0.0f; + public SaturnWidget setAnimations(SaturnAnimation... animations) { + this.animations = animations; + for (SaturnAnimation anim : this.animations) { + anim.init(this); } return this; } diff --git a/src/main/java/org/saturnclient/ui/Textures.java b/src/main/java/org/saturnclient/ui/Textures.java index a0b489e..db7f218 100644 --- a/src/main/java/org/saturnclient/ui/Textures.java +++ b/src/main/java/org/saturnclient/ui/Textures.java @@ -11,7 +11,7 @@ public class Textures { public static final Identifier MODS_TAB = Identifier.of("saturnclient", "textures/gui/components/mods_tab.png"); public static final Identifier SETTINGS_TAB = Identifier.of("saturnclient", "textures/gui/components/settings_tab.png"); - public static final Identifier LOGO = Identifier.of("saturnclient", "icon.png"); + public static final Identifier LOGO = Identifier.of("saturnclient", "textures/logo/logo.png"); public static final Identifier LOGO_TEXT = Identifier.of("saturnclient", "textures/logo/text.png"); // Widgets diff --git a/src/main/java/org/saturnclient/ui/animations/FadeIn.java b/src/main/java/org/saturnclient/ui/animations/FadeIn.java new file mode 100644 index 0000000..a7c0b62 --- /dev/null +++ b/src/main/java/org/saturnclient/ui/animations/FadeIn.java @@ -0,0 +1,20 @@ +package org.saturnclient.ui.animations; + +import org.saturnclient.ui.SaturnAnimation; +import org.saturnclient.ui.SaturnWidget; + +public class FadeIn extends SaturnAnimation { + public FadeIn(int delay) { + this.delay = delay; + } + + public void init(SaturnWidget widget) { + widget.alpha = 0.0f; + } + + public boolean run(SaturnWidget widget, int tick) { + widget.alpha += 0.05f; + + return widget.alpha > 0.9f; + } +} diff --git a/src/main/java/org/saturnclient/ui/animations/Slide.java b/src/main/java/org/saturnclient/ui/animations/Slide.java new file mode 100644 index 0000000..ceb6b85 --- /dev/null +++ b/src/main/java/org/saturnclient/ui/animations/Slide.java @@ -0,0 +1,24 @@ +package org.saturnclient.ui.animations; + +import org.saturnclient.ui.SaturnAnimation; +import org.saturnclient.ui.SaturnWidget; + +public class Slide extends SaturnAnimation { + private int offset; + + public Slide(int delay, int offset) { + this.delay = delay; + this.offset = offset; + } + + public void init(SaturnWidget widget) { + widget.y += offset; + } + + public boolean run(SaturnWidget widget, int tick) { + widget.y--; + offset--; + + return offset == 0; + } +} diff --git a/src/main/java/org/saturnclient/ui/widgets/SaturnButton.java b/src/main/java/org/saturnclient/ui/widgets/SaturnButton.java index 5cdca22..5b28a39 100644 --- a/src/main/java/org/saturnclient/ui/widgets/SaturnButton.java +++ b/src/main/java/org/saturnclient/ui/widgets/SaturnButton.java @@ -33,6 +33,8 @@ public class SaturnButton extends SaturnWidget { public void render(DrawContext context, boolean hovering, int mouseX, int mouseY) { MinecraftClient minecraftClient = MinecraftClient.getInstance(); + int hoverColor = ((int) (alpha * 255) << 24) | (SaturnClient.COLOR & 0x00FFFFFF); + if (background) { RenderSystem.setShaderTexture(0, Textures.BUTTON); RenderSystem.texParameter(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR_MIPMAP_LINEAR); @@ -42,7 +44,7 @@ public class SaturnButton extends SaturnWidget { if (hovering) { context.drawGuiTexture(RenderLayer::getGuiTextured, Textures.BUTTON_BORDER, this.x, - this.y, this.width, this.height, SaturnClient.COLOR); + this.y, this.width, this.height, hoverColor); } } @@ -50,7 +52,7 @@ public class SaturnButton extends SaturnWidget { context.drawText(minecraftClient.textRenderer, this.text, this.x + ((this.width - minecraftClient.textRenderer.getWidth(this.text)) / 2), this.y + ((this.height - minecraftClient.textRenderer.fontHeight + 1) / 2), - hovering ? SaturnClient.COLOR : i | MathHelper.ceil(this.alpha * 255.0F) << 24, false); + hovering ? hoverColor : i | MathHelper.ceil(this.alpha * 255.0F) << 24, false); } @Override diff --git a/src/main/java/org/saturnclient/ui/widgets/SaturnTexture.java b/src/main/java/org/saturnclient/ui/widgets/SaturnImage.java similarity index 86% rename from src/main/java/org/saturnclient/ui/widgets/SaturnTexture.java rename to src/main/java/org/saturnclient/ui/widgets/SaturnImage.java index 68fcaaa..1a2a660 100644 --- a/src/main/java/org/saturnclient/ui/widgets/SaturnTexture.java +++ b/src/main/java/org/saturnclient/ui/widgets/SaturnImage.java @@ -7,10 +7,10 @@ import net.minecraft.client.render.RenderLayer; import net.minecraft.util.Identifier; import net.minecraft.util.math.ColorHelper; -public class SaturnTexture extends SaturnWidget { +public class SaturnImage extends SaturnWidget { private final Identifier sprite; - public SaturnTexture(Identifier sprite) { + public SaturnImage(Identifier sprite) { this.sprite = sprite; } diff --git a/src/main/java/org/saturnclient/ui/widgets/SaturnImageButton.java b/src/main/java/org/saturnclient/ui/widgets/SaturnImageButton.java index e056066..d10f2b1 100644 --- a/src/main/java/org/saturnclient/ui/widgets/SaturnImageButton.java +++ b/src/main/java/org/saturnclient/ui/widgets/SaturnImageButton.java @@ -31,9 +31,12 @@ public class SaturnImageButton extends SaturnButton { @Override public void render(DrawContext context, boolean hovering, int mouseX, int mouseY) { super.render(context, hovering, mouseX, mouseY); + + int hoverColor = ((int) (alpha * 255) << 24) | (SaturnClient.COLOR & 0x00FFFFFF); + context.drawTexture(RenderLayer::getGuiTextured, sprite, x + (width - imageWidth) / 2, y + (height - imageHeight) / 2, 0, 0, imageWidth, imageHeight, imageWidth, - imageHeight, hovering ? SaturnClient.COLOR : ColorHelper.getWhite(alpha)); + imageHeight, hovering ? hoverColor : ColorHelper.getWhite(alpha)); } @Override diff --git a/src/main/java/org/saturnclient/ui/widgets/SaturnSprite.java b/src/main/java/org/saturnclient/ui/widgets/SaturnSprite.java new file mode 100644 index 0000000..bc3f7fa --- /dev/null +++ b/src/main/java/org/saturnclient/ui/widgets/SaturnSprite.java @@ -0,0 +1,22 @@ +package org.saturnclient.ui.widgets; + +import org.saturnclient.ui.SaturnWidget; + +import net.minecraft.client.gui.DrawContext; +import net.minecraft.client.render.RenderLayer; +import net.minecraft.util.Identifier; +import net.minecraft.util.math.ColorHelper; + +public class SaturnSprite extends SaturnWidget { + private final Identifier sprite; + + public SaturnSprite(Identifier sprite) { + this.sprite = sprite; + } + + @Override + public void render(DrawContext context, boolean hovering, int mouseX, int mouseY) { + context.drawTexture(RenderLayer::getGuiTextured, sprite, x, y, 0, 0, width, height, width, + height, ColorHelper.getWhite(alpha)); + } +} diff --git a/src/main/resources/assets/saturnclient/textures/gui/components/mod.png b/src/main/resources/assets/saturnclient/textures/gui/components/mod.png index 5301eee2dd917cb2978919873ce6e89adf86b985..3eb5c44d2d183f199fb2846b086ceb5c056018fe 100644 GIT binary patch delta 802 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 diff --git a/src/main/resources/assets/saturnclient/textures/logo/logo.png b/src/main/resources/assets/saturnclient/textures/logo/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..cff808539766025a9c9f04202e7a27a06c40c1d0 GIT binary patch literal 21142 zcma%ig;!MH_cq-zbjJ{a(%s!5NO$)KDd}z)8lqu@Ddta8;D$wGj{yQ~!NqpaDM#8x))c{=;-vHu6M3 zz$W_ljfn6mpB(rhqNlc!EJDK^^>5$-ii6Bs83csp6zoSUR0ITVHWhgpT|dOX1(-n@ zi`_5t>Vhq?QJ|55vWPkY5P`y&v)R$N_`iQcoZI``XI_@f*VorcPye>Jch=XN)nyyk z)?ZV)CB)NXP}<@0`~h_^Nz2O0Do+luT)arQ&55a7XQ|k~;yax^eYorEOP^BDxhe3R zI~AYtPu7kC$zp*2Z~w@~{ax>z_Y$TyU<00G%PlQF5V05SeZ0i{8h8w);WX_6p~L;K zm4Z!7)_E0xm+eB1+Eb+VrlFw`771yx|3cZz0KC;bas)y0o(c!;2>Sm1zEgZE`22i^ zD@9hUlvz!=DKc3S6Xr3kn{s`9{VM;&APR?|ttbU1T#%PX6;9_84X`&&o&Ct}>*GsH_x1zR+Pn8*IM?sv8!X!Ew zpJF#VFHxs3eDzVrQ_0)=N?8FC7$m|V`zfhaLd4w^)!_A>Q&OV^j*}DhHB9Ux1Hx9vB zH?&MVT#r~RPXs~4aHki-SX=k8H-sN|dNrYNj<#yXf@~^%2MZ#CC&FCFBxM=1#Pt3< zbqu)BVa|0+OUuHSFJC(M;GTzVEFNCMK?qSl88qCimhMO%L%$b=-2Y}(h@kWc7ZeaM z!^igF7KR8J6o=s$vt%JT3Q(+hh*fp%9rMuJT$B!RvvIMdbvHvS( zFOr^PY|M{RpD{d$4C`)=;$mx^@=_wR*eLkl^CQmQT^wM$2jJ5TG-gxF6?-KB1u-%* zvNc{U?`>i9Y?Jq8sTu=3tPmXhRG&kme`yu|s7k=A{M9w&{rJ+_+8XC>Mh)TP-hBb3B6x& zuc@s3^|M;1>fGAKhHc>Kuba^2?WxQClVmg!aM`q}|6p=B=)JD)k69=bYS-T0ZeVL` zJ3HPu?(O3?^R+M}a=9?tlMs)#`uoYoSarsR!?*%7m25 zJP3J1ONZwnMKJV~*Abn#DQI?nvBzd2`QXEc4#~I;ErEmbroqNFV>u)bS;VgHEYWk_JA=On0hFX7UJoc zan^%P7>Pl$%G}?-Fze~-lO`Z~5ztCDdHwz-#>mLXOf|hYf?-e1!NGxt^6(e3*GEi7 zcH^{P0(mD5>_2F%HASAFi>juE#sFE?xRk~xekX7ggE2c!C|ci>ijtC&n6=1<-R>^@ zWmbF`!~foAhd5Edd1-}=!`SO;BpUmLfONbcBVs=Fz}wQu8j1R5XE7o*N=_MX$A|r$ zS(b7vLsTkg=+_5`W7O$pukS*MTx_9>vvaMxBe$}TsIo=dl$87L`sEw1ufNDMb3oQ4 zJ@s~}s6hwwMHUe|H=|BYPINRp*7C9tC~sfP@41M>5X7amBHe7UnZND-yCC{KQN^jK z)q%j96C9MV!4Hdi2EjOy7UG3OHyOw&fdhqIh$m)M<@bf+{=B>KYz?0cA|cUd_C&Hs zX|Ag}bU|ms)KK05EVVtNg@px`91%7Saws-re`#gqRxv2(aq~ZrK5%1D*haP0ll?MX zSEU;VpYK;LFE7z~*q%QUgEM3_)Ir9STj-sOO|o$Tk zY^@+?WMo8y)*N7F0P(|L?ownqxxv7(rYjP1+p=L)O3r8G;*Lh%F5z?3=u3da<}X+* z?OfV*ZdYMo1_jjXFd=D~nH7ZXZ1X2_@m0Rf6Rd4-znYGTiShVerAe1ie5Bl`{-$JF ze(I2(7R5-x)Y#((2`OpeL^mBArSkcxMNN8zk zt-~oaHv^9AE2fj2aS(g#v}nY9*efb3_VYkVu{Jg~I#)L=gEo|zq1>;WG{xc2#qEc! zn`Bm5_6QvEO~w0qlg>)lPa&^0}s9T)#Xk6~k^Vs{sRu)A^_WtYYzaHIw zp=@v({UWq&x^w=`(!+ns8{$sh05VMd{rdImm-ymasbOBV;&y_rp>LrC@T&Rl3u7z{ z3XLAS)xPUBXQE2=-1BCSz42hm$Qf~Q5>8j}T`>2<;M?VF{}^Tcd~yE|!A?%U6EHC` zdwF?z*DlrSSzpba3iI*t;WU?+{F*Cx7zHrb`O0^F%F=HKcKBi8WVCs*VEICgX`phQ zz6*e~=Ci<1D_{>7(MSZe{a|fT(HO)jFEK4u_BCzR`0wK4VmmzN(f;B3@A}R;&&~U@ z-%I7R-#9v&?Pjv%gC@3R{~V-2Ads|xFKG3+$L@G89uZ<(AK5pg2wNTdN3HKmL zkN>Tyu6`{UaC!LhbAP}7>09=IZi5By=N<)fsFU82?h$$xm&LOLRB(0*u^!i%F#)T4 zwg?AbbY`5K8yF;E06-6{e*OCH6>{-hOBxQ9z5IJ$RQN z7eMuwqNTQ@qho}KMI-3usJ3zL$KZuRetDi=Zb5+ra>HcNu%0)|IK|$}cQodSk2@uL zZ}?edgXDAM=H-1)HbijwU`fAbQ6o)yBl#9~i@)17CLAH7;{_eu9Td@(4ASvMFA?>O zaV|BO_0|jwJU2Z$w7rQeR8_$FD1w=j0NwKus2L z7mH`eKyyyBmUMU*jC(F72vven1z!L0Z|d&8i+EH5;c?z#<7#xT8%Fp` z3rs77QMrd;E9K8UTD>hDwwbdR^F7^?@So0jJwIyZU4}BYt7`S7bZDsLSZT_4G354a z_eD75@s_BkGEHpQr|Lni`b3^S`7319)YhtHa!`41mJc3Ri6nf$w`n2}LbGqt6up#2s*N16 z!WAuWGQm@VXK|Rg{@AYNdF@`W=?%c35rBz#Kcf@fQfFspL$&0qfjLs?OJ0QJg0_xM zdflY7FnU&BU!NE^V|5x_-o72rS_G=iU$4;ilK&5kaxE^gx%!%l>+0TjhS1cjTDL_4 zxLoh$+k~-%TakFH1T-82(<5AkS4>PnB=av-SeqZ#o_5(od@m0dc=+sR{n!{7tR-iS zlz^$JDj1UI2zs%0C1&a#_3}o3S7mY{waFoF=kW)97&Z7A&8RD9KMV;skB5YCK zxOEYLOqK1UV;d4_w=$di1bTWcB6v=GY!cyI#!esR2MY=c5~FE+-&{`49hVv(8_V1q zNQzyFuOO|%BmrjB&owooeot4+7L>Dr>{5=_XAcC){3z&dBS!l931o`7y+v1k{>$kF z+Vv~?al;o?IpLb)d)=_=bF) z?IGBni~wy6guXm`L8gRuMW4T8M<{QQueq3}DQO|S1YZEbDqAawQbVs<_; zhvm~<6F~FTJSswOAGK?G(+CEEl1@vt#KEn^x&CEo%0pecs8Slo{~+{fWo3n=MH5|= z7I~kkn4sBxsx;$m>!+_VnzjxOZeu%xWu>JIWboej)mDejH(Y1E+fS}14w4tSRbVEe zLz265FIG$y2RS)8fd(msqq5!Nu$)O_5Qb7NyUWmQATs5C!F1?@GCtY(l?nk=A%V1D zXzw*KKH<=$ye2zN9%<6Aj~_pdy36&W)mpKI_&V-SXMW*q6zWGW3?O(<&hGLntlMF} z(0|#~^9yYvg;tBKlx`hC^8i48ilA2^O1R7w-GS7Y z{N;Gr4cyyk*ftg#8gt7pj|Wm!H;xm}Z`f=<1Ea1{U0LAk$6^Ieg5`(G0JuP~?GGg>T$Uh9|{-pqK9@onoYGyC2t34HgcrPq&MHls%!T4)UWdV3TnM zX@&kO-Xt0$o&+#=PM3Bgv;nb6GG-mC)I%aDcO7~@B%+%jNBF|n>Ko^vY?Pne)6?^$ zluUgm5wV@?yB+LX5R&BiU`pZ_Wo4Q{9f;{N1iB{Lv?k|d-{y6CD z!C>~BMlC;8AhAF6TGk@W_B_pjyC`9X_xfw5;jPieDUNi0>iR0k#|f zm8LNVX6lGT2E$Ft`2bi$#@DQEkeT}CA)H%KO)n1<8yg#2C3>YUT;BIiJ`>5BBT@U$ z>gp<=wYBxN>X0}CLj+9bQNv(%gVV?$om=^@f!R{5-2_=zQ>otB0(c4iRZ)>n&urQ` z2n*uP&CATo$EWkJM-#$!zpm;>p^<7H-9aWMreV# z>v=8Hz}#Qke@e7G%n*5RCdMynGxX)j!44n4KLs72X_UJR3^~8IOy9jb6MJMYYucAD z2Lz4q_u6FaUOp}nOdd7pnPf8}9tbUHiq)vI^jKdJDod?Q)+D4O=-R&fw0%EQ%jOIg z5D_tof*LlKvm=e0=THfQg4K+1u6+KW!%XMC~ zbzPi}8Sjtr6$=e)-nVB~tLRf~PQ4N(VJNQ@o4Y@M{*0`BsjmJ`0pi^}gNKY!$)zCv z(?ZX(@`f_KgTtgFXl&nsjZs1GFM!fP*1IFoE!ef14Y8bcL!*=W0I~Nc;VVhmYu36| zC$J7q%-DK*xS5|Qe&wBm~zwa_KGD5W_H3}-jQ1E_P508RUL`3`XT=D?{H=3Rg?Zpap>4r|h!Btn~SqnaFuejjF4wLpKM4AC&jE zKb|T|si~^ox3_fpO$xTd+CSIV_p31WOTgGn8zKDog~>LvKluJ*8=Ud|WD-T11h(5hFV%*xU)?m5|R8p}8wIj4)s#XPoQqa6Cuvw=K_Pxv9Hf&DW2 zxU8(qmv!4lD&W%b_D8i26$1mqAJPuVM4qy)uG>jy98sfw$Y-BfipEfGd+CW}8k4A< z%`b=Ivpo!8KsHI1>8mU{uOML<-k$@ciGI8psg3CbwEaS`&(YA6N!_KjvcN2G`H^7K zR{JjjW*wDwCGvzv%4z0?u-AZqxvgc^>S&Sp_S@;2W|3sD$@}+zTqGYugOZ62Np>?a z4*^N?Q-=9`X$%F{Aq+JUr;dP8Q9L=Gfou+;kA-)N1%_KrnIl`QAv0LWi&=0 z%8wwg{OTXsKtg^p+?U8s^x`-A{NyG)AG;5(&}A3#cXf77|I+=_`jPa;JsOF3w%8_7 z{q5UebtKF9o1#=#hyrKtp;hr?>k%PH^8uo@8*ngJz(D;{!8gDz;+bxy!tBh>!s4Ky zt^M)O*cg;Xyyy^Xmm>*3)YC!e-$Tb9>?WHh&AEg)QZxa zuHzRF*vv~yvs&uLV!aVUh2AKGxY&7l&yPhf;z2Mpdk-y?!O+SgO2za5wRH~4WJbVsWN8Ig;~9?* zrj5w$&JZ%{u$jPXoh&6V`f z!z*IJKPS`ht2q&WhxsL{YHCVFgfF)^OW109V%W%gdS3K`q>b3@Dc~ShdP&$ux95ci zC5s9ZaMO9n9hq}n4X-dhPYhRhoAYL|_i@OwNQU|WoF~M~>+;K+upShg8+dpOxyrnDPIyk~V0n>r`nS%Nkn z$nDmxTrEb@SiRp9gQ0B7m4v1eR1V-auCTzYK+c1$Y~lpHGchI3u@ZAqyeG zytT2W0A{6*%lqTT>@O`$VK%Fj{$7oK6qrX=F&>C6Oh)i$LRo$gz7Z?AzJW*0WC84 zaui=`gseXP1nDJAQh0{Hd+eh;0Pu=sL|4wgyze(w1GeTFyf*qbO|Q_YNF1A}z_ zm=l9SRBG{9lQ=zX2hcp@0DjLvE2C%R%L-g$DzNV-to3>St=U&=rimdJW@{eBgjhpb zu*Ge1Sz&Ck7Bf&Iifn+R#*l!br>2&G%*i&@!EOLP>G%+h1Oo%M1ku-_Lo6ny+tiw# zmXW@Fx6p@mR)~@^`fOk%+k%7x>83#x3Yop$CNTYE0Z_~Gq*HXS+g|DygpnLX`{87x z8xA<&{9Zm_J@4afK(tG{*$Qlg#3p7Er_jEW7PtNVtsTm%dcdv8(!j^d)Cu5Qb0E?b8$OH1=LncK)na@bA^KVFIMD-s;U-$e|7QdX5& zf>KGTUl%SaR1WBugg_xrw;fB&;>!wG{>B84jpDM>7g}NCGCNs0u9u zWED7%&A9mI9;n=s-#c+MOoP%uX=i6PzzW4i94#YSBUswlc(ep`QO|e<0to=o5P>cK z;U#BOO?ihg&|jFI)(0~21+eZ;-(=a`kOT8)aY+eSoj?|e#)grVAf-R>hVvVY01zE% z<*=d1e|*I1@nwaYE@C~56uC1#hzjTI^)*7?S!vfhLbA-*NHLv%UA(}!gWnS9FW%H0WLvU zH5TbzA473}A_28;)nk*LY_iI-c5`xCC844UEI2wZcTb9?D@KKZ0kSrx?GOus1$qf= zo&i-T^&g!3c!7uN8~(oyzTV*yO*q6DbxW)Sc>Gljl@IS!Rj0}Hvi;oY@TFuC;i+ki zN`*R6Ad7FS3xI4e@bq&kJpq{WmuqIkFbMzs1qkK*90=>MOiq8GVRu{U_B`k^YPAn8 z=5#P#I6vbf2H_9Seg-~&UovnvKj~Y!n-v5-!Y7n^(wxTZFh_BKium;DQ_W7gi+&WS z5p1XOUeH7sx_9bs^hMk3q-Kk^K9OD&Iv%o@B=jM&(<%n2{Hv=gT%h{fTPU-D4vYs; zs>)!N>Dx0oG@%>yv;wN+cRhV+SBt0*&=yfn@Ad*u`zO36|M%2dgT@%L+C2<=HK2JD zv;-Ej&$VY~WtqqNO>kw9VqWd~#S)-T&CQv21IGOyfCQMu~XU{5`~prT>cKS8@0$^3mE{-pBN-1jYuJ?$mr_m=*P;* zc~VrtnZgi-^Xa-Fvhc1fh&F`M$hT3=i=rdoEN<`^t8^MZ37hEcriclda%zcj?ue>s3@@kZSyVDWx%7@HMA(Gi3QqrYlMx^_)WWel|Cm0+uYJCvK?f?Qor;BZE z`~)e2{MG=rMan^?VKf|o>tArv601}+3}n*IojnG~Nk~ZW)hcwP8qW+PPEKFL$XMx5 ztiH$A#RrEDN1)P?4c5p`#4GQjwv8G8SHGBFXy2(s?h)K^~qlK?Wy8Rt8s z_vi38rzD^=3o1M!Im{#5#K-;#>LAmfkmV`*-N9h{PMJskpAF-uqoea`V-Wvy17_VW z;R)RMAPTn>E_B)XU~FtGY8ial@$Q{|E!|?{fpwi#45{)9`OU<_n2L@#addX-Fn#lf zGIEBx=y_*2i09D7qZl4!Z(oV=1(N{(vcF>siu|;o1*8MJ{#&e}RDhphQ)4`g=PV$I zkd-ti%h{09ahy_sPrfG)5aF?v`~~>C=Py7_)4uBeTL*sxsCXs2dEYJTy*YoB5__V# z+1O!9$Hl??U@c^O$8tr?+TUvcK2F6WoL!8}R6>y8*R+HOc4eT5|7eQ@o?Hj)zaXgC z+7AR+xaFM$#J4W;cp8zb87h8HQ#L(4E%*i|#7a*$4ob0jgpn=yZh9Mth|1*K1{Z^Y z5y1oBp>Gcm@8&BiD-CUrOPq2sMOx9v z#yE@T^K7ne2>K}z_+)qE5wqd5SexIZeEYoL#CJ_8j$;u#0Jg3P3N{@Zgijx&e*bA( zTwX4U()08vUMAd@!T!lRew_mhYHB^dEA!^ckmXCjdCcXQU}SnYmWRl&onCwJ!?g&T zeqHK0!&6V4Wl5r%hK6L!%{cz6Uah52Vq)UDWhvgU6Bbr_vm7?F2}>lexh>SONRUw4 zlNf-qBOW362YG-__W4GCe!6?049LS30@{%G$F~(M&XJTU0J*o&hBmr~{Ybh4Vjni{ zoP-w?%6kX>U|UOS285PSB@Yky;Lrz)YO{fUmuK6a$~6K;fBTUr%wyYA{HaRq$V0dD z7pqbOT(Tvw!cC?H=2f1XA#GAp(jI_*2@5$DjPL%fEuTWC2p5;zLcWOSx$ZV6+o(bx zAhUnYWHUIS;<1M6i7NPhH3u2#Xaka|5L8{V0b+ro-2{MB>{A|74`A1_m?A7C#KpXE?gTqsHfP>BLnKdkQ8f zg~6CMsw+vZaRH;Twl^c8GB7Y0l86@VB?@Iq|fxzGd104oGl`Ovz6F}lN*6^aFd{S z{CL1;!b#M^&@$C`mwV!uka*(pUbS0X+H0R9-W-j^--dKelG50cWoJ&9(Cv6CyY%#Q zZihUWDctBugWg0|X%+sg$Tp{p>rz6cv?~8r0U`#Mb3u=poc_|p;?eZzCn#CeP8YzF zf!Xbe5|)OFz1^@!V@}~0ClYxGt`DWgt+@mxr2Bei6RshV6u7K%l)$%&2bYDif zNI8pG!wQsYlLJr57jiT2=*hQR%$u1`%giKM-Pj0XfBpJ5!KyG8>3~zUUt$g|3{eb7 zPH>U1gdoZ_g%ZT%KKyB&9}jxIC~A~PrXD_Lin>g&HHw>=MpJ{aOifK~>v87QT%89n zHsqwI^Syj>ZkP(+k-xQ`r=HsS&(Tph((+Naf+afsw!ktuoE*k#&!sWu7)FdQdoNRm zW=KnT;^@4qWm+j4) z=P3GTGUC>MubY>ahieMmYl6hSmpjIXAO4vZ$-wpA3J<+iGZtStQyHQU|KI^Hby=bn zcDIZtO$l$Q6V)h^d=h5Qi1d5Ga9Mp&7cZw%Iin80qpO)oAW{hfsUyMiX-ahZ@ZmXS zk^aw3;yAt(L8D}a{=aff;6~;n?2UT-3IwoFYF=(Njv63|wah)NYTRTwY~{> z4{Q0jX7JCY4*xOo!Dd-HC5?CoV71h*ManVY;Bodtzyi%p=3JwGmN7-L4(9*)>(?~w z_2}D`uV2p+Z9jrw4r^Xwf222H8k@fNZ@8>EaWXDf$NV&FGoC$gbhbZ!d;K9Mj9r(B z9+MOsI;okBs^01_KR`!Q{`T(ms5%zk^em43^ADhB-cgUU*8_1ZF+yxDx-G`=RI8FQ zH4)qIRY9-$B7E*EkHp@c%(g^OT`vPfV1p6fSMvVxC*n2mfSO9kbwhFtg&fA1NQlWj zMki3I$Q$v1iJ38T_pgmzI<)o{@&pD(>tn!?tzF2yrN1iDExWX6-h2lP6-NyDe`4~Q zb4efmDcwnkomWO>WhE6creR%SG&5`gu!uWFf#HWlg&A5mO~->@rd>^($Hu|&#A>hJ zV&FO7Pw@T_zs!B0_-Q_0i=fEnq!$s~)dnP1D%7&rMXK)`ijQY4#r@BJ7GTsgX5+Ai z+VUK=oZj7rIvmZb%}5|Lw}g=+djVmP@y}XilBpD=&{3|)mQ@uXNc{rXX4mMd*d{62 z6u)B+$zKvKkbmIAY^Z@Ce)8m`a^TyyUz`C(OgC!zzNaW)o#(3`Z8|kzR_||XYipk@ z22T@b?mq089ZQx+ZbW%zF(4-BDe>4`d;-uW5RLL49kzaz?T64T&Sd5rNs6D#(SCI< zTK23D%z@bo;!t^ms9Utv|CZ3;hr-@RKk8LfRBqPF@p?FYR%VWq{?r1v;y^h^0+jsC zbh+|PwN;U=DxwmU@1o7my;7kseu3aC4x|drZ4o?@dGHXlWSRYGMBt==&zt*4?<(I5(KVqAb zcXV{*mI%0APK!73ABNqH{;o7LJ_D2Mdd$RyLeN>rAQber+--SzIW#pjwaJj@n&8av zt#l$9s;`#h>>sDKs^e_Ll|S#vI8Af@=OS!0g8pmBcrl>XyuYASb`SHh%^;M?6GvBL zusQlsy^Z%%2cY-ZJp13@!8;VdcUg=nwK5X-&IRg7e z+sbNJ{WVvqDN5;t^B0nRnpk|g!uSwf5;C$*dHmr6b69fpq928ms@zqwbq^+hVaaBf8k$-Oc}cO ztwL=(d(dSLit$?}R-@6I{{1zUhJ8@6RPCsv2`Vb;3+pM>90MeBSbhD=)KqQ_XJZr# zlrf)=X*Pe_`-wHQA(#8;>+t5K(9>O?6Dma{LS3D*Llqsi9=@2K33RM4@Y0!oS#iaU=^%LCGNa>X_M1ZQ&V(+cRuOhybnZQ&NF zcpE={=*A7%)SQR7_GrP%flQbxz!*wc^>S|8lt0@**P#}uwKqw?5u68LIB;Qd|GZ_8 zF819M_%h%$ZgV91q|J1nq*eA7mHtC85b!1eGGI>e&XSO9Zu@t@>74ua!irmOV^{qZ z1-U`(P)Q3&!@@A2!xw#f;V?4-C#sbyj{?@Cepg#sNPY6ZO!v&p%<>eK_wVa47o`?( zX2{`8h=MGR4ZVx2>wuZDeqK?qsJ%K8XIN2ph@^#O*4LPnhkT=eyeR59LnRnMG zfUHmoqFNgL=K=D+mFD(Wu2U}9~ zWxeX>paIvPiU`f0KRebvZvUPAi~HL4Yqk&9+Y=y0v3xAJuuX~U5C|>b6S<>$Zm`*Z zrTsjC=)6uFY+a8_{ z4&tymi1oSejx=6vH$^O3?R@Aja_`nx3!fj5;VdpMx6Nfh4Ck@5u6&6K;tA(IUUEt~ z7g1z=$yt%8=NXrez&`lzgJIsh>X}LRWwg1wF%6JS>Bc&(2MMJzA}o7fMuI;8=W2pn z!klpp&*0xZw)1%Orz##5q~5YYQ^;vp#KZ!t7e+W8>~D$6N*GDucFXgJDG%q*52u=G zX8W^a`q29vqhR6evQ3MM!P95nx_qJ>Knt<>ePcX+^mS5_88-0d$p0TS9~2{Ol~wXa%w3%zO!v{EObpCw&MV zx2O_uSV!f_4kaRQ+>|1)7Yhf6kFMxI;pvW*VQI8mjebL~%F;V=dHZjeKKhomoaGas zuV-4*G~^J;8EP(fndd3E$D0A2(7T5rCY;cSS)N;eQ!BLUG}EIJ{wRYP4pJ#*~^WNj!ro| zZdKjblhY?0ujvdhFFHw)V96sUrn9LW<;d=(lWw3W6BuIX(L<$GEQ3zemOu<6@H`3L zJpK%{^kzCd)k6CkVvxSaAvo*v!gPw;)^Z#Pt=qkFSU$#f?+F&_ib)e5h}+9CP0hV6 z{{17knIg9C*jTa9nVBg26YH7i+^*=^|G{vpi%G6YAb z#+8V-y8Poi2Uo+lW8mMOoS9KGfU@LdI^bVFB0VOd+;Q(c#9*1uemhOyzd%#{hWK0d z75y)qc7XIo18|YUck+y;xhDVww;1P&q};lc>nM-8d1f*IzmlZa;|USAxXVy8u18VIXL<+WFRHC0C!HRJ37)-DLa|3ORqr{l2QP|rcU-HS{+Mt) zCo_nXX``njxFn+sE$JFBhS+l4l$F^ zfRu+4!&a8fGfnK(o^b)p7`5Jyy7u089hLpooZ(YmUWHqKc$rKuY__hpkbFB=ZMDam zT65>=I|=;Fujg&Mg5V&cXSAZf=5{pd1pd;JVhXk^9+kg|vcTU_OJM0pCoH>H#M;24#2F|I&B==n?fj$!|8w z!Re6E{Zy&rfZ_v47q2#x9;^iNtr5s>zVx#*i63|6_oywLA^u|M!fLhkrU$&si-;D^ zN=T4w!&qIre4k?MjOuwL2+xz*KUB}N;K45=Gm}H%K}fa1L|mYgg(hI&TZA)peWREo zkth%?WAv!63N!?7FArAw-6E9n3~RnfA^z#%4a0xXvU9;92&cQI?WV1~4L~R3agA`> z_R{MjVcPEV_he^3{c?Y5CaNX4^uqc4y*%qvpT$doWi7d712@;# zz#Kzfy=5YI{Eo>a;n3$t-23WOQji7vPd-xE@Xwb3nBi2Lkhx+r)XZ&P;w?6nd=Tn~?L8G-& ztSVV1UK?s;u*dn&DVEHu!z@n7jw_+5$94qvah<=}>@+30XCqb#05_eSuDQ=kUcww7 z{|Pa1IXZHwJ+)C9rbQlRz#fxYUUu7GJTJ6-_~I6l9%14U%Ye4!iZY&v^JmmQe3SNe zsopE7YYlH=e0)wP++-XIeH=(M!k1@sg+d5?6KN&xj{zUw?A1P*`#ep2h>>q9cP#GB z3|gm-pef z515TQ-k7z9&iVdCjn+8E==ik!s_zY51oaIKb1IQMcmCQtP2%_i28b_xSFd@CrPtK^ zZWR4PZ~OyM9Gu5Y&@PqP$wk~; zA0>m=KmX%%+j=ueZ)#%FD`TNV@Ac8Ov>7zqbKjKco)tQ65NB1uHB$ z9XwE@PZhu;gWe`r(v@5AucaWeJ|i^GQAESZvwaf& zO%pdkUY}0RJ%sTTzjP!vc%hPo6&Fz3jLT2uLgP@P{3<-i!!H11z#9nK-K@M{a&c?1 zSGe{bYVT`v+aBQhcSeMx=0Sq;{m$2=Ef5H$%sg3+PYpR6XSJJ|pD#kwD2X&4DBGp9&7yGaTwk}uecT-iN7mf- zUN&QKH>o$vcX!`)1rJ(?X1ERBIi~QS#dsKahriE`RlEo7tVGUNk&& z?P`KRx{QJ=Fd?lo!9AX?jkDHTYVeVSmYhua4K8{%f4_wE-qY`FI;SWbffJ+Z?B~`M zgtkR*g&$O)#E3q8gp3qtR`dvl!9@c6{XahIDKFXd=tt1!%!8)2aQ(^n!csOIGxu6t z$U!Lm;6ySK?78wyz)f9dK5f31b@P0?x2r4iEA#Tg73&PwTTvJ82ER2gpal+5BF0zu zh9Ql6UedQ$M`ebGhyN`jSL`^Cg3GV)Td_mIm))WIFg~oQXe~=LN7|14)AILHQ9++t z!|RNEv66OzD{zL!?Yh^8zf}6UPDG6cOf1O&3|4q`3|eAZ*FF3w-_a|7@2RB-k*6P{Y@b`ZKC7!+da?2F4Kcqrl{U#Di{ZI z+U9GVko6q9mqm2s*HUMV-STX|jCA+#NUbI2x#6`oNk^v&lW0K1`S@Th_2$*m$B&uN z@fh4xPK;eT?yz{bhV_Cnk{mMhx+A1K;rUqd}FzIwX&oMVozBp@dc8ZGsZVlq-A&)9r zv_fI z+ny{%i)=d^`590LNp}hhQLck$XH26S6BL*NZY!p@(hVUURvD~Du$RXse0+8ac0j|; zX@2>1xRPF!q4w@PswgHL#FkjOHf7eC+`sI~0;}21= z%LwsW0F01;K;a0OM!KSjNjwHb%s6NCo~Riz*fN7Y)I@=nI0j4c<=g;_l$2+P5N`vXDv?vAzO$S&Jy|+JEsXlR`Da4p-0p`t^&d zd9EcsokLTDPaJtXQ0`&fKU-G8LL~U3Cb>eBH-jv}cDi*>KY-=(((M*WzzOx>WE=H{ z5?EBKfPwTUDC$hYXvgMn*-@Yixr>DdCXYUsp;F)OoZ+c_mNI;1b)j+5<$V#7DyDck z2{`xP92TJ_i>5RRKtZF?(Yh(M4$UT}qT zVo#vZC&dKRN?+gcKlY!!60blQQPNj1yooHA7 z+gT)5nkd+^quR1DO#M{eW3@>L7R8Qv^SAvfpX%&=R;6SUj{pqoq}lpZ>H+!0b*7;e zQ-QRS(zqx0rHzj7Cm%h%7yjDh{Bw!_JVZ=aKH#_GKJyXxL$Nl8_ASfh3!;vo#-*R1`6puy&(O*^jEoIMB*dl@GJ!GZ?SMGy~}7 zJy>F1wpk3#6DUma!F@Hi`k67i!8ZffMbBO3{=vsDU{uP0ycA-G0^Xw!RJWum5H4kq zPbH5&$~D7OXSP=INr(hm%7B<9)~A>Ii8tZRO7JE0aa~WZqV6crz5Vf>&_Kfp1M)2x3O%Kexi8ojQuK@%Hg{PT80px+jk+KI7LhypezPGoE7 zlw0s*`C;BMt;Wt=NjUBSgn^<8qX)Zz0%%ZvTGVFoDv}PCEJK2et&!Qq)c`kzA%tQy zie|MK#}@sIBh{)r=tAuIGc|@8Av&rl=%3}uPlBZYJg(f> z@<24ir}X@J%2uGC@~`fLszhIRSwP_qgAqI7Jm9K6zrt0kG<9xYNIzsY1AuG&0jaFb zz!!SP@xr=qAXZ&m!cncc+|=eLPkhIL^0#oSLk0F(Z5hEBR*if%t&0kp0W&m5r1Az0 zs6G6uvf#Wm$TOGVw3DN5WOU4ybdAREXfJad-cS;9;*p4rDz)TIX=a0AC^{d6>fWO4M z$!I?XU=`lq-{1&#i+Ateo%A6KBZ^N&&fu_8Q<~ezGID9>PP_O>=F`ON@Yjln9w)Dp zv)$h+0Op;p%Z@bz<_vXNx0j{TwrZi0%0?^rY*t~4k2BmjZ2Dlv3?Q1*96*#$)A!}m zpU*N$>#5Q;p9yg910tBL^p$J8Thinh?vD z5KV_=y0vQSDj>hVs3e=0J`Je@w}{7;m7(bMeXp5h&_T&j5o>?+?qW1jOPNm``j5jn z+Hn4~(->^$dUt433Y!QwMdtaPgM>DXa}{4;fTRwkU3)_R9knwpX@8E!ICiT(V`_B} zI1dYMs2wa3y9j`(eucZY!oj>bZWPwt(<5}=N;eIY0v1WTYX-ZI)db|$Y}TwJ^Z zpwB3nE*^D6(f9k@-79fu4i#Vga{y#5+r$j zg*L3Npl{d9gOlDY9Rcst>ep?tHe*~a;E}%=LtlTV{e-C{YYHB-F{I^W^W5u33j0T( zk@9w=GE`vD_V0+zaGst^7;zgI)Va|2*(8pAoAJsYW} zqCydH;k%Y1dH@X7Nm7!Me_u@`@(Yy-v-Ct*VHosoI};tWx^!vIw=SY+BSVPez8ja- z3}RD`XIc|=BHOJjl=+tS?#BPEU|nAwOlN12f78ON2$!5Il%tHSn@ zh*ah2wIu~*=UdID3JOV39w3Apfuu2#Xf((LD~5{UfJxwgk=phD_Ajgu4!WdVed@Bg SjxC6hAN%=3wvUFtt literal 0 HcmV?d00001