From 82cdcf61a028d074bf95fcf74311592a9e7f36b2 Mon Sep 17 00:00:00 2001 From: stfwi Date: Wed, 27 Feb 2019 20:29:36 +0100 Subject: [PATCH] Added 1.13.2 code base. Reordered directory structure to combine independent MC version code bases. Rewritten auxilliary build scripts. --- 1.12/.gitignore | 32 ++ 1.12/Makefile | 98 +++++ build.gradle => 1.12/build.gradle | 0 gradle.properties => 1.12/gradle.properties | 0 .../gradle}/wrapper/gradle-wrapper.jar | Bin .../gradle}/wrapper/gradle-wrapper.properties | 0 gradlew => 1.12/gradlew | 0 gradlew.bat => 1.12/gradlew.bat | 0 1.12/meta/update.json | 14 + 1.12/readme.md | 34 ++ .../engineersdecor/ModEngineersDecor.java | 0 .../engineersdecor/blocks/BlockDecor.java | 0 .../blocks/BlockDecorDirected.java | 0 .../engineersdecor/blocks/BlockDecorFull.java | 0 .../blocks/BlockDecorLadder.java | 0 .../blocks/BlockDecorStairs.java | 0 .../engineersdecor/blocks/BlockDecorWall.java | 0 .../wile/engineersdecor/blocks/ModBlocks.java | 0 .../engineersdecor/detail/ClientProxy.java | 0 .../engineersdecor/detail/ModAuxiliaries.java | 0 .../wile/engineersdecor/detail/ModConfig.java | 0 .../detail/RecipeCondModSpecific.java | 0 .../engineersdecor/detail/ServerProxy.java | 0 .../blockstates/clinker_brick_block.json | 0 .../blockstates/clinker_brick_stairs.json | 0 .../blockstates/concrete_wall.json | 0 .../blockstates/iron_sheet_roof.json | 0 .../blockstates/iron_sheet_roof_block.json | 0 .../blockstates/metal_rung_ladder.json | 0 .../blockstates/metal_rung_steps.json | 0 .../blockstates/rebar_concrete.json | 0 .../blockstates/rebar_concrete_stairs.json | 0 .../blockstates/rebar_concrete_wall.json | 0 .../blockstates/slag_brick_block.json | 0 .../blockstates/slag_brick_stairs.json | 0 .../blockstates/treated_wood_ladder.json | 0 .../blockstates/treated_wood_pole.json | 0 .../blockstates/treated_wood_table.json | 0 .../assets/engineersdecor/lang/en_us.lang | 0 .../resources/assets/engineersdecor/logo.png | Bin .../models/block/decor_full_block_model.json | 0 .../furniture/treated_wood_table_model.json | 0 .../block/ladder/metal_rung_ladder_model.json | 0 .../block/ladder/metal_rung_steps_model.json | 0 .../ladder/treated_wood_ladder_model.json | 0 .../block/pole/straight_pole_model.json | 0 .../block/stairs/decor_inner_roof_model.json | 0 .../stairs/decor_inner_stairs_model.json | 0 .../block/stairs/decor_outer_roof_model.json | 0 .../stairs/decor_outer_stairs_model.json | 0 .../stairs/decor_straight_roof_model.json | 0 .../stairs/decor_straight_stairs_model.json | 0 .../block/wall/concrete_wall_default.json | 0 .../block/wall/concrete_wall_inventory.json | 0 .../models/block/wall/concrete_wall_post.json | 0 .../models/block/wall/concrete_wall_side.json | 0 .../engineersdecor/recipes/_constants.json | 0 .../engineersdecor/recipes/_factories.json | 0 .../recipes/clinker_brick_recipe.json | 0 .../recipes/clinker_brick_stairs_recipe.json | 0 ...clinker_brick_stairs_recipe_decompose.json | 0 ...oncrete_wall_recipe_with_ie_installed.json | 0 .../recipes/metal_rung_ladder_recipe.json | 0 .../recipes/metal_rung_steps_recipe.json | 0 .../recipes/rebar_concrete_recipe.json | 0 .../recipes/rebar_concrete_stairs_recipe.json | 0 .../recipes/rebar_concrete_wall_recipe.json | 0 .../recipes/slag_brick_recipe_with_slag.json | 0 .../slag_brick_recipe_without_slag.json | 0 .../recipes/slag_brick_stairs_recipe.json | 0 .../recipes/treated_wood_ladder_recipe.json | 0 .../recipes/treated_wood_pole_recipe.json | 0 .../recipes/treated_wood_table_recipe.json | 0 .../clinker_brick/clinker_brick_texture0.png | Bin .../clinker_brick/clinker_brick_texture1.png | Bin .../clinker_brick/clinker_brick_texture2.png | Bin .../clinker_brick/clinker_brick_texture3.png | Bin .../clinker_brick/clinker_brick_texture4.png | Bin .../clinker_brick/clinker_brick_texture5.png | Bin .../clinker_brick/clinker_brick_texture6.png | Bin .../clinker_brick/clinker_brick_texture7.png | Bin .../concrete/rebar_concrete_texture0.png | Bin .../concrete/rebar_concrete_texture1.png | Bin .../concrete/rebar_concrete_texture2.png | Bin .../concrete/rebar_concrete_texture3.png | Bin .../concrete/rebar_concrete_texture4.png | Bin .../concrete/rebar_concrete_texture5.png | Bin .../concrete/rebar_concrete_texture6.png | Bin .../concrete/rebar_concrete_texture7.png | Bin .../blocks/iestyle/ironsheet_roof.png | Bin .../blocks/iestyle/ironsheet_roof_top.png | Bin .../textures/blocks/iestyle/steel_texture.png | Bin .../textures/blocks/iestyle/treated_wood.png | Bin .../treated_wood_framed_nailed_texture.png | Bin .../iestyle/treated_wood_framed_texture.png | Bin .../iestyle/treated_wood_pole_texture.png | Bin .../iestyle/treated_wood_rough_texture.png | Bin .../pole/treated_wood_pole_side_texture.png | Bin .../pole/treated_wood_pole_top_texture.png | Bin .../blocks/slag_brick/slag_brick_texture0.png | Bin .../blocks/slag_brick/slag_brick_texture1.png | Bin .../blocks/slag_brick/slag_brick_texture2.png | Bin .../blocks/slag_brick/slag_brick_texture3.png | Bin .../blocks/slag_brick/slag_brick_texture4.png | Bin .../blocks/slag_brick/slag_brick_texture5.png | Bin .../blocks/slag_brick/slag_brick_texture6.png | Bin .../blocks/slag_brick/slag_brick_texture7.png | Bin {src => 1.12/src}/main/resources/mcmod.info | 0 {src => 1.12/src}/main/resources/pack.mcmeta | 0 1.12/tasks.js | 347 ++++++++++++++++++ 1.13/.gitignore | 35 ++ 1.13/Makefile | 75 ++++ 1.13/build.gradle | 79 ++++ 1.13/gradle.properties | 14 + 1.13/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 54708 bytes 1.13/gradle/wrapper/gradle-wrapper.properties | 5 + 1.13/gradlew | 172 +++++++++ 1.13/gradlew.bat | 84 +++++ 1.13/meta/update.json | 10 + 1.13/readme.md | 15 + .../engineersdecor/ModEngineersDecor.java | 100 +++++ .../engineersdecor/blocks/BlockDecor.java | 73 ++++ .../blocks/BlockDecorDirected.java | 103 ++++++ .../engineersdecor/blocks/BlockDecorFull.java | 49 +++ .../blocks/BlockDecorLadder.java | 69 ++++ .../blocks/BlockDecorStairs.java | 45 +++ .../engineersdecor/blocks/BlockDecorWall.java | 75 ++++ .../wile/engineersdecor/blocks/ModBlocks.java | 164 +++++++++ .../engineersdecor/detail/ModAuxiliaries.java | 167 +++++++++ .../wile/engineersdecor/detail/ModConfig.java | 35 ++ .../detail/RecipeCondModSpecific.java | 71 ++++ 1.13/src/main/resources/META-INF/mods.toml | 31 ++ .../blockstates/clinker_brick_block.json | 14 + .../blockstates/clinker_brick_stairs.json | 44 +++ .../blockstates/concrete_wall.json | 9 + .../blockstates/iron_sheet_roof.json | 55 +++ .../blockstates/iron_sheet_roof_block.json | 11 + .../blockstates/metal_rung_ladder.json | 8 + .../blockstates/metal_rung_steps.json | 8 + .../blockstates/rebar_concrete.json | 14 + .../blockstates/rebar_concrete_stairs.json | 44 +++ .../blockstates/rebar_concrete_wall.json | 9 + .../blockstates/slag_brick_block.json | 14 + .../blockstates/slag_brick_stairs.json | 44 +++ .../blockstates/treated_wood_ladder.json | 8 + .../blockstates/treated_wood_pole.json | 14 + .../blockstates/treated_wood_table.json | 5 + .../assets/engineersdecor/lang/en_us.json | 53 +++ .../resources/assets/engineersdecor/logo.png | Bin 0 -> 124533 bytes .../block/brick/clinker_brick_model0.json | 1 + .../block/brick/clinker_brick_model1.json | 1 + .../block/brick/clinker_brick_model2.json | 1 + .../block/brick/clinker_brick_model3.json | 1 + .../block/brick/clinker_brick_model4.json | 1 + .../block/brick/clinker_brick_model5.json | 1 + .../block/brick/clinker_brick_model6.json | 1 + .../block/brick/clinker_brick_model7.json | 1 + .../block/brick/clinker_brick_stairs.json | 8 + .../brick/clinker_brick_stairs_inner.json | 8 + .../brick/clinker_brick_stairs_outer.json | 8 + .../models/block/brick/slag_brick_model0.json | 1 + .../models/block/brick/slag_brick_model1.json | 1 + .../models/block/brick/slag_brick_model2.json | 1 + .../models/block/brick/slag_brick_model3.json | 1 + .../models/block/brick/slag_brick_model4.json | 1 + .../models/block/brick/slag_brick_model5.json | 1 + .../models/block/brick/slag_brick_model6.json | 1 + .../models/block/brick/slag_brick_model7.json | 1 + .../models/block/brick/slag_brick_stairs.json | 8 + .../block/brick/slag_brick_stairs_inner.json | 8 + .../block/brick/slag_brick_stairs_outer.json | 8 + .../block/concrete/concrete_wall_default.json | 7 + .../concrete/concrete_wall_inventory.json | 7 + .../block/concrete/concrete_wall_post.json | 7 + .../block/concrete/concrete_wall_side.json | 7 + .../block/concrete/rebar_concrete_model0.json | 1 + .../block/concrete/rebar_concrete_model1.json | 1 + .../block/concrete/rebar_concrete_model2.json | 1 + .../block/concrete/rebar_concrete_model3.json | 1 + .../block/concrete/rebar_concrete_model4.json | 1 + .../block/concrete/rebar_concrete_model5.json | 1 + .../block/concrete/rebar_concrete_model6.json | 1 + .../block/concrete/rebar_concrete_model7.json | 1 + .../block/concrete/rebar_concrete_stairs.json | 8 + .../concrete/rebar_concrete_stairs_inner.json | 8 + .../concrete/rebar_concrete_stairs_outer.json | 8 + .../concrete/rebar_concrete_wall_default.json | 7 + .../rebar_concrete_wall_inventory.json | 7 + .../concrete/rebar_concrete_wall_post.json | 7 + .../concrete/rebar_concrete_wall_side.json | 7 + .../furniture/treated_wood_table_model.json | 190 ++++++++++ .../block/ladder/metal_rung_ladder_model.json | 159 ++++++++ .../block/ladder/metal_rung_steps_model.json | 166 +++++++++ .../ladder/treated_wood_ladder_model.json | 94 +++++ .../block/pole/straight_pole_model.json | 75 ++++ .../block/pole/straight_pole_up_model.json | 75 ++++ .../block/roof/decor_full_block_model.json | 4 + .../block/roof/decor_inner_roof_model.json | 163 ++++++++ .../block/roof/decor_outer_roof_model.json | 99 +++++ .../block/roof/decor_straight_roof_model.json | 114 ++++++ .../block/wall/concrete_wall_default.json | 9 + .../block/wall/concrete_wall_inventory.json | 164 +++++++++ .../models/block/wall/concrete_wall_post.json | 22 ++ .../models/block/wall/concrete_wall_side.json | 65 ++++ .../models/item/clinker_brick_block.json | 1 + .../models/item/clinker_brick_stairs.json | 1 + .../models/item/concrete_wall.json | 1 + .../models/item/metal_rung_ladder.json | 1 + .../models/item/metal_rung_steps.json | 1 + .../models/item/rebar_concrete.json | 1 + .../models/item/rebar_concrete_stairs.json | 1 + .../models/item/rebar_concrete_wall.json | 1 + .../models/item/slag_brick_block.json | 1 + .../models/item/slag_brick_stairs.json | 1 + .../models/item/treated_wood_ladder.json | 1 + .../models/item/treated_wood_pole.json | 1 + .../models/item/treated_wood_table.json | 1 + .../clinker_brick/clinker_brick_texture0.png | Bin 0 -> 748 bytes .../clinker_brick/clinker_brick_texture1.png | Bin 0 -> 736 bytes .../clinker_brick/clinker_brick_texture2.png | Bin 0 -> 731 bytes .../clinker_brick/clinker_brick_texture3.png | Bin 0 -> 728 bytes .../clinker_brick/clinker_brick_texture4.png | Bin 0 -> 746 bytes .../clinker_brick/clinker_brick_texture5.png | Bin 0 -> 724 bytes .../clinker_brick/clinker_brick_texture6.png | Bin 0 -> 740 bytes .../clinker_brick/clinker_brick_texture7.png | Bin 0 -> 739 bytes .../concrete/rebar_concrete_texture0.png | Bin 0 -> 607 bytes .../concrete/rebar_concrete_texture1.png | Bin 0 -> 623 bytes .../concrete/rebar_concrete_texture2.png | Bin 0 -> 639 bytes .../concrete/rebar_concrete_texture3.png | Bin 0 -> 618 bytes .../concrete/rebar_concrete_texture4.png | Bin 0 -> 612 bytes .../concrete/rebar_concrete_texture5.png | Bin 0 -> 619 bytes .../concrete/rebar_concrete_texture6.png | Bin 0 -> 611 bytes .../concrete/rebar_concrete_texture7.png | Bin 0 -> 615 bytes .../ie_stone_decoration_concrete.png | Bin 0 -> 1104 bytes .../textures/block/iestyle/ironsheet_roof.png | Bin 0 -> 415 bytes .../block/iestyle/ironsheet_roof_top.png | Bin 0 -> 509 bytes .../textures/block/iestyle/steel_texture.png | Bin 0 -> 527 bytes .../textures/block/iestyle/treated_wood.png | Bin 0 -> 535 bytes .../treated_wood_framed_nailed_texture.png | Bin 0 -> 584 bytes .../iestyle/treated_wood_framed_texture.png | Bin 0 -> 563 bytes .../iestyle/treated_wood_pole_texture.png | Bin 0 -> 596 bytes .../iestyle/treated_wood_rough_texture.png | Bin 0 -> 565 bytes .../pole/treated_wood_pole_side_texture.png | Bin 0 -> 293 bytes .../pole/treated_wood_pole_top_texture.png | Bin 0 -> 197 bytes .../block/slag_brick/slag_brick_texture0.png | Bin 0 -> 734 bytes .../block/slag_brick/slag_brick_texture1.png | Bin 0 -> 707 bytes .../block/slag_brick/slag_brick_texture2.png | Bin 0 -> 728 bytes .../block/slag_brick/slag_brick_texture3.png | Bin 0 -> 748 bytes .../block/slag_brick/slag_brick_texture4.png | Bin 0 -> 723 bytes .../block/slag_brick/slag_brick_texture5.png | Bin 0 -> 729 bytes .../block/slag_brick/slag_brick_texture6.png | Bin 0 -> 751 bytes .../block/slag_brick/slag_brick_texture7.png | Bin 0 -> 742 bytes .../engineersdecor/recipes/_constants.json | 89 +++++ .../recipes/clinker_brick_recipe.json | 22 ++ .../recipes/clinker_brick_stairs_recipe.json | 23 ++ ...clinker_brick_stairs_recipe_decompose.json | 22 ++ .../recipes/metal_rung_ladder_recipe.json | 22 ++ .../recipes/metal_rung_steps_recipe.json | 22 ++ .../recipes/rebar_concrete_recipe.json | 22 ++ .../recipes/rebar_concrete_stairs_recipe.json | 21 ++ .../recipes/rebar_concrete_wall_recipe.json | 23 ++ .../recipes/slag_brick_recipe_with_slag.json | 22 ++ .../recipes/slag_brick_stairs_recipe.json | 23 ++ .../recipes/treated_wood_ladder_recipe.json | 23 ++ .../recipes/treated_wood_pole_recipe.json | 23 ++ .../recipes/treated_wood_table_recipe.json | 23 ++ 1.13/src/main/resources/pack.mcmeta | 7 + 1.13/tasks.js | 231 ++++++++++++ Makefile | 106 ++---- credits.md | 5 + meta/update.json | 7 +- readme.md | 32 +- scripts/sanatize-dist-check.js | 40 -- scripts/sanatize-sync-languages.js | 122 ------ scripts/sanatize-tabs-to-spaces.js | 25 -- scripts/sanatize-trailing-whitespaces.js | 25 -- scripts/sanatize-version-check.js | 42 --- scripts/sync-main-repo.js | 16 - scripts/task-dist.js | 33 -- scripts/task-update-json.js | 65 ---- tasks.js | 50 +++ 281 files changed, 4632 insertions(+), 468 deletions(-) create mode 100644 1.12/.gitignore create mode 100644 1.12/Makefile rename build.gradle => 1.12/build.gradle (100%) rename gradle.properties => 1.12/gradle.properties (100%) rename {gradle => 1.12/gradle}/wrapper/gradle-wrapper.jar (100%) rename {gradle => 1.12/gradle}/wrapper/gradle-wrapper.properties (100%) rename gradlew => 1.12/gradlew (100%) rename gradlew.bat => 1.12/gradlew.bat (100%) create mode 100644 1.12/meta/update.json create mode 100644 1.12/readme.md rename {src => 1.12/src}/main/java/wile/engineersdecor/ModEngineersDecor.java (100%) rename {src => 1.12/src}/main/java/wile/engineersdecor/blocks/BlockDecor.java (100%) rename {src => 1.12/src}/main/java/wile/engineersdecor/blocks/BlockDecorDirected.java (100%) rename {src => 1.12/src}/main/java/wile/engineersdecor/blocks/BlockDecorFull.java (100%) rename {src => 1.12/src}/main/java/wile/engineersdecor/blocks/BlockDecorLadder.java (100%) rename {src => 1.12/src}/main/java/wile/engineersdecor/blocks/BlockDecorStairs.java (100%) rename {src => 1.12/src}/main/java/wile/engineersdecor/blocks/BlockDecorWall.java (100%) rename {src => 1.12/src}/main/java/wile/engineersdecor/blocks/ModBlocks.java (100%) rename {src => 1.12/src}/main/java/wile/engineersdecor/detail/ClientProxy.java (100%) rename {src => 1.12/src}/main/java/wile/engineersdecor/detail/ModAuxiliaries.java (100%) rename {src => 1.12/src}/main/java/wile/engineersdecor/detail/ModConfig.java (100%) rename {src => 1.12/src}/main/java/wile/engineersdecor/detail/RecipeCondModSpecific.java (100%) rename {src => 1.12/src}/main/java/wile/engineersdecor/detail/ServerProxy.java (100%) rename {src => 1.12/src}/main/resources/assets/engineersdecor/blockstates/clinker_brick_block.json (100%) rename {src => 1.12/src}/main/resources/assets/engineersdecor/blockstates/clinker_brick_stairs.json (100%) rename {src => 1.12/src}/main/resources/assets/engineersdecor/blockstates/concrete_wall.json (100%) rename {src => 1.12/src}/main/resources/assets/engineersdecor/blockstates/iron_sheet_roof.json (100%) rename {src => 1.12/src}/main/resources/assets/engineersdecor/blockstates/iron_sheet_roof_block.json (100%) rename {src => 1.12/src}/main/resources/assets/engineersdecor/blockstates/metal_rung_ladder.json (100%) rename {src => 1.12/src}/main/resources/assets/engineersdecor/blockstates/metal_rung_steps.json (100%) rename {src => 1.12/src}/main/resources/assets/engineersdecor/blockstates/rebar_concrete.json (100%) rename {src => 1.12/src}/main/resources/assets/engineersdecor/blockstates/rebar_concrete_stairs.json (100%) rename {src => 1.12/src}/main/resources/assets/engineersdecor/blockstates/rebar_concrete_wall.json (100%) rename {src => 1.12/src}/main/resources/assets/engineersdecor/blockstates/slag_brick_block.json (100%) rename {src => 1.12/src}/main/resources/assets/engineersdecor/blockstates/slag_brick_stairs.json (100%) rename {src => 1.12/src}/main/resources/assets/engineersdecor/blockstates/treated_wood_ladder.json (100%) rename {src => 1.12/src}/main/resources/assets/engineersdecor/blockstates/treated_wood_pole.json (100%) rename {src => 1.12/src}/main/resources/assets/engineersdecor/blockstates/treated_wood_table.json (100%) rename {src => 1.12/src}/main/resources/assets/engineersdecor/lang/en_us.lang (100%) rename {src => 1.12/src}/main/resources/assets/engineersdecor/logo.png (100%) rename {src => 1.12/src}/main/resources/assets/engineersdecor/models/block/decor_full_block_model.json (100%) rename {src => 1.12/src}/main/resources/assets/engineersdecor/models/block/furniture/treated_wood_table_model.json (100%) rename {src => 1.12/src}/main/resources/assets/engineersdecor/models/block/ladder/metal_rung_ladder_model.json (100%) rename {src => 1.12/src}/main/resources/assets/engineersdecor/models/block/ladder/metal_rung_steps_model.json (100%) rename {src => 1.12/src}/main/resources/assets/engineersdecor/models/block/ladder/treated_wood_ladder_model.json (100%) rename {src => 1.12/src}/main/resources/assets/engineersdecor/models/block/pole/straight_pole_model.json (100%) rename {src => 1.12/src}/main/resources/assets/engineersdecor/models/block/stairs/decor_inner_roof_model.json (100%) rename {src => 1.12/src}/main/resources/assets/engineersdecor/models/block/stairs/decor_inner_stairs_model.json (100%) rename {src => 1.12/src}/main/resources/assets/engineersdecor/models/block/stairs/decor_outer_roof_model.json (100%) rename {src => 1.12/src}/main/resources/assets/engineersdecor/models/block/stairs/decor_outer_stairs_model.json (100%) rename {src => 1.12/src}/main/resources/assets/engineersdecor/models/block/stairs/decor_straight_roof_model.json (100%) rename {src => 1.12/src}/main/resources/assets/engineersdecor/models/block/stairs/decor_straight_stairs_model.json (100%) rename {src => 1.12/src}/main/resources/assets/engineersdecor/models/block/wall/concrete_wall_default.json (100%) rename {src => 1.12/src}/main/resources/assets/engineersdecor/models/block/wall/concrete_wall_inventory.json (100%) rename {src => 1.12/src}/main/resources/assets/engineersdecor/models/block/wall/concrete_wall_post.json (100%) rename {src => 1.12/src}/main/resources/assets/engineersdecor/models/block/wall/concrete_wall_side.json (100%) rename {src => 1.12/src}/main/resources/assets/engineersdecor/recipes/_constants.json (100%) rename {src => 1.12/src}/main/resources/assets/engineersdecor/recipes/_factories.json (100%) rename {src => 1.12/src}/main/resources/assets/engineersdecor/recipes/clinker_brick_recipe.json (100%) rename {src => 1.12/src}/main/resources/assets/engineersdecor/recipes/clinker_brick_stairs_recipe.json (100%) rename {src => 1.12/src}/main/resources/assets/engineersdecor/recipes/clinker_brick_stairs_recipe_decompose.json (100%) rename {src => 1.12/src}/main/resources/assets/engineersdecor/recipes/concrete_wall_recipe_with_ie_installed.json (100%) rename {src => 1.12/src}/main/resources/assets/engineersdecor/recipes/metal_rung_ladder_recipe.json (100%) rename {src => 1.12/src}/main/resources/assets/engineersdecor/recipes/metal_rung_steps_recipe.json (100%) rename {src => 1.12/src}/main/resources/assets/engineersdecor/recipes/rebar_concrete_recipe.json (100%) rename {src => 1.12/src}/main/resources/assets/engineersdecor/recipes/rebar_concrete_stairs_recipe.json (100%) rename {src => 1.12/src}/main/resources/assets/engineersdecor/recipes/rebar_concrete_wall_recipe.json (100%) rename {src => 1.12/src}/main/resources/assets/engineersdecor/recipes/slag_brick_recipe_with_slag.json (100%) rename {src => 1.12/src}/main/resources/assets/engineersdecor/recipes/slag_brick_recipe_without_slag.json (100%) rename {src => 1.12/src}/main/resources/assets/engineersdecor/recipes/slag_brick_stairs_recipe.json (100%) rename {src => 1.12/src}/main/resources/assets/engineersdecor/recipes/treated_wood_ladder_recipe.json (100%) rename {src => 1.12/src}/main/resources/assets/engineersdecor/recipes/treated_wood_pole_recipe.json (100%) rename {src => 1.12/src}/main/resources/assets/engineersdecor/recipes/treated_wood_table_recipe.json (100%) rename {src => 1.12/src}/main/resources/assets/engineersdecor/textures/blocks/clinker_brick/clinker_brick_texture0.png (100%) rename {src => 1.12/src}/main/resources/assets/engineersdecor/textures/blocks/clinker_brick/clinker_brick_texture1.png (100%) rename {src => 1.12/src}/main/resources/assets/engineersdecor/textures/blocks/clinker_brick/clinker_brick_texture2.png (100%) rename {src => 1.12/src}/main/resources/assets/engineersdecor/textures/blocks/clinker_brick/clinker_brick_texture3.png (100%) rename {src => 1.12/src}/main/resources/assets/engineersdecor/textures/blocks/clinker_brick/clinker_brick_texture4.png (100%) rename {src => 1.12/src}/main/resources/assets/engineersdecor/textures/blocks/clinker_brick/clinker_brick_texture5.png (100%) rename {src => 1.12/src}/main/resources/assets/engineersdecor/textures/blocks/clinker_brick/clinker_brick_texture6.png (100%) rename {src => 1.12/src}/main/resources/assets/engineersdecor/textures/blocks/clinker_brick/clinker_brick_texture7.png (100%) rename {src => 1.12/src}/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture0.png (100%) rename {src => 1.12/src}/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture1.png (100%) rename {src => 1.12/src}/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture2.png (100%) rename {src => 1.12/src}/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture3.png (100%) rename {src => 1.12/src}/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture4.png (100%) rename {src => 1.12/src}/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture5.png (100%) rename {src => 1.12/src}/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture6.png (100%) rename {src => 1.12/src}/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture7.png (100%) rename {src => 1.12/src}/main/resources/assets/engineersdecor/textures/blocks/iestyle/ironsheet_roof.png (100%) rename {src => 1.12/src}/main/resources/assets/engineersdecor/textures/blocks/iestyle/ironsheet_roof_top.png (100%) rename {src => 1.12/src}/main/resources/assets/engineersdecor/textures/blocks/iestyle/steel_texture.png (100%) rename {src => 1.12/src}/main/resources/assets/engineersdecor/textures/blocks/iestyle/treated_wood.png (100%) rename {src => 1.12/src}/main/resources/assets/engineersdecor/textures/blocks/iestyle/treated_wood_framed_nailed_texture.png (100%) rename {src => 1.12/src}/main/resources/assets/engineersdecor/textures/blocks/iestyle/treated_wood_framed_texture.png (100%) rename {src => 1.12/src}/main/resources/assets/engineersdecor/textures/blocks/iestyle/treated_wood_pole_texture.png (100%) rename {src => 1.12/src}/main/resources/assets/engineersdecor/textures/blocks/iestyle/treated_wood_rough_texture.png (100%) rename {src => 1.12/src}/main/resources/assets/engineersdecor/textures/blocks/pole/treated_wood_pole_side_texture.png (100%) rename {src => 1.12/src}/main/resources/assets/engineersdecor/textures/blocks/pole/treated_wood_pole_top_texture.png (100%) rename {src => 1.12/src}/main/resources/assets/engineersdecor/textures/blocks/slag_brick/slag_brick_texture0.png (100%) rename {src => 1.12/src}/main/resources/assets/engineersdecor/textures/blocks/slag_brick/slag_brick_texture1.png (100%) rename {src => 1.12/src}/main/resources/assets/engineersdecor/textures/blocks/slag_brick/slag_brick_texture2.png (100%) rename {src => 1.12/src}/main/resources/assets/engineersdecor/textures/blocks/slag_brick/slag_brick_texture3.png (100%) rename {src => 1.12/src}/main/resources/assets/engineersdecor/textures/blocks/slag_brick/slag_brick_texture4.png (100%) rename {src => 1.12/src}/main/resources/assets/engineersdecor/textures/blocks/slag_brick/slag_brick_texture5.png (100%) rename {src => 1.12/src}/main/resources/assets/engineersdecor/textures/blocks/slag_brick/slag_brick_texture6.png (100%) rename {src => 1.12/src}/main/resources/assets/engineersdecor/textures/blocks/slag_brick/slag_brick_texture7.png (100%) rename {src => 1.12/src}/main/resources/mcmod.info (100%) rename {src => 1.12/src}/main/resources/pack.mcmeta (100%) create mode 100644 1.12/tasks.js create mode 100644 1.13/.gitignore create mode 100644 1.13/Makefile create mode 100644 1.13/build.gradle create mode 100644 1.13/gradle.properties create mode 100644 1.13/gradle/wrapper/gradle-wrapper.jar create mode 100644 1.13/gradle/wrapper/gradle-wrapper.properties create mode 100644 1.13/gradlew create mode 100644 1.13/gradlew.bat create mode 100644 1.13/meta/update.json create mode 100644 1.13/readme.md create mode 100644 1.13/src/main/java/wile/engineersdecor/ModEngineersDecor.java create mode 100644 1.13/src/main/java/wile/engineersdecor/blocks/BlockDecor.java create mode 100644 1.13/src/main/java/wile/engineersdecor/blocks/BlockDecorDirected.java create mode 100644 1.13/src/main/java/wile/engineersdecor/blocks/BlockDecorFull.java create mode 100644 1.13/src/main/java/wile/engineersdecor/blocks/BlockDecorLadder.java create mode 100644 1.13/src/main/java/wile/engineersdecor/blocks/BlockDecorStairs.java create mode 100644 1.13/src/main/java/wile/engineersdecor/blocks/BlockDecorWall.java create mode 100644 1.13/src/main/java/wile/engineersdecor/blocks/ModBlocks.java create mode 100644 1.13/src/main/java/wile/engineersdecor/detail/ModAuxiliaries.java create mode 100644 1.13/src/main/java/wile/engineersdecor/detail/ModConfig.java create mode 100644 1.13/src/main/java/wile/engineersdecor/detail/RecipeCondModSpecific.java create mode 100644 1.13/src/main/resources/META-INF/mods.toml create mode 100644 1.13/src/main/resources/assets/engineersdecor/blockstates/clinker_brick_block.json create mode 100644 1.13/src/main/resources/assets/engineersdecor/blockstates/clinker_brick_stairs.json create mode 100644 1.13/src/main/resources/assets/engineersdecor/blockstates/concrete_wall.json create mode 100644 1.13/src/main/resources/assets/engineersdecor/blockstates/iron_sheet_roof.json create mode 100644 1.13/src/main/resources/assets/engineersdecor/blockstates/iron_sheet_roof_block.json create mode 100644 1.13/src/main/resources/assets/engineersdecor/blockstates/metal_rung_ladder.json create mode 100644 1.13/src/main/resources/assets/engineersdecor/blockstates/metal_rung_steps.json create mode 100644 1.13/src/main/resources/assets/engineersdecor/blockstates/rebar_concrete.json create mode 100644 1.13/src/main/resources/assets/engineersdecor/blockstates/rebar_concrete_stairs.json create mode 100644 1.13/src/main/resources/assets/engineersdecor/blockstates/rebar_concrete_wall.json create mode 100644 1.13/src/main/resources/assets/engineersdecor/blockstates/slag_brick_block.json create mode 100644 1.13/src/main/resources/assets/engineersdecor/blockstates/slag_brick_stairs.json create mode 100644 1.13/src/main/resources/assets/engineersdecor/blockstates/treated_wood_ladder.json create mode 100644 1.13/src/main/resources/assets/engineersdecor/blockstates/treated_wood_pole.json create mode 100644 1.13/src/main/resources/assets/engineersdecor/blockstates/treated_wood_table.json create mode 100644 1.13/src/main/resources/assets/engineersdecor/lang/en_us.json create mode 100644 1.13/src/main/resources/assets/engineersdecor/logo.png create mode 100644 1.13/src/main/resources/assets/engineersdecor/models/block/brick/clinker_brick_model0.json create mode 100644 1.13/src/main/resources/assets/engineersdecor/models/block/brick/clinker_brick_model1.json create mode 100644 1.13/src/main/resources/assets/engineersdecor/models/block/brick/clinker_brick_model2.json create mode 100644 1.13/src/main/resources/assets/engineersdecor/models/block/brick/clinker_brick_model3.json create mode 100644 1.13/src/main/resources/assets/engineersdecor/models/block/brick/clinker_brick_model4.json create mode 100644 1.13/src/main/resources/assets/engineersdecor/models/block/brick/clinker_brick_model5.json create mode 100644 1.13/src/main/resources/assets/engineersdecor/models/block/brick/clinker_brick_model6.json create mode 100644 1.13/src/main/resources/assets/engineersdecor/models/block/brick/clinker_brick_model7.json create mode 100644 1.13/src/main/resources/assets/engineersdecor/models/block/brick/clinker_brick_stairs.json create mode 100644 1.13/src/main/resources/assets/engineersdecor/models/block/brick/clinker_brick_stairs_inner.json create mode 100644 1.13/src/main/resources/assets/engineersdecor/models/block/brick/clinker_brick_stairs_outer.json create mode 100644 1.13/src/main/resources/assets/engineersdecor/models/block/brick/slag_brick_model0.json create mode 100644 1.13/src/main/resources/assets/engineersdecor/models/block/brick/slag_brick_model1.json create mode 100644 1.13/src/main/resources/assets/engineersdecor/models/block/brick/slag_brick_model2.json create mode 100644 1.13/src/main/resources/assets/engineersdecor/models/block/brick/slag_brick_model3.json create mode 100644 1.13/src/main/resources/assets/engineersdecor/models/block/brick/slag_brick_model4.json create mode 100644 1.13/src/main/resources/assets/engineersdecor/models/block/brick/slag_brick_model5.json create mode 100644 1.13/src/main/resources/assets/engineersdecor/models/block/brick/slag_brick_model6.json create mode 100644 1.13/src/main/resources/assets/engineersdecor/models/block/brick/slag_brick_model7.json create mode 100644 1.13/src/main/resources/assets/engineersdecor/models/block/brick/slag_brick_stairs.json create mode 100644 1.13/src/main/resources/assets/engineersdecor/models/block/brick/slag_brick_stairs_inner.json create mode 100644 1.13/src/main/resources/assets/engineersdecor/models/block/brick/slag_brick_stairs_outer.json create mode 100644 1.13/src/main/resources/assets/engineersdecor/models/block/concrete/concrete_wall_default.json create mode 100644 1.13/src/main/resources/assets/engineersdecor/models/block/concrete/concrete_wall_inventory.json create mode 100644 1.13/src/main/resources/assets/engineersdecor/models/block/concrete/concrete_wall_post.json create mode 100644 1.13/src/main/resources/assets/engineersdecor/models/block/concrete/concrete_wall_side.json create mode 100644 1.13/src/main/resources/assets/engineersdecor/models/block/concrete/rebar_concrete_model0.json create mode 100644 1.13/src/main/resources/assets/engineersdecor/models/block/concrete/rebar_concrete_model1.json create mode 100644 1.13/src/main/resources/assets/engineersdecor/models/block/concrete/rebar_concrete_model2.json create mode 100644 1.13/src/main/resources/assets/engineersdecor/models/block/concrete/rebar_concrete_model3.json create mode 100644 1.13/src/main/resources/assets/engineersdecor/models/block/concrete/rebar_concrete_model4.json create mode 100644 1.13/src/main/resources/assets/engineersdecor/models/block/concrete/rebar_concrete_model5.json create mode 100644 1.13/src/main/resources/assets/engineersdecor/models/block/concrete/rebar_concrete_model6.json create mode 100644 1.13/src/main/resources/assets/engineersdecor/models/block/concrete/rebar_concrete_model7.json create mode 100644 1.13/src/main/resources/assets/engineersdecor/models/block/concrete/rebar_concrete_stairs.json create mode 100644 1.13/src/main/resources/assets/engineersdecor/models/block/concrete/rebar_concrete_stairs_inner.json create mode 100644 1.13/src/main/resources/assets/engineersdecor/models/block/concrete/rebar_concrete_stairs_outer.json create mode 100644 1.13/src/main/resources/assets/engineersdecor/models/block/concrete/rebar_concrete_wall_default.json create mode 100644 1.13/src/main/resources/assets/engineersdecor/models/block/concrete/rebar_concrete_wall_inventory.json create mode 100644 1.13/src/main/resources/assets/engineersdecor/models/block/concrete/rebar_concrete_wall_post.json create mode 100644 1.13/src/main/resources/assets/engineersdecor/models/block/concrete/rebar_concrete_wall_side.json create mode 100644 1.13/src/main/resources/assets/engineersdecor/models/block/furniture/treated_wood_table_model.json create mode 100644 1.13/src/main/resources/assets/engineersdecor/models/block/ladder/metal_rung_ladder_model.json create mode 100644 1.13/src/main/resources/assets/engineersdecor/models/block/ladder/metal_rung_steps_model.json create mode 100644 1.13/src/main/resources/assets/engineersdecor/models/block/ladder/treated_wood_ladder_model.json create mode 100644 1.13/src/main/resources/assets/engineersdecor/models/block/pole/straight_pole_model.json create mode 100644 1.13/src/main/resources/assets/engineersdecor/models/block/pole/straight_pole_up_model.json create mode 100644 1.13/src/main/resources/assets/engineersdecor/models/block/roof/decor_full_block_model.json create mode 100644 1.13/src/main/resources/assets/engineersdecor/models/block/roof/decor_inner_roof_model.json create mode 100644 1.13/src/main/resources/assets/engineersdecor/models/block/roof/decor_outer_roof_model.json create mode 100644 1.13/src/main/resources/assets/engineersdecor/models/block/roof/decor_straight_roof_model.json create mode 100644 1.13/src/main/resources/assets/engineersdecor/models/block/wall/concrete_wall_default.json create mode 100644 1.13/src/main/resources/assets/engineersdecor/models/block/wall/concrete_wall_inventory.json create mode 100644 1.13/src/main/resources/assets/engineersdecor/models/block/wall/concrete_wall_post.json create mode 100644 1.13/src/main/resources/assets/engineersdecor/models/block/wall/concrete_wall_side.json create mode 100644 1.13/src/main/resources/assets/engineersdecor/models/item/clinker_brick_block.json create mode 100644 1.13/src/main/resources/assets/engineersdecor/models/item/clinker_brick_stairs.json create mode 100644 1.13/src/main/resources/assets/engineersdecor/models/item/concrete_wall.json create mode 100644 1.13/src/main/resources/assets/engineersdecor/models/item/metal_rung_ladder.json create mode 100644 1.13/src/main/resources/assets/engineersdecor/models/item/metal_rung_steps.json create mode 100644 1.13/src/main/resources/assets/engineersdecor/models/item/rebar_concrete.json create mode 100644 1.13/src/main/resources/assets/engineersdecor/models/item/rebar_concrete_stairs.json create mode 100644 1.13/src/main/resources/assets/engineersdecor/models/item/rebar_concrete_wall.json create mode 100644 1.13/src/main/resources/assets/engineersdecor/models/item/slag_brick_block.json create mode 100644 1.13/src/main/resources/assets/engineersdecor/models/item/slag_brick_stairs.json create mode 100644 1.13/src/main/resources/assets/engineersdecor/models/item/treated_wood_ladder.json create mode 100644 1.13/src/main/resources/assets/engineersdecor/models/item/treated_wood_pole.json create mode 100644 1.13/src/main/resources/assets/engineersdecor/models/item/treated_wood_table.json create mode 100644 1.13/src/main/resources/assets/engineersdecor/textures/block/clinker_brick/clinker_brick_texture0.png create mode 100644 1.13/src/main/resources/assets/engineersdecor/textures/block/clinker_brick/clinker_brick_texture1.png create mode 100644 1.13/src/main/resources/assets/engineersdecor/textures/block/clinker_brick/clinker_brick_texture2.png create mode 100644 1.13/src/main/resources/assets/engineersdecor/textures/block/clinker_brick/clinker_brick_texture3.png create mode 100644 1.13/src/main/resources/assets/engineersdecor/textures/block/clinker_brick/clinker_brick_texture4.png create mode 100644 1.13/src/main/resources/assets/engineersdecor/textures/block/clinker_brick/clinker_brick_texture5.png create mode 100644 1.13/src/main/resources/assets/engineersdecor/textures/block/clinker_brick/clinker_brick_texture6.png create mode 100644 1.13/src/main/resources/assets/engineersdecor/textures/block/clinker_brick/clinker_brick_texture7.png create mode 100644 1.13/src/main/resources/assets/engineersdecor/textures/block/concrete/rebar_concrete_texture0.png create mode 100644 1.13/src/main/resources/assets/engineersdecor/textures/block/concrete/rebar_concrete_texture1.png create mode 100644 1.13/src/main/resources/assets/engineersdecor/textures/block/concrete/rebar_concrete_texture2.png create mode 100644 1.13/src/main/resources/assets/engineersdecor/textures/block/concrete/rebar_concrete_texture3.png create mode 100644 1.13/src/main/resources/assets/engineersdecor/textures/block/concrete/rebar_concrete_texture4.png create mode 100644 1.13/src/main/resources/assets/engineersdecor/textures/block/concrete/rebar_concrete_texture5.png create mode 100644 1.13/src/main/resources/assets/engineersdecor/textures/block/concrete/rebar_concrete_texture6.png create mode 100644 1.13/src/main/resources/assets/engineersdecor/textures/block/concrete/rebar_concrete_texture7.png create mode 100644 1.13/src/main/resources/assets/engineersdecor/textures/block/ieoriginal/ie_stone_decoration_concrete.png create mode 100644 1.13/src/main/resources/assets/engineersdecor/textures/block/iestyle/ironsheet_roof.png create mode 100644 1.13/src/main/resources/assets/engineersdecor/textures/block/iestyle/ironsheet_roof_top.png create mode 100644 1.13/src/main/resources/assets/engineersdecor/textures/block/iestyle/steel_texture.png create mode 100644 1.13/src/main/resources/assets/engineersdecor/textures/block/iestyle/treated_wood.png create mode 100644 1.13/src/main/resources/assets/engineersdecor/textures/block/iestyle/treated_wood_framed_nailed_texture.png create mode 100644 1.13/src/main/resources/assets/engineersdecor/textures/block/iestyle/treated_wood_framed_texture.png create mode 100644 1.13/src/main/resources/assets/engineersdecor/textures/block/iestyle/treated_wood_pole_texture.png create mode 100644 1.13/src/main/resources/assets/engineersdecor/textures/block/iestyle/treated_wood_rough_texture.png create mode 100644 1.13/src/main/resources/assets/engineersdecor/textures/block/pole/treated_wood_pole_side_texture.png create mode 100644 1.13/src/main/resources/assets/engineersdecor/textures/block/pole/treated_wood_pole_top_texture.png create mode 100644 1.13/src/main/resources/assets/engineersdecor/textures/block/slag_brick/slag_brick_texture0.png create mode 100644 1.13/src/main/resources/assets/engineersdecor/textures/block/slag_brick/slag_brick_texture1.png create mode 100644 1.13/src/main/resources/assets/engineersdecor/textures/block/slag_brick/slag_brick_texture2.png create mode 100644 1.13/src/main/resources/assets/engineersdecor/textures/block/slag_brick/slag_brick_texture3.png create mode 100644 1.13/src/main/resources/assets/engineersdecor/textures/block/slag_brick/slag_brick_texture4.png create mode 100644 1.13/src/main/resources/assets/engineersdecor/textures/block/slag_brick/slag_brick_texture5.png create mode 100644 1.13/src/main/resources/assets/engineersdecor/textures/block/slag_brick/slag_brick_texture6.png create mode 100644 1.13/src/main/resources/assets/engineersdecor/textures/block/slag_brick/slag_brick_texture7.png create mode 100644 1.13/src/main/resources/data/engineersdecor/recipes/_constants.json create mode 100644 1.13/src/main/resources/data/engineersdecor/recipes/clinker_brick_recipe.json create mode 100644 1.13/src/main/resources/data/engineersdecor/recipes/clinker_brick_stairs_recipe.json create mode 100644 1.13/src/main/resources/data/engineersdecor/recipes/clinker_brick_stairs_recipe_decompose.json create mode 100644 1.13/src/main/resources/data/engineersdecor/recipes/metal_rung_ladder_recipe.json create mode 100644 1.13/src/main/resources/data/engineersdecor/recipes/metal_rung_steps_recipe.json create mode 100644 1.13/src/main/resources/data/engineersdecor/recipes/rebar_concrete_recipe.json create mode 100644 1.13/src/main/resources/data/engineersdecor/recipes/rebar_concrete_stairs_recipe.json create mode 100644 1.13/src/main/resources/data/engineersdecor/recipes/rebar_concrete_wall_recipe.json create mode 100644 1.13/src/main/resources/data/engineersdecor/recipes/slag_brick_recipe_with_slag.json create mode 100644 1.13/src/main/resources/data/engineersdecor/recipes/slag_brick_stairs_recipe.json create mode 100644 1.13/src/main/resources/data/engineersdecor/recipes/treated_wood_ladder_recipe.json create mode 100644 1.13/src/main/resources/data/engineersdecor/recipes/treated_wood_pole_recipe.json create mode 100644 1.13/src/main/resources/data/engineersdecor/recipes/treated_wood_table_recipe.json create mode 100644 1.13/src/main/resources/pack.mcmeta create mode 100644 1.13/tasks.js delete mode 100644 scripts/sanatize-dist-check.js delete mode 100644 scripts/sanatize-sync-languages.js delete mode 100644 scripts/sanatize-tabs-to-spaces.js delete mode 100644 scripts/sanatize-trailing-whitespaces.js delete mode 100644 scripts/sanatize-version-check.js delete mode 100644 scripts/sync-main-repo.js delete mode 100644 scripts/task-dist.js delete mode 100644 scripts/task-update-json.js create mode 100644 tasks.js diff --git a/1.12/.gitignore b/1.12/.gitignore new file mode 100644 index 0000000..a2db5a4 --- /dev/null +++ b/1.12/.gitignore @@ -0,0 +1,32 @@ +bin +*.launch +.settings +.metadata +.classpath +.project +out +*.ipr +*.iws +*.iml +.idea +build +.gradle +*.tmp +*.log +*.jks +eclipse +run +tests +/dist +signing.* +src/main/java/archive +src/main/resources/assets/minecraft +.vscode +/classes +/dev +/tmp +/archive +/assets-src +.gimp +*.xcf +desktop.ini diff --git a/1.12/Makefile b/1.12/Makefile new file mode 100644 index 0000000..54355cb --- /dev/null +++ b/1.12/Makefile @@ -0,0 +1,98 @@ +# @file Makefile +# @author Stefan Wilhelm (wile) +# @license MIT +# +# GNU Make makefile for, well, speeding +# up the development a bit. +# You very likely need some tools installed +# to use all build targets, so this file is +# not "official". If you work on windows and +# install GIT with complete shell PATH (the +# red marked option in the GIT installer) you +# should have the needed unix tools available. +# For image stripping install imagemagick and +# also put the "magick" executable in the PATH. +# +MOD_JAR_PREFIX=engineersdecor- +MOD_JAR=$(filter-out %-sources.jar,$(wildcard build/libs/${MOD_JAR_PREFIX}*.jar)) + +ifeq ($(OS),Windows_NT) +GRADLE=gradlew.bat --no-daemon +GRADLE_STOP=gradlew.bat --stop +INSTALL_DIR=$(realpath ${APPDATA}/.minecraft) +SERVER_INSTALL_DIR=$(realpath ${APPDATA}/minecraft-server-forge-1.12.2-14.23.5.2768) +DJS=djs +else +GRADLE=./gradlew --no-daemon +GRADLE_STOP=./gradlew --stop +INSTALL_DIR=~/.minecraft +SERVER_INSTALL_DIR=~/.minecraft-server-forge-1.12.2-14.23.5.2768 +DJS=djs +endif + +wildcardr=$(foreach d,$(wildcard $1*),$(call wildcardr,$d/,$2) $(filter $(subst *,%,$2),$d)) + +# +# Targets +# +.PHONY: default mod init clean clean-all all run install sanatize dist-check dist start-server + +default: mod + +all: clean clean-all mod | install + +mod: + @echo "[1.12] Building mod using gradle ..." + @$(GRADLE) build $(GRADLE_OPTS) + +clean: + @echo "[1.12] Cleaning ..." + @rm -f build/libs/* + @$(GRADLE) clean + +clean-all: clean + @echo "[1.12] Cleaning using gradle ..." + @rm -f dist/* + @$(GRADLE) clean cleanCache + +init: + @echo "[1.12] Initialising eclipse workspace using gradle ..." + @$(GRADLE) setupDecompWorkspace + +run: + @echo "[1.12] Running client ..." + @$(GRADLE) runClient + +install: $(MOD_JAR) | + @sleep 2s + @if [ ! -d "$(INSTALL_DIR)" ]; then echo "Cannot find installation minecraft directory."; false; fi + @echo "[1.12] Installing '$(MOD_JAR)' to '$(INSTALL_DIR)/mods' ..." + @[ -d "$(INSTALL_DIR)/mods" ] || mkdir "$(INSTALL_DIR)/mods" + @rm -f "$(INSTALL_DIR)/mods/${MOD_JAR_PREFIX}"*.jar + @cp -f "$(MOD_JAR)" "$(INSTALL_DIR)/mods/" + @echo "[1.12] Installing '$(MOD_JAR)' to '$(SERVER_INSTALL_DIR)/mods' ..." + @rm -f "$(SERVER_INSTALL_DIR)/mods/${MOD_JAR_PREFIX}"*.jar + @[ -d "$(SERVER_INSTALL_DIR)/mods" ] && cp -f "$(MOD_JAR)" "$(SERVER_INSTALL_DIR)/mods/" + +start-server: install + @echo "[1.12] Starting local dedicated server ..." + @cd "$(SERVER_INSTALL_DIR)" && java -jar forge-1.12.2-14.23.5.2768-universal.jar nogui + +sanatize: + @echo "[1.12] Running sanatising tasks ..." + @djs tasks.js trailing-whitespaces + @djs tasks.js tabs-to-spaces + @djs tasks.js sync-languages + @djs tasks.js version-check + @djs tasks.js update-json + @git status -s . + +dist-check: + @echo "[1.12] Running dist checks ..." + @djs tasks.js dist-check + +dist: sanatize dist-check clean-all mod + @echo "[1.12] Distribution files ..." + @mkdir -p dist + @cp build/libs/$(MOD_JAR_PREFIX)* dist/ + @djs tasks.js dist diff --git a/build.gradle b/1.12/build.gradle similarity index 100% rename from build.gradle rename to 1.12/build.gradle diff --git a/gradle.properties b/1.12/gradle.properties similarity index 100% rename from gradle.properties rename to 1.12/gradle.properties diff --git a/gradle/wrapper/gradle-wrapper.jar b/1.12/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from gradle/wrapper/gradle-wrapper.jar rename to 1.12/gradle/wrapper/gradle-wrapper.jar diff --git a/gradle/wrapper/gradle-wrapper.properties b/1.12/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from gradle/wrapper/gradle-wrapper.properties rename to 1.12/gradle/wrapper/gradle-wrapper.properties diff --git a/gradlew b/1.12/gradlew similarity index 100% rename from gradlew rename to 1.12/gradlew diff --git a/gradlew.bat b/1.12/gradlew.bat similarity index 100% rename from gradlew.bat rename to 1.12/gradlew.bat diff --git a/1.12/meta/update.json b/1.12/meta/update.json new file mode 100644 index 0000000..3e4df43 --- /dev/null +++ b/1.12/meta/update.json @@ -0,0 +1,14 @@ +{ + "homepage": "https://www.curseforge.com/minecraft/mc-mods/engineers-decor/", + "1.12.2": { + "1.0.0": "[R] Release based on v1.0.0-b4", + "1.0.0-b4": "[F] Fixed vanished recipe for the rebar concrete wall.\n[A] Concrete wall, material: IE concrete.", + "1.0.0-b3": "[A] Textures of rebar concrete and treated wood table improved.\n[A] Added rebar concrete wall.", + "1.0.0-b2": "[A] Added rebar concrete (steel reinforced, expensive, creeper-proof).", + "1.0.0-b1": "[A] Initial structure.\n[A] Added clinker bricks and clinker brick stairs.\n[A] Added slag bricks and slag brick stairs.\n[A] Added metal rung ladder.\n[A] Added staggered metal steps ladder.\n[A] Added treated wood ladder.\n[A] Added treated wood pole.\n[A] Added treated wood table." + }, + "promos": { + "1.12.2-recommended": "1.0.0", + "1.12.2-latest": "1.0.0" + } +} \ No newline at end of file diff --git a/1.12/readme.md b/1.12/readme.md new file mode 100644 index 0000000..dff2b72 --- /dev/null +++ b/1.12/readme.md @@ -0,0 +1,34 @@ + +## Engineer's Decor (MC1.12.2) + +Mod sources for Minecraft version 1.12.2. + +- Description, credits, and features: Please see the readme in the repository root. + +- Compiled mod distribution channel is curseforge: https://www.curseforge.com/minecraft/mc-mods/engineers-decor/files. + +---- +## Revision history + + ------------------------------------------------------------------- + - v1.0.0 [R] Release based on v1.0.0-b4 + ------------------------------------------------------------------- + + - v1.0.0-b4 [F] Fixed vanished recipe for the rebar concrete wall. + [A] Concrete wall, material: IE concrete. + + - v1.0.0-b3 [A] Textures of rebar concrete and treated wood table improved. + [A] Added rebar concrete wall. + + - v1.0.0-b2 [A] Added rebar concrete (steel reinforced, expensive, creeper-proof). + + - v1.0.0-b1 [A] Initial structure. + [A] Added clinker bricks and clinker brick stairs. + [A] Added slag bricks and slag brick stairs. + [A] Added metal rung ladder. + [A] Added staggered metal steps ladder. + [A] Added treated wood ladder. + [A] Added treated wood pole. + [A] Added treated wood table. + +---- diff --git a/src/main/java/wile/engineersdecor/ModEngineersDecor.java b/1.12/src/main/java/wile/engineersdecor/ModEngineersDecor.java similarity index 100% rename from src/main/java/wile/engineersdecor/ModEngineersDecor.java rename to 1.12/src/main/java/wile/engineersdecor/ModEngineersDecor.java diff --git a/src/main/java/wile/engineersdecor/blocks/BlockDecor.java b/1.12/src/main/java/wile/engineersdecor/blocks/BlockDecor.java similarity index 100% rename from src/main/java/wile/engineersdecor/blocks/BlockDecor.java rename to 1.12/src/main/java/wile/engineersdecor/blocks/BlockDecor.java diff --git a/src/main/java/wile/engineersdecor/blocks/BlockDecorDirected.java b/1.12/src/main/java/wile/engineersdecor/blocks/BlockDecorDirected.java similarity index 100% rename from src/main/java/wile/engineersdecor/blocks/BlockDecorDirected.java rename to 1.12/src/main/java/wile/engineersdecor/blocks/BlockDecorDirected.java diff --git a/src/main/java/wile/engineersdecor/blocks/BlockDecorFull.java b/1.12/src/main/java/wile/engineersdecor/blocks/BlockDecorFull.java similarity index 100% rename from src/main/java/wile/engineersdecor/blocks/BlockDecorFull.java rename to 1.12/src/main/java/wile/engineersdecor/blocks/BlockDecorFull.java diff --git a/src/main/java/wile/engineersdecor/blocks/BlockDecorLadder.java b/1.12/src/main/java/wile/engineersdecor/blocks/BlockDecorLadder.java similarity index 100% rename from src/main/java/wile/engineersdecor/blocks/BlockDecorLadder.java rename to 1.12/src/main/java/wile/engineersdecor/blocks/BlockDecorLadder.java diff --git a/src/main/java/wile/engineersdecor/blocks/BlockDecorStairs.java b/1.12/src/main/java/wile/engineersdecor/blocks/BlockDecorStairs.java similarity index 100% rename from src/main/java/wile/engineersdecor/blocks/BlockDecorStairs.java rename to 1.12/src/main/java/wile/engineersdecor/blocks/BlockDecorStairs.java diff --git a/src/main/java/wile/engineersdecor/blocks/BlockDecorWall.java b/1.12/src/main/java/wile/engineersdecor/blocks/BlockDecorWall.java similarity index 100% rename from src/main/java/wile/engineersdecor/blocks/BlockDecorWall.java rename to 1.12/src/main/java/wile/engineersdecor/blocks/BlockDecorWall.java diff --git a/src/main/java/wile/engineersdecor/blocks/ModBlocks.java b/1.12/src/main/java/wile/engineersdecor/blocks/ModBlocks.java similarity index 100% rename from src/main/java/wile/engineersdecor/blocks/ModBlocks.java rename to 1.12/src/main/java/wile/engineersdecor/blocks/ModBlocks.java diff --git a/src/main/java/wile/engineersdecor/detail/ClientProxy.java b/1.12/src/main/java/wile/engineersdecor/detail/ClientProxy.java similarity index 100% rename from src/main/java/wile/engineersdecor/detail/ClientProxy.java rename to 1.12/src/main/java/wile/engineersdecor/detail/ClientProxy.java diff --git a/src/main/java/wile/engineersdecor/detail/ModAuxiliaries.java b/1.12/src/main/java/wile/engineersdecor/detail/ModAuxiliaries.java similarity index 100% rename from src/main/java/wile/engineersdecor/detail/ModAuxiliaries.java rename to 1.12/src/main/java/wile/engineersdecor/detail/ModAuxiliaries.java diff --git a/src/main/java/wile/engineersdecor/detail/ModConfig.java b/1.12/src/main/java/wile/engineersdecor/detail/ModConfig.java similarity index 100% rename from src/main/java/wile/engineersdecor/detail/ModConfig.java rename to 1.12/src/main/java/wile/engineersdecor/detail/ModConfig.java diff --git a/src/main/java/wile/engineersdecor/detail/RecipeCondModSpecific.java b/1.12/src/main/java/wile/engineersdecor/detail/RecipeCondModSpecific.java similarity index 100% rename from src/main/java/wile/engineersdecor/detail/RecipeCondModSpecific.java rename to 1.12/src/main/java/wile/engineersdecor/detail/RecipeCondModSpecific.java diff --git a/src/main/java/wile/engineersdecor/detail/ServerProxy.java b/1.12/src/main/java/wile/engineersdecor/detail/ServerProxy.java similarity index 100% rename from src/main/java/wile/engineersdecor/detail/ServerProxy.java rename to 1.12/src/main/java/wile/engineersdecor/detail/ServerProxy.java diff --git a/src/main/resources/assets/engineersdecor/blockstates/clinker_brick_block.json b/1.12/src/main/resources/assets/engineersdecor/blockstates/clinker_brick_block.json similarity index 100% rename from src/main/resources/assets/engineersdecor/blockstates/clinker_brick_block.json rename to 1.12/src/main/resources/assets/engineersdecor/blockstates/clinker_brick_block.json diff --git a/src/main/resources/assets/engineersdecor/blockstates/clinker_brick_stairs.json b/1.12/src/main/resources/assets/engineersdecor/blockstates/clinker_brick_stairs.json similarity index 100% rename from src/main/resources/assets/engineersdecor/blockstates/clinker_brick_stairs.json rename to 1.12/src/main/resources/assets/engineersdecor/blockstates/clinker_brick_stairs.json diff --git a/src/main/resources/assets/engineersdecor/blockstates/concrete_wall.json b/1.12/src/main/resources/assets/engineersdecor/blockstates/concrete_wall.json similarity index 100% rename from src/main/resources/assets/engineersdecor/blockstates/concrete_wall.json rename to 1.12/src/main/resources/assets/engineersdecor/blockstates/concrete_wall.json diff --git a/src/main/resources/assets/engineersdecor/blockstates/iron_sheet_roof.json b/1.12/src/main/resources/assets/engineersdecor/blockstates/iron_sheet_roof.json similarity index 100% rename from src/main/resources/assets/engineersdecor/blockstates/iron_sheet_roof.json rename to 1.12/src/main/resources/assets/engineersdecor/blockstates/iron_sheet_roof.json diff --git a/src/main/resources/assets/engineersdecor/blockstates/iron_sheet_roof_block.json b/1.12/src/main/resources/assets/engineersdecor/blockstates/iron_sheet_roof_block.json similarity index 100% rename from src/main/resources/assets/engineersdecor/blockstates/iron_sheet_roof_block.json rename to 1.12/src/main/resources/assets/engineersdecor/blockstates/iron_sheet_roof_block.json diff --git a/src/main/resources/assets/engineersdecor/blockstates/metal_rung_ladder.json b/1.12/src/main/resources/assets/engineersdecor/blockstates/metal_rung_ladder.json similarity index 100% rename from src/main/resources/assets/engineersdecor/blockstates/metal_rung_ladder.json rename to 1.12/src/main/resources/assets/engineersdecor/blockstates/metal_rung_ladder.json diff --git a/src/main/resources/assets/engineersdecor/blockstates/metal_rung_steps.json b/1.12/src/main/resources/assets/engineersdecor/blockstates/metal_rung_steps.json similarity index 100% rename from src/main/resources/assets/engineersdecor/blockstates/metal_rung_steps.json rename to 1.12/src/main/resources/assets/engineersdecor/blockstates/metal_rung_steps.json diff --git a/src/main/resources/assets/engineersdecor/blockstates/rebar_concrete.json b/1.12/src/main/resources/assets/engineersdecor/blockstates/rebar_concrete.json similarity index 100% rename from src/main/resources/assets/engineersdecor/blockstates/rebar_concrete.json rename to 1.12/src/main/resources/assets/engineersdecor/blockstates/rebar_concrete.json diff --git a/src/main/resources/assets/engineersdecor/blockstates/rebar_concrete_stairs.json b/1.12/src/main/resources/assets/engineersdecor/blockstates/rebar_concrete_stairs.json similarity index 100% rename from src/main/resources/assets/engineersdecor/blockstates/rebar_concrete_stairs.json rename to 1.12/src/main/resources/assets/engineersdecor/blockstates/rebar_concrete_stairs.json diff --git a/src/main/resources/assets/engineersdecor/blockstates/rebar_concrete_wall.json b/1.12/src/main/resources/assets/engineersdecor/blockstates/rebar_concrete_wall.json similarity index 100% rename from src/main/resources/assets/engineersdecor/blockstates/rebar_concrete_wall.json rename to 1.12/src/main/resources/assets/engineersdecor/blockstates/rebar_concrete_wall.json diff --git a/src/main/resources/assets/engineersdecor/blockstates/slag_brick_block.json b/1.12/src/main/resources/assets/engineersdecor/blockstates/slag_brick_block.json similarity index 100% rename from src/main/resources/assets/engineersdecor/blockstates/slag_brick_block.json rename to 1.12/src/main/resources/assets/engineersdecor/blockstates/slag_brick_block.json diff --git a/src/main/resources/assets/engineersdecor/blockstates/slag_brick_stairs.json b/1.12/src/main/resources/assets/engineersdecor/blockstates/slag_brick_stairs.json similarity index 100% rename from src/main/resources/assets/engineersdecor/blockstates/slag_brick_stairs.json rename to 1.12/src/main/resources/assets/engineersdecor/blockstates/slag_brick_stairs.json diff --git a/src/main/resources/assets/engineersdecor/blockstates/treated_wood_ladder.json b/1.12/src/main/resources/assets/engineersdecor/blockstates/treated_wood_ladder.json similarity index 100% rename from src/main/resources/assets/engineersdecor/blockstates/treated_wood_ladder.json rename to 1.12/src/main/resources/assets/engineersdecor/blockstates/treated_wood_ladder.json diff --git a/src/main/resources/assets/engineersdecor/blockstates/treated_wood_pole.json b/1.12/src/main/resources/assets/engineersdecor/blockstates/treated_wood_pole.json similarity index 100% rename from src/main/resources/assets/engineersdecor/blockstates/treated_wood_pole.json rename to 1.12/src/main/resources/assets/engineersdecor/blockstates/treated_wood_pole.json diff --git a/src/main/resources/assets/engineersdecor/blockstates/treated_wood_table.json b/1.12/src/main/resources/assets/engineersdecor/blockstates/treated_wood_table.json similarity index 100% rename from src/main/resources/assets/engineersdecor/blockstates/treated_wood_table.json rename to 1.12/src/main/resources/assets/engineersdecor/blockstates/treated_wood_table.json diff --git a/src/main/resources/assets/engineersdecor/lang/en_us.lang b/1.12/src/main/resources/assets/engineersdecor/lang/en_us.lang similarity index 100% rename from src/main/resources/assets/engineersdecor/lang/en_us.lang rename to 1.12/src/main/resources/assets/engineersdecor/lang/en_us.lang diff --git a/src/main/resources/assets/engineersdecor/logo.png b/1.12/src/main/resources/assets/engineersdecor/logo.png similarity index 100% rename from src/main/resources/assets/engineersdecor/logo.png rename to 1.12/src/main/resources/assets/engineersdecor/logo.png diff --git a/src/main/resources/assets/engineersdecor/models/block/decor_full_block_model.json b/1.12/src/main/resources/assets/engineersdecor/models/block/decor_full_block_model.json similarity index 100% rename from src/main/resources/assets/engineersdecor/models/block/decor_full_block_model.json rename to 1.12/src/main/resources/assets/engineersdecor/models/block/decor_full_block_model.json diff --git a/src/main/resources/assets/engineersdecor/models/block/furniture/treated_wood_table_model.json b/1.12/src/main/resources/assets/engineersdecor/models/block/furniture/treated_wood_table_model.json similarity index 100% rename from src/main/resources/assets/engineersdecor/models/block/furniture/treated_wood_table_model.json rename to 1.12/src/main/resources/assets/engineersdecor/models/block/furniture/treated_wood_table_model.json diff --git a/src/main/resources/assets/engineersdecor/models/block/ladder/metal_rung_ladder_model.json b/1.12/src/main/resources/assets/engineersdecor/models/block/ladder/metal_rung_ladder_model.json similarity index 100% rename from src/main/resources/assets/engineersdecor/models/block/ladder/metal_rung_ladder_model.json rename to 1.12/src/main/resources/assets/engineersdecor/models/block/ladder/metal_rung_ladder_model.json diff --git a/src/main/resources/assets/engineersdecor/models/block/ladder/metal_rung_steps_model.json b/1.12/src/main/resources/assets/engineersdecor/models/block/ladder/metal_rung_steps_model.json similarity index 100% rename from src/main/resources/assets/engineersdecor/models/block/ladder/metal_rung_steps_model.json rename to 1.12/src/main/resources/assets/engineersdecor/models/block/ladder/metal_rung_steps_model.json diff --git a/src/main/resources/assets/engineersdecor/models/block/ladder/treated_wood_ladder_model.json b/1.12/src/main/resources/assets/engineersdecor/models/block/ladder/treated_wood_ladder_model.json similarity index 100% rename from src/main/resources/assets/engineersdecor/models/block/ladder/treated_wood_ladder_model.json rename to 1.12/src/main/resources/assets/engineersdecor/models/block/ladder/treated_wood_ladder_model.json diff --git a/src/main/resources/assets/engineersdecor/models/block/pole/straight_pole_model.json b/1.12/src/main/resources/assets/engineersdecor/models/block/pole/straight_pole_model.json similarity index 100% rename from src/main/resources/assets/engineersdecor/models/block/pole/straight_pole_model.json rename to 1.12/src/main/resources/assets/engineersdecor/models/block/pole/straight_pole_model.json diff --git a/src/main/resources/assets/engineersdecor/models/block/stairs/decor_inner_roof_model.json b/1.12/src/main/resources/assets/engineersdecor/models/block/stairs/decor_inner_roof_model.json similarity index 100% rename from src/main/resources/assets/engineersdecor/models/block/stairs/decor_inner_roof_model.json rename to 1.12/src/main/resources/assets/engineersdecor/models/block/stairs/decor_inner_roof_model.json diff --git a/src/main/resources/assets/engineersdecor/models/block/stairs/decor_inner_stairs_model.json b/1.12/src/main/resources/assets/engineersdecor/models/block/stairs/decor_inner_stairs_model.json similarity index 100% rename from src/main/resources/assets/engineersdecor/models/block/stairs/decor_inner_stairs_model.json rename to 1.12/src/main/resources/assets/engineersdecor/models/block/stairs/decor_inner_stairs_model.json diff --git a/src/main/resources/assets/engineersdecor/models/block/stairs/decor_outer_roof_model.json b/1.12/src/main/resources/assets/engineersdecor/models/block/stairs/decor_outer_roof_model.json similarity index 100% rename from src/main/resources/assets/engineersdecor/models/block/stairs/decor_outer_roof_model.json rename to 1.12/src/main/resources/assets/engineersdecor/models/block/stairs/decor_outer_roof_model.json diff --git a/src/main/resources/assets/engineersdecor/models/block/stairs/decor_outer_stairs_model.json b/1.12/src/main/resources/assets/engineersdecor/models/block/stairs/decor_outer_stairs_model.json similarity index 100% rename from src/main/resources/assets/engineersdecor/models/block/stairs/decor_outer_stairs_model.json rename to 1.12/src/main/resources/assets/engineersdecor/models/block/stairs/decor_outer_stairs_model.json diff --git a/src/main/resources/assets/engineersdecor/models/block/stairs/decor_straight_roof_model.json b/1.12/src/main/resources/assets/engineersdecor/models/block/stairs/decor_straight_roof_model.json similarity index 100% rename from src/main/resources/assets/engineersdecor/models/block/stairs/decor_straight_roof_model.json rename to 1.12/src/main/resources/assets/engineersdecor/models/block/stairs/decor_straight_roof_model.json diff --git a/src/main/resources/assets/engineersdecor/models/block/stairs/decor_straight_stairs_model.json b/1.12/src/main/resources/assets/engineersdecor/models/block/stairs/decor_straight_stairs_model.json similarity index 100% rename from src/main/resources/assets/engineersdecor/models/block/stairs/decor_straight_stairs_model.json rename to 1.12/src/main/resources/assets/engineersdecor/models/block/stairs/decor_straight_stairs_model.json diff --git a/src/main/resources/assets/engineersdecor/models/block/wall/concrete_wall_default.json b/1.12/src/main/resources/assets/engineersdecor/models/block/wall/concrete_wall_default.json similarity index 100% rename from src/main/resources/assets/engineersdecor/models/block/wall/concrete_wall_default.json rename to 1.12/src/main/resources/assets/engineersdecor/models/block/wall/concrete_wall_default.json diff --git a/src/main/resources/assets/engineersdecor/models/block/wall/concrete_wall_inventory.json b/1.12/src/main/resources/assets/engineersdecor/models/block/wall/concrete_wall_inventory.json similarity index 100% rename from src/main/resources/assets/engineersdecor/models/block/wall/concrete_wall_inventory.json rename to 1.12/src/main/resources/assets/engineersdecor/models/block/wall/concrete_wall_inventory.json diff --git a/src/main/resources/assets/engineersdecor/models/block/wall/concrete_wall_post.json b/1.12/src/main/resources/assets/engineersdecor/models/block/wall/concrete_wall_post.json similarity index 100% rename from src/main/resources/assets/engineersdecor/models/block/wall/concrete_wall_post.json rename to 1.12/src/main/resources/assets/engineersdecor/models/block/wall/concrete_wall_post.json diff --git a/src/main/resources/assets/engineersdecor/models/block/wall/concrete_wall_side.json b/1.12/src/main/resources/assets/engineersdecor/models/block/wall/concrete_wall_side.json similarity index 100% rename from src/main/resources/assets/engineersdecor/models/block/wall/concrete_wall_side.json rename to 1.12/src/main/resources/assets/engineersdecor/models/block/wall/concrete_wall_side.json diff --git a/src/main/resources/assets/engineersdecor/recipes/_constants.json b/1.12/src/main/resources/assets/engineersdecor/recipes/_constants.json similarity index 100% rename from src/main/resources/assets/engineersdecor/recipes/_constants.json rename to 1.12/src/main/resources/assets/engineersdecor/recipes/_constants.json diff --git a/src/main/resources/assets/engineersdecor/recipes/_factories.json b/1.12/src/main/resources/assets/engineersdecor/recipes/_factories.json similarity index 100% rename from src/main/resources/assets/engineersdecor/recipes/_factories.json rename to 1.12/src/main/resources/assets/engineersdecor/recipes/_factories.json diff --git a/src/main/resources/assets/engineersdecor/recipes/clinker_brick_recipe.json b/1.12/src/main/resources/assets/engineersdecor/recipes/clinker_brick_recipe.json similarity index 100% rename from src/main/resources/assets/engineersdecor/recipes/clinker_brick_recipe.json rename to 1.12/src/main/resources/assets/engineersdecor/recipes/clinker_brick_recipe.json diff --git a/src/main/resources/assets/engineersdecor/recipes/clinker_brick_stairs_recipe.json b/1.12/src/main/resources/assets/engineersdecor/recipes/clinker_brick_stairs_recipe.json similarity index 100% rename from src/main/resources/assets/engineersdecor/recipes/clinker_brick_stairs_recipe.json rename to 1.12/src/main/resources/assets/engineersdecor/recipes/clinker_brick_stairs_recipe.json diff --git a/src/main/resources/assets/engineersdecor/recipes/clinker_brick_stairs_recipe_decompose.json b/1.12/src/main/resources/assets/engineersdecor/recipes/clinker_brick_stairs_recipe_decompose.json similarity index 100% rename from src/main/resources/assets/engineersdecor/recipes/clinker_brick_stairs_recipe_decompose.json rename to 1.12/src/main/resources/assets/engineersdecor/recipes/clinker_brick_stairs_recipe_decompose.json diff --git a/src/main/resources/assets/engineersdecor/recipes/concrete_wall_recipe_with_ie_installed.json b/1.12/src/main/resources/assets/engineersdecor/recipes/concrete_wall_recipe_with_ie_installed.json similarity index 100% rename from src/main/resources/assets/engineersdecor/recipes/concrete_wall_recipe_with_ie_installed.json rename to 1.12/src/main/resources/assets/engineersdecor/recipes/concrete_wall_recipe_with_ie_installed.json diff --git a/src/main/resources/assets/engineersdecor/recipes/metal_rung_ladder_recipe.json b/1.12/src/main/resources/assets/engineersdecor/recipes/metal_rung_ladder_recipe.json similarity index 100% rename from src/main/resources/assets/engineersdecor/recipes/metal_rung_ladder_recipe.json rename to 1.12/src/main/resources/assets/engineersdecor/recipes/metal_rung_ladder_recipe.json diff --git a/src/main/resources/assets/engineersdecor/recipes/metal_rung_steps_recipe.json b/1.12/src/main/resources/assets/engineersdecor/recipes/metal_rung_steps_recipe.json similarity index 100% rename from src/main/resources/assets/engineersdecor/recipes/metal_rung_steps_recipe.json rename to 1.12/src/main/resources/assets/engineersdecor/recipes/metal_rung_steps_recipe.json diff --git a/src/main/resources/assets/engineersdecor/recipes/rebar_concrete_recipe.json b/1.12/src/main/resources/assets/engineersdecor/recipes/rebar_concrete_recipe.json similarity index 100% rename from src/main/resources/assets/engineersdecor/recipes/rebar_concrete_recipe.json rename to 1.12/src/main/resources/assets/engineersdecor/recipes/rebar_concrete_recipe.json diff --git a/src/main/resources/assets/engineersdecor/recipes/rebar_concrete_stairs_recipe.json b/1.12/src/main/resources/assets/engineersdecor/recipes/rebar_concrete_stairs_recipe.json similarity index 100% rename from src/main/resources/assets/engineersdecor/recipes/rebar_concrete_stairs_recipe.json rename to 1.12/src/main/resources/assets/engineersdecor/recipes/rebar_concrete_stairs_recipe.json diff --git a/src/main/resources/assets/engineersdecor/recipes/rebar_concrete_wall_recipe.json b/1.12/src/main/resources/assets/engineersdecor/recipes/rebar_concrete_wall_recipe.json similarity index 100% rename from src/main/resources/assets/engineersdecor/recipes/rebar_concrete_wall_recipe.json rename to 1.12/src/main/resources/assets/engineersdecor/recipes/rebar_concrete_wall_recipe.json diff --git a/src/main/resources/assets/engineersdecor/recipes/slag_brick_recipe_with_slag.json b/1.12/src/main/resources/assets/engineersdecor/recipes/slag_brick_recipe_with_slag.json similarity index 100% rename from src/main/resources/assets/engineersdecor/recipes/slag_brick_recipe_with_slag.json rename to 1.12/src/main/resources/assets/engineersdecor/recipes/slag_brick_recipe_with_slag.json diff --git a/src/main/resources/assets/engineersdecor/recipes/slag_brick_recipe_without_slag.json b/1.12/src/main/resources/assets/engineersdecor/recipes/slag_brick_recipe_without_slag.json similarity index 100% rename from src/main/resources/assets/engineersdecor/recipes/slag_brick_recipe_without_slag.json rename to 1.12/src/main/resources/assets/engineersdecor/recipes/slag_brick_recipe_without_slag.json diff --git a/src/main/resources/assets/engineersdecor/recipes/slag_brick_stairs_recipe.json b/1.12/src/main/resources/assets/engineersdecor/recipes/slag_brick_stairs_recipe.json similarity index 100% rename from src/main/resources/assets/engineersdecor/recipes/slag_brick_stairs_recipe.json rename to 1.12/src/main/resources/assets/engineersdecor/recipes/slag_brick_stairs_recipe.json diff --git a/src/main/resources/assets/engineersdecor/recipes/treated_wood_ladder_recipe.json b/1.12/src/main/resources/assets/engineersdecor/recipes/treated_wood_ladder_recipe.json similarity index 100% rename from src/main/resources/assets/engineersdecor/recipes/treated_wood_ladder_recipe.json rename to 1.12/src/main/resources/assets/engineersdecor/recipes/treated_wood_ladder_recipe.json diff --git a/src/main/resources/assets/engineersdecor/recipes/treated_wood_pole_recipe.json b/1.12/src/main/resources/assets/engineersdecor/recipes/treated_wood_pole_recipe.json similarity index 100% rename from src/main/resources/assets/engineersdecor/recipes/treated_wood_pole_recipe.json rename to 1.12/src/main/resources/assets/engineersdecor/recipes/treated_wood_pole_recipe.json diff --git a/src/main/resources/assets/engineersdecor/recipes/treated_wood_table_recipe.json b/1.12/src/main/resources/assets/engineersdecor/recipes/treated_wood_table_recipe.json similarity index 100% rename from src/main/resources/assets/engineersdecor/recipes/treated_wood_table_recipe.json rename to 1.12/src/main/resources/assets/engineersdecor/recipes/treated_wood_table_recipe.json diff --git a/src/main/resources/assets/engineersdecor/textures/blocks/clinker_brick/clinker_brick_texture0.png b/1.12/src/main/resources/assets/engineersdecor/textures/blocks/clinker_brick/clinker_brick_texture0.png similarity index 100% rename from src/main/resources/assets/engineersdecor/textures/blocks/clinker_brick/clinker_brick_texture0.png rename to 1.12/src/main/resources/assets/engineersdecor/textures/blocks/clinker_brick/clinker_brick_texture0.png diff --git a/src/main/resources/assets/engineersdecor/textures/blocks/clinker_brick/clinker_brick_texture1.png b/1.12/src/main/resources/assets/engineersdecor/textures/blocks/clinker_brick/clinker_brick_texture1.png similarity index 100% rename from src/main/resources/assets/engineersdecor/textures/blocks/clinker_brick/clinker_brick_texture1.png rename to 1.12/src/main/resources/assets/engineersdecor/textures/blocks/clinker_brick/clinker_brick_texture1.png diff --git a/src/main/resources/assets/engineersdecor/textures/blocks/clinker_brick/clinker_brick_texture2.png b/1.12/src/main/resources/assets/engineersdecor/textures/blocks/clinker_brick/clinker_brick_texture2.png similarity index 100% rename from src/main/resources/assets/engineersdecor/textures/blocks/clinker_brick/clinker_brick_texture2.png rename to 1.12/src/main/resources/assets/engineersdecor/textures/blocks/clinker_brick/clinker_brick_texture2.png diff --git a/src/main/resources/assets/engineersdecor/textures/blocks/clinker_brick/clinker_brick_texture3.png b/1.12/src/main/resources/assets/engineersdecor/textures/blocks/clinker_brick/clinker_brick_texture3.png similarity index 100% rename from src/main/resources/assets/engineersdecor/textures/blocks/clinker_brick/clinker_brick_texture3.png rename to 1.12/src/main/resources/assets/engineersdecor/textures/blocks/clinker_brick/clinker_brick_texture3.png diff --git a/src/main/resources/assets/engineersdecor/textures/blocks/clinker_brick/clinker_brick_texture4.png b/1.12/src/main/resources/assets/engineersdecor/textures/blocks/clinker_brick/clinker_brick_texture4.png similarity index 100% rename from src/main/resources/assets/engineersdecor/textures/blocks/clinker_brick/clinker_brick_texture4.png rename to 1.12/src/main/resources/assets/engineersdecor/textures/blocks/clinker_brick/clinker_brick_texture4.png diff --git a/src/main/resources/assets/engineersdecor/textures/blocks/clinker_brick/clinker_brick_texture5.png b/1.12/src/main/resources/assets/engineersdecor/textures/blocks/clinker_brick/clinker_brick_texture5.png similarity index 100% rename from src/main/resources/assets/engineersdecor/textures/blocks/clinker_brick/clinker_brick_texture5.png rename to 1.12/src/main/resources/assets/engineersdecor/textures/blocks/clinker_brick/clinker_brick_texture5.png diff --git a/src/main/resources/assets/engineersdecor/textures/blocks/clinker_brick/clinker_brick_texture6.png b/1.12/src/main/resources/assets/engineersdecor/textures/blocks/clinker_brick/clinker_brick_texture6.png similarity index 100% rename from src/main/resources/assets/engineersdecor/textures/blocks/clinker_brick/clinker_brick_texture6.png rename to 1.12/src/main/resources/assets/engineersdecor/textures/blocks/clinker_brick/clinker_brick_texture6.png diff --git a/src/main/resources/assets/engineersdecor/textures/blocks/clinker_brick/clinker_brick_texture7.png b/1.12/src/main/resources/assets/engineersdecor/textures/blocks/clinker_brick/clinker_brick_texture7.png similarity index 100% rename from src/main/resources/assets/engineersdecor/textures/blocks/clinker_brick/clinker_brick_texture7.png rename to 1.12/src/main/resources/assets/engineersdecor/textures/blocks/clinker_brick/clinker_brick_texture7.png diff --git a/src/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture0.png b/1.12/src/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture0.png similarity index 100% rename from src/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture0.png rename to 1.12/src/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture0.png diff --git a/src/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture1.png b/1.12/src/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture1.png similarity index 100% rename from src/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture1.png rename to 1.12/src/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture1.png diff --git a/src/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture2.png b/1.12/src/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture2.png similarity index 100% rename from src/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture2.png rename to 1.12/src/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture2.png diff --git a/src/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture3.png b/1.12/src/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture3.png similarity index 100% rename from src/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture3.png rename to 1.12/src/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture3.png diff --git a/src/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture4.png b/1.12/src/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture4.png similarity index 100% rename from src/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture4.png rename to 1.12/src/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture4.png diff --git a/src/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture5.png b/1.12/src/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture5.png similarity index 100% rename from src/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture5.png rename to 1.12/src/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture5.png diff --git a/src/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture6.png b/1.12/src/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture6.png similarity index 100% rename from src/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture6.png rename to 1.12/src/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture6.png diff --git a/src/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture7.png b/1.12/src/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture7.png similarity index 100% rename from src/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture7.png rename to 1.12/src/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture7.png diff --git a/src/main/resources/assets/engineersdecor/textures/blocks/iestyle/ironsheet_roof.png b/1.12/src/main/resources/assets/engineersdecor/textures/blocks/iestyle/ironsheet_roof.png similarity index 100% rename from src/main/resources/assets/engineersdecor/textures/blocks/iestyle/ironsheet_roof.png rename to 1.12/src/main/resources/assets/engineersdecor/textures/blocks/iestyle/ironsheet_roof.png diff --git a/src/main/resources/assets/engineersdecor/textures/blocks/iestyle/ironsheet_roof_top.png b/1.12/src/main/resources/assets/engineersdecor/textures/blocks/iestyle/ironsheet_roof_top.png similarity index 100% rename from src/main/resources/assets/engineersdecor/textures/blocks/iestyle/ironsheet_roof_top.png rename to 1.12/src/main/resources/assets/engineersdecor/textures/blocks/iestyle/ironsheet_roof_top.png diff --git a/src/main/resources/assets/engineersdecor/textures/blocks/iestyle/steel_texture.png b/1.12/src/main/resources/assets/engineersdecor/textures/blocks/iestyle/steel_texture.png similarity index 100% rename from src/main/resources/assets/engineersdecor/textures/blocks/iestyle/steel_texture.png rename to 1.12/src/main/resources/assets/engineersdecor/textures/blocks/iestyle/steel_texture.png diff --git a/src/main/resources/assets/engineersdecor/textures/blocks/iestyle/treated_wood.png b/1.12/src/main/resources/assets/engineersdecor/textures/blocks/iestyle/treated_wood.png similarity index 100% rename from src/main/resources/assets/engineersdecor/textures/blocks/iestyle/treated_wood.png rename to 1.12/src/main/resources/assets/engineersdecor/textures/blocks/iestyle/treated_wood.png diff --git a/src/main/resources/assets/engineersdecor/textures/blocks/iestyle/treated_wood_framed_nailed_texture.png b/1.12/src/main/resources/assets/engineersdecor/textures/blocks/iestyle/treated_wood_framed_nailed_texture.png similarity index 100% rename from src/main/resources/assets/engineersdecor/textures/blocks/iestyle/treated_wood_framed_nailed_texture.png rename to 1.12/src/main/resources/assets/engineersdecor/textures/blocks/iestyle/treated_wood_framed_nailed_texture.png diff --git a/src/main/resources/assets/engineersdecor/textures/blocks/iestyle/treated_wood_framed_texture.png b/1.12/src/main/resources/assets/engineersdecor/textures/blocks/iestyle/treated_wood_framed_texture.png similarity index 100% rename from src/main/resources/assets/engineersdecor/textures/blocks/iestyle/treated_wood_framed_texture.png rename to 1.12/src/main/resources/assets/engineersdecor/textures/blocks/iestyle/treated_wood_framed_texture.png diff --git a/src/main/resources/assets/engineersdecor/textures/blocks/iestyle/treated_wood_pole_texture.png b/1.12/src/main/resources/assets/engineersdecor/textures/blocks/iestyle/treated_wood_pole_texture.png similarity index 100% rename from src/main/resources/assets/engineersdecor/textures/blocks/iestyle/treated_wood_pole_texture.png rename to 1.12/src/main/resources/assets/engineersdecor/textures/blocks/iestyle/treated_wood_pole_texture.png diff --git a/src/main/resources/assets/engineersdecor/textures/blocks/iestyle/treated_wood_rough_texture.png b/1.12/src/main/resources/assets/engineersdecor/textures/blocks/iestyle/treated_wood_rough_texture.png similarity index 100% rename from src/main/resources/assets/engineersdecor/textures/blocks/iestyle/treated_wood_rough_texture.png rename to 1.12/src/main/resources/assets/engineersdecor/textures/blocks/iestyle/treated_wood_rough_texture.png diff --git a/src/main/resources/assets/engineersdecor/textures/blocks/pole/treated_wood_pole_side_texture.png b/1.12/src/main/resources/assets/engineersdecor/textures/blocks/pole/treated_wood_pole_side_texture.png similarity index 100% rename from src/main/resources/assets/engineersdecor/textures/blocks/pole/treated_wood_pole_side_texture.png rename to 1.12/src/main/resources/assets/engineersdecor/textures/blocks/pole/treated_wood_pole_side_texture.png diff --git a/src/main/resources/assets/engineersdecor/textures/blocks/pole/treated_wood_pole_top_texture.png b/1.12/src/main/resources/assets/engineersdecor/textures/blocks/pole/treated_wood_pole_top_texture.png similarity index 100% rename from src/main/resources/assets/engineersdecor/textures/blocks/pole/treated_wood_pole_top_texture.png rename to 1.12/src/main/resources/assets/engineersdecor/textures/blocks/pole/treated_wood_pole_top_texture.png diff --git a/src/main/resources/assets/engineersdecor/textures/blocks/slag_brick/slag_brick_texture0.png b/1.12/src/main/resources/assets/engineersdecor/textures/blocks/slag_brick/slag_brick_texture0.png similarity index 100% rename from src/main/resources/assets/engineersdecor/textures/blocks/slag_brick/slag_brick_texture0.png rename to 1.12/src/main/resources/assets/engineersdecor/textures/blocks/slag_brick/slag_brick_texture0.png diff --git a/src/main/resources/assets/engineersdecor/textures/blocks/slag_brick/slag_brick_texture1.png b/1.12/src/main/resources/assets/engineersdecor/textures/blocks/slag_brick/slag_brick_texture1.png similarity index 100% rename from src/main/resources/assets/engineersdecor/textures/blocks/slag_brick/slag_brick_texture1.png rename to 1.12/src/main/resources/assets/engineersdecor/textures/blocks/slag_brick/slag_brick_texture1.png diff --git a/src/main/resources/assets/engineersdecor/textures/blocks/slag_brick/slag_brick_texture2.png b/1.12/src/main/resources/assets/engineersdecor/textures/blocks/slag_brick/slag_brick_texture2.png similarity index 100% rename from src/main/resources/assets/engineersdecor/textures/blocks/slag_brick/slag_brick_texture2.png rename to 1.12/src/main/resources/assets/engineersdecor/textures/blocks/slag_brick/slag_brick_texture2.png diff --git a/src/main/resources/assets/engineersdecor/textures/blocks/slag_brick/slag_brick_texture3.png b/1.12/src/main/resources/assets/engineersdecor/textures/blocks/slag_brick/slag_brick_texture3.png similarity index 100% rename from src/main/resources/assets/engineersdecor/textures/blocks/slag_brick/slag_brick_texture3.png rename to 1.12/src/main/resources/assets/engineersdecor/textures/blocks/slag_brick/slag_brick_texture3.png diff --git a/src/main/resources/assets/engineersdecor/textures/blocks/slag_brick/slag_brick_texture4.png b/1.12/src/main/resources/assets/engineersdecor/textures/blocks/slag_brick/slag_brick_texture4.png similarity index 100% rename from src/main/resources/assets/engineersdecor/textures/blocks/slag_brick/slag_brick_texture4.png rename to 1.12/src/main/resources/assets/engineersdecor/textures/blocks/slag_brick/slag_brick_texture4.png diff --git a/src/main/resources/assets/engineersdecor/textures/blocks/slag_brick/slag_brick_texture5.png b/1.12/src/main/resources/assets/engineersdecor/textures/blocks/slag_brick/slag_brick_texture5.png similarity index 100% rename from src/main/resources/assets/engineersdecor/textures/blocks/slag_brick/slag_brick_texture5.png rename to 1.12/src/main/resources/assets/engineersdecor/textures/blocks/slag_brick/slag_brick_texture5.png diff --git a/src/main/resources/assets/engineersdecor/textures/blocks/slag_brick/slag_brick_texture6.png b/1.12/src/main/resources/assets/engineersdecor/textures/blocks/slag_brick/slag_brick_texture6.png similarity index 100% rename from src/main/resources/assets/engineersdecor/textures/blocks/slag_brick/slag_brick_texture6.png rename to 1.12/src/main/resources/assets/engineersdecor/textures/blocks/slag_brick/slag_brick_texture6.png diff --git a/src/main/resources/assets/engineersdecor/textures/blocks/slag_brick/slag_brick_texture7.png b/1.12/src/main/resources/assets/engineersdecor/textures/blocks/slag_brick/slag_brick_texture7.png similarity index 100% rename from src/main/resources/assets/engineersdecor/textures/blocks/slag_brick/slag_brick_texture7.png rename to 1.12/src/main/resources/assets/engineersdecor/textures/blocks/slag_brick/slag_brick_texture7.png diff --git a/src/main/resources/mcmod.info b/1.12/src/main/resources/mcmod.info similarity index 100% rename from src/main/resources/mcmod.info rename to 1.12/src/main/resources/mcmod.info diff --git a/src/main/resources/pack.mcmeta b/1.12/src/main/resources/pack.mcmeta similarity index 100% rename from src/main/resources/pack.mcmeta rename to 1.12/src/main/resources/pack.mcmeta diff --git a/1.12/tasks.js b/1.12/tasks.js new file mode 100644 index 0000000..40669ff --- /dev/null +++ b/1.12/tasks.js @@ -0,0 +1,347 @@ +#!/usr/bin/djs +"use strict"; +if(!fs.chdir(fs.dirname(fs.realpath(sys.script)))) throw new Error("Failed to switch to mod source directory."); +if(!fs.isdir("../.git")) throw new Error("Missing git repository in parent directory of mod source."); + +var tasks = {}; + +tasks["dist-check"] = function() { + const uncommitted_changes = sys.shell("git status -s").trim(); + const gittags = sys.shell('git log -1 --format="%D"') + .replace(/[\s]/g,"").split(",") + .filter(function(s){ return s.indexOf("tag:")==0;}) + .map(function(s){ return s.replace(/^tag:/,"");}); + const version_engineersdecor = fs.readfile("gradle.properties", function(line){ + if(line.trim().indexOf("version_engineersdecor")!=0) return false; + return line.replace(/^.*?=/,"").trim() + }).trim(); + const git_remote = sys.shell("git remote -v").trim(); + const git_branch = sys.shell("git rev-parse --abbrev-ref HEAD").trim(); + const git_diff = sys.shell("git diff .").trim(); + var fails = []; + if(version_engineersdecor=="") fails.push("Could not determine 'version_engineersdecor' from gradle properties."); + if(!gittags.length) fails.push("Version not tagged."); + if(!gittags.filter(function(s){return s.indexOf(version_engineersdecor.replace(/[-]/g,""))>=0}).length) fails.push("No tag version not found matching the gradle properties version."); + if(git_remote.replace(/[\s]/g,"").indexOf("git@github.com:stfwi/engineers-decor.git(push)") < 0) fails.push("Not the reference repository."); + if((git_branch != "develop") && (git_branch != "master")) { + fails.push("No valid branch for dist. (branch:'"+git_branch+"')"); + } else if((git_branch == "develop") && (version_engineersdecor.replace(/[^\w\.-]/g,"")=="")) { + fails.push("Cannot make release dist on develop branch."); + } else if((git_branch == "master") && (version_engineersdecor.replace(/[^\w\.-]/g,"")!="")) { + fails.push("Cannot make beta dist on master branch."); + } + if(git_diff !== "") fails.push("Not everything committed to the GIT repository."); + if((!fs.isfile("signing.jks")) || (!fs.isfile("signing.properties"))) fails.push("Jar signing files missing."); + if(fails.length>0) { + for(var i in fails) fails[i] = " - " + fails[i]; + alert("Dist check failed"); + alert(fails.join("\n")+"\n"); + exit(1); + } +}; + +tasks["sync-languages"] = function() { + function load() { + var lang_data = {}; + fs.find("./src/main/resources/assets/engineersdecor/lang", '*.lang', function(f){ + var lang_code = fs.basename(f).replace(/\..*$/,"").trim().toLowerCase(); + var lines = fs.readfile(f).trim().split("\n"); + var was_eol_escape = false; + for(var i in lines) { + if(was_eol_escape) { + var k=0; + for(k=i-1; k>=0; --k) { + if(lines[k] != null) { + lines[k] += "\n" + lines[i]; + break; + } + } + was_eol_escape = lines[i].match(/[^\\][\\]$/) != null; + lines[i] = null; + } else { + lines[i] = lines[i].trim(); + was_eol_escape = lines[i].match(/[^\\][\\]$/) != null; + } + } + lang_data[lang_code] = lines.filter(function(l){return (l!==null);}); + return false; + }); + return lang_data; + } + function reference_content(lang_data, reflang_code) { + var lang_lines = []; + for(var i in lang_data[reflang_code]) { + var txt = lang_data[reflang_code][i].trim(); + if((txt.search(/^#/)>=0) || (txt.search("=")<0)) { lang_lines.push(txt); continue; }; // comment "#" or empty line in the ref lang file + var kv = txt.split("=", 2); + var key = kv[0].trim(); + var val = kv[1].trim(); + var o = {key:key, tr:{}}; + o.tr[reflang_code] = val; + lang_lines.push(o); + } + delete lang_data[reflang_code]; + return lang_lines; + } + function add_language(lang_lines, lang_name, lang_data) { + const find_line = function(lines, key) { + for(var i in lines) { + if((typeof(lines[i]) !== "object")) continue; + if(lines[i].key.toLowerCase()==key.toLowerCase()) return i; + } + return -1; + }; + for(var i in lang_data) { + var txt = lang_data[i].trim(); + if(txt.search(/^#/)>=0) continue; + if(txt.search("=")<0) continue; + var kv = txt.split("=", 2); + var key = kv[0].trim(); + var val = kv[1].trim(); + var line_i = find_line(lang_lines, key); + if(line_i >= 0) { + lang_data[i] = undefined; + lang_lines[line_i].tr[lang_name] = val; + } + } + return lang_data; + } + + function complete_lang_lines(lang_lines, lang_names, reflang_code) { + var lang_outputs = {}; + for(var i in lang_names) lang_outputs[lang_names[i]] = []; + for(var i_line in lang_lines) { + var entry = lang_lines[i_line]; + if(typeof(entry) !== "object") { + for(var i in lang_names) lang_outputs[lang_names[i]].push(entry); + } else { + for(var i in lang_names) { + var name = lang_names[i]; + if(entry.tr[name] !== undefined) { + lang_outputs[name].push(entry.key + "=" + entry.tr[name]); + } else { + var added = entry.key + "=" + entry.tr[reflang_code]; + if((entry.key.search(/\.tip$/)>0) || (entry.key.search(/\.help$/)>0)) added = "#" + added; + lang_outputs[name].push(added); + if(added.search(/^#/)<0) print("[warn] Lang: Added default language for missing entry in " + name + ": '" + added + "'"); + } + } + } + } + return lang_outputs; + } + + const reflang_code = "en_us"; + var lang_data = load(); + var lang_names = Object.keys(lang_data); + var lang_lines = reference_content(lang_data, reflang_code); + for(var lang_name in lang_data) { + lang_data[lang_name] = add_language(lang_lines, lang_name, lang_data[lang_name]); + lang_data[lang_name] = lang_data[lang_name].filter(function(l){ return !!l; }); + if(lang_data[lang_name].length == 0) delete lang_data[lang_name]; + } + var output_data = complete_lang_lines(lang_lines, lang_names, reflang_code); + for(var i in output_data) output_data[i] = output_data[i].join("\n") + "\n\n"; + + // Remaining lines in lang files (not in the reference lang file) + for(var lang_name in lang_data) { + for(var i in lang_data[lang_name]) { + if(lang_data[lang_name][i].search(/^#/)<0) { + var added = "# " + lang_data[lang_name][i].replace(/^[#\s]+/,""); + output_data[lang_name] += added + "\n"; + print("[warn] Lang: Commented out unknown key in " + lang_name + ": '" + added + "'"); + } + } + } + for(var name in output_data) output_data[name] = output_data[name].trim() + "\n"; + + for(var name in output_data) { + fs.writefile("./src/main/resources/assets/engineersdecor/lang/" + name + ".lang", output_data[name]); + } +}; + +tasks["tabs-to-spaces"] = function() { + var file_list = (function() { + var ls = []; + const ext = ['java','lang']; + for(var i in ext) ls = ls.concat(fs.find("./src", '*.'+ext[i])); + for(var i in ls) ls[i] = ls[i].replace(/\\/g,"/"); + ls.sort(); + ls.push("readme.md"); + return ls; + })(); + for(var file_i in file_list) { + var file = file_list[file_i]; + var txt = fs.readfile(file); + if(txt===undefined) throw new Error("Failed to read '" + file + "'"); + const txt_length = txt.length; + txt = txt.replace(/[\t]/g," "); + const n = txt.length - txt_length; + if(n > 0) { + print("File '" + file + "': Changed " + n + " tabs to 2 spaces." ); + fs.writefile(file, txt); + } + } +}; + +tasks["trailing-whitespaces"] = function() { + var file_list = (function() { + var ls = []; + const ext = ['java','json','lang']; + for(var i in ext) ls = ls.concat(fs.find("./src", '*.'+ext[i])); + for(var i in ls) ls[i] = ls[i].replace(/\\/g,"/"); + ls.sort(); + ls.push("readme.md"); + return ls; + })(); + for(var file_i in file_list) { + var file = file_list[file_i]; + var txt = fs.readfile(file); + if(txt===undefined) throw new Error("Failed to read '" + file + "'"); + const txt_length = txt.length; + txt = txt.replace(/[\r\t ]+[\n]/g,"\n"); + const n = txt_length - txt.length; + if(n > 0) { + print("File '" + file + "': Fixed " + n + " lines with trailing whitespaces." ); + fs.writefile(file, txt); + } + } +}; + +tasks["version-check"] = function() { + var version_minecraft=""; + var version_forge=""; + var version_engineersdecor=""; + fs.readfile("gradle.properties", function(line){ + if(line.search(/^[\s]*version_minecraft[\s]*=/i) >= 0) { + version_minecraft = line.replace(/^[^=]+=/,"").trim(); + } else if(line.search(/^[\s]*version_forge[\s]*=/i) >= 0) { + version_forge = line.replace(/^[^=]+=/,"").trim(); + } else if(line.search(/^[\s]*version_engineersdecor[\s]*=/i) >= 0) { + version_engineersdecor = line.replace(/^[^=]+=/,"").trim(); + } + return false; + }) + const combined_version = version_minecraft + "-" + version_engineersdecor; + var readme_version_found = fs.readfile("readme.md", function(line){ + var m = line.match(/^[\s]+-[\s]+v([\d]+[\.][\d]+[\.][\d]+[-][abrc][\d]+)/i); + if((!m) || (!m.length) || (m.length < 2)) { + m = line.match(/^[\s]+-[\s]+v([\d]+[\.][\d]+[\.][\d]+)/i); + if((!m) || (!m.length) || (m.length < 2)) return false; + } + return m[1]==version_engineersdecor; + }); + var ok=true; + if(!readme_version_found) { + alert("Version 'v" + version_engineersdecor + "' not found in the readme changelog."); + ok = false; + } + if(!ok) { + alert("Version data:"); + alert(" - combined_version : '" + combined_version + "'"); + alert(" - version_forge : '" + version_forge + "'"); + exit(1); + } +}; + +tasks["dist"] = function() { + function readme_history(file_path) { + var readme = fs.readfile(file_path); + if(!readme) throw new Error("Failed to load readme.md"); + readme = readme.split(/[\r]?[\n]/); + while((readme.length > 0) && readme[0].search(/^## Revision history/i)<0) readme.shift(); + while((readme.length > 0) && readme[0].trim()=="") readme.shift(); + // revision history section + if(!readme.length) throw new Error("Revision history section not found in readme"); + readme.shift(); + var end_of_history = readme.length; + for(var i=0; i= 0) { end_of_history=i; break; } + if(end_of_history >= readme.length) throw new Error("Could not find the end-of-history header marker."); + // remove empty lines, splitters + while(readme.length >= end_of_history) readme.pop(); + while((readme.length >0) && (readme[readme.length-1].replace(/[\s-]/g,"")=="")) readme.pop(); + + const min_indent = readme + .map(function(s){return s.search(/[^\s]/)}) + .filter(function(e){return e>=0}) + .reduce(function(acc,e){return (e 1) { + for(var i in readme) { readme[i] = readme[i].substr(min_indent-2); } + } + return readme.join("\n"); + } + const html = "
\n" + (readme_history("readme.md").replace(/&/g, "&").replace(/>/g, ">").replace(/";
+  fs.writefile("dist/revision-history.html", html);
+};
+
+tasks["update-json"] = function() {
+  const root_dir = fs.cwd();
+  function read_history() {
+    var readme = fs.readfile(root_dir + "/readme.md");
+    if(!readme) throw new Error("Failed to load readme.md");
+    readme = readme.split(/[\r]?[\n]/);
+    while((readme.length > 0) && readme[0].search(/^## Revision history/i)<0) readme.shift();
+    // revision history section
+    if(!readme.length) throw new Error("Revision history section not found in readme");
+    readme.shift();
+    var end_of_history = readme.length;
+    for(var i=0; i= 0) { end_of_history=i; break; }
+    if(end_of_history >= readme.length) throw new Error("Could not find the end-of-history header marker.");
+    // remove empty lines, splitters
+    while(readme.length >= end_of_history) readme.pop();
+    for(var i in readme) readme[i] = readme[i].replace(/[\s]+$/g,"").replace(/[\t]/g,"  ");
+    readme = readme.filter(function(a){return a.replace(/[\s-]+/g,"")!="";});
+    // condense multilines to single line entries for each fix or feature. ([A] ... [M] ...)
+    for(var i=readme.length-1; i>0; --i) {
+      var line = readme[i].replace(/^\s+/,"");
+      if(line.search(/^[\[\-]/) < 0) {
+        readme[i-1] += " " + line;
+        readme[i] = "";
+      }
+    }
+    readme = readme.filter(function(a){return a!="";});
+    // Condense log entries sepatated with newlines to one line for each version
+    for(var i=readme.length-1; i>0; --i) {
+      var line = readme[i].replace(/^\s+/,"");
+      if(line.search(/^-/) < 0) {
+        readme[i-1] += "\n" + line;
+        readme[i] = "";
+      }
+    }
+    readme = readme.filter(function(a){return a!="";});
+    // Separate versions.
+    var history = {};
+    for(var i in readme) {
+      var line = readme[i].replace(/^[\sv-]+/g,"").trim();
+      var ver = line.substr(0, line.search(" ")).trim().toLowerCase();
+      var txt = line.substr(line.search(" ")).trim();
+      if(history[ver] !== undefined) throw new Error("Double definition of version '" + ver + "' in the readme revision history.");
+      history[ver] = txt;
+    }
+    return history;
+  }
+  var history = read_history();
+  var latest_release = "";
+  var latest_beta = "";
+  for(var ver in history) { latest_beta=ver; break; }
+  for(var ver in history) if(ver.search(/(rc|b|a)/) < 0) { latest_release=ver; break; }
+  var update_json = {
+    homepage: "https://www.curseforge.com/minecraft/mc-mods/engineers-decor/",
+    "1.12.2": history,
+    promos: {
+      "1.12.2-recommended": latest_release,
+      "1.12.2-latest": latest_beta,
+    }
+  }
+  fs.mkdir(root_dir + "/meta");
+  fs.writefile(root_dir + "/meta/update.json", JSON.stringify(update_json, null, 2));
+};
+
+const task_name = sys.args[0];
+if((task_name===undefined) || (tasks[task_name])===undefined) {
+  alert("No task ", task_name);
+  exit(1);
+} else {
+  tasks[task_name]();
+}
diff --git a/1.13/.gitignore b/1.13/.gitignore
new file mode 100644
index 0000000..2103c59
--- /dev/null
+++ b/1.13/.gitignore
@@ -0,0 +1,35 @@
+bin
+*.launch
+.settings
+.metadata
+.classpath
+.project
+out
+*.ipr
+*.iws
+*.iml
+.idea
+build
+.gradle
+*.tmp
+*.log
+*.jks
+eclipse
+run
+tests
+/dist
+signing.*
+src/main/java/archive
+src/main/resources/assets/minecraft
+.vscode
+/classes
+/dev
+/tmp
+/archive
+/assets-src
+.gimp
+*.xcf
+desktop.ini
+.DS_Store
+Thumbs.db
+forge*changelog.txt
diff --git a/1.13/Makefile b/1.13/Makefile
new file mode 100644
index 0000000..1d2c95e
--- /dev/null
+++ b/1.13/Makefile
@@ -0,0 +1,75 @@
+# @file Makefile
+# @author Stefan Wilhelm (wile)
+# @license MIT
+#
+# GNU Make makefile for, well, speeding
+# up the development a bit.
+# You very likely need some tools installed
+# to use all build targets, so this file is
+# not "official". If you work on windows and
+# install GIT with complete shell PATH (the
+# red marked option in the GIT installer) you
+# should have the needed unix tools available.
+# For image stripping install imagemagick and
+# also put the "magick" executable in the PATH.
+#
+MOD_JAR_PREFIX=engineersdecor-
+MOD_JAR=$(filter-out %-sources.jar,$(wildcard build/libs/${MOD_JAR_PREFIX}*.jar))
+
+ifeq ($(OS),Windows_NT)
+GRADLE=gradlew.bat --no-daemon
+GRADLE_STOP=gradlew.bat --stop
+DJS=djs
+else
+GRADLE=./gradlew --no-daemon
+GRADLE_STOP=./gradlew --stop
+DJS=djs
+endif
+
+wildcardr=$(foreach d,$(wildcard $1*),$(call wildcardr,$d/,$2) $(filter $(subst *,%,$2),$d))
+
+#
+# Targets
+#
+.PHONY: default mod init clean clean-all all run install sanatize dist-check dist start-server
+
+default: mod
+
+all: clean clean-all mod | install
+
+mod:
+	@echo "[1.13] Building mod using gradle ..."
+	@$(GRADLE) build $(GRADLE_OPTS)
+
+clean:
+	@echo "[1.13] Cleaning ..."
+	@rm -f build/libs/*
+	@$(GRADLE) clean
+
+clean-all:
+	@echo "[1.13] Cleaning using gradle ..."
+	@rm -f dist/*
+	@$(GRADLE) clean cleanCache
+
+init:
+	@echo "[1.13] Initialising eclipse workspace using gradle ..."
+	@$(GRADLE) eclipse
+
+sanatize:
+	@echo "[1.13] Running sanatising tasks ..."
+	@djs tasks.js trailing-whitespaces
+	@djs tasks.js tabs-to-spaces
+	@djs tasks.js sync-languages
+	@djs tasks.js version-check
+	@djs tasks.js update-json
+	@git status -s .
+
+dist-check:
+	@echo "[1.13] Running dist checks ..."
+	@djs tasks.js dist-check
+
+dist: sanatize dist-check clean-all mod
+	@echo "[1.13] Distribution files ..."
+	@mkdir -p dist
+	@cp build/libs/$(MOD_JAR_PREFIX)* dist/
+	@djs tasks.js dist
diff --git a/1.13/build.gradle b/1.13/build.gradle
new file mode 100644
index 0000000..5d48315
--- /dev/null
+++ b/1.13/build.gradle
@@ -0,0 +1,79 @@
+// @file build.gradle
+// Engineer's decor mod gradle build relay (mc1.13.2)
+buildscript {
+  repositories {
+    maven { url = 'https://files.minecraftforge.net/maven' }
+    jcenter()
+    mavenCentral()
+  }
+  dependencies {
+    classpath group: 'net.minecraftforge.gradle', name: 'ForgeGradle', version: '3.+', changing: true
+  }
+}
+apply plugin: 'net.minecraftforge.gradle'
+apply plugin: 'eclipse'
+sourceCompatibility = targetCompatibility = compileJava.sourceCompatibility = compileJava.targetCompatibility = '1.8'
+//-----------------------------------------------------------------------------
+version = "${version_engineersdecor}"
+group = "wile.engineersdecor"
+archivesBaseName = "engineersdecor-${version_minecraft}"
+
+// def signing = { ->
+//   def sp = new Properties()
+//   if(file("signing.properties").exists()) file("signing.properties").withInputStream { sp.load(it) }
+//   return sp
+// }()
+
+// def git_version = { ->
+//   def stdout = new ByteArrayOutputStream()
+//   exec {
+//     commandLine 'git', 'log', '-1', '--format=%h'
+//     standardOutput = stdout
+//   }
+//   return stdout.toString().trim()
+// }()
+
+minecraft {
+  mappings channel: 'snapshot', version: '20180921-1.13'
+  // accessTransformer = file('build/resources/main/META-INF/accesstransformer.cfg')
+  runs {
+    client {
+      workingDirectory project.file('run')
+      property 'forge.logging.markers', 'SCAN,REGISTRIES,REGISTRYDUMP'
+      property 'forge.logging.console.level', 'debug'
+      mods {
+        engineersdecor {
+          source sourceSets.main
+        }
+      }
+    }
+    server {
+      workingDirectory project.file('run')
+      property 'forge.logging.markers', 'SCAN,REGISTRIES,REGISTRYDUMP'
+      property 'forge.logging.console.level', 'debug'
+      mods {
+        engineersdecor {
+          source sourceSets.main
+        }
+      }
+    }
+  }
+}
+
+dependencies {
+  minecraft "net.minecraftforge:forge:${version_forge_minecraft}"
+}
+
+jar {
+  manifest {
+    attributes([
+      "Specification-Title": "engineersdecor",
+      "Specification-Vendor": "wilechaote",
+      "Specification-Version": "1", // We are version 1 of ourselves
+      "Implementation-Title": project.name,
+      "Implementation-Version": "${version_engineersdecor}",
+      "Implementation-Vendor" :"wilechaote",
+      "Implementation-Timestamp": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ")
+    ])
+  }
+}
diff --git a/1.13/gradle.properties b/1.13/gradle.properties
new file mode 100644
index 0000000..b6af3b5
--- /dev/null
+++ b/1.13/gradle.properties
@@ -0,0 +1,14 @@
+# @file gradle.properties
+org.gradle.daemon=false
+org.gradle.jvmargs=-Xmx8G
+version_minecraft=1.13.2
+version_forge_minecraft=1.13.2-25.0.44
+version_engineersdecor=1.0.0-a1
+#
+# jar signing data loaded from signing.properties in the project root.
+#
+#signing.keystore_file=
+#signing.keystore_alias=
+#signing.keystore_pass=
+#signing.keystore_keypass=
+#fingerprint_sha1.fp_sha1=
diff --git a/1.13/gradle/wrapper/gradle-wrapper.jar b/1.13/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000000000000000000000000000000000000..7a3265ee94c0ab25cf079ac8ccdf87f41d455d42
GIT binary patch
literal 54708
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

_x$+l{{cH8$W#CT literal 0 HcmV?d00001 diff --git a/1.13/gradle/wrapper/gradle-wrapper.properties b/1.13/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..949819d --- /dev/null +++ b/1.13/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-4.9-bin.zip diff --git a/1.13/gradlew b/1.13/gradlew new file mode 100644 index 0000000..cccdd3d --- /dev/null +++ b/1.13/gradlew @@ -0,0 +1,172 @@ +#!/usr/bin/env sh + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/1.13/gradlew.bat b/1.13/gradlew.bat new file mode 100644 index 0000000..e95643d --- /dev/null +++ b/1.13/gradlew.bat @@ -0,0 +1,84 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/1.13/meta/update.json b/1.13/meta/update.json new file mode 100644 index 0000000..f52ed78 --- /dev/null +++ b/1.13/meta/update.json @@ -0,0 +1,10 @@ +{ + "homepage": "https://www.curseforge.com/minecraft/mc-mods/engineers-decor/", + "1.13.2": { + "1.0.0-a1": "[A] Initial port to 1.13.2 with Forge beta." + }, + "promos": { + "1.13.2-recommended": "", + "1.13.2-latest": "1.0.0-a1" + } +} \ No newline at end of file diff --git a/1.13/readme.md b/1.13/readme.md new file mode 100644 index 0000000..3790500 --- /dev/null +++ b/1.13/readme.md @@ -0,0 +1,15 @@ + +## Engineer's Decor (MC1.13.2) + +Mod sources for Minecraft version 1.13.2. + +- Description, credits, and features: Please see the readme in the repository root. + +- Compiled mod distribution channel is curseforge: https://www.curseforge.com/minecraft/mc-mods/engineers-decor/files. + +---- +## Revision history + + - v1.0.0-a1 [A] Initial port to 1.13.2 with Forge beta. + +---- diff --git a/1.13/src/main/java/wile/engineersdecor/ModEngineersDecor.java b/1.13/src/main/java/wile/engineersdecor/ModEngineersDecor.java new file mode 100644 index 0000000..48d24da --- /dev/null +++ b/1.13/src/main/java/wile/engineersdecor/ModEngineersDecor.java @@ -0,0 +1,100 @@ +package wile.engineersdecor; + +import net.minecraft.item.ItemGroup; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.common.crafting.CraftingHelper; +import wile.engineersdecor.blocks.ModBlocks; +import wile.engineersdecor.detail.ModConfig; +import net.minecraft.block.Block; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraftforge.client.model.obj.OBJLoader; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.event.RegistryEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.DistExecutor; +import net.minecraftforge.fml.ModLoadingContext; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; +import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; +import net.minecraftforge.fml.event.lifecycle.InterModEnqueueEvent; +import net.minecraftforge.fml.event.lifecycle.InterModProcessEvent; +import net.minecraftforge.fml.event.server.FMLServerStartingEvent; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import wile.engineersdecor.detail.RecipeCondModSpecific; + + +@Mod("engineersdecor") +public class ModEngineersDecor +{ + public static final String MODID = "engineersdecor"; // fixed name for double checks + private static final Logger LOGGER = LogManager.getLogger(); + + public ModEngineersDecor() + { + FMLJavaModLoadingContext.get().getModEventBus().addListener(this::onSetup); + FMLJavaModLoadingContext.get().getModEventBus().addListener(this::onSendImc); + FMLJavaModLoadingContext.get().getModEventBus().addListener(this::onRecvImc); + FMLJavaModLoadingContext.get().getModEventBus().addListener(this::onClientSetup); + MinecraftForge.EVENT_BUS.register(this); + } + + public static final Logger logger() { return LOGGER; } + + // + // Events + // + + private void onSetup(final FMLCommonSetupEvent event) + { + ModLoadingContext.get().registerConfig(net.minecraftforge.fml.config.ModConfig.Type.COMMON, ModConfig.conf_spec); + LOGGER.info("Registering recipe condition processor ..."); + CraftingHelper.register(new ResourceLocation(MODID, "grc"), new RecipeCondModSpecific()); + } + + private void onClientSetup(final FMLClientSetupEvent event) + {} // Currently not needed: OBJLoader.INSTANCE.addDomain(ModEngineersDecor.MODID); + + private void onSendImc(final InterModEnqueueEvent event) + {} + + private void onRecvImc(final InterModProcessEvent event) + {} + + @SubscribeEvent + public void onServerStarting(FMLServerStartingEvent event) + {} + + @Mod.EventBusSubscriber(bus=Mod.EventBusSubscriber.Bus.MOD) + public static class RegistryEvents + { + @SubscribeEvent + public static void onBlocksRegistry(final RegistryEvent.Register event) + { ModBlocks.registerBlocks(event); } + + @SubscribeEvent + public static void onItemRegistry(final RegistryEvent.Register event) + { ModBlocks.registerItemBlocks(event); } + } + + // + // Sided proxy functionality (skel) + // + public static ISidedProxy proxy = DistExecutor.runForDist(()->ClientProxy::new, ()->ServerProxy::new); + public interface ISidedProxy {} + public static final class ClientProxy implements ISidedProxy {} + public static final class ServerProxy implements ISidedProxy {} + + // + // Item group / creative tab + // + public static final ItemGroup ITEMGROUP = (new ItemGroup("tab" + MODID) { + @OnlyIn(Dist.CLIENT) + public ItemStack createIcon() + { return new ItemStack(ModBlocks.TREATED_WOOD_LADDER); } + }); +} diff --git a/1.13/src/main/java/wile/engineersdecor/blocks/BlockDecor.java b/1.13/src/main/java/wile/engineersdecor/blocks/BlockDecor.java new file mode 100644 index 0000000..5c0018b --- /dev/null +++ b/1.13/src/main/java/wile/engineersdecor/blocks/BlockDecor.java @@ -0,0 +1,73 @@ +/* + * @file BlockDecorFull.java + * @author Stefan Wilhelm (wile) + * @copyright (C) 2019 Stefan Wilhelm + * @license MIT (see https://opensource.org/licenses/MIT) + * + * Common functionality class for decor blocks. + * Mainly needed for: + * - MC block defaults. + * - Tooltip functionality + * - Model initialisation + */ +package wile.engineersdecor.blocks; + +import wile.engineersdecor.detail.ModAuxiliaries; +import net.minecraft.block.Block; +import net.minecraft.block.material.EnumPushReaction; +import net.minecraft.block.state.IBlockState; +import net.minecraft.item.ItemStack; +import net.minecraft.world.IBlockReader; +import net.minecraft.client.util.ITooltipFlag; +import net.minecraft.util.*; +import net.minecraft.util.text.ITextComponent; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import javax.annotation.Nullable; +import java.util.List; + +public class BlockDecor extends Block +{ + + // The config combines some aspects of blocks, allowing to define different behaviour at construction time, without excessive polymorphy. + // It's an old school flag set as it is used internally only and shall not have as littlt impact on performance as possible. + public final long config; + public static final long CFG_DEFAULT = 0x0000000000000000L; // no special config + public static final long CFG_CUTOUT = 0x0000000000000001L; // cutout rendering + public static final long CFG_HORIZIONTAL = 0x0000000000000002L; // horizontal block, affects bounding box calculation at construction time + public static final long CFG_HORIZIONTAL_PLACEMENT = 0x0000000000000004L; // placed in the horizontzal direction the player is looking when placing. + public static final long CFG_WALL_DOOR_CONNECTION = 0x0000000000000008L; // wall block connects to fence gates and doors. + + public BlockDecor(long config, Block.Properties properties) + { super(properties); this.config = config; } + + @Override + @OnlyIn(Dist.CLIENT) + public void addInformation(ItemStack stack, @Nullable IBlockReader world, List tooltip, ITooltipFlag flag) + { ModAuxiliaries.Tooltip.addInformation(stack, world, tooltip, flag, true); } + + @Override + @OnlyIn(Dist.CLIENT) + public BlockRenderLayer getRenderLayer() + { return ((config & CFG_CUTOUT)!=0) ? BlockRenderLayer.CUTOUT : BlockRenderLayer.SOLID; } + + @Override + @SuppressWarnings("deprecation") + public boolean isFullCube(IBlockState state) + { return ((config & CFG_CUTOUT)==0); } + + @Override + @SuppressWarnings("deprecation") + public boolean isNormalCube(IBlockState state) + { return ((config & CFG_CUTOUT)==0); } + + @Override + public boolean canSpawnInBlock() + { return false; } + + @Override + @SuppressWarnings("deprecation") + public EnumPushReaction getPushReaction(IBlockState state) + { return EnumPushReaction.NORMAL; } + +} diff --git a/1.13/src/main/java/wile/engineersdecor/blocks/BlockDecorDirected.java b/1.13/src/main/java/wile/engineersdecor/blocks/BlockDecorDirected.java new file mode 100644 index 0000000..0801e72 --- /dev/null +++ b/1.13/src/main/java/wile/engineersdecor/blocks/BlockDecorDirected.java @@ -0,0 +1,103 @@ +/* + * @file BlockDecorDirected.java + * @author Stefan Wilhelm (wile) + * @copyright (C) 2019 Stefan Wilhelm + * @license MIT (see https://opensource.org/licenses/MIT) + * + * Smaller (cutout) block with a defined facing. + */ +package wile.engineersdecor.blocks; + +import net.minecraft.state.StateContainer; +import net.minecraft.util.math.shapes.VoxelShapes; +import wile.engineersdecor.detail.ModAuxiliaries; +import net.minecraft.item.BlockItemUseContext; +import net.minecraft.state.DirectionProperty; +import net.minecraft.block.Block; +import net.minecraft.block.BlockDirectional; +import net.minecraft.block.state.BlockFaceShape; +import net.minecraft.block.state.IBlockState; +import net.minecraft.world.IBlockReader; +import net.minecraft.util.BlockRenderLayer; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.math.shapes.VoxelShape; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.math.BlockPos; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import javax.annotation.Nullable; +import java.util.ArrayList; +import java.util.Arrays; + + +public class BlockDecorDirected extends BlockDecor +{ + public static final DirectionProperty FACING = BlockDirectional.FACING; + protected final ArrayList AABBs; + + public BlockDecorDirected(long config, Block.Properties builder, final AxisAlignedBB unrotatedAABB) + { + super(config, builder); + setDefaultState(stateContainer.getBaseState().with(FACING, EnumFacing.UP)); + final boolean is_horizontal = ((config & BlockDecor.CFG_HORIZIONTAL)!=0); + AABBs = new ArrayList(Arrays.asList( + VoxelShapes.create(ModAuxiliaries.getRotatedAABB(unrotatedAABB, EnumFacing.DOWN, is_horizontal)), + VoxelShapes.create(ModAuxiliaries.getRotatedAABB(unrotatedAABB, EnumFacing.UP, is_horizontal)), + VoxelShapes.create(ModAuxiliaries.getRotatedAABB(unrotatedAABB, EnumFacing.NORTH, is_horizontal)), + VoxelShapes.create(ModAuxiliaries.getRotatedAABB(unrotatedAABB, EnumFacing.SOUTH, is_horizontal)), + VoxelShapes.create(ModAuxiliaries.getRotatedAABB(unrotatedAABB, EnumFacing.WEST, is_horizontal)), + VoxelShapes.create(ModAuxiliaries.getRotatedAABB(unrotatedAABB, EnumFacing.EAST, is_horizontal)), + VoxelShapes.create(unrotatedAABB), + VoxelShapes.create(unrotatedAABB) + )); + } + + @Override + public boolean isFullCube(IBlockState state) + { return false; } + + @Override + public boolean isNormalCube(IBlockState state) + { return false; } + + @Override + public boolean canSpawnInBlock() + { return false; } + + @Override + @SuppressWarnings("deprecation") + public BlockFaceShape getBlockFaceShape(IBlockReader world, IBlockState state, BlockPos pos, EnumFacing face) + { return BlockFaceShape.UNDEFINED; } + + @Override + @SuppressWarnings("deprecation") + public VoxelShape getShape(IBlockState state, IBlockReader source, BlockPos pos) + { return AABBs.get(((EnumFacing)state.get(FACING)).getIndex() & 0x7); } + + @Override + @SuppressWarnings("deprecation") + public VoxelShape getCollisionShape(IBlockState state, IBlockReader world, BlockPos pos) + { return getShape(state, world, pos); } + + @Override + protected void fillStateContainer(StateContainer.Builder builder) + { builder.add(FACING); } + + @Override + @Nullable + public IBlockState getStateForPlacement(BlockItemUseContext context) { + if((config & CFG_HORIZIONTAL_PLACEMENT)!=0) { + // placement in direction the player is facing + return getDefaultState().with(FACING, context.getPlacementHorizontalFacing()); + } else { + // default: placement on the face the player clicking + return getDefaultState().with(FACING, context.getFace()); + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public BlockRenderLayer getRenderLayer() + { return BlockRenderLayer.CUTOUT; } + +} diff --git a/1.13/src/main/java/wile/engineersdecor/blocks/BlockDecorFull.java b/1.13/src/main/java/wile/engineersdecor/blocks/BlockDecorFull.java new file mode 100644 index 0000000..f18eabf --- /dev/null +++ b/1.13/src/main/java/wile/engineersdecor/blocks/BlockDecorFull.java @@ -0,0 +1,49 @@ +/* + * @file BlockDecorFull.java + * @author Stefan Wilhelm (wile) + * @copyright (C) 2019 Stefan Wilhelm + * @license MIT (see https://opensource.org/licenses/MIT) + * + * Full block characteristics class. Explicitly overrides some + * `Block` methods to return faster due to exclusive block properties. + */ +package wile.engineersdecor.blocks; + +import net.minecraft.block.Block; +import net.minecraft.block.state.IBlockState; +import net.minecraft.client.util.ITooltipFlag; +import net.minecraft.item.ItemStack; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.world.IBlockReader; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import wile.engineersdecor.detail.ModAuxiliaries; +import javax.annotation.Nullable; +import java.util.List; + + +public class BlockDecorFull extends BlockDecor +{ + public BlockDecorFull(long config, Block.Properties properties) + { super(config, properties); } + + @Override + @OnlyIn(Dist.CLIENT) + public void addInformation(ItemStack stack, @Nullable IBlockReader world, List tooltip, ITooltipFlag flag) + { ModAuxiliaries.Tooltip.addInformation(stack, world, tooltip, flag, true); } + + @Override + @SuppressWarnings("deprecation") + public boolean isFullCube(IBlockState state) + { return true; } + + @Override + @SuppressWarnings("deprecation") + public boolean isNormalCube(IBlockState state) + { return true; } + + @Override + public boolean canSpawnInBlock() + { return false; } + +} diff --git a/1.13/src/main/java/wile/engineersdecor/blocks/BlockDecorLadder.java b/1.13/src/main/java/wile/engineersdecor/blocks/BlockDecorLadder.java new file mode 100644 index 0000000..c91a98c --- /dev/null +++ b/1.13/src/main/java/wile/engineersdecor/blocks/BlockDecorLadder.java @@ -0,0 +1,69 @@ +/* + * @file BlockDecorLadder.java + * @author Stefan Wilhelm (wile) + * @copyright (C) 2019 Stefan Wilhelm + * @license MIT (see https://opensource.org/licenses/MIT) + * + * Ladder block. The implementation is based on the vanilla + * net.minecraft.block.BlockLadder. Minor changes to enable + * later configuration (for block list based construction + * time configuration), does not drop when the block behind + * is broken, etc. + */ +package wile.engineersdecor.blocks; + +import wile.engineersdecor.detail.ModAuxiliaries; +import net.minecraft.block.state.IBlockState; +import net.minecraft.block.*; +import net.minecraft.block.material.EnumPushReaction; +import net.minecraft.client.util.ITooltipFlag; +import net.minecraft.item.ItemStack; +import net.minecraft.util.math.shapes.VoxelShape; +import net.minecraft.util.math.shapes.VoxelShapes; +import net.minecraft.util.text.ITextComponent; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraft.world.IBlockReader; +import net.minecraft.util.*; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.math.BlockPos; +import javax.annotation.Nullable; +import java.util.List; + + +public class BlockDecorLadder extends BlockLadder +{ + protected static final AxisAlignedBB EDLADDER_UNROTATED_AABB = ModAuxiliaries.getPixeledAABB(3, 0, 0, 13, 16, 2); + protected static final VoxelShape EDLADDER_SOUTH_AABB = VoxelShapes.create(ModAuxiliaries.getRotatedAABB(EDLADDER_UNROTATED_AABB, EnumFacing.SOUTH, false)); + protected static final VoxelShape EDLADDER_EAST_AABB = VoxelShapes.create(ModAuxiliaries.getRotatedAABB(EDLADDER_UNROTATED_AABB, EnumFacing.EAST, false)); + protected static final VoxelShape EDLADDER_WEST_AABB = VoxelShapes.create(ModAuxiliaries.getRotatedAABB(EDLADDER_UNROTATED_AABB, EnumFacing.WEST, false)); + protected static final VoxelShape EDLADDER_NORTH_AABB = VoxelShapes.create(ModAuxiliaries.getRotatedAABB(EDLADDER_UNROTATED_AABB, EnumFacing.NORTH, false)); + + public BlockDecorLadder(long config, Block.Properties builder) + { super(builder); } + + @Override + @OnlyIn(Dist.CLIENT) + public void addInformation(ItemStack stack, @Nullable IBlockReader world, List tooltip, ITooltipFlag flag) + { ModAuxiliaries.Tooltip.addInformation(stack, world, tooltip, flag, true); } + + public VoxelShape getShape(IBlockState state, IBlockReader worldIn, BlockPos pos) + { + switch ((EnumFacing)state.get(FACING)) { + case NORTH: return EDLADDER_NORTH_AABB; + case SOUTH: return EDLADDER_SOUTH_AABB; + case WEST: return EDLADDER_WEST_AABB; + default: return EDLADDER_EAST_AABB; + } + } + + @Override + public boolean canSpawnInBlock() + { return false; } + + @Override + @SuppressWarnings("deprecation") + public EnumPushReaction getPushReaction(IBlockState state) + { return EnumPushReaction.NORMAL; } + +} diff --git a/1.13/src/main/java/wile/engineersdecor/blocks/BlockDecorStairs.java b/1.13/src/main/java/wile/engineersdecor/blocks/BlockDecorStairs.java new file mode 100644 index 0000000..f0433db --- /dev/null +++ b/1.13/src/main/java/wile/engineersdecor/blocks/BlockDecorStairs.java @@ -0,0 +1,45 @@ +/* + * @file BlockDecorStairs.java + * @author Stefan Wilhelm (wile) + * @copyright (C) 2019 Stefan Wilhelm + * @license MIT (see https://opensource.org/licenses/MIT) + * + * Stairs and roof blocks, almost entirely based on vanilla stairs. + */ +package wile.engineersdecor.blocks; + +import net.minecraft.block.*; +import net.minecraft.block.material.EnumPushReaction; +import net.minecraft.block.state.IBlockState; +import net.minecraft.client.util.ITooltipFlag; +import net.minecraft.item.ItemStack; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.world.IBlockReader; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import wile.engineersdecor.detail.ModAuxiliaries; + +import javax.annotation.Nullable; +import java.util.List; + + +public class BlockDecorStairs extends BlockStairs +{ + public BlockDecorStairs(long config, IBlockState state, Block.Properties properties) + { super(state, properties); } + + @Override + @OnlyIn(Dist.CLIENT) + public void addInformation(ItemStack stack, @Nullable IBlockReader world, List tooltip, ITooltipFlag flag) + { ModAuxiliaries.Tooltip.addInformation(stack, world, tooltip, flag, true); } + + @Override + public boolean canSpawnInBlock() + { return false; } + + @Override + @SuppressWarnings("deprecation") + public EnumPushReaction getPushReaction(IBlockState state) + { return EnumPushReaction.NORMAL; } + +} diff --git a/1.13/src/main/java/wile/engineersdecor/blocks/BlockDecorWall.java b/1.13/src/main/java/wile/engineersdecor/blocks/BlockDecorWall.java new file mode 100644 index 0000000..916a970 --- /dev/null +++ b/1.13/src/main/java/wile/engineersdecor/blocks/BlockDecorWall.java @@ -0,0 +1,75 @@ +/* + * @file BlockDecorWall.java + * @author Stefan Wilhelm (wile) + * @copyright (C) 2019 Stefan Wilhelm + * @license MIT (see https://opensource.org/licenses/MIT) + * + * Wall blocks. + */ +package wile.engineersdecor.blocks; + +import net.minecraft.block.*; +import net.minecraft.block.state.BlockFaceShape; +import net.minecraft.block.state.IBlockState; +import net.minecraft.client.util.ITooltipFlag; +import net.minecraft.init.Fluids; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.shapes.VoxelShape; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.world.IBlockReader; +import net.minecraft.world.IWorld; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import wile.engineersdecor.detail.ModAuxiliaries; + +import javax.annotation.Nullable; +import java.util.List; + + +public class BlockDecorWall extends BlockWall +{ + private final VoxelShape[] shape_voxels; + private final VoxelShape[] collision_shape_voxels; + + public BlockDecorWall(long config, Block.Properties builder) + { + super(builder); + this.shape_voxels = buildWallShapes(4.0F, 4.0F, 16.0F, 0.0F, 16.0F); + this.collision_shape_voxels = buildWallShapes(4.0F, 4.0F, 24.0F, 0.0F, 24.0F); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void addInformation(ItemStack stack, @Nullable IBlockReader world, List tooltip, ITooltipFlag flag) + { ModAuxiliaries.Tooltip.addInformation(stack, world, tooltip, flag, true); } + + protected VoxelShape[] buildWallShapes(float pole_width_x, float pole_width_z, float pole_height, float side_min_y, float side_max_y) + { return super.func_196408_a(pole_width_x, pole_width_z, pole_height, side_min_y, side_max_y); } + + @Override + public VoxelShape getShape(IBlockState state, IBlockReader world, BlockPos pos) + { return shape_voxels[this.getIndex(state)]; } + + @Override + public VoxelShape getCollisionShape(IBlockState state, IBlockReader world, BlockPos pos) + { return collision_shape_voxels[this.getIndex(state)]; } + + private boolean attachesTo(IBlockState state, BlockFaceShape shape) + { final Block block = state.getBlock(); return (shape==BlockFaceShape.SOLID) && (!isExcepBlockForAttachWithPiston(block)) || (shape==BlockFaceShape.MIDDLE_POLE_THICK) || ((shape==BlockFaceShape.MIDDLE_POLE) && (block instanceof BlockFenceGate)); } + + @Override + public IBlockState updatePostPlacement(IBlockState state, EnumFacing facing, IBlockState facingState, IWorld world, BlockPos currentPos, BlockPos facingPos) + { + if(state.get(WATERLOGGED)) world.getPendingFluidTicks().scheduleTick(currentPos, Fluids.WATER, Fluids.WATER.getTickRate(world)); + if(facing == EnumFacing.DOWN) return super.updatePostPlacement(state, facing, facingState, world, currentPos, facingPos); + boolean n = (facing==EnumFacing.NORTH) ? this.attachesTo(facingState, facingState.getBlockFaceShape(world, facingPos, facing.getOpposite())) : state.get(NORTH); + boolean e = (facing==EnumFacing.EAST) ? this.attachesTo(facingState, facingState.getBlockFaceShape(world, facingPos, facing.getOpposite())) : state.get(EAST); + boolean s = (facing==EnumFacing.SOUTH) ? this.attachesTo(facingState, facingState.getBlockFaceShape(world, facingPos, facing.getOpposite())) : state.get(SOUTH); + boolean w = (facing==EnumFacing.WEST) ? this.attachesTo(facingState, facingState.getBlockFaceShape(world, facingPos, facing.getOpposite())) : state.get(WEST); + boolean not_straight = (!n || !s || e || w) && (n || s || !e || !w); + return state.with(UP, not_straight).with(NORTH, n).with(EAST, e).with(SOUTH, s).with(WEST, w); + } + +} diff --git a/1.13/src/main/java/wile/engineersdecor/blocks/ModBlocks.java b/1.13/src/main/java/wile/engineersdecor/blocks/ModBlocks.java new file mode 100644 index 0000000..e736ad6 --- /dev/null +++ b/1.13/src/main/java/wile/engineersdecor/blocks/ModBlocks.java @@ -0,0 +1,164 @@ +/* + * @file ModBlocks.java + * @author Stefan Wilhelm (wile) + * @copyright (C) 2018 Stefan Wilhelm + * @license MIT (see https://opensource.org/licenses/MIT) + * + * Definition and initialisation of blocks of this + * module, along with their tile entities if applicable. + * + * Note: Straight forward definition of different blocks/entities + * to make recipes, models and texture definitions easier. + */ +package wile.engineersdecor.blocks; + +import wile.engineersdecor.ModEngineersDecor; +import wile.engineersdecor.detail.ModAuxiliaries; +import net.minecraft.block.material.MaterialColor; +import net.minecraft.block.Block; +import net.minecraft.block.SoundType; +import net.minecraft.block.material.Material; +import net.minecraft.item.Item; +import net.minecraft.item.ItemBlock; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.event.RegistryEvent; +import java.util.ArrayList; +import java.util.List; +import java.util.Collections; +import javax.annotation.Nonnull; + +@SuppressWarnings("unused") +public class ModBlocks +{ + public static final BlockDecorFull CLINKER_BRICK_BLOCK = (BlockDecorFull)(new BlockDecorFull( + BlockDecor.CFG_DEFAULT, + Block.Properties.create(Material.ROCK, MaterialColor.STONE).hardnessAndResistance(2f, 50f).sound(SoundType.STONE) + )).setRegistryName(new ResourceLocation(ModEngineersDecor.MODID, "clinker_brick_block")); + + public static final BlockDecorStairs CLINKER_BRICK_STAIRS = (BlockDecorStairs)(new BlockDecorStairs( + BlockDecor.CFG_DEFAULT, + CLINKER_BRICK_BLOCK.getDefaultState(), + Block.Properties.create(Material.ROCK, MaterialColor.STONE).hardnessAndResistance(2f, 50f).sound(SoundType.STONE) + )).setRegistryName(new ResourceLocation(ModEngineersDecor.MODID, "clinker_brick_stairs")); + + public static final BlockDecorFull SLAG_BRICK_BLOCK = (BlockDecorFull)(new BlockDecorFull( + BlockDecor.CFG_DEFAULT, + Block.Properties.create(Material.ROCK, MaterialColor.STONE).hardnessAndResistance(2f, 50f).sound(SoundType.STONE) + )).setRegistryName(new ResourceLocation(ModEngineersDecor.MODID, "slag_brick_block")); + + public static final BlockDecorStairs SLAG_BRICK_STAIRS = (BlockDecorStairs)(new BlockDecorStairs( + BlockDecor.CFG_DEFAULT, + SLAG_BRICK_BLOCK.getDefaultState(), + Block.Properties.create(Material.ROCK, MaterialColor.STONE).hardnessAndResistance(2f, 50f).sound(SoundType.STONE) + )).setRegistryName(new ResourceLocation(ModEngineersDecor.MODID, "slag_brick_stairs")); + + public static final BlockDecorFull REBAR_CONCRETE_BLOCK = (BlockDecorFull)(new BlockDecorFull( + BlockDecor.CFG_DEFAULT, + Block.Properties.create(Material.ROCK, MaterialColor.STONE).hardnessAndResistance(6f, 2000f).sound(SoundType.STONE) + )).setRegistryName(new ResourceLocation(ModEngineersDecor.MODID, "rebar_concrete")); + + public static final BlockDecorStairs REBAR_CONCRETE_STAIRS = (BlockDecorStairs)(new BlockDecorStairs( + BlockDecor.CFG_DEFAULT, + REBAR_CONCRETE_BLOCK.getDefaultState(), + Block.Properties.create(Material.ROCK, MaterialColor.STONE).hardnessAndResistance(2f, 2000f).sound(SoundType.STONE) + )).setRegistryName(new ResourceLocation(ModEngineersDecor.MODID, "rebar_concrete_stairs")); + + public static final BlockDecorWall REBAR_CONCRETE_WALL = (BlockDecorWall)(new BlockDecorWall( + BlockDecor.CFG_DEFAULT, + Block.Properties.create(Material.ROCK, MaterialColor.STONE).hardnessAndResistance(2f, 2000f).sound(SoundType.STONE) + )).setRegistryName(new ResourceLocation(ModEngineersDecor.MODID, "rebar_concrete_wall")); + + public static final BlockDecorWall CONCRETE_WALL = (BlockDecorWall)(new BlockDecorWall( + BlockDecor.CFG_DEFAULT, + Block.Properties.create(Material.ROCK, MaterialColor.STONE).hardnessAndResistance(2f, 50f).sound(SoundType.STONE) + )).setRegistryName(new ResourceLocation(ModEngineersDecor.MODID, "concrete_wall")); + + public static final BlockDecorLadder METAL_RUNG_LADDER = (BlockDecorLadder)(new BlockDecorLadder( + BlockDecor.CFG_DEFAULT, + Block.Properties.create(Material.IRON, MaterialColor.IRON).hardnessAndResistance(1.8f, 25f).sound(SoundType.METAL) + )).setRegistryName(new ResourceLocation(ModEngineersDecor.MODID, "metal_rung_ladder")); + + public static final BlockDecorLadder METAL_RUNG_STEPS = (BlockDecorLadder)(new BlockDecorLadder( + BlockDecor.CFG_DEFAULT, + Block.Properties.create(Material.IRON, MaterialColor.IRON).hardnessAndResistance(1.8f, 25f).sound(SoundType.METAL) + )).setRegistryName(new ResourceLocation(ModEngineersDecor.MODID, "metal_rung_steps")); + + public static final BlockDecorLadder TREATED_WOOD_LADDER = (BlockDecorLadder)(new BlockDecorLadder( + BlockDecor.CFG_DEFAULT, + Block.Properties.create(Material.WOOD, MaterialColor.WOOD).hardnessAndResistance(1.8f, 25f).sound(SoundType.WOOD) + )).setRegistryName(new ResourceLocation(ModEngineersDecor.MODID, "treated_wood_ladder")); + + public static final BlockDecor TREATED_WOOD_TABLE = (BlockDecor)(new BlockDecor( + BlockDecor.CFG_CUTOUT, + Block.Properties.create(Material.WOOD, MaterialColor.WOOD).hardnessAndResistance(1.0f, 15f).sound(SoundType.WOOD) + )).setRegistryName(new ResourceLocation(ModEngineersDecor.MODID, "treated_wood_table")); + + public static final BlockDecorDirected TREATED_WOOD_POLE = (BlockDecorDirected)(new BlockDecorDirected( + BlockDecor.CFG_CUTOUT, + Block.Properties.create(Material.WOOD, MaterialColor.WOOD).hardnessAndResistance(1.0f, 15f).sound(SoundType.WOOD), + ModAuxiliaries.getPixeledAABB(5.8,5.8,0, 10.2,10.2,16) + )).setRegistryName(new ResourceLocation(ModEngineersDecor.MODID, "treated_wood_pole")); + + // public static final BlockDecorFull IRON_SHEET_ROOF_FULLBLOCK = new BlockDecorFull("iron_sheet_roof_block", 0, Material.IRON, 1.8f, 25f, SoundType.METAL); + // public static final BlockDecorStairs IRON_SHEET_ROOF = new BlockDecorStairs("iron_sheet_roof", IRON_SHEET_ROOF_FULLBLOCK.getDefaultState()); + + private static final Block modBlocks[] = { + CLINKER_BRICK_BLOCK, + CLINKER_BRICK_STAIRS, + SLAG_BRICK_BLOCK, + SLAG_BRICK_STAIRS, + REBAR_CONCRETE_BLOCK, + REBAR_CONCRETE_STAIRS, + REBAR_CONCRETE_WALL, + + METAL_RUNG_LADDER, + METAL_RUNG_STEPS, + TREATED_WOOD_LADDER, + + TREATED_WOOD_POLE, + TREATED_WOOD_TABLE, + }; + + private static final Block ieDependentBlocks[] = { + CONCRETE_WALL + }; + + private static final Block devBlocks[] = { +// IRON_SHEET_ROOF, // model looks not good enough yet + }; + + private static ArrayList registeredBlocks = new ArrayList<>(); + + @Nonnull + public static List getRegisteredBlocks() + { return Collections.unmodifiableList(registeredBlocks); } + + public static final void registerBlocks(RegistryEvent.Register event) + { + ArrayList allBlocks = new ArrayList<>(); + Collections.addAll(allBlocks, modBlocks); + // @todo: find way to remove items from JEI, creative tab, etc instead of omitting registration. + if(ModAuxiliaries.isModLoaded("immersiveengineering")) ModAuxiliaries.logInfo("Immersive Engineering also installed ..."); + Collections.addAll(allBlocks, ieDependentBlocks); + // @todo: config not available yet, other registration control for experimental features needed. + //if(ModConfig.MISC.with_experimental.get()) Collections.addAll(allBlocks, devBlocks); + registeredBlocks.addAll(allBlocks); + for(Block e:registeredBlocks) event.getRegistry().register(e); + ModAuxiliaries.logInfo("Registered " + Integer.toString(registeredBlocks.size()) + " blocks."); + } + + /** + * Registers items for all blocks. Requires registerBlocks() event to be received first. + */ + public static final void registerItemBlocks(RegistryEvent.Register event) + { + int n = 0; + for(Block e:registeredBlocks) { + ResourceLocation rl = e.getRegistryName(); + if(rl == null) continue; + event.getRegistry().register(new ItemBlock(e, (new ItemBlock.Properties().group(ModEngineersDecor.ITEMGROUP))).setRegistryName(rl)); + ++n; + } + } + +} diff --git a/1.13/src/main/java/wile/engineersdecor/detail/ModAuxiliaries.java b/1.13/src/main/java/wile/engineersdecor/detail/ModAuxiliaries.java new file mode 100644 index 0000000..f26125f --- /dev/null +++ b/1.13/src/main/java/wile/engineersdecor/detail/ModAuxiliaries.java @@ -0,0 +1,167 @@ +/* + * @file ModAuxiliaries.java + * @author Stefan Wilhelm (wile) + * @copyright (C) 2018 Stefan Wilhelm + * @license MIT (see https://opensource.org/licenses/MIT) + * + * General commonly used functionality. + * + * @TODO KEYBOARD INPUT + */ +package wile.engineersdecor.detail; + +import net.minecraft.util.EnumFacing; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.text.TextComponentString; +import net.minecraft.world.IBlockReader; +import net.minecraftforge.fml.ModList; +import org.lwjgl.glfw.GLFW; +import wile.engineersdecor.ModEngineersDecor; +import net.minecraft.item.ItemStack; +import net.minecraft.client.util.ITooltipFlag; +import net.minecraft.client.util.InputMappings; +import net.minecraft.util.text.TextComponentTranslation; +import net.minecraft.util.text.TextFormatting; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + + +import javax.annotation.Nullable; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class ModAuxiliaries +{ + /** + * Text localisation wrapper, implicitly prepends `ModEngineersDecor.MODID` to the + * translation keys. Forces formatting argument, nullable if no special formatting shall be applied.. + */ + public static TextComponentTranslation localizable(String modtrkey, @Nullable TextFormatting color, Object... args) + { + TextComponentTranslation tr = new TextComponentTranslation(ModEngineersDecor.MODID+"."+modtrkey, args); + if(color!=null) tr.getStyle().setColor(color); + return tr; + } + + @OnlyIn(Dist.CLIENT) + public static String localize(String translationKey, Object... args) + { + TextComponentTranslation tr = new TextComponentTranslation(translationKey, args); + tr.getStyle().setColor(TextFormatting.RESET); + final String ft = tr.getFormattedText(); + if(ft.contains("${")) { + // Non-recursive, non-argument lang file entry cross referencing. + Pattern pt = Pattern.compile("\\$\\{([\\w\\.]+)\\}"); + Matcher mt = pt.matcher(ft); + StringBuffer sb = new StringBuffer(); + while(mt.find()) mt.appendReplacement(sb, (new TextComponentTranslation(mt.group(1))).getFormattedText().trim()); + mt.appendTail(sb); + return sb.toString(); + } else { + return ft; + } + } + + /** + * Returns true if a given key is translated for the current language. + */ + @OnlyIn(Dist.CLIENT) + public static boolean hasTranslation(String key) + { return net.minecraft.client.resources.I18n.hasKey(key); } + + public static final class Tooltip + { + @OnlyIn(Dist.CLIENT) + public static boolean extendedTipCondition() + { return InputMappings.isKeyDown(GLFW.GLFW_KEY_LEFT_SHIFT) || InputMappings.isKeyDown(GLFW.GLFW_KEY_RIGHT_SHIFT); } + + @OnlyIn(Dist.CLIENT) + public static boolean helpCondition() + { return extendedTipCondition() && (InputMappings.isKeyDown(GLFW.GLFW_KEY_LEFT_CONTROL) || InputMappings.isKeyDown(GLFW.GLFW_KEY_RIGHT_CONTROL)); } + + /** + * Adds an extended tooltip or help tooltip depending on the key states of CTRL and SHIFT. + * Returns true if the localisable help/tip was added, false if not (either not CTL/SHIFT or + * no translation found). + */ + @OnlyIn(Dist.CLIENT) + public static boolean addInformation(@Nullable String advancedTooltipTranslationKey, @Nullable String helpTranslationKey, List tooltip, ITooltipFlag flag, boolean addAdvancedTooltipHints) + { + // Note: intentionally not using keybinding here, this must be `control` or `shift`. MC uses lwjgl Keyboard, + // so using this also here should be ok. + final boolean help_available = (helpTranslationKey != null) && ModAuxiliaries.hasTranslation(helpTranslationKey + ".help"); + final boolean tip_available = (advancedTooltipTranslationKey != null) && ModAuxiliaries.hasTranslation(helpTranslationKey + ".tip"); + if((!help_available) && (!tip_available)) return false; + if(helpCondition()) { + if(!help_available) return false; + String s = localize(helpTranslationKey + ".help"); + if(s.isEmpty()) return false; + tooltip.add(new TextComponentString(s)); // @todo: check how to optimise that (to use TextComponentTranslation directly without compat losses) + return true; + } else if(extendedTipCondition()) { + if(!tip_available) return false; + String s = localize(advancedTooltipTranslationKey + ".tip"); + if(s.isEmpty()) return false; + tooltip.add(new TextComponentString(s)); + return true; + } else if(addAdvancedTooltipHints) { + String s = ""; + if(tip_available) s += localize(ModEngineersDecor.MODID + ".tooltip.hint.extended") + (help_available ? " " : ""); + if(help_available) s += localize(ModEngineersDecor.MODID + ".tooltip.hint.help"); + tooltip.add(new TextComponentString(s)); + } + return false; + } + + /** + * Adds an extended tooltip or help tooltip for a given stack depending on the key states of CTRL and SHIFT. + * Format in the lang file is (e.g. for items): "item.MODID.REGISTRYNAME.tip" and "item.MODID.REGISTRYNAME.help". + * Return value see method pattern above. + */ + @OnlyIn(Dist.CLIENT) + public static boolean addInformation(ItemStack stack, @Nullable IBlockReader world, List tooltip, ITooltipFlag flag, boolean addAdvancedTooltipHints) + { return addInformation(stack.getTranslationKey(), stack.getTranslationKey(), tooltip, flag, addAdvancedTooltipHints); } + } + + public static final AxisAlignedBB getPixeledAABB(double x0, double y0, double z0, double x1, double y1, double z1) + { return new AxisAlignedBB(x0/16.0, y0/16.0, z0/16.0, x1/16.0, y1/16.0, z1/16.0); } + + public static final AxisAlignedBB getRotatedAABB(AxisAlignedBB bb, EnumFacing new_facing, boolean horizontal_rotation) + { + if(!horizontal_rotation) { + switch(new_facing.getIndex()) { + case 0: return new AxisAlignedBB(1-bb.maxX, 1-bb.maxZ, 1-bb.maxY, 1-bb.minX, 1-bb.minZ, 1-bb.minY); // D + case 1: return new AxisAlignedBB(1-bb.maxX, bb.minZ, bb.minY, 1-bb.minX, bb.maxZ, bb.maxY); // U + case 2: return new AxisAlignedBB(1-bb.maxX, bb.minY, 1-bb.maxZ, 1-bb.minX, bb.maxY, 1-bb.minZ); // N + case 3: return new AxisAlignedBB( bb.minX, bb.minY, bb.minZ, bb.maxX, bb.maxY, bb.maxZ); // S --> bb + case 4: return new AxisAlignedBB(1-bb.maxZ, bb.minY, bb.minX, 1-bb.minZ, bb.maxY, bb.maxX); // W + case 5: return new AxisAlignedBB( bb.minZ, bb.minY, 1-bb.maxX, bb.maxZ, bb.maxY, 1-bb.minX); // E + } + } else { + switch(new_facing.getIndex()) { + case 0: return new AxisAlignedBB( bb.minX, bb.minY, bb.minZ, bb.maxX, bb.maxY, bb.maxZ); // D --> bb + case 1: return new AxisAlignedBB( bb.minX, bb.minY, bb.minZ, bb.maxX, bb.maxY, bb.maxZ); // U --> bb + case 2: return new AxisAlignedBB( bb.minX, bb.minY, bb.minZ, bb.maxX, bb.maxY, bb.maxZ); // N --> bb + case 3: return new AxisAlignedBB(1-bb.maxX, bb.minY, 1-bb.maxZ, 1-bb.minX, bb.maxY, 1-bb.minZ); // S + case 4: return new AxisAlignedBB( bb.minZ, bb.minY, 1-bb.maxX, bb.maxZ, bb.maxY, 1-bb.minX); // W + case 5: return new AxisAlignedBB(1-bb.maxZ, bb.minY, bb.minX, 1-bb.minZ, bb.maxY, bb.maxX); // E + } + } + return bb; + } + + public static final boolean isModLoaded(final String registry_name) + { return ModList.get().isLoaded(registry_name); } + + public static final void logInfo(final String msg) + { ModEngineersDecor.logger().info(msg); } + + public static final void logWarn(final String msg) + { ModEngineersDecor.logger().warn(msg); } + + public static final void logError(final String msg) + { ModEngineersDecor.logger().error(msg); } + +} diff --git a/1.13/src/main/java/wile/engineersdecor/detail/ModConfig.java b/1.13/src/main/java/wile/engineersdecor/detail/ModConfig.java new file mode 100644 index 0000000..7e9600a --- /dev/null +++ b/1.13/src/main/java/wile/engineersdecor/detail/ModConfig.java @@ -0,0 +1,35 @@ +/* + * @file ModConfig.java + * @author Stefan Wilhelm (wile) + * @copyright (C) 2018 Stefan Wilhelm + * @license MIT (see https://opensource.org/licenses/MIT) + * + * Main class for module settings. Handles reading and + * saving the config file. + */ +package wile.engineersdecor.detail; + +import wile.engineersdecor.ModEngineersDecor; +import net.minecraftforge.common.ForgeConfigSpec; + +public class ModConfig +{ + private static final ForgeConfigSpec.Builder BUILDER = new ForgeConfigSpec.Builder(); + public static final Miscellaneous MISC = new Miscellaneous(BUILDER); + public static final ForgeConfigSpec conf_spec = BUILDER.build(); + + public static final class Miscellaneous + { + public final ForgeConfigSpec.ConfigValue with_experimental; + + public Miscellaneous(ForgeConfigSpec.Builder builder) + { + builder.push("Miscellaneous"); + with_experimental = builder + .translation(ModEngineersDecor.MODID + ".config.with_experimental") + .comment("Enables experimental features. Use at own risk.") + .define("with_experimental", false); + builder.pop(); + } + } +} diff --git a/1.13/src/main/java/wile/engineersdecor/detail/RecipeCondModSpecific.java b/1.13/src/main/java/wile/engineersdecor/detail/RecipeCondModSpecific.java new file mode 100644 index 0000000..bc6f7f9 --- /dev/null +++ b/1.13/src/main/java/wile/engineersdecor/detail/RecipeCondModSpecific.java @@ -0,0 +1,71 @@ +/* + * @file RecipeCondRegistered.java + * @author Stefan Wilhelm (wile) + * @copyright (C) 2018 Stefan Wilhelm + * @license MIT (see https://opensource.org/licenses/MIT) + * + * Recipe condition to enable opt'ing out JSON based recipes, referenced + * in assets/engineersdecor/recipes/_factories.json with full path (therefore + * I had to make a separate file for that instead of a few lines in + * ModAuxiliaries). + */ +package wile.engineersdecor.detail; + + +import net.minecraft.block.Block; +import net.minecraft.item.Item; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.common.crafting.IConditionSerializer; +import net.minecraftforge.registries.IForgeRegistry; +import net.minecraftforge.registries.ForgeRegistries; + +import com.google.gson.*; +import javax.annotation.Nullable; +import javax.annotation.Nonnull; +import java.util.function.BooleanSupplier; + + +public class RecipeCondModSpecific implements IConditionSerializer +{ + public static final BooleanSupplier RECIPE_INCLUDE = ()->true; + public static final BooleanSupplier RECIPE_EXCLUDE = ()->false; + + @Override + public @Nonnull BooleanSupplier parse(@Nullable JsonObject json) { + try { + if(json==null) return RECIPE_EXCLUDE; + final IForgeRegistry block_registry = ForgeRegistries.BLOCKS; + final IForgeRegistry item_registry = ForgeRegistries.ITEMS; + final JsonArray items = json.getAsJsonArray("required"); + if(items!=null) { + for(JsonElement e: items) { + if(!e.isJsonPrimitive()) continue; + final ResourceLocation rl = new ResourceLocation(((JsonPrimitive)e).getAsString()); + if((!block_registry.containsKey(rl)) && (!item_registry.containsKey(rl))) return RECIPE_EXCLUDE; // required item not registered + } + } + final JsonPrimitive result = json.getAsJsonPrimitive("result"); + if(result != null) { + final ResourceLocation rl = new ResourceLocation(result.getAsString()); + if((!block_registry.containsKey(rl)) && (!item_registry.containsKey(rl))) return RECIPE_EXCLUDE; // required result not registered + } + final JsonArray missing = json.getAsJsonArray("missing"); + if((missing!=null) && (missing.size() > 0)) { + for(JsonElement e: missing) { + if(!e.isJsonPrimitive()) continue; + final ResourceLocation rl = new ResourceLocation(((JsonPrimitive)e).getAsString()); + // At least one item missing, enable this recipe as alternative recipe for another one that check the missing item as required item. + // --> e.g. if IE not installed there is no slag. One recipe requires slag, and another one (for the same result) is used if there + // is no slag. + if((!block_registry.containsKey(rl)) && (!item_registry.containsKey(rl))) return RECIPE_INCLUDE; + } + return RECIPE_EXCLUDE; // all required there, but there is no item missing, so another recipe + } else { + return RECIPE_INCLUDE; // no missing given, means include if result and required are all there. + } + } catch(Throwable ex) { + ModAuxiliaries.logError("rsgauges::ResultRegisteredCondition failed: " + ex.toString()); + } + return RECIPE_EXCLUDE; // skip on exception. + } +} diff --git a/1.13/src/main/resources/META-INF/mods.toml b/1.13/src/main/resources/META-INF/mods.toml new file mode 100644 index 0000000..ca3f229 --- /dev/null +++ b/1.13/src/main/resources/META-INF/mods.toml @@ -0,0 +1,31 @@ +# @file mods.toml +# @spec TOML v0.5.0 (https://github.com/toml-lang/toml) +modLoader="javafml" # forge FML java +loaderVersion="[25,)" +issueTrackerURL="https://github.com/stfwi/engineers-decor/issues/" + +[[mods]] + +modId="engineersdecor" +version="${file.jarVersion}" +displayName="Engineer's Decor" +description="Adds cosmetic blocks for the engineer's workshop, factory and home." +authors="wilechaote" +credits="BluSunrize, malte0811, et al., the Forge Smiths, the Modders of the World." +updateJSONURL="https://raw.githubusercontent.com/stfwi/engineers-decor/develop/meta/update.json" +displayURL="https://github.com/stfwi/engineers-decor/" +logoFile="engineersdecor.png" # Double check: A file name (in the root of the mod JAR) containing a logo for display + +[[dependencies.engineersdecor]] + modId="forge" + mandatory=true + versionRange="[25,)" #mandatory + ordering="NONE" + side="BOTH" + +[[dependencies.engineersdecor]] + modId="minecraft" + mandatory=true + versionRange="[1.13.2]" + ordering="NONE" + side="BOTH" diff --git a/1.13/src/main/resources/assets/engineersdecor/blockstates/clinker_brick_block.json b/1.13/src/main/resources/assets/engineersdecor/blockstates/clinker_brick_block.json new file mode 100644 index 0000000..ed80404 --- /dev/null +++ b/1.13/src/main/resources/assets/engineersdecor/blockstates/clinker_brick_block.json @@ -0,0 +1,14 @@ +{ + "variants": { + "": [ + { "model": "engineersdecor:block/brick/clinker_brick_model0" }, + { "model": "engineersdecor:block/brick/clinker_brick_model1" }, + { "model": "engineersdecor:block/brick/clinker_brick_model2" }, + { "model": "engineersdecor:block/brick/clinker_brick_model3" }, + { "model": "engineersdecor:block/brick/clinker_brick_model4" }, + { "model": "engineersdecor:block/brick/clinker_brick_model5" }, + { "model": "engineersdecor:block/brick/clinker_brick_model6" }, + { "model": "engineersdecor:block/brick/clinker_brick_model7" } + ] + } +} diff --git a/1.13/src/main/resources/assets/engineersdecor/blockstates/clinker_brick_stairs.json b/1.13/src/main/resources/assets/engineersdecor/blockstates/clinker_brick_stairs.json new file mode 100644 index 0000000..2a934f4 --- /dev/null +++ b/1.13/src/main/resources/assets/engineersdecor/blockstates/clinker_brick_stairs.json @@ -0,0 +1,44 @@ +{ + "variants": { + "facing=east,half=bottom,shape=straight": { "model": "engineersdecor:block/brick/clinker_brick_stairs" }, + "facing=west,half=bottom,shape=straight": { "model": "engineersdecor:block/brick/clinker_brick_stairs", "y": 180, "uvlock": true }, + "facing=south,half=bottom,shape=straight": { "model": "engineersdecor:block/brick/clinker_brick_stairs", "y": 90, "uvlock": true }, + "facing=north,half=bottom,shape=straight": { "model": "engineersdecor:block/brick/clinker_brick_stairs", "y": 270, "uvlock": true }, + "facing=east,half=bottom,shape=outer_right": { "model": "engineersdecor:block/brick/clinker_brick_stairs_outer" }, + "facing=west,half=bottom,shape=outer_right": { "model": "engineersdecor:block/brick/clinker_brick_stairs_outer", "y": 180, "uvlock": true }, + "facing=south,half=bottom,shape=outer_right": { "model": "engineersdecor:block/brick/clinker_brick_stairs_outer", "y": 90, "uvlock": true }, + "facing=north,half=bottom,shape=outer_right": { "model": "engineersdecor:block/brick/clinker_brick_stairs_outer", "y": 270, "uvlock": true }, + "facing=east,half=bottom,shape=outer_left": { "model": "engineersdecor:block/brick/clinker_brick_stairs_outer", "y": 270, "uvlock": true }, + "facing=west,half=bottom,shape=outer_left": { "model": "engineersdecor:block/brick/clinker_brick_stairs_outer", "y": 90, "uvlock": true }, + "facing=south,half=bottom,shape=outer_left": { "model": "engineersdecor:block/brick/clinker_brick_stairs_outer" }, + "facing=north,half=bottom,shape=outer_left": { "model": "engineersdecor:block/brick/clinker_brick_stairs_outer", "y": 180, "uvlock": true }, + "facing=east,half=bottom,shape=inner_right": { "model": "engineersdecor:block/brick/clinker_brick_stairs_inner" }, + "facing=west,half=bottom,shape=inner_right": { "model": "engineersdecor:block/brick/clinker_brick_stairs_inner", "y": 180, "uvlock": true }, + "facing=south,half=bottom,shape=inner_right": { "model": "engineersdecor:block/brick/clinker_brick_stairs_inner", "y": 90, "uvlock": true }, + "facing=north,half=bottom,shape=inner_right": { "model": "engineersdecor:block/brick/clinker_brick_stairs_inner", "y": 270, "uvlock": true }, + "facing=east,half=bottom,shape=inner_left": { "model": "engineersdecor:block/brick/clinker_brick_stairs_inner", "y": 270, "uvlock": true }, + "facing=west,half=bottom,shape=inner_left": { "model": "engineersdecor:block/brick/clinker_brick_stairs_inner", "y": 90, "uvlock": true }, + "facing=south,half=bottom,shape=inner_left": { "model": "engineersdecor:block/brick/clinker_brick_stairs_inner" }, + "facing=north,half=bottom,shape=inner_left": { "model": "engineersdecor:block/brick/clinker_brick_stairs_inner", "y": 180, "uvlock": true }, + "facing=east,half=top,shape=straight": { "model": "engineersdecor:block/brick/clinker_brick_stairs", "x": 180, "uvlock": true }, + "facing=west,half=top,shape=straight": { "model": "engineersdecor:block/brick/clinker_brick_stairs", "x": 180, "y": 180, "uvlock": true }, + "facing=south,half=top,shape=straight": { "model": "engineersdecor:block/brick/clinker_brick_stairs", "x": 180, "y": 90, "uvlock": true }, + "facing=north,half=top,shape=straight": { "model": "engineersdecor:block/brick/clinker_brick_stairs", "x": 180, "y": 270, "uvlock": true }, + "facing=east,half=top,shape=outer_right": { "model": "engineersdecor:block/brick/clinker_brick_stairs_outer", "x": 180, "y": 90, "uvlock": true }, + "facing=west,half=top,shape=outer_right": { "model": "engineersdecor:block/brick/clinker_brick_stairs_outer", "x": 180, "y": 270, "uvlock": true }, + "facing=south,half=top,shape=outer_right": { "model": "engineersdecor:block/brick/clinker_brick_stairs_outer", "x": 180, "y": 180, "uvlock": true }, + "facing=north,half=top,shape=outer_right": { "model": "engineersdecor:block/brick/clinker_brick_stairs_outer", "x": 180, "uvlock": true }, + "facing=east,half=top,shape=outer_left": { "model": "engineersdecor:block/brick/clinker_brick_stairs_outer", "x": 180, "uvlock": true }, + "facing=west,half=top,shape=outer_left": { "model": "engineersdecor:block/brick/clinker_brick_stairs_outer", "x": 180, "y": 180, "uvlock": true }, + "facing=south,half=top,shape=outer_left": { "model": "engineersdecor:block/brick/clinker_brick_stairs_outer", "x": 180, "y": 90, "uvlock": true }, + "facing=north,half=top,shape=outer_left": { "model": "engineersdecor:block/brick/clinker_brick_stairs_outer", "x": 180, "y": 270, "uvlock": true }, + "facing=east,half=top,shape=inner_right": { "model": "engineersdecor:block/brick/clinker_brick_stairs_inner", "x": 180, "y": 90, "uvlock": true }, + "facing=west,half=top,shape=inner_right": { "model": "engineersdecor:block/brick/clinker_brick_stairs_inner", "x": 180, "y": 270, "uvlock": true }, + "facing=south,half=top,shape=inner_right": { "model": "engineersdecor:block/brick/clinker_brick_stairs_inner", "x": 180, "y": 180, "uvlock": true }, + "facing=north,half=top,shape=inner_right": { "model": "engineersdecor:block/brick/clinker_brick_stairs_inner", "x": 180, "uvlock": true }, + "facing=east,half=top,shape=inner_left": { "model": "engineersdecor:block/brick/clinker_brick_stairs_inner", "x": 180, "uvlock": true }, + "facing=west,half=top,shape=inner_left": { "model": "engineersdecor:block/brick/clinker_brick_stairs_inner", "x": 180, "y": 180, "uvlock": true }, + "facing=south,half=top,shape=inner_left": { "model": "engineersdecor:block/brick/clinker_brick_stairs_inner", "x": 180, "y": 90, "uvlock": true }, + "facing=north,half=top,shape=inner_left": { "model": "engineersdecor:block/brick/clinker_brick_stairs_inner", "x": 180, "y": 270, "uvlock": true } + } +} diff --git a/1.13/src/main/resources/assets/engineersdecor/blockstates/concrete_wall.json b/1.13/src/main/resources/assets/engineersdecor/blockstates/concrete_wall.json new file mode 100644 index 0000000..c9525c6 --- /dev/null +++ b/1.13/src/main/resources/assets/engineersdecor/blockstates/concrete_wall.json @@ -0,0 +1,9 @@ +{ + "multipart": [ + { "when": { "up": "true" }, "apply": { "model": "engineersdecor:block/concrete/concrete_wall_post" } }, + { "when": { "north": "true" }, "apply": { "model": "engineersdecor:block/concrete/concrete_wall_side", "uvlock": true } }, + { "when": { "east": "true" }, "apply": { "model": "engineersdecor:block/concrete/concrete_wall_side", "y": 90, "uvlock": true } }, + { "when": { "south": "true" }, "apply": { "model": "engineersdecor:block/concrete/concrete_wall_side", "y": 180, "uvlock": true } }, + { "when": { "west": "true" }, "apply": { "model": "engineersdecor:block/concrete/concrete_wall_side", "y": 270, "uvlock": true } } + ] +} diff --git a/1.13/src/main/resources/assets/engineersdecor/blockstates/iron_sheet_roof.json b/1.13/src/main/resources/assets/engineersdecor/blockstates/iron_sheet_roof.json new file mode 100644 index 0000000..1bf9c8e --- /dev/null +++ b/1.13/src/main/resources/assets/engineersdecor/blockstates/iron_sheet_roof.json @@ -0,0 +1,55 @@ +{ + "forge_marker": 1, + "defaults": { + "model": "engineersdecor:block/stairs/decor_straight_roof_model", + "textures": { + "bottom": "engineersdecor:block/iestyle/ironsheet_roof_top", + "side": "engineersdecor:block/iestyle/ironsheet_roof", + "top": "engineersdecor:block/iestyle/ironsheet_roof_top" + } + }, + "variants": { + "": [{}], + "inventory": [{}], + "facing=east,half=bottom,shape=straight": { "model": "engineersdecor:block/stairs/decor_straight_roof_model" }, + "facing=west,half=bottom,shape=straight": { "model": "engineersdecor:block/stairs/decor_straight_roof_model", "y": 180, "uvlock": true }, + "facing=south,half=bottom,shape=straight": { "model": "engineersdecor:block/stairs/decor_straight_roof_model", "y": 90, "uvlock": true }, + "facing=north,half=bottom,shape=straight": { "model": "engineersdecor:block/stairs/decor_straight_roof_model", "y": 270, "uvlock": true }, + "facing=east,half=bottom,shape=outer_right": { "model": "engineersdecor:block/stairs/decor_outer_roof_model" }, + "facing=west,half=bottom,shape=outer_right": { "model": "engineersdecor:block/stairs/decor_outer_roof_model", "y": 180, "uvlock": true }, + "facing=south,half=bottom,shape=outer_right": { "model": "engineersdecor:block/stairs/decor_outer_roof_model", "y": 90, "uvlock": true }, + "facing=north,half=bottom,shape=outer_right": { "model": "engineersdecor:block/stairs/decor_outer_roof_model", "y": 270, "uvlock": true }, + "facing=east,half=bottom,shape=outer_left": { "model": "engineersdecor:block/stairs/decor_outer_roof_model", "y": 270, "uvlock": true }, + "facing=west,half=bottom,shape=outer_left": { "model": "engineersdecor:block/stairs/decor_outer_roof_model", "y": 90, "uvlock": true }, + "facing=south,half=bottom,shape=outer_left": { "model": "engineersdecor:block/stairs/decor_outer_roof_model" }, + "facing=north,half=bottom,shape=outer_left": { "model": "engineersdecor:block/stairs/decor_outer_roof_model", "y": 180, "uvlock": true }, + "facing=east,half=bottom,shape=inner_right": { "model": "engineersdecor:block/stairs/decor_inner_roof_model" }, + "facing=west,half=bottom,shape=inner_right": { "model": "engineersdecor:block/stairs/decor_inner_roof_model", "y": 180, "uvlock": true }, + "facing=south,half=bottom,shape=inner_right": { "model": "engineersdecor:block/stairs/decor_inner_roof_model", "y": 90, "uvlock": true }, + "facing=north,half=bottom,shape=inner_right": { "model": "engineersdecor:block/stairs/decor_inner_roof_model", "y": 270, "uvlock": true }, + "facing=east,half=bottom,shape=inner_left": { "model": "engineersdecor:block/stairs/decor_inner_roof_model", "y": 270, "uvlock": true }, + "facing=west,half=bottom,shape=inner_left": { "model": "engineersdecor:block/stairs/decor_inner_roof_model", "y": 90, "uvlock": true }, + "facing=south,half=bottom,shape=inner_left": { "model": "engineersdecor:block/stairs/decor_inner_roof_model" }, + "facing=north,half=bottom,shape=inner_left": { "model": "engineersdecor:block/stairs/decor_inner_roof_model", "y": 180, "uvlock": true }, + "facing=east,half=top,shape=straight": { "model": "engineersdecor:block/stairs/decor_straight_roof_model", "x": 180, "uvlock": true }, + "facing=west,half=top,shape=straight": { "model": "engineersdecor:block/stairs/decor_straight_roof_model", "x": 180, "y": 180, "uvlock": true }, + "facing=south,half=top,shape=straight": { "model": "engineersdecor:block/stairs/decor_straight_roof_model", "x": 180, "y": 90, "uvlock": true }, + "facing=north,half=top,shape=straight": { "model": "engineersdecor:block/stairs/decor_straight_roof_model", "x": 180, "y": 270, "uvlock": true }, + "facing=east,half=top,shape=outer_right": { "model": "engineersdecor:block/stairs/decor_outer_roof_model", "x": 180, "y": 90, "uvlock": true }, + "facing=west,half=top,shape=outer_right": { "model": "engineersdecor:block/stairs/decor_outer_roof_model", "x": 180, "y": 270, "uvlock": true }, + "facing=south,half=top,shape=outer_right": { "model": "engineersdecor:block/stairs/decor_outer_roof_model", "x": 180, "y": 180, "uvlock": true }, + "facing=north,half=top,shape=outer_right": { "model": "engineersdecor:block/stairs/decor_outer_roof_model", "x": 180, "uvlock": true }, + "facing=east,half=top,shape=outer_left": { "model": "engineersdecor:block/stairs/decor_outer_roof_model", "x": 180, "uvlock": true }, + "facing=west,half=top,shape=outer_left": { "model": "engineersdecor:block/stairs/decor_outer_roof_model", "x": 180, "y": 180, "uvlock": true }, + "facing=south,half=top,shape=outer_left": { "model": "engineersdecor:block/stairs/decor_outer_roof_model", "x": 180, "y": 90, "uvlock": true }, + "facing=north,half=top,shape=outer_left": { "model": "engineersdecor:block/stairs/decor_outer_roof_model", "x": 180, "y": 270, "uvlock": true }, + "facing=east,half=top,shape=inner_right": { "model": "engineersdecor:block/stairs/decor_inner_roof_model", "x": 180, "y": 90, "uvlock": true }, + "facing=west,half=top,shape=inner_right": { "model": "engineersdecor:block/stairs/decor_inner_roof_model", "x": 180, "y": 270, "uvlock": true }, + "facing=south,half=top,shape=inner_right": { "model": "engineersdecor:block/stairs/decor_inner_roof_model", "x": 180, "y": 180, "uvlock": true }, + "facing=north,half=top,shape=inner_right": { "model": "engineersdecor:block/stairs/decor_inner_roof_model", "x": 180, "uvlock": true }, + "facing=east,half=top,shape=inner_left": { "model": "engineersdecor:block/stairs/decor_inner_roof_model", "x": 180, "uvlock": true }, + "facing=west,half=top,shape=inner_left": { "model": "engineersdecor:block/stairs/decor_inner_roof_model", "x": 180, "y": 180, "uvlock": true }, + "facing=south,half=top,shape=inner_left": { "model": "engineersdecor:block/stairs/decor_inner_roof_model", "x": 180, "y": 90, "uvlock": true }, + "facing=north,half=top,shape=inner_left": { "model": "engineersdecor:block/stairs/decor_inner_roof_model", "x": 180, "y": 270, "uvlock": true } + } +} diff --git a/1.13/src/main/resources/assets/engineersdecor/blockstates/iron_sheet_roof_block.json b/1.13/src/main/resources/assets/engineersdecor/blockstates/iron_sheet_roof_block.json new file mode 100644 index 0000000..a7ff079 --- /dev/null +++ b/1.13/src/main/resources/assets/engineersdecor/blockstates/iron_sheet_roof_block.json @@ -0,0 +1,11 @@ +{ + "forge_marker": 1, + "defaults": { + "model": "engineersdecor:block/std/decor_full_block_model", + "textures": { "all": "engineersdecor:block/iestyle/ironsheet_roof" } + }, + "variants": { + "": [{}], + "inventory": [{}] + } +} diff --git a/1.13/src/main/resources/assets/engineersdecor/blockstates/metal_rung_ladder.json b/1.13/src/main/resources/assets/engineersdecor/blockstates/metal_rung_ladder.json new file mode 100644 index 0000000..07c32af --- /dev/null +++ b/1.13/src/main/resources/assets/engineersdecor/blockstates/metal_rung_ladder.json @@ -0,0 +1,8 @@ +{ + "variants": { + "facing=north": { "model": "engineersdecor:block/ladder/metal_rung_ladder_model" }, + "facing=south": { "model": "engineersdecor:block/ladder/metal_rung_ladder_model", "y":180 }, + "facing=west": { "model": "engineersdecor:block/ladder/metal_rung_ladder_model", "y":270 }, + "facing=east": { "model": "engineersdecor:block/ladder/metal_rung_ladder_model", "y":90 } + } +} diff --git a/1.13/src/main/resources/assets/engineersdecor/blockstates/metal_rung_steps.json b/1.13/src/main/resources/assets/engineersdecor/blockstates/metal_rung_steps.json new file mode 100644 index 0000000..794103c --- /dev/null +++ b/1.13/src/main/resources/assets/engineersdecor/blockstates/metal_rung_steps.json @@ -0,0 +1,8 @@ +{ + "variants": { + "facing=north": { "model": "engineersdecor:block/ladder/metal_rung_steps_model" }, + "facing=south": { "model": "engineersdecor:block/ladder/metal_rung_steps_model", "y":180 }, + "facing=west": { "model": "engineersdecor:block/ladder/metal_rung_steps_model", "y":270 }, + "facing=east": { "model": "engineersdecor:block/ladder/metal_rung_steps_model", "y":90 } + } +} diff --git a/1.13/src/main/resources/assets/engineersdecor/blockstates/rebar_concrete.json b/1.13/src/main/resources/assets/engineersdecor/blockstates/rebar_concrete.json new file mode 100644 index 0000000..a4d790a --- /dev/null +++ b/1.13/src/main/resources/assets/engineersdecor/blockstates/rebar_concrete.json @@ -0,0 +1,14 @@ +{ + "variants": { + "": [ + { "model": "engineersdecor:block/concrete/rebar_concrete_model0" }, + { "model": "engineersdecor:block/concrete/rebar_concrete_model1" }, + { "model": "engineersdecor:block/concrete/rebar_concrete_model2" }, + { "model": "engineersdecor:block/concrete/rebar_concrete_model3" }, + { "model": "engineersdecor:block/concrete/rebar_concrete_model4" }, + { "model": "engineersdecor:block/concrete/rebar_concrete_model5" }, + { "model": "engineersdecor:block/concrete/rebar_concrete_model6" }, + { "model": "engineersdecor:block/concrete/rebar_concrete_model7" } + ] + } +} diff --git a/1.13/src/main/resources/assets/engineersdecor/blockstates/rebar_concrete_stairs.json b/1.13/src/main/resources/assets/engineersdecor/blockstates/rebar_concrete_stairs.json new file mode 100644 index 0000000..a137d62 --- /dev/null +++ b/1.13/src/main/resources/assets/engineersdecor/blockstates/rebar_concrete_stairs.json @@ -0,0 +1,44 @@ +{ + "variants": { + "facing=east,half=bottom,shape=straight": { "model": "engineersdecor:block/concrete/rebar_concrete_stairs" }, + "facing=west,half=bottom,shape=straight": { "model": "engineersdecor:block/concrete/rebar_concrete_stairs", "y": 180, "uvlock": true }, + "facing=south,half=bottom,shape=straight": { "model": "engineersdecor:block/concrete/rebar_concrete_stairs", "y": 90, "uvlock": true }, + "facing=north,half=bottom,shape=straight": { "model": "engineersdecor:block/concrete/rebar_concrete_stairs", "y": 270, "uvlock": true }, + "facing=east,half=bottom,shape=outer_right": { "model": "engineersdecor:block/concrete/rebar_concrete_stairs_outer" }, + "facing=west,half=bottom,shape=outer_right": { "model": "engineersdecor:block/concrete/rebar_concrete_stairs_outer", "y": 180, "uvlock": true }, + "facing=south,half=bottom,shape=outer_right": { "model": "engineersdecor:block/concrete/rebar_concrete_stairs_outer", "y": 90, "uvlock": true }, + "facing=north,half=bottom,shape=outer_right": { "model": "engineersdecor:block/concrete/rebar_concrete_stairs_outer", "y": 270, "uvlock": true }, + "facing=east,half=bottom,shape=outer_left": { "model": "engineersdecor:block/concrete/rebar_concrete_stairs_outer", "y": 270, "uvlock": true }, + "facing=west,half=bottom,shape=outer_left": { "model": "engineersdecor:block/concrete/rebar_concrete_stairs_outer", "y": 90, "uvlock": true }, + "facing=south,half=bottom,shape=outer_left": { "model": "engineersdecor:block/concrete/rebar_concrete_stairs_outer" }, + "facing=north,half=bottom,shape=outer_left": { "model": "engineersdecor:block/concrete/rebar_concrete_stairs_outer", "y": 180, "uvlock": true }, + "facing=east,half=bottom,shape=inner_right": { "model": "engineersdecor:block/concrete/rebar_concrete_stairs_inner" }, + "facing=west,half=bottom,shape=inner_right": { "model": "engineersdecor:block/concrete/rebar_concrete_stairs_inner", "y": 180, "uvlock": true }, + "facing=south,half=bottom,shape=inner_right": { "model": "engineersdecor:block/concrete/rebar_concrete_stairs_inner", "y": 90, "uvlock": true }, + "facing=north,half=bottom,shape=inner_right": { "model": "engineersdecor:block/concrete/rebar_concrete_stairs_inner", "y": 270, "uvlock": true }, + "facing=east,half=bottom,shape=inner_left": { "model": "engineersdecor:block/concrete/rebar_concrete_stairs_inner", "y": 270, "uvlock": true }, + "facing=west,half=bottom,shape=inner_left": { "model": "engineersdecor:block/concrete/rebar_concrete_stairs_inner", "y": 90, "uvlock": true }, + "facing=south,half=bottom,shape=inner_left": { "model": "engineersdecor:block/concrete/rebar_concrete_stairs_inner" }, + "facing=north,half=bottom,shape=inner_left": { "model": "engineersdecor:block/concrete/rebar_concrete_stairs_inner", "y": 180, "uvlock": true }, + "facing=east,half=top,shape=straight": { "model": "engineersdecor:block/concrete/rebar_concrete_stairs", "x": 180, "uvlock": true }, + "facing=west,half=top,shape=straight": { "model": "engineersdecor:block/concrete/rebar_concrete_stairs", "x": 180, "y": 180, "uvlock": true }, + "facing=south,half=top,shape=straight": { "model": "engineersdecor:block/concrete/rebar_concrete_stairs", "x": 180, "y": 90, "uvlock": true }, + "facing=north,half=top,shape=straight": { "model": "engineersdecor:block/concrete/rebar_concrete_stairs", "x": 180, "y": 270, "uvlock": true }, + "facing=east,half=top,shape=outer_right": { "model": "engineersdecor:block/concrete/rebar_concrete_stairs_outer", "x": 180, "y": 90, "uvlock": true }, + "facing=west,half=top,shape=outer_right": { "model": "engineersdecor:block/concrete/rebar_concrete_stairs_outer", "x": 180, "y": 270, "uvlock": true }, + "facing=south,half=top,shape=outer_right": { "model": "engineersdecor:block/concrete/rebar_concrete_stairs_outer", "x": 180, "y": 180, "uvlock": true }, + "facing=north,half=top,shape=outer_right": { "model": "engineersdecor:block/concrete/rebar_concrete_stairs_outer", "x": 180, "uvlock": true }, + "facing=east,half=top,shape=outer_left": { "model": "engineersdecor:block/concrete/rebar_concrete_stairs_outer", "x": 180, "uvlock": true }, + "facing=west,half=top,shape=outer_left": { "model": "engineersdecor:block/concrete/rebar_concrete_stairs_outer", "x": 180, "y": 180, "uvlock": true }, + "facing=south,half=top,shape=outer_left": { "model": "engineersdecor:block/concrete/rebar_concrete_stairs_outer", "x": 180, "y": 90, "uvlock": true }, + "facing=north,half=top,shape=outer_left": { "model": "engineersdecor:block/concrete/rebar_concrete_stairs_outer", "x": 180, "y": 270, "uvlock": true }, + "facing=east,half=top,shape=inner_right": { "model": "engineersdecor:block/concrete/rebar_concrete_stairs_inner", "x": 180, "y": 90, "uvlock": true }, + "facing=west,half=top,shape=inner_right": { "model": "engineersdecor:block/concrete/rebar_concrete_stairs_inner", "x": 180, "y": 270, "uvlock": true }, + "facing=south,half=top,shape=inner_right": { "model": "engineersdecor:block/concrete/rebar_concrete_stairs_inner", "x": 180, "y": 180, "uvlock": true }, + "facing=north,half=top,shape=inner_right": { "model": "engineersdecor:block/concrete/rebar_concrete_stairs_inner", "x": 180, "uvlock": true }, + "facing=east,half=top,shape=inner_left": { "model": "engineersdecor:block/concrete/rebar_concrete_stairs_inner", "x": 180, "uvlock": true }, + "facing=west,half=top,shape=inner_left": { "model": "engineersdecor:block/concrete/rebar_concrete_stairs_inner", "x": 180, "y": 180, "uvlock": true }, + "facing=south,half=top,shape=inner_left": { "model": "engineersdecor:block/concrete/rebar_concrete_stairs_inner", "x": 180, "y": 90, "uvlock": true }, + "facing=north,half=top,shape=inner_left": { "model": "engineersdecor:block/concrete/rebar_concrete_stairs_inner", "x": 180, "y": 270, "uvlock": true } + } +} diff --git a/1.13/src/main/resources/assets/engineersdecor/blockstates/rebar_concrete_wall.json b/1.13/src/main/resources/assets/engineersdecor/blockstates/rebar_concrete_wall.json new file mode 100644 index 0000000..dee0d7c --- /dev/null +++ b/1.13/src/main/resources/assets/engineersdecor/blockstates/rebar_concrete_wall.json @@ -0,0 +1,9 @@ +{ + "multipart": [ + { "when": { "up": "true" }, "apply": { "model": "engineersdecor:block/concrete/rebar_concrete_wall_post" } }, + { "when": { "north": "true" }, "apply": { "model": "engineersdecor:block/concrete/rebar_concrete_wall_side", "uvlock": true } }, + { "when": { "east": "true" }, "apply": { "model": "engineersdecor:block/concrete/rebar_concrete_wall_side", "y": 90, "uvlock": true } }, + { "when": { "south": "true" }, "apply": { "model": "engineersdecor:block/concrete/rebar_concrete_wall_side", "y": 180, "uvlock": true } }, + { "when": { "west": "true" }, "apply": { "model": "engineersdecor:block/concrete/rebar_concrete_wall_side", "y": 270, "uvlock": true } } + ] +} diff --git a/1.13/src/main/resources/assets/engineersdecor/blockstates/slag_brick_block.json b/1.13/src/main/resources/assets/engineersdecor/blockstates/slag_brick_block.json new file mode 100644 index 0000000..41db44e --- /dev/null +++ b/1.13/src/main/resources/assets/engineersdecor/blockstates/slag_brick_block.json @@ -0,0 +1,14 @@ +{ + "variants": { + "": [ + { "model": "engineersdecor:block/brick/slag_brick_model0" }, + { "model": "engineersdecor:block/brick/slag_brick_model1" }, + { "model": "engineersdecor:block/brick/slag_brick_model2" }, + { "model": "engineersdecor:block/brick/slag_brick_model3" }, + { "model": "engineersdecor:block/brick/slag_brick_model4" }, + { "model": "engineersdecor:block/brick/slag_brick_model5" }, + { "model": "engineersdecor:block/brick/slag_brick_model6" }, + { "model": "engineersdecor:block/brick/slag_brick_model7" } + ] + } +} \ No newline at end of file diff --git a/1.13/src/main/resources/assets/engineersdecor/blockstates/slag_brick_stairs.json b/1.13/src/main/resources/assets/engineersdecor/blockstates/slag_brick_stairs.json new file mode 100644 index 0000000..c89f2a2 --- /dev/null +++ b/1.13/src/main/resources/assets/engineersdecor/blockstates/slag_brick_stairs.json @@ -0,0 +1,44 @@ +{ + "variants": { + "facing=east,half=bottom,shape=straight": { "model": "engineersdecor:block/brick/slag_brick_stairs" }, + "facing=west,half=bottom,shape=straight": { "model": "engineersdecor:block/brick/slag_brick_stairs", "y": 180, "uvlock": true }, + "facing=south,half=bottom,shape=straight": { "model": "engineersdecor:block/brick/slag_brick_stairs", "y": 90, "uvlock": true }, + "facing=north,half=bottom,shape=straight": { "model": "engineersdecor:block/brick/slag_brick_stairs", "y": 270, "uvlock": true }, + "facing=east,half=bottom,shape=outer_right": { "model": "engineersdecor:block/brick/slag_brick_stairs_outer" }, + "facing=west,half=bottom,shape=outer_right": { "model": "engineersdecor:block/brick/slag_brick_stairs_outer", "y": 180, "uvlock": true }, + "facing=south,half=bottom,shape=outer_right": { "model": "engineersdecor:block/brick/slag_brick_stairs_outer", "y": 90, "uvlock": true }, + "facing=north,half=bottom,shape=outer_right": { "model": "engineersdecor:block/brick/slag_brick_stairs_outer", "y": 270, "uvlock": true }, + "facing=east,half=bottom,shape=outer_left": { "model": "engineersdecor:block/brick/slag_brick_stairs_outer", "y": 270, "uvlock": true }, + "facing=west,half=bottom,shape=outer_left": { "model": "engineersdecor:block/brick/slag_brick_stairs_outer", "y": 90, "uvlock": true }, + "facing=south,half=bottom,shape=outer_left": { "model": "engineersdecor:block/brick/slag_brick_stairs_outer" }, + "facing=north,half=bottom,shape=outer_left": { "model": "engineersdecor:block/brick/slag_brick_stairs_outer", "y": 180, "uvlock": true }, + "facing=east,half=bottom,shape=inner_right": { "model": "engineersdecor:block/brick/slag_brick_stairs_inner" }, + "facing=west,half=bottom,shape=inner_right": { "model": "engineersdecor:block/brick/slag_brick_stairs_inner", "y": 180, "uvlock": true }, + "facing=south,half=bottom,shape=inner_right": { "model": "engineersdecor:block/brick/slag_brick_stairs_inner", "y": 90, "uvlock": true }, + "facing=north,half=bottom,shape=inner_right": { "model": "engineersdecor:block/brick/slag_brick_stairs_inner", "y": 270, "uvlock": true }, + "facing=east,half=bottom,shape=inner_left": { "model": "engineersdecor:block/brick/slag_brick_stairs_inner", "y": 270, "uvlock": true }, + "facing=west,half=bottom,shape=inner_left": { "model": "engineersdecor:block/brick/slag_brick_stairs_inner", "y": 90, "uvlock": true }, + "facing=south,half=bottom,shape=inner_left": { "model": "engineersdecor:block/brick/slag_brick_stairs_inner" }, + "facing=north,half=bottom,shape=inner_left": { "model": "engineersdecor:block/brick/slag_brick_stairs_inner", "y": 180, "uvlock": true }, + "facing=east,half=top,shape=straight": { "model": "engineersdecor:block/brick/slag_brick_stairs", "x": 180, "uvlock": true }, + "facing=west,half=top,shape=straight": { "model": "engineersdecor:block/brick/slag_brick_stairs", "x": 180, "y": 180, "uvlock": true }, + "facing=south,half=top,shape=straight": { "model": "engineersdecor:block/brick/slag_brick_stairs", "x": 180, "y": 90, "uvlock": true }, + "facing=north,half=top,shape=straight": { "model": "engineersdecor:block/brick/slag_brick_stairs", "x": 180, "y": 270, "uvlock": true }, + "facing=east,half=top,shape=outer_right": { "model": "engineersdecor:block/brick/slag_brick_stairs_outer", "x": 180, "y": 90, "uvlock": true }, + "facing=west,half=top,shape=outer_right": { "model": "engineersdecor:block/brick/slag_brick_stairs_outer", "x": 180, "y": 270, "uvlock": true }, + "facing=south,half=top,shape=outer_right": { "model": "engineersdecor:block/brick/slag_brick_stairs_outer", "x": 180, "y": 180, "uvlock": true }, + "facing=north,half=top,shape=outer_right": { "model": "engineersdecor:block/brick/slag_brick_stairs_outer", "x": 180, "uvlock": true }, + "facing=east,half=top,shape=outer_left": { "model": "engineersdecor:block/brick/slag_brick_stairs_outer", "x": 180, "uvlock": true }, + "facing=west,half=top,shape=outer_left": { "model": "engineersdecor:block/brick/slag_brick_stairs_outer", "x": 180, "y": 180, "uvlock": true }, + "facing=south,half=top,shape=outer_left": { "model": "engineersdecor:block/brick/slag_brick_stairs_outer", "x": 180, "y": 90, "uvlock": true }, + "facing=north,half=top,shape=outer_left": { "model": "engineersdecor:block/brick/slag_brick_stairs_outer", "x": 180, "y": 270, "uvlock": true }, + "facing=east,half=top,shape=inner_right": { "model": "engineersdecor:block/brick/slag_brick_stairs_inner", "x": 180, "y": 90, "uvlock": true }, + "facing=west,half=top,shape=inner_right": { "model": "engineersdecor:block/brick/slag_brick_stairs_inner", "x": 180, "y": 270, "uvlock": true }, + "facing=south,half=top,shape=inner_right": { "model": "engineersdecor:block/brick/slag_brick_stairs_inner", "x": 180, "y": 180, "uvlock": true }, + "facing=north,half=top,shape=inner_right": { "model": "engineersdecor:block/brick/slag_brick_stairs_inner", "x": 180, "uvlock": true }, + "facing=east,half=top,shape=inner_left": { "model": "engineersdecor:block/brick/slag_brick_stairs_inner", "x": 180, "uvlock": true }, + "facing=west,half=top,shape=inner_left": { "model": "engineersdecor:block/brick/slag_brick_stairs_inner", "x": 180, "y": 180, "uvlock": true }, + "facing=south,half=top,shape=inner_left": { "model": "engineersdecor:block/brick/slag_brick_stairs_inner", "x": 180, "y": 90, "uvlock": true }, + "facing=north,half=top,shape=inner_left": { "model": "engineersdecor:block/brick/slag_brick_stairs_inner", "x": 180, "y": 270, "uvlock": true } + } +} diff --git a/1.13/src/main/resources/assets/engineersdecor/blockstates/treated_wood_ladder.json b/1.13/src/main/resources/assets/engineersdecor/blockstates/treated_wood_ladder.json new file mode 100644 index 0000000..b17f5a4 --- /dev/null +++ b/1.13/src/main/resources/assets/engineersdecor/blockstates/treated_wood_ladder.json @@ -0,0 +1,8 @@ +{ + "variants": { + "facing=north": { "model": "engineersdecor:block/ladder/treated_wood_ladder_model" }, + "facing=south": { "model": "engineersdecor:block/ladder/treated_wood_ladder_model", "y":180 }, + "facing=west": { "model": "engineersdecor:block/ladder/treated_wood_ladder_model", "y":270 }, + "facing=east": { "model": "engineersdecor:block/ladder/treated_wood_ladder_model", "y":90 } + } +} diff --git a/1.13/src/main/resources/assets/engineersdecor/blockstates/treated_wood_pole.json b/1.13/src/main/resources/assets/engineersdecor/blockstates/treated_wood_pole.json new file mode 100644 index 0000000..eb3a59b --- /dev/null +++ b/1.13/src/main/resources/assets/engineersdecor/blockstates/treated_wood_pole.json @@ -0,0 +1,14 @@ +{ + "forge_marker": 1, + "defaults": { + "model": "engineersdecor:pole/straight_pole_model", + "textures": { + "particle": "engineersdecor:block/pole/treated_wood_pole_side_texture", + "side": "engineersdecor:block/pole/treated_wood_pole_side_texture", + "top": "engineersdecor:block/pole/treated_wood_pole_top_texture" + } + }, + "variants": { + "facing": { "north": {"y":180}, "south": {"y":0}, "west": {"y":90}, "east": {"y":270}, "up": {"x":90}, "down": {"x":270}} + } +} diff --git a/1.13/src/main/resources/assets/engineersdecor/blockstates/treated_wood_table.json b/1.13/src/main/resources/assets/engineersdecor/blockstates/treated_wood_table.json new file mode 100644 index 0000000..80afd09 --- /dev/null +++ b/1.13/src/main/resources/assets/engineersdecor/blockstates/treated_wood_table.json @@ -0,0 +1,5 @@ +{ + "forge_marker": 1, + "defaults": { "model": "engineersdecor:furniture/treated_wood_table_model" }, + "variants": { "": [{}] } +} diff --git a/1.13/src/main/resources/assets/engineersdecor/lang/en_us.json b/1.13/src/main/resources/assets/engineersdecor/lang/en_us.json new file mode 100644 index 0000000..feee385 --- /dev/null +++ b/1.13/src/main/resources/assets/engineersdecor/lang/en_us.json @@ -0,0 +1,53 @@ +{ + "language": "English", + "language.region": "United States", + "language.code": "en_us", + + "itemGroup.tabengineersdecor":"Engineer's Decor", + + "engineersdecor.config.title":"Engineer's Decor config", + "engineersdecor.tooltip.hint.extended":"§6[§9SHIFT§r More info§6]§r", + "engineersdecor.tooltip.hint.help":"§6[§9CTRL-SHIFT§r Help§6]§r", + + "block.engineersdecor.clinker_brick_block":"Clinker brick", + "block.engineersdecor.clinker_brick_block.help":"§6A brick block with position dependent texture variations.§r\nLooks slightly darker and more color intensive than the vanilla brick block.", + "block.engineersdecor.clinker_brick_stairs":"Clinker brick stairs", + "block.engineersdecor.clinker_brick_stairs.help":"§6Looks slightly darker and more color intensive than the vanilla brick block.", + + "block.engineersdecor.slag_brick_block":"Slag brick", + "block.engineersdecor.slag_brick_block.help":"§6A gray-brown brick block with position dependent texture variations.", + "block.engineersdecor.slag_brick_stairs":"Slag brick stairs", + "block.engineersdecor.slag_brick_stairs.help":"§6Gray-brown brick stairs.", + + "block.engineersdecor.rebar_concrete":"Rebar concrete", + "block.engineersdecor.rebar_concrete.help":"§6Steel reinforced concrete block.§r Expensive but Creeper-proof like obsidian.", + "block.engineersdecor.rebar_concrete_stairs":"Rebar concrete stairs", + "block.engineersdecor.rebar_concrete_stairs.help":"§6Steel reinforced concrete stairs.§r Expensive but Creeper-proof like obsidian.", + "block.engineersdecor.rebar_concrete_wall":"Rebar concrete wall", + "block.engineersdecor.rebar_concrete_wall.help":"§6Steel reinforced concrete wall.§r Expensive but Creeper-proof like obsidian.", + + "block.engineersdecor.concrete_wall":"Concrete wall", + "block.engineersdecor.concrete_wall.help":"§6Wall made of solid concrete.", + + "block.engineersdecor.metal_rung_ladder":"Metal rung ladder", + "block.engineersdecor.metal_rung_ladder.help":"§6Typical industrial wall ladder, consisting of horizontal metal rod rungs.", + + "block.engineersdecor.metal_rung_steps":"Staggered metal steps", + "block.engineersdecor.metal_rung_steps.help":"§6Staggered rod rungs affixed to a wall, allowing to climb up, fall down, and so on.", + + "block.engineersdecor.treated_wood_ladder":"Treated wood ladder", + "block.engineersdecor.treated_wood_ladder.help":"§6Weather-proof wooden ladder.", + + + + + "block.engineersdecor.iron_sheet_roof":"Iron sheet metal roof", + "block.engineersdecor.iron_sheet_roof.help":"§6Well, it's a roof.", + + "block.engineersdecor.treated_wood_pole":"Straight treated wood pole", + "block.engineersdecor.treated_wood_pole.help":"§6Straight pole fragment with the diameter of a wire relay.§r\nCan be useful as alternative to the wire posts if special special lengths are needed, or as support for structures.", + + "block.engineersdecor.treated_wood_table":"Treated wood table", + "block.engineersdecor.treated_wood_table.help":"§6Robust four-legged wood table." + +} diff --git a/1.13/src/main/resources/assets/engineersdecor/logo.png b/1.13/src/main/resources/assets/engineersdecor/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..793e40fa8368084b9aa8755cf662bb9cb0246061 GIT binary patch literal 124533 zcmV*+Kr_FIP)I+80)lY&OZ3)XiQ-gE6cgtH+Y9w#Q@GGnNF~^J}cJGy?q7hSeHOcWZ3JfCX)a zFot0dJYHaRYwHCw)=0f@C#$#=i&d;G_w8*m$9t^oqc9X=|5P67XK~Y@1rNnp+1vWl z{_9R3iv1^M+hGuo)J@z6*+&s*H@||1>TLG`_})Ai`%llKF$Ch_I0d^uW$rrAKAgb2 z55W6W!amsU?*Kl=K>Kh5?{*hu_W^jHO8A(7t$27&V?V0Bzd-wF0Ph}<_LBm@;t_e6 z_wj5$s@(_Lj}!2ILIHT6yWNj&_oLd6570ikz`G05HsAkCHZK2bOcHVA7k(X+f^J(7 z;?bN4`#}5X41st!Ph)?&JUl?V1$f1y8ZB-D;El`wnwx+2TOb5CzWp_H5^?0K-@qhY zMo)c-kyFoNQn2Yhm9P)CAD^gp|Mh49?Y0r`BMZLUMZnggs-ws%T>IA70J!$;-$dw` zvD05-^{)mYvA1}hwb^i`A!K{Mus6U%<6Z(j*ybo?|uUi zRF1z$>DcG7X_qMv#=Awu`+&O-w)-Hv543j#ypJ*sk)5Xy4ulZ`Bc%JCHM`$QYmt=^ z0OISf(z^Z{AXxtHH^C%K|LkvI(=L^xpQC#8X{-j){ip1axZHiI*FMlb3c&lQgYf1v zw;q6tFYT}vC3c2$Ss6h{$;$VC%l+p2{}ihusz*OZ_2}oYX~g8;{0BXXLhnbm`zN+9 z_4=d(?MDXQ?N;uGBgEBUl8iS%7>%&jgY3>RhSi$t{+Xvf+=fw7-+I^tCXTbZ= zM!;4htVZgzcV=M~B`lE@{x^jP*cj?l4tTSdu@Q5^*!y8bHq z=Id;H|F^JdjEUPE`;~uz?XF{veHo0SLLN44@gobk51FoZA9VMDcF=qX?$sCDhwPFA zs|kdpB;1*m5Qu_mLTgu%5hyv}JS+rNP$BV+S4rpJ0t9Q{`zAJx82{PdfV4~b*o#z- zJ@b*|Y#%$YeF)G_>_@fz*T28=Y&!(vUQ!JYO9WgR9%kyvr<{U8N>(pl0s-xnWjZU% z7z702?oYG}WvNzFPBZKsz1_E@#t|9XXq2>sfkFy_F$S<$Yu$Nn`qE5AvHsm}H~|0d zH?e6<<=BhVj=zY|F(ZHTAHYY{7C(|;`+!btA5#VZ?I$?YzZ;hy+%K{2{QzNWjQeh_ z8GY;sLJG!@97jlr3_@1le-9xg-PIMW*||qO_GR?wz*)=CJ35Lj#3tz(_Q>4>$p zXlzE`#YYkHFI2IX25#MlJv67OF@BbF5F@#4xOXb+-sUClk>hWiQyF*dzbGG|{ zyCRA*?YDWQ}F?@uL8YK7N$y&@f6WOs45I29qXW@r4vS zUx1V%A2e-@Q$tvbl#;wd8+&xr*%L6=_eURM;+WS2Xg9pVA-0j13*VkFQ zb`@(3jpL{CZ{9Al&A}LuUeh~$<{XVvXOT*B>y1|tO440kqPx80&QR{m${7EBMr%r8 zkOMM8= zPXJi@^REL?Ir=${e&z3D(}?uQ&!7S@oqk=0c;HX@{eQUklVbZodoQEeI|JVB&fq@L z5Fh0*(fTTD*RBGvdi4Xe)>KBus5crIV>odB8L$Ft^tNDZjK-uXCWXn9XGpbX?C42^ zlnAL6~vGedLPbFv{whF)sfz~NO5DvV>P9z~nv?kH60;AcD5dtb< zKq*idV;HKG{FvE3jwIuXJ6B&KnEMVoNvY2L8E^cv-(mXS`8qa@a*E=CB<>!9sP>Zz zx}RjA6%X>jo5nl1?K8d)QSe7SgbV@@g6{en-Sss9RxZ7V6oOh~irVBPN(G$$Ykvcy zQ>@mICObsNDdWdZx^q0{z!;@id;3jI@fSX90Bm;y;}9tX-L+M^YpWmxH{W~>fnfCD zA;u0rj>SdBRvWb4g{IIc!$(g5P=EXw2!W7_<+tBN2tjwn(G(Vo7zoC0(=YuMm!%~2 z)pFKCVoXo{u+0n-!hJsR@->XRP8F7rI>D;JgCbPPRoq>FmCp6o&-03$$!Uje$$-e%S|DZg=n1fv(W562Qlf%@#kb!? zN=18V5v$Fvi-*9OskM#CuOg7rMYCe(%DJpA&!_-nZQsE4`BCg3XUoc;SHAz>VRaXq zbea0M{#(-K64N^+?)IbFeW3j~-}}3G(BSUf{RbNb51slVx4!)wu0jkD*8K-y1x_JQ zOe+l-K;;z;QL9OJbrpc6w=ZCHf-#!eXP!gHF*8qn3Z2GT9mN)!Ad8HxF--Vm-}v#9 zgayTfHJZwJgYL@Gt~bSIz-tTVB67g#MVnGevVsXwEceY3w08s{B~pe+LKZK+iB4jkc;U0? zBt!^Uo4ZMOWs%ZYgVOi}!dgt4ZW|dJZBSC?|33J+FCwHuD9QDgeneesnhOgw7Z=cR zOi(Hf24jDY-6ShvhGC@$tRWF{*IANL6v|qZ*DG5Dc#ZLPV4O$AUe0FHlt%puChow= zzr)JKSE-)(0+qXzxZCGwKbb)L&~UT&=oQ>Eyu8Oz@UG{)%W;kE#lO~CqGpSv8~KRW zQYu%l!mx9NgwxsTjdhw=Kfr$QK3GE>MU0<52gXpHoTA#8ay)6WLjo^_$x~-Z(}bDR zXOT)FmE!#${|KoR>+|z$EX-rE1Yv3518R*yVNq6NOxiyTdk7r_)+HOYb_$6w!0t$I zSWqp ze)&B|Q@r;MX_8>HVfN`~9RGXZAR{xgZUHdH0o^7r*2bWdgvZXE2jKDZPa%T%Bm%3mfupT_O^FweE?q0secdanSfg={}Bi1yDkxF2-@JY47 zuTm+%`1*^*w=ZI`%w2dR_iY%RImGbv48~{(5;SG$Eei0ZPrAi@?QlOM8&@kRVLhKOOX4HeVt~f*kI*F;*>vUT! zR2ZU-MQvGdEvo7$ite>nSbG15-1y^vj7=kwZkwb3-Z#*lHI9Du*Ih*HBjbIb-H&D; zWsd42o8;_yfGxHrWC5d=IKhId~dk+@)GUkB>+Br{WVf!8J?bI zWNI3tHIIMl(++f9^SJ&1)-MG0@d@hV6961M^CZ?9y30#+78m-i+Zqjo16dhsUF@1w z%Nb)aUeYE8mO{J5CkR7S7|@IplobS0i=T?f4FK#X!)5>9glK@Z9IXTAFjWSh;=;0W|05XwJ_eG03pAhrrfF zca|P7D<$)v_p-=}{JbowkNgrJxk}-wRtpuSb`1M7d7COk$)!q_m;aaFXK3~ywZ=3ix_5$GBjZewk@&GN*7{1k zbVmh-@b5L*xcc8`U7?-PklhB1$FSir^4hnE-hG>;i?6wgyAv-`JMKC^Pk!Ye?#UEr zA7~%JoxAvWUiV$m@oHmLyXC1Ds4b>khJ#QkHes_x=iSBc*J6PDk-i2ZZtC7>-- zkA0r{3HNXv__<%rTdM6;MWy2yfa*kpU}zYCsk7&iN@9iL)+;~C>0F z_s08r5KdEr*2cS(+1q+ZU0WgdyLA)y_+TmbIO47}Ia*sKT3aR2nuT{RAOs9ePBT2^ zIOE3I^Nx2-wU6Qp3sst6jE{^*M!~|^u~UF0T3sSqaefqYZ@%WnOUiAde+y`xqO~T9 zx@fHtO69hhJM9=OP*N)Yf7^5O#<*U2t{e3BiM#mPtHi$Z^W1lS3xS|^{BsPQ{35ku zpLG>?7EFA1_oAO9puKOq_yX3ol0;~%1sjHl;x<_CjZ4Vet9XQ8r4*dMDxn#^vFl98_XpBvmJbOML?3pK@0xZq>Ia>2` zAOx-XIa>4cE;0>+!H6Mx5v?)wN5jQCxd*@A?3G%Zmk+z|$|P@gS7^@*Ki1dK%?$un zFTF#m4a3v34A0CG#}Nn4KZDT*tJ5tREaUwu!r@WEVYlr+`k1rQ?5-@)U0Os)$@1H8 zVm%mdzsa$llkSa++{7g_0K|o-IIIv@p%^}JD5q2Gwzt5dytcS|{WX%gw^;t(Z(*w? zsFj#{@z>Dt22(HoB36_Cw-2q)ovbYsQcxub(1Hv>1hLqsWq5G4)ml_lCMOIRs= zNi@_aCaE{30H{n%Qkj_S1K-W}tu#DJX~+TG=+P6XAfU6n;1(%kZtGbasZ<2wa=Xh%82q1qFQJ9$G?L`vi#%U1E7BRd8&t=r&1|X zIsa8KuzuqrSWDxHvyP*W{G<6X2HFQwZu^j2=fiL-g9mZYzKBTo5-_>7z>W>iwgNIh z=jspX_=k7t-FL7?qlBa~F+pX#fi;HFQ)e9+3{G+;wvUdj(U>G*`pNV8@2Ah6!vgJv zc{Xm|Kv>gTV0@BG?13r}uvOI|vQ8CypB0(NLEC<4HpU{aDrHV;1i}Kv^kt zn!3di2$C*Fx%Wz?NbRO>(8b+>F<4`Lx_i5HI#wwJ@%lRP`Z@q>AH46u)i8SE6tic~VU3~N>Es;d zpy(}=ZdJy{DUXizx=jF+XP%@yK0#+`5vdd#ul^XJoSZBu?cB|x7_nLmsWDC&AY56q zwYR6YGuG0M5^uEAiw1YvSO}%^YgvBh0tcV|G)hQRt;B_Y{)db``7{_qI5I|MqOlDO z`rl~Hfpbp*aPZtybh}-oQe1!SRg_XR7w2g%EMNxNX9|HdDHcmrmciOxyFqX60G(Cc z=`=+fOCSWsXhP2=XAkJ&$}0cjU;cnVN+u>IC|Bxe<61hs^RIrJIF5PmFMgLWEHQfM zS*DJDhN&Yz!RYK69`+8<_g&I;pONlS1KE2V@%A%tCW`&GFW5?q-hPOjM^u~Xip>G! zjv!YsE?>L!E=Qhw0i7h2D-~AWy-0KZ7U8JN`j^HgD0u}yv17#`4!Jx!<^UOZ=EN!I z0ih%}Uw;LSWMg5Tjrn;Gbb|^UGCtQu|B_-tPa%cOP15)BESN$xtSv|%wn-(O(Tcl0dM75%u3wI&B93%O(0UcL(NUrsOUcsv?;@q7y|RqyM%zUDJtcWo zc^3qVRQEc3C@K4QPMhzIF_0vzw7QIr3=>5WtE;OlE-pF_xL#*yXoym&M6Fgs2tk^< zQfY!JxBl<{6s=?0ttK;H_%+h*8VA1g%UBIM=AJwB-502T2nrJ(c}ji27-o=kSAf^} z2TJT&4h1@mNjhx+;&zL)-6Bx_p~)2kcNTYN53IJEfThroa#tO$RC$}Vczqq++&~G* z#+Azm0q=Dp9)Iq6jMk({!qnMwPAxE?wNU22V1e5BIJI#XO*f95bc=<~L5i#;NiDGF32G&le)KzNW4ZNLzm3+0=fC{R=%M3u)>o)M`&F#|XmYmu8qGeykWxJA0K1oG z^IlL5Q>UM#+W9=~rG@-qyz$bH^9WB4cxa2XLC!@M$VgQH9BVCUCQZ77J7o$bw^{3* zG|~9>zLpdz^W<{SAVKY#H}5KwD4H!^E2Lz7bsO-;M#d;ndMs|Zq zpg4T?JVHsVH9195Z!`wp?Lf+WD~)wty%`;$Q&S|A2hpFqIngucA0o_o?HLle~;BMQ!oB1HjStpe4g^b(*xyf51gCb z2iZG5d9eeTI_P=>QFwsvbeCkcaaB>C;}lXtSjxAi>sLN-KP$=F2bV$0Jxh?b<8(7a zZ)=JI{o9|mLeS&>Y=8G%SGiX3>)qKHF^|H!Ypb+ZSJ1{X|IS5>*3?TSDve316O+^@ zCkci}dJE3BI|vQN6+P6(#;J{s6NVwFue#7_%*2UP2&w2SFVb9?cWMUT3vMqHC|ii6 za3C$E*l~-VsWDvfhxRhA?EdeL9NAp3*74OCLr^O5-k*OP83Z(rpF*c8^~NN%iH0lu z*kq$=j7yqLo;-uG28-{1CsbZ_r`J~Kt}Jcqhb#b%i*A4B^FPV#>;Zxx% zHr8--ror{)b(Yqfr2cz?Fr;3s5G4uSIL0DSQVgK8dMb+bmwz9Cm6v~?G>NDle2&V& z=dfwa^ymAv#o}H7h200)yGj+@rRxofpD0p)yX*$bGbe5M8%JqJeQlXP{i=3-C zv5d7SA0aCx5LTkKYh`4N-TP#+S>WC)b_kKXjIY~4sIbK9)elIbn59eaxoy3%OrL+6 zjUYg&fMcKg0=C=9X{{n>Y;B<#sZU%6D&Xd|t4JwnZLHC0H~a3J)|x0zNK(V(=uoce z$V3$NQoymluXzh@p<^mxnc|3XTn=RWNwFs?KvS-bSk z4&N_wuYs*JhRLHvxd$G^=I0~WxN<3vmRBynhq2amLT*eUu~ZwAR2!4XFhoe@9mY0s z$68~wraUrAX=D^@Vbt@bL7

>y3PC-tkUoNY|roI{>wKQ1RC*d?Hia?tCuxd$U_P z*}EV^?4PA*E`SvBQs1Z%m<+gz59oV2sA3CLfnPfoCi;2M#&TxG{+k z5-9~YZ(KtNNwrqr@jNC*h8Q2IbK>wcX{uc@&TVL{weRlH(J5izau;E!oLRj~Hsn!p zci|%4g^Miz==Z?Hn54^@fA^c{sEIuJWrW?K;_g0kvG!vKvUe+r{b<0u>8OI;ADC3k zF#jk27v;$Vgkuv3DKJr&pgvqgh#e0Vx7$wcWi4fI=F)1l7(IGC2gA zMEA1od*FIK;2JfTn)=iTTYZMRt2gQL8*)iLpp1#bkQgfqW0-pK zya(aU5vax(n3+A4(-y`Utkq1;97G6cH8*H&Y~)fvi?jID+cYT6n?LWcGZ45!4;?$5 zyQ4GQ4onG&RMPd{$}T-9At*sm#a{U%1ePn``zGCX(?!FFU%={!nJ@m5Q&HSQIol(z zmAwP1;C{aLoLm$A^k;vxc>GgJ@Qoo=@``HiJ~;E=D~H`HejcypQ{kAMda zNHHl@9vP)P;wsf9j`cvKy}U$wY0(MrrDXo%8$LR;+i$Z6L|R%Ktn`{sAt;9-sn)q6 z`kreU{KaInM1Nw>^mY;j1qTCwD_>Ns%u9a(ZoTD_c}5#%&OL=mQxC{z^X>TN-N)du zJdq!3@xmK<#|g(L_p1m7@$cFHLm@C(OC)0mc3s5$q9pou>lkZtZoN16`rDc0y!z@2 z-PIM}3-71UaYC!1nj>rg03ZNKL_t)!POG(sHJ0(o84teOsZA`6*;%kKIeU;KjuBEa zf8!d~LZ{QBx#1*+YFoLVzgC?V&fWGXoXyWr=5vg8p2gNJ0)ceNR3)YJ>+r=w-AE%# zLv$A|&|Pp8#rzL{536Gy`{`fDrV-^s&rv;i=C*w(J{BPRfT)7|2E2O(;UZuZxz}iM z9_u;3?!rPIQH&os)&mHmU4ODYM94)Dsf>(L@gS0cGFZyh8aH2mC3hpc_2%o&rEHIP z!$K~jveu#t+k7b$MJF748&UF~ zF7e#6wU$b`oa=}C6QYC1-X%PH?@E(6@7$5~#1ot6py%~F?G2U}T*>mv+zk*=sSQyZ z8o?OD#LPiRlRoMwNfP({#xUNP!f4I-L<1QHNFkWNb&D_vJY6AjDca^cZ>=TKhD4Ja z$?xRUCIqBfV~i%!2A!tFQ3n--B-&63RDt%hsPYgNSbORB94++nA7FJt`M|T34}6+5 z>2h#@w)o=+vJZkPcp$*LdD8fRWzYTEgcr<9C0W1zVgCEoOYh`SNv$zO$*UwXp9SlA zHkt0W#W}^QPfV5C4|u+xxOi&KP$)#NDo&Ym0MOpi-?d zGB)lyZ&YfODpkklXU05U#bJQS>1mWyOwG(9grwQrpxxX+D#cabV{g!XEviVeQt+Ow z=%y#fFHTygq}tGm(tHP{{9FhF<&%6Cp-KoDtLH+Hye%hI7LcL*}HdXlS!5KK4d~EgzMNvcWsq;eKr5v#+6Hy!Vqf= zL&r{I(}b~;PZD+8eGk}9$-S)0uSsF*^jW{n1)&7OrX2suFVJ0Hq`SNbh@MIK9{9_w z;ww}xX(i}&Td)|cbz_kksu$&PJFRNk7<8f8arO}fj-aPPZM)+_Rz}ADlSpN`a-4+<4{Xyb|r&>o4~dDt&ZC zfqzXkR_Z>=Vz+2Gf3N43Gs#yP#{{7QtDTp7kBHs6KuNdbilZ*8i*xzgjHkoKCugum zQz};ptJVH7&>A5u)oP7;eF!0?OXT?imRfy?sp$jUyzwE%^gKN_pMR zHs)`+MPYe~Xl2y__a3EhLiCgjm0HCc=#=OrDS>ccTnhsi8SPY@kSFvkv8O)b!XE-D zy*QhGKjdx4H1HsPMaj^QmGA5t&e03FQp(LP7()x2x|2q%H;}EGqWVArrp|LV`Bp; zBy%^f5d^AFQ6dTnHiOd|C#lVil4PMk#@emm?dX>zcdRRg?#hQpMte<6WyyEUmaM(} z`^4I?{L=4Z4O9<4NA2+QE^+sTUvh42_abq(6IE~rG{U3CjEK7)@$T_u3LI%1wex0( zuB}Y~z92$~tq;$>#HFw8qv>?N_M zs!oC=j-I4it70v*z4Q$X?ZpM!OA82OUXiu!?I>JS*8?v=CrR@Ntr`Y|e)o`Qv*(+v zwaMGprAdNLH9FNu6_99yk%m&R^Fom&BwI_%gxw9Sh1QiztSqe}grGJxO?7e#YYelW z`ZRH;vn65`2y_~Qh1&Q8)iDHwIBT@RtBycNU>FY-y{${ z?wcMU%L4tfU0><#7WmX?Vr}{~-a(-HbnKfAiMpK@t<`1LmgaN*IT)GZFW!2W=gyu& zO36%Pg2w1D5=)Xg-nLS$QLfb7_0P<@gm9}#yWK(x$^4D0p7Pq17_#KFl`M3FHr6G7 z?Iwvxo)9(eb3-G}vQsGKOYz;$d2+HegfTXkvjHsr@b@q}VfKr^3TZ^;&~sD|KIv8j zbDO9$fGYU7M6n-baky*1Yj3;cq6e_9g?j7~M1_YV#&xL8qZrdG|J*HV5>g_9UKjhd zOYfrnH?6+^4j`~P<-jw~Ip0|UYG{;dW3s@vnt_14-Ilv?;!F-2og9!sg#kBTd&yHF zddFRZFO{Q{YDOxd?{lWIY!gW)T@u1MbBVo82%V?A?U8I&|X;v;MQxe@RPs%pQDq+>8_WTX)n$*dg3f92)DGVH@+;_ahxeL=buIh z!OT<75O*V53$7c8wU*X`>y>9cFJCmF7X^*^=9WxuKJ~Q6gA!ZW-%`J@#oFZh?y^z{ zFOufNa10|&Tp`3gb^E_~pMHd3v5>ev%Ral+)-2oobCc>)cf zQmr!ND;UQc4M5OpZP02qy+qBp=-xP+I%|t-&*tQ$*fG(aJ!3)$mNwc51WLJ*d|?YT z6&6_@MgmJe`dtJtcJ*77Cno5Y4$&zc#-M06y`&5B=1cCLA7Yng%+Tkt% zuZ42Cj4YLMHz%FM9u&kKkG9i6_GVKvj`NF~RMIsa5|(bPsg#0&w@;Nqzs0qLVTfsO z(7b+y^(&Xq#!{J>>?;PT_+k)~>b`|d$1x^N@@^o;!sOYfP|8_XX6>1T3b^_5kG+@0 zCb^)0I-H@t%^mCl{~l)#X$S73irAcJ?LDFmQ4~A=+d6)AqZ{*=?_FbLXo$eygEUPE zg1|L(wU$b$#5*6}AW0J5zi|tL;PYpmK$XgreDqrcMSxmuh`QIlr)h#Qnj@#r(%x9d z0`u3eWBp37?Lv}M+6HT7|6CHi=s)wmc3NiZ&4nbTKskp$A#%D389-2_GxrwD3*P|* zOF#TwtPs==zrgTgFHk@HJmuLl+ja^Uk08KuCyT{xemK}&*mHYlY^@~-0wUYrbgXFC zC~%gIx104Z;y-ub{nK%?&b{wKW~d*oXPI8 zN2Z&kltZ~~cbBZso%UL1t1XdFj*lUHK#=VqEYi!_I`bDumfmLll|NwYnZLu>r~lqQ zz}_y^u=jlO9s*!%Q7Y);bhkUs=JS*VVBQUsg;Z=T&gHgW?_V@S2;^wFa}db52d z`1y{b(4J}X^f@P2Ga4x+{Kzep|)+J4AHOiIhrsGPM7H&G*Ph-4{Qc$fAQ>_n?rU~QI z2V8Zfae8H~UA0}gT%la9Ae5vrIYlWfd1+e{Atg7jUv-w6eaThf+9mmG$)2xl!Op#% zJ+frczQx&P)@oIva*1w|5+y0dT1sK)luNP%s`SVvy6z>w-WJDuyHT(;P#zs6YV{IT zDo~jC_B1NlHV7XP>rGktEOOO$Z%#f^3XJYA=S&I!m=wNW`KqhzYfFLHljT?1j(dTxaYb+(CexCHAr^vtrqA+XJ!`lJ@c<&BX;L z>>rre>%Yr+m2&|&Z+`}eo({`zVYRkf#;w=3No-AyrZL_1b;4SW4{qG_m3NlQSFZz> ziP2Fe#(b6C*a#D&qpoVt^Z?l!jmZqr1(Yi;`8hH+kptbbmyLDXExJ+H7kY@zOhvwe zSnDbS>$SS099m7lQV%5;mzJIBy0v`iQ)d_-s!<98UjN`a8|^MD%{KGCtH3Ssufhe!r9K`n%oKR}b6rp7;gM*^p?9J-LP&;dW$M~IlmL5g(fKX| z@1Q7nkjlUsn11$oWT~D+SAXj=#-6i8w6bX@I#E3P&LNKm>3(yTFcoJ$Iz)J3`63AQl)oX z!|1s4G#;Cn%2^ARU}JR=DFk7; z!o(ih93_=K2*H&pan`~^X(`s%wy|YyLlvXNp;Il+V z6Q>DDlH~k|qH!r@`H-_1H)g~GYO-+G?>O_Oe*mw?{+eOI5 z4i}lyB6q>^N|1w3J%dhD?~|dp{+cUrFvjk|$Jge->;9h;IK=H1I!Ophr9HQB@@K}v zrFTFnzx8#MZ5Gf`7vozibyrvXB4VjcPB}2OhV^opjke?1-@Ec5N=mfWJp1%{N>&p{ z7#{CMh}%&IrE)oUDw~|1by`;;xpw6eLP}a28-3N8+5OFuZw^HJLH^XC8MHQevCR2n zhl%6u`F{z-zDPzXn1OPj@1I0(kuI=@@tTB!Y^liL{o;c7aS_Sy<4L0GC%DpwE)!b*jp zRLR}lHtz_GFpT@Cc)T&iMziV0LIn(sx{erYH?O-0RczhCC0cXp@NAw8j-mwN(OF38 z?p2oL8xY(i#(<$ubs+umDk{h;6s?bpg_OkIHgUIu5Q4SEc~YaP)`uAy83SXOm^t8i zednlVwFU!?DYsBGre=H+T(UTS6C{~p{i zvD>$;hSe+YQ=5K_iqAY-B*rGY`t$Z}sg0pDJVMFq8I65!h) zk^4Yc@d{2$tS|pTsue6W zF*#tjb__*CrSMrHWt(-YE3GI5`uQCNgQ;Vd>3M#l^vKI;s5?j@D_F>1aU z?CA)0ci>(7;C!9v!3Rf!#d_mAQ&z?i7fNMYcD-Tv|t%lkKl>4@%g)N~FAAR^U^ONk=NqaqCLMd}EV3$qq+tF_y zeFp(jTa>Z1R#s@PtY9r%zwnj^EX(-p0mfzzxX3e2Ir#Lm?mmdE<~Tx#zQkTeTjcGW zGTmykNwmJ|D1hSF4d9WB>v{(2##pKc4ta^1CGB*uapb%RI&D(V)n;-gGHXY_B3fsT z;1m%_!t~*T1Yzi^^}K{DkPgg?i9T049P-ws%Ur#2lf+nthK9Jhu;hy`45RfLV|8bk zGg7NCI#ff6g2%GwJaw8fKIzKTCmPd8De1J^#8HSE>asBL0Ze` zI^8x0rbO;(6Lf8HoH z%)R$+U)KJGfB!$kByp|;uu}F!@VhvWWm|d*)l5TEQ&cA$(9fKE+6%-r%{f;A<*muM z@zM`H&na)K&CpKDhEgd65ALziE3)Cm4u*M=K)Td^!+PZRMkFim6106Y6F&)R)B*q%& zksyR{?sbO`5|+YzuBOJ)ikyEzpxk&UUvv^k$shg24+$zYR##UU8XC&YFI?2w0RtLNRyaQ3N}_3 z07<1*r&1e2DoK5Kl=|=p(iqaz8Ovi}a^?Uw?YM%=j|srukJAc1@<3T`t3z)eScPGp zGcVUdF8!bXE3)W7X0uW;&Ctm+NdI8iJ+v6o-n-QpO?6^|>cm7|_Br$9Q*MIBUFWZ` zxZoybxy;-fuOU5{iy+)HC<`Hb-INo-hPNNYLOD= z)+_BcDhLUD9sXWAg%p!}G6+zm602SUXN;kF?Fu@Mc;RpVM?{?t+87qzdc$$aXP(R# zshxH$CP|p^Hj+t_F!cD5TqUsJ4eEsu%wKrJ@%2*CU0HFogoV!H67`u`RJn|hisr&R z))>m8PQ9RNHTUoOFgA%vIvvJFhx46Jl$dQ7Ha8b~`rKxeGFEZ(u-R-9MG-SIGdcH~ zX=aTvIiIPJtgkF#EF|5g+x}}qP^wa{))*cgchzg6U-?p0bkwSKFPpSHe&R`2g57D; z?X;a9c>X4mz`5HMyKGZv$5oKIX}_zn__om8tgYra!Kq;hv#<^#(+F*r53bU&dnf6h(NmD9g}l9V-hRCZ%Cg^sC)?2O zO~fH3LIt@LDXdgzec*b+wXVERH%VM;rr85zNEg(q?wl*$!Hn*pQalQ}=Uva|p~(rLHov^QKivT#XHV|z)r zEFw<5Zd`f=j`jCli0vt_RO_4<4un8S$$Gm>s1((5sqdP5$C0cpEufTOb#aa}pZW|s zc1iOG0k986N%9?V6oI%sI(P7~jqS4`+~`C!J5C2XTq*gLe^W!q+c;RZm6breu|~YH zh7xZ3xaON8rrMAs36tlZ!D^jXkY)4(h=D!}{mKU)g%=7J95D6zzXiUMEsHYyxYFGc ziiIC4fs-!*h%n3_9t3^bNF~J`-K5-7$Vbh&d5lcG_kd-nUiVR%7;MiM1o{1q7Z)&I z@Xw-Uf{vR$QYUJ&SoyzqzOilo1lDqx~9MGyo?rD(3Nva!BKwOYp-gOn0u^d{Ae=<&b~ zo{>WKIl65hCb;4ktrKdMvP&{X+Lsf%zn25q=iFvL5^6l0{OcVfyx9Anf}P&5Q_)1< ztxKVH{6)IgU)_}8cI#;?a$uHe6t%Xbsis=55qG=ZqA@^2Uv1M~g%)`m9O)+D%6k`c zK-BN`BvwXiCeNP7XxEi?`rK2r*Vp@2^_?h;K8nNlbjx_hBY)#(^2lO+ZjNub$So{Az4vAZGh+;$DB>5t@^3ITbC63{ zKZMp2aiXamD!HVllDv0w39Hi_s1D6eaq7@aZbp=(nmCgWTBwgyeF2LtnDrEzoMzRA zttM;h>!{58*V=;ItqNG`BNKf9Yzqm!Qn|v|xQohLZPx_giIeA9U7Dj7mT0c8(`jz_ z4T;RP=-DnQo3lj#5zuqRo->Kd>*z1G3 z69C#2s>eUq2fTZIWk$~`4D%M?*(*v?Y?hh!$FG&b+=6m1B7qA+0k z?D-tL-}~eLmugnpYYZbNPUk=?7~CGmW%JW~e5#{kl!iv~zl|R|mY;)=vagMNwA_=( z`2pFUvgk|ZK{*U^&OFhEw74xSd|nPJiR~Ms-kr|c#cQoWO4ehIwEi2jRy7uog#_Go zPFcBei(h=MUd|)k>GRKG)6`X&HJb!Mz|ib$p5UrZOcGY>#O+poe#y$R;}xY~{P1Dv zrCqlG03ZNKL_t)-Qi(WDP(eT%3EyqG*T11stGQwkDKOf2KigiGKTZ;&IOg$#2YLU( zoa4%^>ja#phUbnQWO1$OxBZf{j~yW1v|AFQ*dotqsk8Ykd^vF@D^y~uS(C^sGo0Kl zqrie7WO!l#uRu`0%2m_da_#7q6imz!F?K zi%mDi^l|O>BTw(V>jk|epD<~GGmi)|ZL)DS{yQ3?+1~uIrGQqU6jLCG3PDL<->ocTEB4Nn7Ci|Rg7pFrZ+v*Qr;o&PZETjA@ll`6 zPdRh!SRU<|ROi63EhrbpZTxr-l!Ftea|u?UWIo{58Y*KAx~ofm?Dk$rQf#Bs=P0(< zPNi(0s7ZXZCN>py%gjjV7&)jXdIf_k%0`;gn2_jW9konoo}DMuQ0t(pY>FX`4i! zF$k{;up-RMrLEN*{_Gd}j9f0i^ut`vwl+7%`uv=a>g5*w?2bg$CXg_ zg(N2LoZ%wmR+4a}xc24Tq1bXNN=gLI-tfSY$5BDxtUi6wiS2XGGBl=V5&oWvEXkE6 zJBz09US}<&TQKV0!K^ki##9!ewp&EqHc~30ZktZKne)lpUcc>s_$_$FiRrZvD)>5V zq4R{BH)&?L({A(sv-f5}l4a?c(D$EnSKq_KJt8tPE3>xF%FL?nu2OePqBSy*#s-XG zK&>8T#?S){hzEF>fd^(@FwMh^>0xZx9>D+!7{D+C1H;A!9zfk3&x zY@0D??f8r5{yu&7^CSSN0(j{?tPGtzNR=!X(ILY8@Bq`nzGGADjE6WpI7AS~AR>Ic zwQWUT0I4KyKL4!EoHSOuU97ZQ4*$++NB4s-lv22S^F{Z&%@^%__!V6GHPPUdr+!kH!0?+`@H80 zhT1VOitLmd#t0GS$qci}5JZIS(J?fDdaVX8jIoy{Xtdf6&d|0EI?sMO*5I^WYZ;N9 zT7>avi0Nc(3V>QY{s4Qy?Df-Xf_Rk6@=pElLvA-a&s_%}{(=*@sYwY5!rj+??1F&O zs9LpLAZunIQ=G74)knGgw0JKo4Mw5WBdvU8lS!_11v;@l;Kj}3k%L0A*%ZV%<|oI7 zK_I2^C@U=-L9K=$t^uU++K*pFv%d~Tz{fj#rhp<97z4VU4!WI=`EFwP(#;o)Uajp; zS{9U*l7PjcMV4aC>M-O+k?SwqFd3BA7$59oJQyJKOmoEE8?QdnAY;Tz&!Bq$b*VU* z?{ZGI@4@%Y(+pR-h%GLwwMI4>qf?Iz9085AQp_nba%WI{S)(~|3pk{aV#V!9=Xl^6`wy=T4)5a}E; zonxE{>~7sb$PFVSsy7hEbwF!$dK<_@=FCN*G^CP&PHZIaDZh!PQe& zvuDN%<34a8K;asjN(s&YW(RXd>|&RAst%)Fp-n@B`PNRHF$mkWrjc_<;gqHFX&~ka zvSjXxU(>^bLZ?UD&TCWsi`yZsReroo}xZeyk0wvvz%-Hs6q*H)ND zoWa77S>^&u-0mQ@-f#fWdgeJ~$vl52TGyU7*(c{1{pbfytATlEwOTI`6#$%*GA9P# z_mL?H&N-6fLr6aW5s;MF9V`g(%&l9{N?c6LE}~=7XYMp>Tirg|tLub~_hPrYJn&52uN30e(PWB67PY#ytdK4Pu@kwYEq3@yoVN ztfU>C&J(0oB>s4?iyN=}A~ZDa?7jyghGfdnUB7JfMyxBie#DgX^8gLd!=C(uI@eB7 z$7o3c{1Dl2rSOv|T(*8$ZqSxqtG1Ol$E-3Tak9IMnRV+m=mR@9oKZeqpL3Wzz!nFz zgtxd&Dmx1kU+DU||Bz4?M+|Z!O*=_L>&%zCb$PY!mGS|$RBFgrXjTxF{$c9z(EURup*SIm0vX$|;{TW1M{ z-bUYc!xcuJ?s-^a&9K%q86M*}9_&KepqpP~?%$SX!ic`ugGAP#lNKuxC2ePsr4U&P z&-XxRz-K<*d+qxmBJ?&cyRqwefzeT*s&HVE8Fxx>k zn@$Y%t5g7W;^waNP(wLIJ6$kV7&~KvE@aFa&g^q!?`fW=%rgm(R~Z(LmkhH&G21$Q zJlKWjc?jYf8jUufGSqh8L*vR9%oLL5&tr&BpN-)91aJ-SLC3Ek5p;GSHg@XX1NpA^ z4PIG>l`q_IKZ{JD`Si1uKs!4aV0v)iPHuWIz%&n1jDc9;B7E^Iwp4`C0&!FX-%O|i zQPvBB>>4i1m?sHZ*Pew|5=0Ey=-3!5+ALQbAK9&-E&RFeA6mHYg*Kq)aU@c~XAD{@ zG&U|lS*gkK-VP>%y$Va9-d_il##^tx3O}yFk8AjNXV(-rZKm64HqmJ|pkeIYuRndw zZFN1*vkS$-^C>-7zuAIs0IvlSY6x1XmkQ41@`Z4gF8;M@mwoA-fC?c zc1)cBNHS@gdkBG77+`vw;Crsu?-V7HaR$aXhKGCb7=zClzWwHh2pS!1)I5Y%ROYgn zA&eUcq8O=GR+Cw}Y&l=dyH?dqSk^_3R~vhH0j4B^FosAI3t5y3dsVta1uHIhR95CG zon7CU2?>atVWANQfjOQ!-E+*i+3jTW1cwvDwchz(e-m1y@B<&U%U?nL%GVG_0cv0V zYak;c2RYZDdWbz2jQk0l;zK)7EC%AyhwtI=+yA#|Jh*<-Oj7&gL#wU8ea|M9@=W=_ z`xTLZs%<(kLht$wSKZGI0}tMQqa@_bG5E>r<~_EOeO~LKGTqAKtg4Anf;BwGFnH%3 zn=P0OtI_Y9Vxi|j3xQUD9a?KNH?CNVcL|lINUR8n)(XjZVw(nRR%5d$pL56m^y+me zN2SsjkA}#sBW&*7H5m-R$gl!Zi!CdgHTks~yts~?qeJXyjmFv~5CQjg_ieB--DWqQ zf6ii*8tqmCon{k~ncs;e&(1w38`#^=Jm;DN=-DqI2t(JBCq-r(9uj=%uly~1^{@Ud zHxqvPt^XeH{oa28jgoeSDq3CrAVhzC(-d};#AtZrFjS?~d5uLJ-kV9~GU`+)=mfT1 zJ3~DT5HGQ`IhrKcI+)S`nh5?EC%9o#yh_Kex*99Kl~}66=q2WBB0jm zqt@$V=zDgRm$>$opRa6vl~O<^E)yInJ)(}(Z831S>krwc~R zS)HgXvpePUNJTD4^5s&0R$wN#na|x7a(knElGRsx=xl7lk0STEX3rFyzyL^vbUML& zGKFWGLgajgpk~SPU`S_EV4m2Z3)f+!0SIWQOu7N*dj@DpXEP*|sS7;QgMsUUQc7a| z+A~l#TW<8%0j+U&dj|?Yni>t)XPQN_p~M zGa}5=3=OyFYk1s85cv3~KX@Cx?g|3m!*rU0h!90ajH2aogvXaiMGwrlrO9JoiX5fq9x4%@P2)b3CMi@A0DV-HSnf9bT=A z{qO&`7Uw4%|L}KlIGv+;`DNVtjsN;W!I#dOg%1j@pCJJGiSc+Vrjv{TVBmIvOpcF{ z93Q*M0RY=?z6L^JebZcDN4>x1GJ<-qkJ@U#ijN9$uAAw$w>I-@Kl8lJo&r;mCJso2 zm;a4_3nI%fJ=izfcl#idqXQ&|g%P81gy74cDiMgxgqKj zJ8%4{&D>1~Uvq84IKmRZ!U%p`a}=XY7?m(7gr%&RE~l~OT#^llPL7h8BlPFgByA}n z^)LWwKxhT-MVJf*rm7xA&hk45B7FRVKS9uJ!LQZv?wfB|yPXX{YwQecfl6z%8V$6Y z4R=qTxpu`0)8t-a_g_qv24)s-WZbmbDy7ir_QAQ)-#s4eK#A0Ktw~jMge~h+aS#gQ z;MRXGuN7#e!Bo-IQ|@G3n$Pv07qdtgWrN&*##TQfUyPYB895 z7#$rrsDq)fUiYIK!l(wNr4dtVu2_gmoBvbV!52bg=&fxSM+zc<`xT~zAI4~{`qNp`l>e!w%ki+u)}8WReQc|H@xN%_)x=(P;8m z1+&%a{1ri&rA8{!x-R5f>W=k=%M-cTp>a*l=|G$@)CLpV?=PX1vCQ#Usl}9A0cr=w z6_xR$t$UDUvII^57{|!s){F?rk**Y6{I~|cR&!a2AJ^f>HPlzv48{!t^Eghn?^&l> z4iLl9)?H`LNMs5r`F1m4o)OK~3VNPl{nkrRLV$6O-FMzHEviWZnItZwoelP#Z<$|j zz>jN44iB)WHNs{KQL}}u{einw(U8^O39^`@_9x~cBhg*M?-%z$B4rKnUL^2558ZONK8|KqoX4vNdjUF zD~%dfLXN?3jDyhxM~8<--xLE4smBn~cn>np&-S1r0@E7VJV7>39OEKaI#Wuc z*6JXN&2crM(1Es#+9J~;h+_CbfJVD(laRbIg5Y@^lko_tZI#!y4ci4aV(`3bfMo#Y zLK;0^wkWJ#-4ExKLL!1F={rz~r%azR-ukHo-p54aHNqUFY=(%e6YJx-bLCDkLuUe} zhXXYGYwrIJ-+LQ-Z@=k&j=DWWtG(hFN~3@4i!SK#a~9!pI3u5XVXKX>UC2dx9!Kqi zyYM(iI-7#|A!_CC1u#3@hlXvfRF*Dg^#}r=BeI34@-|&*IOpJEfEu@e%sMhKB24uF zX$h8zn=M531~h=~rMv>K(Z00dGLU36gs>tsrmUSn%%+H-(7pK*nAV1(wYvkErmi_b z=dzXgV#3WHQ_N-%v#G61N{n}RY%8!CRP8HIK`Vuy93L6&h5ib@_HX`=fT-^IwJTiO z`arD#A&g3x5}8xmN-|k$pV2m>EVk$El{NIbD-8BZaI_9&)WGf)>MjNpoKqfPH^&*)W53+n~W=ZUZ>s#Q-LK(J090mo$ zVm`xkp1`x6a*Q)@Kfvwp{t=kRohEE<=o!@N2>TlV%b^SbnWkWzBb}#+R#qWqQ>b}T zRM3^O=TmGSm8CyXP&kZ{EsTx#j4+E<3iHtse(B%;F zlaUh(H`X@!*P3(4-JE-C8^(tWb}O!cjm@Wu;_JHUaFfDh;D>`yGl3h|Hj6?SiY$FD1fJdKfpg}z*Dq|YA+-+j#B}EJK4^ z3}cjc9|A5*&V)iX9brXSF|ygzZo#$Vvoc2DHpr}8+JwvmK!n|QUkCS%(o{B0kWFW9;!gEm zX(liP^*Vxj-8vKiEDX_ETQB_dlrrBxow&(0+`4PUxC^BW$tRqs+# zqP@~Z7}k(8X8RkPw%8P4G(5KWJU4n3x&6Cyx}c?a^7EVhN}+CMIowL0J(p;ab&jh^Tlj^8)-!uGl<2J_G?+>93>J?SnCno$*?08VZjE|NKf4a|A5KRG%y1JpVJUwQefP)*alc6jd& zI!{0A?3MCe!f0p9buVeH5jGlt(#WP0i0K5(vPh)GWeJ2d7pZ}9InG<2vm7>n20K2$ zbnA|L7=En*zgCAA#jfkEv9XCvqz)sQ?ryvLsGu<)>?2D?_{+cjBNKFKxmt`D1n8|@ zGFi9CFgn_I0d}5Aguby}&LNJxNVtK|*Bh4EqOh{Q z=?ZSAaQ~G`M_Wr*biu!S^|iCo{uM_PP5uh5}1<_1|1P$U-f{gFQ@!M;MK5!uoo#(>>R3$iF?OdY!eRoe3#86U@m(2TZMZdnb0bUF7%m3d0jz;(C`-%;PQ3wTK zKAj+$3~jcmk)#66D1UC;ZSh;}6|_4YNNKjt2m3n^S%z+_;kMwpYFC~~o*e9<+rNbF z+9gP(aJ;wWw!=ZKfvDbaRexQIdRj_o%Tx%X7-1A!9by=W!@heu8ewAHwTTh7?|uZv zJj+6$rPEB69H|MWC7W5%9&N>xu)w;|6&Gvm3Z-SfxrBC7e}>zgPgYd?-|}nB?-?V8 zlY?D%tikqOH!ho=my@61ma(k?+jn#}`FqGN~#jm`epZth6L#a^LSE z!u;e2DhMz;J}ONhjd->1{Im!_ZDkelGtW7~x{wl6O9N9dJmc}+4m{gFtF=N|uj7FH9oFM0N zirEx$QWW5V+=@skG}kW~ypl2Oy!|G;+|Gyr6U)fRxw=OmzlUG@hp(cs`t$>bJAq+z zxDT0`g5Eq61&uG)FklRKKKcNm7D!qvmODg}|v?O0_9!^kXL zVSw&R>#;Xbd}av|w1n00&^RtV{8j3O;FSl7JO~PN&b?gNae<;l z#Fvag$|aRqsul}%k>geh7D^MQ2L}~0I&lUmOeQMk2~Ixx5VhVKgcYsUQeoxk=MmOx zAWaqVbEO&lxQ4LNz;JsTni0rm_@3ugRyqwp+unNE#tEG!ZdVX`9D4@?NFnglSAPLA z69^kkj0gKBK~f5>YtN!lxx5<4%4u$D4CS3R;95^pXOfl-65~oPIKtuC!JA9)ritw3qfp001BW zNkl+QmLQ>mYgzg92b+5fXTt2P;RqWUw3oU zw$2(2i>t4ErPw9-9!6VRl?RxPM@YwGhu4v_BiG=b!E%WcHeUE5v{qmq$JXmVMmC$7 ziK>Co&UQs~J7_lH*Xl@9>Atg6I zEM>X{l;!z88tpEICr76Ssn!~qkPgEx2NkLFf||m++XGBffkq=jk|YSNy^ZM(GyfJs zm?ExLAei08I8&$v9+U={2Ik2Oqw&Zs!nwW9J3sy|YRxvHTBGRb149r-PIyMT&OZg% ze@Ag0QCxRpVYR>RpbTORTOWUj!0s&Sjb^bRTcx)%N33niP^fn1Ey{FO3v9Ft%xp47W}yeIH72_|&H@KE5J#;Rq?Aaf z$N0;C|9hxgc;US6u|`VMG@&p?ZsAf&B5pJg1R=DR#g zW@TB1?|3+Xo=|D@f3_^NmI4>7F4aPXqWCmf|xdC7<1OSb#%w)o~ z?ixn3xhYgBjW56WA~G>YZmprL#H5p;loD%~t~g71W~DGY>ziozHgLGVg}`#TXR|4$ zqhZkzm$N%6uv;Q z^7D1?H}T8=?tkfi&V#cN;x@y2?cMNN$%;MW`0$wMJp+b|}M0C-%-+6ymYJ~~F35;nHQL9G-eBZ~=c7~OYnHL1} zuq&lTnhNV>My~v%V0gGk$H&;&-2-EUey5G~ZoAY1%kb{KeGCQzS2QBVap}e9F`gxb zp1s!aeXpRREUYZ$xSUfAnI-1lzWpJ#4o*z*vC+W$9~u5P5wOx~q1$OYR>(^)T!*j= zpzr$?BGB%xImywrFfzMEt-y$x;-2M}PsT%IQALC^Bc8UDO=D7M1HD<0awlik z-BztYx{O!pLO&yus^W^wNkd8vA%*Fb`v%X7D}F;%!z0D4k=T z&K+GTJv^|z|CRxw6&iWb3;;Bt_uO^(aSYElOpd_^??YPJnAV16kxs{8+_S-Xgm3<5 zZ=iGe*8Q!L?(+n+HUjbiH=N%7rOSZUn2tyI-XDA$eh{7-uRJiqJ5p)OCq5ng42hp` zwZDR2`T9SHdc6)}9PhmTBWM)npPUii`gpsrR?-Up;?KVf&(Z^Ev2sjRy~Qk(;2fAq zg}~!Z84Q3anraP^Wth*V&;-m6W`)}YfNVa;?*1MKKoExb;N!bCPAX&~!G~1qh%1n!vMVunB4v; zC}_BXM*I4Ut}84*@Oity%2y>TE4+dd0=+N1;8y!QIL_xY-1x>{FW?N$aQDYQ0^C(C6I0eyZA-(^8mX^_^B^_da?nVCOsz|Md#{rYcJ-uK0C{6}EEgYv+A;D`VC zAK=ohZ#X8$?wjAj&Rf3^AuUrvDFn3+0L${Q*`kt!;m#fkXpWGMhv;3u0Vy(wWQNK9 zHtK5|Mlw)IgpCHe&pc~_!t?~c`XBx&8og)F7j&0oiP~mMS}Vl$2Ab^-7%|-W=zZLN z?`seh?rCVtmMr zD{+qFKL6Ae2j594ar63fF0oZgIstsAg`qTpFaq~{NFmW|b)mF`)C$>rjx0@F7usNN z+wOJ@pSR2lC7XaSo@+9f)zv<~+3J(}I`1q9p%RSG0rV0xa*!-)x+Gxm?mLwUD5XU2 z=1a!t5kRfiL#^9$lY|&I98H+MaxE_g{tyvluFzz&%GHuxdX89;meyPV9=ED=DlOz1vKYR_1 z{aRH&6W_!27p9G7Af5SnYJsUFkq8 z4Iu<>KL4yKirEZR!WJO4aWDy^5OJ+mXe_Vv03vY4EDzUwHmuhn_k_jbRng?J1U_1N zW9ZY1f}d6a@7xX)z=HTWJs>020Qr8k6_Rrt{`B4A%Y6^+^$mk~5aD=l7eDyF{s|c4 zX!Y07?Dee?B3v+j`jww^BI;V30i2cEanHBS7exiug3yZrdc`s{%CF?;(3yEgofRva zc<~keVFK)}tT-HcYMQlUS+<589E zcw(UjrHU@fJovbOYonvj>|^`f4TR5Lt#7f9aPh)n5Y8T3bhZZOtm?lY>9hIkV_R z=L-M`nk@v@?j~}A)sEDA-~RiDPjw$|uw8VZ<-xi9YV@z8(Z3D=xcW77)K~uXzg;=_ zz1M#LB3eoryXa+n`*(f|dmsD|p6B7t?GJ2lHB_!iCLxu{Fl((QL^ijzA5%o~eINbx zOAc-z%lRe%SysIpIlnc}GQ*nDAy770cl&FQX=-ABq=E>*P-CUPj&A=F20QmE4I&0B zzHGHYxM{qQ!nrDkvFYklRuf~zE_^!omYYru{w&qGm`jf%sD9R(DZIzEsxScKBtz)Q zQ^hBrJ9|Dn3YS)EU35t0+h)(hPk;0y_jBZ%OS=1$H=(6Mx%k@b^$~Qs?wnWFH_%#L zb#j)5mc$E@^~bSo`IG`IJ&uREwGGIHA!Sr=!V3a-9h`ZNSDP=oE`V!8*<0UrjuM>vhyK5S@| zT4A1*?0a(lr&HLks@7v+o36D!jU5v`l!_5!9ALbXgw2kRvA?(H9#j~G*tmAhozu~K zZ{z5_pFk^x#NziGVCk%od;ds5e)TrU_<~G17EyI_Mfr6L&4;vePr_V~4wUizW-p zfKXaP*yf12(oSTGxxjB4Bgmd}$)3%~Jz9os`lgb$`0>JF!+m(x&rUK2ibu`!4(Fnhc z`sL3Uz)u%@4}F4zewk%U(O{@CnVWXuD2lMw>miIn*Quv%HJ&q$xyS$wBTB<~(XxG? zQJZ)1xm^=yININKZQlSe86KEG)?Tq$CE?^?&t-yfy@{w+H`uQ}ZKadb9F@&@s(U-JUzEyb;7v44t z7s_cwgnG-E1x!v3!8kW_czl9H7)v0nG#Uee`rfv!;iS0oE58YCpn209pgyB9_KbiE zI^Q((&N~@NFOTYvTVZU`vXDS_pvX!VooCYFLeXO~&s>l$Q!OLkEATM2!DOj+3S-IuDU!Z&yhyYrD+UNO5vGn*NknD6<%rC%yMd5b@L1n z73W-&d3iR2OodT)W41wI@xCnOo!X4EtlTv`*mLgHCkK0mmgk#>k}S*6yYjRVCbHd! zVN^p9#jedfH<~o#Sb-Qvt=>Q~86y*!QIoSbOGBg4Xj`Enh9GXh^8-u!lORTjVza#` zf)#d`hSEi3GFc^D;Vsu<$oa}tVo&73mQk*^p_k4}tFHv56f&g^{!I+2knlWiH7pbw zaaa+Xsy396rS6$~G~Ia})1BAcqPPFO-+@vRH(ve)%)AYx;T3lVji4A}!9&KV*;SOEV3e8_hCIM&!r9l1GAO8`a`|>Lg zX;}-G&fH>ts`%@9f-8N}(7*#uYuWkS=R`~rMhG~w9Nj{C)AxOJx~m9+5aZEF^-!h8 zvH5}lYPorVxZNTH7|$~otTV~rbLJ+$wq0|amG^2@6}xdJv3qoa+lLc$+HGh6o5=@Y zoWr-CYB49&xcwSN@WUAW%g>mmg&+iJh4G;gCDIy(%}|nkG>eOAzXc2&k#~R*0N)Rc zmV=fcEda*c!owK3PB^mEJJ*G2bmYN^fqTr=W5{B*(rRU-b}^7rIt!{?SW4^C+|OAR zFhM^P3cTdo<{C;;36GPLy3|&Cg|WO%LxYD6kdgq8G2M9!hx^}h_kHWTzXL5&)IuMt zU;Uftef8fy|F)mbKPNtk6K#j1T7WqeFq^>c!{pHy&tV4;Ja)OVYa zsFXsz*+#A2u$dl%$WkNXE;1*VsmZ`lw6J%|GZFiz zD=w$A8TGXgiU;6<2jan*1D`$z0I|31gqKltABWS#;^&9ETiAT*%TC$I^E{+NLNjXu zCl#WoFnDl2&sIHXuAVW%tS@K{pfPk8mEb7B*p%sAF=QBzuB?a~#1 z2ucWeo`(ImZoM#B?BgVP#u z(?AW)cE`}-(m9gJ$Y}bO&P!>HROF2uhKuZ(3Y!hSrcF1OF(o2MA<=Gk;0GbDKJ^qX zt*;@Oj*(0!h8_ludc9F3ATp<7QlZcXIF7F_;n75dOh|XVLYWL$E%?~!rMn)Z^XvIO zJddLug_xunrt=K*Odt+?OaU~d0)37RGQFiiKtB*+Sboz)1}e1#6O75?S+C*lwxP60 zd1eu$qLq+SUn&nzpOH`7tajmCt3mp48W&xx8|OjLz^4^lKjA2Q{}8M-{4j(P5=Te7 z*uMJ_X0yZ=(DcHo7J-rR>X@o%Br64}3=cccrV4j#UAX(|LSIod$UxE0ESXBDdrTf(StnS+)Yf zv-G*u^-c6HU4ax5TX#OP>UIDT$IjMWtD|GSFBh{aKO3PmG?``!p*4ik2s{t5$B`++ zs>loKLdfbfE!CG85$2hIP{v62Gg)*yCz9%&E5be?AOnETfET~{8-N!V@8JylZ@%Up zM$S(p&awU4kIdF_!Jtn``9yDqE@h}nOEB(%$$}!5Sz+h=a`S4n5aPidH}vVow)5bv zpS9q6HY{YXMM=E%+7B@q4vUs5bk|n`}N<#FF*e) zhSTW--}ztu5x5_@bJ%_VyV(2Sdp7uT2aRyf;d>q?$=uaZ0CEPfWji27g-c1J*+Q$` zwS`JuQQphu3DWrtQCxStU0TpH)>1+Wfz|$6B{Ax+Zy3y0nYQHZdw1b`yri39=5$UU zRj$OX9kWSDg@Bv(<4h?-OPwc3v(zb@F=Ft&0sA9rD#UJ=Z^U} zZm`n20&V2N>s}aQI!_jgEF9%lQQ*l_vMyZA`V7Ao&y!IR2$eDc;7@-4{{_!QwgDu< z=o5SVjA(7K&~~?vZmS6*!r{P5TiQJ`5#i|Q&|!zU=sZ7T92FU_vB#j*F$h4f-9)DmmweEyD@8Vkust9m0bco6{!aCB{vTlfgYOsh63!4t zA!egv%d^dcBXiJ6z8jQE!4E=flVm{dW~*Z)7%iSW9S;#kHH2Y|bUwq*-P>T6)2v|( zD&u;iFvipx-HpqIK)-z=QcB~tVRafzV~Mg0fT6T~>F0jl!4H%12xH4<=8R!DJV7!a zLaCC~yiz4WB5eb&X&CYC*x-+0&Yw3seG&)qE*juK(+olgtoK%s&6BFRs#2)c>ZsLQ6<7fP+AFK4j^DQYR-?1*gBamp zZ`&5HfGo{GjG!!*Xn3(Q7lu4D<01gmN@B{ckfOew)qQLW(&XF2yEL}qs*#+^B;)ex2V z%&qRKDQMbfl_WFxz7Ht`qFMvpHHNK^KeC;NImE=CNHC=*a-jQRy!z3DJ27DV!B5eC z=_{_gtCAqAN5f>4DWRVF|HjG+8Y?SHKlAjhTkylMLeeD8@$L`4XL`)-YE7kWnp$iX zCaPGze=5Z+`q>Mt_baUho(CZ$6ijPtA{2yDsMqWG;>}yQd*?RN+05w(bH>nYbr9DY zF5uMT*gdmlW3Oy_sz?F~SnaJFe3%IH>BJSTCes9f##7I~2oP{`bl_Ucl@K7tu)nkA zC=|I`7|-QMmsUs4o^;#??!EH|2%@H|a~OLvD@2~#qiceKHZVe~Fj zdDGcR2EPq!bq8r^C_^FCh094?t2t~ruA8j8z1lb8?-r)n-`hs5UcYF6&=U`)7b>om zSypcD>+{EAm+&%RdgnG~+q(sHU`+u5AnL9n?yXgo>j9)%p|ie$&iaPMgVbr;>4$uY zl0;;IMQ3>Wr9x{JS~;@!$`@{+RTg5mnDp#$faKr+L6TI`(J+j#^TumnoSmB7bkT=M ze>MW^{l28!XuvqbB*`GPMifT4-0xv+Z4DaQND`hhK(M}hjN|0!5KT38T+!xg-#(v$ zFB&&HfYt`%&llAti>tQUvH-cjw$fXJ9|Qmh^JEHu&|O_~h{tR?HSQh5<5G(}VKNyO z^Gb;aX8bu6lIl_snGEjTXtv-70m2}Hwhkd=lZ5H;1TssJWhs<4+j7R4gIaRY9&I_a z+~$y(RG4Q1QQ*V(%v{W*LXv4qSu?>_X$_9T+>lD0rbOKR?E3+B?tP5N`q)XSfa3uG zpxeKMmEI+cN5>crkHM)ZT&`Wd3U0a31j58N%jDnHTiZZbYkX#c>9XAQL5E&SCtIfM zr-5^E%gWtdxzGs!q{9=;M?<4*UpmZTlHlVvUU!9%a>l8Y#MPI+T)~yda(wHntEjK` zjG#%WAjf_Gbk=(Av|3g^Ymy2=*yI&BSeWw%4$ir+lL+E)XgR=&rL=5R{f;1T;$rP@2uUcg~U@|;% z!7tBtS2wOeDTU*~E{+GgHrp~8mI)HVWQ0Ko?uRxmGgqrP1)V8bVpk|=snJ=0I9i<* zlP&5w{OkWRbh_|dO0b>5PIKJ3kTG59Zy<_mm?yU0VC!d6WSEYI$kMrCCFDU;N^8TT zO70v*T_SIRzF($AM3@U{+WE%Y;#GyZ13X&v%BHS`}0>!h$R&EJR|N5cByA z!=nLwR$TniV8@=Ti63FTg($9pF+yB#AdKs%bj>{Gd3RQLdmNe)PLKIQ^Jht+%>`ru z)Smw(BzIrC@P+2aeT!KxhmYO&-l@KqnO4sI_uqw93Y#}y!sVMUncsOn-umDE2XtTj zvdM5<553Kaq{7P0mz*nx*5)%B+KR4c7mw8ztJYe5CW7sG0xLaK7U$YCZ2@am`Tdf7hk%CmpD1CX{7CfsKJGl5{8Z*;TkoyVO{TQ-0xXJ^gyZo9-1AJ}1^{UwB+vIu zQP1;T3$xa?m7fZ1IZb9rlNmTSqCJgP$8rCk)bM@uW~~Q74NJ5a=z%EI>42;y5Iy&G z3_p6+efm`4*_0<22H{09Ky6n|=Kkczl39w4mwz6IKYhCt8LQuO_`$o?f|&hmy}yQd zwO696z*30Fm~tv@vw8Zn8CaiylJr?3`}s9GT?3`iY_$=`^)s<{DpkQ55ss&GXX{jp z{7SYpoF@1`fA9ap(P#uI1g>7a3T19N3(LgT0uX%)(fDm&6=Nu0>b zAWP>+=W~;UXysaUZF?G0RRnuxcZh|ND>*BlqK&wk@oEi+C3D6RMV{$klhPC&Z8i<9 z!O5~Jh;WuHHQvkqfs{tv5(Pzmuj5!sGX>|YS^hwQ5dPK!R zZ)riNtiN!9pe&R|S}s~BSt*DSfP=B|lWK;BvzVq?LD91KRp9Znqy7T|fPMfEc+p!e zKh*5_2(#lON1!)Lwg>WjoZSAP2>UL`XL#kW{RWcR)Mi26=PR(%lYRfgX{y=`EDsJK zcz%HHY9E|)2qD1TBrbPKxq990X&vz0gB}H1A5$8a3aq9D^~l zRVjkIy6;I`Bzr$QSbL>noE>~hgL96^P7rwBlj?!{%w?-jN~l_uw&b~kbg#D#z_=A? zDKOaIDL9@ey2+Gv7+!qd`iu-Lx0K4V42Oq@ZX7Yju)4Z>3ieV;K?n`OxoI8GGK7I& zayT*Y#IlThv6X$Xz`Sh2&!%If^As{mt+=}e=M2P*t^`>HvYcjB5u~!LhTO5aJoA;( zmeZ@zXmyNxNN*iVDRg@4MfkG;e6YV`)xZptMvP(i-W~V6$QB*>=^V~={c*-^!M@-c z=ZzCmYp{}howS&AInl{6VtN#-n=^o0dJKo73l{ST_i3QO!oXd6-cP7opxhsyDdl7y z^9i6AvV+RxRRw>O0F36T@$<65Q<8Qqh}z+b%r#2Tqdb*Q8ihD-K&2;l2~YHrtvsU4 zQXCC-v9om#B2At4>{;g_ltOGVVuE4UfC_GJ&Expu_2=m4^T0WG+7Po;xXd`TG>j^ad&WW!U_Koqh?`D0 zU0WxNG?i|=y2dmsdC570(k5_mi@PdqT7knTvMs@(sYjF`2aj{43q|UDcy+oxC@V(K zt(ALkZ5_}WbF1oi^~RSm9PB~|^%5tTu)n)q2=&;D=B}1giYrnyNq<6o_o-iwV=zpI66l~N0-v}$vi`&7TV%3xxkhO&pdE)Mx}*9 zq0wwZDTP+MYu{V6%IEh(Dg{ys|Ll7|#MRA>QrDn4*G{{IPOF7H90%6iQc6+EKmjQP z8Y?}7)~7C?7Twi;WzG;W91M1iu7z#fSm|%zXnz|@nz^PdBO>PlFPeqsYz@Xr&5941 ze^ipm^Uhy7r()j&@ItR#AUo?|`kXnQTH`Z7&7@ zEY@@ocKaJBCxB&$que>Tzq4iHgc4w#>*vZpmO=s-$XfL|jt{yx{NSByWuON@5&F?^ z)H2_9QFlS>YUE#ZCG|M3e1=+ zmsaSXIT*dbM`yK%>o2`*D)Wr6bMKD9Np&v3txD30+BLr@YjXKOEK#5FbGZ;rKvoh~ z%Kv6WCEbSmv(aDzD1m_#qF5`Hx2S4;Jz1IBy zwHsf=ba;a4bnNbCU|l&Fw~HyW*QE3*h(lxoT55!~5YRwxeZzFhi3H)wQ_$l6+31_B>+AW+GcwQ?<#kF&*gF%Z*2cFrmm@YV0-d1i!MqOMwu zGknGJ@k`?7bpFUuwyyef1mRJhuMuj=gsHA)N+XpDvw4QijWt}_*uZ;l{{#T9bd~u* zfX-?ko)>^~vex1XP^Qz&49{YMXPMc>gpC%~n^xaJn!r1oO);NMY$8xB?A#BW45E{d zROXy(w(;W3YD#Imsfu9x89OeUNy8>3+Aa|Fdc!#N#>PG!x@d&(d>;op12E2TFc>(B zS1zNOXX1Vkpx$Vsw{Zo;IEE*O00?od4w23wL~2BDq=e`D25N; zz&J1Ll0YD>5k?V4M+cak9Jx6-8y z+&9z2_XG6THcaK+G7AomOcBlxLMSQWhcQ|!M&dB2%`w>BHt<=FGb_V~rE>%Wtu?|R zLai2~)#*Y35NT#KAS_>5K|A(0kuoFgEh+wHpSKADW+hcyIIh#-uR%w|wZVEf)j zRt3(m42}->;rl*9--pi#&s~2J8X9+g`nGEZ$%BoQ+I8CrY1s$%JaUcWGdaCBn1WEa z6lZg{JM}ytoo){wy!nTQrb*iQ<*lr3f|S7MPyT1qcC7`j{_4L2Eu5AR7&m@- zvfM`rtPdK@MCb1e_0BUXG@TuoD?i$dH)u8yG@FpN8d`qU?A=&yFbgR>f=~MEQ>)X%g5CkKmW?h z7)_>j+kT(M8*O$wS(>08wQ%pYf{ik zx%-lzSMHcRo2QPsknd7*tN8rh_BO5{ou^LUS4ibpCgkknfkc?BJ&OF2tA!Z{xrMyh zO`1lHll@(2r6Bfx#{{sz$If?u2Sf~=-Wt|6uj0+`{}DRR{vz7fzUJVXStiiF@-o^_ zy?kyM^*n=_mSmuG4u3aq>CDjQn>>#~NRZa4LY~4p%z)qc!V63H@XYFXUcT`nh?{?x zD;cXV+``KBTbLc}V|uV}CrPnV=X5m2IQHIr&1E7*#;e@L@!&6VG|4 zoCu6tQJPX~YY>L$uCC$syYJZDM==nE$Z)i0*a?kRyW)h9r3tb$aT$r(@|!0#IzDh( zw&lVw_e1zWgs4`B=X)SxI3Dak1L*cQ3oo$$pS?H#ku1y3!@hIxTVl)1$cW6!tm^9S z>Aj|Bre_fso0KUDhGD@52pNV%(C`Am65v08vi}4FHX*}58eU|`Fl4|B41<;^gMwht z5~QIhk~3^}_e}Tn^itKe<({#;_wK#NKiuWr_hQMc?pm^YCWz)#W<*BBTkg5%eCIpg z=k3geSh8>^I3$O`8*SZyAyzkd7BoJg`b$a8rE*Mv|sr2Bzm{ zsLImvfhXq;A&5Mc$kGJr>@JeSd!FDwn&2#`htMnj}2 z5Hl%^Ed%qdA@Z$Z$WE4F*yGpUK;^iI@plFQAqDQe{ezYuO0D#7J*ae}M5dqPv`+x4 zV5Dh^{$K-nr;9Yr0=z&`f(fMnppL#gQkL2V$ z4Kwn1qLeR}Owbn$th54TZeYC2nrn1X7k9-6oP78`ZvUg-ZM?t~a{z>VdxU&AZkpX0 zjlr#2v_@&|e4D6Q3kZ550Zmucf|3~t*Wp&c=#|%3VuMz@SJwh4=E<7x@y|doCxY_` za}Ko37z{_~vpc_zXus};H(0%#3roa#W z@BbD`vy(op$D{B61NUnJ#iCKNz&v}vjzS)p|W)pJll(7+&`Py(Q}DL z#k0;L@sR`TMX_ngXC;@~0WOI(v@>3Nm%7o+vr|-Or^q9%1fwcs-~I&{2Ro!GaPq-> zIR4gNr zK~)qW640u$9daQedX|88C9rb%YZ#Y}Hpy66-T$4foGew%{z2W1QL3_->|iT=86hN& zCv&`i_YflQ;r{*m*cp$I=LWa6#$aOu!j1Q8rJ?i;LMFK0OVCLO9WPjeTCe7!0Bn|E z!Bqjg{uln{(!Y7{AOAO)-2RiM?oH$f?7ieFmmP|TSI;g&8W#Yipk`JYFm{*S563V@ zW4JwbB12A-0fcV1UneN8>NGB6je9T5F&ob|Ithftc{>RQ3sqX9R2ouPm9;df2P|rs z#7^$j*|MudTY21N1MBCJP^C-0AQ8(pc3z)(t!@E+j>RU0mmBrb8?;7nraU`AaduMg z{v^T;0szWbozPhN(X?ia89;ZmgM7G+-CJ)4C_)H{hwr`}Zj5X=LN?r9zAG|AB#Gro z8nd2G_Op<#K9+#ZA*0e>uc4|iJ39qnaB^~j`D_L$WkXaY3{ueN1AAzReU%U1v70TC zz|mxm)9D=JZXa2iSiDk7q-knhu>Hbko1qIfxHl=W(@U{E+O*XiKe^k%3Yu%@y~Z^) zZ3$FqoR^$IBxb%Odu5~1+uTN`H9Fm1fMmR><#2lhV+_(P3-6t#DTK5-5F5jBU^5&( zd}xL26X|puL~w_`cjpu5`eERO=QW{WSW4l_ll$)MUhBkwWa6qNs~Maowbx$zdbhPK zF3ro0`Z~lHH{X`MBv}8f67g=wjHRM8en)M0f>#KJ_-QhcW;l5J2N*_%n2%-sM!RZz z0K*5~;`A8Pg9mv2d%qC;-$a_??86T%ZVUh)eb`V}(;&nNh)fdnMq~8GJCMi!59EjM z$9Jn`c~k{n`fI-hT`fG-C>_<5p9)p&DnBe`$gVUg2#^v7pM8qybcXx)?;^{xhKug9 zB~fQj#x71GOp3y4bwr(bKOre#jT)P`2-otItw1ED4EF8b=6zn4$dUy8ejnX#cj>pQ zDuqtZTKObd27Cd%mvxU)>mZ^dVxb&Qk#retscc4Tp*;~;9L5+7M>d1??2f&guLL_G z04U3{nSewB@!XCW-tE~LbLM%+@{sez#`U%R8+IZtOE52Hc>SB-gAf8AfApdApW{I3 zl!?T{`*$7k6uFaglZzh*sAb6!J&KPZt%n@wqK!QcysPkvWwzvvk+>ycoR~qe45Tqm zD1<@~q&B|gZsa%v){Q2bfzk&3EL}SOOSA~~Kh6LiZyusm3X3Gc{PYC#(-Qz6G(McQ z25T#m_vt_QZFJK-JUe{l4Gdp>-MvSOAOCOvBVPE;-v(E6Xg8%*W0p>aubSia-~3xJ z6#@pWt1oYmr3)bkyU;)W_#>+U;u=Z*qE}km+((!YOf>V-;=&8%Btk++KRW9ih9Mxs zYi#Ld@mqUO_Peg3CnW>{qd^x+Da?xr_BOj<2Htww9+{tZ< zRXN9eat>yL(ep2Y0lfdtpMXKw9(19!g$2g@&smOjxIyWxU_v&+%X@DOpr56YtQ;Ct9-oDiln}bQP;rg< zQL@lg{8C2J-D>Cni>wbyY-U7BiezIKcYpV9+ssItfWO%cr7nHn{XhQm@O@tS_5Td7 z{`!CVi4)*5p)qH1ag8kR zBJXqoAuyjzZ8J2H==S@UlDz$*L6t7Ct`efly&jWbOo@G=PjorV)>Kwsar@3qD9C@tW^XpWAgK1n}Ng_%1Tdzj6Z`fm|;H z1Q;xUqGHUd3jJOWTbrBs)nEBKzW>kuN!^@qe`zx~jg5^Vs!HLFTiWap7rE zg&CDB5kaDjqBYouXW)zb%+r)FWU)y`vog1{nd0n#AsM0@gg3^X)*Vs5M&v@zLq?Ip-vJJpK zW(p8B8ebeKNnMQxU-)c1c_*dS0*&E>5P+E>l89ZQ6qM2ph(!iBTMF=sOj8s}JL*x> zioC52+}^C|%N$|X{9YM@sj^w(wVg5cyIu5qT?~h#z+8|rv7@f80@@mmv3uirRAuQp z>AJobwL-5yK)2Tmn{efD$|Ol3WrCe+`*_i7G6)&yXGxldl6Px#4I~7zvT|K-5vY&M zz}?#)xsm5ODF_E<$?WShUjF>&lK`YS;m#lY9bA9$r7(D6#eukyb<@JVzgorX*=`=K|VvhN2)({@@-{I`&Au6S?|J?JqwzrGncYhtGSkd^3C(kZ% zztUx^{uNni!*gw+aps;A?cXhVZvkL<>(ArE-}!BbBoA4dY+b~vmGxChp^S$Zv_ck< zt|bX1WTH+YEnqVo+h03zKtw;SVqyp(aenXs-L2u1OUa|BJa*;E#zP$&aQy3zay zrz3JzFzxI4Rmyn1P&t5H3S^1J8uza41|>0eouXxxgDsOy$f$%6;Rg0YFbsm$YDGc8 zEg^7Mx=LU6Dr}AS+@@NE`^RI9h7ET2uOrsO^D57}s-Vi!cKz8?rXCUaUi11!??qCKEb5SZ7P@{a0v-$dbnYFtHEvfkYTBx*z z3?}Di)+bkM$HWjQH3zBBN=2UsgH+Z;+$2e07?_s|hJkcRhApIoa9m}!0j0s^^>K@r zq^XyYi@Y=jOp60ENqgrFqDX5lZu?yO=SH`_4O5kM;Qa#G4*`%MNCFHsE#c!4Vdmzz zt`w~-yLFZn02wuDCJ$SImusIbkZdXr@iU1>tFxT1Ak+}xA&xa}ZBXp?2I%$r3oa!7 zS}LVbl`|aP{|o~&v04K}NE3?(YOS%ga~*874Weu?pG{HDr#28dv&-@RO^Y#m$6GLj zHeg}hj!EdH9B}O$e$l4yaYsAZ#g0MYuvc0K8(gLd+5EQ95JowS9LT2#Fw=MAqZ?ZgUAR-->lJJv(*OG`;+o zTHxs1*@Q6zNg|=NP27YKwOv>{!!`zGrETAU8kGJzKwon0E$hWyMwfw?l&DF2!klRN zhqT3=c?tMTWQQWyn5QaGg9S`?b@i4Kfuh_|ECAM#k`*g-JF+2i9elxH%Od|=Y&ldf zgvhhYy+K<~`14Z8t}N6*pTBhWqvifjjWO8R+D4M37;J1dv3f_Bl8(YuPEIjNY-84D zq5?4Fe9DA3BFE{$eHf#0?fMHaM&tbW5XTR#V{qoGkmCpUEPe@~lgW@td7vzl0{!7` zP(ov7Z13%Z4P!n%$9y`m(uU5GJ$A$vQi6?DP7`ZRl~|MAuKXJUrst6!OsRFFbKRz3#XSl38(oy8`RgQEqX8f`Y-!k4C|J6c2;odJwSh7=7$pQ4cfDlX z@B<+cB68noo`IDawmVj(ReK2b;s8tQuL)fez+Cos325<&rS3euV$sKLs~ULu-}-k@ zo=q`7IzVHKT+yKF3`ecFXTl^K02pOOpPO&N3vR(rERgf+9j{52ASl)Ro-xeg1GZsq zz$@A}IwIaN$5>VLepxKyBIxR8y!7bj+Q5}C&V68OYa5kPFh*O=S2z8&EaP2a{k!lG zM98uf#0mcC$G4G50b>kAVX%>>=p_=u*a@^WNy6tDUl9s{>FJ@>4{*A*yU*Q((Hd1T z!`aaToF3i}4HV7pbuQyo#X0u>3ZV3g#YvaXy4o3{hpOhKvY9K98|>f(4m7*_)*BH> zhp(<1lShIi{2I25X`o#}-Rqie}{T35z5VG?dAC$VqA8 z9Vx7xJxA9(R6@M`tp$Z!Yvl$;tD0x6fK1#>KG*eMc!^z5BItq$?Mr!D-E0$7@3=-O zWSd*aHn)~uM2o-GZ&QGDN3B396^@_j4JEv z$IS(zw51kF0TfOnHi4<<;+-DDkMADgAN&u07yW)8X_8=fcNa=&XsvO7s!(YKtu%W5 z9*iymwz)sZvDeS){B8}Cg@R(4U8DrIObvn)4PVT@F4JohYl5>7egxVyrn7)r49JgE zr&1zKq#LwYoXYfAdX{&PIi%~J)q%f^{CfUwd-G~M-IX{Qd z25H{KU~7a-X>=Es}jG{vE-LO4ip^5tcC0RR9X07*naR6+u_YWH51VLOA3MtoaK zp`_-!#KK_fjG~vu(^fBS`N;4EJL@v2;c+#4+8PR`QVT*hPzobAfDq5^d(fZb4yOY{ zw_kZ3e#SgLIxBc0eJ2aw{C9s70AYIY0F#IJ7r^a!{8&)EI~PX>nBTwO+Og1t8vHZb zJeDB!!~*YAz_M30C&&j=W3TOJAHDC?$OPuI8H!?t#980~)*Mkd-l}%lkxWD@I5sge zDFixsjy%gSnM{!9dANttGzCgKN=wWxU^;z+N?|%@pp!NF3*6#5AjI+(1tIYic@C7${4lINPlROw-RR9q>TSIiVhEQ6sY}Cbv zvGKK6Fj@eYBTUlyQ~_v+`WRzy0SKxtBE;ZITxjh<}8UCH}y zlf{W}a(oODgnOTTW;Gi8M%%hM7rgb>zz$x8D@hV4rSR#UJJ#Qe4TO-mc5S!8^R>a$ zu}xwDo+SydrCQlvDyQ2JrnlJY8%QVay)3}4N}?OLomdPA3@ikeI=I?9KFx9@y?%hf zwuajP0fXTPT5IHv@!{!WejM1JgR&@4R;7glq{QiG_wdt?KY>yzj9FJjf$?~Z(QvE5 zieQ&%8<$N#fAe{aw}*D~5)Q&)5uI~WGg!zA^Ejmj*4P?ftFvtPF{&y9l({{sr`?h? zvzBC0z!a;K+{?-0wm7^O-p?&|SRzC%JJfA@8}F`J%)0&zM!oV9oC zvJh`z#%H}OP!yF7m{P#VdO-^!ytY3^XJZHgu+>TNofmeY4Le&Q!e@skxH~;V^C)nQTV`sSGRtG@}yN-6Ae-)GC1E|VrECXRWu9}@ky1tAw z?;_26HVZ8c1li<-wE?%zl%VDJUpxD4yGhVm%%`blwrWwaXlBESh@KFu{*dYhTfAd% zG#cqKCXu9#j8`qoanN`FaAe=1KJVdWtQQO{^!2~ znWpHDchMc~Aie|w)L<3}A#4ZSy>q1$`a8Smk9Tdeg4)!yrk-$6qk6&|16@_l`lZfz z*S5tk`FIxG6J8m3y^olEjTFK{2Sm_d6w08ORoEVMLRR3LoW|*|Ugk8EmBPRF%fAGp zHI5(N#fcklO{87iqs;*Z{cb430m~Cj-F@QurP|o0ncWELY}%9gjl<~udlNRre#TpXWZHaT|&pcF|b+Kq=b zLkKG}q?NMAs5I1U<{%r#Nryy68D9G4TL1%}ee^*PJra>Pxt&-OPHae8F(X8z39<=U zRm@Qp^N_4CfGSJiXGw)1NFp4cP0;Q4@yge~g~NNdad`hOQYq}UF$SI90I3utNK%L-MR9VB z+3`^rT<|4U(qbDlN+Kcf@cs8}Pz8{pIe8Z^?cF!NiQPB8VNaP9xbwq53PIeMrc#?` z4jW3GaV^c-I^CDR4B5J7mkBz21;z$f@+SSwZWuxel$9mcpBEKge&HsH zvck7td>-%q+1o*nb!m^lO|G%A8f7Myk0fdiO7IuiEf#SBcDQ2=Yc&}y#!(UlMeaZ1 z5}VSp1>aiSl7Mn{3Xv*I&L=pZoT1a-LYihcJD*sH!X-~yStDBS66~BOVYIf|#Y#bI zJDjjJ7}&6<6$Am>y$+-xFnUqxY&WDzMG%2&CMIOF=dx0bhH<40v@_&nmrSrR=;R%! zBt@A>RLYto2xss~&YFnr+@PbRNo;OyyX#609uXj6KoFQuCpep(L&_G9cU8a?b)vaY z%y8|bM6JZLZLCXC(I2_{a>=;57E%6{r9n@~( zklne|TBDoiD6}-$qXr{;R~M^Ws7UrL8su_&hS+O9r$ z2H8OeWo&NmM*6eD3i-Q(l|o`~|0c%QuDgb=Rav|9=_ep(I;GSI-Og#rM+$M<4&7QMsPXOHipm%+O3Yt7>oU>u*4BX+N1)H3Uk4QW}Y@8+mBa z`KXm>Hcl-qZh}ii&U|c?xX^zw@rySGmYExk7 zfW3qVdSRLRD4+jDb|YT>HhhVA&Y@Pafi~-O(a$A1-7dQQ0eQco?J3|NP(i09|LiR;UNq-MilSEM4`&K1vsz`xdvER&8V}Hfx_K ziDj2R&i=qSsHC%XXCzXgs%#d^j)$z3Mv~{YDJQKW8G|vMOhE*6(ge8xQetd&J2*S2 zz{SjpN5_p*?+)$)FTpn9PRkjz*68$mI6amql@73tjHq}Gy#==K=aV&U42r7B`0;Ze zQUF>k(()cj4E=L9ju!%NEKzE4mZowNU*?{O4y+xRrKgZQE7)LxR@BUKW1p|!IG`hJ zc3o}mngBikE2Y7t>Hx1Jt9VJx8zF)hRD?B1h{nY;E9Rexn)0%=s+)R=fVv94d@PuK z+mK+z#vN}E-mXR)g%@A{1}2kpn5wcgBV()vLzD%BZKwV8}X@Sjm^z1BuNtRTp3xg z$1&Zo2{b7wurd?n6w+)huP*Rrp!g|jvy zn?3pjNEt@q5-W1N{Xwsb64m0+3O&2A`(z>e6qm0m+bLOvnqa~0YAQF+F0yr-Hua2~A4xNU;YXET_?L&(IQ6`R>on9ORwv5YDfL4?`l9Mj1(!e4C# z(}&HpX6L7vou68~-r>v)#%H%bwv%lfXLB|nO=d--!n^sxOSt*MOE5xM)JUwp9(;iq z$D>|XUa@(@OG%T!^ys0LbW{qRZVzvK?FGyZ?m3j9ha$?{x9pjT^W&9-%iF;NGVnVKAy`nVtRy#(OtVIV&UMgQ*mNF_@g6 z;`G#B4+29CtieI08z6N9VtNFMharh-~j39*pM=Xw3HbEPqFmHur^_hdS26r!ET zugM$c)lCr5@>ZhSKL?9eL57Q*w+HZ&AliuG9Lzs$_Qoyin-o^1#ke4fG zB(CgTfC*@MrLd-mc=W_$L9D=_DiwA&?Qq4sQW%YPFx=e4`NO+lhj~+2Sd4C`hfcQ> z08>x@+Z>KV7X6BwF7*>-?ZT6d9n;oIVZ3)E;O@rgfW6zsn}I5w6lWr#l)`9d*Sb)! zl~$Ex&->oBJzU?v9^gc;EOCDH;7Txho><_$%uT&cJ&abt1uI^mVIWC5$v(KLAX;3U zk%dmI6#-+Q;|^kr7uTSod2A~FeBVta)6k0LHTtC7`fie%lr?Wx4%cN~ravnvB4K|{ zNcK^CZXSwSf3Y4t_)~OD%*`>L)1!wlY&AV(l3;Q^v56%qI6XcXDqN`7-1k_MRl~N6Gm$~&C)AHpGxra$EELhW7aSU=n>wEn%Gs$;!qI*AE+m| z0INZox~7nHLMu-lQjt&a%+q22Ej~&sI!IX(xcr81LP{i@*3ELX}sio_(x=mkqG}${R>J{rVO8s zkP=lfM>(Il(Pl4KYETw)RP!17TiY0H4ly}D#reshgA*e|ONX(hY2q^8<^apmJ<$C_ z$OIr01gHoiVDS`Xyq>iJ0L5&I>Es+rYjm8Fn%2g#H4OHj`x=~r&sQ_!Wdm%#`Z{FR z{Q?06sEVrbWZup3+?(I35u4~nX4laU8DlZSt-tcu5DR5iMG*zhMXYglbb#r>!x{r_ z1ltC@>~JXi4xQn4fGvm_!&hIg%PcUM1U~!WAG?8!Ca%oU`^Q1w7~L4DHqqdIb3>x9 zY~V#C>=FxdPl^(Tfqo}zj*S}w!3;^j#^wfer2~A#o-pfP=clJS-QI%BE_s?5d!iVj z-|3*NN-*0|<8CUkl}SL&vE5BEJ9>cKtpSdXPn>QnP@W#vn7ET69gQ~Y>wU#e_vGvp z5AS|jLtftKvtivufye9RN&SCk%4zyKRs$$;ig9*h;;ICz64JQ>3rR4BAXy+|!uj0l zxnzk9nj47}R-8<@=|5%a1kMF;rTx0l4ml^3N(109Eq7ISxi1IQK!C2wXkD5{7D{>6 zP?OS*dK7|}QjH+rwukR*ZlUA#gCF71>2xEC3uF70*B7wmYp>s0D%>4U%9OLR;U$%% zNh1&=5;jq$R=oPE0zIC7SSo{!?GeBRy;Q5{5!v5FGvX$w!m9?xZtlsXcxJsALJ1r{!bM0Ug=gmnD!krjf ziONLc@OXmRod#;0c91$q?AZy3avHLv=eyEjZLoEcmcIeo+myDs_m0%2+qQ9 zm2&`B+QK735K6b!O+pab0J=hwiUkADuTD%}r2O)rA?p zi3}Juno4GkO@>lC9{5#7*BzwbB?bi;*Z1~dRAseSt156em*KL;Xglu@#`bs*AmGmJ zPeKJD0T|EalV%|pKx<2aVej)6RaVAZqSqymh((JY1yjBLI#^$=^PUL8Cufy&HnH?Q z>3rHeLZ`hRuMo)GM&liyt<}5zx3xpE0oAw>Uayc`)1*06pT?ViN_S2}SmJ;=w}VNL zZC)}#(gp$DD=<&Jg47c&MU;9fzQc*~OgZJKP zXzWg+8^A9}j_UvOG^x{AB2;D77?x(OTY=Bs1o`$D`PQ(Zd=~6wE`x`q31phqK_f}( z&g&X>HfsY_%^_rppFf&cW*Os!je*h{JA3=Md*`;bPtqFX9P=_MG1}S1`1(yGX$m67 zaL4Mk4tMsNQ>*Dr|y(HxTA0uO*dY60ed%YfQV2!=<4+B6lac0N*4q+ zfH4?sxWIBXgMncKGQ!EZ7LY=slO^b;7G5)gAq1nFr%+m8a(aTzJhdK%!Y2$?)CMIW zNx~dY!C)x3tk{kuw&as zvvrde1nDy3t5zXCW~hN+ST$uKjS1y~54`c}njIY?%kz*KiZsR9M;}0>bx^8wb61nC zlt-JkWw%)SdLJB5fBF;bzHtlJZha#>b?5CL;d)97Yw6rRY0Tw1;|Ge(0v#Q%9w zqL|n4h>ld5_TGFGul?nJA4ebmaABjNNOQNn$p}$X;m!}|xc}Ze;d_Y{+|%B82mSGm z-&OGNhyN1a`@(R zfy4kL1dLW-XOv0OzIKo&*c|TSfhiz_z*$i_SYWYnX4T-V&?k%9BA!7YUBNi1NdVAp zJfEbkoM8;K(vAfrLS@{{a%pv0ds(~YpJTjFxx{jV7j4Bc5p5jpwssRMqK54?Ib%cs z5ZXYb%g4?{n&bSlcaWyZ!bW2lO*&a)*u&J&!+Y;E?j}jgXCZf9zlGh`Z`sdHQoR57 z|5v>GfBx4XBAn04(0|BfeatFintbOsehc6Jjo*4Y%ReeX309P**Wa|k(;fG+@$;Yw z;=1BT2M=+!yQTOnXi%v9b8B(+Cj8Sj>k{oz_)!5D+lc*n|Rx&Z5a z5nuh*_n?)=a5!{h$}-&J-nBb*TEDEUMZ3}(*I#@Y5AP(%H&tXwWH%3MPRc<~7!C)% zYE{N#54;3w@k^WIzPzB7uqNGF@~c=tCC*+O&r{QG+UqrZwFp?Bmy^gydz&Btsi?v` zq)`S*#>z4RfOO-b&+G`v`g%=HPEgKgfHP_oUb>SFDx)zuJB5@IN*k-;d$d{8xX4bx zd5VhB8n?dt%P>ac;oaLfxO>MPxOXb3E#ZwD4>s@)$UvH>LB`4k8jUx;`^zv|sbD9V;O zrcY9>jszh~lJKqC%{?o?QG@e^QjMstgT|+oW{jX#^F5ehjHCVAm$AOmCYEM7V3L*>32tt}9IJo~QSZl~6aWq1)bP;)oh6ENc z{WgRXLkWmD+%=m@M5=Rgp=$9NZxFU`(9)=3z)ApASwNKq3Z*fx6n4+9R^Uyu9KHSq zI=x=VSUF^kSgfRkuh%&boi+J_2jGYU20c+TJVCaiX`Dj z@BW$F@HD`-gYBopIFe^H%$Su5UdgAZv~v@V<&`b*|D%VexP5dEB0{Ir!C)|O8L{Jq z6HpXoU1GbvY?wI=J|6HPg4PN`T3JXTEDWNw2|6Dq)530f;&M&6r~RnP67$I!=KdTQ z8+d)@N>W1lVZW$J?D@&$uypDEUJ4OdAy!#V1cT2;rAl>T)kF@tu0mSS;xgfQ){MdC zX5-G5PJ5Z$=1pH^9&a;OiAub7!9sNrL&R3a$z^XMNgCaI0LWz1g;=p}h>TZChmPu{ z7e=p>E+@!9dWqwIf=Df06Ct6bW((?5DqRN0D@pUc3DEbmiyis&=y}(K$)>HJt z`ZX6{RVjtVgPre~cddvY-oYXW@GxUhsDc(wI5jw=z8JaM=iD$uX@ioIFim~`@EFDz zln@YxFfjz9G?FB7)sjI`%#o%kvMh6A==L}#Km7!~UJp~z$6(Nho}NLf0<+RJ-Gsfa zN0S1^FcOL2&`~J^W&ve;d|4Mhq6@wiN+xzD{8cvxU9$BTgu#vbiZgyY;8{}DL^?S=QzzD_|47cnQ=t+5u`Ak3> z6Kv$$+g3yTJ|rTGo@%w0{SvYC)-UKwu;G0vp@uK2F|^hydx>jo{nA#$Vc~~0Ky&oC z_uktWzx&bab} z_uc^|qFK2_6IRT2jMW%Fg=P=W7y|=ff3t({z4>)$t?=;fZ9KetyMfV{3Md_xoICAJ z62jVwQ_V%y&ec|H9S!iL4**D$h==WT4z5f9NP(aJ=|6!Kgq$7UmKme*E*OlX zhYy03D@%Z2*#^>CvwYS;@P%PU<(g^@`yBV4?%jfu^HqI_FJs_MsA={7MJSTTckebk*Gq%aV=JKD0&IFm z@K;oK;gL7gR%S@9S>uIMV&~?oku$C{v-@(07)cj+i3nZ6=my6e)?L_myghEbTgWF76cP&KIJZ*T zs#CgvPb7lQHehYFVqisOa{vG!07*naR4>Ka{e;7PWNB~&x}p*8v1h!U?J-8LyxzL~ znm3_{Y|)K2P^zpKl&Ua#^^Ha_R7y2Q{tP!sYMa~?jfp$23^-DC{e|MH+$-z*8=|v4 z!q!W#G#5~WA7}GkDhAA8@pUEyYBjQhSX?eN$QTXW`Ou( z%Q_wOH#UR#%J%r0WjI74+~n>%W9&$&F$Q_BkKxX~6@r;g1AeJps_Z2mcA32D{hxk+^J> z1fkRE0t958E;dL&JGDKc+B8520b>ld$Gh$t)wyuD*F#y%vAcKOHYwY%qVwIe!P!E6 z%$8~fX6#(Q39SvZwq9|!D>Q?hJv;-`%|+at)qW-}N>jj((&4L>JRI*+f#$L#b3^V5?i)&SK&D!)zC zgfARPzcbuM|JvRcI@b6YrTm`$a9HO(ecn$_3B7+e4PyQQpM!PNQ9}GuQ}|XF&rxSlKjx z?*nfmvm?UXom+oiJH6i3!FLUCPUq(s@6R7Uf2>CDqmt3%i1gA9>@+mL^HVuF6-JPM=o@5dvV` zE+F!1dv>UWA{%mYfs`Ed76LDkwfkvgK5#yK957%Zq@}v~O^##M3xgp+(gt*0PVwTe z{M)EzU**6{q9KwKXEFiXi3D(%fh5Zs>SDkmbkJ0-YLy?xG{jIy$iNZ+GenX$G1XS- zE|N67r(pYEeBom^3wvx75OQv4Fx1DD4>mAAJFUy8*kqF#Bx?#CC5iivwux}`{=0#e zBxUWn*4Z8-ACBBH3LO0Cop3Y90_`zpL`JLzBGk%l-2A>}88JO}chTG3ts#u31~rJF zU}cr65`6l>yXf{eVb~zgyC~-~r|^YF1yPj+=F@ZJc?Ws7i?ibc%YN}>QMOEnpq=8l zqs(=uzADSmG57QTy^T#UGp3VsOeYo&^7KYyIFS2wH3Jx^qUz0mKdWX&*x1@aZ_sN+a}#Yoa9fne3Kj`h;b^V!#?^7Wg+5&sG zzJdL(*9v2Y@4t(q_us2`%9gsBZW~dyrjQzCRg%~aM8KC#tupq;o7lhgW(c}(|GmFk zZz=@LBY8@O07oOM$LV`@@K+Vs!3zX5Hl{S%#Ih_yy1Q>bFG+F!@lQg)j)806*zN$dU5cz+7yY?;RQ2PfWvBh+fH0k7-%42B~*nJFvJjs7ZWZQcm*36 zBLHF7kASsmC&Lg-VSm(y9W%wgLl~BEBuGEaD5TAJnHWsG6w(vI;?7sGT1uYCMT~{e zolb3hBgQ%m1VBP8j;XF;6G+)?YLRG;a1yn@L))!vwF5A<1HMd}8GJl49DS})3WMu6 zFh4$uurSjqnd8nT9bRn_aB`9nwwvRp|Ez^@yn#yWf>ZK zSL*(CI>enkhtVn=hxflD5azQPwALt-1gGZ{%ab+)Rp>D3$IK8t3lCJfLMkN^V}ji2 zaAy}J2vQ_4rU+_spe8R{MZ-r7hSDlfN0UTCY1oOicnZ{4iBedxEyDl_q*-$1q%xj> zNY3JlV(QR)*xv#o3(C;)htj>(8OLVt()eEEmg60=xGiaX{${d zB4Yi%+G&K=5Q@TSER@rjTr*9$<$PWT8(Qs3Fs)|c8)cQkX8evu1I7uDL<(-U8M2~U zi1FX*tbqmlXUh2;MOnH9@brU(bUbHU;YtX>q3raKNGNw5j>ybVjs~WUak{PqrL|qy z4$o{xnmSn5-Gn;u>gc`^LLiY6ojil22@)w#mL)1CJeU;dWGT`ZGiN8KC?!hcV3F|M zuUb_hu$4<_m$}>hxaP##|E%+`0WcbmoWRf_h*Bu6Q4&yajnM)Gr8H#1HF(=vmy4^G z79b}qyt?_n6eii~zc*}PuDAy5ql-63wEt#B z#{1MIa#|;CI2r?B96Y!WV=Tuuj5-4ss@8qs?-Ttqkpe&b_#V1h3dz81URVz}ApsIL zz;m5U7_J3;uJWuB8v|tw2C1mesql?U$CG7y?;At7J|5Y_oE}31&_ZC4!dpkcl&1g) z-Gso^Im)Gr%gQ@yCJ;N!7l0R55K=fQngNkSLbl?tj0>_8f^k5PB5j>5{|t=`H@f#x zP*}U;hMV(=EM+TK_XOUb?6xkxsl3;eV)d>R|!#3A!7P~zfL#YazTibZ`^*3>T zc7*T$)Bg_@l(mBqUZ>SGWHLhuN))o6z-_5zv4VgK5d}Uuk%cl0i69D-IO)j0`mcTy z=SAHJ4cfKbw51`6nKS~GQdczS0{b^#Mt5TihX)Vq#-(>g_RJ4h!%Aibq<{d~ssd#7 zGknSuHOA`%%IOrljs7y@@pUp|0FFG<*a@fyCycfo5LrfqJMUm~B?Itd54<9ZIWg%v6;bFHSj+7?eD@=C1lzOcYEB#X$KaMtZ|F}L~E36 zXaN%x4T_GRzzGK_B}6oq*oG!zDwP*|Zf5XU8lb49@gM|+z)M6ZxG8_Rs)S!K3XHkI zvBm?5C?k=miX!avfwS6v_jL;KS1kZ|!%3G}DW&lIORu6*3TYzk_;;tfRMe-=dY1<| z6Y2M|Ai&g{5xXE6FkP}^tUAKC+1baFvkt0zp3T5*wEYgd``2Ch>+FWugy*i3{Td12 z;NER)jj!AC-kpz);TYw7in5r8rq}lFzRm3YumXz4{c8Q#Os!z%tYMfLX__HTGsq+b zGjQYDE;feSNRq^|4jf@e2H zZDEOqmo>wh@j*OJ9|V4s_qpQr_!D{<)eJJ1O8K8u+RJqX;H{aAA;=^_mUmHUg*?q| zv(0_i!Nw+bZ#?e|78x7kF^pkkN~2e4^m+p%oy=|2(hX|Z@pb96JUsTFM9*_#1+|BJ zH?TS0bAg~lY~y5%3IjZTGuBEqEu6dy@)ZlbfE7ZYoF0RO#n9Op^frc=P9~U~9=qu@ z!r{XQR);}KZ#ich!z8T!g)!I~?;_2tI$2c~A>9ga1qtNcKHvhPkP`FR1e3E<7-O)r ze**yF;oVOm-9#HZ)`}FuvM00-Yg8!%Fk@@?8s?L8%%Y-QAPH^!hl8ly8BBlR~qfX-+X z`B!P|ed8@xnvu)SC@LQ71s@s^K*K?qqR-pC^^H)XB}p2zgw0dro<;&w!RYe*>=;^U zbb5XCvkZ;7RDb0-kfz3_tfQa2zn2Z1x^Yf8 zV2&nYTYUK*nt{1t2$5Pl9SIzqoS~dfkcbEd2-Q{%{A6 z9$|WRj6?`%whR{`#Cr9?uT0=2z*H4=+r!4r zZsYwrqY;LYP>=CSQ7*>mhPfp{srviz5-r+T>8wB6u>sJ%wwl+%=$kLTgux463qP0h zdUDOMsg=gqPNCINrgZ{@2mwBxTuakhVA~jt{cnCdD#xm&0n9tO)}^IrY!u;|ltuLU z^4Vp)t;%U~dJLlt&QFhV`oK;}E%ROTv@$CN=ph*biyD(87NMzDm$Fn(tcBC>7At#0 zM@DsihRMm1-4NK8wS^nA?)C=g^m`x@IJ*B?Xd?Ly*h5=YVZ{Qrrsr3y+F?ea8Pj48 zt+iDJJ2^*^rY@V+NYeya*0qii#oTQ)ghW~_ILmUYgIg-hPEIkO&yhRDvW2zedKJP| z7M2cZLWga7ep)L65;;mEH3ZMettkf39c%=M#2AB;9jn9`my!PrG}m+meEYBdCX%!p z&QLioqwEf-bk%4zNhucHT-(?~++-3p*2&t~vM@Tg-R%*w&0#C>>SYkB4O&&%!o5VJ zL~Q?oiPWixdSMZ_H6u)f5t>%l-KaG?&lM8Neimgh!Hzt8IY!S7x9+{tNf6rKB_aV> zLlsk;9^AJJP8$r&)WHz8rDkbJcHwSc+sA0vs$U)4yMu%KcUs3xA*1W(i9H9R4*01v zQ9L=HgUD`(c|L-W5|fidJI)%psFd!W@D1MmD-?MBl$ay|A?+rWW+|$wg3;QJ-8wje z9aJ(mCS;wuup;NOVpLUyvOL6d&pn5evne(fF(liIV77xWUI4u`j06TrxW0Da zq?}DK=yp(QjagBklji^!vqC%AfssmqG?BF;T7Z2RigjqpriuL72)uyHcq#I?Z+D{O z?9X;Pn&Xrg1YUOjOmX1;QayxlUT*&IL?bf@HbAht4Pk6PO@odDMKmb_feARhe;=n0 z?l-#kgPk1=c6QvyN<4h`ZMU&_Pa0od*Xcx(q@h{)(rdSo=|dRNg`(~gPH;I;3%jX= zNd!Lo^b>SC9Y`TCC&I>fcLAW_DB~rvK~YEn7z(9nXxO$g-q3t$_Z(cX7D9%fA2p!G zgMpFDISkutcU2q`jA3-SLQe|Fj9_$$Z@%>n92^|r@aV{+v|%%30_F%jJj-8at9P6v ziM@B+P>T=(#F2N3AD_O!b1@CPqx@0fe5II zvbhj_26XTMU;9h{CX9mzj^BS5#~-{GUO6cW)KfUo1fDWs3JYjLCWdWeM+o6)XHHu; zOEG@#W(eG8AAS&2$r?f~kxB(c6~)8bxAFXU4^dzQh3-?kpp~{%q1kMP$#fR1+V9`L z?>M!70T>7pc4XK);L<{`E?g64AWITt?i@%d;9yLY4hue;S2&%QAR&+^3Ho`0L7u{c zon@sQrs=|KbRG>ejM69=fgPi&$_6M${oBgUu+yF4aNd3PYlnf2%`J5Mn^wTRDo|Au zXk(DTpeJpXDuu+<3A!5wHiU6w-4X0!{xu(dnH!SOLRw1Osb6KxFPnrv*W zwu6O$2!e#o14M0|WT6a+N*k0~+h%DZkU8?T(gsDPFmP)^8H2g9HcTED?xZQS8_*C? z4XC1Cm|U;VAY=tZOt;{K;USNBq7Nj(>zUh00WI_{z)vXfiX>?^aa8RTP#hhiI6i1B z`tE3qY%~r(&yNl891Pe_)C@UyN;{DuGcKY?~| zgGf`n{lENAHq%5?DGUIr)}A_DP@1Yg$V9kl;%;6GGgM6hZ4yCTngCFe))-;5y9&}x zzpfao{(@Vu2u-DD8w6rqI^nWHhN@p;tjX`PP1YUF`V6Kr!iU0n0 zeh-6Q7g}qK$76Il-Jq|KBnir*LZ0VHk_2&8W&=m>1TSIhu8@ADvrXjd&jjv(2vyVy@n4TO%C>10%1?=X2etHzd zZM0!*ZFaHQ?clVSS<4@?5}%&UVVvx$ZKk=v3jqjc@+t)kyh@o3ytAUL&*y@*AvIt@ zgZ4Lz^ zL=7k5nE%PlR!uEQ+{xxE!+%|HYmUC#Do6LzyLa*YH{S}_vyN^$qfK*s*uR%CQ7!iL zbkmsQMPS(nJL55wHki#UH3&ki9i3iKy@(q!4lmBr1bLQ)=1U?4ilRW~y69C|S1(~C zd|CbJQXg8zoAzZfHT4I4^tdXhBM~q?JAu&#o7+1!IZ01!LfwttV>XUeyXd{&gCNzlw?A{5$0%?@r%34sxuRpZM#=ybwoSH_?U&Hw_& zy}{vw2No)E!vQ)9%1!x6r{il&S?#8yG&d*Ih!DnrbwnkbR~lB6-euWA zES<5@v%??hRnp^iECOa=c6Jhesf@i}M!S1ZO8fa}kdWvNHbR*iUK@inO~cPjgi`6o_pO;` z9C~29Bt_&4_UtbouapB1L1}}VuinDlPd|YW5=Tb|meE2Y@-_1uQM(|8u-)!?Vd0!a zT2(P3!f81}VGRDgzx)^R+|B2aBq@IP_kIukgz?H=ALp|Q1OwXbN3^{(+;B>pM`)_F zGoo5Ui_SMFnMODwMNLbsee027Q5fe?A;m({ zU|eO<>krWD55lGZ09k4$N%dd$pR|s6)hle1DR_wDYXfzH|i1k(c zzZ2U^kIq@Nle30Yb9bYrNS$4g7OhX#I=n}>BO6d|*qKGmiqN8qIgOs$Df0`#V~FK^ z*0LIJo;q7v8l+ick`3^9x=6_u)R^Z6Hp)i)c1(cbltN#*mRW<|K~ z!T|Pf+=SNJmAJK?jkh^ZQ`fU#!du__C4dN8TglMIfSu3edgG_Z5V>TwTN$9J6iC?y zqXKa5;F~nfV2o`{3d0yB5>rh`@&TYVxSWHP)q@sPZ~f%)*r*R7gmwM>|Ji%fSj(>L zJnUP0pXttT9%^6}*=!bvBH7I*o9w~e8m%a?9Yu2DI0gd83K9!(3|p2XMMmN{p4~_y z$M6pWQ4AOk4E+cap%uZhBrDO-l3HT3*-aM7;#BjiH{bc5VGsGS_u1#1`|hiHH9S^z zQx~Z2V!iwBaL(Rqul22OeP0^Kkdr=qR@E2b+yi4|ZJjJ?&j@}Hx%+KKzO7RQ^npej z*?3}HrU|VYVY%aB`c^Q~;H2EbYu6ZBwWB3V@(u<%X9aWbqqwQOBw+n8Ew)1o4_(O3 zF#^D=b}qW~yfVumr@`chNZ@;wpXEMQQfnkh?C4}!mQ{3prx~p^F7bu`*EDQMjx!>1!IJ{2I2JL zVRa(E>wtPMkB+)5Jg5xH|NJo3GR7jWWLPgp&52s-yuznZd=ytJ2(W6J;+GuG=1~nUYf8jLDLM4 zl~vT2mO&tldj%ibupexe&OK)#uB}%K{6g0 z!4__4P`RE1boJoOGUGM2zkSm<=SqpEKK(M3*0^%>F0pvx{!g|_~h9(9sCC1%7$TXh07xQay_}to5+b)-r6-U@Ej~z3{&GeqdG2MD3 zg0fRo)7NPO@NGeJhv35Y5JLI0I7~g)&CN0Os8%=k&#sRwOCY2`5Jm{28Ybg0kWMPtH(;)NI?9SB zyIq?~NhgFCe!TzyAOJ~3K~!?Cl(GUEHkfjbz*5k())qc93({yjm;r<|vsx+E(DXY| z#r2^a89wuwm#}f++u-&T)=EN(s-jt?JE;qs!uM->PFT%(y)egVKa|FJ1&Elq_UssmPI470bsv=}53nW&h>| ziZec_#~Ci|4&iwmjew)!drnJ$5#fzX*U_lg5rz>mDbWl))O`*q1w5ZYN?n1j9`s{8 z>|yuj6#xW34B`6`{3wJUMAp)$=)NkY5QJuWFRVp4dFl~6{;Ms2SQ+D9k?}HyNp}z9-5rw+J0*W0+1+tLg!$$= zk;ifU_kZ7ElV!W0we!zo^_fpOJp7)%gU$3uqoW03&x&!AE+(8{vsM7eq-khMrICo# zHE*?*`_v^GNWS@m9fGKZL9uyN-sm*{oh}|fQ5Doy?!69 zRvXP$(^By?!Z1WMw~Sayj8n62CLnaQLW|QK^*BDNhdD49U_Iw#CcrpHRO6To`xx~0 zL0ZEPBLq>+9eRz<0+h<2Ws!6QerTZ<69MN+FclGDXL}1uD-aQ)sDWnWBeMMUfO98? zmA}^9!h+L7;2wui5+@#c1ZyWxB25wqA>9DsOafu4viYtLyh;F%{=5GHyr71I(TYqN zU&{VwZEh_k)}MK{a?{2$I?e|gV)yTF#-QC>lJBRk~(0mGQ=VyBP0mLqnr) zIh~l!+$h)9C5(2qFy1Y)hP9`k#p+Y%%{2=GeB;;uHMn)$mBP}Um@y(Ok5%qdk!d#; z=AG4z7e*CdFo(NUnoIh=Z}j1C=z?&w*>u5+K(2S9VXngyPoGD>yAP43*u1%6rlBlV zsgmL7!a|BMf^X?aiI7M#BVAaJ!jfiybuf@Q(HhgQRbF^17-h`G5=(aX?A z8Zn>V;+)$tQs!P&iVUr_CmxyrkO_rRDvWCb5rSF+-EoZe{Cs5uSY)Y@Ikoq#-`z8K zyvO1B0k~)MrCXhOq)B2pwhn(a*Jo~i!Cl;_-au!rGqdlagsE_)k~Y^+;JV!4HjPUs zUS-WjIp;{?3DS7%yb5o|V+{NK@BYB6CD2~|B!=6UaCm)w%wH-Dfk7X{xy^QGWxSrd z-AXBVL4e+k>*!v;=CVSENeMNxHP^p!4bS|^AA__c@%{JS!rr@YyTz4dnM;X@YJGB?hBcLokC)UEJ*;FD`rtQG)jUV!@4>I(b- ze&El@Oo|QVbTuq{Bns?(p6*^FKN5@4G=u5M}Q}>xu zktobHLZsR>(|q4|S(j1v%Ha7vd}c9XB1j>iU^7Z7Aw`Pj>gk8dhK2#?BQR`))O@cu z-oFfyOt3W9MkXYDnIaRyDBtCiVpfYn+6q@I1#fv3ei-8V`xlK&WDvmf&1-YdHv!p7 zNKQilN@;k$hfzGisNY92@vL2tX@+uQ=HuZqG*i4)I%+Nluv zK?_&E@pYtw0VchDNFkkYhFNG->5{wod(I7WAkPZ(>^YNDTilkZSz5&&h=EFT_^dLe zY}{9m>!A+;%nBhL^Ne&nF2q`JfDsMQ;2w%dT#h~pUT&Kz*{>H$X+qeMk6Bg?;|E&+gUpn=E`^*Mv*bSosX)Q%b3 zd&n7wZzs9(3gU&wP9n(!@W={=lNi45qvmt>xjFOPwKkQrQ7{v^k>*48V9ZR0$wWd) z4b8dZl{4;RXJ8soZ;rTUI*h0a%!HMO^<|fOEt>1WJ^DjS%xz&e%4LHao z+-bTLFN?Sy(2QUV`W^)n>4;EpPAe}PeU?XgX-cr0h`WWxph{C{x;oKQ`cCP1QrdLY z;g5muCT!mJzA9|f(XJ2&QEu;bjlvZnjICpN)ZqT75jDE|+ z!pa|NtoK zT{N3bB;>&hYUY}X43ng=3j&Oan^Fpl7rci|C}?ehGckr#ntL*wq;6m%ClU%9c%@Pm zdLf}C4@wUP>U>~<_u+fclyuv)#Wq=e0P~N7t?kNhbIvPHz0NKt6Ch3{ms(w+w`94{ z^Rz9(K_ul!fzvP$^x+4_QLhCRo?_({OC?Aq9=;zSj7&3pjxQQ$Ax$v9dIDJzgQo(j zy9c2a0uWk02QdXnK&lmp0exwpHST!`!w|jx0E~O^RPL!(UGPaJptJ^8)?Cy!rWxnh zx_-G3A3r1$&Z{8T0JRBU3m)Ojl4nNK<$hMwW!G|=f!XHWWn;HuCiS$C(3F$O)f7~qXJ+BKzZjLvY@nil z@F0@}4J*CL2n@yqH7_q2XBhUohpr&=eaw+Ex3qHTp&=?0dsc5(DNruNeTdEi*>cvg z7?it^(Ao&~>~G(6_#>=LVqWOHv$cWE8&~ny{toc1tANLWcW>Gm9eOYxY?EOh$z%k; zNIA9_mx|!vhX}$5d^|#<`G^@v@qG05_dtvxNn&t40W?sL7?jp{?9oTe_33Sb&z z?1;1yqQGhO@qhP^3fI*(h2)Im+WYUo3udoBH-W;GN5 zK%z6h0If9IojK!TLWD^?Hi~1)uuF_GSb3dWjF-$1N-gjTjD|DFH&SU@xqI4LMZOT|O?g)-yF2$Tg>CU&p+0*^11cGm9qRP6uKD z@Q$Hk&b6+El;F%%R2o2*Cdi!5LeCs{et>$b4bN{NPDY4ob!S}ZdjY(rZ(ozJeBvyK z82Vi^&?A+?sNVy#Ty3M}A?@DLZcu_i5F*3ciPIPk&4D15woVls%~l)rM$_=t?E#uY zPo2dT%kL({qp^{<6e-R<_cW6Dk1*c5%Ag4|qy%P^;CYtl%5Wl(1^%m{OwVkB*wm=< z+@kY6m8lrpDh+a3!EVNbrJbl7wKis?Yin1LnA@WlNH#AaV9^im1t1z^6> zZP1eent>6fAuR!z=o6_Y}%J!i1=I7PkQL=gCx zOvad7Sj58eIy}#F163M8lE!%IGoOc63fv3a`ty7ro^O2egyjsoduXLQ8RNz=*kaU- zG@>Z__&^OuNoVOczY{Q43AE+%+Ysx6f`3~o!SlddDZ_6EL)=H94Wrv&y5?r|xP(!Y z@mpIv|Gb-+vcFUYyr7_Q>iN$&huq>&(1??X`<>PE&$)$JZu*qXJyFbB9QK~}9xTew5!5|GeVPlF1pDI(B4SU@`=AytJZW(DHAg(nyh#+e3XF<6qq_kA?l z^B4;OrWO3W2at`5N|uan2qT7MJcN)M$#{rCcNfqa&AEaL-)PMlJ0P2(dR~Bqs*M*S^tR41kt?VMnp*C34$QP_SQ9cjDuVD%VaXb#)t1XNywa*CZxpb$1v)&+|MgxGe? zjlrj(JNdp3&IteN*M0|47$8X!EG{mg6-x9I0d937yr6;oR3HdU2A5?Sw#FHjYTkVU zf$r@g)WJY}*Eq4g;B^k9KdY@m8#vHu417M>ztAN(scP> z#)L}?v$n8+EX|y=#C^S{%wUVmia`@GB$Kf#lOOrSIXv?ClNB7job5e&?irjt_vkGS z9zci(pXpB1{^pif5ydfh5MnYn52+-!u3x?NDkC7tqzSw>_!I}b#pvz5%hCi{7@%3N zxrAX_Fx~S!@G@6>#;Kog_?&K-S;t!t;PKhRIrlXX-z84$`2oUO6D^^kvJ@U?$TUNy zfdmSv)V87|OeSM6#vrl`Ns=H*613WFaL&QCf=4E!Wkk?QqfQp$BL*S`k(q3oagO2s zu5)b3>3CY3;G9Ey`Pybmq1I?RyHFxyBzsV>%1qe7>h#8GhB!$c%8KuSV!Y)tSgNY= zA~6Q7B$l2$ZvrB(>J)HmG}u^NMtyOqD8T`Uc#M~R{3j~b)45#TbSa((CJ`Sm`d*P> zwApeF4Up$!@WBO#Esr=q5d9~6JDBY5KuD9Bj|V;cU)Oqwb)L}z@-~69bcr5*P`~v5 zN-4D49n8Zi3!*_@i`vJmQ0}Fl)ARtX*NGoJD8gv0G8a9#!b020BVqz#{ zK@cEK5_kOoU}?$ltg|eGXe~hWcEPoDw(R9O&NBT`D#O2pF7%CwfJ_R+X^O`iEocqY zqZ(47kO_H!0y+JfhqpApO9QV`3SnmswFOfPDd?&|xWy>f&OZ+&6=ob$F>uZLJV1uu6&Ola=HP2A9EJFt1&;9W);r-2h5H!B=)7kkTeSX&87CIf=+}SnE145vU9bWNm#EQkg+14M75lP-eQ*;>DO!j5Co# zA7B8@KCAU198N-(PEkGecWK~Vc;ZRKL3h8(SI$A)n`vbZ7?GVY z3az9d$KKm-y6lsPkSUG5ciu7zNsQp-bTa}zNCf~5?g!wE&#ju18#5ZfH-7uy;x`V`5Bg+z`X$&b9R!*F`MI%%f9AKF8UJ;uK3&cr^7tcQh#yJ{UAB=G% zLK?2Q*60i6Uc+O?eRpkn4O%M~jA6fJz0pLw(*ffIB89V0K5z7$IfIlELI?4be+ojEWfBkRZ*q*my3IuKb3u16r>G}-!z1ZA<|2;aD%L^d#OS}E{rtAeIg=s_xng~hT;c-an#U2tJT1Rf`X3+YOwU0 z`uPJzQsc6TtmcDdZc%&?;{B%2Q9HeeP+SRr(lR{SeG6 z#CV2D=5%ja$pwM{FuzzfLTZ%O!@c9<+N@MnQq|9=+-@gyc32Sg0Q}>>^S2O$5p0s; z#CgJ~hX46z{tCi~+XkM^Ky7#54?+Y{=y=Y`ZrafDq#Dh(J4BTRq6YBeKlBow{p=U; z7k~Ee;rW+ex@`c~S|jv01kBvN)_LA<#)7YW@D4a!pO7R0}c!Jpgk^} zH{if8{QN(~|M@R}9#Tqt=F^{n-)Q5^$_n~}9=dzGm<)QT1st7)Ws6<=PMF*z2Q}<% zZ&yqJk|f1Aj-fPzRLp7&Yt));5D}W41;f|v?IWra2K{{#-~do2t)-Hlv8Ao(xi;g| z9>MYL7-w!4AfIB(1Mh)qLl@33T5HrBP1I_20A#3S_Gfv(Emv3l-Tw#pz9|^`w zj5#-nS&!k(4RlVNbg%>C47=~V<$fpa?%~7j?IL3ZimcPVep%nv-rA}1YpV9Dx=2*ypA~0a{t2z4`ocCMtNF zP|8Jg@&jD><{#oGe&ow|{6V{cNx=qX1~Gz`OMmPKFc}YzZKEpyf$u~6J}$iVCYtRzZ0>b&`Q5kh+_TSt zMNKSp+K^J>+O^9FJkMxYcxEiS)0xM@{G1W7QVOF%4`MQeuQjBS@D-uiS_ixUN($_B zd!~V@B^u2(lv1eG8;1UsCPF{-dqen7Jso{Kp*8f1sDhyhHav#??{q7`bj z25OBaL~6`AVQHlK;T8m;;k&PQki@eSq6Y;#9FIC#cORoGg)C&&-Nohymnxf0mMBq5 zO1$)+{TEJki}^kVm*1~6r1(^G>HuH!9y07oCtWGjmX<4lw;cSG0yGux#i=A!XN8w5 z#qyN&B1+V-{Lx%qg_6pR2H)!=WWeA4Z+{vmR@&emA>B^ybwLSaWQH{}i=Pr%%X=%TlmB;45#nSpJMw&d`?as*KmEZM@t6L)e}Mn` zzxio&XW+kNjSVxU5N8UZuOPQJ!2JO83(F1zF5fgE1XfQ!iZn@~Vf1vPTI~QkA^-1b z(G(&w6KRS~tuf{_Ubk*uH3Hinhwu9s>~12JPOKsCu(@p58JpV7joD05ALC9JN+WfY zI&+wE#u0@f-hJ;~0Kj`nqgIR1sz>0QVZKqr^2xIp4EvB$fuO;l5JnMvKR~U~auG^t zK#CMMuD)-l$ru7+(4Oh9q{N|=1OwpvK0MDuqiMkeBJ_Lv_FyC9qbLOy7nhxgJ@-6l zrEuc(qlUt169&$iG4UW~1Fv>Ubjqz~X8F?OxYWJ9ZDeWs(BQhqA9(xw7+v|Gy0Cq} zy2++_zQ^7u*HsZkRcu}$dDOf!QwYX#r;0qBYure@r-n2d59^E~voH$X(D392;~SJp5d zbWJ0c7n-~v<2?N^G8-P=kztzg*QsD#hS3j@CZ-jprt6uqJkoIm{>q$lm7%J#4C#1e zVGtjjGiyVRitM`78d6WY9BW9a(5?ZaTTsL}5%xwY=Ia46p%8EzfXmG&rCs%)q%4(w zh7DjQgiOaJ*GSfuX~AuF!7P(NSPo|FZTLu~LcP(zWHLEcUa820I~+x6ZF`J? zafVTnLTmFKI3vR^)`b22ee}Bfc0--C!pP}(FWQfY)y9qsuA z+_-iHfpy*pq6V1nV>lS#&2PPi(D&eZ9x|cen@*#V_YZtm8RVuY#F#9BqzQAv8EuT@=b?ntEU&;3Z$LQg^m=1Qc+BkPf$={-jc*$R>u>F1cr$c6S!j z4+B>c1$^d}S8(ydx8X5DcambE=3AOtabV>gdSzJ%oN-s8<_(a1x+rgAaWYK~sTG7) zAZh)^q%uL6ndc~r!!j~WM{V&32IFv?%Q3$Ftyl3E{=F~al`sDQzWUW)#@t-pHeC!Q z>FncAVDrXR#FN-S5K>q0mc-8fD@K7n^M z8lgK*tGrw5&N>tCgiTpXg!$(33MSqCqr|`a5K8HQerH}rXG$Rqf+DN1i@7)u=y0vx zd*l&orJ$s!P@=Tb&`M(Qi6;*|aMA?$>Tmuoe)I>v2N%En8kCgSi!*crZnSQR8HS`K zwR4Y|<3dXdKNJdGhSZ>;lxbIHs`&1nbtBI856T5Zo<;ZL%#J++fycl(!z7jH#=_!; z#%A^qoDkNQyMB0R)Vx}%I3^i+7E15)$NDCR#y+dM(8M_6;=awu;HcC`5s07!WRq z8VDp)8gZteEoCm?1fLVesl+f5?z8!v;B#Z$lF7mgZkP)9_niMr+Ptn53gID60o?QO z*b`47s@3rTwLnV0;ajg`V`F1xXF8vN%B%?^V6wYZNNc-ua4{a51ult|MQjYiW@!lD3)P)L%@ zagFn4Uiq-CG%@o7#4>cG(r82>NMs+Mz-y*j>5i6+Q|%{0G8{mO%!$vKKxInnJd-+z zed;O4-{U*+bcv^2UIa=ite!vbewIxpNbRU{*lMFTH|Ji%52M17SZgdie$MGWj7Fp4 zH4ha~xc&7#|EU-8i(mUTe)P+qLKH>F6wr+YRvICc)<~qnBrRUQQxCzxusNJS7K||X zoDg^n!$i7937|2iB7@AaQzCQ7Wm006LhXUtz^YRf@sLW{3d8=+COV6&&`Lsy3}>D= zk1JQMz-L7R?*OJxw<$bIWb3jvbPhXkGMPNL3R#{N*U?(zbLSqx-YCYFmPn*2*?r$L zK}TyWg$$B$KrqQzY5gP!gq=-O!uNW6u3Rtk zob^ojLPLsTP@&MQuaf240kpmY^FyojZ^f)McAbEqvW+H8kgA#FJ2vHUUV_Yn7c#p}x18Sjy= zsOP!YKgxF{BE0azd1R?X6q#}`6$;y<1R-bW#i+%DTWHNK0$O8!X$6_c(CV0jzt!#_$r7YVg6_^Xv}LJinCvr*qEeu( zR)Rtnc&%@R`Z(;GV$M0Jvii-2E#QHPO zL%T+owj;qtWT(BdT5>xD7M^$toll%|Dr05wbCC%MAzUVE2;_Gj@QE?kK+twZUTZTM zHMsC?xA}8Q6futeJ8$6eANfz9L#v$*Wa;e#*} zT;SxEfk9GLCjaOTvd&5~*NW)OEv`XGVGkRVsfAGuVH7zfE)Xh2e!!6VwL0GHi;;m^ ze2>61$FR2#r8NeB9_Hymx$LZq2MnhJQ_@S?{_1_g5{ZEsu!=bmdyOM9(zj&Z%w zM6J;@x)PirsyDzH$J+WStgNh?#$g_72zc(5FX3TC8y*@u8BO7Pd1+aJ8m!C0!nvo6 zn$*-*t}QH~ZZpvXIN_8Yf}RT4DC2NS9$Mo2fsZW9W;>s1T^agdoI}PF$nnT}mly9b zyml2Lo)p;RWbBFr9{8oHsG`hbLEuREoO`(P-es(wI&&oOFW)qUH^ImTs6|d_cj{n7hMVvE;EQQE2Ool!9 zVTi@GQ+5bJLrGx-amwqMvBHTEawij$# zYZXeNbM{d{DTJ+drQx-B?rE%jsxYa`L}qZJTjHLF|BRQKAxF(f9VMxh@y7dm7;SF4 z|86fYqrSWh-}4dFYIyTs{R=l`CzLWGB{^P8d}hWAOvy$bfw93o4_DrM=SYFqpX_^@yK#zO@>l{h1Zp;;6?TMM=KDF%yorp1I3w(BUU$|_jDX#(4MTsl!$RktfBEAT zc$ET{9)A*EtqA~VEU#kR?^Ob;$>PYVkOfh#;&leCD;clK#4Q8v?G|J%AYKVCjAQq$ zH{ki6vpvtDiShOp;=LWy@TxW3@0Rgi0BAPrh{DrFrr>$5X+}~y8qFQU<0w46az3dN z@@~IAlw(;LUT!*>Ac&%BAOVcPbu3&^9A&^Szxr)_`i1lE^%8}O*iEYj{OzClDFk6L zsRj+a__;6Pzx=B|Yl8q>HqFQ=Tq&)q!y>AnIOR>cB$MEbA?@v8Yt%<;e(4ah0l8s` z*8DP-7v`XpLR5115K7qVA&Uv~l9f&V|IF$k6XRfvV=@|G*zXm9iVd>cJG;0BP?^S%s{Kd)i^ofCgC?+BuF z6X!w9@f`gTgq{M^DljGSFNW85Al2Q?T9x}14#Y&`?ByF5IP5_B7_4!{^PF)@}njKL$0 zOk{5Ozhw$RCN{-84vpC?e9S=g=V`A&ks>=bqxF@B|3BSW_Us=JpI&@kWyJ# zLOQ)(4PQ zq^@D4J7HyArH~LJgXc5XJpCh#cXs<7#CatfAkRbG>teFA?Ml7;CMMlIh+elMcG7w5 z9Ogc8&TW9vaEQ^>l7CYWPAyb@mmig;!Ya9e3eFf(rNJzVI~KAc-b0j@vT9v9eAqG0 zG%;3mkn^u?bYaWNXExJF;sZhUC_?7SO%!Q2syS<1vrJub#QE7v0!nFkK?t3ukXmDq z2-G|_8x&y-$z+7du#dV&2z1f>)Jh|X#}KJ;PN=o#P;1SB7{jo;cR&xh+}OqsYKz`A${ zrQtC8_NY zXvS?)y1?`_0G1hiQ%O-;yf#q9anVI(42e|Wtl;?Gd!Uqm}b6^n_iLlcaQXd<@O(q8uLNDKz=;*Y z?3`iH-36DieIAvvPHft?-RxD_DFu_7IGKZx7`7ll^dJ<*9{(O3h=-}A=Va>jy zKDcN8xQ$D|Z~pSXHW?=4@WT*KJpMQ?UA>MV3_)RpM!SPFNsz=7^t*eOT4z2Vwxzq&)5w%n{19H116o{5XQ{u?1e{ z0UN*aOYrM0cM;+=a}Ke9?T(`yIC+KHprNgv!`(*y>VKwF%{@tGrazs5!Lq4eXK8xN zjQ5@ns64n=s9c3|KQGw@N!(rF)w)b2S5C(9eh-;Y=>^Mdh{K?Uys34o@lKItSU+_J ziz{n*@9j4bkA@~_EA1d3&Nv2f3T|m=dS&cyKF?a-pGDnM9qKuSN;u@4JH6^ z_5F8nx#K#Aq~tQW^mxJTey|RT`<(=*9}3?}Lb;+3FZKk0i$a z?vA@hj4=oy4?uqkK%APUVH5;LT!->0MuNwE^maELY?F%&FqNsW4=1(2CQ z^T_aZCuxSocGHRN=j0GOjX2WdL&p)op#fKSJVA0NTyCn3z^7@HG6f_(p2a!pWaHBQBr-+3QJO()87R- zRWkgvFP+0B_mm;f;dMm09A}K#Ycmyasen9;yM;o(yNhPC1JCpD?597At&MB=;Nshb zH%y5Zr<6vbq|2OgOg*=KmqNnh9RK21eiNtG*X%%m#9~uodoTgC(RDp@>LkK2M4G1X zJP*B8fhfa5t*QxaMp%n)kO+z1IIHyP@}q_^!&w#St%Jco|0h3(U;D*h!0FRx@P*HR z5pQ4kHZFhgE~|z7b+5QhaiK1tUr5^#>SEV#D3_ z1GHLm5K_PkLI>X&?OvKXs^H8%0U#C%q?J`(E3SK{N}UL;A+>RUQE`GWGzX2A3Q@gv zpb98g5764UVyK+ME1h_g&pr57OiEf6yz-0X!x|uQT2q)JI>C8p|q z?ZjLTmTXm&R!j#BIy7eAebMjiALx*uYomXf4@O9dd(}tL(gYv?RonPG{89&uA689`r0?}xmRAni(mX+cv|7|2k&Ck@51vq8m$h(TEmE}GY%;Q&YpV)qrm{X zyW8Nyp>0SiAYuqWh=mETnWceo&%@G*GwAQ{LQf`;Sz;#G?Db^CE2G%t8nguNF+do# zIFYM^S?J0&@@7QY9F75ua|t+ey1G%VZodyRn5|MSiGhWcv}G}@ubn7S*%X#n*4<}y zdc^eL18;fSlL*+ju>sEc@daK+C=~j0fSii#l%Oh$w5*#7hvpomNWX(HPnF1HrgCIH z`^{Xy&`N{6677fG|B^+Cvg(+IW*XuA0-}Y5N+#G`T0vuJ#XV2TtZ2&9(W7pDW^m3N zl&)Nm1MXF)ThIE7o{jOA84%Oj4f!SUI74iMRF)>_?%c%M=}#CJ-@GB~N?99R^Y3$u zH6V0RLAcRi&Yf6zJ~SYND2)LtNLRg09VQjM5CtJJoH~65LI}6%8qF3O%@zQSB%a__ z18k{~$fN`ZL#`fJdgL^eFut+X(#tRT)X@}JkGJVbpvas z9!0y=Mm?&d-`mH=wM+1P4*UkrLS&AR}(|-=j>!%)Q;2jSKs5e`7%>yS-tz$Tx9ADt=r2>Ih zgb-CqZ;s^*Dq)L61T7V^Bz12n#&IQ-YpAJiT?uc#Ypx|#xW-Bfqxo>|8Eb;5Y^kp> zf9{#mR5Jle79-E4GKw+gGF`28#m4@QE{!f{?M0ANx*8|%<%l_`PkeabJ*?S8M2G?p z3>pFRF&f9HMUk8S>TX`gK@^po(26-&%!sK{8d1Pq^QNCpKty=unNOlVw}|&Xyo6Xt z%QdyCT~c8_@@%t~Az*ALkf_yLs5e`H*6@Ab{@virCr_Nl`q~MTHCyP$QTf!- zpd7<|P}VJi!(#@b+S}X3ufG2-gpxS9x{TF@dFPD=Fhd6GC?>&W;0;`SX^F)5E*=J z7zIiSWKx1r(Wfw&D=(Dqrq_Ye5K>@ub=?T5+iAYVm34?rKnjVd7CNOf-}miQp+=S_ z7>|Yk2x*$)PyE?G?*^+LJ@*XGo_o|?$9SxdO_b=Uk6NQ@rYR**tJRJXNh`b8g76-G_XNN*C za)S3XBk*QI*$qkPZ{Nfu2+&?$GoEp2T9Fwv_B|=q*H7a5)ywcWhnCu9MAcN>{NCEi zGESX7gBPBD62JZ{{|{E$3~}bcuZ8GzR;>_^IV8?J`WTefh{t1>>AA+ISKU5JtBTJX zv--DWgOTTXki58Oepq}g&VWDowO_~XjVs3f$W{fJG;m37WfX9R-TfYR_IjvC0hZ?4 zIRD(I!L-0=FoYste(8jD4`z7l_18e0LtA>?^=nt0W3N&gVHhCf44+tvusz6-NQG2t zFp_9ATOek#&SAfYEGx#P3(Kb}p0A`t&OfNt>Zmp9b{K_FtJlFf!{X{XIt$D0Fv{}r-JH4i};=VE0w3#JmP*P#-xlh^Bs0ixyg+-@ERu1gB*ho1jYbo5PR0kX=W*<>$ zY#KYosVMNh|NejM@G>HT%rgA(ANfIOvYyU`)4 zwuO%B!TZ6ez|ge@G6i_djN}fsH!)sbseI0|kD2EOIP=)!*xlT4rL0m4Qjr}tQ#g70 z4765gwc3Ezn8Y!@^!@*iy*A1jCyF!|M>1F=KsF%c?@8d?vw^{2r9_0y>sO4?A`G;) zx48k&H`(06@;c_1)_^d=#n-+Gfbh-V_$BmuJ?!o7m@(WS#D^bzh+K#-*R{>3ybNRq zfEk>65+}H_v5mJr_(gpFbDzV@FTITI&6~J<`8_-JWyXSYxJ1azupAgO!cJNnc}=B| zCJJpIAfKV$Y$EpR==BEZ4F+J0q24qa3cmGD)XHc)%q=b>%@z5y#?s2VTg%gfB~e&& zd#4QbB$iJc)tktY7#o+~bK1!s_bgjRqx13~!`kVy-!Z}UfdpP|1wjBKI+CRcvMK7; zL5JDd8Shk3v=&XJ!_@UawbPaWuKho6M@yYf_iH*7q;v)w4#@ z4tdVua0xjr)toHvaRx3^yz|YkV{Ty?6|=q4S`tEFVR;RWT8QO^1=Jf2)anh_hAj^D z0tc2-R2nz=C19MF&Hk)W=Ew!#cw)J$AWZE1bk1EhuWN)|@<5zlXFm+_FMsZD!RH*E zxdp7BehkfK2k%_GfXVJQM3#a30Ynm82WU}z7Mlg9R$7uV2A>gXwHm(lt=IADH(tfb z6DRTFi!b8E&z{74@4SW08<*g54?bfcFSOaN!ouoFWFmv_2WYlB@WKdE2>5=0E0;e+ z1dYa02lF)#Tl+nX1wc%@rdfM&1q+>y$%1W`YedaOMc^s_;#oXFcQh~)X#n=OZa7Gf z5ySlQ8vM>2`biANxw~GBb7-kB84mCt{rG==+X>1)3cRJjt8Xi3b%aeV#8mSQs4Xp{ zwrFPeqlJYEM{E64pT^qrpLWmAl1T+$(;5(QTxoV4xp7#g$$1`l7-H+qZ$T@GXa4k0 zLWvYgWO($8e=0XZD6r{SuXBRgi6vJdRIPe~^QfM~oxJUkX1!r_wNI45GHQDaP zE``c5duk}-z+p@Ips%jH=d7laRtk~`2>_pQ410UU^Od%ZHHPlaCTh(V$P0|xn6-D$ z^#t-YnSV?#9|N~s)*F}KFWeWj#?Iz-EUuow!pb@r=h(RPF1Y8TJg%DSdpJGjobA8} zP-Y?wrL51mKQJgEAT+SQyN%6_>p1ht^LX;fXAw_Ec;n(lbW#J84F^5MldRA@M$v#a z^gs=vH9R7aHreR*&NhDOt6#

9aVqwu+a&@croS?!d1#tfMqA8ul^lbwR|CW*K_@ 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%0AfV*C%T&Ag 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

|y3R}0{K-m)i zYcRo#ELz>d`ztuK&_-vbi{t)5lN)RjL`6g>bxYt)FHF*zM`^_CvouP9va;)78GE~X zD9RGEGqY&5TMfM#WzPg#zvEIWE-uJ3XT%d(d9Q|Su|dSyXgkhU;AX5bCtW>r^Fy}Q z-dDBFH^0*!%n2T;bLcIvVs3o{&RSe~=D7$Lbp@}p0{nHp=4HBHNNC7AYI_&A$lxGVoK zLU1NSx7t(j`k*qa>Kdl1pqxWx8CtpVbg)TU6eQk-qH7!fKb3t+lO@S<-scgS?^Shm z_jGr4Pxma{GlO-oF9bnhK!5~5&Ojiki*%9c$cv6TOJ^M=6HR8i>8D7Pi4-W11Vquq zRTM!&Gd-BCm#TVOW=6OU;qKv)@6`YrGZ-+1THec->EZtQx3n5QT&<9h65 zv7+(Dvn86})Dhr}?1LE(?dr44Xr>C^^?D53EM2)m zj^3Gk{x}?qd)+)xa$bP@E@HJw2%#^@&Z-K_PN9Zt=(>ov-hPPn>IqisH6k4W#0ZN! z;IIbs08WgK1BUg4VMwx2++vt^?X_hx3AEjMGnj7HJ%D`_<1P1~P}HqJ$d`7RgeC6S|`#p>PFkKllKf z58k)J1dtW0#FtYZ>;Z6`*`J-9QJ>TDP#F`@`!??{{HD^q$7|0>B>blu$?YNKUl7~D z;q0jt+7GaK^gh_7Uj&02X2mdX@2;~4JL=i?N5CcJWaU! zxi5fIk|=gGBQG1Tv%&`2Zgz_(!U{4DF-2-(dm7j(wAfYGi|d&fI;A0@Tf{Qv=VH<$ z%7&IYHg9bYOnWvJtVc{^vXtf!sdm|Lky%`Y!sHW$_lCpDpU;!H{0+H`$EFk`O9LjV zU(*At+BxywWX6uK3+FRpBum$99r7jKjXP|HEuOt`v#9qDfQ4Nbk#fe3YXhEM^kD9d zHW(MB5I=nQ7A{sRoIQRj6g42y(gX^O9+_`~agNxZBc-e8_`G25lf*lX3CrWI1~t2> zXi~_EfMMJ^({-5X73XRRsVolWWY=(!fSsuHwEnHvYn)$P;P&aMQ8j}z^$BMB#7?$W zjh4FB1g93yLX@VKvy0iu$A_7rGz+ftg)tEA5zw{BW{C+;DdXh!9h}_0gPamZam-4? z4(K|Nk4TqaHSBf(1GheM8_&M@Jf3~w1-$a?ke9(+L_q?qS4-ue zm(ix*vc=R`aiSxhx-=J8= zno8^HjsNUl*^n}V;l_;U$KiuTR?-_pGP@dfPVGc{6A3eL^VQEFk0Wlq`e~6*j%72w zE6XifE|I1QgZEaD(_H;{eaLE>*p?Okh4~KGFUn}vhnWEqY6^;y+ZEnuIJF+FcHG>o|Osn1~)j5_Cx<6Ec5)7a9GMEr36{(Crk|2^b1;gi4kwK5{b4(EUO zHwgM3^S&Z%5aRnF&`+36$3KrmFve~#O_xBW3(pzPeBxE)DV5GPO{Qo|!(c@#r-U?) zc>bjac<}L$;?DEW;kgGdVz=GdQZDCQmMUE^6ZD!A7#h9K{(TslR9RmoJ>OShjWn@z zJp0g)KWa$~RS=zb?STU-^Z`sj;*35-Y%d0!Tz9Unn#fJixjjIHhlB*i8{{L(TPA7S9Nu}9N4Op=35sx1| z#?|X5xO#F;sD_nb&(4`Gbj9bQvm&d`MB+%+V7t7(W|((hz8kR=h+)7-zW7DF`4@kV zv zpjoH=v-}JWW3$vO{$dDnLKD`z-2w6Eeiwh`^jSGrZsYj$b_rh;fIp8zThN#h3TRBCFf$@G~}cM3^+}= z_OVYCU@PbHfDJplXVR3Aaw;~7FTaErUU`7$UwTk16y*>YhrvkYL}W?B2GK}%7n^B! zTNCt6S*(p;28q#ja53-9m6OiS!`AMN7;H+@F_c{Q*^mIBo(iH?3xw_{0?62HM=bbi z2{_aOL;;h;8wJ`ISLz|IumO1(CKrA#Byds>0FCw8Tx`+xor#=mF(mO_?4fCH_bZ1C z`Dn)LWtS@KSv6XK7ySZvWwEWX_ZO=Rtk)YneE1Mu7X=n6bjvG815S>1U=HZxgb$vc z;QGl9eV4H45?Yi0&w&Iutng z#V>;eC!fXyUaHT9de+n>XinOMk^N4~xnpl4&!8Bvx>)1v=>_gQdx{Wya~p)?MzeSm zcW`-8Y2do?&0a|1KMXo354MaYxj|wK$kT|g{?mVkqaXZmPkMUUKT2wU;pGRocmFx)TLX6@d ze*h28V_E#&{p{z#dBl~|(#3OgxJ*bhG&J@-LX7ykAN>%ENG2&>OQ5JRDpJ0*>(*jB z<&qSkod|yzC)i?|e|A@Y{iT;d0B(N#lh|!`hBvG8Sd2w2mC}UgA3VVQkCkHk+=KgI zE|Y{7+IGR{#@2=fBIf8_*rVGug~G8IiV1l}*9A;dRdun^^Xig~W*w$60?pfi5dzP6 zn)1N9`^IxPx7&=At|Co05DAz-SoG)n7oVtwbx6Hh^I;q|)CHh%G_B~D_kVP}kOi~c zQ;{4C12fk!x1*VT?a*gqovjpk1ZpMF%$U-MH{X93o3jgi@Z>RiA}sm^h&0!Z8|kkv zMqLLycl%saWsD5M)uS_Kl&* zFBnnwiem5@%t{1|ql7z<()G&yp!bxeU+d3{%1`YGVhs4;{YU7#9w%2%(D%I^0_8On z-{Ov_Y)qq2b8=&Y=I;8SX|Sl`-CjqO62`BFTG;Wfi3x_gx#>i{g1wk2OoU}FTV0JUVP;x zWX{;F2ZTt)AJ=>Ws2Ou>r&}>o|38ui9XxvUwB~t%@vr~Yzr(fbSLFLEOhI01@8l-hC@7Iw*F2>x*kv8fLkM{L?YFU7t#NU2 zj$SNXnSn*$;n|y~@D48x&6jFpmm4-!fwl-EVmuanw9*ZI%^^375M9N@$LN;tBTzKU zOwZ&XExLignnpv_h$nPnbS{*zCg!NQdD%>Z{2}fq>?x0U^5ikPuE*`uQzTAK;?3xi z1PcO$pm9G9udjS<8j>s{-1f5}*Gsx^7YsA@O9JhP(vI>7uLl5|DcLgUh9p9y@xu|>Lz#BW zyjN@$3Sj_uUi}QxG~v#xpDBT&M2%1D=rx-Mb2dz3z~G6ySa=Wmk%faS7B&cIu5zJ=Ye#d@h^>k%A8AYsY33RnD9#Ohz&WE|Mv>4}fy7)IOCWH7;aw~p>D?D!z~}z~@chdUaPR($ z2r*!{*@6V8(eYDn2o*nO2vCL1j2T`DMeL2 z^Wbb8E$l%;C}S5e4Z>2DblIAqASV2oo0#lcAS%I~XutRt3KAKnt6S@76wAa=C$TI! zZe;m;C4Y?ckk{hj(DB}->Q=eCq*KIoE6 zbZ_1qv&WPmUB0|;RgH$(q!8xsVYX#$a2m6VFXp}FnnAzrYdK}yeerqRe(qk0F&_r_La&;9xDz(U zN}K6~^V@JWXWUIVQJocH$Dah@L!G^n1X5l(y@M;aPK|U=#CYZ-9~Vm3u8tdZ76yf4 z@A%|z{~9lR?h80tE*ozHEwpX-Sc<@u5{7Zam@;;9_~^9>M96d)4v1=f*L8?}-||6u zCWJ^6uAJV%(al>px_Jx7w@#aAl+wxPW+Hjvm6!0s%P--<$3KdD_g^SVK}Q>-C>+8f$&7W9+&^X-6Dl@Ju`Iz< zeyoRi?8*(2ri5-8Z4stZ0z2ug;_1HVRxWiAE6f3$j;hUNv$$eh=47G2u9GAW{k}ln ztlTv@RQ*1R+OaiZFX5O)qB<9t@Jv8AhZy?4!}<9IHk&nm`qQ5lbMsCVowEfKW@{e` zgsA-ETx7XV&M)wEbx}MLx*qpVPwV}YD+HrHA5T{2c;@O=JahFL-g}aO@KYe)1;q`B zj{sWMWvTGL$xiGZOxLkKdxFK4&iQgwM>XZ@?shv#5P|bLu8j-LAk{)atclL%Hl~am zmsd%l%FERpXPPEFe)Je!*ZJjIZt)Z4O$wOYFJjrOdLWG3o2pq>a5kgk*wt=k98&oK zpCDl0cPT*KB48S`ke6XEKIjl8Yzt=0VmLhbPkT!OT;gh$#!_sa``j0hrxEu)`vp_J zDW~ufZ7)KM*gk%Q?c+zdc<)^dXHN_>{kV7=)9=$NS3L_dO4w!_qYWJeHZc8TZMt}@ZsB1 z%*(xopwq96_r#*ok^@e-!%D@}Vq74m3V9HKF-`dUcYbOY?e5J}9Q6x4zBtD)P1ubC z0ugrOfV;O&apT%moL#IC`*+G5LTAY7889CsV2w0ABQV+)u}h$^L7sr4p$W#_P^R@D< z!wp@q)1!1bv1Yg#Rx78bYz#RuLa(-b)s<=*llg;c_iY=Vq8&KID&gd1tnj885tiU({Bmh>zo74`&F6or?^YZ6+Ps^HnHh^W1FMHF>~ikg0hH%gk;z zrE-(2{bSb!vGT*ri>2-y@>s5O>_cP4sU7;90-ObE0M*05%yF#eJU_uN}3Vu`5dcHvip$m>01G&XWeT@nFBWdU&W2WtEW8}<>rH!q|4J{WhhbPwGkT6R|K zqVd`?*lm#+-7<(eiLB!wqQ;fVO99CYNw|)^2R8aSjrjC${bTff=csI#NAh&bBfR(L ze~Q>I@b>@wVNnH%Ne*IH|M%=kQWi%}3F9*Rn1Uy3nDEgg(aNXoeZ( zXSNJGzIm(Q@c~F_#Qk6XRzp`~=O3}#?aDIq^>1ObTH~9)`382It?_6#t8Lw~E@J(x zb)n#jga#!N756Q2H=f@+_z_lVX5^p=Ep(b4rpD(gX2`h~T^(n0X4~912PN--DR;EtWZRBi3(L*e+HZ8F_HVAv(WvC-tGfq}k{_{rbDi81YPes*5vuH*y+F8Q~xdvbO6 zLe0Z7cQkqKle{)^(@c!PEIfH;tfc=w4#hi{8nZ5TJAjgU(!}tv_!~nHYAKb{=VkRk>JK5&bO`7OdOhT{8&TQKMpyFnB%1aV) z7G+U|7kpPxisCdT^ovlK5bA8??%~*&TL&R#>qc6*h+Po#WVWrPhLh{-q3X;sOK7d2 zeV#_}tgY}SGMh)myWxYs_+Q1XOR(8)d4xku*m5eC#S@|MchfW?i7iXuOYGIdMt}S8w0Jjc4!T`m=X&e0rydPMji;9shH&SYR9neDg=LSAP_H&0w5Z$t|xPOQ0hXWQkuvXDP(%sdhj*rHgbQ&MJ%4Hj_IN@ zV7k0TDEBkZJSs3NMk$pguy%$a1camZx}-6qKPoP0!QJ0QT@`Hl zi!oxgy1>Q71y-vSE-qGPG#=fA7h^CtH@#PLE(<~}p8nAB%R7Zxvd}ygwo%K@GRD{I zJvU}Ih{(mLHw+7BDxW4@nb;LOo&~qmXFGHoKeb1z+|?fR4)8DlyM`a zBGdJ00)Bg%Q(K{g zHC5_p`fxK^C(Lp*3TqsrZ63%S|(05>>IBd(s_!IfLLMM_-?EeTDm zcp=oETrQXBVvq0t{_mn+Eb)8)^)EyUo^vl z!wg5%#o;()vm^9B)b$Z(XXm&$U*WwE-a(#9aVzjas91NbKT|qHxO-c7GbP}1ZsXvM zdF)zC;YnjzVy2YqW}Cb*Q2i`wF{UQX+)|B05cYuDh8B-vU2 zf6E{y*(H=inw&SYn>g%!v%sENb_nuX685>@{T7)?hNim+sm1v<&nZcaRxSeo#n|YB*(yHE*ME{3zTcQ{{~07AVFupJCV9tZ-&w*>GdJbLci|OmuSl z;AU>Q>N+_Vui?_oKYsKS<22x{x85?DZlH*`Xd$mOu|2PqMir_VxO9yQ6Zz*=J2_pL zD_mo4Xo9C?l{gbO1-2T|)B>C)28DJaQp`Lcn`p`w=`zV^;;;9J!Q4xOTIa1o1(UvU;c2{8~4p}^SeOtN*%0Y#ku`2S#ea)QH};loBU z6{Y(yuJ6xhF%!B7jFm@wbb5;Ajhk59xP{}>J7pm;^VRjxL5LCm;}8Ekmdho6@crLI zh_NIPa4ED0UyB3zRWx99Jz0!RV>W`g7L0Pu1b5YKbe?b9sfmN}%On3emWMkS&BmOt zv_m4e1z4M2;i*cEWL@4%2<0GW*Etyh-alO2iWPLx*F};sw7f<&pE1AxJx05CB=f2{ za;XAs*Xn5Q@1XQ~WeaasSYl9LbXHLVj78=b6O(h>q?SM+P43LzkIuC|u0_y+S| z=9!UC`!`!oH?@|gGj&MgPeCvkM040IzY!`tDbIl}d5Ji^grH5Dc=* ziH#8!q*G>QbVWgwYfCN{I>?ye-RkEuLbHNm_dsyPVN7vG#e%JLHwu)y>B#?HXPOcm zm(xzbSWK)#D4m)IDvc;!o9!o$D*>xKil6Ay;}A0rvK08o~EEc#HjTUm77 z`ot%(IlsV>(7c9eXHh|%MzD)rUn~}gG2*}ex8KK=qa}XygFnEc?{OsRwxi?YhHavY zn?qo-QK@t(#V{|8s1T0xuQl$h-26UJa!x5uQ^~|4?3=8B>IOVHL4y`(J%lyBM-T34 z%r+(2PQYC9&^&-yU7~Eu+$NS3Wt@zHLVYWLvlPAALel?hJ>1!GmbT5(OC zLcv8k9cBwcU0f=CO4&%-G=+{#oy20)q(#RdAI18U!aUwuQ9UPIPZP^k`oABhymG)8O*;jS8gWl`+PLScu@lBMGG;sWNme<8VkKFC!g`w@^X{Q!%`)V zN|o(q>_erd=~$Us^N^xpAMwhUzKFN}>aXmyTO?c=eA%F!<1g8umkoM%uL+U?Ccyd#>T^fx`1()&_~zopk*BCD2><# zUosbkDLGtTWwLA&z=0*RZ>&I7G~oHZCdrnuy%YYpGn^@tE8BaH?$GsEFa?DhYK)OD z#@3+iF|=T?(lkmEaOS!&6LTSi0$ccxYZ@jo&u6!+3{_hoMckHdsM|C<1au20aE3~j zJD~7rr^L3%nuEi8wZ_F=oB7ElT`~FbkYF9DSFD*3!e=`vHlkT>p>lZrtx$`-blam~ zLb{E2O07!+GKs(`0Xa+VefflWxt!sB)ONJYIQ`_Okj4?yP^nzY8#fLbm=D_>w!;>` z`di<{ZnMR&{>FFlAO6k1#b5r}p8;STNue#YGIG>DAH9uBUB|T3*zRI8wNB#N#R4_x zHL~>H`F>`;ZSrBJnQbJqgRfbb%7Z8Og^pI0txz#v#qsrXid~@ z~)F$u(i#;cpMbbNx3FEZ7`#lLS+^xBe=MA zZeWXwiB@I-H|}d>ioZ_m^7UFZ zZtO%%Bb_|U&t_t0eG9|xL#*_)8Z9CBxFlPYJygadMK}aS3Opv9(Dkt}h2%i*^kmhn zsFvN}BS~D*Bf`;k!fqL5(+ulWKnHvj1PC|RDe00Mt|-Zvi`n-&3Jrx;p2*I<%G}+% zAR{iU)7e92HIPm{fm5;>sL9rvE8b||P{v|%4w$|V!lV7AU;9<;)?0k@H(xKVUfV5* zfX#Y!Xb824B&N&r+p57yzEplnTq$5K?zCd{p_+YY0aBrY(qr^mhuS6~c689oHD|G- z?Al^neQ&9lK&z{q#GkW|U(wIfZ_@p19CH=f2v$0#Y#tu55157tv5Sb&@lBnluNdq# zhDthKS|_M%2i6qjIUH5H^Ds+u@cd?VtEr1Ka`@){=c^LhEFDiusd8Z*o1*pA+0zW24B?97C)JaDg5G#9&OUoKj^cIq7gtx%y>D<@KiW z>eyC3n_!*{zWdIp_#AE7x8j93ArfS z7|(wC^T^YHyPx^INrLBwGQQB}l<<{reFMAA2Cu#GZA?=te;dI1Vzuvo>XMv2XFd`& zUG4#%(ZN+;wFZ=%HY*9-!9u~Ij!Jb&>Y0#bX({(aS97SU;kXjc*)qRWVbmzm8p=>W zh-&7p5Q7|^J%QWfzi%Iil(|lF_*-LZV?QdR+AFFzmyP9q3#|UgP80nKk|BG zh)8)vn@Q&Gmjf5R!KJA+O{ZB_+r073k`a@I8>~;zX0^gU`R(7v#o5`OTbPPLG}mxW z)%4E?{QYGwlN=L3rxTbJqSDR0Co)kBnJAk;G1=W_Du*(PYAmI~UNQGD$IT{CxnTt9X(@4&PG`cynGDUxaF^^Y`3r_xEO zW#ploZ=Noog!y4J*;Z6JhS{BZc2ICturat%5DnWME}ov%n=l{FTTkNvFyr1AzKk>s zxcB)lmJ?Crz|(Hmh!ymAr!?Uk-+LXLfvg3Z{G1Th3G-D#To5?oGE_1IeWw}w*q%32Z_PQjXqV%KKTHjm|Imb{z6E+9*YD$^8^}s+%*GK80z>3HYg))Nm8!4u zG;tG>5D3POs&%&*9;vT);oy=xFy;64Mfpb1+7oI7kmH93%eP|@RiGYilG#gENM8i4Q$$=Tp5QEwZJ68=El%OPb0ncmnhN#z!Z(6nc#e}*2 z0LCF1(C^9G^WZvPXgOs(_vNo3j{~0n@-HHd1IF#v3T*>ZNY|XwgkS#N>ln5>eB*ns zV;Uz*&DgHjl@&xf8ihLcq0M~ay~tX238@DWk3F7~nwj{88)q)~tsH_eibY}{8iqop z^0nPG%MGHocOle;gdWn(;uRSw^Lrn+O8Ghp}-bfn{G z`=?Cw;9Rrd)NjhjsLM$6U*0XP-WM}@>w?$>rxmefgM6*x9d`>SmoEku^<$$*6c*@ zfXL4M4IB&-Q-yF#r>qc5mLwHr7U@AY<(lJWH=y!nIV*<4SYjc&CT<}EACj4ct`S2m zzFI87#UR?o-vy(c@b&NhI)=>_zx=(|k<*0TW(Nddw^?JiE#^Ub zhv|DK=~!$*ID04?(sChj`P zA8(hC#Yr`^KxW?6k3&T|2vdR2VD2N#QtCyS#BR-4S=yj#3QV*9f-0Yb069E4n{Zf0gr ztuifkp_spubcw=W9)_tDL)XPqtngf#*c6!xF|_J7pzjyb9mD0 zR1DP9$c-tErwD~u%+OiM?8+Y%kwl2C=cmP3cZ6w|WRb$4uHeuqW6vk_>g_xD=y%@0 zwY&EKBJ5TdMKZhH9>i#e-44IfA`Bhf7tv za8<6jR;J-}(_GL|lrswW8#necpUVT-jZ&(Ta|i1}urXdKLl)#Hd{ml=AmAjG^Qb+Z zcMf5n(W0G{a=Am`np-BzxH9JDMy2NS`|Kf|F$SQPihJp?wAY#Gzh^y+W5K@Ri19H7 z^ou3_==*$)$yX$1fc%t5q2 zqI+qj2nf`!mF2)v-&Z}b6o0qFn_<+Z5^RucdaOmdCWLrMgW0L$nHs*Wr_*UhS(-AI zM;*p78U4^qkEUEPS5W(Vq%KTTM&2bWa-H{4=6Zkzb1WozA99ub;EHL+aw(z_ z;f`0jaw)1R-Vml!aL|~=0im}0o%l_t89Fuak9YAaZ?xMi88Kr||ISX!96b?V3Qrso zrbTp~qow#|k=h2qenXfu9bDY8(|g-X%G@|Fl}X=YwZBtwVa^%kw%hYG-7-eQ3XuBL zny<4{q@|fz)ShY$rK3uYT1Yas$4K~-Klu@M>usUQb+P5RaE1T?1z|}~1x z{Ths!!k4g9=m6H_?m@+P?K$kE8*~zV&wo`+GRDetjsg#<+YNqqe@pR21LnG=!lECzNp4x zA1qfgO&M2?jzn3On`gEeAQ?`w-?CpowSY4NJf*Tc7SE70F0f}8IqU}Pwrjlh#&@vW?(o{{-$t4ehG7RVuzGsou%vpAcVZUg z7fcj`7}!+&X>rtp?PmqJFZgr^M~3^s)>hZ zGz2*ys3Rbi@h44Lc#okO$BiDF>)O8@a4bB_>is$mt?u7L28APD4YO4}OD~=t401c%iaDR47d8O}+vivV9~t{y8d+7|T;v<7H-H zqwJG|=clYQ-^s2JD=R|}j~YvlCdd&&Kb)pq8W$bW>)y(_uw^&d)Q2-0eYBidq+Ocg9%F^Hdi_|n0FlDoJ$z&9+N}hifKqD z>KaEWzGE^vV$l=`>p~`Vov6JPX~l2%wGCCkA^0*Eh@~K@GFy~jl{u+i|!tqgk0K+A;BR*iht?I(bTTG&O z8DQ2i8FUjWSK8d)7!Lat({fw5*7y>?t&XuQ3mS%rJVD-OvawF2x;!o25ChS@H_w5c zrA3DzzOfnrNo-~)$gBq_ih zN_j>X)X%N@E3sR+xSje8_0iFo>Zm8`v|JW0V1!V*@hS5joDf1y(bm7%FFTCG1n*Zn z?6Qbis5$U^M=SGgeNpW{ZR~YMG+CFhG+P`|6T6j@9M(=PXA52DQQ)a)4fTpE2VZMM z3CLudEIn2~4dR$aEnUiN8+B62eNMdg!H4|t`bO2xuSqM(8RNAKR?_`7c@(@dv{A4OPSxq^)s1kTa>H_5d&wq+ry z5)CR&7YU01Kr|r%W`?B1+0#EzRe~UO35{?N5I~aBr%Y)LO^H5d>|#PiQ4zu%NePc2 zrGzy@?%ln!s{$NY=7qgWE5e=iX2W=XPALWRAgS=*Ja_df`S*wSIXU?okKolCH~Id- z$1LU~5zHDPN)|yxc;)T)`1z|(IiCuvocX0T^2s>kU60K(-kfGmnA0@yfN)1th=5ib zg5d6qwIYBLj+Ysc;OyxWx|GOCF$Xgz1gbkGLej)kE5p#^?tttV{Q2uKs>*H|4K zGLGZ_whqIvvvRXxd%i`JGHypM?XAd99(}`D3NDG$zQ?8!6=CQ*UV7s?KYjfszASj^qjHJR;3VF3!v0VzC?Ci^` zm^-~HUDvTaeTI1u5lBif43LDxu1N0Py%Y1iP_5GUJ-CA^L)Wq1Y$&DBmIV)}OF>ot e1qhc94*3UC?{Q0@%0-y~0000MvB7KX$9cs&e{}l zQ1|U(hi1mZ@q~$R$O#V-1Y(Yab(txu2+-UShiZn1(4~Y3LjHh0Glb>#X!CD%Ivv&hv3>hDfy!^q3 zq(6=)T#dOF)VJF1a-z=(fcg4JF+*EpvJF^ZoAbJox~>Cpf(PHtzoJ} z2Q@B~~6TIsqD%pe5%oH+~w>$=iP!5nH?2_ay%MS0}nQT_n}x`2y= S1P=HB0000$Sj8Lt;u-M|MhFfmjXgf&rAP+2w*(P)jt7Z4*8b49_xRi^uNpZ}$* z40`bL%ZsY|RLR@VU%M_xx;a;O?()+YpY!|8o){ugAVxveSr3`3S6=7Gho2xKRD>8J zNqXbvSV%Fj*>1Qgm8MSX4FX6L9LHh;;LoLk8Qq~=&Rw;458n}At9_g?7$gx&p2&ft^N|L~k zA^`iP(%p!FI^fP`$aHgJj-+*tIEf^Io}AVVbECO4q{QZIpfn|?Ky9560^O9eA){T9 zM-T2hw=tkDmDTzTH)AtR%)1?>6x5s;g#YH5%S+NPkH6$lI%>vquioR^kKRSy5d<~G z5rPO^l^5Q8i|;;oA2VZ>Gbu*WlX=0+i6U4xTGx~EZ5K5s1wqZ}t#i5EFqgs~hlNc} zB;3d`;ux#-il+8YVGxiYn1jpd^QxX4Rw)AVuR$ILhH<1EkIeJ@zg@?1#DHm<*zfj) z7?}4n>(v?Q*KfXNE(MdwqK4LmX&e}b%(E}v;roXlgZZrs2ryk-pk`dZe3$gw?tu3O zavEEJCx?ZxbpTd5F)sxKj!g+bxVa$);aCc(sco-kaH%8Fy@S!5fYd= z=1$~vQhD^?zAsCqX=4}$FoO^nb7nJ5lv3!mVh*hqLI{|hpr1Ow;BVX_aN@w(Be?(o N002ovPDHLkV1kK-NUZ<> literal 0 HcmV?d00001 diff --git a/1.13/src/main/resources/assets/engineersdecor/textures/block/clinker_brick/clinker_brick_texture3.png b/1.13/src/main/resources/assets/engineersdecor/textures/block/clinker_brick/clinker_brick_texture3.png new file mode 100644 index 0000000000000000000000000000000000000000..cb6f0f794046c8f7b8dc1530e434dda1924d6281 GIT binary patch literal 728 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 VW6X4xaI63T002ovPDHLkV1jWASGWKG literal 0 HcmV?d00001 diff --git a/1.13/src/main/resources/assets/engineersdecor/textures/block/concrete/rebar_concrete_texture0.png b/1.13/src/main/resources/assets/engineersdecor/textures/block/concrete/rebar_concrete_texture0.png new file mode 100644 index 0000000000000000000000000000000000000000..c0157c1ed2b505f64fe0f78a5b07ad5ea969967d GIT binary patch literal 607 zcmV-l0-*hgP)D~L7yaZNLL^F&f&BgRI}oS2uumaX%)M}T3b0#zk}U$2{8LRPZo z8*hy{7nwn3;k|cMh1Y$trl5LoclNiVbrM8~2ucmaPzkJGR0e8h6vCJTNP6q6y>Sy_ zZ!+Q;B#Af=Wc3&pc!vT5CiUtzU>4s*0$hW{f!zHT3&#dQOl98ISdO z5*4A;`ONW%frupYJd4zERmeoE3O8k+Kme&HvW(5^zKL@<1!@gdg91ph61?NyoD+$e zlNsFijr-GcGXx=GBck8pLJ$zaR8TXgHAl@*H8O&+7N*9U6A{QLDw7pSGe=d~b3HN6 z@kT^ZbM`s73R$2km?>37R&q|^=A=Mm(t1NwP!UDds7ijkE=0iH0Qii_UT;i|*Xsw6 z#5v3{5E1emRNW92&RU2%sFIogK{9Ko!Q78!(FgZ^63kJuFl$66b57bfg=&VIaiW-G z(^N54&e>!oLekvuDu}&!{rpKqFy=-?p2Lbfb-z#oFwEP-MJ8hmw3+f*lR5_xrMYok tH=p<5oB)yMl~ajG_L{suZ>YjV_y>Z(Qz9l=hS2~3002ovPDHLkV1jfg2weaG literal 0 HcmV?d00001 diff --git a/1.13/src/main/resources/assets/engineersdecor/textures/block/concrete/rebar_concrete_texture1.png b/1.13/src/main/resources/assets/engineersdecor/textures/block/concrete/rebar_concrete_texture1.png new file mode 100644 index 0000000000000000000000000000000000000000..5645eab913003496386dfa32c734dda5009b5da3 GIT binary patch literal 623 zcmV-#0+9WQP)!RQBWjlBaAAST@eM4^hkk{L;sU<${0;jZWygB`(jebc&g953cv zG>7&5FMDnFnq&se9ihldL?C0KP&7A=;~@7Y_F^0Z#F74qsPgsog_@I5L8%m5$SeeK72c+SlA`X;7y~uq_3;5!6vgO+JtwNl zb1z0~tSox#%(=*bLQAQDN=9#}sbkyOw670c~FYE7l;s5ocF>r6Hr8js;utL zoWb7fT}41d82un)Q3N_! ztq<1T)DA{_BW=AAJ5Vhul3+p=3e5E;L?v$KWNZqE*i;pf$nYd)Y|ctjxrs1LqD{1i}OI_g_C7agL$vXwKpM`}KvIky$*BK{Tie_kHun>rdvI z9PX$oE@F&h5PKscWEbakA)=Tm@AsSQyijTE`C`s*L=;h_D$&T|*ROx@V~|xu1hEzs zn>iFnhNEiQoeIdY_H)~C3a8n|KIVV|#s|qS$=439q03aLA^P;etSnRnvBAy&5n^vL7LZ)$Mg5+Mz0olSuEty&Q{iyK-I(_` zZbs})i6CNt@cq6KX;g(0L#vYaoR~Rle_ZTH%#7jAb)G1V2+)n2LPKUEU8t$@e7-Pu z&huigO;%xQADmsh-xKL35%%7UG3YE*4P9$e`6m(~tQ6nO8H_pQmz}-H9?v2oh2+zlp?t*SAHhXWRK_9OtkLQzh-wba7l4Dv;Hv zD$tzgL1ps#@dH!A#z4&xF^=m&RiWo_?!D;GA z8Lc@H4Pi(i75{zx;hGoC9rGY_)7(f2&c@e1?6oj6-nH0!Llx`!MiPI0KAbFM;(5N1 z#6HQ{i}&3`L?8+Gpm`!eR^iR*ZtT4o5#%nghFN2TI3=PPeq9#=G8cUW5gh@|ov-f) zx#h8Nd;v-UBdwzjuVlFDQbqQjo(iK!&-}7n{GjXsU{h|j)g^lH2J(S4=RhE z=Gq$-5!N~Yg@USL5C#Z$)B;nb_VCouBcMX812e%Rg4`RWS?6MUxSj`B;r0EEh?4nW zrU=5Zg8MG2iWPyof9T=P{rwj+$IV$Ds14nXyRoZrhWozQJ-9p7h5q~ZVnl%=Oc)9i z`1`teU2l4Zoykv2^Yb^@FO!+!b80eimyMe*Yi51A+^iEXOIL-rA13Snzb_?#o`}IwPbG>ht z8v__c=S5|rYH00;oev_yuKLuT;kqu&{1Y*P>>*Sbh6X&G+=*8;B8HmcCaiGGjIN@( zQ2{ptRg}-2ZV*?(9be}GJ>-3JeEs0QFS?4EM$8clOq$(8H>fY@VZ<0Uw0BVr)&0>H z`7Da!s?eL>g)+S zyYKlYV_TxgE|L>GJV5^a{Zk@F?n#MZ<`jjhaX$~QF^GbQMP)L^$%;iY!`x6oQ4>@I zD(StES@dx*j)QwnRD@Q=L>gdj6osv)*_x_w$gskOC-LYqaKM71x{`-C427O3Z|v8;@O31uN*yP;qi6^SKFY zxG9;5yOWtzCK-W^fvce2obz=;Zp=HG_0xR^<__wN(Lt3RfxFR1XD2+7c*Z6$=2}F- z>li$rH{KgDCu)WwKiFzy6%m`PqWggt0vWu%zKFH>TsQi=YG&Nmje5gLW^7!YJ{oGq zS`&Yb&i6CXXX33P1ZyYvJrMyn`>C`G3PfPVLia`}{sVtGSU+t{0Y3l$002ovPDHLk FV1g~%2W|iW literal 0 HcmV?d00001 diff --git a/1.13/src/main/resources/assets/engineersdecor/textures/block/concrete/rebar_concrete_texture6.png b/1.13/src/main/resources/assets/engineersdecor/textures/block/concrete/rebar_concrete_texture6.png new file mode 100644 index 0000000000000000000000000000000000000000..99e6367d26bd269bdfdae3848542517411d3d58b GIT binary patch literal 611 zcmV-p0-XJcP)hzOUmzeN>`17fVpEyK zUWkCIAv8rX#sEO861tdkqSAB)hbgL#`gm@*Qw_tMhyZn}n+7x@L6rOYFw7`~%w%Qp ze!ppiu3`?QYon^TIbDSU+TG9vC|QjFJ_g;zIUZtkbMGRn>1y1Ss-nbD8%`sL8UW`x zscIsEb57izobZgBDH*{SPUl8VjWHZGqZ;nDxFh*`eX;I^s*q94F<4pb`^Hts9Z#j) zH|xHErT|l6n9<#s8)^n3{9YG_Jq@n=gBfHciYS6mRm{Ty=q`jNGuih=Mlk2ZOp%96 zRr5MeT-|VUVlA@Z-ht^ONmMz{iC2@=#7f)-B2XB+8Z}WwjKBAr%;e|$8=;wVB0%f~ z)li9>V(wHI84DHgh@{u%`{##@;Byrsikk9zovb_1^FX_}cQB8WZWxDA8R#&fRan=B xs-XgA&gXrxR)9e4O<`0P_w`}NhHfg0{{g$@S8%`sEFu5^002ovPDHLkV1h(93pW4& literal 0 HcmV?d00001 diff --git a/1.13/src/main/resources/assets/engineersdecor/textures/block/concrete/rebar_concrete_texture7.png b/1.13/src/main/resources/assets/engineersdecor/textures/block/concrete/rebar_concrete_texture7.png new file mode 100644 index 0000000000000000000000000000000000000000..8ee5d608a3a31d8572f0d001df5bbac9ea9ca81d GIT binary patch literal 615 zcmV-t0+{`YP)Hy;~Fa3u_g0*W{+`S+h+?PJoFoG8|C_BpI;u}`4gU`}Rm&f&-NCsj#h zqNb>-;bTw@b2z9VX52d%V-Ve#Dvve!@py9IFX#YOx)QI3@7IfYEna_qW9FDBqDpt+ zD(nb`3v@DE$rEI65W}mAIUO1lMQHe#mMy9UcjN4Xxl!Gi3ypFO!Pi}Fy{pYXK%6#5X79U;`w-BK5=s*0?auPWEFbf8}otD ztn1=bVWRA8P6lSi-W%$WxmjzW>I`>=D(>zG@U;(upuz`JFz4j#gSz25F@elN4WJ1W zAJf@8=qiRAYfeN2)nd5QS#%efjq+C4dn%2BGTfMJp{m3Q#Ej|A*YE!jf!M)xClE}G z?xrFUQIt+H6A`#ikd^G$3+cl(jX4Km%J(_AKuM!!s44qweD9#U@zKm-WHfUOzP|p@ z-8|HAbHogxs4Ox9bLX)ZI9@ zH*+qkg6n!NSs56Z83KGlT(gp*bCP3nQ)2T{eHB&^8dg0`Rgm+t&;o180KilUvYPH;IDZ8l{>#Q z=8GqFuo%ULWrxpvQm}PSpVHLori8ki61xk2r_J`9x+^oOs`$pd1w}2pzlfi@^;pAD z>ei;rt4r6MxjgY*o4@2u*{wpaUnR$`*rzh5_l~}+$Ii8>;eoqE6SSR`+T9bQ?j{)i zeSN?ulg0M^jUDnrd#!Z0%oTfY_0#qIhkG;R`|iKLDH-%wzFUtcpU3=+8z`pGQAtEWR4C6)Qn9YWKn%;}0_uPmDN=!|z_0RI3>^_jOh_#J2ReMY zH@Ms*Q(HTZ<0hO=r@rsE+pVfTpUzE>-E~U?RvciaJgJot5w^!@Aq3()!p6Q z%t8pNDk37Hs`Yg?o0%B^cc0+<{jREn&*w9MoO3B<97p-q?RGOWrPweGWV`z?43)(1 zv~WBgMP!<=TrN4$-8Y*J?S&9_yPdm}vsf$uOscF>3Nd%*KmaMFoHLhHZf0gp)1;ID zlu}4lRr?lQ0RUj^77;TO5hnAS71@=bb=N9Z*|jIeSWychRE+Y}tDW4Zx|+lQ)GY!0 zCLtm@XJ!b%m<-val$>))Nkl%M4?BNrKA&4PO0gJY(=<%)*Xn-;^!<1|Dm;!OGgZ}k z8mjtwy+mXJ4u=DWlu~#Otl#Ip@Bfdl7EhxFwcqdg2V#sQ`~mXs-IB-WO=$oC002ov JPDHLkV1nvRwIu)m literal 0 HcmV?d00001 diff --git a/1.13/src/main/resources/assets/engineersdecor/textures/block/iestyle/ironsheet_roof_top.png b/1.13/src/main/resources/assets/engineersdecor/textures/block/iestyle/ironsheet_roof_top.png new file mode 100644 index 0000000000000000000000000000000000000000..a5f038273c5b831a6f28a2bc0fe1dc8280a98e51 GIT binary patch literal 509 zcmVpGuSrBfR5;6BlfiE4Fc3x0%s7q$Z0M@||FWM|saqsKKpcDKEn2(f zd6UFSe9ygiA|D?g;qIJHCq#tv`Ap84hvK`CV%TuK2L2La@q z(Y~2dLPTh-p{ke}W;UJyBH~+B6;=JdcXt3Tm&>?D1Sus_N&v&cwr#BIN=k|Top$Aj zKt!0P34mHF?mjXprLe9mW`?^D5d|y#Zm=Zu-5UCG^t=adrDG|?MstpPC4^9zlL@Y~7Hy4`L=sgra<5gFM;1lzWu z%d*f~qt-g=+O};F_0W2_oygt44|qHt|3l#Jlv1d*Qc4*Fef2!1Y5Hwpx7)F3cD*(^ulbkc_x&rVIh$bMRkNiYz00000NkvXXu0mjfwTVGd000McNliru;{pi{B{-AiBuoGR0h~!h zK~yNuJ(63l!!QU$c^D_LQ*~9{|5932iQ@(v?g!HSLw>-_8SwRbrIg$~r8LF>004-B znGrFiq^itpW{8+X1ORf*DJ5nmqA^C!834>IZixsHd+%mO*L9hhyEC(@B4VvoL=X`G zR5hj{Vtk`giipH%6!(22;=b=GrFC5aV9uFyCL(60F$N-*QdBhz%sEBmIF3?E?>*E; zmpLcJIA)G!%$##(=1{ord(OGm8gH1H=A4L#h^;jd2_V;X5m5j*j^nzn7^|w3b4J8v zSwv)6mUt9S0#um%hejd#zVF`q7-Qe}Ip?x0+qS7{bp3w6IcIk#A_|mdR%-=-)|#re z)&Su5`<>_ccsy#Y5$>Fmh$!HwDiN*gno@c`pCVF9A)?RcbKkeSyStesW}b6K?5(x1 zK}5%Kgy>RA2zGZ7p*g3!pXbTU+qRk67{km0V$Qj>773V{suDAY@BcuE==b}%dx$i% z_xoK+8DlVW8e_x?j4>kYm;eCo-dYQEkqiK&u%fEHcM&nOKoK8e$D)WO`UAb#ODa19 R!+QV#002ovPDHLkV1m?9;k*C< literal 0 HcmV?d00001 diff --git a/1.13/src/main/resources/assets/engineersdecor/textures/block/iestyle/treated_wood.png b/1.13/src/main/resources/assets/engineersdecor/textures/block/iestyle/treated_wood.png new file mode 100644 index 0000000000000000000000000000000000000000..a1d05379bfaf2e1fa536c5364f694c7b378cfae9 GIT binary patch literal 535 zcmV+y0_gpTP)@YTl z&BpmB;r~V?_Aqa6Dyk%c4N!mn{U;;<$YN)?uA9$uutXfB;(Q+Nt62pBEIiK-JrM@l zB7&-7v&;_VLJ?u{RV0DH*=4h+jM<^u$YvKJ!G`XF5^f;`EI%`>LRV2133OF)R?*cg%SnoCz+!(lRK)7DhO5=D;ph zfZ*;Xz_7R)my6jqiMPZvporZtSz4l8B!YyKAeqZW5&W42z7Nhq76g*sdO&5)&U+;j z!r$kI&-1~TjWAV4F3!AZl!GKr;GDtT+;`Dc7`Xa+ZI%UD=D-lDOzF*0_9ZSs0h3?} zN$;YiX-f>yf?w54hKd;F{jiH$Vk2hX9PqW+Ed8vImIJK#5^prnmm%+(8==5>@rw;q Z{0G5FEnJ26a)$r_002ovPDHLkV1i;6KG6{I0EnQs0$i{IA}_VE4dt-u48(7>vMfJh+# zo6p@0Lss#}V`H0&4E8{U7>2W(4AB@_#DFCBX$I&vStcV`k;I%PF=Mm4NkR8O4|te1 zJ!Y*W1g5dYm5Yd=ED*3yV+VuD5Llo<1?M!5A`uv1c(w7E$Vg^}(*q3GDvZetssek6 zFf+y;q}xVdlp+)&Lu3S325nQdXd4VyEh;a}FoH8CeB&VqyOH2|6=aer-g}do*kHr! zY+~S17ZNCwB6+>u#O))AfN>+6$RH4b*k{8GnE)mfC`2Y;5yb1v0PwVxLWvZn+u3AZCCN z=q9#7g6pyP`g~B41W(K?U_-6soO=g7chA@WByc=L1cJM{Ok&3T{UL;S)Z+O_ z9ub6e6D#?$7E<2hyrbgB|94K+7QgY6|32=+*!M4X57%0#K>?M;IfwLpwr`g>9sB|| W!aZ(xSK7}200003?sN>!VeyTup0?}c0neY;(HF6i48V+%w1HqLcx4c` zhh2*qGd*~Qdj~~e2aSmkva!u;707(fhjR~6dhBKdgO~wApoiE73HEF8*UyWJB!H@o z5Or-lgAKKkd!HTjJUwFrkihj25eS~C@IU%OKt$Pc+x`Fm002ovPDHLkV1n}U B>WKgV literal 0 HcmV?d00001 diff --git a/1.13/src/main/resources/assets/engineersdecor/textures/block/iestyle/treated_wood_pole_texture.png b/1.13/src/main/resources/assets/engineersdecor/textures/block/iestyle/treated_wood_pole_texture.png new file mode 100644 index 0000000000000000000000000000000000000000..8c50fc8106ffe8a2d64caf859ca2839c210f4608 GIT binary patch literal 596 zcmV-a0;~OrP)DnaObH`#8`7f6j@i(RyP?@R|#AB?~e( zxFf)vN$Uru!fS4_3NyjQ45f%HD2Uv|>%_eN1@!M9^@YYx_2U!y6|L~ts3 z&BV+oimc+=!5D+R6CxR7@H$VrHwq!&rteA|QTCoh1kIgYMP+iH=iB+t-bwEr00AWK zgNWe6l`S1N<@3C5+~XEk6(Rx%&+GhxAMPZDH^X0ZAtHnbM{gu>t&O|i+pi+?4pC+j z5v(dy;97x-8i=yz)_AxA`>!-*c+jUz39z}SXAAs^uy%FwN4e}8`Lf6DrA9c zqq}2jbaxy@O$iGBI47+cqDEF?BB&~B77&;jqQcCivbe5`T}j3L@f{>!&Fg0000^u(1V#5og)niLYx= z4YDbkdrnp*1-zNOJE`y10=hvG)y*6OcNWjP$U0HF8)&+cy_1m0Ol)C^wHDp*>+@ko zFdXK#5l{`!yRpGC_jTrLCz(y{LNra0b>I%$P)!R)m|?N@!ZQE%ffhDdMN>$ycM)-B zZoq=fCM>d>IVNW=t}zJ*-Hm)0bQRsrm=kwxByoQR?@q=rYcFJT#W)NqsZ6Hl_b0>^ zL9WH9YL=Q>?~$n+$H0hZZ-$_=7&a0J5hEyI%z?wfHH~D3O&tO0Zmux#J+ctc66mm^ z3TG8R&#|s{ky*U!#6l*k(f5AdO*nw&d0*bO7)H!F35&HhRmB*=yElzcH%;R(_qPjG zr!Sc=jxbfl&$IZqH(?(^VvyfF-Hm`}=jnw-=r9slu#Q1H5^ zi(`nz>A8~)!;Tp6xcu*#yL7=V;R1no|K+|vUK;Mx&VHrtq-el@1$U*luv`c2iHU zt&3LFG@HJw$JB3K!pwP|E*o5Z(pMNac<5Z*bh+A(F_=H8B;G4^<slu#P_W$7 z#WBR<^xFxBe1`&foZ}yL&15d%duRV$My6rzzZs2XO0G_^zo)rOOFr2+`LK)nz5MX} zYPK5*33WF6{{)LqU<_uPc~E0<>9%`*A#7}`dX&oh%b6Ke)~Ygl>Kv|TJF?vTfUDA? q?_2FFc$tqH`BWOL`f>5m6OH^lCw1X@IW-^$GkCiCxvXo~-ZNOTPT#^VSelVDr%lPk;HI*1!?g%MM3KF>t=!aeVTC=Z}A&3xT;9wK{RC zjcNt2mDPI1YPsN#^DVhlwo_oWNK84i9(n*uF?QL=x!~@^dCm-r#Oqv`rirN-U5KQV zsO}Uq0L&@?`(ogYVwJa6J@U=hU$y3q*hSXsH2}NIO8_)R+ze5rxpVFMb@tBf)N(>#f zRuG|DCEh-|$G>qPPnmvL(%dPva`W~bZp<^)8$pHtCd5E|@$3{)K}6Yne8R6!zC{FL zI1E_4ky3nfKl}N+16@#_KRG478YhAZsq1iaM3rpL#cm|Th_*&;jV6i}Lsi-5!uezi5 zK%?^R<`@micsVlkOXADl&ZyNCJGR1PM}l@mD^K6&^V zv6!*l&u9p=*4`*vn*%WPOa6SlL$8p5tCu?ac_zjfDBc(XNQ{IKuu@1N(RCd$C|&BH zHEON6J53Je0>qoQj(BIvlv+qBfjg+O=sHk%?}NKo&Uk~8XH*sU16{SsKU^4MF27uT Q4*&oF07*qoM6N<$g4{Sz3jhEB literal 0 HcmV?d00001 diff --git a/1.13/src/main/resources/assets/engineersdecor/textures/block/slag_brick/slag_brick_texture1.png b/1.13/src/main/resources/assets/engineersdecor/textures/block/slag_brick/slag_brick_texture1.png new file mode 100644 index 0000000000000000000000000000000000000000..1e56869407adc39e092e737a5912cc28048c2eae GIT binary patch literal 707 zcmV;!0zCbRP)U>nkjCI*CzeE}cDnIH(hffL`sNrXlMqS%Bal7ZkjlhAFh_uO;#Pi+Ss zI{tv)q@Z9e7K*cy_uam&SGqtcS#uGn>^CfKn=BuH;;BcWjr4oaY zQlhz2Y6YOy2Ee{l@J^|Xi|Zxw%~xOa)p|oP!^{v7ru|5nCe#eC6;Z`vVzC(5?{?H$ z@eT;sZ%>X%K>(rDO0+;nu^?Q%cAW?JzXM>mpJ?s`RRGq@1@9kzjF||}UyQtQX+w6% zb0wHD&h=cl9ryg3?YJkzfO&UNVakOVBkm4>h>*jk*%yPA$yHi@@ zgTs%Q=b7f6pz;rcU;+F6*JDHl5#`Fe2OK}V4iym#c=ufOaT6BdnNMlF>WrzZfcE?mHy6M~X+=HhFw(^_L1ckKS$ zv05&$qoeN$DzsAm)AH@R_jvfz5sv(=z_T>1HE!Pd1WN+B6vpDv3WWIT0-}LhDoA)~ z&{4oU?B^NFwK7gKsJ;@vB*uuUFboNLr?rN=)8%Zr0CwZn9i}N$S|O#xa=D@d!;sJ+ p@#eJyYR-6vl4n%)d~B^Y{sL>rLE72U*`fdd002ovPDHLkV1o5ZMza6_ literal 0 HcmV?d00001 diff --git a/1.13/src/main/resources/assets/engineersdecor/textures/block/slag_brick/slag_brick_texture2.png b/1.13/src/main/resources/assets/engineersdecor/textures/block/slag_brick/slag_brick_texture2.png new file mode 100644 index 0000000000000000000000000000000000000000..8832f881774cd89fd689884e0b7a887092048796 GIT binary patch literal 728 zcmV;}0w?{6P)YwvRl z*bW>EDr!p;4Cz2@0_s!v0zQZ{K@fZcCq9J(b>Iag88n6NKq6Q#7s%INejcm!21|*Q5+XwPN}VP&C64<&qDsmGi^a%cx5M4(0SKf&etX1V z0tnTeoQyz8CcJn4fIlyP1rb!0V=1hbOWYe~%ITd8QW9Z%tc=Mh-YH!$gZ(tWf-1Yo z@m9z=alJb*;jymE4a znc=PB)yYF9TBEpg`~F9`JJVFCwJ;8|nNulPGSbt>j}R3^l+(Kx{Pg{|3`waiP(Vaz z5tu6X9(>H@FFzn645s|^?}2o+J7OvfITIn&9z^ZzrWx0I9Ek`@>xdev%Ar)Qck^4i z9A<*cWGWYeP!OP%{jWlxCc@GT1=QnPf^HGDOf? z0}=M6&N&9sTW9C2)*D0xd#QpOeDKEEIbI4qpq2?$rT2alr2hcS4?`m2$s7^E+&CF}E)NSsUpTCdW)5Q^1ORGn?AOM+R<>i0F3U;=G$)dF%(bx@dM*wN z=FWB~)MhNz065eJ9@J(u59G5?K8j%&>G~d3MMRhnd+I!sRB>}eK)b>)^i0!)w}uBG zpuapmqhtYu+8Ui^f`n$_-S$dtQC&{pf4TMenv#NcmF+-itx{FkBG1|KiZt# ze&NNJZcxpc=7rXb!?JR|yP}%0)JpC$$-^ND^I93k4U&}L{QC$2tiLtnl5Hvh?ibzT`a1L00J!P)f~3USoZWsRtCAwH2tpE)GAShvYvt+G z$Vt$#DAk;`uJnCD0CQ)*HiiH#h4ABkA_$;1qsxg-GxGVTABT1Y?UbxatBu{$a{xBm zEpAS$6*J@7_3K>jb|iu6YGN}E=pR2l#LP(&G!G)2lrkQ{=^MBC{+kC}+isYv@#oJV zBBYd9*UCG0-$iR{Tpkuu&O`*Q9WQI)#}?zj-xqsQPS5Bk5zL&!vY@J&>cJ+1sFHK0 z)k?{QuItd8=t>6>m>KR)$nm)VdgGOwJU_2gtCUh0#|;7WeIfOQmtTL2wyt2f%7KOQ1R?`STYn^@V)Y@=&^6^-i7KJCZG0!t|>kKJV zO2OP|y#vs@0dQy?JZRl`=3+!X|McSs5Au*%tyTc+w_5--XS{brm2l_Q?b{r7J9_VU z00Q~Z!!H4t4+lg90JD?YyYGL%)i)171XX3Om1!L5-AGBfytgI;?6zCn>_i}Pq9!=m zP}#jBj%lL1pOV)^0IeHC(o<|-eD+BI45ctm6Lp?3Git5WS^-$CR-~LsIpf_B z72F&Z$bbBHg_)xgbPpmN)r3cIdG`$-fBS%EZ%xe2&W}2EqSnUxt^4HGJDbB1O^JxO zsjP(qFpW$8da_5)mVxt2ow+q~&WYy1lt6MOr9^Lyk_y8xkdrc$0U|In+?}{78{`-6 zyv%cRrCFnt0`8#7Vi-W-&fVA12sCAm#~BeJA{fqj{11f5U+GS^s+<4-002ovPDHLk FV1i8MOQrw- literal 0 HcmV?d00001 diff --git a/1.13/src/main/resources/assets/engineersdecor/textures/block/slag_brick/slag_brick_texture5.png b/1.13/src/main/resources/assets/engineersdecor/textures/block/slag_brick/slag_brick_texture5.png new file mode 100644 index 0000000000000000000000000000000000000000..baa5672d7a3391c37f6337c5ff796d4408a6e384 GIT binary patch literal 729 zcmV;~0w(>5P)`lfe4UDkc};~Gkb4$RW-rP z5^&N|{ix1&>WV`j_;iE@VhVR9RgvqECj-k6K2NElY9L9{a2Kfn494q-Kxk%^oOs-JT+B1C-hG#|uRjM7RF$b#R^y17lag|La!Sr3JbAt&B?X|*#V6vtDk*ye}7$4{`~C``RR5dsW6m6?}DgOEqK1$l5$3S$9t!XBAQTDE^6c1)<`Po zIAlbG+A531fB+YBr6aUvxF#%O&q42WU@V!d>m>m4*{7d${-=4K0a#tRLU@ppQfuXf z7q8;(OuH@H^DV1!N&e%PGu#7}jzy>UKs6D)bA0jd`v#Yq&eY9<0@7L(Vx7hmZg)76aBAgi=ajnkK3RW(FO?gHj3r zyYqAMjaP2*(o|{Q7>0pyT+t7MbTRPG`yXJn5*=EdQB~p)Fo1snF~nMV47dP*00000 LNkvXXu0mjfJU~jx literal 0 HcmV?d00001 diff --git a/1.13/src/main/resources/assets/engineersdecor/textures/block/slag_brick/slag_brick_texture6.png b/1.13/src/main/resources/assets/engineersdecor/textures/block/slag_brick/slag_brick_texture6.png new file mode 100644 index 0000000000000000000000000000000000000000..6895552a90f6df672bd49c30ffb70a82209ba348 GIT binary patch literal 751 zcmVkq_ZZI8rB3gO@wR)cjJ46bW4j*o zR`K3hF6S&)8^&6hOfpCUcY*-vtmX@9ZJd`zDHV4|$FVS&F?PrDfT*CV^d3Oq5u}tT zw z9t?vaqP%$HCilO)jfgNL<@aCiVT-dJNrfS2A_P&TG^eye^*|%&5rim{y(y~7wp5m9 zjiiE22cveU)WT#kAV7B~+_9w8P{KPA0TBdHTPG*QBalx&`8aB8m>K(rhqT)0y>Yf) zGdnoIyOWYqN?|^KNEt`2UVEO$tH;cyd)SY6?+_k{z$6f z?N5I3VD*SnD(}4aJ~pw$dOM;iQO8Pa7hn%(v6wTP?(z5P98LP9eHEd1XFHCVS)zK7 z=|sR}GSF&eNCT_o97{?bGDOgO$K45$iyZ^@^2se;s1?f@fHD?>3!^;QW4l??O2Gqa h8BtZ-{olQG{s9}HY&2FWSkV9g002ovPDHLkV1nF#Ub_GQ literal 0 HcmV?d00001 diff --git a/1.13/src/main/resources/assets/engineersdecor/textures/block/slag_brick/slag_brick_texture7.png b/1.13/src/main/resources/assets/engineersdecor/textures/block/slag_brick/slag_brick_texture7.png new file mode 100644 index 0000000000000000000000000000000000000000..966aee469c9fa7b77c264e1d6ee01b14ca13b631 GIT binary patch literal 742 zcmVizq* zX~CJG*hU)D(qIz=#eowS;RalYV@Eo11%mrf5o|NkAcDEmr3gSNm8WwCcgzgkwjF?qP@9orAcaT>3hscT0<|^()>5(7 zD76tnK)(6vOW(JQhCnGh<8)xpnUXUS1AXccRbuKGhMskvskLGb2*h76zeC*s!EsUy zI7$q{t9Q?Mbae?Ls498inZ}V?8zCqs_b!N0gk>v?eaD;&u^J|V03jUa*68i>#jBk_&XbDqb57!!Tp zvCcE|vhe!pIY-CGtjmG`>#{Hm0{|fg;@^)SAS#F`CubM@@ym~hKn#&BZ&Y`tv1i#T zuf2K7KYu+!MCgL@_~8}tdd>tDx|CR#m0TOm9HD?HUK`JrOf#n+CsdVnFKh)w1RcAG zh_IKP!_g5_m#DSj?uZ+t4n&?Sfdi#BYBRP{k*~k_+)J(0S_vUwZj^n;nlT*?bp1ft zH=aECmuWii((%h|>q2YBG!Dc+f4`zNL&d4)xErbgbLZskcX{~p5A;#lO5-WKa6*84 z7w;2Gt*qNlF-KKjC|hdf1c)(mJ!drN|E!!ShP#vc9(9~KXB0>=5@P^2hAwgE&M`44 zsY?XC{f4zhX-2i%y7<;R_c@In=8Y|9#&N=dzVFb!!;)O{!Q1I-#Dg1fWc+|X*{ YKL~Si=sh)*xBvhE07*qoM6N<$f>D!Ai~s-t literal 0 HcmV?d00001 diff --git a/1.13/src/main/resources/data/engineersdecor/recipes/_constants.json b/1.13/src/main/resources/data/engineersdecor/recipes/_constants.json new file mode 100644 index 0000000..3099a1d --- /dev/null +++ b/1.13/src/main/resources/data/engineersdecor/recipes/_constants.json @@ -0,0 +1,89 @@ +[ + { + "items": [ + { "item": "minecraft:brick" }, + { "item": "minecraft:nether_brick" } + ], + "name": "engineersdecor:any_brick_ingot" + }, + { + "items": [ + { "item": "minecraft:bricks" }, + { "item": "minecraft:nether_bricks" } + ], + "name": "engineersdecor:any_brick_block" + }, + { + "items": [ + { "item": "minecraft:black_concrete_powder" }, + { "item": "minecraft:blue_concrete_powder" }, + { "item": "minecraft:brown_concrete_powder" }, + { "item": "minecraft:cyan_concrete_powder" }, + { "item": "minecraft:gray_concrete_powder" }, + { "item": "minecraft:green_concrete_powder" }, + { "item": "minecraft:light_blue_concrete_powder" }, + { "item": "minecraft:light_gray_concrete_powder" }, + { "item": "minecraft:lime_concrete_powder" }, + { "item": "minecraft:magenta_concrete_powder" }, + { "item": "minecraft:orange_concrete_powder" }, + { "item": "minecraft:pink_concrete_powder" }, + { "item": "minecraft:purple_concrete_powder" }, + { "item": "minecraft:red_concrete_powder" }, + { "item": "minecraft:white_concrete_powder" }, + { "item": "minecraft:yellow_concrete_powder" }, + { "item": "minecraft:black_concrete" }, + { "item": "minecraft:blue_concrete" }, + { "item": "minecraft:brown_concrete" }, + { "item": "minecraft:cyan_concrete" }, + { "item": "minecraft:gray_concrete" }, + { "item": "minecraft:green_concrete" }, + { "item": "minecraft:light_blue_concrete" }, + { "item": "minecraft:light_gray_concrete" }, + { "item": "minecraft:lime_concrete" }, + { "item": "minecraft:magenta_concrete" }, + { "item": "minecraft:orange_concrete" }, + { "item": "minecraft:pink_concrete" }, + { "item": "minecraft:purple_concrete" }, + { "item": "minecraft:red_concrete" }, + { "item": "minecraft:white_concrete" }, + { "item": "minecraft:yellow_concrete" } + ], + "name": "engineersdecor:concrete" + }, + { + "items": [ + { "item": "minecraft:bone_meal" } + ], + "name": "engineersdecor:any_slag" + }, + { + "items": [ + { "item": "minecraft:iron_nugget" } + ], + "name": "engineersdecor:any_ferro_metal_stick" + }, + { + "items": [ + { "item": "minecraft:iron_nugget" } + ], + "name": "engineersdecor:steel_stick" + }, + { + "items": [ + { "item": "minecraft:stick" } + ], + "name": "engineersdecor:treated_wood_stick" + }, + { + "items": [ + { "item": "minecraft:dark_oak_planks" } + ], + "name": "engineersdecor:treated_wood_planks" + }, + { + "items": [ + { "item": "minecraft:dark_oak_slab" } + ], + "name": "engineersdecor:treated_wood_slab" + } +] \ No newline at end of file diff --git a/1.13/src/main/resources/data/engineersdecor/recipes/clinker_brick_recipe.json b/1.13/src/main/resources/data/engineersdecor/recipes/clinker_brick_recipe.json new file mode 100644 index 0000000..25f383d --- /dev/null +++ b/1.13/src/main/resources/data/engineersdecor/recipes/clinker_brick_recipe.json @@ -0,0 +1,22 @@ +{ + "conditions": [ + { + "type": "engineersdecor:grc", + "result": "engineersdecor:clinker_brick_block" + } + ], + "type": "minecraft:crafting_shaped", + "pattern": [ + "BBB", + "BNB", + "BBB" + ], + "key": { + "B": { "constant": "engineersdecor:any_brick_ingot" }, + "N": { "constant": "engineersdecor:any_brick_block" } + }, + "result": { + "item": "engineersdecor:clinker_brick_block", + "count": 4 + } +} diff --git a/1.13/src/main/resources/data/engineersdecor/recipes/clinker_brick_stairs_recipe.json b/1.13/src/main/resources/data/engineersdecor/recipes/clinker_brick_stairs_recipe.json new file mode 100644 index 0000000..a4cea28 --- /dev/null +++ b/1.13/src/main/resources/data/engineersdecor/recipes/clinker_brick_stairs_recipe.json @@ -0,0 +1,23 @@ +{ + "conditions": [ + { + "type": "engineersdecor:grc", + "result": "engineersdecor:clinker_brick_stairs" + } + ], + "type": "minecraft:crafting_shaped", + "pattern": [ + "C ", + "CC ", + "CCC" + ], + "key": { + "C": { + "item": "engineersdecor:clinker_brick_block" + } + }, + "result": { + "item": "engineersdecor:clinker_brick_stairs", + "count": 9 + } +} diff --git a/1.13/src/main/resources/data/engineersdecor/recipes/clinker_brick_stairs_recipe_decompose.json b/1.13/src/main/resources/data/engineersdecor/recipes/clinker_brick_stairs_recipe_decompose.json new file mode 100644 index 0000000..7cd85bc --- /dev/null +++ b/1.13/src/main/resources/data/engineersdecor/recipes/clinker_brick_stairs_recipe_decompose.json @@ -0,0 +1,22 @@ +{ + "conditions": [ + { + "type": "engineersdecor:grc", + "result": "engineersdecor:clinker_brick_block" + } + ], + "type": "minecraft:crafting_shaped", + "pattern": [ + "SS", + "SS" + ], + "key": { + "S": { + "item": "engineersdecor:clinker_brick_stairs" + } + }, + "result": { + "item": "engineersdecor:clinker_brick_block", + "count": 3 + } +} diff --git a/1.13/src/main/resources/data/engineersdecor/recipes/metal_rung_ladder_recipe.json b/1.13/src/main/resources/data/engineersdecor/recipes/metal_rung_ladder_recipe.json new file mode 100644 index 0000000..1e457b2 --- /dev/null +++ b/1.13/src/main/resources/data/engineersdecor/recipes/metal_rung_ladder_recipe.json @@ -0,0 +1,22 @@ +{ + "conditions": [ + { + "type": "engineersdecor:grc", + "result": "engineersdecor:metal_rung_ladder", + "later_required": ["immersiveengineering:material"] + } + ], + "type": "minecraft:crafting_shaped", + "pattern": [ + "S S", + "SSS", + " " + ], + "key": { + "S": { "constant": "engineersdecor:any_ferro_metal_stick" } + }, + "result": { + "item": "engineersdecor:metal_rung_ladder", + "count": 4 + } +} diff --git a/1.13/src/main/resources/data/engineersdecor/recipes/metal_rung_steps_recipe.json b/1.13/src/main/resources/data/engineersdecor/recipes/metal_rung_steps_recipe.json new file mode 100644 index 0000000..44abd9f --- /dev/null +++ b/1.13/src/main/resources/data/engineersdecor/recipes/metal_rung_steps_recipe.json @@ -0,0 +1,22 @@ +{ + "conditions": [ + { + "type": "engineersdecor:grc", + "result": "engineersdecor:metal_rung_steps", +"later_required": ["immersiveengineering:material"] + } + ], + "type": "minecraft:crafting_shaped", + "pattern": [ + " SS", + "SS ", + " SS" + ], + "key": { + "S": { "constant": "engineersdecor:any_ferro_metal_stick" } + }, + "result": { + "item": "engineersdecor:metal_rung_steps", + "count": 4 + } +} diff --git a/1.13/src/main/resources/data/engineersdecor/recipes/rebar_concrete_recipe.json b/1.13/src/main/resources/data/engineersdecor/recipes/rebar_concrete_recipe.json new file mode 100644 index 0000000..8b61f31 --- /dev/null +++ b/1.13/src/main/resources/data/engineersdecor/recipes/rebar_concrete_recipe.json @@ -0,0 +1,22 @@ +{ + "conditions": [ + { + "type": "engineersdecor:grc", + "result": "engineersdecor:rebar_concrete" + } + ], + "type": "minecraft:crafting_shaped", + "pattern": [ + "SCS", + "CSC", + "SCS" + ], + "key": { + "C": { "constant": "engineersdecor:concrete" }, + "S": { "constant": "engineersdecor:steel_stick" } + }, + "result": { + "item": "engineersdecor:rebar_concrete", + "count": 4 + } +} diff --git a/1.13/src/main/resources/data/engineersdecor/recipes/rebar_concrete_stairs_recipe.json b/1.13/src/main/resources/data/engineersdecor/recipes/rebar_concrete_stairs_recipe.json new file mode 100644 index 0000000..1b05f55 --- /dev/null +++ b/1.13/src/main/resources/data/engineersdecor/recipes/rebar_concrete_stairs_recipe.json @@ -0,0 +1,21 @@ +{ + "conditions": [ + { + "type": "engineersdecor:grc", + "result": "engineersdecor:rebar_concrete_stairs" + } + ], + "type": "minecraft:crafting_shaped", + "pattern": [ + "C ", + "CC ", + "CCC" + ], + "key": { + "C": { "item": "engineersdecor:rebar_concrete" } + }, + "result": { + "item": "engineersdecor:rebar_concrete_stairs", + "count": 9 + } +} diff --git a/1.13/src/main/resources/data/engineersdecor/recipes/rebar_concrete_wall_recipe.json b/1.13/src/main/resources/data/engineersdecor/recipes/rebar_concrete_wall_recipe.json new file mode 100644 index 0000000..9afdf8d --- /dev/null +++ b/1.13/src/main/resources/data/engineersdecor/recipes/rebar_concrete_wall_recipe.json @@ -0,0 +1,23 @@ +{ + "conditions": [ + { + "type": "engineersdecor:grc", + "result": "engineersdecor:rebar_concrete_wall" + } + ], + "type": "minecraft:crafting_shaped", + "pattern": [ + " ", + "CCC", + "CCC" + ], + "key": { + "C": { + "item": "engineersdecor:rebar_concrete" + } + }, + "result": { + "item": "engineersdecor:rebar_concrete_wall", + "count": 6 + } +} diff --git a/1.13/src/main/resources/data/engineersdecor/recipes/slag_brick_recipe_with_slag.json b/1.13/src/main/resources/data/engineersdecor/recipes/slag_brick_recipe_with_slag.json new file mode 100644 index 0000000..9f07a06 --- /dev/null +++ b/1.13/src/main/resources/data/engineersdecor/recipes/slag_brick_recipe_with_slag.json @@ -0,0 +1,22 @@ +{ + "conditions": [ + { + "type": "engineersdecor:grc", + "result": "engineersdecor:slag_brick_block" + } + ], + "type": "minecraft:crafting_shaped", + "pattern": [ + "BBB", + "BSB", + "BBB" + ], + "key": { + "B": { "constant": "engineersdecor:any_brick_ingot" }, + "S": { "constant": "engineersdecor:any_slag" } + }, + "result": { + "item": "engineersdecor:slag_brick_block", + "count": 4 + } +} diff --git a/1.13/src/main/resources/data/engineersdecor/recipes/slag_brick_stairs_recipe.json b/1.13/src/main/resources/data/engineersdecor/recipes/slag_brick_stairs_recipe.json new file mode 100644 index 0000000..20adf39 --- /dev/null +++ b/1.13/src/main/resources/data/engineersdecor/recipes/slag_brick_stairs_recipe.json @@ -0,0 +1,23 @@ +{ + "conditions": [ + { + "type": "engineersdecor:grc", + "result": "engineersdecor:slag_brick_stairs" + } + ], + "type": "minecraft:crafting_shaped", + "pattern": [ + "C ", + "CC ", + "CCC" + ], + "key": { + "C": { + "item": "engineersdecor:slag_brick_block" + } + }, + "result": { + "item": "engineersdecor:slag_brick_stairs", + "count": 9 + } +} diff --git a/1.13/src/main/resources/data/engineersdecor/recipes/treated_wood_ladder_recipe.json b/1.13/src/main/resources/data/engineersdecor/recipes/treated_wood_ladder_recipe.json new file mode 100644 index 0000000..8db74e1 --- /dev/null +++ b/1.13/src/main/resources/data/engineersdecor/recipes/treated_wood_ladder_recipe.json @@ -0,0 +1,23 @@ +{ + "conditions": [ + { + "type": "engineersdecor:grc", + "result": "engineersdecor:treated_wood_ladder", +"later_required": ["immersiveengineering:material"] + } + ], + "type": "minecraft:crafting_shaped", + "pattern": [ + "S#S", + "SSS", + "S#S" + ], + "key": { + "S": { "constant": "engineersdecor:treated_wood_stick" }, + "#": { "item": "minecraft:bone_meal" } + }, + "result": { + "item": "engineersdecor:treated_wood_ladder", + "count": 4 + } +} diff --git a/1.13/src/main/resources/data/engineersdecor/recipes/treated_wood_pole_recipe.json b/1.13/src/main/resources/data/engineersdecor/recipes/treated_wood_pole_recipe.json new file mode 100644 index 0000000..8d16ec3 --- /dev/null +++ b/1.13/src/main/resources/data/engineersdecor/recipes/treated_wood_pole_recipe.json @@ -0,0 +1,23 @@ +{ + "conditions": [ + { + "type": "engineersdecor:grc", + "result": "engineersdecor:treated_wood_pole", +"later_required": ["immersiveengineering:material"] + } + ], + "type": "minecraft:crafting_shaped", + "pattern": [ + " S ", + " W ", + " W " + ], + "key": { + "W": { "constant": "engineersdecor:treated_wood_planks" }, + "S": { "constant": "engineersdecor:treated_wood_slab" } + }, + "result": { + "item": "engineersdecor:treated_wood_pole", + "count": 6 + } +} diff --git a/1.13/src/main/resources/data/engineersdecor/recipes/treated_wood_table_recipe.json b/1.13/src/main/resources/data/engineersdecor/recipes/treated_wood_table_recipe.json new file mode 100644 index 0000000..d366991 --- /dev/null +++ b/1.13/src/main/resources/data/engineersdecor/recipes/treated_wood_table_recipe.json @@ -0,0 +1,23 @@ +{ + "conditions": [ + { + "type": "engineersdecor:grc", + "result": "engineersdecor:treated_wood_table", +"later_required": ["immersiveengineering:material"] + } + ], + "type": "minecraft:crafting_shaped", + "pattern": [ + "WWW", + "S S", + "S S" + ], + "key": { + "W": { "constant": "engineersdecor:treated_wood_slab" }, + "S": { "item": "engineersdecor:treated_wood_pole" } + }, + "result": { + "item": "engineersdecor:treated_wood_table", + "count": 1 + } +} diff --git a/1.13/src/main/resources/pack.mcmeta b/1.13/src/main/resources/pack.mcmeta new file mode 100644 index 0000000..f642e0f --- /dev/null +++ b/1.13/src/main/resources/pack.mcmeta @@ -0,0 +1,7 @@ +{ + "pack": { + "description": "engineersdecor resources", + "pack_format": 4, + "_comment": "A pack_format of 4 requires json lang files. Note: we require v4 pack meta for all mods." + } +} diff --git a/1.13/tasks.js b/1.13/tasks.js new file mode 100644 index 0000000..2d1953a --- /dev/null +++ b/1.13/tasks.js @@ -0,0 +1,231 @@ +#!/usr/bin/djs +"use strict"; +if(!fs.chdir(fs.dirname(fs.realpath(sys.script)))) throw new Error("Failed to switch to mod source directory."); +if(!fs.isdir("../.git")) throw new Error("Missing git repository in parent directory of mod source."); + +var tasks = {}; + +tasks["dist-check"] = function() { + const uncommitted_changes = sys.shell("git status -s").trim(); + const gittags = sys.shell('git log -1 --format="%D"') + .replace(/[\s]/g,"").split(",") + .filter(function(s){ return s.indexOf("tag:")==0;}) + .map(function(s){ return s.replace(/^tag:/,"");}); + const version_engineersdecor = fs.readfile("gradle.properties", function(line){ + if(line.trim().indexOf("version_engineersdecor")!=0) return false; + return line.replace(/^.*?=/,"").trim() + }).trim(); + const git_remote = sys.shell("git remote -v").trim(); + const git_branch = sys.shell("git rev-parse --abbrev-ref HEAD").trim(); + const git_diff = sys.shell("git diff").trim(); + var fails = []; + if(version_engineersdecor=="") fails.push("Could not determine 'version_engineersdecor' from gradle properties."); + if(!gittags.length) fails.push("Version not tagged."); + if(!gittags.filter(function(s){return s.indexOf(version_engineersdecor.replace(/[-]/g,""))>=0}).length) fails.push("No tag version not found matching the gradle properties version."); + if(git_remote.replace(/[\s]/g,"").indexOf("git@github.com:stfwi/engineers-decor.git(push)") < 0) fails.push("Not the reference repository."); + if((git_branch != "develop") && (git_branch != "master")) { + fails.push("No valid branch for dist. (branch:'"+git_branch+"')"); + } else if((git_branch == "develop") && (version_engineersdecor.replace(/[^\w\.-]/g,"")=="")) { + fails.push("Cannot make release dist on develop branch."); + } else if((git_branch == "master") && (version_engineersdecor.replace(/[^\w\.-]/g,"")!="")) { + fails.push("Cannot make beta dist on master branch."); + } + if(git_diff !== "") fails.push("Not everything committed to the GIT repository."); + if((!fs.isfile("signing.jks")) || (!fs.isfile("signing.properties"))) fails.push("Jar signing files missing."); + if(fails.length>0) { + for(var i in fails) fails[i] = " - " + fails[i]; + alert("Dist check failed"); + alert(fails.join("\n")+"\n"); + exit(1); + } +}; + +tasks["sync-languages"] = function() { + // @todo: has become easier but needs impl. +}; + +tasks["tabs-to-spaces"] = function() { + var file_list = (function() { + var ls = []; + const ext = ['java']; + for(var i in ext) ls = ls.concat(fs.find("./src", '*.'+ext[i])); + for(var i in ls) ls[i] = ls[i].replace(/\\/g,"/"); + ls.sort(); + ls.push("readme.md"); + return ls; + })(); + for(var file_i in file_list) { + var file = file_list[file_i]; + var txt = fs.readfile(file); + if(txt===undefined) throw new Error("Failed to read '" + file + "'"); + const txt_length = txt.length; + txt = txt.replace(/[\t]/g," "); + const n = txt.length - txt_length; + if(n > 0) { + print("File '" + file + "': Changed " + n + " tabs to 2 spaces." ); + fs.writefile(file, txt); + } + } +}; + +tasks["trailing-whitespaces"] = function() { + var file_list = (function() { + var ls = []; + const ext = ['java','json','lang']; + for(var i in ext) ls = ls.concat(fs.find("./src", '*.'+ext[i])); + for(var i in ls) ls[i] = ls[i].replace(/\\/g,"/"); + ls.sort(); + ls.push("readme.md"); + return ls; + })(); + for(var file_i in file_list) { + var file = file_list[file_i]; + var txt = fs.readfile(file); + if(txt===undefined) throw new Error("Failed to read '" + file + "'"); + const txt_length = txt.length; + txt = txt.replace(/[\r\t ]+[\n]/g,"\n"); + const n = txt_length - txt.length; + if(n > 0) { + print("File '" + file + "': Fixed " + n + " lines with trailing whitespaces." ); + fs.writefile(file, txt); + } + } +}; + +tasks["version-check"] = function() { + var version_minecraft=""; + var version_forge=""; + var version_engineersdecor=""; + fs.readfile("gradle.properties", function(line){ + if(line.search(/^[\s]*version_minecraft[\s]*=/i) >= 0) { + version_minecraft = line.replace(/^[^=]+=/,"").trim(); + } else if(line.search(/^[\s]*version_forge[\s]*=/i) >= 0) { + version_forge = line.replace(/^[^=]+=/,"").trim(); + } else if(line.search(/^[\s]*version_engineersdecor[\s]*=/i) >= 0) { + version_engineersdecor = line.replace(/^[^=]+=/,"").trim(); + } + return false; + }) + const combined_version = version_minecraft + "-" + version_engineersdecor; + var readme_version_found = fs.readfile("readme.md", function(line){ + var m = line.match(/^[\s]+-[\s]+v([\d]+[\.][\d]+[\.][\d]+[-][abrc][\d]+)/i); + if((!m) || (!m.length) || (m.length < 2)) { + m = line.match(/^[\s]+-[\s]+v([\d]+[\.][\d]+[\.][\d]+)/i); + if((!m) || (!m.length) || (m.length < 2)) return false; + } + return m[1]==version_engineersdecor; + }); + var ok=true; + if(!readme_version_found) { + alert("Version 'v" + version_engineersdecor + "' not found in the readme changelog."); + ok = false; + } + if(!ok) { + alert("Version data:"); + alert(" - combined_version : '" + combined_version + "'"); + alert(" - version_forge : '" + version_forge + "'"); + exit(1); + } +}; + +tasks["dist"] = function() { + function readme_history(file_path) { + var readme = fs.readfile(file_path); + if(!readme) throw new Error("Failed to load readme.md"); + readme = readme.split(/[\r]?[\n]/); + while((readme.length > 0) && readme[0].search(/^## Revision history/i)<0) readme.shift(); + while((readme.length > 0) && readme[0].trim()=="") readme.shift(); + // revision history section + if(!readme.length) throw new Error("Revision history section not found in readme"); + readme.shift(); + var end_of_history = readme.length; + for(var i=0; i= 0) { end_of_history=i; break; } + if(end_of_history >= readme.length) throw new Error("Could not find the end-of-history header marker."); + // remove empty lines, splitters + while(readme.length >= end_of_history) readme.pop(); + while((readme.length >0) && (readme[readme.length-1].replace(/[\s-]/g,"")=="")) readme.pop(); + + const min_indent = readme + .map(function(s){return s.search(/[^\s]/)}) + .filter(function(e){return e>=0}) + .reduce(function(acc,e){return (e 1) { + for(var i in readme) { readme[i] = readme[i].substr(min_indent-2); } + } + return readme.join("\n"); + } + const html = "

\n" + (readme_history("readme.md").replace(/&/g, "&").replace(/>/g, ">").replace(/";
+  fs.writefile("dist/revision-history.html", html);
+};
+
+tasks["update-json"] = function() {
+  const root_dir = fs.cwd();
+  function read_history() {
+    var readme = fs.readfile(root_dir + "/readme.md");
+    if(!readme) throw new Error("Failed to load readme.md");
+    readme = readme.split(/[\r]?[\n]/);
+    while((readme.length > 0) && readme[0].search(/^## Revision history/i)<0) readme.shift();
+    // revision history section
+    if(!readme.length) throw new Error("Revision history section not found in readme");
+    readme.shift();
+    var end_of_history = readme.length;
+    for(var i=0; i= 0) { end_of_history=i; break; }
+    if(end_of_history >= readme.length) throw new Error("Could not find the end-of-history header marker.");
+    // remove empty lines, splitters
+    while(readme.length >= end_of_history) readme.pop();
+    for(var i in readme) readme[i] = readme[i].replace(/[\s]+$/g,"").replace(/[\t]/g,"  ");
+    readme = readme.filter(function(a){return a.replace(/[\s-]+/g,"")!="";});
+    // condense multilines to single line entries for each fix or feature. ([A] ... [M] ...)
+    for(var i=readme.length-1; i>0; --i) {
+      var line = readme[i].replace(/^\s+/,"");
+      if(line.search(/^[\[\-]/) < 0) {
+        readme[i-1] += " " + line;
+        readme[i] = "";
+      }
+    }
+    readme = readme.filter(function(a){return a!="";});
+    // Condense log entries sepatated with newlines to one line for each version
+    for(var i=readme.length-1; i>0; --i) {
+      var line = readme[i].replace(/^\s+/,"");
+      if(line.search(/^-/) < 0) {
+        readme[i-1] += "\n" + line;
+        readme[i] = "";
+      }
+    }
+    readme = readme.filter(function(a){return a!="";});
+    // Separate versions.
+    var history = {};
+    for(var i in readme) {
+      var line = readme[i].replace(/^[\sv-]+/g,"").trim();
+      var ver = line.substr(0, line.search(" ")).trim().toLowerCase();
+      var txt = line.substr(line.search(" ")).trim();
+      if(history[ver] !== undefined) throw new Error("Double definition of version '" + ver + "' in the readme revision history.");
+      history[ver] = txt;
+    }
+    return history;
+  }
+  var history = read_history();
+  var latest_release = "";
+  var latest_beta = "";
+  for(var ver in history) { latest_beta=ver; break; }
+  for(var ver in history) if(ver.search(/(rc|b|a)/) < 0) { latest_release=ver; break; }
+  var update_json = {
+    homepage: "https://www.curseforge.com/minecraft/mc-mods/engineers-decor/",
+    "1.13.2": history,
+    promos: {
+      "1.13.2-recommended": latest_release,
+      "1.13.2-latest": latest_beta,
+    }
+  }
+  fs.mkdir(root_dir + "/meta");
+  fs.writefile(root_dir + "/meta/update.json", JSON.stringify(update_json, null, 2));
+};
+
+const task_name = sys.args[0];
+if((task_name===undefined) || (tasks[task_name])===undefined) {
+  alert("No task ", task_name);
+  exit(1);
+} else {
+  tasks[task_name]();
+}
diff --git a/Makefile b/Makefile
index 4594403..cec0991 100644
--- a/Makefile
+++ b/Makefile
@@ -13,93 +13,37 @@
 # For image stripping install imagemagick and
 # also put the "magick" executable in the PATH.
 #
-MOD_JAR_PREFIX=engineersdecor-
-MOD_JAR=$(filter-out %-sources.jar,$(wildcard build/libs/${MOD_JAR_PREFIX}*.jar))
+.PHONY: default init clean clean-all dist sync-main-repo sanatize update-json
+.PHONY: init-1.12 clean-1.12 clean-all-1.12 dist-1.12 sanatize-1.12
+.PHONY: init-1.13 clean-1.13 clean-all-1.13 dist-1.13 sanatize-1.13
 
-ifeq ($(OS),Windows_NT)
-GRADLE=gradlew.bat --no-daemon
-GRADLE_STOP=gradlew.bat --stop
-INSTALL_DIR=$(realpath ${APPDATA}/.minecraft)
-SERVER_INSTALL_DIR=$(realpath ${APPDATA}/minecraft-server-forge-1.12.2-14.23.5.2768)
-DJS=djs
-else
-GRADLE=./gradlew --no-daemon
-GRADLE_STOP=./gradlew --stop
-INSTALL_DIR=~/.minecraft
-SERVER_INSTALL_DIR=~/.minecraft-server-forge-1.12.2-14.23.5.2768
-DJS=djs
-endif
+default:	;	@echo "(You are not in a MC specific version directory)"
+clean: clean-1.12 clean-1.13
+clean-all: clean-all-1.13
+init: init-1.12 init-1.13
 
-wildcardr=$(foreach d,$(wildcard $1*),$(call wildcardr,$d/,$2) $(filter $(subst *,%,$2),$d))
+clean-1.12: 		; -@cd 1.12; make -s clean
+clean-1.13: 		; -@cd 1.13; make -s clean
+clean-all-1.12: ;	-@cd 1.12; make -s clean-all
+clean-all-1.13: ;	-@cd 1.13; make -s clean-all
+init-1.12:			; -@cd 1.12; make -s init
+init-1.13:			; -@cd 1.13; make -s init
+dist-1.12:			; @cd 1.12; make -s dist
+dist-1.13:			; @cd 1.13; make -s dist
+dist: dist-1.12 dist-1.13 | update-json
 
-#
-# Targets
-#
-.PHONY: default mod init clean clean-all all run install sanatize dist-check dist start-server sync-main-repo
-
-default: mod
-
-all: clean clean-all mod | install
-
-mod:
-	@echo "Building mod using gradle ..."
-	@$(GRADLE) build $(GRADLE_OPTS)
-
-clean:
-	@echo "Cleaning ..."
-	@rm -f build/libs/*
-	@$(GRADLE) clean
-
-clean-all: clean
-	@echo "Cleaning using gradle ..."
-	@rm -f dist/*
-	@$(GRADLE) clean cleanCache
-
-init:
-	@echo "Initialising eclipse workspace using gradle ..."
-	@$(GRADLE) setupDecompWorkspace
-
-run:
-	@echo "Running client ..."
-	@$(GRADLE) runClient
-
-install: $(MOD_JAR) |
-	@sleep 2s
-	@if [ ! -d "$(INSTALL_DIR)" ]; then echo "Cannot find installation minecraft directory."; false; fi
-	@echo "Installing '$(MOD_JAR)' to '$(INSTALL_DIR)/mods' ..."
-	@[ -d "$(INSTALL_DIR)/mods" ] || mkdir "$(INSTALL_DIR)/mods"
-	@rm -f "$(INSTALL_DIR)/mods/${MOD_JAR_PREFIX}"*.jar
-	@cp -f "$(MOD_JAR)" "$(INSTALL_DIR)/mods/"
-	@echo "Installing '$(MOD_JAR)' to '$(SERVER_INSTALL_DIR)/mods' ..."
-	@rm -f "$(SERVER_INSTALL_DIR)/mods/${MOD_JAR_PREFIX}"*.jar
-	@[ -d "$(SERVER_INSTALL_DIR)/mods" ] && cp -f "$(MOD_JAR)" "$(SERVER_INSTALL_DIR)/mods/"
-
-start-server: install
-	@echo "Starting local dedicated server ..."
-	@cd "$(SERVER_INSTALL_DIR)" && java -jar forge-1.12.2-14.23.5.2768-universal.jar nogui
+update-json:
+	@echo "[main] Update update.json ..."
+	@djs tasks.js update-json
 
 sanatize:
-	@echo "Running sanatising tasks ..."
-	@djs scripts/sanatize-trailing-whitespaces.js
-	@djs scripts/sanatize-tabs-to-spaces.js
-	@djs scripts/sanatize-sync-languages.js
-	@djs scripts/sanatize-version-check.js
-	@djs scripts/task-update-json.js
-	@git status -s
-
-dist-check:
-	@echo "Running dist checks ..."
-	@djs scripts/sanatize-dist-check.js
-
-dist: sanatize dist-check clean-all mod
-	@echo "Distribution files ..."
-	@mkdir -p dist
-	@cp build/libs/$(MOD_JAR_PREFIX)* dist/
-	@djs scripts/task-dist.js
+	@cd 1.12; make -s sanatize
+	@cd 1.13; make -s sanatize
+	@make -s update-json
 
 # For reviewers: I am using a local repository for experimental changes,
 # this target copies the local working tree to the location of the
 # repository that you cloned.
-sync-main-repo: sanatize
-	@echo "Synchronising to github repository working tree ..."
-	@djs scripts/sync-main-repo.js
+sync-main-repo: sanatize update-json
+	@echo "[main] Synchronising to github repository working tree ..."
+	@djs tasks.js sync-main-repository
diff --git a/credits.md b/credits.md
index 14493f4..cb49019 100644
--- a/credits.md
+++ b/credits.md
@@ -11,3 +11,8 @@ Mod components derived/inspired by IE:
 
   - Style color scheme of treated wood/steel/concrete to match IE color scheme.
   - Recipe _constants.json file (for using IE items as ingredients)
+
+IE components referenced in this mod:
+
+  - immersiveengineering:textures/block/stone_decoration_concrete.png (for IE
+    concrete wall).
diff --git a/meta/update.json b/meta/update.json
index 3e4df43..c8558cd 100644
--- a/meta/update.json
+++ b/meta/update.json
@@ -7,8 +7,13 @@
     "1.0.0-b2": "[A] Added rebar concrete (steel reinforced, expensive, creeper-proof).",
     "1.0.0-b1": "[A] Initial structure.\n[A] Added clinker bricks and clinker brick stairs.\n[A] Added slag bricks and slag brick stairs.\n[A] Added metal rung ladder.\n[A] Added staggered metal steps ladder.\n[A] Added treated wood ladder.\n[A] Added treated wood pole.\n[A] Added treated wood table."
   },
+  "1.13.2": {
+    "1.0.0-a1": "[A] Initial port to 1.13.2 with Forge beta."
+  },
   "promos": {
     "1.12.2-recommended": "1.0.0",
-    "1.12.2-latest": "1.0.0"
+    "1.12.2-latest": "1.0.0",
+    "1.13.2-recommended": "",
+    "1.13.2-latest": "1.0.0-a1"
   }
 }
\ No newline at end of file
diff --git a/readme.md b/readme.md
index 2c045f4..ad50f75 100644
--- a/readme.md
+++ b/readme.md
@@ -7,6 +7,13 @@ for the Engineer's factory, workshop, and home.
 
 ![](documentation/engineers-decor-v100a-summary.png)
 
+### Distribution file download
+
+Main distribution channel for this mod is CurseForge:
+
+  - Release/beta versions: https://www.curseforge.com/minecraft/mc-mods/engineers-decor/files
+  - All versions: https://minecraft.curseforge.com/projects/engineers-decor/files
+
 ----
 ### Details
 
@@ -73,26 +80,15 @@ More to come slowly but steadily.
 ----
 ## Revision history
 
-                -------------------------------------------------------------------
-    - v1.0.0    [R] Release based on v1.0.0-b4
-                -------------------------------------------------------------------
+Mod versions are tracked in the readme files for individual Minecraft versions, and
+of course in the commits of this repository. Beta and release versions that are
+distributed as compiled `jar`s are tagged accordingly. Release versions are merged
+into the `master` branch, while beta/alpha version tags link to `develop` branch
+commits.
 
-    - v1.0.0-b4 [F] Fixed vanished recipe for the rebar concrete wall.
-                [A] Concrete wall, material: IE concrete.
+  - [1.12](1.12/readme.md)
 
-    - v1.0.0-b3 [A] Textures of rebar concrete and treated wood table improved.
-                [A] Added rebar concrete wall.
-
-    - v1.0.0-b2 [A] Added rebar concrete (steel reinforced, expensive, creeper-proof).
-
-    - v1.0.0-b1 [A] Initial structure.
-                [A] Added clinker bricks and clinker brick stairs.
-                [A] Added slag bricks and slag brick stairs.
-                [A] Added metal rung ladder.
-                [A] Added staggered metal steps ladder.
-                [A] Added treated wood ladder.
-                [A] Added treated wood pole.
-                [A] Added treated wood table.
+  - [1.13](1.13/readme.md)
 
 ### Community references
 
diff --git a/scripts/sanatize-dist-check.js b/scripts/sanatize-dist-check.js
deleted file mode 100644
index bdb67ef..0000000
--- a/scripts/sanatize-dist-check.js
+++ /dev/null
@@ -1,40 +0,0 @@
-#!/usr/bin/djs
-if((!fs.chdir(fs.dirname(fs.realpath(sys.script))+"/..")) || (!fs.isdir(".git"))) throw new Error("Failed to switch to mod source directory.");
-
-const uncommitted_changes = sys.shell("git status -s").trim();
-
-const gittags = sys.shell('git log -1 --format="%D"')
-                .replace(/[\s]/g,"").split(",")
-                .filter(function(s){ return s.indexOf("tag:")==0;})
-                .map(function(s){ return s.replace(/^tag:/,"");});
-
-const version_engineersdecor = fs.readfile("gradle.properties", function(line){
-  if(line.trim().indexOf("version_engineersdecor")!=0) return false;
-  return line.replace(/^.*?=/,"").trim()
-}).trim();
-
-const git_remote = sys.shell("git remote -v").trim();
-const git_branch = sys.shell("git rev-parse --abbrev-ref HEAD").trim();
-const git_diff = sys.shell("git diff").trim();
-var fails = [];
-
-if(version_engineersdecor=="") fails.push("Could not determine 'version_engineersdecor' from gradle properties.");
-if(!gittags.length) fails.push("Version not tagged.");
-if(!gittags.filter(function(s){return s.indexOf(version_engineersdecor.replace(/[-]/g,""))>=0}).length) fails.push("No tag version not found matching the gradle properties version.");
-if(git_remote.replace(/[\s]/g,"").indexOf("git@github.com:stfwi/engineers-decor.git(push)") < 0) fails.push("Not the reference repository.");
-if((git_branch != "develop") && (git_branch != "master")) {
-  fails.push("No valid branch for dist. (branch:'"+git_branch+"')");
-} else if((git_branch == "develop") && (version_engineersdecor.replace(/[^\w\.-]/g,"")=="")) {
-  fails.push("Cannot make release dist on develop branch.");
-} else if((git_branch == "master") && (version_engineersdecor.replace(/[^\w\.-]/g,"")!="")) {
-  fails.push("Cannot make beta dist on master branch.");
-}
-if(git_diff !== "") fails.push("Not everything committed to the GIT repository.");
-if((!fs.isfile("signing.jks")) || (!fs.isfile("signing.properties"))) fails.push("Jar signing files missing.");
-
-if(fails.length>0) {
-  for(var i in fails) fails[i] = "  - " + fails[i];
-  alert("Dist check failed");
-  alert(fails.join("\n")+"\n");
-  exit(1);
-}
diff --git a/scripts/sanatize-sync-languages.js b/scripts/sanatize-sync-languages.js
deleted file mode 100644
index 3390036..0000000
--- a/scripts/sanatize-sync-languages.js
+++ /dev/null
@@ -1,122 +0,0 @@
-#!/usr/bin/djs
-if((!fs.chdir(fs.dirname(fs.realpath(sys.script))+"/..")) || (!fs.isdir("src"))) throw new Error("Failed to switch to mod source directory.");
-
-function load() {
-  var lang_data = {};
-  fs.find("./src/main/resources/assets/engineersdecor/lang", '*.lang', function(f){
-    var lang_code = fs.basename(f).replace(/\..*$/,"").trim().toLowerCase();
-    var lines = fs.readfile(f).trim().split("\n");
-    var was_eol_escape = false;
-    for(var i in lines) {
-      if(was_eol_escape) {
-        var k=0;
-        for(k=i-1; k>=0; --k) {
-          if(lines[k] != null) {
-            lines[k] += "\n" + lines[i];
-            break;
-          }
-        }
-        was_eol_escape = lines[i].match(/[^\\][\\]$/) != null;
-        lines[i] = null;
-      } else {
-        lines[i] = lines[i].trim();
-        was_eol_escape = lines[i].match(/[^\\][\\]$/) != null;
-      }
-    }
-    lang_data[lang_code] = lines.filter(function(l){return (l!==null);});
-    return false;
-  });
-  return lang_data;
-}
-
-function reference_content(lang_data, reflang_code) {
-  var lang_lines = [];
-  for(var i in lang_data[reflang_code]) {
-    var txt = lang_data[reflang_code][i].trim();
-    if((txt.search(/^#/)>=0) || (txt.search("=")<0)) { lang_lines.push(txt); continue; }; // comment "#" or empty line in the ref lang file
-    var kv = txt.split("=", 2);
-    var key = kv[0].trim();
-    var val = kv[1].trim();
-    var o = {key:key, tr:{}};
-    o.tr[reflang_code] = val;
-    lang_lines.push(o);
-  }
-  delete lang_data[reflang_code];
-  return lang_lines;
-}
-
-function add_language(lang_lines, lang_name, lang_data) {
-  const find_line = function(lines, key) {
-    for(var i in lines) {
-      if((typeof(lines[i]) !== "object")) continue;
-      if(lines[i].key.toLowerCase()==key.toLowerCase()) return i;
-    }
-    return -1;
-  };
-  for(var i in lang_data) {
-    var txt = lang_data[i].trim();
-    if(txt.search(/^#/)>=0) continue;
-    if(txt.search("=")<0) continue;
-    var kv = txt.split("=", 2);
-    var key = kv[0].trim();
-    var val = kv[1].trim();
-    var line_i = find_line(lang_lines, key);
-    if(line_i >= 0) {
-      lang_data[i] = undefined;
-      lang_lines[line_i].tr[lang_name] = val;
-    }
-  }
-  return lang_data;
-}
-
-function complete_lang_lines(lang_lines, lang_names, reflang_code) {
-  var lang_outputs = {};
-  for(var i in lang_names) lang_outputs[lang_names[i]] = [];
-  for(var i_line in lang_lines) {
-    var entry = lang_lines[i_line];
-    if(typeof(entry) !== "object") {
-      for(var i in lang_names) lang_outputs[lang_names[i]].push(entry);
-    } else {
-      for(var i in lang_names) {
-        var name = lang_names[i];
-        if(entry.tr[name] !== undefined) {
-          lang_outputs[name].push(entry.key + "=" + entry.tr[name]);
-        } else {
-          var added = entry.key + "=" + entry.tr[reflang_code];
-          if((entry.key.search(/\.tip$/)>0) || (entry.key.search(/\.help$/)>0)) added = "#" + added;
-          lang_outputs[name].push(added);
-          if(added.search(/^#/)<0) print("[warn] Lang: Added default language for missing entry in " + name + ": '" + added + "'");
-        }
-      }
-    }
-  }
-  return lang_outputs;
-}
-
-const reflang_code = "en_us";
-var lang_data = load();
-var lang_names = Object.keys(lang_data);
-var lang_lines = reference_content(lang_data, reflang_code);
-for(var lang_name in lang_data) {
-  lang_data[lang_name] = add_language(lang_lines, lang_name, lang_data[lang_name]);
-  lang_data[lang_name] = lang_data[lang_name].filter(function(l){ return !!l; });
-  if(lang_data[lang_name].length == 0) delete lang_data[lang_name];
-}
-var output_data = complete_lang_lines(lang_lines, lang_names, reflang_code);
-for(var i in output_data) output_data[i] = output_data[i].join("\n") + "\n\n";
-
-// Remaining lines in lang files (not in the reference lang file)
-for(var lang_name in lang_data) {
-  for(var i in lang_data[lang_name]) {
-    if(lang_data[lang_name][i].search(/^#/)<0) {
-      var added = "# " + lang_data[lang_name][i].replace(/^[#\s]+/,"");
-      output_data[lang_name] += added + "\n";
-      print("[warn] Lang: Commented out unknown key in " + lang_name + ": '" + added + "'");
-    }
-  }
-}
-for(var name in output_data) output_data[name] = output_data[name].trim() + "\n";
-
-for(var name in output_data) {
-  fs.writefile("./src/main/resources/assets/engineersdecor/lang/" + name + ".lang", output_data[name]);
-}
diff --git a/scripts/sanatize-tabs-to-spaces.js b/scripts/sanatize-tabs-to-spaces.js
deleted file mode 100644
index 1bb65a8..0000000
--- a/scripts/sanatize-tabs-to-spaces.js
+++ /dev/null
@@ -1,25 +0,0 @@
-#!/usr/bin/djs
-if((!fs.chdir(fs.dirname(fs.realpath(sys.script))+"/..")) || (!fs.isdir("src"))) throw new Error("Failed to switch to mod source directory.");
-
-var file_list = (function() {
-  var ls = [];
-  const ext = ['java','lang'];
-  for(var i in ext) ls = ls.concat(fs.find("./src", '*.'+ext[i]));
-  for(var i in ls) ls[i] = ls[i].replace(/\\/g,"/");
-  ls.sort();
-  ls.push("readme.md");
-  return ls;
-})();
-
-for(var file_i in file_list) {
-  var file = file_list[file_i];
-  var txt = fs.readfile(file);
-  if(txt===undefined) throw new Error("Failed to read '" + file + "'");
-  const txt_length = txt.length;
-  txt = txt.replace(/[\t]/g,"  ");
-  const n = txt.length - txt_length;
-  if(n > 0) {
-    print("File '" + file + "': Changed " + n + " tabs to 2 spaces." );
-    fs.writefile(file, txt);
-  }
-}
diff --git a/scripts/sanatize-trailing-whitespaces.js b/scripts/sanatize-trailing-whitespaces.js
deleted file mode 100644
index ee683d8..0000000
--- a/scripts/sanatize-trailing-whitespaces.js
+++ /dev/null
@@ -1,25 +0,0 @@
-#!/usr/bin/djs
-if((!fs.chdir(fs.dirname(fs.realpath(sys.script))+"/..")) || (!fs.isdir("src"))) throw new Error("Failed to switch to mod source directory.");
-
-var file_list = (function() {
-  var ls = [];
-  const ext = ['java','json','lang'];
-  for(var i in ext) ls = ls.concat(fs.find("./src", '*.'+ext[i]));
-  for(var i in ls) ls[i] = ls[i].replace(/\\/g,"/");
-  ls.sort();
-  ls.push("readme.md");
-  return ls;
-})();
-
-for(var file_i in file_list) {
-  var file = file_list[file_i];
-  var txt = fs.readfile(file);
-  if(txt===undefined) throw new Error("Failed to read '" + file + "'");
-  const txt_length = txt.length;
-  txt = txt.replace(/[\r\t ]+[\n]/g,"\n");
-  const n = txt_length - txt.length;
-  if(n > 0) {
-    print("File '" + file + "': Fixed " + n + " lines with trailing whitespaces." );
-    fs.writefile(file, txt);
-  }
-}
diff --git a/scripts/sanatize-version-check.js b/scripts/sanatize-version-check.js
deleted file mode 100644
index 975a02f..0000000
--- a/scripts/sanatize-version-check.js
+++ /dev/null
@@ -1,42 +0,0 @@
-#!/usr/bin/djs
-"use strict";
-
-if((!fs.chdir(fs.dirname(fs.realpath(sys.script))+"/..")) || (!fs.isdir("src"))) throw new Error("Failed to switch to mod base directory.");
-
-var version_minecraft="";
-var version_forge="";
-var version_engineersdecor="";
-
-fs.readfile("gradle.properties", function(line){
-  if(line.search(/^[\s]*version_minecraft[\s]*=/i) >= 0) {
-    version_minecraft = line.replace(/^[^=]+=/,"").trim();
-  } else if(line.search(/^[\s]*version_forge[\s]*=/i) >= 0) {
-    version_forge = line.replace(/^[^=]+=/,"").trim();
-  } else if(line.search(/^[\s]*version_engineersdecor[\s]*=/i) >= 0) {
-    version_engineersdecor = line.replace(/^[^=]+=/,"").trim();
-  }
-  return false;
-})
-
-const combined_version = version_minecraft + "-" + version_engineersdecor;
-
-var readme_version_found = fs.readfile("readme.md", function(line){
-  var m = line.match(/^[\s]+-[\s]+v([\d]+[\.][\d]+[\.][\d]+[-][abrc][\d]+)/i);
-  if((!m) || (!m.length) || (m.length < 2)) {
-    m = line.match(/^[\s]+-[\s]+v([\d]+[\.][\d]+[\.][\d]+)/i);
-    if((!m) || (!m.length) || (m.length < 2)) return false;
-  }
-  return m[1]==version_engineersdecor;
-});
-
-var ok=true;
-if(!readme_version_found) {
-  alert("Version 'v" + version_engineersdecor + "' not found in the readme changelog.");
-  ok = false;
-}
-if(!ok) {
-  alert("Version data:");
-  alert(" - combined_version  : '" + combined_version + "'");
-  alert(" - version_forge     : '" + version_forge + "'");
-  exit(1);
-}
diff --git a/scripts/sync-main-repo.js b/scripts/sync-main-repo.js
deleted file mode 100644
index 5144f5d..0000000
--- a/scripts/sync-main-repo.js
+++ /dev/null
@@ -1,16 +0,0 @@
-#!/usr/bin/djs
-"use strict";
-const main_repo_local = fs.realpath("../engineersdecor-github");
-if((!fs.chdir(fs.dirname(fs.realpath(sys.script))+"/..")) || (!fs.isdir(".git"))) throw new Error("Failed to switch to mod source directory.");
-const test_repo_local = fs.cwd();
-if(main_repo_local == "") throw new Error("Main repository (real) path not found.");
-if(fs.realpath(main_repo_local) == fs.realpath(test_repo_local)) throw new Error("This is already the main repository");
-if((!fs.chdir(main_repo_local)) || (!fs.isdir(".git"))) throw new Error("Failed to switch to main repository directory.");
-if(fs.cwd().search("-github") < 0) throw new Error("Main repository is missing the '*-github' tag in the path name.");
-sys.shell("rm -rf build documentation gradle meta scripts src")
-sys.shell("rm -f .gitignore build.gradle gradle.properties gradlew gradlew.bat license Makefile readme.md")
-if((!fs.chdir(test_repo_local)) || (!fs.isdir(".git"))) throw new Error("Failed to switch to local dev directory.");
-sys.shell("cp -r documentation gradle meta scripts src " + main_repo_local + "/")
-sys.shell("cp .gitignore build.gradle gradle.properties gradlew gradlew.bat license Makefile readme.md " + main_repo_local + "/")
-if((!fs.chdir(main_repo_local)) || (!fs.isdir(".git"))) throw new Error("Failed to switch to main repository directory.");
-print(sys.shell("git status -s"))
diff --git a/scripts/task-dist.js b/scripts/task-dist.js
deleted file mode 100644
index 6af7d72..0000000
--- a/scripts/task-dist.js
+++ /dev/null
@@ -1,33 +0,0 @@
-#!/usr/bin/djs
-"use strict";
-if((!fs.chdir(fs.dirname(fs.realpath(sys.script))+"/..")) || (!fs.isdir(".git"))) throw new Error("Failed to switch to mod source directory.");
-
-function readme_history(file_path) {
-  var readme = fs.readfile(file_path);
-  if(!readme) throw new Error("Failed to load readme.md");
-  readme = readme.split(/[\r]?[\n]/);
-  while((readme.length > 0) && readme[0].search(/^## Revision history/i)<0) readme.shift();
-  while((readme.length > 0) && readme[0].trim()=="") readme.shift();
-  // revision history section
-  if(!readme.length) throw new Error("Revision history section not found in readme");
-  readme.shift();
-  var end_of_history = readme.length;
-  for(var i=0; i= 0) { end_of_history=i; break; }
-  if(end_of_history >= readme.length) throw new Error("Could not find the end-of-history header marker.");
-  // remove empty lines, splitters
-  while(readme.length >= end_of_history) readme.pop();
-  while((readme.length >0) && (readme[readme.length-1].replace(/[\s-]/g,"")=="")) readme.pop();
-
-  const min_indent = readme
-    .map(function(s){return s.search(/[^\s]/)})
-    .filter(function(e){return e>=0})
-    .reduce(function(acc,e){return (e 1) {
-    for(var i in readme) { readme[i] = readme[i].substr(min_indent-2); }
-  }
-  return readme.join("\n");
-}
-
-const html = "
\n" + (readme_history("readme.md").replace(/&/g, "&").replace(/>/g, ">").replace(/";
-fs.writefile("dist/revision-history.html", html);
diff --git a/scripts/task-update-json.js b/scripts/task-update-json.js
deleted file mode 100644
index 9923852..0000000
--- a/scripts/task-update-json.js
+++ /dev/null
@@ -1,65 +0,0 @@
-#!/usr/bin/djs
-"use strict";
-const root_dir = fs.realpath(fs.dirname(sys.script)+"/..");
-
-function read_history() {
-  var readme = fs.readfile(root_dir + "/readme.md");
-  if(!readme) throw new Error("Failed to load readme.md");
-  readme = readme.split(/[\r]?[\n]/);
-  while((readme.length > 0) && readme[0].search(/^## Revision history/i)<0) readme.shift();
-  // revision history section
-  if(!readme.length) throw new Error("Revision history section not found in readme");
-  readme.shift();
-  var end_of_history = readme.length;
-  for(var i=0; i= 0) { end_of_history=i; break; }
-  if(end_of_history >= readme.length) throw new Error("Could not find the end-of-history header marker.");
-  // remove empty lines, splitters
-  while(readme.length >= end_of_history) readme.pop();
-  for(var i in readme) readme[i] = readme[i].replace(/[\s]+$/g,"").replace(/[\t]/g,"  ");
-  readme = readme.filter(function(a){return a.replace(/[\s-]+/g,"")!="";});
-  // condense multilines to single line entries for each fix or feature. ([A] ... [M] ...)
-  for(var i=readme.length-1; i>0; --i) {
-    var line = readme[i].replace(/^\s+/,"");
-    if(line.search(/^[\[\-]/) < 0) {
-      readme[i-1] += " " + line;
-      readme[i] = "";
-    }
-  }
-  readme = readme.filter(function(a){return a!="";});
-  // Condense log entries sepatated with newlines to one line for each version
-  for(var i=readme.length-1; i>0; --i) {
-    var line = readme[i].replace(/^\s+/,"");
-    if(line.search(/^-/) < 0) {
-      readme[i-1] += "\n" + line;
-      readme[i] = "";
-    }
-  }
-  readme = readme.filter(function(a){return a!="";});
-  // Separate versions.
-  var history = {};
-  for(var i in readme) {
-    var line = readme[i].replace(/^[\sv-]+/g,"").trim();
-    var ver = line.substr(0, line.search(" ")).trim().toLowerCase();
-    var txt = line.substr(line.search(" ")).trim();
-    if(history[ver] !== undefined) throw new Error("Double definition of version '" + ver + "' in the readme revision history.");
-    history[ver] = txt;
-  }
-  return history;
-}
-
-var history = read_history();
-var latest_release = "";
-var latest_beta = "";
-for(var ver in history) { latest_beta=ver; break; }
-for(var ver in history) if(ver.search(/(rc|b|a)/) < 0) { latest_release=ver; break; }
-
-var update_json = {
-  homepage: "https://www.curseforge.com/minecraft/mc-mods/engineers-decor/",
-  "1.12.2": history,
-  promos: {
-    "1.12.2-recommended": latest_release,
-    "1.12.2-latest": latest_beta,
-  }
-}
-
-fs.writefile(root_dir + "/meta/update.json", JSON.stringify(update_json, null, 2));
diff --git a/tasks.js b/tasks.js
new file mode 100644
index 0000000..95bd238
--- /dev/null
+++ b/tasks.js
@@ -0,0 +1,50 @@
+"use strict";
+const main_repo_local = fs.realpath("../engineersdecor-github");
+if(!fs.chdir(fs.dirname(fs.realpath(sys.script)))) throw new Error("Failed to switch to mod repository base directory.");
+if(!fs.isdir(".git")) throw new Error("Missing git repository in mod repository base directory.");
+var tasks = {};
+
+tasks["update-json"] = function() {
+  const root_dir = fs.realpath(fs.dirname(sys.script));
+  var update_jsons = {
+    "1.12.2": JSON.parse(fs.readfile(root_dir + "/1.12/meta/update.json")),
+    "1.13.2": JSON.parse(fs.readfile(root_dir + "/1.13/meta/update.json"))
+  };
+  var update_json = {
+    homepage: "https://www.curseforge.com/minecraft/mc-mods/engineers-decor/",
+    "1.12.2": update_jsons["1.12.2"]["1.12.2"],
+    "1.13.2": update_jsons["1.13.2"]["1.13.2"],
+    promos: {
+      "1.12.2-recommended": update_jsons["1.12.2"]["promos"]["1.12.2-recommended"],
+      "1.12.2-latest": update_jsons["1.12.2"]["promos"]["1.12.2-latest"],
+      "1.13.2-recommended": update_jsons["1.13.2"]["promos"]["1.13.2-recommended"],
+      "1.13.2-latest": update_jsons["1.13.2"]["promos"]["1.13.2-latest"],
+    }
+  }
+  fs.mkdir(root_dir + "/meta");
+  fs.writefile(root_dir + "/meta/update.json", JSON.stringify(update_json, null, 2));
+};
+
+tasks["sync-main-repository"] = function() {
+  if((!fs.chdir(fs.dirname(fs.realpath(sys.script))+"/..")) || (!fs.isdir(".git"))) throw new Error("Failed to switch to mod source directory.");
+  const test_repo_local = fs.cwd();
+  if(main_repo_local == "") throw new Error("Main repository (real) path not found.");
+  if(fs.realpath(main_repo_local) == fs.realpath(test_repo_local)) throw new Error("This is already the main repository");
+  if((!fs.chdir(main_repo_local)) || (!fs.isdir(".git"))) throw new Error("Failed to switch to main repository directory.");
+  if(fs.cwd().search("-github") < 0) throw new Error("Main repository is missing the '*-github' tag in the path name.");
+  // sys.shell("rm -rf build documentation gradle meta scripts src")
+  // sys.shell("rm -f .gitignore build.gradle gradle.properties gradlew gradlew.bat license Makefile readme.md")
+  // if((!fs.chdir(test_repo_local)) || (!fs.isdir(".git"))) throw new Error("Failed to switch to local dev directory.");
+  // sys.shell("cp -r documentation gradle meta scripts src " + main_repo_local + "/")
+  // sys.shell("cp .gitignore build.gradle gradle.properties gradlew gradlew.bat license Makefile readme.md " + main_repo_local + "/")
+  // if((!fs.chdir(main_repo_local)) || (!fs.isdir(".git"))) throw new Error("Failed to switch to main repository directory.");
+  // print(sys.shell("git status -s"))
+};
+
+const task_name = sys.args[0];
+if((task_name===undefined) || (tasks[task_name])===undefined) {
+  alert("No task ", task_name);
+  exit(1);
+} else {
+  tasks[task_name]();
+}