From b0d967ecd498050b0a5b3874ba39d763fe4d4995 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Sat, 10 Oct 2020 21:23:46 +0300 Subject: [PATCH] Chorus nylium & chorus forest, lake fixes --- .../betterend/compat/REIAlloyingCategory.java | 2 -- .../ru/betterend/entity/EntityEndSlime.java | 12 +++++-- .../ru/betterend/registry/BiomeRegistry.java | 2 ++ .../ru/betterend/registry/BlockRegistry.java | 2 ++ .../betterend/registry/BlockTagRegistry.java | 1 + .../betterend/registry/FeatureRegistry.java | 1 + .../world/biome/BiomeChorusForest.java | 24 +++++++++++++ .../world/features/EndLakeFeature.java | 34 +++++++++++------- .../betterend/blockstates/chorus_nylium.json | 10 ++++++ .../blockstates/chorus_nylium_path.json | 10 ++++++ .../betterend/models/block/chorus_nylium.json | 12 +++++++ .../models/block/chorus_nylium_path.json | 7 ++++ .../betterend/models/item/chorus_nylium.json | 3 ++ .../models/item/chorus_nylium_path.json | 3 ++ .../textures/block/chorus_nylium_path_top.png | Bin 0 -> 722 bytes .../textures/block/chorus_nylium_side.png | Bin 0 -> 2122 bytes .../textures/block/chorus_nylium_top.png | Bin 0 -> 480 bytes 17 files changed, 105 insertions(+), 18 deletions(-) create mode 100644 src/main/java/ru/betterend/world/biome/BiomeChorusForest.java create mode 100644 src/main/resources/assets/betterend/blockstates/chorus_nylium.json create mode 100644 src/main/resources/assets/betterend/blockstates/chorus_nylium_path.json create mode 100644 src/main/resources/assets/betterend/models/block/chorus_nylium.json create mode 100644 src/main/resources/assets/betterend/models/block/chorus_nylium_path.json create mode 100644 src/main/resources/assets/betterend/models/item/chorus_nylium.json create mode 100644 src/main/resources/assets/betterend/models/item/chorus_nylium_path.json create mode 100644 src/main/resources/assets/betterend/textures/block/chorus_nylium_path_top.png create mode 100644 src/main/resources/assets/betterend/textures/block/chorus_nylium_side.png create mode 100644 src/main/resources/assets/betterend/textures/block/chorus_nylium_top.png diff --git a/src/main/java/ru/betterend/compat/REIAlloyingCategory.java b/src/main/java/ru/betterend/compat/REIAlloyingCategory.java index c6f829bb..b48c3641 100644 --- a/src/main/java/ru/betterend/compat/REIAlloyingCategory.java +++ b/src/main/java/ru/betterend/compat/REIAlloyingCategory.java @@ -17,12 +17,10 @@ import me.shedaniel.rei.api.widgets.Widgets; import me.shedaniel.rei.gui.entries.RecipeEntry; import me.shedaniel.rei.gui.entries.SimpleRecipeEntry; import me.shedaniel.rei.gui.widget.Widget; - import net.minecraft.client.gui.DrawableHelper; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.text.TranslatableText; import net.minecraft.util.Identifier; - import ru.betterend.recipe.AlloyingRecipe; import ru.betterend.registry.BlockRegistry; import ru.betterend.util.LangUtil; diff --git a/src/main/java/ru/betterend/entity/EntityEndSlime.java b/src/main/java/ru/betterend/entity/EntityEndSlime.java index 349059af..083457f8 100644 --- a/src/main/java/ru/betterend/entity/EntityEndSlime.java +++ b/src/main/java/ru/betterend/entity/EntityEndSlime.java @@ -24,6 +24,7 @@ import net.minecraft.util.math.Box; import net.minecraft.world.LocalDifficulty; import net.minecraft.world.ServerWorldAccess; import net.minecraft.world.World; +import net.minecraft.world.biome.Biome; import ru.betterend.registry.BiomeRegistry; import ru.betterend.util.ISlime; @@ -105,7 +106,12 @@ public class EntityEndSlime extends SlimeEntity { } public static boolean canSpawn(EntityType type, ServerWorldAccess world, SpawnReason spawnReason, BlockPos pos, Random random) { - return notManyEntities(world, pos, 32, 3) && isWaterNear(world, pos, 32); + return isPermanentBiome(world, pos) || (notManyEntities(world, pos, 32, 3) && isWaterNear(world, pos, 32, 8)); + } + + private static boolean isPermanentBiome(ServerWorldAccess world, BlockPos pos) { + Biome biome = world.getBiome(pos); + return BiomeRegistry.getFromBiome(biome) == BiomeRegistry.CHORUS_FOREST; } private static boolean notManyEntities(ServerWorldAccess world, BlockPos pos, int radius, int maxCount) { @@ -114,12 +120,12 @@ public class EntityEndSlime extends SlimeEntity { return list.size() <= maxCount; } - private static boolean isWaterNear(ServerWorldAccess world, BlockPos pos, int radius) { + private static boolean isWaterNear(ServerWorldAccess world, BlockPos pos, int radius, int radius2) { for (int x = pos.getX() - radius; x <= pos.getX() + radius; x++) { POS.setX(x); for (int z = pos.getZ() - radius; z <= pos.getZ() + radius; z++) { POS.setZ(z); - for (int y = pos.getY() - radius; y <= pos.getY() + radius; y++) { + for (int y = pos.getY() - radius2; y <= pos.getY() + radius2; y++) { POS.setY(y); if (world.getBlockState(POS).getBlock() == Blocks.WATER) { return true; diff --git a/src/main/java/ru/betterend/registry/BiomeRegistry.java b/src/main/java/ru/betterend/registry/BiomeRegistry.java index 47cd9d6c..e4b65660 100644 --- a/src/main/java/ru/betterend/registry/BiomeRegistry.java +++ b/src/main/java/ru/betterend/registry/BiomeRegistry.java @@ -12,6 +12,7 @@ import net.minecraft.util.registry.RegistryKey; import net.minecraft.world.biome.Biome; import net.minecraft.world.biome.Biome.Category; import net.minecraft.world.biome.BiomeKeys; +import ru.betterend.world.biome.BiomeChorusForest; import ru.betterend.world.biome.BiomeFoggyMushroomland; import ru.betterend.world.biome.EndBiome; import ru.betterend.world.generator.BiomePicker; @@ -30,6 +31,7 @@ public class BiomeRegistry { public static final EndBiome END_MIDLANDS = registerBiome(BiomeKeys.END_MIDLANDS, BiomeType.LAND, false); public static final EndBiome SMALL_END_ISLANDS = registerBiome(BiomeKeys.SMALL_END_ISLANDS, BiomeType.VOID, true); public static final EndBiome FOGGY_MUSHROOMLAND = registerBiome(new BiomeFoggyMushroomland(), BiomeType.LAND); + public static final EndBiome CHORUS_FOREST = registerBiome(new BiomeChorusForest(), BiomeType.LAND); public static void register() {} diff --git a/src/main/java/ru/betterend/registry/BlockRegistry.java b/src/main/java/ru/betterend/registry/BlockRegistry.java index bfc38ec6..8f9251cd 100644 --- a/src/main/java/ru/betterend/registry/BlockRegistry.java +++ b/src/main/java/ru/betterend/registry/BlockRegistry.java @@ -38,10 +38,12 @@ public class BlockRegistry { public static final Block ENDSTONE_DUST = registerBlock("endstone_dust", new BlockEndstoneDust()); public static final Block END_MYCELIUM = registerBlock("end_mycelium", new BlockTerrain(MaterialColor.LIGHT_BLUE)); public static final Block END_MOSS = registerBlock("end_moss", new BlockTerrain(MaterialColor.CYAN)); + public static final Block CHORUS_NYLIUM = registerBlock("chorus_nylium", new BlockTerrain(MaterialColor.MAGENTA)); // Roads // public static final Block END_MYCELIUM_PATH = registerBlock("end_mycelium_path", new BlockPath(END_MYCELIUM)); public static final Block END_MOSS_PATH = registerBlock("end_moss_path", new BlockPath(END_MOSS)); + public static final Block CHORUS_NYLIUM_PATH = registerBlock("chorus_nylium_path", new BlockPath(CHORUS_NYLIUM)); // Rocks // public static final Block FLAVOLITE = registerBlock("flavolite", new BlockStone(MaterialColor.SAND)); diff --git a/src/main/java/ru/betterend/registry/BlockTagRegistry.java b/src/main/java/ru/betterend/registry/BlockTagRegistry.java index c6bcc7e1..029074b1 100644 --- a/src/main/java/ru/betterend/registry/BlockTagRegistry.java +++ b/src/main/java/ru/betterend/registry/BlockTagRegistry.java @@ -22,6 +22,7 @@ public class BlockTagRegistry { public static void register() { addSurfaceBlock(BlockRegistry.END_MOSS); addSurfaceBlock(BlockRegistry.END_MYCELIUM); + addSurfaceBlock(BlockRegistry.CHORUS_NYLIUM); TagHelper.addTag(GEN_TERRAIN, BlockRegistry.ENDER_ORE); } diff --git a/src/main/java/ru/betterend/registry/FeatureRegistry.java b/src/main/java/ru/betterend/registry/FeatureRegistry.java index 7e453e50..92c4589e 100644 --- a/src/main/java/ru/betterend/registry/FeatureRegistry.java +++ b/src/main/java/ru/betterend/registry/FeatureRegistry.java @@ -21,6 +21,7 @@ public class FeatureRegistry { // Features // public static final EndFeature END_LAKE = EndFeature.makeLakeFeature("end_lake", new EndLakeFeature(), 4); + public static final EndFeature RARE_END_LAKE = EndFeature.makeLakeFeature("rare_end_lake", new EndLakeFeature(), 40); // Ores // public static final EndFeature ENDER_ORE = EndFeature.makeOreFeature("ender_ore", BlockRegistry.ENDER_ORE, 6, 3, 0, 4, 96); diff --git a/src/main/java/ru/betterend/world/biome/BiomeChorusForest.java b/src/main/java/ru/betterend/world/biome/BiomeChorusForest.java new file mode 100644 index 00000000..b647bb02 --- /dev/null +++ b/src/main/java/ru/betterend/world/biome/BiomeChorusForest.java @@ -0,0 +1,24 @@ +package ru.betterend.world.biome; + +import net.minecraft.entity.EntityType; +import ru.betterend.registry.BlockRegistry; +import ru.betterend.registry.EntityRegistry; +import ru.betterend.registry.FeatureRegistry; +import ru.betterend.registry.StructureRegistry; + +public class BiomeChorusForest extends EndBiome { + public BiomeChorusForest() { + super(new BiomeDefinition("chorus_forest") + .setFogColor(87, 26, 87) + .setFogDensity(3) + .setSurface(BlockRegistry.CHORUS_NYLIUM) + //.setParticles(ParticleRegistry.GLOWING_SPHERE, 0.001F) + //.setLoop(SoundRegistry.AMBIENT_FOGGY_MUSHROOMLAND) + //.setMusic(SoundRegistry.MUSIC_FOGGY_MUSHROOMLAND) + .addStructureFeature(StructureRegistry.GIANT_MOSSY_GLOWSHROOM) + .addFeature(FeatureRegistry.ENDER_ORE) + .addFeature(FeatureRegistry.RARE_END_LAKE) + .addMobSpawn(EntityRegistry.END_SLIME, 5, 1, 2) + .addMobSpawn(EntityType.ENDERMAN, 50, 1, 4)); + } +} diff --git a/src/main/java/ru/betterend/world/features/EndLakeFeature.java b/src/main/java/ru/betterend/world/features/EndLakeFeature.java index cd6d55f2..f92cf8a3 100644 --- a/src/main/java/ru/betterend/world/features/EndLakeFeature.java +++ b/src/main/java/ru/betterend/world/features/EndLakeFeature.java @@ -8,15 +8,18 @@ import net.minecraft.fluid.FluidState; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos.Mutable; import net.minecraft.world.StructureWorldAccess; +import net.minecraft.world.WorldAccess; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.feature.DefaultFeatureConfig; import ru.betterend.blocks.BlockEndLily; import ru.betterend.blocks.BlockProperties.TripleShape; import ru.betterend.noise.OpenSimplexNoise; +import ru.betterend.registry.BiomeRegistry; import ru.betterend.registry.BlockRegistry; import ru.betterend.registry.BlockTagRegistry; import ru.betterend.util.BlocksHelper; import ru.betterend.util.MHelper; +import ru.betterend.world.biome.EndBiome; public class EndLakeFeature extends DefaultFeature { private static final BlockState END_STONE = Blocks.END_STONE.getDefaultState(); @@ -165,19 +168,9 @@ public class EndLakeFeature extends DefaultFeature { if (world.getBlockState(pos).getBlock().isIn(BlockTagRegistry.GEN_TERRAIN)) { BlocksHelper.setWithoutUpdate(world, POS.down(), BlockRegistry.ENDSTONE_DUST.getDefaultState()); - if (y < waterLevel - 1 && random.nextInt(3) == 0 && ((x + z) & 1) == 0) { - if (NOISE.eval(x * 0.1, z * 0.1, 0) > 0) { - BlocksHelper.setWithoutUpdate(world, POS, BlockRegistry.BUBBLE_CORAL.getDefaultState()); - } - else if (NOISE.eval(x * 0.1, z * 0.1, 1) > 0) { - world.setBlockState(POS, BlockRegistry.END_LILY.getDefaultState().with(BlockEndLily.SHAPE, TripleShape.BOTTOM), 0); - BlockPos up = POS.up(); - while (up.getY() < waterLevel) { - BlocksHelper.setWithoutUpdate(world, up, BlockRegistry.END_LILY.getDefaultState().with(BlockEndLily.SHAPE, TripleShape.MIDDLE)); - up = up.up(); - } - BlocksHelper.setWithoutUpdate(world, up, BlockRegistry.END_LILY.getDefaultState().with(BlockEndLily.SHAPE, TripleShape.TOP)); - } + EndBiome biome = BiomeRegistry.getFromBiome(world.getBiome(POS)); + if (biome == BiomeRegistry.CHORUS_FOREST) { + generateFoggyMushroomland(world, x, z, waterLevel); } } pos = POS.up(); @@ -214,4 +207,19 @@ public class EndLakeFeature extends DefaultFeature { return true; } + + private void generateFoggyMushroomland(WorldAccess world, int x, int z, int waterLevel) { + if (NOISE.eval(x * 0.1, z * 0.1, 0) > 0) { + BlocksHelper.setWithoutUpdate(world, POS, BlockRegistry.BUBBLE_CORAL.getDefaultState()); + } + else if (NOISE.eval(x * 0.1, z * 0.1, 1) > 0) { + world.setBlockState(POS, BlockRegistry.END_LILY.getDefaultState().with(BlockEndLily.SHAPE, TripleShape.BOTTOM), 0); + BlockPos up = POS.up(); + while (up.getY() < waterLevel) { + BlocksHelper.setWithoutUpdate(world, up, BlockRegistry.END_LILY.getDefaultState().with(BlockEndLily.SHAPE, TripleShape.MIDDLE)); + up = up.up(); + } + BlocksHelper.setWithoutUpdate(world, up, BlockRegistry.END_LILY.getDefaultState().with(BlockEndLily.SHAPE, TripleShape.TOP)); + } + } } diff --git a/src/main/resources/assets/betterend/blockstates/chorus_nylium.json b/src/main/resources/assets/betterend/blockstates/chorus_nylium.json new file mode 100644 index 00000000..6c04ddb7 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/chorus_nylium.json @@ -0,0 +1,10 @@ +{ + "variants": { + "": [ + { "model": "betterend:block/chorus_nylium" }, + { "model": "betterend:block/chorus_nylium", "y": 90 }, + { "model": "betterend:block/chorus_nylium", "y": 180 }, + { "model": "betterend:block/chorus_nylium", "y": 270 } + ] + } +} diff --git a/src/main/resources/assets/betterend/blockstates/chorus_nylium_path.json b/src/main/resources/assets/betterend/blockstates/chorus_nylium_path.json new file mode 100644 index 00000000..3e160ef6 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/chorus_nylium_path.json @@ -0,0 +1,10 @@ +{ + "variants": { + "": [ + { "model": "betterend:block/chorus_nylium_path" }, + { "model": "betterend:block/chorus_nylium_path", "y": 90 }, + { "model": "betterend:block/chorus_nylium_path", "y": 180 }, + { "model": "betterend:block/chorus_nylium_path", "y": 270 } + ] + } +} diff --git a/src/main/resources/assets/betterend/models/block/chorus_nylium.json b/src/main/resources/assets/betterend/models/block/chorus_nylium.json new file mode 100644 index 00000000..9acf413a --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/chorus_nylium.json @@ -0,0 +1,12 @@ +{ + "parent": "block/cube", + "textures": { + "down": "block/end_stone", + "east": "betterend:block/chorus_nylium_side", + "north": "betterend:block/chorus_nylium_side", + "particle": "betterend:block/chorus_nylium_side", + "south": "betterend:block/chorus_nylium_side", + "up": "betterend:block/chorus_nylium_top", + "west": "betterend:block/chorus_nylium_side" + } +} diff --git a/src/main/resources/assets/betterend/models/block/chorus_nylium_path.json b/src/main/resources/assets/betterend/models/block/chorus_nylium_path.json new file mode 100644 index 00000000..8dcbf941 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/chorus_nylium_path.json @@ -0,0 +1,7 @@ +{ "parent": "betterend:block/path", + "textures": { + "top": "betterend:block/chorus_nylium_path_top", + "side": "betterend:block/chorus_nylium_side", + "bottom": "block/end_stone" + } +} diff --git a/src/main/resources/assets/betterend/models/item/chorus_nylium.json b/src/main/resources/assets/betterend/models/item/chorus_nylium.json new file mode 100644 index 00000000..c3e7084c --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/chorus_nylium.json @@ -0,0 +1,3 @@ +{ + "parent": "betterend:block/chorus_nylium" +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/item/chorus_nylium_path.json b/src/main/resources/assets/betterend/models/item/chorus_nylium_path.json new file mode 100644 index 00000000..da096761 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/chorus_nylium_path.json @@ -0,0 +1,3 @@ +{ + "parent": "betterend:block/chorus_nylium_path" +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/textures/block/chorus_nylium_path_top.png b/src/main/resources/assets/betterend/textures/block/chorus_nylium_path_top.png new file mode 100644 index 0000000000000000000000000000000000000000..ddf3c34549a01cc1c3da279c41671a314eb37861 GIT binary patch literal 722 zcmV;@0xkWCP)gT>X`l5-vIp+XE>lF4Kj+?~%5*E4bsZrFUeB*wrVFJM z=4HlZM^2edzhNUb$jMJMeM8Qf$M%sV5`EY6+&mLYs>d!SMkebqDc1M+k8nXc`KIdWg_?1w$It{LYMr4>tF zsGFLt-Ln0(<>-!#ZltYR3oOi?$`MUke@p1&jzVp0$MihZk3SDdRno&aWegBY#ux9;xI<&JqYAaA*#=yF;vkU9+RC1^Iq|#~8z*Kk)bcFSfSqh8@Z(ZsA5Q znI$b4X}B+Uo`xrU@|058)Eo3*2gY%viWU2I&)J`mNJ0+86lv=gTU&1Pjjruj)5;Vk zlu$@1k=9rqh6j>JD6N>>L`Z?3`=6|0CFV#81zTH|ys)r*pi7BM4w-XiXLhu0i;E7S z1dshAS9hgS6+a$+Ff;=skVOJe>zX;vtm}$i(t?W)pFBnxN-5-$@zK+njycV=vc>d< zHLPGE`9vy-r}hc?vU@>SnmNt**|Qlo9Q~105`!H$UXFwqaFZjcgw7g|r?u_JiQapb zbs?9GZZv60v~^2Z1J1b*iZWx2q1QduSd1}fp&93q|BV`m%Z*#!;s5{u07*qoM6N<$ Ef&uwgV*mgE literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/chorus_nylium_side.png b/src/main/resources/assets/betterend/textures/block/chorus_nylium_side.png new file mode 100644 index 0000000000000000000000000000000000000000..b59e7cfd6048b1ff286e1d1f4a943d79be2e72a9 GIT binary patch literal 2122 zcmbVN3rrJd9IrZ~s4%CS7*sfmb2`1=^+mbET55|zv_P>N;KcFu?(0L^UcEb@Jf;iG z*CJ8OCa4>34voR+#vUSqb1ygDbV}TeOU!)D_}H*U986u@zAL4}1)W*b>wS0k`+mRQ z|8f7W&CZ+`JtA&|OeTxYNH^!8^JwW9J{bLOsC6ZwQe!vt#5wk<5+ozWY+YZSwH>;QDYAvM2Z-Op& zdN~glmS@_S@*;*}<%ZeVtN@J&yif#K!0Yh|bU-f;@zQ85-6rH%2qG5gmMTis3XXRYN{XTgQbnj#I6~k;nNI`(+$SXVF_@vi@NU28=6smM2<%+3 zsFx$By&-u05n7)RP7_KP5deNdsUW40LO_;@;QYnBCnU}?1oS{J^oat(DkE6GixWA) z#XW>N^7sJ(lv;}=qA{QsuQwtgh-oD#jBr8*L<_buKO}OXz!mchOe;Y)6QyYUw26m6 zK-DepynWVxbW7BfoK9(yLruW+e%|L{Dxr$VgIH|)`Dw|SEqpwCggH+Qb z*$cIBtlLr652_?_C23QU2!YTKKvCDQKm`8@W*OSS@m_#pc6)&n5`Ldkjzuy_n>Y{0 zBVpuD9dco@&>22K1U?34nDufLw!-aZX*C1vb|p#SYMqY6)ue{S?W_*sBmj&<101A= zRQByRb4;;RTxoxApR*i;IQ~(k7>cAwRT7>|sns}eAT~;^)8KZBO11-53s|+Pk1dOL zqgM@h`m;)|Sj1@8Fr>!r(BTdWXmLOx9-soqB!o)43P7b6LaCucJwm6u1ysGV@GG(q zE(@hd({QbA(jFj8l5P2kJDeo z!~6@N(I@HruxpoCnChmdAXZ)u2sS1t6c-(2d0qhTj4 zBU2V#MCLT~A!;5?;dQrz*JZN72^nUiZCb59J1c$RvWY7U!_TH}+LC|KFRVJ%YFtvK zdAfugF4atB)xh>uWx1$!jNniqE=c zIdHpd`7Z~*tP2La?o=AK1$)*8vfAH?osy9w9`5wlWzN6)Yt!|`F?B0@sCy@GPTx7? zl-X+ZJkv7qg_u!=IffsBG4cDJw!6m%@!3NLPl_^+>ltUw?b=;X*EW3P;rj7H&F5pf z>w)Ph+*%v8q4~;;9m{uC=2l+Vce5PmE9#>QM&?hbj_X-pQFKt4p}!VR_{6xJiGtgpXFy#W>(czC3Ys>k1cPlY`;nB@7*Zr-duL{+m<&Wb?cQB zL&}}zuBBIg;CDC0f79^W8ulX9&TQWBqJ}&*#KA!JPXxz1LWcRsw&&QqQ=dQ}#(^i|+xH;;LFB-BhA4!c%ZEAgP zPQBx2+4Si1xbx8V_iaTllK@Lodvu-DgB9J}z*v+k%wTf?x^i=$Es=ie~B h4Uhe0+%)0-u-}trZ{OIdyD$CQXQXAC_s%J-`WrB5^C@eD3jl~(aX*R3_S9kln-@4G~LUUfveDHxTG}r2y9XsAX z-+BA<#*Mz=Wqtu*jVt?N&ue@|IpY%K)5D2UmuW)I-_M?=YB)WdQVu}1wgn)>z_1Qj zV<~l+3WZ*Mr~!DMo(VB{G+1^V8M^aYFucG}2V4 z%E128f4kskkI{yvYJO12i-mtqNr^4pv7^8ANuVVzsY!?dXB@*iP#@|Pcg9i3=7|=5 z_8ZvpoiExF7x=qt3ivPN?${AxV2KMxn-u?7GX>u(DN2VJs1G&6IwWePE-~69G^H++ z8)^(=IxNc}&4jlIEAZvMG*yEVOQfUGW+P?}+0UN(P}5)fL`%suc?;ZJG|7u~xo%$$ WM;aIm&fy6F0000