From 4eb2eae934b6bf84c42611e3cca9252e464bb5f8 Mon Sep 17 00:00:00 2001 From: Scott MacDonald Date: Thu, 13 Aug 2020 13:51:15 -0600 Subject: [PATCH] Replace Atomic Disassembler mode switch with radial selector. (#6422) --- .../mekanism/client/ClientTickHandler.java | 2 +- .../client/gui/GuiRadialSelector.java | 71 +++++++++++++++--- .../item/gear/ItemAtomicDisassembler.java | 65 ++++++++++++---- .../item/interfaces/IRadialModeItem.java | 4 + .../gui/disassembler_extended_vein.png | Bin 0 -> 759 bytes .../assets/mekanism/gui/disassembler_fast.png | Bin 0 -> 635 bytes .../mekanism/gui/disassembler_normal.png | Bin 0 -> 641 bytes .../assets/mekanism/gui/disassembler_slow.png | Bin 0 -> 634 bytes .../assets/mekanism/gui/disassembler_vein.png | Bin 0 -> 683 bytes 9 files changed, 116 insertions(+), 26 deletions(-) create mode 100644 src/main/resources/assets/mekanism/gui/disassembler_extended_vein.png create mode 100644 src/main/resources/assets/mekanism/gui/disassembler_fast.png create mode 100644 src/main/resources/assets/mekanism/gui/disassembler_normal.png create mode 100644 src/main/resources/assets/mekanism/gui/disassembler_slow.png create mode 100644 src/main/resources/assets/mekanism/gui/disassembler_vein.png diff --git a/src/main/java/mekanism/client/ClientTickHandler.java b/src/main/java/mekanism/client/ClientTickHandler.java index ae4bdd43e69..fa5ee76c25d 100644 --- a/src/main/java/mekanism/client/ClientTickHandler.java +++ b/src/main/java/mekanism/client/ClientTickHandler.java @@ -298,7 +298,7 @@ private & IRadialSelectorEnum> void updateSelecto return ((IRadialModeItem) s.getItem()).getMode(s); } } - return modeClass.getEnumConstants()[0]; + return modeItem.getDefaultMode(); }, type -> { if (minecraft.player != null) { Mekanism.packetHandler.sendToServer(new PacketRadialModeChange(EquipmentSlotType.MAINHAND, type.ordinal())); diff --git a/src/main/java/mekanism/client/gui/GuiRadialSelector.java b/src/main/java/mekanism/client/gui/GuiRadialSelector.java index ee0fe5b9aa3..ac8376c252f 100644 --- a/src/main/java/mekanism/client/gui/GuiRadialSelector.java +++ b/src/main/java/mekanism/client/gui/GuiRadialSelector.java @@ -2,9 +2,11 @@ import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.systems.RenderSystem; +import java.util.Arrays; import java.util.function.Consumer; import java.util.function.Supplier; import javax.annotation.Nonnull; +import mekanism.api.IDisableableEnum; import mekanism.client.render.MekanismRenderer; import mekanism.common.item.interfaces.IRadialSelectorEnum; import net.minecraft.client.Minecraft; @@ -29,6 +31,7 @@ public class GuiRadialSelector & IRadialSelectorEnum curSupplier; private final Consumer changeHandler; + private final boolean isDisableable; private TYPE selection = null; @@ -37,6 +40,7 @@ public GuiRadialSelector(Class enumClass, Supplier curSupplier, Cons this.enumClass = enumClass; this.curSupplier = curSupplier; this.changeHandler = changeHandler; + isDisableable = IDisableableEnum.class.isAssignableFrom(enumClass); types = enumClass.getEnumConstants(); } @@ -53,11 +57,20 @@ public void render(@Nonnull MatrixStack matrix, int mouseX, int mouseY, float pa matrix.translate(centerX, centerY, 0); RenderSystem.disableTexture(); + // Calculate number of available modes to switch between + int activeModes; + if (isDisableable) { + activeModes = (int) Arrays.stream(types).filter(type -> ((IDisableableEnum) type).isEnabled()).count(); + } else { + activeModes = types.length; + } + // draw base RenderSystem.color4f(0.3F, 0.3F, 0.3F, 0.5F); drawTorus(matrix, 0, 360); TYPE cur = curSupplier.get(); + // Draw segments if (cur != null) { // draw current selected if (cur.getColor() == null) { @@ -65,7 +78,22 @@ public void render(@Nonnull MatrixStack matrix, int mouseX, int mouseY, float pa } else { MekanismRenderer.color(cur.getColor(), 0.3F); } - drawTorus(matrix, -90F + 360F * (-0.5F + cur.ordinal()) / types.length, 360F / types.length); + int section; + if (isDisableable) { + //Calculate the proper section to highlight as green in case one of the earlier ones is disabled + section = 0; + for (TYPE type : types) { + if (((IDisableableEnum) type).isEnabled()) { + if (type == cur) { + break; + } + section++; + } + } + } else { + section = cur.ordinal(); + } + drawTorus(matrix, -90F + 360F * (-0.5F + section) / activeModes, 360F / activeModes); double xDiff = mouseX - centerX; double yDiff = mouseY - centerY; @@ -73,16 +101,31 @@ public void render(@Nonnull MatrixStack matrix, int mouseX, int mouseY, float pa // draw mouse selection highlight float angle = (float) Math.toDegrees(Math.atan2(yDiff, xDiff)); RenderSystem.color4f(0.8F, 0.8F, 0.8F, 0.3F); - drawTorus(matrix, 360F * (-0.5F / types.length) + angle, 360F / types.length); + drawTorus(matrix, 360F * (-0.5F / activeModes) + angle, 360F / activeModes); - float selectionAngle = angle + 90F + (360F * (0.5F / types.length)); + float selectionAngle = angle + 90F + (360F * (0.5F / activeModes)); while (selectionAngle < 0) { selectionAngle += 360F; } - selection = types[(int) (selectionAngle * (types.length / 360F))]; + int selection_drawn_pos = (int) (selectionAngle * (activeModes / 360F)); + if (isDisableable) { + int count = 0; + for (TYPE type : types) { + if (((IDisableableEnum) type).isEnabled()) { + if (count == selection_drawn_pos) { + selection = type; + break; + } + count++; + } + } + } else { + selection = types[selection_drawn_pos]; + } + // draw hovered selection RenderSystem.color4f(0.6F, 0.6F, 0.6F, 0.7F); - drawTorus(matrix, -90F + 360F * (-0.5F + selection.ordinal()) / types.length, 360F / types.length); + drawTorus(matrix, -90F + 360F * (-0.5F + selection_drawn_pos) / activeModes, 360F / activeModes); } else { selection = null; } @@ -90,21 +133,29 @@ public void render(@Nonnull MatrixStack matrix, int mouseX, int mouseY, float pa MekanismRenderer.resetColor(); + // Icons & Labels RenderSystem.enableTexture(); - for (int i = 0; i < types.length; i++) { - double angle = Math.toRadians(270 + 360 * ((float) i / types.length)); + int position = 0; + for (TYPE type : types) { + if (isDisableable && !((IDisableableEnum) type).isEnabled()) { + // Mode disabled, skip it. + continue; + } + + double angle = Math.toRadians(270 + 360 * ((float) position / activeModes)); float x = (float) Math.cos(angle) * (INNER + OUTER) / 2F; float y = (float) Math.sin(angle) * (INNER + OUTER) / 2F; // draw icon - minecraft.textureManager.bindTexture(types[i].getIcon()); + minecraft.textureManager.bindTexture(type.getIcon()); blit(matrix, Math.round(x - 12), Math.round(y - 20), 24, 24, 0, 0, 18, 18, 18, 18); // draw label matrix.push(); - int width = minecraft.fontRenderer.getStringWidth(types[i].getShortText().getString()); + int width = minecraft.fontRenderer.func_238414_a_(type.getShortText()); matrix.translate(x, y, 0); matrix.scale(0.6F, 0.6F, 0.6F); - minecraft.fontRenderer.func_238422_b_(matrix, types[i].getShortText(), -width / 2F, 8, 0xCCFFFFFF); + minecraft.fontRenderer.func_238422_b_(matrix, type.getShortText(), -width / 2F, 8, 0xCCFFFFFF); matrix.pop(); + position++; } MekanismRenderer.resetColor(); diff --git a/src/main/java/mekanism/common/item/gear/ItemAtomicDisassembler.java b/src/main/java/mekanism/common/item/gear/ItemAtomicDisassembler.java index 870502056e1..7ba4a329105 100644 --- a/src/main/java/mekanism/common/item/gear/ItemAtomicDisassembler.java +++ b/src/main/java/mekanism/common/item/gear/ItemAtomicDisassembler.java @@ -19,7 +19,7 @@ import mekanism.api.math.FloatingLong; import mekanism.api.math.MathUtils; import mekanism.api.text.EnumColor; -import mekanism.api.text.IHasTranslationKey; +import mekanism.api.text.IHasTextComponent; import mekanism.api.text.ILangEntry; import mekanism.client.render.item.ISTERProvider; import mekanism.common.Mekanism; @@ -27,8 +27,11 @@ import mekanism.common.block.BlockBounding; import mekanism.common.config.MekanismConfig; import mekanism.common.item.ItemEnergized; +import mekanism.common.item.gear.ItemAtomicDisassembler.DisassemblerMode; import mekanism.common.item.interfaces.IItemHUDProvider; import mekanism.common.item.interfaces.IModeItem; +import mekanism.common.item.interfaces.IRadialModeItem; +import mekanism.common.item.interfaces.IRadialSelectorEnum; import mekanism.common.network.PacketLightningRender; import mekanism.common.network.PacketLightningRender.LightningPreset; import mekanism.common.tags.MekanismTags; @@ -52,6 +55,7 @@ import net.minecraft.stats.Stats; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.DamageSource; +import net.minecraft.util.ResourceLocation; import net.minecraft.util.Util; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.vector.Vector3d; @@ -62,7 +66,7 @@ import net.minecraftforge.common.ForgeHooks; import net.minecraftforge.common.capabilities.ICapabilityProvider; -public class ItemAtomicDisassembler extends ItemEnergized implements IItemHUDProvider, IModeItem { +public class ItemAtomicDisassembler extends ItemEnergized implements IItemHUDProvider, IModeItem, IRadialModeItem { private final Multimap attributes; @@ -228,12 +232,24 @@ private FloatingLong getDestroyEnergy(ItemStack itemStack, float hardness) { return hardness == 0 ? destroyEnergy.divide(2) : destroyEnergy; } + @Override public DisassemblerMode getMode(ItemStack itemStack) { return DisassemblerMode.byIndexStatic(ItemDataUtils.getInt(itemStack, NBTConstants.MODE)); } - public void setMode(ItemStack itemStack, DisassemblerMode mode) { - ItemDataUtils.setInt(itemStack, NBTConstants.MODE, mode.ordinal()); + @Override + public DisassemblerMode getModeByIndex(int ordinal) { + return DisassemblerMode.byIndexStatic(ordinal); + } + + @Override + public void setMode(ItemStack stack, PlayerEntity player, DisassemblerMode mode) { + ItemDataUtils.setInt(stack, NBTConstants.MODE, mode.ordinal()); + } + + @Override + public Class getModeClass() { + return DisassemblerMode.class; } @Nonnull @@ -254,7 +270,7 @@ public void changeMode(@Nonnull PlayerEntity player, @Nonnull ItemStack stack, i DisassemblerMode mode = getMode(stack); DisassemblerMode newMode = mode.adjust(shift); if (mode != newMode) { - setMode(stack, newMode); + setMode(stack, player, newMode); if (displayChangeMessage) { player.sendMessage(MekanismLang.LOG_FORMAT.translateColored(EnumColor.DARK_BLUE, MekanismLang.MEKANISM, MekanismLang.DISASSEMBLER_MODE_CHANGE.translateColored(EnumColor.GRAY, EnumColor.INDIGO, newMode, EnumColor.AQUA, newMode.getEfficiency())), @@ -279,24 +295,28 @@ public ICapabilityProvider initCapabilities(ItemStack stack, @Nullable CompoundN return super.initCapabilities(stack, nbt); } - public enum DisassemblerMode implements IDisableableEnum, IHasTranslationKey { - NORMAL(MekanismLang.DISASSEMBLER_NORMAL, 20, () -> true), - SLOW(MekanismLang.DISASSEMBLER_SLOW, 8, MekanismConfig.gear.disassemblerSlowMode), - FAST(MekanismLang.DISASSEMBLER_FAST, 128, MekanismConfig.gear.disassemblerFastMode), - VEIN(MekanismLang.DISASSEMBLER_VEIN, 20, MekanismConfig.gear.disassemblerVeinMining), - EXTENDED_VEIN(MekanismLang.DISASSEMBLER_EXTENDED_VEIN, 20, MekanismConfig.gear.disassemblerExtendedMining), - OFF(MekanismLang.DISASSEMBLER_OFF, 0, () -> true); + public enum DisassemblerMode implements IDisableableEnum, IRadialSelectorEnum, IHasTextComponent { + NORMAL(MekanismLang.DISASSEMBLER_NORMAL, 20, () -> true, EnumColor.BRIGHT_GREEN, MekanismUtils.getResource(MekanismUtils.ResourceType.GUI, "disassembler_normal.png")), + SLOW(MekanismLang.DISASSEMBLER_SLOW, 8, MekanismConfig.gear.disassemblerSlowMode, EnumColor.BRIGHT_GREEN, MekanismUtils.getResource(MekanismUtils.ResourceType.GUI, "disassembler_slow.png")), + FAST(MekanismLang.DISASSEMBLER_FAST, 128, MekanismConfig.gear.disassemblerFastMode, EnumColor.BRIGHT_GREEN, MekanismUtils.getResource(MekanismUtils.ResourceType.GUI, "disassembler_fast.png")), + VEIN(MekanismLang.DISASSEMBLER_VEIN, 20, MekanismConfig.gear.disassemblerVeinMining, EnumColor.BRIGHT_GREEN, MekanismUtils.getResource(MekanismUtils.ResourceType.GUI, "disassembler_vein.png")), + EXTENDED_VEIN(MekanismLang.DISASSEMBLER_EXTENDED_VEIN, 20, MekanismConfig.gear.disassemblerExtendedMining, EnumColor.BRIGHT_GREEN, MekanismUtils.getResource(MekanismUtils.ResourceType.GUI, "disassembler_extended_vein.png")), + OFF(MekanismLang.DISASSEMBLER_OFF, 0, () -> true, EnumColor.BRIGHT_GREEN, MekanismUtils.getResource(MekanismUtils.ResourceType.GUI, "void.png")); private static final DisassemblerMode[] MODES = values(); private final BooleanSupplier checkEnabled; private final ILangEntry langEntry; private final int efficiency; + private final EnumColor color; + private final ResourceLocation icon; - DisassemblerMode(ILangEntry langEntry, int efficiency, BooleanSupplier checkEnabled) { + DisassemblerMode(ILangEntry langEntry, int efficiency, BooleanSupplier checkEnabled, EnumColor color, ResourceLocation icon) { this.langEntry = langEntry; this.efficiency = efficiency; this.checkEnabled = checkEnabled; + this.color = color; + this.icon = icon; } /** @@ -315,8 +335,13 @@ public DisassemblerMode byIndex(int index) { } @Override - public String getTranslationKey() { - return langEntry.getTranslationKey(); + public ITextComponent getTextComponent() { + return langEntry.translate(color); + } + + @Override + public ITextComponent getShortText() { + return getTextComponent(); } public int getEfficiency() { @@ -327,5 +352,15 @@ public int getEfficiency() { public boolean isEnabled() { return checkEnabled.getAsBoolean(); } + + @Override + public ResourceLocation getIcon() { + return icon; + } + + @Override + public EnumColor getColor() { + return color; + } } } \ No newline at end of file diff --git a/src/main/java/mekanism/common/item/interfaces/IRadialModeItem.java b/src/main/java/mekanism/common/item/interfaces/IRadialModeItem.java index 4a4b78b6541..ff46e8da6f8 100644 --- a/src/main/java/mekanism/common/item/interfaces/IRadialModeItem.java +++ b/src/main/java/mekanism/common/item/interfaces/IRadialModeItem.java @@ -7,6 +7,10 @@ public interface IRadialModeItem & IRadialSelectorEnum getModeClass(); + default TYPE getDefaultMode() { + return getModeClass().getEnumConstants()[0]; + } + TYPE getModeByIndex(int ordinal); TYPE getMode(ItemStack stack); diff --git a/src/main/resources/assets/mekanism/gui/disassembler_extended_vein.png b/src/main/resources/assets/mekanism/gui/disassembler_extended_vein.png new file mode 100644 index 0000000000000000000000000000000000000000..6f7b86cf89c09c772f18bf075165dc4e573765bd GIT binary patch literal 759 zcmVEX>4Tx04R}tkv&MmKpe$iKcq!k9PA(>n4!98K~%(1s#pXIrLEAagUO{|(4-+r zad8w}3l4rPRvlcNb#-tR1i=pwCr2km7b)?7NufoI2gm(*ckglc4)8XsOfmcufTEgu zIuRFg`BfqCiXi+5V+_M0Gqhx8F$>r6bq^0;?_xa5{oJ1;EEfz0cm(1(rs*c}2Jy_M zsd3&XjvTclN3Kf_zi}?v?B$seJ)521~ z4$GXkI4jjUYu}Tuke%!@BX!}#-lE_s7 zBgX=2P$1fV@IUz7tx=qsbdo}Gpy$Q1K1P7RF3@UN*7vbxwN3!vGjOGL{Iw=9`$>AE zqeYK^zHQ**x}!;Zz~v4w@T7^lXiGkt-eM7WKcjET1O2x^@0!zFdmpC{K$f~%z5xyn zfzc9Wue-cE*xlQ|XWIS!0D)<8t%Ej%wEzGB24YJ`L;(K){{a7>y{D4^000SaNLh0L z01FcU01FcV0GgZ_00007bV*G`2jmC@4+I))K~&)Y008qzL_t(I%bk-=3&S7`hToLJ zEX>|>=>Pv&J@nvRDGLa7mno_1huaH9qsc>J6W~J3{AK5_7PUeEz*?K~K7>HdxpLS2 z3K_?-*xIlA2cplje}@}s$TUr;fyS8h1v<*6h8)3mpfiXLKC_!jYY{WIftF>tw4HNp zAn$z%&a3zSxFMMtDJ2k5F8KlAb@cl)B*ut&o(TYYO&x|IXApk(k+yU55AZUS< phSZQV$GbbyrD?}{WUe3p@CN+RfQ1-s-mU-u002ovPDHLkV1h_JN^k%G literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/mekanism/gui/disassembler_fast.png b/src/main/resources/assets/mekanism/gui/disassembler_fast.png new file mode 100644 index 0000000000000000000000000000000000000000..ba5fd3b2d328c0f9358c4c5b188342e5c537a1c7 GIT binary patch literal 635 zcmV->0)+jEP)EX>4Tx04R}tkv&MmKpe$iKcq!k9PA(>n4!98K~%(1s#pXIrLEAagUO{|(4-+r zad8w}3l4rPRvlcNb#-tR1i=pwCr2km7b)?7NufoI2gm(*ckglc4)8XsOfmcufTEgu zIuRFg`BfqCiXi+5V+_M0Gqhx8F$>r6bq^0;?_xa5{oJ1;EEfz0cm(1(rs*c}2Jy_M zsd3&XjvTclN3Kf_zi}?v?B$seJ)521~ z4$GXkI4jjUYu}Tuke%!@BX!}#-lE_s7 zBgX=2P$1fV@IUz7tx=qsbdo}Gpy$Q1K1P7RF3@UN*7vbxwN3!vGjOGL{Iw=9`$>AE zqeYK^zHQ**x}!;Zz~v4w@T7^lXiGkt-eM7WKcjET1O2x^@0!zFdmpC{K$f~%z5xyn zfzc9Wue-cE*xlQ|XWIS!0D)<8t%Ej%wEzGB24YJ`L;(K){{a7>y{D4^000SaNLh0L z01FcU01FcV0GgZ_00007bV*G`2jmC@4i`H>1#cPv004JML_t(I%hi;@4Zt7_1ML}j zvjvNIZywo*zNjh$w9xcX|02REatuHtNq8kmr9vb@Qfbd;_gS0F3?T%>7ztol=bSkN zdBE6?zYAl}s~s3e#;?LS+u{n0caeAs`*tE1k6gCqk|UR7d%U$%DW!7#LV7iRr31|? V&<`vsvC9Ae002ovPDHLkV1gN823!CD literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/mekanism/gui/disassembler_normal.png b/src/main/resources/assets/mekanism/gui/disassembler_normal.png new file mode 100644 index 0000000000000000000000000000000000000000..61fc638baf1eca99cdbc20f076b92914ab2bffdf GIT binary patch literal 641 zcmV-{0)G98P)EX>4Tx04R}tkv&MmKpe$iKcq!k9PA(>n4!98K~%(1s#pXIrLEAagUO{|(4-+r zad8w}3l4rPRvlcNb#-tR1i=pwCr2km7b)?7NufoI2gm(*ckglc4)8XsOfmcufTEgu zIuRFg`BfqCiXi+5V+_M0Gqhx8F$>r6bq^0;?_xa5{oJ1;EEfz0cm(1(rs*c}2Jy_M zsd3&XjvTclN3Kf_zi}?v?B$seJ)521~ z4$GXkI4jjUYu}Tuke%!@BX!}#-lE_s7 zBgX=2P$1fV@IUz7tx=qsbdo}Gpy$Q1K1P7RF3@UN*7vbxwN3!vGjOGL{Iw=9`$>AE zqeYK^zHQ**x}!;Zz~v4w@T7^lXiGkt-eM7WKcjET1O2x^@0!zFdmpC{K$f~%z5xyn zfzc9Wue-cE*xlQ|XWIS!0D)<8t%Ej%wEzGB24YJ`L;(K){{a7>y{D4^000SaNLh0L z01FcU01FcV0GgZ_00007bV*G`2jmC@4i_1fWiI{z004bSL_t(I%hi;z4Zt7_1m81I zvjYW-{N5Da$Z3LvNP+@5MZU8vo$U7maEc_hRUsrn(z>3#VF*d6DpE=SV5*7`0%DBP z)}<5~g6br@FlpD@fl2SxDopN-UxCTf6=z{Gio^`;yNO&pa=DsIj$D%M_0}$5NY2^% b8o$&5fn&kvn%&}g00000NkvXXu0mjf+`12& literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/mekanism/gui/disassembler_slow.png b/src/main/resources/assets/mekanism/gui/disassembler_slow.png new file mode 100644 index 0000000000000000000000000000000000000000..24ba0c44f4a10543bbcd6e4a16af49ec126bd223 GIT binary patch literal 634 zcmV-=0)_pFP)EX>4Tx04R}tkv&MmKpe$iKcq!k9PA(>n4!98K~%(1s#pXIrLEAagUO{|(4-+r zad8w}3l4rPRvlcNb#-tR1i=pwCr2km7b)?7NufoI2gm(*ckglc4)8XsOfmcufTEgu zIuRFg`BfqCiXi+5V+_M0Gqhx8F$>r6bq^0;?_xa5{oJ1;EEfz0cm(1(rs*c}2Jy_M zsd3&XjvTclN3Kf_zi}?v?B$seJ)521~ z4$GXkI4jjUYu}Tuke%!@BX!}#-lE_s7 zBgX=2P$1fV@IUz7tx=qsbdo}Gpy$Q1K1P7RF3@UN*7vbxwN3!vGjOGL{Iw=9`$>AE zqeYK^zHQ**x}!;Zz~v4w@T7^lXiGkt-eM7WKcjET1O2x^@0!zFdmpC{K$f~%z5xyn zfzc9Wue-cE*xlQ|XWIS!0D)<8t%Ej%wEzGB24YJ`L;(K){{a7>y{D4^000SaNLh0L z01FcU01FcV0GgZ_00007bV*G`2jmC@4i_pawNK~(004GLL_t(I%f*zz4S+BV1MM05 z?hbu)5l`AxvQc>Ehb0MN}0DJA5b*;@01 zR$;sv?+uJ2uV!JqGkylfr!9J6^hCk~`@W+Pk3zNT68w!ew UTA_6qg#Z8m07*qoM6N<$f(Jqf{Qv*} literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/mekanism/gui/disassembler_vein.png b/src/main/resources/assets/mekanism/gui/disassembler_vein.png new file mode 100644 index 0000000000000000000000000000000000000000..79fd8b104a6034568acad64b6ea58b73a899d9ba GIT binary patch literal 683 zcmV;c0#yBpP)EX>4Tx04R}tkv&MmKpe$iKcq!k9PA(>n4!98K~%(1s#pXIrLEAagUO{|(4-+r zad8w}3l4rPRvlcNb#-tR1i=pwCr2km7b)?7NufoI2gm(*ckglc4)8XsOfmcufTEgu zIuRFg`BfqCiXi+5V+_M0Gqhx8F$>r6bq^0;?_xa5{oJ1;EEfz0cm(1(rs*c}2Jy_M zsd3&XjvTclN3Kf_zi}?v?B$seJ)521~ z4$GXkI4jjUYu}Tuke%!@BX!}#-lE_s7 zBgX=2P$1fV@IUz7tx=qsbdo}Gpy$Q1K1P7RF3@UN*7vbxwN3!vGjOGL{Iw=9`$>AE zqeYK^zHQ**x}!;Zz~v4w@T7^lXiGkt-eM7WKcjET1O2x^@0!zFdmpC{K$f~%z5xyn zfzc9Wue-cE*xlQ|XWIS!0D)<8t%Ej%wEzGB24YJ`L;(K){{a7>y{D4^000SaNLh0L z01FcU01FcV0GgZ_00007bV*G`2jmC@4+RDIQfO5G005^+L_t(I%iWW)4g(OIq;{!>*i*UfQWnL)2kH;N)6DDwy!U;dbDqY%cFE4UDhtnG$EuqK zInT5EvWN;aLge`s?ASp<2rvSzwN>4bgj~VYpq4!IZ#}kF7E4e{Y3YwLn1V_vJ-Mx= zlzYnd-v4}mgD^A17>!EV004++oO4xn!OTEJMm-|mE58xZNX-zDS