From ea7cca31d52f05c57c7081d7c0285c771bd2593f Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Wed, 23 Sep 2020 21:40:23 +0300 Subject: [PATCH] Recipes --- .../java/ru/betterend/blocks/BlockBase.java | 20 ++++ .../betterend/blocks/BlockEndstoneDust.java | 35 +++++++ .../ru/betterend/blocks/BlockWetMycelium.java | 3 +- .../mixin/client/WorldRendererMixin.java | 1 - .../mixin/common/RecipeManagerMixin.java | 57 +++++++++++ .../mixin/recipe/EndRecipeManager.java | 43 ++++++++ .../betterend/mixin/recipe/RecipeBuilder.java | 93 ++++++++++++++++++ .../ru/betterend/registry/BlockRegistry.java | 2 + .../betterend/world/generator/BiomeMap.java | 2 +- .../betterend/blockstates/endstone_dust.json | 70 +++++++++++++ .../assets/betterend/lang/en_us.json | 5 + .../assets/betterend/lang/ru_ru.json | 5 + .../betterend/models/block/endstone_dust.json | 6 ++ .../betterend/models/item/endstone_dust.json | 3 + .../textures/block/endstone_dust.png | Bin 0 -> 1874 bytes 15 files changed, 341 insertions(+), 4 deletions(-) create mode 100644 src/main/java/ru/betterend/blocks/BlockBase.java create mode 100644 src/main/java/ru/betterend/blocks/BlockEndstoneDust.java create mode 100644 src/main/java/ru/betterend/mixin/common/RecipeManagerMixin.java create mode 100644 src/main/java/ru/betterend/mixin/recipe/EndRecipeManager.java create mode 100644 src/main/java/ru/betterend/mixin/recipe/RecipeBuilder.java create mode 100644 src/main/resources/assets/betterend/blockstates/endstone_dust.json create mode 100644 src/main/resources/assets/betterend/lang/en_us.json create mode 100644 src/main/resources/assets/betterend/lang/ru_ru.json create mode 100644 src/main/resources/assets/betterend/models/block/endstone_dust.json create mode 100644 src/main/resources/assets/betterend/models/item/endstone_dust.json create mode 100644 src/main/resources/assets/betterend/textures/block/endstone_dust.png diff --git a/src/main/java/ru/betterend/blocks/BlockBase.java b/src/main/java/ru/betterend/blocks/BlockBase.java new file mode 100644 index 00000000..af3607b5 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/BlockBase.java @@ -0,0 +1,20 @@ +package ru.betterend.blocks; + +import java.util.Collections; +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.item.ItemStack; +import net.minecraft.loot.context.LootContext; + +public class BlockBase extends Block { + public BlockBase(Settings settings) { + super(settings); + } + + @Override + public List getDroppedStacks(BlockState state, LootContext.Builder builder) { + return Collections.singletonList(new ItemStack(this)); + } +} diff --git a/src/main/java/ru/betterend/blocks/BlockEndstoneDust.java b/src/main/java/ru/betterend/blocks/BlockEndstoneDust.java new file mode 100644 index 00000000..77843c7f --- /dev/null +++ b/src/main/java/ru/betterend/blocks/BlockEndstoneDust.java @@ -0,0 +1,35 @@ +package ru.betterend.blocks; + +import java.util.Collections; +import java.util.List; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.block.FallingBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.loot.context.LootContext; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.BlockView; +import ru.betterend.util.MHelper; + +public class BlockEndstoneDust extends FallingBlock { + @Environment(EnvType.CLIENT) + private static final int COLOR = MHelper.color(226, 239, 168); + + public BlockEndstoneDust() { + super(FabricBlockSettings.copyOf(Blocks.SAND).materialColor(Blocks.END_STONE.getDefaultMaterialColor())); + } + + @Override + public List getDroppedStacks(BlockState state, LootContext.Builder builder) { + return Collections.singletonList(new ItemStack(this)); + } + + @Environment(EnvType.CLIENT) + public int getColor(BlockState state, BlockView world, BlockPos pos) { + return COLOR; + } +} diff --git a/src/main/java/ru/betterend/blocks/BlockWetMycelium.java b/src/main/java/ru/betterend/blocks/BlockWetMycelium.java index ae291fda..a56e5772 100644 --- a/src/main/java/ru/betterend/blocks/BlockWetMycelium.java +++ b/src/main/java/ru/betterend/blocks/BlockWetMycelium.java @@ -1,10 +1,9 @@ package ru.betterend.blocks; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.Block; import net.minecraft.block.Blocks; -public class BlockWetMycelium extends Block { +public class BlockWetMycelium extends BlockBase { public BlockWetMycelium() { super(FabricBlockSettings.copyOf(Blocks.END_STONE)); } diff --git a/src/main/java/ru/betterend/mixin/client/WorldRendererMixin.java b/src/main/java/ru/betterend/mixin/client/WorldRendererMixin.java index 86bee902..bb6e2e7e 100644 --- a/src/main/java/ru/betterend/mixin/client/WorldRendererMixin.java +++ b/src/main/java/ru/betterend/mixin/client/WorldRendererMixin.java @@ -27,7 +27,6 @@ import net.minecraft.client.util.math.Vector3f; import net.minecraft.client.world.ClientWorld; import net.minecraft.util.Identifier; import net.minecraft.util.math.Quaternion; - import ru.betterend.BetterEnd; import ru.betterend.util.MHelper; diff --git a/src/main/java/ru/betterend/mixin/common/RecipeManagerMixin.java b/src/main/java/ru/betterend/mixin/common/RecipeManagerMixin.java new file mode 100644 index 00000000..0a896b5c --- /dev/null +++ b/src/main/java/ru/betterend/mixin/common/RecipeManagerMixin.java @@ -0,0 +1,57 @@ +package ru.betterend.mixin.common; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import com.google.gson.JsonElement; +import net.minecraft.inventory.Inventory; +import net.minecraft.recipe.Recipe; +import net.minecraft.recipe.RecipeManager; +import net.minecraft.recipe.RecipeType; +import net.minecraft.resource.ResourceManager; +import net.minecraft.util.Identifier; +import net.minecraft.util.Util; +import net.minecraft.util.profiler.Profiler; +import net.minecraft.world.World; +import ru.betterend.mixin.recipe.EndRecipeManager; + +@Mixin(RecipeManager.class) +public class RecipeManagerMixin +{ + @Shadow + private Map, Map>> recipes; + + @Inject(method = "apply", at = @At(value = "TAIL")) + private void setRecipes(Map map, ResourceManager resourceManager, Profiler profiler, CallbackInfo info) + { + recipes = EndRecipeManager.getMap(recipes); + } + + @Shadow + private > Map> getAllOfType(RecipeType type) { return null; } + + @Overwrite + public > Optional getFirstMatch(RecipeType type, C inventory, World world) + { + Collection> values = getAllOfType(type).values(); + List> list = new ArrayList>(values); + list.sort((v1, v2) -> { + boolean b1 = v1.getId().getNamespace().equals("minecraft"); + boolean b2 = v2.getId().getNamespace().equals("minecraft"); + return b1 ^ b2 ? (b1 ? 1 : -1) : 0; + }); + + return list.stream().flatMap((recipe) -> { + return Util.stream(type.get(recipe, world, inventory)); + }).findFirst(); + } +} \ No newline at end of file diff --git a/src/main/java/ru/betterend/mixin/recipe/EndRecipeManager.java b/src/main/java/ru/betterend/mixin/recipe/EndRecipeManager.java new file mode 100644 index 00000000..15e0bf6b --- /dev/null +++ b/src/main/java/ru/betterend/mixin/recipe/EndRecipeManager.java @@ -0,0 +1,43 @@ +package ru.betterend.mixin.recipe; + +import java.util.Map; +import com.google.common.collect.Maps; +import net.minecraft.recipe.Recipe; +import net.minecraft.recipe.RecipeType; +import net.minecraft.util.Identifier; + +public class EndRecipeManager { + private static final Map, Map>> RECIPES = Maps.newHashMap(); + + public static void addRecipe(RecipeType type, Recipe recipe) { + Map> list = RECIPES.get(type); + if (list == null) { + list = Maps.newHashMap(); + RECIPES.put(type, list); + } + list.put(recipe.getId(), recipe); + } + + public static Map, Map>> getMap(Map, Map>> recipes) { + Map, Map>> result = Maps.newHashMap(); + + for (RecipeType type : recipes.keySet()) { + Map> typeList = Maps.newHashMap(); + typeList.putAll(recipes.get(type)); + result.put(type, typeList); + } + + for (RecipeType type : RECIPES.keySet()) { + Map> list = RECIPES.get(type); + if (list != null) { + Map> typeList = result.get(type); + list.forEach((id, recipe) -> { + if (!typeList.containsKey(id)) + typeList.put(id, recipe); + }); + } + } + + return result; + } +} \ No newline at end of file diff --git a/src/main/java/ru/betterend/mixin/recipe/RecipeBuilder.java b/src/main/java/ru/betterend/mixin/recipe/RecipeBuilder.java new file mode 100644 index 00000000..12da3cbf --- /dev/null +++ b/src/main/java/ru/betterend/mixin/recipe/RecipeBuilder.java @@ -0,0 +1,93 @@ +package ru.betterend.mixin.recipe; + +import java.util.Map; + +import com.google.common.collect.Maps; + +import net.minecraft.block.Block; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.recipe.CraftingRecipe; +import net.minecraft.recipe.Ingredient; +import net.minecraft.recipe.RecipeType; +import net.minecraft.recipe.ShapedRecipe; +import net.minecraft.recipe.ShapelessRecipe; +import net.minecraft.tag.Tag; +import net.minecraft.util.Identifier; +import net.minecraft.util.collection.DefaultedList; +import ru.betterend.BetterEnd; + +public class RecipeBuilder { + private final String name; + private final Item output; + + private String group = ""; + private RecipeType type = RecipeType.CRAFTING; + private boolean shaped = true; + private String[] shape = new String[] {"#"}; + private Map materialKeys = Maps.newHashMap(); + private int count; + + public RecipeBuilder(String name, Item output) { + this.name = name; + this.output = output; + } + + public RecipeBuilder(String name, Block output) { + this.name = name; + this.output = output.asItem(); + } + + public RecipeBuilder setGroup(String group) { + this.group = group; + return this; + } + + public RecipeBuilder setShape(String[] shape) { + this.shape = shape; + return this; + } + + public RecipeBuilder addMaterial(char key, Item value) { + materialKeys.put(key, Ingredient.ofItems(value)); + return this; + } + + public RecipeBuilder addMaterial(char key, Block value) { + materialKeys.put(key, Ingredient.ofItems(value)); + return this; + } + + public RecipeBuilder addMaterial(char key, Tag value) { + materialKeys.put(key, Ingredient.fromTag(value)); + return this; + } + + public RecipeBuilder setOutputCount(int count) { + this.count = count; + return this; + } + + private DefaultedList getMaterials(int width, int height) { + DefaultedList materials = DefaultedList.ofSize(width * height, Ingredient.EMPTY); + for (String line: shape) { + for (int i = 0; i < width; i++) { + char c = line.charAt(i); + Ingredient material = materialKeys.get(c); + materials.add(material == null ? Ingredient.EMPTY : material); + } + } + return materials; + } + + public void build() { + int height = shape.length; + int width = shape[0].length(); + ItemStack result = new ItemStack(output, count); + Identifier id = new Identifier(BetterEnd.MOD_ID, name); + DefaultedList materials = getMaterials(width, height); + + CraftingRecipe recipe = shaped ? new ShapedRecipe(id, group, width, height, materials, result) : new ShapelessRecipe(id, group, result, materials); + EndRecipeManager.addRecipe(type, recipe); + } +} diff --git a/src/main/java/ru/betterend/registry/BlockRegistry.java b/src/main/java/ru/betterend/registry/BlockRegistry.java index e200f80f..4f8ed194 100644 --- a/src/main/java/ru/betterend/registry/BlockRegistry.java +++ b/src/main/java/ru/betterend/registry/BlockRegistry.java @@ -6,10 +6,12 @@ import net.minecraft.item.Item; import net.minecraft.util.Identifier; import net.minecraft.util.registry.Registry; import ru.betterend.BetterEnd; +import ru.betterend.blocks.BlockEndstoneDust; import ru.betterend.blocks.BlockWetMycelium; import ru.betterend.tab.CreativeTab; public class BlockRegistry { + public static final Block ENDSTONE_DUST = registerBlock("endstone_dust", new BlockEndstoneDust()); public static final Block WET_MYCELIUM = registerBlock("wet_mycelium", new BlockWetMycelium()); public static void register() {} diff --git a/src/main/java/ru/betterend/world/generator/BiomeMap.java b/src/main/java/ru/betterend/world/generator/BiomeMap.java index fd8b7897..ce02d2ab 100644 --- a/src/main/java/ru/betterend/world/generator/BiomeMap.java +++ b/src/main/java/ru/betterend/world/generator/BiomeMap.java @@ -59,7 +59,7 @@ public class BiomeMap pz = pz / 2 + i; } - ChunkPos cpos = new ChunkPos(MHelper.floor((double) x / BiomeChunk.WIDTH), MHelper.floor((double) z / BiomeChunk.WIDTH)); + ChunkPos cpos = new ChunkPos(MHelper.floor(x / BiomeChunk.WIDTH), MHelper.floor(z / BiomeChunk.WIDTH)); BiomeChunk chunk = MAPS.get(cpos); if (chunk == null) { diff --git a/src/main/resources/assets/betterend/blockstates/endstone_dust.json b/src/main/resources/assets/betterend/blockstates/endstone_dust.json new file mode 100644 index 00000000..53621b7a --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/endstone_dust.json @@ -0,0 +1,70 @@ +{ + "variants": { + "": [ + { "model": "betterend:block/endstone_dust" }, + { "model": "betterend:block/endstone_dust", "y": 90 }, + { "model": "betterend:block/endstone_dust", "y": 180 }, + { "model": "betterend:block/endstone_dust", "y": 270 }, + { "model": "betterend:block/endstone_dust", "x": 90 }, + { "model": "betterend:block/endstone_dust", "x": 90, "y": 90 }, + { "model": "betterend:block/endstone_dust", "x": 90, "y": 180 }, + { "model": "betterend:block/endstone_dust", "x": 90, "y": 270 }, + { "model": "betterend:block/endstone_dust", "x": 180 }, + { "model": "betterend:block/endstone_dust", "x": 180, "y": 90 }, + { "model": "betterend:block/endstone_dust", "x": 180, "y": 180 }, + { "model": "betterend:block/endstone_dust", "x": 180, "y": 270 }, + { "model": "betterend:block/endstone_dust", "x": 270 }, + { "model": "betterend:block/endstone_dust", "x": 270, "y": 90 }, + { "model": "betterend:block/endstone_dust", "x": 270, "y": 180 }, + { "model": "betterend:block/endstone_dust", "x": 270, "y": 270 }, + { "model": "betterend:block/endstone_dust", "z": 90 }, + { "model": "betterend:block/endstone_dust", "z": 90, "y": 90 }, + { "model": "betterend:block/endstone_dust", "z": 90, "y": 180 }, + { "model": "betterend:block/endstone_dust", "z": 90, "y": 270 }, + { "model": "betterend:block/endstone_dust", "z": 90, "x": 90 }, + { "model": "betterend:block/endstone_dust", "z": 90, "x": 90, "y": 90 }, + { "model": "betterend:block/endstone_dust", "z": 90, "x": 90, "y": 180 }, + { "model": "betterend:block/endstone_dust", "z": 90, "x": 90, "y": 270 }, + { "model": "betterend:block/endstone_dust", "z": 90, "x": 180 }, + { "model": "betterend:block/endstone_dust", "z": 90, "x": 180, "y": 90 }, + { "model": "betterend:block/endstone_dust", "z": 90, "x": 180, "y": 180 }, + { "model": "betterend:block/endstone_dust", "z": 90, "x": 180, "y": 270 }, + { "model": "betterend:block/endstone_dust", "z": 90, "x": 270 }, + { "model": "betterend:block/endstone_dust", "z": 90, "x": 270, "y": 90 }, + { "model": "betterend:block/endstone_dust", "z": 90, "x": 270, "y": 180 }, + { "model": "betterend:block/endstone_dust", "z": 90, "x": 270, "y": 270 }, + { "model": "betterend:block/endstone_dust", "z": 180 }, + { "model": "betterend:block/endstone_dust", "z": 180, "y": 90 }, + { "model": "betterend:block/endstone_dust", "z": 180, "y": 180 }, + { "model": "betterend:block/endstone_dust", "z": 180, "y": 270 }, + { "model": "betterend:block/endstone_dust", "z": 180, "x": 90 }, + { "model": "betterend:block/endstone_dust", "z": 180, "x": 90, "y": 90 }, + { "model": "betterend:block/endstone_dust", "z": 180, "x": 90, "y": 180 }, + { "model": "betterend:block/endstone_dust", "z": 180, "x": 90, "y": 270 }, + { "model": "betterend:block/endstone_dust", "z": 180, "x": 180 }, + { "model": "betterend:block/endstone_dust", "z": 180, "x": 180, "y": 90 }, + { "model": "betterend:block/endstone_dust", "z": 180, "x": 180, "y": 180 }, + { "model": "betterend:block/endstone_dust", "z": 180, "x": 180, "y": 270 }, + { "model": "betterend:block/endstone_dust", "z": 180, "x": 270 }, + { "model": "betterend:block/endstone_dust", "z": 180, "x": 270, "y": 90 }, + { "model": "betterend:block/endstone_dust", "z": 180, "x": 270, "y": 180 }, + { "model": "betterend:block/endstone_dust", "z": 180, "x": 270, "y": 270 }, + { "model": "betterend:block/endstone_dust", "z": 270 }, + { "model": "betterend:block/endstone_dust", "z": 270, "y": 90 }, + { "model": "betterend:block/endstone_dust", "z": 270, "y": 180 }, + { "model": "betterend:block/endstone_dust", "z": 270, "y": 270 }, + { "model": "betterend:block/endstone_dust", "z": 270, "x": 90 }, + { "model": "betterend:block/endstone_dust", "z": 270, "x": 90, "y": 90 }, + { "model": "betterend:block/endstone_dust", "z": 270, "x": 90, "y": 180 }, + { "model": "betterend:block/endstone_dust", "z": 270, "x": 90, "y": 270 }, + { "model": "betterend:block/endstone_dust", "z": 270, "x": 180 }, + { "model": "betterend:block/endstone_dust", "z": 270, "x": 180, "y": 90 }, + { "model": "betterend:block/endstone_dust", "z": 270, "x": 180, "y": 180 }, + { "model": "betterend:block/endstone_dust", "z": 270, "x": 180, "y": 270 }, + { "model": "betterend:block/endstone_dust", "z": 270, "x": 270 }, + { "model": "betterend:block/endstone_dust", "z": 270, "x": 270, "y": 90 }, + { "model": "betterend:block/endstone_dust", "z": 270, "x": 270, "y": 180 }, + { "model": "betterend:block/endstone_dust", "z": 270, "x": 270, "y": 270 } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/lang/en_us.json b/src/main/resources/assets/betterend/lang/en_us.json new file mode 100644 index 00000000..1a6d691e --- /dev/null +++ b/src/main/resources/assets/betterend/lang/en_us.json @@ -0,0 +1,5 @@ +{ + "itemGroup.betterend.items": "Better End", + "block.betterend.wet_mycelium": "Wet Mycelium", + "block.betterend.endstone_dust": "End Stone Dust" +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/lang/ru_ru.json b/src/main/resources/assets/betterend/lang/ru_ru.json new file mode 100644 index 00000000..3583b7f6 --- /dev/null +++ b/src/main/resources/assets/betterend/lang/ru_ru.json @@ -0,0 +1,5 @@ +{ + "itemGroup.betterend.items": "Улучшенный Край", + "block.betterend.wet_mycelium": "Влажный мицелий", + "block.betterend.endstone_dust": "Эндерняковая пыль" +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/endstone_dust.json b/src/main/resources/assets/betterend/models/block/endstone_dust.json new file mode 100644 index 00000000..202ee9bb --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/endstone_dust.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "betterend:block/endstone_dust" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/item/endstone_dust.json b/src/main/resources/assets/betterend/models/item/endstone_dust.json new file mode 100644 index 00000000..b0b80624 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/endstone_dust.json @@ -0,0 +1,3 @@ +{ + "parent": "betterend:block/endstone_dust" +} diff --git a/src/main/resources/assets/betterend/textures/block/endstone_dust.png b/src/main/resources/assets/betterend/textures/block/endstone_dust.png new file mode 100644 index 0000000000000000000000000000000000000000..066b470b555e0e3c6d494e90979c73e55ccc676f GIT binary patch literal 1874 zcmbVNZD<>19KUXLxYTLU4=w9nuGgU}dbzhGmphx*m~=L3(%MB@8I(S`dy<^Zz4Y$d zq#fv}x>DV68}v&pbFLp`Ov?H}5VqMm5tMF)(up5L*orS5qZDDtP!XTYo1JvC7;?G0 z=YG%c_xr!xKVu!S7k0RIx-bme5orr|qI0!#JiG<{o;aEIq0@Gw?KKO-s-AF;3T$Gs z7Q-G|RN~!scl2dZ(p5K*^#pY1R0E+gtf?hu0I3h!cmk#rEkLYYoF#BY4iH`5C>=FI zFs-x=oABUpEG`ZANrFtYG~-P<5fP}+26#@*XqK1@5P4n^T|3JZf#)H1Uw{ZYf_Qhd z0}tsY#Jz4GDKQ=v=LI+8qXpLU49?OFPtiQZa3sx$v`^#&y!auInkgs6&hUYv7P<=% zY1=kLipplQ?kwll%@oB5f{_hY=+70Xsk- zr-cwyqfDz=#WbOWQ8{2xjGJ~s$^&Joj57wzOkP};D42mN)NBi3nKIT$>$YyC_4`nl zAKxQ@QX7qyH8%93s$~hwZXHBn6ce%`+KLYukm`h%K440)br9KXaH289kO_gUn{i#w zlnT{RvW$m9PGS7`{w_t6^{mynZVwCt8wLoLW@(bUJ-pg-lu6!r0D`Qs>@1p zXgyRQSuW1fBFl;#a}N}CjSOt?pI})Mle(z_6tkj&6r>C-Md0O3iXlCtn@AYBNKnje9Cj|leNm}rEd7ex9(Nc-6-Bi%41~The9al19 zOeVZ^f))IvfKpFNoJS^s7xE;>LB9Yzv|nIlr=jybBDN_Os@_oX6*&m|i&q&1&$opL zB&Xd2gyhs2%0zKl*&rXAQZDY#rXeDIK=BLemY%e;z=XjR%H3xAi@KkG3k*Kk{pPA! zu(jU(hW+?I-4~N1rGb`$Xo6CN6A$IgnnG!)e^)L4Y~5Tc!O^gDF3VFE-IV7v)DX3a zrto7`6K`Tz#Z!@RFuwn!+WD;O%5&A%2G3UR8>yV1bB&CTFYms5q~=0RJN|}iraI{9 z1@%GNb+&s<9|F6k8n0YkSoq`WC&J~Uk;&ZYuIb;uTUzb^{M()0%Gq1}RygzXQqRot zRE4+lZo>i4GFBCAeErZ|>%hg@<6G;F`aGla7^X~~Id=Zi&2#Nr>*@3AUb}7X>n%6F zSqQzDsEe@?{D-yW$%?<;dAoV{TMLaL{MM@<*pFO~j$e!Q1rEKtk{TZETK)08`kD)) zJm z_|tD+?Kw7`{`1ZR4d0h;ES-qn+&*?`_V)bgZB;>`a$n8I`j?^WpJwK{mG6g}&AZzw X;x9F<_8i&e{Od(pW8vxNdq@5TbHHjo literal 0 HcmV?d00001