From 3ca28335bd6b99b93a968418d2a2280bb6a5b5fa Mon Sep 17 00:00:00 2001 From: Sollace Date: Fri, 30 Sep 2022 18:48:34 +0200 Subject: [PATCH] Added buckets, bottles, and mugs full of love + Changelings can now collect love from the crystal heart --- .../unicopia/item/CrystalHeartItem.java | 59 ++++++++++++------ .../unicopia/item/DrinkableItem.java | 4 +- .../unicopia/item/UItemGroups.java | 2 +- .../minelittlepony/unicopia/item/UItems.java | 4 ++ .../unicopia/item/toxin/Toxics.java | 4 +- .../unicopia/item/toxin/Toxin.java | 8 +++ .../unicopia/item/toxin/UFoodComponents.java | 4 ++ .../resources/assets/unicopia/lang/en_us.json | 4 ++ .../unicopia/models/item/love_bottle.json | 6 ++ .../unicopia/models/item/love_bucket.json | 6 ++ .../assets/unicopia/models/item/love_mug.json | 6 ++ .../unicopia/textures/item/love_bottle.png | Bin 0 -> 1995 bytes .../unicopia/textures/item/love_bucket.png | Bin 0 -> 1838 bytes .../unicopia/textures/item/love_mug.png | Bin 0 -> 1812 bytes .../unicopia/tags/items/food_types/love.json | 8 +++ .../tags/items/groups/changeling.json | 3 +- .../tags/items/groups/earth_pony.json | 14 ++++- 17 files changed, 106 insertions(+), 26 deletions(-) create mode 100644 src/main/resources/assets/unicopia/models/item/love_bottle.json create mode 100644 src/main/resources/assets/unicopia/models/item/love_bucket.json create mode 100644 src/main/resources/assets/unicopia/models/item/love_mug.json create mode 100644 src/main/resources/assets/unicopia/textures/item/love_bottle.png create mode 100644 src/main/resources/assets/unicopia/textures/item/love_bucket.png create mode 100644 src/main/resources/assets/unicopia/textures/item/love_mug.png create mode 100644 src/main/resources/data/unicopia/tags/items/food_types/love.json diff --git a/src/main/java/com/minelittlepony/unicopia/item/CrystalHeartItem.java b/src/main/java/com/minelittlepony/unicopia/item/CrystalHeartItem.java index f8107db8..a3365917 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/CrystalHeartItem.java +++ b/src/main/java/com/minelittlepony/unicopia/item/CrystalHeartItem.java @@ -1,12 +1,11 @@ package com.minelittlepony.unicopia.item; -import java.util.ArrayList; -import java.util.List; +import java.util.*; +import java.util.function.Supplier; -import com.minelittlepony.unicopia.USounds; -import com.minelittlepony.unicopia.UTags; -import com.minelittlepony.unicopia.entity.FloatingArtefactEntity; -import com.minelittlepony.unicopia.entity.UEntities; +import com.google.common.base.Suppliers; +import com.minelittlepony.unicopia.*; +import com.minelittlepony.unicopia.entity.*; import com.minelittlepony.unicopia.entity.FloatingArtefactEntity.State; import com.minelittlepony.unicopia.particle.FollowingParticleEffect; import com.minelittlepony.unicopia.particle.ParticleUtils; @@ -16,17 +15,11 @@ import com.minelittlepony.unicopia.util.VecHelper; import net.minecraft.block.BlockState; import net.minecraft.block.EndRodBlock; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.Saddleable; -import net.minecraft.entity.SpawnGroup; -import net.minecraft.entity.SpawnReason; +import net.minecraft.entity.*; import net.minecraft.entity.mob.MobEntity; import net.minecraft.entity.passive.TameableEntity; import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.Item; -import net.minecraft.item.ItemPlacementContext; -import net.minecraft.item.ItemStack; -import net.minecraft.item.ItemUsageContext; +import net.minecraft.item.*; import net.minecraft.particle.ParticleTypes; import net.minecraft.predicate.entity.EntityPredicates; import net.minecraft.server.world.ServerWorld; @@ -38,6 +31,28 @@ import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; public class CrystalHeartItem extends Item implements FloatingArtefactEntity.Artifact { + private static final Supplier> ITEM_MAP = Suppliers.memoize(() -> { + return Map.of( + Items.BUCKET, UItems.LOVE_BUCKET, + Items.GLASS_BOTTLE, UItems.LOVE_BOTTLE, + UItems.MUG, UItems.LOVE_MUG + ); + }); + + private static boolean isFillable(ItemStack stack) { + return ITEM_MAP.get().containsKey(stack.getItem()); + } + + private static ItemStack fill(ItemStack stack) { + Item item = ITEM_MAP.get().getOrDefault(stack.getItem(), stack.getItem()); + if (item == stack.getItem()) { + return stack; + } + ItemStack newStack = item.getDefaultStack(); + newStack.setNbt(stack.getNbt()); + newStack.setCount(stack.getCount()); + return newStack; + } public CrystalHeartItem(Settings settings) { super(settings); @@ -55,16 +70,16 @@ public class CrystalHeartItem extends Item implements FloatingArtefactEntity.Art return ActionResult.FAIL; } - if (world instanceof ServerWorld) { + if (world instanceof ServerWorld serverWorld) { - FloatingArtefactEntity entity = UEntities.FLOATING_ARTEFACT.create((ServerWorld)world, context.getStack().getNbt(), null, context.getPlayer(), blockPos, SpawnReason.SPAWN_EGG, false, true); + FloatingArtefactEntity entity = UEntities.FLOATING_ARTEFACT.create(serverWorld, context.getStack().getNbt(), null, context.getPlayer(), blockPos, SpawnReason.SPAWN_EGG, false, true); if (entity == null) { return ActionResult.FAIL; } entity.setStack(context.getStack().split(1)); - ((ServerWorld)world).spawnEntityAndPassengers(entity); + serverWorld.spawnEntityAndPassengers(entity); entity.playSound(USounds.ENTITY_CRYSTAL_HEART_ACTIVATE, 0.75F, 0.8F); } else { @@ -98,6 +113,7 @@ public class CrystalHeartItem extends Item implements FloatingArtefactEntity.Art if (entity.world.getTime() % 80 == 0 && !entity.world.isClient) { List inputs = new ArrayList<>(); List outputs = new ArrayList<>(); + List containers = new ArrayList<>(); VecHelper.findInRange(entity, entity.world, entity.getPos(), 20, EntityPredicates.EXCEPT_CREATIVE_OR_SPECTATOR.and(e -> !e.isRemoved() && (e instanceof PlayerEntity || e instanceof MobEntity))).forEach(e -> { LivingEntity living = (LivingEntity)e; @@ -112,8 +128,11 @@ public class CrystalHeartItem extends Item implements FloatingArtefactEntity.Art inputs.add(living); } }); + VecHelper.findInRange(entity, entity.world, entity.getPos(), 20, i -> { + return i instanceof ItemEntity ie && isFillable(ie.getStack()) && PonyContainer.of(i).filter(p -> p.get().getSpecies() == Race.CHANGELING).isPresent(); + }).forEach(i -> containers.add((ItemEntity)i)); - int demand = outputs.size(); + int demand = outputs.size() + containers.stream().mapToInt(i -> i.getStack().getCount()).sum(); int supply = inputs.size(); if (demand == 0 || supply == 0) { @@ -142,6 +161,10 @@ public class CrystalHeartItem extends Item implements FloatingArtefactEntity.Art ParticleUtils.spawnParticles(new FollowingParticleEffect(UParticles.HEALTH_DRAIN, output, 0.2F), entity, 1); output.heal(gives); }); + containers.forEach(container -> { + ParticleUtils.spawnParticles(new FollowingParticleEffect(UParticles.HEALTH_DRAIN, container, 0.2F), entity, 1); + container.setStack(fill(container.getStack())); + }); entity.addSpin(gives > 0 ? 20 : 10, 30); } diff --git a/src/main/java/com/minelittlepony/unicopia/item/DrinkableItem.java b/src/main/java/com/minelittlepony/unicopia/item/DrinkableItem.java index 699eb847..8419bd8e 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/DrinkableItem.java +++ b/src/main/java/com/minelittlepony/unicopia/item/DrinkableItem.java @@ -25,12 +25,12 @@ public class DrinkableItem extends Item { serverPlayerEntity.incrementStat(Stats.USED.getOrCreateStat(this)); } + ((ToxicHolder)this).getToxic(stack).finishUsing(stack, world, user); + if (user instanceof PlayerEntity && !((PlayerEntity)user).getAbilities().creativeMode) { stack.decrement(1); } - ((ToxicHolder)this).getToxic(stack).finishUsing(stack, world, user); - return stack.isEmpty() ? new ItemStack(getRecipeRemainder()) : stack; } diff --git a/src/main/java/com/minelittlepony/unicopia/item/UItemGroups.java b/src/main/java/com/minelittlepony/unicopia/item/UItemGroups.java index 976a19c4..ec50dee1 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/UItemGroups.java +++ b/src/main/java/com/minelittlepony/unicopia/item/UItemGroups.java @@ -36,7 +36,7 @@ public interface UItemGroups { ItemGroup UNICORN_ITEMS = forTag("unicorn", UItems.SPELLBOOK::getDefaultStack); ItemGroup PEGASUS_ITEMS = forTag("pegasus", UItems.PEGASUS_FEATHER::getDefaultStack); ItemGroup BAT_PONY_ITEMS = forTag("bat_pony", UItems.SUNGLASSES::getDefaultStack); - ItemGroup CHANGELING_ITEMS = forTag("changeling", Items.SCULK_SHRIEKER::getDefaultStack); + ItemGroup CHANGELING_ITEMS = forTag("changeling", UItems.LOVE_BOTTLE::getDefaultStack); static ItemGroup forTag(String name, Supplier icon) { TagKey key = UTags.item("groups/" + name); diff --git a/src/main/java/com/minelittlepony/unicopia/item/UItems.java b/src/main/java/com/minelittlepony/unicopia/item/UItems.java index 1fb1049a..9b5fac30 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/UItems.java +++ b/src/main/java/com/minelittlepony/unicopia/item/UItems.java @@ -86,6 +86,10 @@ public interface UItems { Item APPLE_PIE = register("apple_pie", new BlockItem(UBlocks.APPLE_PIE, new Item.Settings().group(ItemGroup.FOOD).maxCount(1))); Item APPLE_PIE_SLICE = register("apple_pie_slice", new Item(new Item.Settings().group(ItemGroup.FOOD).maxCount(16).food(UFoodComponents.PIE))); + Item LOVE_BOTTLE = register("love_bottle", new DrinkableItem(new Item.Settings().group(ItemGroup.FOOD).food(UFoodComponents.LOVE_BOTTLE).maxCount(1).recipeRemainder(Items.GLASS_BOTTLE))); + Item LOVE_BUCKET = register("love_bucket", new DrinkableItem(new Item.Settings().group(ItemGroup.FOOD).food(UFoodComponents.LOVE_BUCKET).recipeRemainder(Items.BUCKET))); + Item LOVE_MUG = register("love_mug", new DrinkableItem(new Item.Settings().group(ItemGroup.FOOD).food(UFoodComponents.LOVE_MUG).recipeRemainder(MUG))); + Item GOLDEN_FEATHER = register("golden_feather", new Item(new Item.Settings().rarity(Rarity.UNCOMMON).group(ItemGroup.MATERIALS))); Item GOLDEN_WING = register("golden_wing", new Item(new Item.Settings().rarity(Rarity.UNCOMMON).group(ItemGroup.MATERIALS))); diff --git a/src/main/java/com/minelittlepony/unicopia/item/toxin/Toxics.java b/src/main/java/com/minelittlepony/unicopia/item/toxin/Toxics.java index ae96bb5e..46bec2f1 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/toxin/Toxics.java +++ b/src/main/java/com/minelittlepony/unicopia/item/toxin/Toxics.java @@ -100,7 +100,9 @@ public interface Toxics { .with(Race.BAT, Ailment.INNERT) ); - Toxic LOVE = register("love", new Toxic.Builder(Ailment.INNERT)); + Toxic LOVE = register("love", new Toxic.Builder(Ailment.INNERT) + .with(Race.CHANGELING, of(Toxicity.SAFE, Toxin.LOVE_CONSUMPTION)) + ); static void bootstrap() {} diff --git a/src/main/java/com/minelittlepony/unicopia/item/toxin/Toxin.java b/src/main/java/com/minelittlepony/unicopia/item/toxin/Toxin.java index 0e9007ff..bda6f80a 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/toxin/Toxin.java +++ b/src/main/java/com/minelittlepony/unicopia/item/toxin/Toxin.java @@ -40,6 +40,14 @@ public interface Toxin extends Affliction { player.getHungerManager().add(-food.getHunger()/2, -food.getSaturationModifier()/2); }).and(STRONG_NAUSEA).and(IF_NOT_PEACEFUL.then(WEAK_FOOD_POISONING.withChance(20))).and(WEAKNESS); + Toxin LOVE_CONSUMPTION = of(Text.literal("love"), (player, stack) -> { + player.heal(stack.isFood() ? stack.getItem().getFoodComponent().getHunger() : 1); + player.removeStatusEffect(StatusEffects.NAUSEA); + if (player.world.random.nextInt(10) == 0) { + player.removeStatusEffect(UEffects.FOOD_POISONING); + } + }); + default void appendTooltip(List tooltip) { tooltip.add(getName()); } diff --git a/src/main/java/com/minelittlepony/unicopia/item/toxin/UFoodComponents.java b/src/main/java/com/minelittlepony/unicopia/item/toxin/UFoodComponents.java index eebe89b2..fb70b597 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/toxin/UFoodComponents.java +++ b/src/main/java/com/minelittlepony/unicopia/item/toxin/UFoodComponents.java @@ -35,6 +35,10 @@ public interface UFoodComponents { .statusEffect(new StatusEffectInstance(StatusEffects.BAD_OMEN, 100, 0), 0.6F) .build(); + FoodComponent LOVE_BOTTLE = builder(2, 0.125F).alwaysEdible().snack().build(); + FoodComponent LOVE_MUG = builder(4, 0.125F).snack().build(); + FoodComponent LOVE_BUCKET = builder(8, 0.125F).build(); + static FoodComponent.Builder builder(int hunger, float saturation) { return new FoodComponent.Builder() .hunger(hunger) diff --git a/src/main/resources/assets/unicopia/lang/en_us.json b/src/main/resources/assets/unicopia/lang/en_us.json index 61808e3c..1891b64a 100644 --- a/src/main/resources/assets/unicopia/lang/en_us.json +++ b/src/main/resources/assets/unicopia/lang/en_us.json @@ -32,6 +32,10 @@ "item.unicopia.cooked_zap_apple": "Cooked Zap Apple", "item.unicopia.zap_apple": "Zap Apple", "item.unicopia.zap_bulb": "Unripened Zap Apple", + + "item.unicopia.love_bottle": "Bottle o' Love", + "item.unicopia.love_bucket": "Love Bucket", + "item.unicopia.love_mug": "Mug o' Love", "item.unicopia.empty_jar": "Glass Jar", "item.unicopia.filled_jar": "%s in a Jar", diff --git a/src/main/resources/assets/unicopia/models/item/love_bottle.json b/src/main/resources/assets/unicopia/models/item/love_bottle.json new file mode 100644 index 00000000..49b88b10 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/item/love_bottle.json @@ -0,0 +1,6 @@ +{ + "parent": "unicopia:item/mug", + "textures": { + "layer0": "unicopia:item/love_bottle" + } +} diff --git a/src/main/resources/assets/unicopia/models/item/love_bucket.json b/src/main/resources/assets/unicopia/models/item/love_bucket.json new file mode 100644 index 00000000..0d627507 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/item/love_bucket.json @@ -0,0 +1,6 @@ +{ + "parent": "unicopia:item/mug", + "textures": { + "layer0": "unicopia:item/love_bucket" + } +} diff --git a/src/main/resources/assets/unicopia/models/item/love_mug.json b/src/main/resources/assets/unicopia/models/item/love_mug.json new file mode 100644 index 00000000..f4260ce3 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/item/love_mug.json @@ -0,0 +1,6 @@ +{ + "parent": "unicopia:item/mug", + "textures": { + "layer0": "unicopia:item/love_mug" + } +} diff --git a/src/main/resources/assets/unicopia/textures/item/love_bottle.png b/src/main/resources/assets/unicopia/textures/item/love_bottle.png new file mode 100644 index 0000000000000000000000000000000000000000..dc0cb7e2fcaae87dc2f51789c14214374a0dd08d GIT binary patch literal 1995 zcmV;+2Q>JJP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+O1bvb}T0h{bv`BiFWwmhc9Q)73JX`Qn=+_1!mL(Hdo95KiqPs605KXKpOl zoJr!$O}vn(6BVV&NwRb?VQD->Fv|~F=sGuF$2Bq>+zFISU`E(+HFppGYkSLR&bCZM z(Ehd+ONuiirlYJqk|d%a~EbSC~wp- zozl&MRyqj_Ga$xFKs+r3;LyA<^G2$?kaG(&pBYgR7*d7>PN#(!5Y#~&COxqGK<))M zhq(W@xbZV`ZbA2dAmuu)+ok{!KqqTm!B{ zZFW?V>GPSWI@>hJ8CcR}wE41SmlsawCIlYZ<=v!<>8KsmC@-}h&bZphi&maMZz zf3Zi6KRv4GF*Txogf{62;98L$9%OP1%+mYe7yM+<9|#SZMH&KruQl8+_Fm_|p7~%p z`aGL$upoF3wmPF9Z5$WCKp+aOb#j%*)j8^Y1j%NKZL^f{E>(70H0ryF`h#`}w zW0aAU%YZbJYQztwQb1`1B9{zz`9D#_~pYCgfS zw@;DvJz(wQj>}PQCEUNz;*IcE^k37(-{GTu6{Q>RhKaeCxK@Rewh$i*SKe7QBOhtq z4w(6PT*Vb{Yl91M@82OYj`~gbx!MxSwH!m@02FFz_fFhL z@O$8r84~1uYGzFvLT@LXi+6I&JDL>VPay&G7R64ecQ3h3zU9D=gf}VEy~AL}!?4;I z(EkW42JyB@aalMvkA5dZhmqzJ@bI;r7D9&sb34A(IO6KE#~rsRy2}$>&|2E6qly%d zO+QLLNDBRty+W>AI&hxKF6x${MX=Ky6UB2sd)rn^nT|PdVVh6MFWt4%A@9_!8qVmr zavr{bb^eni>0Si>loq3&k4B?qJ8U^O3n#rP-bLdm;O9s8CygUHO1rBZt()s{4qPd5 z;n4$Tn_0fN?f2#AyqMY5|gl{s^S11IK z0005jNklQbqMLJ>MNxK!$rK$VIJI@rOXbrCU=WJsmOSSX@`S}P{VupE&q!=iKvs z=bZZ;Xn|ZLz`sIkB(x*9s}b&``SddYuf9L$cWIl@y+;xtyZ(`IS5W|}rcR(nb}Reu zF3D^rqvFHe-S|dEM9USn<{xuyyua?Du(3fdK1nV<$-CHffTkKHP(x-g1VF6QNA$^r zI5+c>Zyue#;8|XzqoUQ{cmOu@pH$*a_z)xHmO=?2dp-XUMC@W&QdWy$dqV|cW^tzB?qb#W0#*c9?5yoP}- z9B`@*R-B4jwKj2+z>n}3aU^+6rphVMHLQZgsWX>&yBw$QzyO1ZglIbD8r+u_kw;~t dcq940U zaB^>EX>4U6ba`-PAZ2)IW&i+q+O=0#mh31D{bv=k1QbZiA)YfknB~vK2A8`+_j?me zSA%7taIZwUO#kc8VgA6y*0WI;qEFsiT$(g-#vgu}ecS7~?Ky8|?jxkIxt_4&-d6wr2If$FHPz zD#r?n1;EI$&0_?79M<6&2_xEUt0A?`R$DMCC1MggNU2e#LH(F3RfMSAIbde4EQc&g z;KWs|kf;$ArNKdxG>O7exr;!`S1fe+O^3Tm5sn){lL^KMJC0%Y;@^(9hQ_E9B0}~X zE5yY-X`qRs%>U2=AvAU!xdY%mo-Ys!BMPkvb3}sKmeWLW^r$T{2hjpWhgr|fp)CV| z2)-SHAprx{lQ{BZ19Kn(juHH1M9yNA3n(DxxFJeb5f5@uIq;1=feu}Ee2URRAi{~4 z0BVwCaHZZ-4y#+qt2jhi%WuK5;P zY^mi=9i`N@yY74Fv8SE~N^Qu{;f5b!#F0k6SUXrXUpRYZ?t9i~u?E7-!I?s7vj%Yp z+XT(y#7)k?7%PGCFd0BW^W@A%Qsv2c<`cAjU#};dX2KOtkcs8YEYph9;lN9~7b8M?f$aj+yg`%~ z^<3v)$_qqi=UF3U7xXb&yVt~FSV8Ht&LaT7S@w}Hl>9ba!*%8tI?mk z@@?T3w^ycT`LWB#vt(h3^k^5knN=>UvW{aU-&%7Y1K(9CZ?JpY=5Ih=q@)X4&o3Zv zNo~7nWwlVLIuE)M&VngERD2bbvpOtZDbud0aMt#G-ecPx6cl-j+g>VrgM^oAU+081_$6`$psTU)cI-p4>#ii6D=!8v zFtn)zWxnxV3MHHJ=ak-;2&%;#-*fO!udms@oFti(7u2 z|2ISUIoFc;8wlRnay#%(1^@s7#7RU!R5;76lQC!%K@^6+nc2&75Jk>Lgowq;5ka#E zXAw9spduJi5IYHqD2Sq!g^iVkAX@|y6ffbz9cW`Anp)5WiyM?hi*RsSh!`Pcu{g}e zyS=fHTe9pb7QSlUoAHB&eHm*xw`u& z-5(J}yFgD#?197((^mq8fmpDz?-99??AQ#IN(BJdb-{hgF(3#60KzatzL?AX8JQO>m&=)$J!%6` zDwP1ZccYvI3>5)h-#V89d>ETb`K#ZHSwO4RO3nicxlazmFuw(@weWo(fOfmhk^7G` z#lr#KKEGZ3aRyu4$WsJ(^>&@vMvw(ej`xJ;c^OEj(@E5|)?!$k+691{GcEvcRtn~C c%k*FE7qeBM3MVq-Pyhe`07*qoM6N<$f`gfNb^rhX literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/item/love_mug.png b/src/main/resources/assets/unicopia/textures/item/love_mug.png new file mode 100644 index 0000000000000000000000000000000000000000..d7ffedbbb2c1c782365771aba75b498c2d4929ee GIT binary patch literal 1812 zcmV+v2kZEWP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+O1bvmK!$={O2ih1OniC9Io%>204C;OK&5M#<8Qe zhAlJ*7OMa>t=d0-cl8%OtesKD`rx8-8Xpr)1(KezD8B3_lQsBM{@d+l}`6{t4H&_Zm9(tcJHq#(^KV zH+5`f-oY`07@5-?E|0Ipy`NXa6?D=?kJQ14|> zMA-eo6>u>R8ECL5<1f4*2=yb6>?HWOzJ4Gqf*5!WngceNbY3B{r7O2YO`!#j7Nc2{ zecb^-5!SWoN4l<_7YhmsX*thLU18*H@6i8IbR=e!%Wn7nx7t#{u0;G<7Lf(bUb z;6n&8Bo#RdYSl&;eGDHNBp5Ph$tK(EvdQkAPz zQ*CwC*HB|kjT%y^nP!`7zJ(TB>PWRN-E`Ys_dWF3)2Z52RXsF&RqnHDv{i#(YHBu$ z@=y(C?~f2P+KC;SK`}N2#r;qK3C%+@9mp6S%Bi85j*P0X43u_=Q)ws$1x+Kiolfm8 zIF>oEp--QSMc@H>%aq-^-{&jm9?0aFD76VTGXmDt=~0DbA^8~%*&|0ThHzI#bUjHX1SM3Sk7Fi>VZm0gJf$vflH^nCzMb4 zy0f=s(3?|I*E;2LGuurTntO2bO>lMF#30RFn;4vhGkCUX-gdkk1PNg*8H=WQIH(uY zBr6b0YuZ;DGc+|M(U|Hp`%;5lW_^w7VW5`%@(;yVre@-8dTb?MPtgn)wT`*g8OX+n zx|ldp(Tg7(8P+7c3%hph zRh_VZpGOz9ypf@BM(yz8OLt!$pf^rsaK>0n^11i@43C=I(ln{a)Ps?k+%jjO14TOn z4Yps?d!ru}DdFdq6hx&bPzmi|7irdtJ2I!_SG@PFs1MJU#AwAUnIby$&JE;PY0qR( zx2&js7dY#NPQQz{bV>RmWc%PC_XPN!?63hE=Vv+Fs_|OtD~(EV=}03az^cfo81JOz z&<$Q!<#0J&k>vAn!wJ=$R=Xg2O;sDeRKr1a`I>M#+Eq0%(AMAFOeJraZDi_#!WE>(}r`yiUN|5 z%nKB@b?4X9?v`m#+{`8^HJsuXqDSjJI_?e}L2JZ2d~MLj`i?zX{b)?z&%&P1^rpK% zmwMq+{VJJ1ajAZV%+gjQ{1+;2g&pueP^!VmSK>Zy>Kp#lCj#H|_deIuXMTPfFaFfM zg8p-uTjs0ZNAn!jp9c64$afqwqxu&tY~dBHwqBh800EpyL_t(I%e9ifOIuMGhM#+K z?v3}_+QuJ)5U0=-5w#^tokDRDR4BHyiy(!HU7ekTP8N!TWT^BXXk8q-gcck`u!D%A zLW_{W29u~aG502?gL=#*DaOHfI_Kj(?|HtD4;pA`v|rJr1VCzRKtEU<>r+wNS2up`OpOn!snuTw!1v>C|X5{TMM_sdSq)-YRbu-#sz?V&}e>T}p-@!*BkaEKD%&)K0av^=v&I*$Nw-6EBB zMKTc~UpS@vagl}DrwU;1O)_EM zJ>Z&V@8C#d*Ah2PkjdF~OVltRy_vl_xi!@+_ojcfwT%t#A~jh60000