From 457050ab2f997f21f6975f259406945270b1f171 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Thu, 25 Jun 2020 18:17:37 +0200 Subject: [PATCH] Powered Funneling - Tidied up R-Funnel texture sheet - R-Funnels can now be powered by redstone - Non-mounted R-Funnels are now full hopper-like blocks rather than fixtures --- src/generated/resources/.cache/cache | 4 +- .../create/blockstates/belt_funnel.json | 47 ++- .../create/blockstates/reality_funnel.json | 38 +- .../java/com/simibubi/create/AllBlocks.java | 11 +- .../java/com/simibubi/create/AllShapes.java | 5 +- .../block/realityFunnel/BeltFunnelBlock.java | 27 +- .../realityFunnel/RealityFunnelBlock.java | 21 +- .../block/redstone/RedstoneLinkBlock.java | 3 + .../block/belt_funnel/block_default.json | 314 -------------- .../block/belt_funnel/block_extended.json | 389 ++++++++---------- .../belt_funnel/block_extended_powered.json | 6 + .../block/belt_funnel/block_retracted.json | 307 +++++++------- .../belt_funnel/block_retracted_powered.json | 6 + .../models/block/reality_funnel/block.json | 184 ++++++--- .../block/reality_funnel/block_powered.json | 6 + .../models/block/reality_funnel/item.json | 289 +++++-------- .../create/textures/block/funnel_back.png | Bin 0 -> 948 bytes .../create/textures/block/funnel_off.png | Bin 0 -> 370 bytes .../create/textures/block/funnel_on.png | Bin 0 -> 378 bytes .../create/textures/block/funnel_plating.png | Bin 0 -> 1580 bytes .../create/textures/block/reality_funnel.png | Bin 2280 -> 0 bytes 21 files changed, 705 insertions(+), 952 deletions(-) delete mode 100644 src/main/resources/assets/create/models/block/belt_funnel/block_default.json create mode 100644 src/main/resources/assets/create/models/block/belt_funnel/block_extended_powered.json create mode 100644 src/main/resources/assets/create/models/block/belt_funnel/block_retracted_powered.json create mode 100644 src/main/resources/assets/create/models/block/reality_funnel/block_powered.json create mode 100644 src/main/resources/assets/create/textures/block/funnel_back.png create mode 100644 src/main/resources/assets/create/textures/block/funnel_off.png create mode 100644 src/main/resources/assets/create/textures/block/funnel_on.png create mode 100644 src/main/resources/assets/create/textures/block/funnel_plating.png delete mode 100644 src/main/resources/assets/create/textures/block/reality_funnel.png diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index e07ce1129..57f7d584f 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -17,7 +17,7 @@ a579c40c43dc2174afb66f42d00d0c4a0efaaeee assets\create\blockstates\andesite_bric 398922758a6219544e5b85c91c9cf8a543b437e5 assets\create\blockstates\andesite_pillar.json f9fa6aa530eb0891a74eadfbebc663172a57147a assets\create\blockstates\basin.json 96a4fae5883eda130f8ec1a57d34534f6d0793c4 assets\create\blockstates\belt.json -86487988273d365436dbadad597c112aacf5aa92 assets\create\blockstates\belt_funnel.json +fe0278550e4795cc9757e726b88db12b599ec9ef assets\create\blockstates\belt_funnel.json 40d10934934ea142d71fc6ce598b1455c3ad47b4 assets\create\blockstates\belt_observer.json 4325605fbdea60d5f54286c309c825bebcd74b95 assets\create\blockstates\belt_tunnel.json cf9045eb16e5299a1d917c4cb536289f49411276 assets\create\blockstates\birch_window.json @@ -283,7 +283,7 @@ e8b0a401c10d1ba67ed71ba31bd5f9bc28571b65 assets\create\blockstates\powered_toggl 3a739f9d4276828d83f2d2750bf3227c87bcd438 assets\create\blockstates\pulley_magnet.json 469e430d96cb0a5e1aaf6b7cc5d401d488c9e600 assets\create\blockstates\pulse_repeater.json 6fa36883e76e9e403bb429c8f86b8c0d3bba0cff assets\create\blockstates\radial_chassis.json -35cc2bb35c9e2809f69d1fb70e854f69e0f9bbe6 assets\create\blockstates\reality_funnel.json +5e03eb759050c365f9f452ef0659f19a80e1e2f8 assets\create\blockstates\reality_funnel.json 8929677f2cc5354aa19ef182af69f9f0b41eb242 assets\create\blockstates\redstone_contact.json c29213b77ac0c78d8979c5f6188d2b265696f9b9 assets\create\blockstates\redstone_link.json 1eac804cba08aebb5f4646758ae1ef9b32e01365 assets\create\blockstates\reinforced_rail.json diff --git a/src/generated/resources/assets/create/blockstates/belt_funnel.json b/src/generated/resources/assets/create/blockstates/belt_funnel.json index 5ff1ee0c3..a692d1738 100644 --- a/src/generated/resources/assets/create/blockstates/belt_funnel.json +++ b/src/generated/resources/assets/create/blockstates/belt_funnel.json @@ -1,49 +1,64 @@ { "variants": { - "facing=north,shape=retracted": { + "facing=north,powered=false,shape=retracted": { "model": "create:block/belt_funnel/block_retracted" }, - "facing=south,shape=retracted": { + "facing=south,powered=false,shape=retracted": { "model": "create:block/belt_funnel/block_retracted", "y": 180 }, - "facing=west,shape=retracted": { + "facing=west,powered=false,shape=retracted": { "model": "create:block/belt_funnel/block_retracted", "y": 270 }, - "facing=east,shape=retracted": { + "facing=east,powered=false,shape=retracted": { "model": "create:block/belt_funnel/block_retracted", "y": 90 }, - "facing=north,shape=default": { - "model": "create:block/belt_funnel/block_default" + "facing=north,powered=true,shape=retracted": { + "model": "create:block/belt_funnel/block_retracted_powered" }, - "facing=south,shape=default": { - "model": "create:block/belt_funnel/block_default", + "facing=south,powered=true,shape=retracted": { + "model": "create:block/belt_funnel/block_retracted_powered", "y": 180 }, - "facing=west,shape=default": { - "model": "create:block/belt_funnel/block_default", + "facing=west,powered=true,shape=retracted": { + "model": "create:block/belt_funnel/block_retracted_powered", "y": 270 }, - "facing=east,shape=default": { - "model": "create:block/belt_funnel/block_default", + "facing=east,powered=true,shape=retracted": { + "model": "create:block/belt_funnel/block_retracted_powered", "y": 90 }, - "facing=north,shape=extended": { + "facing=north,powered=false,shape=extended": { "model": "create:block/belt_funnel/block_extended" }, - "facing=south,shape=extended": { + "facing=south,powered=false,shape=extended": { "model": "create:block/belt_funnel/block_extended", "y": 180 }, - "facing=west,shape=extended": { + "facing=west,powered=false,shape=extended": { "model": "create:block/belt_funnel/block_extended", "y": 270 }, - "facing=east,shape=extended": { + "facing=east,powered=false,shape=extended": { "model": "create:block/belt_funnel/block_extended", "y": 90 + }, + "facing=north,powered=true,shape=extended": { + "model": "create:block/belt_funnel/block_extended_powered" + }, + "facing=south,powered=true,shape=extended": { + "model": "create:block/belt_funnel/block_extended_powered", + "y": 180 + }, + "facing=west,powered=true,shape=extended": { + "model": "create:block/belt_funnel/block_extended_powered", + "y": 270 + }, + "facing=east,powered=true,shape=extended": { + "model": "create:block/belt_funnel/block_extended_powered", + "y": 90 } } } \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/reality_funnel.json b/src/generated/resources/assets/create/blockstates/reality_funnel.json index 63d9403e1..7b9e14ef9 100644 --- a/src/generated/resources/assets/create/blockstates/reality_funnel.json +++ b/src/generated/resources/assets/create/blockstates/reality_funnel.json @@ -1,30 +1,56 @@ { "variants": { - "facing=down": { + "facing=down,powered=false": { "model": "create:block/reality_funnel/block", "x": 180 }, - "facing=up": { + "facing=up,powered=false": { "model": "create:block/reality_funnel/block" }, - "facing=north": { + "facing=north,powered=false": { "model": "create:block/reality_funnel/block", "x": 90 }, - "facing=south": { + "facing=south,powered=false": { "model": "create:block/reality_funnel/block", "x": 90, "y": 180 }, - "facing=west": { + "facing=west,powered=false": { "model": "create:block/reality_funnel/block", "x": 90, "y": 270 }, - "facing=east": { + "facing=east,powered=false": { "model": "create:block/reality_funnel/block", "x": 90, "y": 90 + }, + "facing=down,powered=true": { + "model": "create:block/reality_funnel/block_powered", + "x": 180 + }, + "facing=up,powered=true": { + "model": "create:block/reality_funnel/block_powered" + }, + "facing=north,powered=true": { + "model": "create:block/reality_funnel/block_powered", + "x": 90 + }, + "facing=south,powered=true": { + "model": "create:block/reality_funnel/block_powered", + "x": 90, + "y": 180 + }, + "facing=west,powered=true": { + "model": "create:block/reality_funnel/block_powered", + "x": 90, + "y": 270 + }, + "facing=east,powered=true": { + "model": "create:block/reality_funnel/block_powered", + "x": 90, + "y": 90 } } } \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index 784f1cf69..ed2b72bbb 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -742,16 +742,19 @@ public class AllBlocks { public static final BlockEntry REALITY_FUNNEL = REGISTRATE.block("reality_funnel", RealityFunnelBlock::new) .initialProperties(SharedProperties::softMetal) - .blockstate((c, p) -> p.directionalBlock(c.get(), s -> AssetLookup.partialBaseModel(c, p))) + .blockstate((c, p) -> p.directionalBlock(c.get(), AssetLookup.forPowered(c, p))) .item(FunnelItem::new) .transform(customItemModel()) .register(); public static final BlockEntry BELT_FUNNEL = REGISTRATE.block("belt_funnel", BeltFunnelBlock::new) .initialProperties(SharedProperties::softMetal) - .blockstate((c, p) -> p.horizontalBlock(c.get(), - s -> AssetLookup.partialBaseModel(c, p, s.get(BeltFunnelBlock.SHAPE) - .getName()))) + .blockstate((c, p) -> p.horizontalBlock(c.get(), s -> { + String shape = s.get(BeltFunnelBlock.SHAPE) + .getName(); + return s.get(BeltFunnelBlock.POWERED) ? AssetLookup.partialBaseModel(c, p, shape, "powered") + : AssetLookup.partialBaseModel(c, p, shape); + })) .loot((p, b) -> p.registerDropping(b, REALITY_FUNNEL.get())) .register(); diff --git a/src/main/java/com/simibubi/create/AllShapes.java b/src/main/java/com/simibubi/create/AllShapes.java index e690a9169..9404ed41c 100644 --- a/src/main/java/com/simibubi/create/AllShapes.java +++ b/src/main/java/com/simibubi/create/AllShapes.java @@ -65,7 +65,10 @@ public class AllShapes { NIXIE_TUBE_CEILING = shape(0, 12, 0, 16, 16, 16).add(9, 1, 5, 15, 16, 11) .add(1, 1, 5, 7, 16, 11) .forHorizontalAxis(), - REALITY_FUNNEL = shape(2, -2, 2, 14, 2, 14).forDirectional(UP), + REALITY_FUNNEL = shape(3, -2, 3, 13, 2, 13).add(2, 2, 2, 14, 6, 14) + .add(1, 6, 1, 15, 10, 15) + .add(0, 10, 0, 16, 16, 16) + .forDirectional(UP), BELT_FUNNEL_RETRACTED = shape(3, -5, 14, 13, 13, 19).add(0, -5, 8, 16, 16, 14) .forHorizontal(NORTH), BELT_FUNNEL_DEFAULT = shape(3, -5, 12, 13, 13, 17).add(0, -5, 6, 16, 16, 12) diff --git a/src/main/java/com/simibubi/create/content/logistics/block/realityFunnel/BeltFunnelBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/realityFunnel/BeltFunnelBlock.java index 48fa9c93f..fb7217329 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/realityFunnel/BeltFunnelBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/realityFunnel/BeltFunnelBlock.java @@ -17,9 +17,11 @@ import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.BlockItemUseContext; import net.minecraft.item.ItemStack; import net.minecraft.item.ItemUseContext; +import net.minecraft.state.BooleanProperty; import net.minecraft.state.EnumProperty; import net.minecraft.state.IProperty; import net.minecraft.state.StateContainer.Builder; +import net.minecraft.state.properties.BlockStateProperties; import net.minecraft.util.ActionResultType; import net.minecraft.util.Direction; import net.minecraft.util.IStringSerializable; @@ -36,11 +38,10 @@ import net.minecraft.world.World; public class BeltFunnelBlock extends HorizontalBlock implements IWrenchable { public static final IProperty SHAPE = EnumProperty.create("shape", Shape.class); + public static final BooleanProperty POWERED = BlockStateProperties.POWERED; public enum Shape implements IStringSerializable { - RETRACTED(AllShapes.BELT_FUNNEL_RETRACTED), - DEFAULT(AllShapes.BELT_FUNNEL_DEFAULT), - EXTENDED(AllShapes.BELT_FUNNEL_EXTENDED); + RETRACTED(AllShapes.BELT_FUNNEL_RETRACTED), EXTENDED(AllShapes.BELT_FUNNEL_EXTENDED); VoxelShaper shaper; @@ -56,14 +57,15 @@ public class BeltFunnelBlock extends HorizontalBlock implements IWrenchable { public BeltFunnelBlock(Properties p_i48377_1_) { super(p_i48377_1_); - setDefaultState(getDefaultState().with(SHAPE, Shape.DEFAULT)); + setDefaultState(getDefaultState().with(SHAPE, Shape.RETRACTED) + .with(POWERED, false)); } @Override protected void fillStateContainer(Builder p_206840_1_) { - super.fillStateContainer(p_206840_1_.add(HORIZONTAL_FACING, SHAPE)); + super.fillStateContainer(p_206840_1_.add(HORIZONTAL_FACING, SHAPE, POWERED)); } - + @Override public VoxelShape getShape(BlockState state, IBlockReader p_220053_2_, BlockPos p_220053_3_, ISelectionContext p_220053_4_) { @@ -71,8 +73,9 @@ public class BeltFunnelBlock extends HorizontalBlock implements IWrenchable { } @Override - public BlockState getStateForPlacement(BlockItemUseContext p_196258_1_) { - return updateShape(super.getStateForPlacement(p_196258_1_), p_196258_1_.getWorld(), p_196258_1_.getPos()); + public BlockState getStateForPlacement(BlockItemUseContext ctx) { + return updateShape(super.getStateForPlacement(ctx), ctx.getWorld(), ctx.getPos()).with(POWERED, ctx.getWorld() + .isBlockPowered(ctx.getPos())); } @Override @@ -80,7 +83,7 @@ public class BeltFunnelBlock extends HorizontalBlock implements IWrenchable { PlayerEntity player) { return AllBlocks.REALITY_FUNNEL.asStack(); } - + @Override public BlockState updatePostPlacement(BlockState state, Direction direction, BlockState neighbour, IWorld world, BlockPos pos, BlockPos p_196271_6_) { @@ -126,10 +129,14 @@ public class BeltFunnelBlock extends HorizontalBlock implements IWrenchable { if (fromPos.equals(pos.offset(blockFacing))) if (!isValidPosition(state, worldIn, pos)) worldIn.destroyBlock(pos, true); + + boolean previouslyPowered = state.get(POWERED); + if (previouslyPowered != worldIn.isBlockPowered(pos)) + worldIn.setBlockState(pos, state.cycle(POWERED), 2); } private BlockState updateShape(BlockState state, ILightReader world, BlockPos pos) { - state = state.with(SHAPE, Shape.DEFAULT); + state = state.with(SHAPE, Shape.RETRACTED); BlockState neighbour = world.getBlockState(pos.offset(state.get(HORIZONTAL_FACING))); if (canConnectTo(state, neighbour)) return state.with(SHAPE, Shape.EXTENDED); diff --git a/src/main/java/com/simibubi/create/content/logistics/block/realityFunnel/RealityFunnelBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/realityFunnel/RealityFunnelBlock.java index 6d367e59f..e3873d576 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/realityFunnel/RealityFunnelBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/realityFunnel/RealityFunnelBlock.java @@ -7,6 +7,9 @@ import com.simibubi.create.foundation.block.ProperDirectionalBlock; import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.item.BlockItemUseContext; +import net.minecraft.state.BooleanProperty; +import net.minecraft.state.StateContainer.Builder; +import net.minecraft.state.properties.BlockStateProperties; import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.shapes.ISelectionContext; @@ -18,15 +21,25 @@ import net.minecraft.world.World; public class RealityFunnelBlock extends ProperDirectionalBlock { + public static final BooleanProperty POWERED = BlockStateProperties.POWERED; + public RealityFunnelBlock(Properties p_i48415_1_) { super(p_i48415_1_); + setDefaultState(getDefaultState().with(POWERED, false)); } @Override public BlockState getStateForPlacement(BlockItemUseContext context) { - return getDefaultState().with(FACING, context.getFace()); + return getDefaultState().with(FACING, context.getFace()) + .with(POWERED, context.getWorld() + .isBlockPowered(context.getPos())); } - + + @Override + protected void fillStateContainer(Builder builder) { + super.fillStateContainer(builder.add(POWERED)); + } + @Override public VoxelShape getShape(BlockState state, IBlockReader p_220053_2_, BlockPos p_220053_3_, ISelectionContext p_220053_4_) { @@ -58,6 +71,10 @@ public class RealityFunnelBlock extends ProperDirectionalBlock { if (fromPos.equals(pos.offset(blockFacing))) if (!isValidPosition(state, worldIn, pos)) worldIn.destroyBlock(pos, true); + + boolean previouslyPowered = state.get(POWERED); + if (previouslyPowered != worldIn.isBlockPowered(pos)) + worldIn.setBlockState(pos, state.cycle(POWERED), 2); } @Override diff --git a/src/main/java/com/simibubi/create/content/logistics/block/redstone/RedstoneLinkBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/redstone/RedstoneLinkBlock.java index 80ded0153..1933627ff 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/redstone/RedstoneLinkBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/redstone/RedstoneLinkBlock.java @@ -1,5 +1,6 @@ package com.simibubi.create.content.logistics.block.redstone; +import com.simibubi.create.AllBlocks; import com.simibubi.create.AllShapes; import com.simibubi.create.AllTileEntities; import com.simibubi.create.content.contraptions.wrench.IWrenchable; @@ -164,6 +165,8 @@ public class RedstoneLinkBlock extends ProperDirectionalBlock implements ITEPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D14&6lK~z{r?Up@E z6hRcn-z?l65Wo8pdDw4wc-VXd|BC+sSjC<{ z;LF7&DEjl3{~{GjvGZ)`2(T!ZFz7xT3LuQ^I=Y{=UiKt05CK{XkNG*-KozfCZtY&PImQG$C$eAGM#=HQM>D9naV-urvXwQD< z&hrUTRaHf2j?`cSwjNN&rT#!~n3YOr7Y%z9k6zDtJMMe=8H)-8H1PI^kY_C85lU54 zVZ@D|W^d(aB-ok${Ix>k-x_FPVS%6kY;|?DGe1AC6hT|wc3Z|IGIn-)dE@gcQW}d2 zYOHUeTm7SMS7EMoHPQIg2#N36K(&B#BFEx)Urc&OWJ2A6p?3&Q(9+V9>P#k+$}+K7 zOf6JiUaoB0;S7yTZ>O1=8LF+VRaPoMQUTA(g&nDcsI07{#l=M^;>e)LuZSlLFOJC| zp0c55;K+yUU1Js`6niCn!`GfUen~>&w23}Dip}<)p9+h)zyN|1TpIo}j`=H0Qs=b>Rf9Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!TPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D1;I%~K~z{rwO89u z990+c-253aOYUG?_dk#DKPj3-aJM4E}4|V_6pY?0xCGpMRy& zq5yTYbclXqJfBR{q=JG1>g?=1k^!;>HlABprOEkwGungKP=5+&wL`fp^+gGA<}(0CzXx}L5>O^@~mKJx6 z*ECI{a2)WNemj&|iwlnPpGs#$lBu*r1d)coSK-a1?REK#fUFpEiZaNnM&M0rr?dJ$OBJMF}KfFW)DoEY2DI+(ZcQCTH^=*_yrhoi7uV>{(uT;y+z?Gghbg)^Mzaf}w6d`+4yCdg zdADz*Pu7zi;7Kf&kd5KF@;;Pj%ABeNudV>Ysw)~r&u|KX^{p8x=u;n+w!!dtlZ z8h$Ro{p$f3^F~p7`;BIKLg&FjR4_+OfcKzt-&^l}I_f(p0`FgLwbr(h^!e9Qu2Bzy zH(#u`aK|vvDv_Et-psCQ(5si_g4{Yk^!AGWZ$LE5O7cYawxH4#-u-06HP*nUk>tS>IdT$ze4)9~~njnCbq z=-u_)NBe+IDPYQm6cw5xO2@|D%>hI}Zbb0VH2ErKYMe(unM_2Ru^m^yiiP1I6@-Fh zaT{TOv>D*-e^mpQ&Oa`{5Ku0D+nX;6Wh;Pr0a-=E{g3GhIm2}fS2Gyo6@0K2i}O1? z&)=#Z_ZA^~-C&kM6lWLKXkvbeCZm6eOhuQRw{l1(`QUO?W3V6Zvvhh7-G$q6p1 za5zAglS@S`fbvEe1xg379yhhDhq|%<@7N1Bnf2A>)KFb2(pXc@TwUZ!Wk~^5l$_*~ ztdJsS%jD!!o573yz*z!b0dzjlaKEsPwA}x^@IB51F#x^!`&b|KkM>jdp#AF=oOY1j zp+34X{F{v7EI$rt2+dJ|vtVT-PG5dABV6(96HiJvp{7v0rr)3prvSx@Lk^CB3Bj5b zr9m=Yd*PfMMhg4;R#kf}mLkwBx(4*Ryb_o3l0ut$0UTZ^P!wj^4AI)wwv6HGhHD(U zN8Kv`AtESs)s37t{9mBaPCUsuW{Tt@Q@_A;bV6=6+q(&Qt}Nx$-5L@7+V$Jowd+Ke zUus|ja6dRDR9smW-a}#lo}H*`ILIUvczTd1c#l$$4uA-J^u?%H$p+YyjQcU+J0B0r eP)<{98FWQhbW?9;ba!ELWdLwtX>N2bZe?^J zG%heMGBNQWX_Wu~2xUn`K~#8N?V4F{6h{<=`3w93o)VHsHbR&O)+ZzcHny>`!6*rP z5LqCQhXgDyU_dszu~`fT2PrR60*VwRB>%3{-yP2QPPy9C-7~U10ZV79ySA=#>elUB z)n0dY=%eJ~$xo{|fBchb3Vt~AnSpvE-?b$Zmo{0-J?QA@NOtYomF(NMFG>H_)x)pT zUnFlH9ZyI>SbptddlF*!o3rduy9!Xx^8nSDMk-tyE&-lS9Lf#GHFlvb zdHv{wr3e7=+3~(5m>%slAP78a9$p3ruyg0m+)H53o;}M7zzmiV0O1gT6akoFk$y7K zpFF+ZUnPHcxI6jd$q8#$^YAjj2W;QIy^sLi-Q9^&2FySJi2EQ@3Y4( zWsM`i^jNQv2O^Ik_pbDq08Oy~d_YkP7#J8Z0Z19J)-L4`!cT18yg3)BOB+o8x0z$r zC4c}Sd1l@ONK?w2VgZc`;MXqYkP*3!8#fv@Y}il(<*OcTn03U^n@R$NJq>S?%lgLy^YuLfH=;Nw*aZ1Im%@Ln0kz~2X*QR zaQpIs>dcFLQw3lE+qP}X9S0zQe+~M9Q(jhp(RcljA^`7s$ZHuOfXH*t5+JsT4w8<- za22%#1w)|GK&V+3Fn*yu?dMBNC4gq$69SdR8FvfHr2K&X?qc z{e*;L0%(m%fQ6|eO9X(tgyfpMtfixT;0H|^&yfJE^B5!mb!j6%B43gh_R}l@LQ5hq zYw0N8M}eyW`^h7KoXpF~BSz%sTSK`7$XYte_c6d~z<%-wpg?2p`atT;`b>yW0P6cN zm%J>?Q9j^WeXKO>CnO93pHfFohI7KlSNrS?F-rh1T$TW9$^t^dF#+=UfKW*CvMgs! zSwM_*c*3NiGt27(LIJWYM}h*b)yGQ1enP@A0rL8QP=GAUk)VKU z^|8{hpO7#E*1ZB60t~M8u_Pt{^~0r;WjPYGO!U@F*iT3pkf)S7GG#nAAuT4IM}U>^ z0Zfi!d-_)DvFu(z0||+H0rFaawkDUbF89tCa zo#;0qssdTvS>=75QS0A>NP4qFWp04wm0 z&m(k#)c;>ufQOb`43r5h#b}4E28hWwc^~Ex^J5^|VXL8`I3U(xs{wO{WT`kH)?urG zCBW>KiUVRDwi;Lh{3n=w3?1vS*B-CK*=v1O%#0mO?xq$(41fR#hChgQ*lKw11*j~6 z50T)9Nbo}>_zv$?Bp4FJA&Q{#xF+9UgEeIVY@q=Msv$UE0RCRvZb)Iy9JpZOZyujC zP!2f5&_7kr-yAfkZYcqzsvtGF_DYBC>OtoRML-*#1tB>*JU!3}6yW+kuRjiD-qj07L z0K|Fa@ZKf(0CY?&ju3PVsjzJp5TUF9!{;gjh&(Xz>1=cSCddkOoJX6|0x-+GZ+X`e zc>()(^mHSlwN-==bsG_Y=LwJk+WHDj+YV!L2tcqw#HBUG283OhEMTPs7(d@`&kM`y zfi_I0nIGoLz{v>v|&7D1sM6Zt-JsnE)aEb%mg@a z`SIa9WhJ^&JB1mG-S_-iLXULSw}oT!Mr zkHI-_r;L7DMgStgq83ou2`(Np0h}MRuP-h|Oq#j`WQ-*&%Yq_UNI)hmuLs)LYful) zYXLOG#ABNc+6x+B*ggdHRF^a?&w|=CBEZC@P04?_nQw=g@zu-#0000