From baebc948d90e7a641a1e5ab7527c3de3d2aee692 Mon Sep 17 00:00:00 2001 From: Ourten Date: Sun, 18 Dec 2016 04:02:51 +0100 Subject: [PATCH] Add JEI integration for fluid generators recipes --- .../api/generator/EFluidGenerator.java | 17 ++++- .../api/generator/FluidGeneratorRecipe.java | 23 +++--- .../api/generator/GeneratorRecipeHelper.java | 2 +- .../compat/jei/TechRebornJeiPlugin.java | 57 +++++++++++---- .../fluid/FluidGeneratorRecipeCategory.java | 66 ++++++++++++++++++ .../fluid/FluidGeneratorRecipeHandler.java | 40 +++++++++++ .../fluid/FluidGeneratorRecipeWrapper.java | 60 ++++++++++++++++ .../assets/techreborn/lang/en_us.lang | 4 ++ .../textures/gui/jei_fluid_generator.png | Bin 0 -> 2350 bytes 9 files changed, 241 insertions(+), 28 deletions(-) create mode 100644 src/main/java/techreborn/compat/jei/generators/fluid/FluidGeneratorRecipeCategory.java create mode 100644 src/main/java/techreborn/compat/jei/generators/fluid/FluidGeneratorRecipeHandler.java create mode 100644 src/main/java/techreborn/compat/jei/generators/fluid/FluidGeneratorRecipeWrapper.java create mode 100644 src/main/resources/assets/techreborn/textures/gui/jei_fluid_generator.png diff --git a/src/main/java/techreborn/api/generator/EFluidGenerator.java b/src/main/java/techreborn/api/generator/EFluidGenerator.java index 31acc5fb4..5f2247a13 100644 --- a/src/main/java/techreborn/api/generator/EFluidGenerator.java +++ b/src/main/java/techreborn/api/generator/EFluidGenerator.java @@ -1,5 +1,20 @@ package techreborn.api.generator; +import javax.annotation.Nonnull; + public enum EFluidGenerator { - THERMAL, GAS, DIESEL, SEMIFLUID + THERMAL("TechReborn.ThermalGenerator"), GAS("TechReborn.GasGenerator"), DIESEL( + "TechReborn.DieselGenerator"), SEMIFLUID("TechReborn.SemifluidGenerator"); + + @Nonnull + private final String recipeID; + + private EFluidGenerator(@Nonnull String recipeID) { + this.recipeID = recipeID; + } + + @Nonnull + public String getRecipeID() { + return recipeID; + } } diff --git a/src/main/java/techreborn/api/generator/FluidGeneratorRecipe.java b/src/main/java/techreborn/api/generator/FluidGeneratorRecipe.java index 109e30f3f..06be35098 100644 --- a/src/main/java/techreborn/api/generator/FluidGeneratorRecipe.java +++ b/src/main/java/techreborn/api/generator/FluidGeneratorRecipe.java @@ -3,34 +3,32 @@ package techreborn.api.generator; import net.minecraftforge.fluids.Fluid; public class FluidGeneratorRecipe { - private Fluid fluid; - private int energyPerMb; + private final EFluidGenerator generatorType; + private final Fluid fluid; + private final int energyPerMb; - public FluidGeneratorRecipe(Fluid fluid, int energyPerMb) + public FluidGeneratorRecipe(Fluid fluid, int energyPerMb, EFluidGenerator generatorType) { this.fluid = fluid; this.energyPerMb = energyPerMb; + this.generatorType = generatorType; } public Fluid getFluid() { return fluid; } - - public void setFluid(Fluid fluid) { - this.fluid = fluid; - } - public int getEnergyPerMb() { return energyPerMb; } - public void setEnergyPerMb(int energyPerMb) { - this.energyPerMb = energyPerMb; + public EFluidGenerator getGeneratorType() { + return generatorType; } @Override public String toString() { - return "FluidGeneratorRecipe [fluid=" + fluid + ", energyPerMb=" + energyPerMb + "]"; + return "FluidGeneratorRecipe [generatorType=" + generatorType + ", fluid=" + fluid + ", energyPerMb=" + + energyPerMb + "]"; } @Override @@ -39,6 +37,7 @@ public class FluidGeneratorRecipe { int result = 1; result = prime * result + energyPerMb; result = prime * result + ((fluid == null) ? 0 : fluid.hashCode()); + result = prime * result + ((generatorType == null) ? 0 : generatorType.hashCode()); return result; } @@ -58,6 +57,8 @@ public class FluidGeneratorRecipe { return false; } else if (!fluid.equals(other.fluid)) return false; + if (generatorType != other.generatorType) + return false; return true; } } diff --git a/src/main/java/techreborn/api/generator/GeneratorRecipeHelper.java b/src/main/java/techreborn/api/generator/GeneratorRecipeHelper.java index 33fa3d76f..3358d5a08 100644 --- a/src/main/java/techreborn/api/generator/GeneratorRecipeHelper.java +++ b/src/main/java/techreborn/api/generator/GeneratorRecipeHelper.java @@ -28,7 +28,7 @@ public class GeneratorRecipeHelper { */ public static void registerFluidRecipe(EFluidGenerator generatorType, Fluid fluidType, int energyPerMb) { fluidRecipes.putIfAbsent(generatorType, new FluidGeneratorRecipeList()); - fluidRecipes.get(generatorType).addRecipe(new FluidGeneratorRecipe(fluidType, energyPerMb)); + fluidRecipes.get(generatorType).addRecipe(new FluidGeneratorRecipe(fluidType, energyPerMb, generatorType)); } /** diff --git a/src/main/java/techreborn/compat/jei/TechRebornJeiPlugin.java b/src/main/java/techreborn/compat/jei/TechRebornJeiPlugin.java index 08758366c..b05a86aeb 100644 --- a/src/main/java/techreborn/compat/jei/TechRebornJeiPlugin.java +++ b/src/main/java/techreborn/compat/jei/TechRebornJeiPlugin.java @@ -11,6 +11,8 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.text.translation.I18n; import reborncore.api.recipe.RecipeHandler; import techreborn.Core; +import techreborn.api.generator.EFluidGenerator; +import techreborn.api.generator.GeneratorRecipeHelper; import techreborn.api.reactor.FusionReactorRecipeHelper; import techreborn.api.recipe.machines.AssemblingMachineRecipe; import techreborn.api.recipe.machines.ImplosionCompressorRecipe; @@ -33,6 +35,8 @@ import techreborn.compat.jei.extractor.ExtractorRecipeCategory; import techreborn.compat.jei.extractor.ExtractorRecipeHandler; import techreborn.compat.jei.fusionReactor.FusionReactorRecipeCategory; import techreborn.compat.jei.fusionReactor.FusionReactorRecipeHandler; +import techreborn.compat.jei.generators.fluid.FluidGeneratorRecipeCategory; +import techreborn.compat.jei.generators.fluid.FluidGeneratorRecipeHandler; import techreborn.compat.jei.grinder.GrinderRecipeCategory; import techreborn.compat.jei.grinder.GrinderRecipeHandler; import techreborn.compat.jei.implosionCompressor.ImplosionCompressorRecipeCategory; @@ -121,27 +125,32 @@ public class TechRebornJeiPlugin extends BlankModPlugin { jeiHelpers.getItemBlacklist().addItemToBlacklist(new ItemStack(ModItems.missingRecipe)); registry.addRecipeCategories(new AlloySmelterRecipeCategory(guiHelper), - new AssemblingMachineRecipeCategory(guiHelper), new BlastFurnaceRecipeCategory(guiHelper), - new CentrifugeRecipeCategory(guiHelper), new ChemicalReactorRecipeCategory(guiHelper), - new FusionReactorRecipeCategory(guiHelper), new IndustrialGrinderRecipeCategory(guiHelper), - new ImplosionCompressorRecipeCategory(guiHelper), new IndustrialElectrolyzerRecipeCategory(guiHelper), - new RollingMachineRecipeCategory(guiHelper), - new VacuumFreezerRecipeCategory(guiHelper), new GrinderRecipeCategory(guiHelper), - new ExtractorRecipeCategory(guiHelper), new CompressorRecipeCategory(guiHelper), new ScrapboxRecipeCategory(guiHelper)); + new AssemblingMachineRecipeCategory(guiHelper), new BlastFurnaceRecipeCategory(guiHelper), + new CentrifugeRecipeCategory(guiHelper), new ChemicalReactorRecipeCategory(guiHelper), + new FusionReactorRecipeCategory(guiHelper), new IndustrialGrinderRecipeCategory(guiHelper), + new ImplosionCompressorRecipeCategory(guiHelper), new IndustrialElectrolyzerRecipeCategory(guiHelper), + new RollingMachineRecipeCategory(guiHelper), new VacuumFreezerRecipeCategory(guiHelper), + new GrinderRecipeCategory(guiHelper), new ExtractorRecipeCategory(guiHelper), + new CompressorRecipeCategory(guiHelper), new ScrapboxRecipeCategory(guiHelper)); + + for(EFluidGenerator type : EFluidGenerator.values()) + registry.addRecipeCategories(new FluidGeneratorRecipeCategory(type, guiHelper)); registry.addRecipeHandlers(new AlloySmelterRecipeHandler(jeiHelpers), - new AssemblingMachineRecipeHandler(jeiHelpers), new BlastFurnaceRecipeHandler(jeiHelpers), - new CentrifugeRecipeHandler(jeiHelpers), new ChemicalReactorRecipeHandler(jeiHelpers), - new FusionReactorRecipeHandler(), new IndustrialGrinderRecipeHandler(jeiHelpers), - new ImplosionCompressorRecipeHandler(jeiHelpers), new IndustrialElectrolyzerRecipeHandler(jeiHelpers), - new RollingMachineRecipeHandler(), - new VacuumFreezerRecipeHandler(jeiHelpers), new GrinderRecipeHandler(jeiHelpers), - new ExtractorRecipeHandler(jeiHelpers), new CompressorRecipeHandler(jeiHelpers), - new ScrapboxRecipeHandler(jeiHelpers)); + new AssemblingMachineRecipeHandler(jeiHelpers), new BlastFurnaceRecipeHandler(jeiHelpers), + new CentrifugeRecipeHandler(jeiHelpers), new ChemicalReactorRecipeHandler(jeiHelpers), + new FusionReactorRecipeHandler(), new IndustrialGrinderRecipeHandler(jeiHelpers), + new ImplosionCompressorRecipeHandler(jeiHelpers), new IndustrialElectrolyzerRecipeHandler(jeiHelpers), + new RollingMachineRecipeHandler(), new VacuumFreezerRecipeHandler(jeiHelpers), + new GrinderRecipeHandler(jeiHelpers), new ExtractorRecipeHandler(jeiHelpers), + new CompressorRecipeHandler(jeiHelpers), new ScrapboxRecipeHandler(jeiHelpers), + new FluidGeneratorRecipeHandler(jeiHelpers)); registry.addRecipes(RecipeHandler.recipeList); registry.addRecipes(FusionReactorRecipeHelper.reactorRecipes); + GeneratorRecipeHelper.fluidRecipes.forEach((type, list) -> registry.addRecipes(list.getRecipes())); + try { registry.addRecipes(RollingMachineRecipeMaker.getRecipes(jeiHelpers)); } catch (RuntimeException e) { @@ -189,6 +198,15 @@ public class TechRebornJeiPlugin extends BlankModPlugin { VanillaRecipeCategoryUid.FUEL); registry.addRecipeClickArea(GuiElectricFurnace.class, 78, 36, 24, 16, VanillaRecipeCategoryUid.SMELTING); + registry.addRecipeClickArea(GuiSemifluidGenerator.class, 79, 34, 18, 18, + EFluidGenerator.SEMIFLUID.getRecipeID()); + registry.addRecipeClickArea(GuiDieselGenerator.class, 79, 34, 18, 18, + EFluidGenerator.DIESEL.getRecipeID()); + registry.addRecipeClickArea(GuiGasTurbine.class, 79, 34, 18, 18, + EFluidGenerator.GAS.getRecipeID()); + registry.addRecipeClickArea(GuiThermalGenerator.class, 79, 34, 18, 18, + EFluidGenerator.THERMAL.getRecipeID()); + registry.addRecipeCategoryCraftingItem(new ItemStack(ModBlocks.compressor), RecipeCategoryUids.COMPRESSOR); registry.addRecipeCategoryCraftingItem(new ItemStack(ModBlocks.alloyFurnace), RecipeCategoryUids.ALLOY_SMELTER); registry.addRecipeCategoryCraftingItem(new ItemStack(ModBlocks.alloySmelter), RecipeCategoryUids.ALLOY_SMELTER); @@ -212,6 +230,15 @@ public class TechRebornJeiPlugin extends BlankModPlugin { RecipeCategoryUids.ROLLING_MACHINE); registry.addRecipeCategoryCraftingItem(new ItemStack(ModItems.scrapBox), RecipeCategoryUids.SCRAPBOX); + registry.addRecipeCategoryCraftingItem(new ItemStack(ModBlocks.semiFluidGenerator), + EFluidGenerator.SEMIFLUID.getRecipeID()); + registry.addRecipeCategoryCraftingItem(new ItemStack(ModBlocks.gasTurbine), + EFluidGenerator.GAS.getRecipeID()); + registry.addRecipeCategoryCraftingItem(new ItemStack(ModBlocks.dieselGenerator), + EFluidGenerator.DIESEL.getRecipeID()); + registry.addRecipeCategoryCraftingItem(new ItemStack(ModBlocks.thermalGenerator), + EFluidGenerator.THERMAL.getRecipeID()); + IRecipeTransferRegistry recipeTransferRegistry = registry.getRecipeTransferRegistry(); recipeTransferRegistry .addRecipeTransferHandler(ContainerAlloyFurnace.class, RecipeCategoryUids.ALLOY_SMELTER, 0, 2, 4, 36); diff --git a/src/main/java/techreborn/compat/jei/generators/fluid/FluidGeneratorRecipeCategory.java b/src/main/java/techreborn/compat/jei/generators/fluid/FluidGeneratorRecipeCategory.java new file mode 100644 index 000000000..cc9512cd2 --- /dev/null +++ b/src/main/java/techreborn/compat/jei/generators/fluid/FluidGeneratorRecipeCategory.java @@ -0,0 +1,66 @@ +package techreborn.compat.jei.generators.fluid; + +import mezz.jei.api.IGuiHelper; +import mezz.jei.api.gui.IDrawable; +import mezz.jei.api.gui.IGuiFluidStackGroup; +import mezz.jei.api.gui.IRecipeLayout; +import mezz.jei.api.ingredients.IIngredients; +import mezz.jei.api.recipe.BlankRecipeCategory; +import net.minecraft.client.Minecraft; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.text.translation.I18n; +import techreborn.api.generator.EFluidGenerator; +import techreborn.compat.jei.RecipeUtil; + +public class FluidGeneratorRecipeCategory extends BlankRecipeCategory { + public static ResourceLocation texture = new ResourceLocation("techreborn", "textures/gui/jei_fluid_generator.png"); + + private static final int[] INPUT_TANKS = { 0 }; + + private static final int[] INPUT_SLOTS = { 0 }; + private static final int[] OUTPUT_SLOTS = { 1 }; + + private final IDrawable background; + private final String title; + + private final IDrawable tankOverlay; + + private final EFluidGenerator generatorType; + + public FluidGeneratorRecipeCategory(EFluidGenerator generatorType, IGuiHelper guiHelper) { + background = guiHelper.createDrawable(texture, 42, 16, 102, 60); + tankOverlay = guiHelper.createDrawable(texture, 176, 72, 12, 47); + title = I18n.translateToLocal("techreborn.jei.category.generator." + generatorType.name().toLowerCase()); + + this.generatorType = generatorType; + } + + @Override + public String getUid() { + return this.generatorType.getRecipeID(); + } + + @Override + public String getTitle() { + return title; + } + + @Override + public IDrawable getBackground() { + return background; + } + + @Override + public void drawExtras(Minecraft minecraft) { + } + + @Override + public void setRecipe(IRecipeLayout recipeLayout, FluidGeneratorRecipeWrapper recipeWrapper, + IIngredients ingredients) { + + IGuiFluidStackGroup guiFluidStacks = recipeLayout.getFluidStacks(); + guiFluidStacks.init(INPUT_TANKS[0], true, 4, 8, 12, 47, 10000, true, tankOverlay); + + RecipeUtil.setRecipeItems(recipeLayout, ingredients, INPUT_SLOTS, OUTPUT_SLOTS, INPUT_TANKS, null); + } +} diff --git a/src/main/java/techreborn/compat/jei/generators/fluid/FluidGeneratorRecipeHandler.java b/src/main/java/techreborn/compat/jei/generators/fluid/FluidGeneratorRecipeHandler.java new file mode 100644 index 000000000..999632b0a --- /dev/null +++ b/src/main/java/techreborn/compat/jei/generators/fluid/FluidGeneratorRecipeHandler.java @@ -0,0 +1,40 @@ +package techreborn.compat.jei.generators.fluid; + +import javax.annotation.Nonnull; + +import mezz.jei.api.IJeiHelpers; +import mezz.jei.api.recipe.IRecipeHandler; +import mezz.jei.api.recipe.IRecipeWrapper; +import techreborn.api.generator.FluidGeneratorRecipe; + +public class FluidGeneratorRecipeHandler implements IRecipeHandler { + @Nonnull + private final IJeiHelpers jeiHelpers; + + public FluidGeneratorRecipeHandler(@Nonnull IJeiHelpers jeiHelpers) { + this.jeiHelpers = jeiHelpers; + } + + @Nonnull + @Override + public Class getRecipeClass() { + return FluidGeneratorRecipe.class; + } + + @Nonnull + @Override + public String getRecipeCategoryUid(FluidGeneratorRecipe recipe) { + return recipe.getGeneratorType().getRecipeID(); + } + + @Nonnull + @Override + public IRecipeWrapper getRecipeWrapper(FluidGeneratorRecipe recipe) { + return new FluidGeneratorRecipeWrapper(jeiHelpers, recipe); + } + + @Override + public boolean isRecipeValid(FluidGeneratorRecipe recipe) { + return true; + } +} diff --git a/src/main/java/techreborn/compat/jei/generators/fluid/FluidGeneratorRecipeWrapper.java b/src/main/java/techreborn/compat/jei/generators/fluid/FluidGeneratorRecipeWrapper.java new file mode 100644 index 000000000..aeeeaeb8e --- /dev/null +++ b/src/main/java/techreborn/compat/jei/generators/fluid/FluidGeneratorRecipeWrapper.java @@ -0,0 +1,60 @@ +package techreborn.compat.jei.generators.fluid; + +import javax.annotation.Nonnull; + +import java.text.DecimalFormat; +import java.text.DecimalFormatSymbols; +import java.text.NumberFormat; +import java.util.Locale; + +import mezz.jei.api.IGuiHelper; +import mezz.jei.api.IJeiHelpers; +import mezz.jei.api.gui.IDrawable; +import mezz.jei.api.ingredients.IIngredients; +import mezz.jei.api.recipe.BlankRecipeWrapper; +import net.minecraft.client.Minecraft; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidStack; +import techreborn.api.generator.FluidGeneratorRecipe; + +public class FluidGeneratorRecipeWrapper extends BlankRecipeWrapper { + + private static final DecimalFormat formatter; + + static { + formatter = (DecimalFormat) NumberFormat.getInstance(Locale.US); + DecimalFormatSymbols symbols = formatter.getDecimalFormatSymbols(); + + symbols.setGroupingSeparator(' '); + formatter.setDecimalFormatSymbols(symbols); + } + + private static final int FLUID_GENERATOR_STORAGE = 100_000; + + private final FluidGeneratorRecipe baseRecipe; + private final IDrawable energyProduced; + + public FluidGeneratorRecipeWrapper(@Nonnull IJeiHelpers jeiHelpers, @Nonnull FluidGeneratorRecipe recipe) { + + this.baseRecipe = recipe; + + IGuiHelper guiHelper = jeiHelpers.getGuiHelper(); + energyProduced = guiHelper.createDrawable(FluidGeneratorRecipeCategory.texture, 176, 3, + (int) (25 * ((recipe.getEnergyPerMb() * 1000.0) / FLUID_GENERATOR_STORAGE)), 14); + } + + @Override + public void drawInfo(Minecraft minecraft, int recipeWidth, int recipeHeight, int mouseX, int mouseY) { + super.drawInfo(minecraft, recipeWidth, recipeHeight, mouseX, mouseY); + + energyProduced.draw(minecraft, 73, 26); + + minecraft.fontRendererObj.drawString(formatter.format(baseRecipe.getEnergyPerMb() * 1000) + " FE", 70, 13, + 0x444444); + } + + @Override + public void getIngredients(final IIngredients ingredients) { + ingredients.setInput(FluidStack.class, new FluidStack(this.baseRecipe.getFluid(), Fluid.BUCKET_VOLUME)); + } +} diff --git a/src/main/resources/assets/techreborn/lang/en_us.lang b/src/main/resources/assets/techreborn/lang/en_us.lang index ac58b2277..6efea19af 100644 --- a/src/main/resources/assets/techreborn/lang/en_us.lang +++ b/src/main/resources/assets/techreborn/lang/en_us.lang @@ -952,6 +952,10 @@ techreborn.desc.scrapBox=Scrapboxes can be opened by either a simple use in hand techreborn.desc.scrapBoxNoDispenser=Scrapboxes can be opened by a simple use in hand! techreborn.jei.category.alloy.furnace=Alloy Furnace +techreborn.jei.category.generator.gas=Gas Generator +techreborn.jei.category.generator.semifluid=Semifluid Generator +techreborn.jei.category.generator.diesel=Diesel Generator +techreborn.jei.category.generator.thermal=Thermal Generator #Death Messages death.attack.shock=%s was electrocuted diff --git a/src/main/resources/assets/techreborn/textures/gui/jei_fluid_generator.png b/src/main/resources/assets/techreborn/textures/gui/jei_fluid_generator.png new file mode 100644 index 0000000000000000000000000000000000000000..2490e0f2a7cd18ff6eb897bb7a5851038b0cebc1 GIT binary patch literal 2350 zcmeHI`BT$Z5P#n!+?OO@K!`xVB8ufuQREIHB6lhvA`_6|CL{rp5{f`l>y#>1TW!^F zO{y~%>)8`G zHK99$-kU*xo}KZA5<8Y0Gs;Mo(BozFSUD|bEiFNsm6o5M-`3V96bgrihQ`+9OG`^~ zxg4SS5g#k??+OU_W>+d63iC){Fw!UgXMkXtiUm?3wbaAm3;?iciUmnTS?3X>A=B#^ zGngLFWJRaPfz;?E8q*xBsb?TMjGBOlBqpMxGDnUOPnR8L{Z=DhiH0pZ0* zMK?T4am;Dx+Ws*K&gx0g@EW^#x@aWoVl7-SUG&@I9I|aj{f^Tmrb#@*@Xul=Lg3bk zYoeH(CujYg51U!0-q~(lN(uL!a?jzmLYZ7&3gy+eUP&Hg3FteCa^x7WOigB}{tLq_ z?;r+ic%0if-&rpfCwh?mvW4&ovUwWaGcd>YnOQLDleVX za$S;&Fyad(Tioi=gF&auyd9V+(kZf<#abYH0fQS%YghiNpKO(r*B9QmT1CW zaDR~-q%qmIsRPPsUWuE4#=oKW$O@yBTNZ%RU_tTtPobgExL5U2Rl?jM2Pyw1mh)>C zx4F7bs?G@nPLn@)ft=pm>?oZ|s}KE84B}}jbRuO!4-vPHaO9C>{#1L_Z7nePquUoA zSElV8IhPv5rH-6%NQI}7JjR^R4#r&7ode;QUrX7`S?%)Sg8qi=JRel8l1oeF=qjG| zwK^Zm*X3CR$t&9kKzhvCb+jDHe(S*Qd-eupk2wxz7V%CfrYLNxTC9oUkr%(b7ksoB zgWo%=sYk3Y?}$V>t(Px`v6R($g~{r6k_B7*HV!R-0ak^l7)ItCTG3lzlbi@7_g`4r zCN2YmCOxa}JnKXN=msB{@hnNo3Y}LcwekXFSCTRmk49*QIsoI(Cw)OjBM&*ciEl{> z1H3WgPr+rC{o=uH&+^G+s0x{mByEL}6hx zTfMe_Y$dQ-czGZ3mck2kVN};63H>;ox;T9T>Ak58T9!d>x$37?k?nStt2}I7K=q3S zWL8;zCe^!!R%TrTnhaEN3UA_Bu-;58eIM9`8N5%tim04)!F<)o={~F>Q9zzFj}$(y zh)DKJ0mexQUM^SHsEPsq9@3_-ka7MuHi>-$ORc|$x)k^FCE71wq9Ah0JaVA-ujqHR zjys2RYI7q#1OQj@iGNao-x~|?$$qgMdlUddK-mS(J{3D~%>m3^Dn9T)AcjQk1nx~s z<2$O2{yTyFGiA<=SAcJi2L(u#yHh}7fffj;fp|&#{`