From 50ab8ad5c706630930d5e83712c5d566aa7a2dde Mon Sep 17 00:00:00 2001 From: NotMyFault Date: Fri, 23 Jul 2021 17:48:51 +0200 Subject: [PATCH] Feature/propagate diff and object cleanup (#1190) * Feature/main/propagate diff annotations (#1187) * 25% done * More work * More work * 50% * More work * 75% * 100% & cleanup * Update adapters * Squish squash, applesauce commit 275ba9bd8424270b513009e24123df5d158b1990 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Sat Jul 17 01:10:20 2021 +0200 Update dependency com.comphenix.protocol:ProtocolLib to v4.7.0 (#1173) Co-authored-by: Renovate Bot commit 9fd898480419ebe7c57e59caf56b8cf34fef0aae Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Sat Jul 17 01:09:29 2021 +0200 Update dependency org.checkerframework:checker-qual to v3.16.0 (#1184) Co-authored-by: Renovate Bot commit 861fb45e5c8d3c82a0d9fdb270f8ebe3ebbafac4 Author: dordsor21 Date: Fri Jul 16 19:07:02 2021 +0100 Fix #1075 commit 420c45a29ac8a2cdd0110e9a9b225abf9e726a26 Author: dordsor21 Date: Fri Jul 16 18:48:21 2021 +0100 Entity removal should be on the main thread as we're just passing through rather than doing chunk operations - Fixes #1164 - Not working: butcher/remove history commit 4d4db7dcd0c2ce99d59c32072247f0fc61fd27f6 Author: SirYwell Date: Fri Jul 16 17:52:44 2021 +0200 Make sure leaves category is loaded for heightmaps (fixes #1176) commit c98f6e4f37e256133bdee5179cb1c319d8c2c203 Author: dordsor21 Date: Fri Jul 16 10:44:52 2021 +0100 Do not allow generation commands to generate outside selection commit 2485f5eccc875faff9730b5107e2559612042bad Author: dordsor21 Date: Fri Jul 16 10:43:15 2021 +0100 EditSession needs to override some Extent methods to ensure block changes are correctly set through the various extents Fixes #1152 commit d9418ec8aefaa3f843f61babf87c40e01502a9e1 Author: dordsor21 Date: Fri Jul 16 09:52:44 2021 +0100 Undo part of 41073bb1a0f73c58308cad13c9206ca16ed67831 Fixes #1178 * Update Upstream fb1fb84 Fixed typo and grammar * We don't support custom heights yet * Casing inconsistency * Address a few comments * Address comments * Don't refactor to AP classpath * Document annotation style * Refactoring & shade cleanup * Address a few comments * More work * Resolve comments not being resolved yet * Feature/main/propagate diff annotations (#1187) (#1194) * Remove beta package, fix history packages, move classes out of object package * Resolve comments not being resolved yet * Remove beta package, fix history packages, move classes out of object package Co-authored-by: NotMyFault * brushes should be under brush * More refactoring - Filters/processors should be in the same place and are related to extents - Transforms are in `extent.transform` in upstream * Move history classes under history * Update adapters Co-authored-by: dordsor21 --- CONTRIBUTING.md | 25 +- worldedit-bukkit/build.gradle.kts | 9 + .../fastasyncworldedit/bukkit/FaweBukkit.java | 6 +- .../bukkit/adapter/BukkitQueueHandler.java | 2 +- .../adapter/IDelegateBukkitImplAdapter.java | 3 +- .../bukkit/adapter/MapChunkUtil.java | 2 +- .../bukkit/adapter/NMSAdapter.java | 4 +- .../bukkit/adapter/NMSRelighterFactory.java | 12 +- .../bukkit/adapter/Regenerator.java | 6 +- .../bukkit/filter/GriefDefenderFilter.java | 2 +- .../bukkit/filter/GriefPreventionFilter.java | 2 +- .../bukkit/filter/WorldGuardFilter.java | 2 +- .../bukkit/listener/BrushListener.java | 6 +- .../bukkit/regions/GriefDefenderFeature.java | 2 +- .../regions/GriefPreventionFeature.java | 2 +- .../bukkit/regions/WorldGuardFeature.java | 4 +- .../FaweDelegateRegionManager.java | 2 +- .../FaweDelegateSchematicHandler.java | 18 +- .../plotsquared/FaweQueueCoordinator.java | 6 +- .../regions/plotsquared/PlotRegionFilter.java | 2 +- .../plotsquared/PlotSquaredFeature.java | 2 +- .../plotsquaredv4/FaweLocalBlockQueue.java | 6 +- .../plotsquaredv4/FaweSchematicHandler.java | 18 +- .../plotsquaredv4/PlotRegionFilter.java | 2 +- .../plotsquaredv4/PlotSquaredFeature.java | 4 +- .../bukkit/util/WorldUnloadedException.java | 19 - .../sk89q/worldedit/bukkit/BukkitAdapter.java | 16 +- .../worldedit/bukkit/BukkitBlockRegistry.java | 2 +- .../sk89q/worldedit/bukkit/BukkitPlayer.java | 2 +- .../bukkit/BukkitPlayerBlockBag.java | 2 +- .../bukkit/BukkitServerInterface.java | 6 +- .../sk89q/worldedit/bukkit/BukkitWorld.java | 8 +- .../worldedit/bukkit/WorldEditPlugin.java | 4 +- .../bukkit/adapter/BukkitImplAdapter.java | 18 +- .../src/main/resources/worldedit-adapters.jar | Bin 807792 -> 807467 bytes .../com/sk89q/worldedit/cli/CLIPlatform.java | 4 +- .../cli/schematic/ClipboardWorld.java | 4 +- worldedit-core/build.gradle.kts | 2 + .../worldedit/blocks/MobSpawnerBlock.java | 2 +- .../com/sk89q/worldedit/blocks/SignBlock.java | 2 +- .../sk89q/worldedit/blocks/SkullBlock.java | 2 +- .../core/FAWEPlatformAdapterImpl.java | 2 +- .../com/fastasyncworldedit/core/Fawe.java | 2 +- .../com/fastasyncworldedit/core/FaweAPI.java | 18 +- .../fastasyncworldedit/core/FaweCache.java | 24 +- .../com/fastasyncworldedit/core/IFawe.java | 4 +- .../core/beta/FilterBlockMask.java | 8 - .../core}/command/ListFilters.java | 3 +- .../core}/command/MaskCommands.java | 2 +- .../core}/command/MethodCommands.java | 2 +- .../core}/command/PatternCommands.java | 0 .../core}/command/TransformCommands.java | 0 .../brush => command/tool}/MovableTool.java | 2 +- .../tool}/ResettableTool.java | 2 +- .../brush => command/tool}/TargetMode.java | 2 +- .../tool}/brush/AngleBrush.java | 6 +- .../tool}/brush/BlendBall.java | 2 +- .../tool}/brush/BlobBrush.java | 6 +- .../tool}/brush/BrushSettings.java | 8 +- .../tool}/brush/CatenaryBrush.java | 3 +- .../tool}/brush/CircleBrush.java | 2 +- .../tool}/brush/CommandBrush.java | 2 +- .../tool}/brush/CopyPastaBrush.java | 9 +- .../tool}/brush/ErodeBrush.java | 4 +- .../tool}/brush/FallingSphere.java | 2 +- .../tool}/brush/FlattenBrush.java | 6 +- .../tool}/brush/HeightBrush.java | 10 +- .../tool}/brush/ImageBrush.java | 8 +- .../tool}/brush/InspectBrush.java | 6 +- .../tool}/brush/LayerBrush.java | 10 +- .../tool}/brush/LineBrush.java | 3 +- .../tool}/brush/PopulateSchem.java | 2 +- .../tool}/brush/RaiseBrush.java | 2 +- .../tool}/brush/RecurseBrush.java | 6 +- .../tool}/brush/RockBrush.java | 4 +- .../tool}/brush/ScatterBrush.java | 12 +- .../tool}/brush/ScatterCommand.java | 4 +- .../tool}/brush/ScatterOverlayBrush.java | 4 +- .../tool}/brush/ShatterBrush.java | 8 +- .../tool}/brush/SplatterBrush.java | 8 +- .../tool}/brush/SplineBrush.java | 9 +- .../tool}/brush/StencilBrush.java | 6 +- .../tool}/brush/SurfaceSphereBrush.java | 6 +- .../tool}/brush/SurfaceSpline.java | 6 +- .../brush => command/tool}/scroll/Scroll.java | 4 +- .../tool}/scroll/ScrollClipboard.java | 2 +- .../tool}/scroll/ScrollMask.java | 2 +- .../tool}/scroll/ScrollPattern.java | 2 +- .../tool}/scroll/ScrollRange.java | 2 +- .../tool}/scroll/ScrollSize.java | 2 +- .../tool}/scroll/ScrollTarget.java | 4 +- .../tool}/scroll/ScrollTargetOffset.java | 2 +- .../core/command/tool/scroll/ScrollTool.java | 7 + .../tool}/sweep/ClipboardSpline.java | 6 +- .../brush => command/tool}/sweep/Spline.java | 2 +- .../tool}/sweep/SweepBrush.java | 4 +- .../core/database/DBHandler.java | 2 +- .../core/database/RollbackDatabase.java | 6 +- .../core}/entity/LazyBaseEntity.java | 3 +- .../core}/entity/MapMetadatable.java | 2 +- .../core}/entity/Metadatable.java | 2 +- .../event/extent/ActorSaveClipboardEvent.java | 2 +- .../core}/event/extent/PasteEvent.java | 21 +- .../factory/DefaultTransformParser.java | 0 .../extension/factory/parser/RichParser.java | 2 +- .../parser/mask/AdjacentMaskParser.java | 8 +- .../factory/parser/mask/AngleMaskParser.java | 6 +- .../parser/mask/DefaultMaskParser.java | 22 +- .../parser/mask/ExtremaMaskParser.java | 6 +- .../factory/parser/mask/FalseMaskParser.java | 2 +- .../factory/parser/mask/LiquidMaskParser.java | 4 +- .../parser/mask/ROCAngleMaskParser.java | 6 +- .../factory/parser/mask/RadiusMaskParser.java | 6 +- .../parser/mask/RichOffsetMaskParser.java | 4 +- .../parser/mask/SimplexMaskParser.java | 6 +- .../parser/mask/SurfaceMaskParser.java | 4 +- .../factory/parser/mask/TrueMaskParser.java | 2 +- .../factory/parser/mask/WallMaskParser.java | 4 +- .../factory/parser/mask/XAxisMaskParser.java | 29 + .../factory/parser/mask/YAxisMaskParser.java | 29 + .../factory/parser/mask/ZAxisMaskParser.java | 29 + .../parser/pattern/BiomePatternParser.java | 6 +- .../parser/pattern/BufferedPatternParser.java | 6 +- .../parser/pattern/DefaultPatternParser.java | 20 +- .../parser/pattern/ExistingPatternParser.java | 4 +- .../parser/pattern/Linear2DPatternParser.java | 6 +- .../parser/pattern/Linear3DPatternParser.java | 6 +- .../parser/pattern/NoisePatternParser.java | 6 +- .../parser/pattern/PerlinPatternParser.java | 2 +- .../parser/pattern/RandomPatternParser.java | 21 +- .../RidgedMultiFractalPatternParser.java | 2 +- .../parser/pattern/SimplexPatternParser.java | 4 +- .../parser/pattern/VoronoiPatternParser.java | 2 +- .../extension/platform/binding/Binding.java | 2 +- .../extension/platform/binding/Bindings.java | 2 +- .../platform/binding/CommandBindings.java | 2 +- .../platform/binding/ConsumeBindings.java | 4 +- .../platform/binding/PrimitiveBindings.java | 2 +- .../platform/binding/ProvideBindings.java | 4 +- .../extent/BlockTranslateExtent.java | 4 +- .../extent/ExtentHeightCacher.java | 3 +- .../{object => }/extent/FaweRegionExtent.java | 6 +- .../extent/HeightBoundExtent.java | 10 +- .../{object => extent}/HistoryExtent.java | 4 +- .../extent/MemoryCheckingExtent.java | 3 +- .../extent/MultiRegionExtent.java | 8 +- .../core/{object => }/extent/NullExtent.java | 18 +- .../{object => }/extent/OffsetExtent.java | 2 +- .../core}/extent/PassthroughExtent.java | 10 +- .../extent/PositionTransformExtent.java | 6 +- .../extent/ProcessedWEExtent.java | 2 +- .../extent/RandomOffsetTransform.java | 2 +- .../{object => }/extent/ResettableExtent.java | 2 +- .../extent/SingleRegionExtent.java | 8 +- .../core/{object => }/extent/SlowExtent.java | 2 +- .../{object => }/extent/SourceMaskExtent.java | 4 +- .../{object => }/extent/StripNBTExtent.java | 2 +- .../{object => }/extent/SupplyingExtent.java | 3 +- .../{object => }/extent/TemporalExtent.java | 3 +- .../{object => }/extent/TransformExtent.java | 6 +- .../clipboard/CPUOptimizedClipboard.java | 4 +- .../clipboard/DiskOptimizedClipboard.java | 4 +- .../clipboard/EmptyClipboard.java | 4 +- .../clipboard/LazyClipboardHolder.java | 2 +- .../clipboard/LinearClipboard.java | 6 +- .../clipboard/MemoryOptimizedClipboard.java | 4 +- .../clipboard/MultiClipboardHolder.java | 2 +- .../clipboard/ReadOnlyClipboard.java | 2 +- .../clipboard/ResizableClipboardBuilder.java | 8 +- .../clipboard/SimpleClipboard.java | 2 +- .../clipboard/URIClipboardHolder.java | 2 +- .../clipboard/WorldCopyClipboard.java | 2 +- .../clipboard/io/FastSchematicReader.java | 34 +- .../clipboard/io/FastSchematicWriter.java | 26 +- .../io}/schematic/MinecraftStructure.java | 4 +- .../clipboard/io}/schematic/PNGWriter.java | 4 +- .../io}/schematic/visualizer/SchemVis.java | 2 +- .../filter/ArrayImageMask.java | 6 +- .../filter/CountFilter.java | 4 +- .../filter/DistrFilter.java | 6 +- .../filter/ForkedFilter.java | 4 +- .../filter/LinkedFilter.java | 8 +- .../filter/MaskFilter.java | 8 +- .../block/AbstractExtentFilterBlock.java | 2 +- .../filter/block/AbstractFilterBlock.java | 2 +- .../block/AbstractSingleFilterBlock.java | 2 +- .../filter/block/ArrayFilterBlock.java | 2 +- .../filter/block/CharFilterBlock.java | 16 +- .../filter/block/ChunkFilterBlock.java | 16 +- .../filter/block/DelegateFilter.java | 8 +- .../filter/block/ExtentFilterBlock.java | 2 +- .../filter/block/FilterBlock.java | 2 +- .../filter/block/SingleFilterBlock.java | 2 +- .../extent/inventory/SlottableBlockBag.java | 2 +- .../processor}/BatchProcessorHolder.java | 10 +- .../processor}/EmptyBatchProcessor.java | 10 +- .../ExtentBatchProcessorHolder.java | 6 +- .../processor}/HeightmapProcessor.java | 12 +- .../processor}/IBatchProcessorHolder.java | 10 +- .../processor}/LimitExtent.java | 12 +- .../processor}/MultiBatchProcessor.java | 12 +- .../processor}/NullProcessor.java | 10 +- .../processor}/ProcessorScope.java | 2 +- .../heightmap/AbstractDelegateHeightMap.java | 2 +- .../processor}/heightmap/ArrayHeightMap.java | 2 +- .../heightmap/AverageHeightMapFilter.java | 2 +- .../heightmap/FlatScalableHeightMap.java | 2 +- .../processor}/heightmap/HeightMap.java | 2 +- .../processor/heightmap}/HeightMapType.java | 4 +- .../heightmap/RotatableHeightMap.java | 4 +- .../heightmap/ScalableHeightMap.java | 6 +- .../processor}/lighting/NMSRelighter.java | 45 +- .../processor}/lighting/NullRelighter.java | 2 +- .../processor/lighting}/RelightMode.java | 2 +- .../processor}/lighting/RelightProcessor.java | 12 +- .../processor}/lighting/Relighter.java | 4 +- .../processor}/lighting/RelighterFactory.java | 7 +- .../transform}/Linear3DTransform.java | 3 +- .../transform}/LinearTransform.java | 3 +- .../transform}/MultiTransform.java | 3 +- .../transform}/PatternTransform.java | 3 +- .../transform}/RandomTransform.java | 9 +- .../transform}/ScaleTransform.java | 5 +- .../transform}/SelectTransform.java | 3 +- .../function/NullRegionFunction.java | 2 +- .../{object => }/function/QuadFunction.java | 2 +- .../function/RegionMaskTestFunction.java | 24 +- .../function/SurfaceRegionFunction.java | 4 +- .../function/block/BiomeCopy.java | 4 +- .../function/block/CombinedBlockCopy.java | 2 +- .../function/block/SimpleBlockCopy.java | 2 +- .../core}/function/generator/CavesGen.java | 4 +- .../core}/function/generator/GenBase.java | 2 +- .../core}/function/generator/OreGen.java | 4 +- .../core}/function/generator/Resource.java | 2 +- .../core}/function/generator/SchemGen.java | 6 +- .../core}/function/mask/ABlockMask.java | 5 +- .../function/mask/AbstractDelegateMask.java | 2 +- .../mask/AdjacentAnyMask.java | 4 +- .../mask/AdjacentMask.java | 4 +- .../{object => function}/mask/AirMask.java | 2 +- .../{object => function}/mask/AngleMask.java | 4 +- .../core}/function/mask/BlockMaskBuilder.java | 11 +- .../{object => function}/mask/CachedMask.java | 7 +- .../{object => function}/mask/DataMask.java | 2 +- .../mask}/DirectionMask.java | 2 +- .../mask/ExtremaMask.java | 2 +- .../{object => function}/mask/IdDataMask.java | 2 +- .../{object => function}/mask/IdMask.java | 2 +- .../mask/ImageBrushMask.java | 6 +- .../core}/function/mask/InverseMask.java | 6 +- .../mask/LayerBrushMask.java | 4 +- .../{object => function}/mask/LiquidMask.java | 2 +- .../core}/function/mask/MaskUnion.java | 25 +- .../core}/function/mask/MaskUnion2D.java | 23 +- .../mask/MaskedTargetBlock.java | 2 +- .../{object => function}/mask/PlaneMask.java | 2 +- .../mask/ROCAngleMask.java | 2 +- .../{object => function}/mask/RadiusMask.java | 2 +- .../{object => function}/mask/RandomMask.java | 2 +- .../mask/ResettableMask.java | 2 +- .../mask/SimplexMask.java | 4 +- .../function/mask/SingleBlockStateMask.java | 5 +- .../function/mask/SingleBlockTypeMask.java | 4 +- .../mask/SplatterBrushMask.java | 4 +- .../mask/StencilBrushMask.java | 6 +- .../mask/SurfaceMask.java | 3 +- .../core}/function/mask/WallMakeMask.java | 3 +- .../{object => function}/mask/WallMask.java | 4 +- .../{object => function}/mask/XAxisMask.java | 2 +- .../{object => function}/mask/YAxisMask.java | 2 +- .../{object => function}/mask/ZAxisMask.java | 2 +- .../pattern/AbstractExtentPattern.java | 2 +- .../pattern/AngleColorPattern.java | 3 +- .../pattern/AverageColorPattern.java | 2 +- .../pattern/BiomeApplyingPattern.java | 2 +- .../pattern/BufferedPattern.java | 4 +- .../pattern/BufferedPattern2D.java | 2 +- .../pattern}/DataAnglePattern.java | 4 +- .../pattern/DataPattern.java | 2 +- .../pattern/DesaturatePattern.java | 2 +- .../pattern/ExistingPattern.java | 2 +- .../pattern/ExpressionPattern.java | 2 +- .../pattern/IdDataMaskPattern.java | 2 +- .../pattern/IdPattern.java | 2 +- .../pattern/Linear2DBlockPattern.java | 2 +- .../pattern/Linear3DBlockPattern.java | 2 +- .../pattern/LinearBlockPattern.java | 2 +- .../pattern/MaskedPattern.java | 2 +- .../pattern/NoXPattern.java | 4 +- .../pattern/NoYPattern.java | 4 +- .../pattern/NoZPattern.java | 4 +- .../pattern/OffsetPattern.java | 4 +- .../pattern/PatternTraverser.java | 2 +- .../pattern/PropertyPattern.java | 6 +- .../pattern/RandomFullClipboardPattern.java | 4 +- .../pattern/RandomOffsetPattern.java | 4 +- .../pattern/RelativePattern.java | 4 +- .../pattern/ResettablePattern.java | 2 +- .../pattern/SaturatePattern.java | 2 +- .../pattern/ShadePattern.java | 2 +- .../pattern/SolidRandomOffsetPattern.java | 4 +- .../pattern/SurfaceRandomOffsetPattern.java | 4 +- .../visitor/AboveVisitor.java | 2 +- .../visitor/DFSRecursiveVisitor.java | 2 +- .../visitor/DFSVisitor.java | 4 +- .../function/visitor/DirectionalVisitor.java | 22 +- .../visitor/IntersectRegionFunction.java | 3 +- .../core}/function/visitor/Order.java | 2 +- .../DiskStorageHistory.java | 10 +- .../MemoryOptimizedHistory.java | 11 +- .../RollbackOptimizedHistory.java | 5 +- .../change/MutableBiomeChange.java | 4 +- .../change/MutableBlockChange.java | 2 +- .../change/MutableEntityChange.java | 2 +- .../change/MutableFullBlockChange.java | 2 +- .../change/MutableTileChange.java | 2 +- .../change/StreamChange.java | 12 +- .../changeset/AbstractChangeSet.java | 16 +- .../changeset/AbstractDelegateChangeSet.java | 3 +- .../changeset/BlockBagChangeSet.java | 2 +- .../history/changeset/ChangeSetSummary.java | 2 +- .../changeset/FaweStreamChangeSet.java | 16 +- .../changeset}/NullChangeSet.java | 3 +- .../changeset/SimpleChangeSetSummary.java | 4 +- .../internal/command/MethodInjector.java | 2 +- .../exception/FaweBlockBagException.java | 2 +- .../exception/FaweChunkLoadException.java | 2 +- .../exception/FaweException.java | 2 +- .../io/AbstractDelegateOutputStream.java | 2 +- .../io/FastByteArrayOutputStream.java | 7 +- .../io/FastByteArraysInputStream.java | 2 +- .../io}/FaweInputStream.java | 2 +- .../io}/FaweOutputStream.java | 2 +- .../io/LittleEndianOutputStream.java | 2 +- .../io/NonCloseableInputStream.java | 2 +- .../io/ResettableFileInputStream.java | 4 +- .../core/jnbt}/CompressedCompoundTag.java | 5 +- .../core/jnbt}/CompressedSchematicTag.java | 9 +- .../core/jnbt}/NumberTag.java | 2 +- .../{object/collection => math}/BitArray.java | 2 +- .../BitArrayUnstretched.java | 2 +- .../BlockVector3ChunkMap.java | 4 +- .../collection => math}/BlockVectorSet.java | 5 +- .../core}/math/DelegateBlockVector3.java | 5 +- .../collection => math}/FastBitSet.java | 2 +- .../core/{object => math}/IntPair.java | 2 +- .../core/{object => math}/IntTriple.java | 2 +- .../LocalBlockVectorSet.java | 4 +- .../core}/math/MutableBlockVector2.java | 4 +- .../core}/math/MutableBlockVector3.java | 3 +- .../core}/math/MutableVector3.java | 3 +- .../core}/math/OffsetBlockVector3.java | 4 +- .../core}/math/Vector3Impl.java | 4 +- .../{object => math}/random/NoiseRandom.java | 2 +- .../{object => math}/random/SimpleRandom.java | 2 +- .../{object => math}/random/SimplexNoise.java | 2 +- .../math/random}/SimplexNoiseGenerator.java | 4 +- .../{object => math}/random/TrueRandom.java | 2 +- .../math/transform/RoundedTransform.java | 3 +- .../core/object/Metadatable.java | 16 - .../core/object/brush/scroll/ScrollTool.java | 7 - .../object/collection/DifferentialArray.java | 312 -- .../collection/DifferentialBlockBuffer.java | 229 -- .../DifferentialCharBlockBuffer.java | 229 -- .../collection/DifferentialCollection.java | 7 - .../collection/LocalBlockVector2DSet.java | 250 -- .../core/object/collection/ObjObjMap.java | 233 -- .../core/object/collection/SoftHashMap.java | 326 -- .../core/object/collection/SparseBitSet.java | 3097 ----------------- .../object/collection/SparseBlockSet.java | 36 - .../object/collection/SummedAreaTable.java | 99 - .../object/io/AsyncBufferedOutputStream.java | 183 - .../object/io/BufferedRandomAccessFile.java | 424 --- .../object/io/FastByteArrayInputStream.java | 79 - .../object/io/NonClosableOutputStream.java | 16 - .../core/object/io/PGZIPBlock.java | 45 - .../core/object/io/PGZIPOutputStream.java | 252 -- .../core/object/io/PGZIPState.java | 19 - .../core/object/io/PGZIPThreadLocal.java | 15 - .../object/io/RandomAccessInputStream.java | 38 - .../object/io/RandomFileOutputStream.java | 128 - .../core/object/io/serialize/Serialize.java | 12 - .../core/object/io/zstd/ZstdInputStream.java | 183 - .../core/{beta => queue}/Filter.java | 4 +- .../core/queue/FilterBlockMask.java | 8 + .../core/{beta => queue}/IBatchProcessor.java | 8 +- .../core/{beta => queue}/IBlocks.java | 8 +- .../core/{beta => queue}/IChunk.java | 4 +- .../core/{beta => queue}/IChunkCache.java | 2 +- .../IChunkExtent.java | 8 +- .../core/{beta => queue}/IChunkGet.java | 6 +- .../core/{beta => queue}/IChunkSet.java | 4 +- .../core/{beta => queue}/IDelegateFilter.java | 4 +- .../core/{beta => queue}/IQueueChunk.java | 2 +- .../core/{beta => queue}/IQueueExtent.java | 7 +- .../core/{beta => queue}/IQueueWrapper.java | 2 +- .../core/{beta => queue}/ITileInput.java | 2 +- .../{beta/implementation => }/queue/Pool.java | 2 +- .../core/{beta => queue}/Trimable.java | 2 +- .../{beta => queue/implementation}/Flood.java | 6 +- .../implementation}/ParallelQueueExtent.java | 28 +- .../implementation}/QueueHandler.java | 26 +- .../implementation}/QueuePool.java | 4 +- .../SingleThreadQueueExtent.java | 34 +- .../implementation/blocks/BitSetBlocks.java | 8 +- .../implementation/blocks/CharBlocks.java | 6 +- .../implementation/blocks/CharGetBlocks.java | 6 +- .../implementation/blocks/CharSetBlocks.java | 10 +- .../implementation/blocks/NullChunkGet.java | 12 +- .../implementation/chunk/ChunkCache.java | 6 +- .../implementation/chunk/ChunkHolder.java | 44 +- .../implementation/chunk/NullChunk.java | 14 +- .../implementation/packet/ChunkPacket.java | 11 +- .../preloader/AsyncPreloader.java | 4 +- .../implementation/preloader/Preloader.java | 2 +- .../core/regions/FaweMask.java | 3 +- .../core/regions/FaweMaskManager.java | 2 +- .../{object => }/regions/FuzzyRegion.java | 4 +- .../core}/regions/IDelegateRegion.java | 4 +- .../regions/PolyhedralRegion.java | 21 +- .../{object => regions}/RegionWrapper.java | 2 +- .../core/{object => }/regions/Triangle.java | 2 +- .../CuboidRegionFilter.java | 4 +- .../{general => filter}/RegionFilter.java | 2 +- .../regions/selector/FuzzyRegionSelector.java | 6 +- .../selector/PolyhedralRegionSelector.java | 25 +- .../core}/registry/RegistryItem.java | 3 +- .../core}/registry/state/PropertyGroup.java | 3 +- .../core}/registry/state/PropertyKey.java | 2 +- .../core}/registry/state/PropertyKeySet.java | 2 +- .../core/util/BrushCache.java | 2 +- .../core/util/CachedMathMan.java | 4 +- .../core/util/EditSessionBuilder.java | 46 +- .../core/util/ImgurUtility.java | 2 +- .../string => util}/JoinedCharSequence.java | 2 +- .../core/util/MainUtil.java | 16 +- .../core/util/MaskTraverser.java | 2 +- .../fastasyncworldedit/core/util/MemUtil.java | 2 +- .../string => util}/MutableCharSequence.java | 2 +- .../core/util}/NbtUtils.java | 24 +- .../core/util/TaskManager.java | 4 +- .../core/util/TextureUtil.java | 2 +- .../core/util/WEManager.java | 6 +- .../collection/AdaptedMap.java | 4 +- .../collection/AdaptedSetCollection.java | 2 +- .../{object => util}/collection/BlockSet.java | 2 +- .../collection/CleanableThreadLocal.java | 2 +- .../collection/CpuBlockSet.java | 2 +- .../collection/FastRandomCollection.java | 4 +- .../collection/IAdaptedMap.java | 2 +- .../collection/LongHashSet.java | 25 +- .../collection/MemBlockSet.java | 6 +- .../collection/MutablePair.java | 2 +- .../collection/RandomCollection.java | 4 +- .../collection/SimpleRandomCollection.java | 4 +- .../collection/SummedColorTable.java | 2 +- .../collection/YieldIterable.java | 2 +- .../core/util/image/ImageUtil.java | 3 +- .../progress/ChatProgressTracker.java | 2 +- .../progress/DefaultProgressTracker.java | 6 +- .../task/AsyncNotifyQueue.java | 2 +- .../task}/DelegateConsumer.java | 2 +- .../{object => util/task}/RunnableVal.java | 2 +- .../{object => util/task}/RunnableVal2.java | 4 +- .../{object => util/task}/RunnableVal3.java | 2 +- .../{object => util/task}/RunnableVal4.java | 2 +- .../task/SingleThreadIntervalQueue.java | 2 +- .../task/ThrowableSupplier.java | 2 +- .../core}/world/SimpleWorld.java | 23 +- .../core}/world/block/BlanketBaseBlock.java | 4 +- .../core}/world/block/BlockID.java | 9 +- .../core}/world/block/BlockTypeSwitch.java | 4 +- .../world/block/BlockTypeSwitchBuilder.java | 6 +- .../core}/world/block/CompoundInput.java | 6 +- .../core}/world/block/ItemTypesCache.java | 2 +- .../core/wrappers/AsyncPlayer.java | 2 +- .../core/wrappers/WorldWrapper.java | 6 +- .../java/com/sk89q/jnbt/ByteArrayTag.java | 4 +- .../src/main/java/com/sk89q/jnbt/ByteTag.java | 4 +- .../main/java/com/sk89q/jnbt/CompoundTag.java | 6 +- .../main/java/com/sk89q/jnbt/DoubleTag.java | 6 +- .../src/main/java/com/sk89q/jnbt/EndTag.java | 4 +- .../main/java/com/sk89q/jnbt/FloatTag.java | 6 +- .../main/java/com/sk89q/jnbt/IntArrayTag.java | 4 +- .../src/main/java/com/sk89q/jnbt/IntTag.java | 4 +- .../src/main/java/com/sk89q/jnbt/ListTag.java | 2 +- .../java/com/sk89q/jnbt/LongArrayTag.java | 4 +- .../src/main/java/com/sk89q/jnbt/LongTag.java | 4 +- .../java/com/sk89q/jnbt/NBTOutputStream.java | 2 +- .../main/java/com/sk89q/jnbt/ShortTag.java | 4 +- .../main/java/com/sk89q/jnbt/StringTag.java | 4 +- .../src/main/java/com/sk89q/jnbt/Tag.java | 4 +- .../com/sk89q/jnbt/fawe/package-info.java | 4 - .../minecraft/util/commands/Command.java | 2 + .../java/com/sk89q/util/ReflectionUtil.java | 2 + .../main/java/com/sk89q/util/StringUtil.java | 2 + .../java/com/sk89q/worldedit/EditSession.java | 288 +- .../sk89q/worldedit/LocalConfiguration.java | 6 +- .../com/sk89q/worldedit/LocalSession.java | 83 +- .../sk89q/worldedit/TracedEditSession.java | 5 +- .../java/com/sk89q/worldedit/WorldEdit.java | 10 +- .../sk89q/worldedit/WorldEditException.java | 2 + .../com/sk89q/worldedit/blocks/BaseItem.java | 40 +- .../sk89q/worldedit/blocks/BaseItemStack.java | 26 +- .../worldedit/blocks/TileEntityBlock.java | 2 + .../worldedit/command/ApplyBrushCommands.java | 4 +- .../worldedit/command/BrushCommands.java | 1308 +++---- .../worldedit/command/ChunkCommands.java | 12 + .../worldedit/command/ClipboardCommands.java | 140 +- .../command/FlattenedClipboardTransform.java | 5 +- .../worldedit/command/GeneralCommands.java | 58 +- .../worldedit/command/GenerationCommands.java | 214 +- .../worldedit/command/HistoryCommands.java | 2 + .../worldedit/command/HistorySubCommands.java | 14 +- .../worldedit/command/NavigationCommands.java | 16 +- .../worldedit/command/RegionCommands.java | 2 +- .../worldedit/command/SchematicCommands.java | 171 +- .../worldedit/command/SelectionCommands.java | 66 +- .../sk89q/worldedit/command/ToolCommands.java | 10 +- .../worldedit/command/ToolUtilCommands.java | 14 +- .../worldedit/command/UtilityCommands.java | 40 +- .../worldedit/command/WorldEditCommands.java | 6 + .../argument/AbstractDirectionConverter.java | 1 - .../command/argument/EnumConverter.java | 5 +- .../command/argument/FactoryConverter.java | 2 +- .../command/argument/LocationConverter.java | 19 - .../command/argument/SelectorChoice.java | 2 + .../command/argument/WorldConverter.java | 2 + .../command/argument/package-info.java | 6 + .../sk89q/worldedit/command/package-info.java | 6 + .../worldedit/command/tool/AreaPickaxe.java | 2 +- .../worldedit/command/tool/BlockReplacer.java | 10 +- .../worldedit/command/tool/BrushTool.java | 59 +- .../command/tool/FloatingTreeRemover.java | 4 +- .../worldedit/command/tool/FloodFillTool.java | 2 + .../tool/InvalidToolBindException.java | 9 +- .../command/tool/NavigationWand.java | 11 +- .../command/tool/RecursivePickaxe.java | 4 +- .../worldedit/command/tool/SelectionWand.java | 14 +- .../worldedit/command/tool/SinglePickaxe.java | 5 +- .../worldedit/command/tool/TreePlanter.java | 7 +- .../command/tool/brush/ButcherBrush.java | 2 +- .../command/tool/brush/CylinderBrush.java | 2 +- .../command/tool/brush/GravityBrush.java | 2 + .../tool/brush/HollowCylinderBrush.java | 2 +- .../command/tool/brush/SmoothBrush.java | 2 +- .../command/util/AsyncCommandBuilder.java | 17 +- .../worldedit/command/util/EntityRemover.java | 2 + .../command/util/FutureProgressListener.java | 18 +- .../command/util/MessageTimerTask.java | 19 +- .../command/util/PermissionCondition.java | 4 + .../command/util/SuggestionHelper.java | 2 + .../util/WorldEditAsyncCommandBuilder.java | 2 +- .../util}/annotation/AllowedRegion.java | 2 +- .../util/annotation}/ConfirmHandler.java | 21 +- .../command/util/annotation}/Link.java | 2 +- .../command/util/annotation/PatternList.java | 17 + .../command/util/annotation}/Step.java | 2 +- .../util}/annotation/Time.java | 2 +- .../command/util/annotation/package-info.java | 12 + .../sk89q/worldedit/entity/BaseEntity.java | 17 +- .../com/sk89q/worldedit/entity/Entity.java | 2 + .../com/sk89q/worldedit/entity/Player.java | 4 +- .../java/com/sk89q/worldedit/event/Event.java | 2 + .../event/extent/EditSessionEvent.java | 46 +- .../event/platform/CommandEvent.java | 2 + .../extension/factory/BlockFactory.java | 2 + .../extension/factory/MaskFactory.java | 30 +- .../extension/factory/PatternFactory.java | 23 +- .../factory/parser/DefaultBlockParser.java | 24 +- .../factory/parser/DefaultItemParser.java | 6 + .../parser/mask/BlockStateMaskParser.java | 2 +- .../factory/parser/mask/XAxisMaskParser.java | 48 - .../factory/parser/mask/YAxisMaskParser.java | 48 - .../factory/parser/mask/ZAxisMaskParser.java | 48 - .../pattern/BlockCategoryPatternParser.java | 4 +- .../pattern/ClipboardPatternParser.java | 4 +- .../extension/input/ParserContext.java | 4 + .../platform/AbstractNonPlayerActor.java | 6 +- .../platform/AbstractPlayerActor.java | 139 +- .../worldedit/extension/platform/Actor.java | 30 +- .../extension/platform/Annotations.java | 4 +- .../extension/platform/Capability.java | 6 +- .../extension/platform/Platform.java | 30 +- .../platform/PlatformCommandManager.java | 79 +- .../extension/platform/PlatformManager.java | 32 +- .../extension/platform/PlayerProxy.java | 64 +- .../extent/AbstractDelegateExtent.java | 245 +- .../com/sk89q/worldedit/extent/Extent.java | 32 +- .../sk89q/worldedit/extent/InputExtent.java | 14 +- .../sk89q/worldedit/extent/MaskingExtent.java | 26 +- .../sk89q/worldedit/extent/NullExtent.java | 14 +- .../sk89q/worldedit/extent/OutputExtent.java | 6 +- .../extent/buffer/ForgetfulExtentBuffer.java | 8 + .../extent/clipboard/BlockArrayClipboard.java | 15 +- .../worldedit/extent/clipboard/Clipboard.java | 16 +- .../clipboard/io/BuiltInClipboardFormat.java | 29 +- .../extent/clipboard/io/ClipboardFormat.java | 13 +- .../extent/clipboard/io/ClipboardFormats.java | 50 +- .../extent/clipboard/io/ClipboardReader.java | 6 +- .../extent/clipboard/io/ClipboardWriter.java | 2 + .../clipboard/io/MCEditSchematicReader.java | 2 + .../clipboard/io/NBTSchematicReader.java | 2 +- .../clipboard/io/SpongeSchematicReader.java | 11 +- .../extent/inventory/BlockBagExtent.java | 10 + .../extent/inventory/OutOfSpaceException.java | 2 +- .../extent/reorder/MultiStageReorder.java | 12 +- .../transform/BlockTransformExtent.java | 18 +- .../validation/DataValidatorExtent.java | 2 +- .../extent/world/BiomeQuirkExtent.java | 20 +- .../extent/world/BlockQuirkExtent.java | 3 + .../extent/world/ChunkLoadingExtent.java | 2 +- .../extent/world/SurvivalModeExtent.java | 2 + .../function/CombinedRegionFunction.java | 6 + .../function/FlatRegionMaskingFilter.java | 2 +- .../worldedit/function/RegionFunction.java | 8 +- .../function/RegionMaskingFilter.java | 7 +- .../block/BlockDistributionCounter.java | 8 +- .../function/block/BlockReplace.java | 2 +- .../function/block/ExtentBlockCopy.java | 2 + .../worldedit/function/block/Naturalizer.java | 2 + .../function/block/SnowSimulator.java | 6 +- .../function/entity/ExtentEntityCopy.java | 11 + .../worldedit/function/factory/Apply.java | 7 + .../worldedit/function/factory/Deform.java | 4 + .../function/generator/FloraGenerator.java | 2 +- .../generator/GardenPatchGenerator.java | 4 +- .../worldedit/function/mask/AbstractMask.java | 3 +- .../worldedit/function/mask/BiomeMask.java | 6 + .../function/mask/BlockCategoryMask.java | 6 + .../worldedit/function/mask/BlockMask.java | 17 +- .../function/mask/BlockStateMask.java | 2 + .../function/mask/BlockTypeMask.java | 10 +- .../function/mask/BoundedHeightMask.java | 2 + .../function/mask/ExistingBlockMask.java | 2 + .../function/mask/ExpressionMask.java | 2 + .../function/mask/ExpressionMask2D.java | 2 + .../mask/InverseSingleBlockStateMask.java | 2 + .../mask/InverseSingleBlockTypeMask.java | 2 + .../sk89q/worldedit/function/mask/Mask.java | 17 +- .../sk89q/worldedit/function/mask/Mask2D.java | 2 + .../function/mask/MaskIntersection.java | 14 + .../function/mask/MaskIntersection2D.java | 2 + .../sk89q/worldedit/function/mask/Masks.java | 14 +- .../worldedit/function/mask/NoiseFilter.java | 4 +- .../function/mask/NoiseFilter2D.java | 2 + .../worldedit/function/mask/OffsetMask.java | 2 + .../worldedit/function/mask/OffsetMask2D.java | 12 +- .../worldedit/function/mask/RegionMask.java | 2 + .../function/mask/SolidBlockMask.java | 2 + .../operation/BackwardsExtentBlockCopy.java | 10 +- .../function/operation/ChangeSetExecutor.java | 10 +- .../function/operation/DelegateOperation.java | 2 +- .../function/operation/ForwardExtentCopy.java | 29 +- .../function/operation/Operations.java | 8 +- .../function/operation/SetBlockMap.java | 2 + .../operation/SetLocatedBlocks.java~HEAD | 56 - .../function/operation/package-info.java | 6 + .../worldedit/function/pattern/Pattern.java | 9 +- .../function/pattern/RandomPattern.java | 14 +- .../pattern/RepeatingExtentPattern.java | 2 + .../pattern/StateApplyingPattern.java | 5 +- .../function/pattern/WaterloggedRemover.java | 6 +- .../function/visitor/BreadthFirstSearch.java | 25 +- .../function/visitor/DownwardVisitor.java | 4 +- .../function/visitor/LayerVisitor.java | 4 +- .../function/visitor/NonRisingVisitor.java | 4 + .../function/visitor/RecursiveVisitor.java | 2 + .../function/visitor/RegionVisitor.java | 2 +- .../worldedit/function/visitor/ScanChunk.java | 344 -- .../history/change/EntityCreate.java | 4 + .../history/change/EntityRemove.java | 4 + .../history/changeset/ArrayListHistory.java | 5 +- .../history/changeset/ChangeSet.java | 5 + .../internal/annotation/PatternList.java | 36 - .../internal/anvil/ChunkDeleter.java | 4 +- .../internal/anvil/RegionAccess.java | 2 +- .../internal/block/BlockStateIdAccess.java | 2 + .../WorldEditExceptionConverter.java | 1 + .../internal/cui/SelectionCylinderEvent.java | 12 +- .../cui/SelectionEllipsoidPointEvent.java | 10 +- .../internal/cui/SelectionMinMaxEvent.java | 6 +- .../internal/cui/SelectionPoint2DEvent.java | 10 +- .../internal/cui/SelectionPointEvent.java | 12 +- .../internal/cui/ServerCUIHandler.java | 47 +- .../internal/expression/Expression.java | 8 + .../internal/registry/SimpleInputParser.java | 4 +- .../worldedit/internal/util/BiomeMath.java | 25 +- .../internal/wna/WorldNativeAccess.java | 4 + .../sk89q/worldedit/math/BlockVector2.java | 7 + .../sk89q/worldedit/math/BlockVector3.java | 79 +- .../com/sk89q/worldedit/math/Vector2.java | 2 + .../com/sk89q/worldedit/math/Vector3.java | 82 +- .../worldedit/math/convolution/HeightMap.java | 14 +- .../KochanekBartelsInterpolation.java | 4 +- .../math/transform/AffineTransform.java | 8 + .../worldedit/regions/AbstractRegion.java | 10 +- .../regions/ConvexPolyhedralRegion.java | 2 + .../sk89q/worldedit/regions/CuboidRegion.java | 45 +- .../worldedit/regions/CylinderRegion.java | 22 +- .../worldedit/regions/EllipsoidRegion.java | 40 +- .../worldedit/regions/Polygonal2DRegion.java | 4 + .../com/sk89q/worldedit/regions/Region.java | 50 +- .../worldedit/regions/RegionIntersection.java | 8 +- .../ConvexPolyhedralRegionSelector.java | 4 + .../selector/CuboidRegionSelector.java | 2 + .../selector/CylinderRegionSelector.java | 2 + .../selector/Polygonal2DRegionSelector.java | 2 + .../regions/shape/ArbitraryBiomeShape.java | 4 + .../shape/WorldEditExpressionEnvironment.java | 14 +- .../sk89q/worldedit/registry/Category.java | 7 + .../registry/NamespacedRegistry.java | 9 + .../sk89q/worldedit/registry/Registry.java | 4 + .../registry/state/AbstractProperty.java | 47 +- .../registry/state/BooleanProperty.java | 4 +- .../registry/state/DirectionalProperty.java | 10 +- .../registry/state/EnumProperty.java | 6 +- .../registry/state/IntegerProperty.java | 4 + .../worldedit/registry/state/Property.java | 12 +- .../worldedit/session/ClipboardHolder.java | 2 + .../sk89q/worldedit/session/PasteBuilder.java | 15 +- .../worldedit/session/SessionManager.java | 7 +- .../worldedit/session/request/Request.java | 18 +- .../session/request/RequestExtent.java | 4 + .../com/sk89q/worldedit/util/Direction.java | 12 +- .../sk89q/worldedit/util/Identifiable.java | 2 + .../com/sk89q/worldedit/util/Location.java | 10 +- .../util/PropertiesConfiguration.java | 3 - .../sk89q/worldedit/util/SideEffectSet.java | 2 + .../com/sk89q/worldedit/util/TargetBlock.java | 6 + .../sk89q/worldedit/util/TreeGenerator.java | 4 +- .../worldedit/util/YAMLConfiguration.java | 6 +- .../sk89q/worldedit/util/auth/Subject.java | 2 + .../util/collection/DoubleArrayList.java | 16 +- .../util/concurrency/LazyReference.java | 4 + .../worldedit/util/eventbus/EventBus.java | 2 +- .../formatting/component/CommandListBox.java | 4 +- .../util/formatting/component/MessageBox.java | 4 +- .../formatting/component/PaginationBox.java | 8 + .../formatting/component/SideEffectBox.java | 2 + .../util/io/file/ArchiveUnpacker.java | 122 + ...apshot API (#524) => AttributeTarget.java} | 20 +- .../worldedit/util/io/file/SafeFiles.java | 55 +- .../sk89q/worldedit/util/net/HttpRequest.java | 7 - .../util/paste/ActorCallbackPaste.java | 2 +- .../worldedit/util/task/LinkedFuture.java | 53 - .../util/task/TaskStateComparator.java | 2 + .../sk89q/worldedit/world/AbstractWorld.java | 4 +- .../com/sk89q/worldedit/world/NbtValued.java | 4 + .../com/sk89q/worldedit/world/NullWorld.java | 12 +- .../sk89q/worldedit/world/RegenOptions.java | 6 + .../java/com/sk89q/worldedit/world/World.java | 10 +- .../worldedit/world/biome/BiomeType.java | 8 +- .../worldedit/world/biome/BiomeTypes.java | 18 +- .../worldedit/world/block/BaseBlock.java | 35 +- .../world/block/BlockCategories.java | 2 + .../worldedit/world/block/BlockCategory.java | 14 +- .../worldedit/world/block/BlockState.java | 25 +- .../world/block/BlockStateHolder.java | 10 +- .../worldedit/world/block/BlockType.java | 45 +- .../worldedit/world/block/BlockTypeUtil.java | 242 -- .../worldedit/world/block/BlockTypes.java | 6 +- .../world/block/BlockTypesCache.java | 3 +- .../world/block/FuzzyBlockState.java | 14 +- .../worldedit/world/chunk/AnvilChunk.java | 13 +- .../worldedit/world/chunk/AnvilChunk13.java | 18 +- .../worldedit/world/chunk/AnvilChunk16.java | 2 + .../sk89q/worldedit/world/chunk/OldChunk.java | 9 +- .../worldedit/world/entity/EntityType.java | 8 +- .../worldedit/world/entity/EntityTypes.java | 2 + .../worldedit/world/fluid/FluidType.java | 8 +- .../worldedit/world/gamemode/GameMode.java | 2 +- .../sk89q/worldedit/world/item/ItemType.java | 10 +- .../sk89q/worldedit/world/item/ItemTypes.java | 8 +- .../world/registry/BlockMaterial.java | 14 +- .../world/registry/BlockRegistry.java | 4 + .../world/registry/BundledBlockData.java | 4 + .../world/registry/BundledBlockRegistry.java | 10 + .../world/registry/EntityRegistry.java | 11 +- .../world/registry/ItemRegistry.java | 2 + .../world/registry/LegacyMapper.java | 24 +- .../registry/PassthroughBlockMaterial.java | 6 + .../world/registry/SimpleBlockMaterial.java | 6 + .../world/registry/SimpleItemMaterial.java | 4 +- .../world/snapshot/SnapshotRestore.java | 6 +- .../world/snapshot/YYMMDDHHIISSParser.java | 2 +- .../experimental/SnapshotRestore.java | 2 +- .../world/storage/ChunkStoreHelper.java | 2 + .../world/storage/FileMcRegionChunkStore.java | 2 +- .../world/storage/LegacyChunkStore.java | 2 +- .../world/storage/McRegionChunkStore.java | 2 +- .../world/storage/McRegionReader.java | 11 +- .../world/storage/ZippedLegacyChunkStore.java | 6 + .../storage/ZippedMcRegionChunkStore.java | 16 +- .../src/main/resources/lang/strings.json | 7 +- .../worldedit/fabric/FabricPlatform.java | 4 +- .../sk89q/worldedit/forge/ForgePlatform.java | 4 +- .../worldedit/sponge/SpongePlatform.java | 4 +- 799 files changed, 4916 insertions(+), 10589 deletions(-) delete mode 100644 worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/FilterBlockMask.java rename worldedit-core/src/main/java/com/{sk89q/worldedit => fastasyncworldedit/core}/command/ListFilters.java (98%) rename worldedit-core/src/main/java/com/{sk89q/worldedit => fastasyncworldedit/core}/command/MaskCommands.java (99%) rename worldedit-core/src/main/java/com/{sk89q/worldedit => fastasyncworldedit/core}/command/MethodCommands.java (91%) rename worldedit-core/src/main/java/com/{sk89q/worldedit => fastasyncworldedit/core}/command/PatternCommands.java (100%) rename worldedit-core/src/main/java/com/{sk89q/worldedit => fastasyncworldedit/core}/command/TransformCommands.java (100%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object/brush => command/tool}/MovableTool.java (68%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object/brush => command/tool}/ResettableTool.java (53%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object/brush => command/tool}/TargetMode.java (71%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => command/tool}/brush/AngleBrush.java (82%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => command/tool}/brush/BlendBall.java (98%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => command/tool}/brush/BlobBrush.java (96%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => command/tool}/brush/BrushSettings.java (97%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => command/tool}/brush/CatenaryBrush.java (96%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => command/tool}/brush/CircleBrush.java (96%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => command/tool}/brush/CommandBrush.java (97%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => command/tool}/brush/CopyPastaBrush.java (93%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => command/tool}/brush/ErodeBrush.java (98%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => command/tool}/brush/FallingSphere.java (97%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => command/tool}/brush/FlattenBrush.java (84%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => command/tool}/brush/HeightBrush.java (88%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => command/tool}/brush/ImageBrush.java (93%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => command/tool}/brush/InspectBrush.java (96%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => command/tool}/brush/LayerBrush.java (87%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => command/tool}/brush/LineBrush.java (91%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => command/tool}/brush/PopulateSchem.java (96%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => command/tool}/brush/RaiseBrush.java (81%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => command/tool}/brush/RecurseBrush.java (92%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => command/tool}/brush/RockBrush.java (94%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => command/tool}/brush/ScatterBrush.java (89%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => command/tool}/brush/ScatterCommand.java (93%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => command/tool}/brush/ScatterOverlayBrush.java (85%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => command/tool}/brush/ShatterBrush.java (94%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => command/tool}/brush/SplatterBrush.java (85%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => command/tool}/brush/SplineBrush.java (95%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => command/tool}/brush/StencilBrush.java (91%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => command/tool}/brush/SurfaceSphereBrush.java (87%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => command/tool}/brush/SurfaceSpline.java (96%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object/brush => command/tool}/scroll/Scroll.java (97%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object/brush => command/tool}/scroll/ScrollClipboard.java (94%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object/brush => command/tool}/scroll/ScrollMask.java (91%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object/brush => command/tool}/scroll/ScrollPattern.java (92%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object/brush => command/tool}/scroll/ScrollRange.java (91%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object/brush => command/tool}/scroll/ScrollSize.java (90%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object/brush => command/tool}/scroll/ScrollTarget.java (84%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object/brush => command/tool}/scroll/ScrollTargetOffset.java (88%) create mode 100644 worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/scroll/ScrollTool.java rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object/brush => command/tool}/sweep/ClipboardSpline.java (96%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object/brush => command/tool}/sweep/Spline.java (99%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object/brush => command/tool}/sweep/SweepBrush.java (97%) rename worldedit-core/src/main/java/com/{sk89q/worldedit => fastasyncworldedit/core}/entity/LazyBaseEntity.java (90%) rename worldedit-core/src/main/java/com/{sk89q/worldedit => fastasyncworldedit/core}/entity/MapMetadatable.java (96%) rename worldedit-core/src/main/java/com/{sk89q/worldedit => fastasyncworldedit/core}/entity/Metadatable.java (97%) rename worldedit-core/src/main/java/com/{sk89q/worldedit => fastasyncworldedit/core}/event/extent/ActorSaveClipboardEvent.java (95%) rename worldedit-core/src/main/java/com/{sk89q/worldedit => fastasyncworldedit/core}/event/extent/PasteEvent.java (66%) rename worldedit-core/src/main/java/com/{sk89q/worldedit => fastasyncworldedit/core}/extension/factory/DefaultTransformParser.java (100%) rename worldedit-core/src/main/java/com/{sk89q/worldedit => fastasyncworldedit/core}/extension/factory/parser/RichParser.java (98%) rename worldedit-core/src/main/java/com/{sk89q/worldedit => fastasyncworldedit/core}/extension/factory/parser/mask/AdjacentMaskParser.java (85%) rename worldedit-core/src/main/java/com/{sk89q/worldedit => fastasyncworldedit/core}/extension/factory/parser/mask/AngleMaskParser.java (92%) rename worldedit-core/src/main/java/com/{sk89q/worldedit => fastasyncworldedit/core}/extension/factory/parser/mask/DefaultMaskParser.java (91%) rename worldedit-core/src/main/java/com/{sk89q/worldedit => fastasyncworldedit/core}/extension/factory/parser/mask/ExtremaMaskParser.java (92%) rename worldedit-core/src/main/java/com/{sk89q/worldedit => fastasyncworldedit/core}/extension/factory/parser/mask/FalseMaskParser.java (92%) rename worldedit-core/src/main/java/com/{sk89q/worldedit => fastasyncworldedit/core}/extension/factory/parser/mask/LiquidMaskParser.java (85%) rename worldedit-core/src/main/java/com/{sk89q/worldedit => fastasyncworldedit/core}/extension/factory/parser/mask/ROCAngleMaskParser.java (92%) rename worldedit-core/src/main/java/com/{sk89q/worldedit => fastasyncworldedit/core}/extension/factory/parser/mask/RadiusMaskParser.java (84%) rename worldedit-core/src/main/java/com/{sk89q/worldedit => fastasyncworldedit/core}/extension/factory/parser/mask/RichOffsetMaskParser.java (92%) rename worldedit-core/src/main/java/com/{sk89q/worldedit => fastasyncworldedit/core}/extension/factory/parser/mask/SimplexMaskParser.java (86%) rename worldedit-core/src/main/java/com/{sk89q/worldedit => fastasyncworldedit/core}/extension/factory/parser/mask/SurfaceMaskParser.java (86%) rename worldedit-core/src/main/java/com/{sk89q/worldedit => fastasyncworldedit/core}/extension/factory/parser/mask/TrueMaskParser.java (91%) rename worldedit-core/src/main/java/com/{sk89q/worldedit => fastasyncworldedit/core}/extension/factory/parser/mask/WallMaskParser.java (90%) create mode 100644 worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/mask/XAxisMaskParser.java create mode 100644 worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/mask/YAxisMaskParser.java create mode 100644 worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/mask/ZAxisMaskParser.java rename worldedit-core/src/main/java/com/{sk89q/worldedit => fastasyncworldedit/core}/extension/factory/parser/pattern/BiomePatternParser.java (92%) rename worldedit-core/src/main/java/com/{sk89q/worldedit => fastasyncworldedit/core}/extension/factory/parser/pattern/BufferedPatternParser.java (87%) rename worldedit-core/src/main/java/com/{sk89q/worldedit => fastasyncworldedit/core}/extension/factory/parser/pattern/DefaultPatternParser.java (90%) rename worldedit-core/src/main/java/com/{sk89q/worldedit => fastasyncworldedit/core}/extension/factory/parser/pattern/ExistingPatternParser.java (86%) rename worldedit-core/src/main/java/com/{sk89q/worldedit => fastasyncworldedit/core}/extension/factory/parser/pattern/Linear2DPatternParser.java (92%) rename worldedit-core/src/main/java/com/{sk89q/worldedit => fastasyncworldedit/core}/extension/factory/parser/pattern/Linear3DPatternParser.java (93%) rename worldedit-core/src/main/java/com/{sk89q/worldedit => fastasyncworldedit/core}/extension/factory/parser/pattern/NoisePatternParser.java (93%) rename worldedit-core/src/main/java/com/{sk89q/worldedit => fastasyncworldedit/core}/extension/factory/parser/pattern/PerlinPatternParser.java (86%) rename worldedit-core/src/main/java/com/{sk89q/worldedit => fastasyncworldedit/core}/extension/factory/parser/pattern/RandomPatternParser.java (77%) rename worldedit-core/src/main/java/com/{sk89q/worldedit => fastasyncworldedit/core}/extension/factory/parser/pattern/RidgedMultiFractalPatternParser.java (88%) rename worldedit-core/src/main/java/com/{sk89q/worldedit => fastasyncworldedit/core}/extension/factory/parser/pattern/SimplexPatternParser.java (67%) rename worldedit-core/src/main/java/com/{sk89q/worldedit => fastasyncworldedit/core}/extension/factory/parser/pattern/VoronoiPatternParser.java (86%) rename worldedit-core/src/main/java/com/{sk89q/worldedit => fastasyncworldedit/core}/extension/platform/binding/Binding.java (74%) rename worldedit-core/src/main/java/com/{sk89q/worldedit => fastasyncworldedit/core}/extension/platform/binding/Bindings.java (98%) rename worldedit-core/src/main/java/com/{sk89q/worldedit => fastasyncworldedit/core}/extension/platform/binding/CommandBindings.java (72%) rename worldedit-core/src/main/java/com/{sk89q/worldedit => fastasyncworldedit/core}/extension/platform/binding/ConsumeBindings.java (98%) rename worldedit-core/src/main/java/com/{sk89q/worldedit => fastasyncworldedit/core}/extension/platform/binding/PrimitiveBindings.java (99%) rename worldedit-core/src/main/java/com/{sk89q/worldedit => fastasyncworldedit/core}/extension/platform/binding/ProvideBindings.java (97%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => }/extent/BlockTranslateExtent.java (95%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => }/extent/ExtentHeightCacher.java (93%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => }/extent/FaweRegionExtent.java (96%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => }/extent/HeightBoundExtent.java (85%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => extent}/HistoryExtent.java (97%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => }/extent/MemoryCheckingExtent.java (91%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => }/extent/MultiRegionExtent.java (92%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => }/extent/NullExtent.java (94%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => }/extent/OffsetExtent.java (96%) rename worldedit-core/src/main/java/com/{sk89q/worldedit => fastasyncworldedit/core}/extent/PassthroughExtent.java (96%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => }/extent/PositionTransformExtent.java (94%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => }/extent/ProcessedWEExtent.java (98%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => }/extent/RandomOffsetTransform.java (97%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => }/extent/ResettableExtent.java (97%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => }/extent/SingleRegionExtent.java (86%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => }/extent/SlowExtent.java (95%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => }/extent/SourceMaskExtent.java (93%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => }/extent/StripNBTExtent.java (97%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => }/extent/SupplyingExtent.java (83%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => }/extent/TemporalExtent.java (95%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => }/extent/TransformExtent.java (95%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => extent}/clipboard/CPUOptimizedClipboard.java (98%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => extent}/clipboard/DiskOptimizedClipboard.java (99%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => extent}/clipboard/EmptyClipboard.java (95%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => extent}/clipboard/LazyClipboardHolder.java (97%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => extent}/clipboard/LinearClipboard.java (95%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => extent}/clipboard/MemoryOptimizedClipboard.java (98%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => extent}/clipboard/MultiClipboardHolder.java (98%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => extent}/clipboard/ReadOnlyClipboard.java (98%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => extent}/clipboard/ResizableClipboardBuilder.java (91%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => extent}/clipboard/SimpleClipboard.java (97%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => extent}/clipboard/URIClipboardHolder.java (95%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => extent}/clipboard/WorldCopyClipboard.java (97%) rename worldedit-core/src/main/java/com/{sk89q/worldedit => fastasyncworldedit/core}/extent/clipboard/io/FastSchematicReader.java (93%) rename worldedit-core/src/main/java/com/{sk89q/worldedit => fastasyncworldedit/core}/extent/clipboard/io/FastSchematicWriter.java (92%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => extent/clipboard/io}/schematic/MinecraftStructure.java (98%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => extent/clipboard/io}/schematic/PNGWriter.java (98%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => extent/clipboard/io}/schematic/visualizer/SchemVis.java (99%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{beta/implementation => extent}/filter/ArrayImageMask.java (76%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{beta/implementation => extent}/filter/CountFilter.java (79%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{beta/implementation => extent}/filter/DistrFilter.java (94%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{beta/implementation => extent}/filter/ForkedFilter.java (89%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{beta/implementation => extent}/filter/LinkedFilter.java (73%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{beta/implementation => extent}/filter/MaskFilter.java (87%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{beta/implementation => extent}/filter/block/AbstractExtentFilterBlock.java (83%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{beta/implementation => extent}/filter/block/AbstractFilterBlock.java (97%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{beta/implementation => extent}/filter/block/AbstractSingleFilterBlock.java (96%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{beta/implementation => extent}/filter/block/ArrayFilterBlock.java (97%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{beta/implementation => extent}/filter/block/CharFilterBlock.java (96%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{beta/implementation => extent}/filter/block/ChunkFilterBlock.java (85%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{beta/implementation => extent}/filter/block/DelegateFilter.java (61%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{beta/implementation => extent}/filter/block/ExtentFilterBlock.java (92%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{beta/implementation => extent}/filter/block/FilterBlock.java (98%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{beta/implementation => extent}/filter/block/SingleFilterBlock.java (88%) rename worldedit-core/src/main/java/com/{sk89q/worldedit => fastasyncworldedit/core}/extent/inventory/SlottableBlockBag.java (83%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{beta/implementation/processors => extent/processor}/BatchProcessorHolder.java (83%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{beta/implementation/processors => extent/processor}/EmptyBatchProcessor.java (82%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{beta/implementation/processors => extent/processor}/ExtentBatchProcessorHolder.java (81%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{beta/implementation/processors => extent/processor}/HeightmapProcessor.java (91%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{beta/implementation/processors => extent/processor}/IBatchProcessorHolder.java (84%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{beta/implementation/processors => extent/processor}/LimitExtent.java (97%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{beta/implementation/processors => extent/processor}/MultiBatchProcessor.java (95%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{beta/implementation/processors => extent/processor}/NullProcessor.java (78%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{beta/implementation/processors => extent/processor}/ProcessorScope.java (95%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object/brush => extent/processor}/heightmap/AbstractDelegateHeightMap.java (85%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object/brush => extent/processor}/heightmap/ArrayHeightMap.java (93%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object/brush => extent/processor}/heightmap/AverageHeightMapFilter.java (95%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object/brush => extent/processor}/heightmap/FlatScalableHeightMap.java (85%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object/brush => extent/processor}/heightmap/HeightMap.java (99%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{beta/implementation/lighting => extent/processor/heightmap}/HeightMapType.java (95%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object/brush => extent/processor}/heightmap/RotatableHeightMap.java (86%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object/brush => extent/processor}/heightmap/ScalableHeightMap.java (95%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{beta/implementation => extent/processor}/lighting/NMSRelighter.java (97%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{beta/implementation => extent/processor}/lighting/NullRelighter.java (93%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => extent/processor/lighting}/RelightMode.java (91%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{beta/implementation => extent/processor}/lighting/RelightProcessor.java (83%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{beta/implementation => extent/processor}/lighting/Relighter.java (96%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{beta/implementation => extent/processor}/lighting/RelighterFactory.java (81%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object/extent => extent/transform}/Linear3DTransform.java (88%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object/extent => extent/transform}/LinearTransform.java (88%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object/extent => extent/transform}/MultiTransform.java (95%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object/extent => extent/transform}/PatternTransform.java (85%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object/extent => extent/transform}/RandomTransform.java (87%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object/extent => extent/transform}/ScaleTransform.java (96%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object/extent => extent/transform}/SelectTransform.java (94%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => }/function/NullRegionFunction.java (86%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => }/function/QuadFunction.java (65%) rename worldedit-core/src/main/java/com/{sk89q/worldedit => fastasyncworldedit/core}/function/RegionMaskTestFunction.java (56%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => }/function/SurfaceRegionFunction.java (91%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => }/function/block/BiomeCopy.java (91%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => }/function/block/CombinedBlockCopy.java (94%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => }/function/block/SimpleBlockCopy.java (91%) rename worldedit-core/src/main/java/com/{sk89q/worldedit => fastasyncworldedit/core}/function/generator/CavesGen.java (99%) rename worldedit-core/src/main/java/com/{sk89q/worldedit => fastasyncworldedit/core}/function/generator/GenBase.java (95%) rename worldedit-core/src/main/java/com/{sk89q/worldedit => fastasyncworldedit/core}/function/generator/OreGen.java (97%) rename worldedit-core/src/main/java/com/{sk89q/worldedit => fastasyncworldedit/core}/function/generator/Resource.java (76%) rename worldedit-core/src/main/java/com/{sk89q/worldedit => fastasyncworldedit/core}/function/generator/SchemGen.java (90%) rename worldedit-core/src/main/java/com/{sk89q/worldedit => fastasyncworldedit/core}/function/mask/ABlockMask.java (93%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => }/function/mask/AbstractDelegateMask.java (92%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => function}/mask/AdjacentAnyMask.java (93%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => function}/mask/AdjacentMask.java (94%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => function}/mask/AirMask.java (90%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => function}/mask/AngleMask.java (98%) rename worldedit-core/src/main/java/com/{sk89q/worldedit => fastasyncworldedit/core}/function/mask/BlockMaskBuilder.java (98%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => function}/mask/CachedMask.java (90%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => function}/mask/DataMask.java (95%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{beta => function/mask}/DirectionMask.java (69%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => function}/mask/ExtremaMask.java (98%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => function}/mask/IdDataMask.java (95%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => function}/mask/IdMask.java (95%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object/brush => function}/mask/ImageBrushMask.java (95%) rename worldedit-core/src/main/java/com/{sk89q/worldedit => fastasyncworldedit/core}/function/mask/InverseMask.java (76%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object/brush => function}/mask/LayerBrushMask.java (95%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => function}/mask/LiquidMask.java (88%) rename worldedit-core/src/main/java/com/{sk89q/worldedit => fastasyncworldedit/core}/function/mask/MaskUnion.java (76%) rename worldedit-core/src/main/java/com/{sk89q/worldedit => fastasyncworldedit/core}/function/mask/MaskUnion2D.java (55%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => function}/mask/MaskedTargetBlock.java (96%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => function}/mask/PlaneMask.java (97%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => function}/mask/ROCAngleMask.java (96%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => function}/mask/RadiusMask.java (96%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => function}/mask/RandomMask.java (93%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => function}/mask/ResettableMask.java (72%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => function}/mask/SimplexMask.java (87%) rename worldedit-core/src/main/java/com/{sk89q/worldedit => fastasyncworldedit/core}/function/mask/SingleBlockStateMask.java (88%) rename worldedit-core/src/main/java/com/{sk89q/worldedit => fastasyncworldedit/core}/function/mask/SingleBlockTypeMask.java (89%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object/brush => function}/mask/SplatterBrushMask.java (91%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object/brush => function}/mask/StencilBrushMask.java (94%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => function}/mask/SurfaceMask.java (89%) rename worldedit-core/src/main/java/com/{sk89q/worldedit => fastasyncworldedit/core}/function/mask/WallMakeMask.java (86%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => function}/mask/WallMask.java (93%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => function}/mask/XAxisMask.java (93%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => function}/mask/YAxisMask.java (93%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => function}/mask/ZAxisMask.java (92%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => function}/pattern/AbstractExtentPattern.java (89%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => function}/pattern/AngleColorPattern.java (96%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => function}/pattern/AverageColorPattern.java (96%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => function}/pattern/BiomeApplyingPattern.java (94%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => function}/pattern/BufferedPattern.java (93%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => function}/pattern/BufferedPattern2D.java (88%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => function/pattern}/DataAnglePattern.java (95%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => function}/pattern/DataPattern.java (96%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => function}/pattern/DesaturatePattern.java (97%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => function}/pattern/ExistingPattern.java (93%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => function}/pattern/ExpressionPattern.java (97%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => function}/pattern/IdDataMaskPattern.java (94%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => function}/pattern/IdPattern.java (93%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => function}/pattern/Linear2DBlockPattern.java (96%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => function}/pattern/Linear3DBlockPattern.java (96%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => function}/pattern/LinearBlockPattern.java (95%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => function}/pattern/MaskedPattern.java (95%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => function}/pattern/NoXPattern.java (89%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => function}/pattern/NoYPattern.java (89%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => function}/pattern/NoZPattern.java (89%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => function}/pattern/OffsetPattern.java (91%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => function}/pattern/PatternTraverser.java (97%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => function}/pattern/PropertyPattern.java (98%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => function}/pattern/RandomFullClipboardPattern.java (95%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => function}/pattern/RandomOffsetPattern.java (93%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => function}/pattern/RelativePattern.java (92%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => function}/pattern/ResettablePattern.java (72%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => function}/pattern/SaturatePattern.java (97%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => function}/pattern/ShadePattern.java (96%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => function}/pattern/SolidRandomOffsetPattern.java (95%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => function}/pattern/SurfaceRandomOffsetPattern.java (96%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => function}/visitor/AboveVisitor.java (96%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => function}/visitor/DFSRecursiveVisitor.java (95%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => function}/visitor/DFSVisitor.java (98%) rename worldedit-core/src/main/java/com/{sk89q/worldedit => fastasyncworldedit/core}/function/visitor/DirectionalVisitor.java (70%) rename worldedit-core/src/main/java/com/{sk89q/worldedit => fastasyncworldedit/core}/function/visitor/IntersectRegionFunction.java (92%) rename worldedit-core/src/main/java/com/{sk89q/worldedit => fastasyncworldedit/core}/function/visitor/Order.java (91%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object/changeset => history}/DiskStorageHistory.java (97%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object/changeset => history}/MemoryOptimizedHistory.java (95%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{logging => history}/RollbackOptimizedHistory.java (95%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => history}/change/MutableBiomeChange.java (89%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => history}/change/MutableBlockChange.java (94%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => history}/change/MutableEntityChange.java (98%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => history}/change/MutableFullBlockChange.java (97%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => history}/change/MutableTileChange.java (94%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => history}/change/StreamChange.java (80%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => history}/changeset/AbstractChangeSet.java (96%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => history}/changeset/AbstractDelegateChangeSet.java (97%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => history}/changeset/BlockBagChangeSet.java (98%) rename worldedit-core/src/main/java/com/{sk89q/worldedit => fastasyncworldedit/core}/history/changeset/ChangeSetSummary.java (95%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => history}/changeset/FaweStreamChangeSet.java (97%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => history/changeset}/NullChangeSet.java (93%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => history}/changeset/SimpleChangeSetSummary.java (92%) rename worldedit-core/src/main/java/com/{sk89q/worldedit => fastasyncworldedit/core}/internal/command/MethodInjector.java (92%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => internal}/exception/FaweBlockBagException.java (80%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => internal}/exception/FaweChunkLoadException.java (80%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => internal}/exception/FaweException.java (96%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => internal}/io/AbstractDelegateOutputStream.java (93%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => internal}/io/FastByteArrayOutputStream.java (97%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => internal}/io/FastByteArraysInputStream.java (98%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => internal/io}/FaweInputStream.java (97%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => internal/io}/FaweOutputStream.java (98%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => internal}/io/LittleEndianOutputStream.java (99%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => internal}/io/NonCloseableInputStream.java (95%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => internal}/io/ResettableFileInputStream.java (90%) rename worldedit-core/src/main/java/com/{sk89q/jnbt/fawe => fastasyncworldedit/core/jnbt}/CompressedCompoundTag.java (88%) rename worldedit-core/src/main/java/com/{sk89q/jnbt/fawe => fastasyncworldedit/core/jnbt}/CompressedSchematicTag.java (77%) rename worldedit-core/src/main/java/com/{sk89q/jnbt/fawe => fastasyncworldedit/core/jnbt}/NumberTag.java (79%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object/collection => math}/BitArray.java (99%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object/collection => math}/BitArrayUnstretched.java (98%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object/collection => math}/BlockVector3ChunkMap.java (93%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object/collection => math}/BlockVectorSet.java (97%) rename worldedit-core/src/main/java/com/{sk89q/worldedit => fastasyncworldedit/core}/math/DelegateBlockVector3.java (98%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object/collection => math}/FastBitSet.java (99%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => math}/IntPair.java (93%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => math}/IntTriple.java (94%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object/collection => math}/LocalBlockVectorSet.java (98%) rename worldedit-core/src/main/java/com/{sk89q/worldedit => fastasyncworldedit/core}/math/MutableBlockVector2.java (91%) rename worldedit-core/src/main/java/com/{sk89q/worldedit => fastasyncworldedit/core}/math/MutableBlockVector3.java (95%) rename worldedit-core/src/main/java/com/{sk89q/worldedit => fastasyncworldedit/core}/math/MutableVector3.java (96%) rename worldedit-core/src/main/java/com/{sk89q/worldedit => fastasyncworldedit/core}/math/OffsetBlockVector3.java (83%) rename worldedit-core/src/main/java/com/{sk89q/worldedit => fastasyncworldedit/core}/math/Vector3Impl.java (87%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => math}/random/NoiseRandom.java (94%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => math}/random/SimpleRandom.java (94%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => math}/random/SimplexNoise.java (99%) rename worldedit-core/src/main/java/com/{sk89q/worldedit/math/noise => fastasyncworldedit/core/math/random}/SimplexNoiseGenerator.java (85%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => math}/random/TrueRandom.java (88%) rename worldedit-core/src/main/java/com/{sk89q/worldedit => fastasyncworldedit/core}/math/transform/RoundedTransform.java (88%) delete mode 100644 worldedit-core/src/main/java/com/fastasyncworldedit/core/object/Metadatable.java delete mode 100644 worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/scroll/ScrollTool.java delete mode 100644 worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/DifferentialArray.java delete mode 100644 worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/DifferentialBlockBuffer.java delete mode 100644 worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/DifferentialCharBlockBuffer.java delete mode 100644 worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/DifferentialCollection.java delete mode 100644 worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/LocalBlockVector2DSet.java delete mode 100644 worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/ObjObjMap.java delete mode 100644 worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/SoftHashMap.java delete mode 100644 worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/SparseBitSet.java delete mode 100644 worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/SparseBlockSet.java delete mode 100644 worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/SummedAreaTable.java delete mode 100644 worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/AsyncBufferedOutputStream.java delete mode 100644 worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/BufferedRandomAccessFile.java delete mode 100644 worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/FastByteArrayInputStream.java delete mode 100644 worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/NonClosableOutputStream.java delete mode 100644 worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/PGZIPBlock.java delete mode 100644 worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/PGZIPOutputStream.java delete mode 100644 worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/PGZIPState.java delete mode 100644 worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/PGZIPThreadLocal.java delete mode 100644 worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/RandomAccessInputStream.java delete mode 100644 worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/RandomFileOutputStream.java delete mode 100644 worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/serialize/Serialize.java delete mode 100644 worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/zstd/ZstdInputStream.java rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{beta => queue}/Filter.java (92%) create mode 100644 worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/FilterBlockMask.java rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{beta => queue}/IBatchProcessor.java (93%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{beta => queue}/IBlocks.java (95%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{beta => queue}/IChunk.java (92%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{beta => queue}/IChunkCache.java (91%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{beta/implementation => queue}/IChunkExtent.java (96%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{beta => queue}/IChunkGet.java (89%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{beta => queue}/IChunkSet.java (95%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{beta => queue}/IDelegateFilter.java (90%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{beta => queue}/IQueueChunk.java (95%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{beta => queue}/IQueueExtent.java (94%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{beta => queue}/IQueueWrapper.java (77%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{beta => queue}/ITileInput.java (72%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{beta/implementation => }/queue/Pool.java (71%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{beta => queue}/Trimable.java (92%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{beta => queue/implementation}/Flood.java (96%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{beta/implementation/queue => queue/implementation}/ParallelQueueExtent.java (91%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{beta/implementation/queue => queue/implementation}/QueueHandler.java (92%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{beta/implementation/queue => queue/implementation}/QueuePool.java (84%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{beta/implementation/queue => queue/implementation}/SingleThreadQueueExtent.java (92%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{beta => queue}/implementation/blocks/BitSetBlocks.java (95%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{beta => queue}/implementation/blocks/CharBlocks.java (97%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{beta => queue}/implementation/blocks/CharGetBlocks.java (87%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{beta => queue}/implementation/blocks/CharSetBlocks.java (95%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{beta => queue}/implementation/blocks/NullChunkGet.java (88%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{beta => queue}/implementation/chunk/ChunkCache.java (92%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{beta => queue}/implementation/chunk/ChunkHolder.java (95%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{beta => queue}/implementation/chunk/NullChunk.java (91%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{beta => queue}/implementation/packet/ChunkPacket.java (91%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{beta => queue}/implementation/preloader/AsyncPreloader.java (96%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{beta => queue}/implementation/preloader/Preloader.java (67%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => }/regions/FuzzyRegion.java (96%) rename worldedit-core/src/main/java/com/{sk89q/worldedit => fastasyncworldedit/core}/regions/IDelegateRegion.java (94%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => }/regions/PolyhedralRegion.java (91%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => regions}/RegionWrapper.java (99%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => }/regions/Triangle.java (99%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/regions/{general => filter}/CuboidRegionFilter.java (94%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/regions/{general => filter}/RegionFilter.java (71%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => }/regions/selector/FuzzyRegionSelector.java (96%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => }/regions/selector/PolyhedralRegionSelector.java (85%) rename worldedit-core/src/main/java/com/{sk89q/worldedit => fastasyncworldedit/core}/registry/RegistryItem.java (68%) rename worldedit-core/src/main/java/com/{sk89q/worldedit => fastasyncworldedit/core}/registry/state/PropertyGroup.java (97%) rename worldedit-core/src/main/java/com/{sk89q/worldedit => fastasyncworldedit/core}/registry/state/PropertyKey.java (99%) rename worldedit-core/src/main/java/com/{sk89q/worldedit => fastasyncworldedit/core}/registry/state/PropertyKeySet.java (99%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object/string => util}/JoinedCharSequence.java (97%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object/string => util}/MutableCharSequence.java (97%) rename worldedit-core/src/main/java/com/{sk89q/worldedit/util/nbt => fastasyncworldedit/core/util}/NbtUtils.java (55%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => util}/collection/AdaptedMap.java (96%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => util}/collection/AdaptedSetCollection.java (98%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => util}/collection/BlockSet.java (98%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => util}/collection/CleanableThreadLocal.java (95%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => util}/collection/CpuBlockSet.java (98%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => util}/collection/FastRandomCollection.java (95%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => util}/collection/IAdaptedMap.java (97%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => util}/collection/LongHashSet.java (81%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => util}/collection/MemBlockSet.java (99%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => util}/collection/MutablePair.java (88%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => util}/collection/RandomCollection.java (92%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => util}/collection/SimpleRandomCollection.java (90%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => util}/collection/SummedColorTable.java (99%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => util}/collection/YieldIterable.java (97%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => util}/progress/ChatProgressTracker.java (90%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => util}/progress/DefaultProgressTracker.java (96%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => util}/task/AsyncNotifyQueue.java (97%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => util/task}/DelegateConsumer.java (86%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => util/task}/RunnableVal.java (92%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => util/task}/RunnableVal2.java (92%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => util/task}/RunnableVal3.java (90%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => util/task}/RunnableVal4.java (92%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => util}/task/SingleThreadIntervalQueue.java (97%) rename worldedit-core/src/main/java/com/fastasyncworldedit/core/{object => util}/task/ThrowableSupplier.java (64%) rename worldedit-core/src/main/java/com/{sk89q/worldedit => fastasyncworldedit/core}/world/SimpleWorld.java (81%) rename worldedit-core/src/main/java/com/{sk89q/worldedit => fastasyncworldedit/core}/world/block/BlanketBaseBlock.java (82%) rename worldedit-core/src/main/java/com/{sk89q/worldedit => fastasyncworldedit/core}/world/block/BlockID.java (99%) rename worldedit-core/src/main/java/com/{sk89q/worldedit => fastasyncworldedit/core}/world/block/BlockTypeSwitch.java (76%) rename worldedit-core/src/main/java/com/{sk89q/worldedit => fastasyncworldedit/core}/world/block/BlockTypeSwitchBuilder.java (84%) rename worldedit-core/src/main/java/com/{sk89q/worldedit => fastasyncworldedit/core}/world/block/CompoundInput.java (64%) rename worldedit-core/src/main/java/com/{sk89q/worldedit => fastasyncworldedit/core}/world/block/ItemTypesCache.java (94%) delete mode 100644 worldedit-core/src/main/java/com/sk89q/jnbt/fawe/package-info.java create mode 100644 worldedit-core/src/main/java/com/sk89q/worldedit/command/package-info.java rename worldedit-core/src/main/java/com/sk89q/worldedit/{internal => command/util}/annotation/AllowedRegion.java (90%) rename worldedit-core/src/main/java/com/sk89q/worldedit/{internal/command => command/util/annotation}/ConfirmHandler.java (61%) rename worldedit-core/src/main/java/com/sk89q/{minecraft/util/commands => worldedit/command/util/annotation}/Link.java (79%) create mode 100644 worldedit-core/src/main/java/com/sk89q/worldedit/command/util/annotation/PatternList.java rename worldedit-core/src/main/java/com/sk89q/{minecraft/util/commands => worldedit/command/util/annotation}/Step.java (80%) rename worldedit-core/src/main/java/com/sk89q/worldedit/{internal => command/util}/annotation/Time.java (86%) create mode 100644 worldedit-core/src/main/java/com/sk89q/worldedit/command/util/annotation/package-info.java delete mode 100644 worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/XAxisMaskParser.java delete mode 100644 worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/YAxisMaskParser.java delete mode 100644 worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/ZAxisMaskParser.java delete mode 100644 worldedit-core/src/main/java/com/sk89q/worldedit/function/operation/SetLocatedBlocks.java~HEAD create mode 100644 worldedit-core/src/main/java/com/sk89q/worldedit/function/operation/package-info.java delete mode 100644 worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/ScanChunk.java delete mode 100644 worldedit-core/src/main/java/com/sk89q/worldedit/internal/annotation/PatternList.java create mode 100644 worldedit-core/src/main/java/com/sk89q/worldedit/util/io/file/ArchiveUnpacker.java rename worldedit-core/src/main/java/com/sk89q/worldedit/util/io/file/{ArchiveNioSupport.java~18a55bc14... Add new experimental snapshot API (#524) => AttributeTarget.java} (63%) delete mode 100644 worldedit-core/src/main/java/com/sk89q/worldedit/util/task/LinkedFuture.java delete mode 100644 worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockTypeUtil.java diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index d75377ab6..9c915669a 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -5,9 +5,6 @@ Thank you for your interest in contributing to FastAsyncWorldEdit! We appreciate effort, but to make sure that the inclusion of your patch is a smooth process, we ask that you make note of the following guidelines. -* **Follow the [Oracle coding conventions](http://www.oracle.com/technetwork/java/codeconv-138413.html).** - We can't stress this enough; if your code has notable issues, it may delay - the process significantly. * **Target Java 11 for source and compilation.** Make sure to mark methods with ` @Override` that override methods of parent classes, or that implement methods of interfaces. @@ -24,6 +21,8 @@ ask that you make note of the following guidelines. around ten minutes to think about what the code is doing and whether it seems awfully roundabout. If you had to copy the same large piece of code in several places, that's bad. +* **Annotate modified upstream (WorldEdit) code.** Doing so makes it easier to differentiate + between modifications. Take a look at the [Examples](#example) how that's been done. * **Keep commit summaries under 70 characters.** For more details, place two new lines after the summary line and write away! * **Test your code.** We're not interested in broken code, for the obvious reasons. @@ -60,15 +59,33 @@ adjust past changes. Example ------- +### Code style This is **GOOD:** +```java if (var.func(param1, param2)) { // do things } +``` This is **VERY BAD:** - +```java if(var.func( param1, param2 )) { // do things } +``` + +### Diff Annotations +```java +//FAWE start +public Region[] getCurrentRegions(FaweMaskManager.MaskType type) { + return WEManager.IMP.getMask(this, type); +} +//FAWE end +``` +```java +//FAWE start - extends PassthroughExtent > implements Extent +public class EditSession extends PassthroughExtent implements AutoCloseable { +//FAWE end +``` diff --git a/worldedit-bukkit/build.gradle.kts b/worldedit-bukkit/build.gradle.kts index b64b6e3ce..ed73c93fc 100644 --- a/worldedit-bukkit/build.gradle.kts +++ b/worldedit-bukkit/build.gradle.kts @@ -99,6 +99,8 @@ dependencies { api("com.intellectualsites.paster:Paster:1.0.1-SNAPSHOT") api("org.lz4:lz4-java:1.8.0") api("net.jpountz:lz4-java-stream:1.0.0") { isTransitive = false } + api("com.zaxxer:SparseBitSet:1.2") { isTransitive = false } + api("org.anarres:parallelgzip:1.0.5") { isTransitive = false } // Third party implementation("org.bstats:bstats-bukkit:2.2.1") implementation("org.bstats:bstats-base:2.2.1") @@ -179,7 +181,14 @@ tasks.named("shadowJar") { relocate("net.kyori", "com.fastasyncworldedit.core.adventure") { include(dependency("net.kyori:adventure-nbt:4.8.1")) } + relocate("com.zaxxer", "com.fastasyncworldedit.core.math") { + include(dependency("com.zaxxer:SparseBitSet:1.2")) + } + relocate("org.anarres", "com.fastasyncworldedit.core.internal.io") { + include(dependency("org.anarres:parallelgzip:1.0.5")) + } } + minimize() } tasks.named("assemble").configure { diff --git a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/FaweBukkit.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/FaweBukkit.java index dc2dff706..3b97d5140 100644 --- a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/FaweBukkit.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/FaweBukkit.java @@ -4,9 +4,9 @@ import com.fastasyncworldedit.bukkit.util.image.BukkitImageViewer; import com.fastasyncworldedit.core.FAWEPlatformAdapterImpl; import com.fastasyncworldedit.core.Fawe; import com.fastasyncworldedit.core.IFawe; -import com.fastasyncworldedit.core.beta.implementation.preloader.AsyncPreloader; -import com.fastasyncworldedit.core.beta.implementation.preloader.Preloader; -import com.fastasyncworldedit.core.beta.implementation.queue.QueueHandler; +import com.fastasyncworldedit.core.queue.implementation.preloader.AsyncPreloader; +import com.fastasyncworldedit.core.queue.implementation.preloader.Preloader; +import com.fastasyncworldedit.core.queue.implementation.QueueHandler; import com.fastasyncworldedit.bukkit.adapter.BukkitQueueHandler; import com.fastasyncworldedit.bukkit.adapter.NMSAdapter; import com.fastasyncworldedit.bukkit.listener.BrushListener; diff --git a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/BukkitQueueHandler.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/BukkitQueueHandler.java index 1170acf56..a843ec0d5 100644 --- a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/BukkitQueueHandler.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/BukkitQueueHandler.java @@ -1,7 +1,7 @@ package com.fastasyncworldedit.bukkit.adapter; import co.aikar.timings.Timings; -import com.fastasyncworldedit.core.beta.implementation.queue.QueueHandler; +import com.fastasyncworldedit.core.queue.implementation.QueueHandler; import com.fastasyncworldedit.bukkit.listener.ChunkListener; import com.sk89q.worldedit.internal.util.LogManagerCompat; import org.apache.logging.log4j.Logger; diff --git a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/IDelegateBukkitImplAdapter.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/IDelegateBukkitImplAdapter.java index b6f3c1a34..5ef39ed05 100644 --- a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/IDelegateBukkitImplAdapter.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/IDelegateBukkitImplAdapter.java @@ -1,7 +1,6 @@ package com.fastasyncworldedit.bukkit.adapter; -import com.fastasyncworldedit.core.beta.implementation.packet.ChunkPacket; -import com.sk89q.jnbt.CompoundTag; +import com.fastasyncworldedit.core.queue.implementation.packet.ChunkPacket; import com.sk89q.jnbt.Tag; import com.sk89q.worldedit.blocks.BaseItem; import com.sk89q.worldedit.blocks.BaseItemStack; diff --git a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/MapChunkUtil.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/MapChunkUtil.java index 4841771ee..48a22340e 100644 --- a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/MapChunkUtil.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/MapChunkUtil.java @@ -1,6 +1,6 @@ package com.fastasyncworldedit.bukkit.adapter; -import com.fastasyncworldedit.core.beta.implementation.packet.ChunkPacket; +import com.fastasyncworldedit.core.queue.implementation.packet.ChunkPacket; import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.bukkit.adapter.BukkitImplAdapter; import com.sk89q.worldedit.math.BlockVector3; diff --git a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/NMSAdapter.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/NMSAdapter.java index 2b6f736f2..bed4f7e80 100644 --- a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/NMSAdapter.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/NMSAdapter.java @@ -1,11 +1,11 @@ package com.fastasyncworldedit.bukkit.adapter; import com.fastasyncworldedit.core.FAWEPlatformAdapterImpl; -import com.fastasyncworldedit.core.beta.IChunkGet; +import com.fastasyncworldedit.core.queue.IChunkGet; import com.fastasyncworldedit.core.configuration.Settings; import com.sk89q.worldedit.bukkit.WorldEditPlugin; import com.sk89q.worldedit.math.BlockVector3; -import com.sk89q.worldedit.world.block.BlockID; +import com.fastasyncworldedit.core.world.block.BlockID; import com.sk89q.worldedit.world.block.BlockState; import com.sk89q.worldedit.world.block.BlockTypesCache; diff --git a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/NMSRelighterFactory.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/NMSRelighterFactory.java index ff436f235..5a81211f5 100644 --- a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/NMSRelighterFactory.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/NMSRelighterFactory.java @@ -1,12 +1,12 @@ package com.fastasyncworldedit.bukkit.adapter; -import com.fastasyncworldedit.core.beta.IQueueChunk; -import com.fastasyncworldedit.core.beta.IQueueExtent; -import com.fastasyncworldedit.core.beta.implementation.lighting.NMSRelighter; -import com.fastasyncworldedit.core.beta.implementation.lighting.Relighter; -import com.fastasyncworldedit.core.beta.implementation.lighting.RelighterFactory; +import com.fastasyncworldedit.core.queue.IQueueChunk; +import com.fastasyncworldedit.core.queue.IQueueExtent; +import com.fastasyncworldedit.core.extent.processor.lighting.NMSRelighter; +import com.fastasyncworldedit.core.extent.processor.lighting.Relighter; +import com.fastasyncworldedit.core.extent.processor.lighting.RelighterFactory; import com.fastasyncworldedit.core.configuration.Settings; -import com.fastasyncworldedit.core.object.RelightMode; +import com.fastasyncworldedit.core.extent.processor.lighting.RelightMode; import com.sk89q.worldedit.world.World; import org.jetbrains.annotations.NotNull; diff --git a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/Regenerator.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/Regenerator.java index 65ce4ff07..a0c75720e 100644 --- a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/Regenerator.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/Regenerator.java @@ -1,8 +1,8 @@ package com.fastasyncworldedit.bukkit.adapter; -import com.fastasyncworldedit.core.beta.IChunkCache; -import com.fastasyncworldedit.core.beta.IChunkGet; -import com.fastasyncworldedit.core.beta.implementation.queue.SingleThreadQueueExtent; +import com.fastasyncworldedit.core.queue.IChunkCache; +import com.fastasyncworldedit.core.queue.IChunkGet; +import com.fastasyncworldedit.core.queue.implementation.SingleThreadQueueExtent; import com.fastasyncworldedit.core.configuration.Settings; import com.fastasyncworldedit.core.util.MathMan; import com.sk89q.worldedit.extent.Extent; diff --git a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/filter/GriefDefenderFilter.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/filter/GriefDefenderFilter.java index 9679af1c6..5f4e79629 100644 --- a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/filter/GriefDefenderFilter.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/filter/GriefDefenderFilter.java @@ -1,6 +1,6 @@ package com.fastasyncworldedit.bukkit.filter; -import com.fastasyncworldedit.core.regions.general.CuboidRegionFilter; +import com.fastasyncworldedit.core.regions.filter.CuboidRegionFilter; import com.fastasyncworldedit.core.util.TaskManager; import com.sk89q.worldedit.math.BlockVector2; import com.griefdefender.api.claim.Claim; diff --git a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/filter/GriefPreventionFilter.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/filter/GriefPreventionFilter.java index 3087e01cc..e95b83310 100644 --- a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/filter/GriefPreventionFilter.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/filter/GriefPreventionFilter.java @@ -1,6 +1,6 @@ package com.fastasyncworldedit.bukkit.filter; -import com.fastasyncworldedit.core.regions.general.CuboidRegionFilter; +import com.fastasyncworldedit.core.regions.filter.CuboidRegionFilter; import com.fastasyncworldedit.core.util.TaskManager; import com.sk89q.worldedit.math.BlockVector2; import me.ryanhamshire.GriefPrevention.Claim; diff --git a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/filter/WorldGuardFilter.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/filter/WorldGuardFilter.java index eff5c6864..1838c8fc1 100644 --- a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/filter/WorldGuardFilter.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/filter/WorldGuardFilter.java @@ -1,7 +1,7 @@ package com.fastasyncworldedit.bukkit.filter; import com.fastasyncworldedit.core.Fawe; -import com.fastasyncworldedit.core.regions.general.CuboidRegionFilter; +import com.fastasyncworldedit.core.regions.filter.CuboidRegionFilter; import com.sk89q.worldedit.bukkit.BukkitAdapter; import com.sk89q.worldedit.internal.util.LogManagerCompat; import com.sk89q.worldedit.math.BlockVector3; diff --git a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/listener/BrushListener.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/listener/BrushListener.java index 888f59924..c2f5100fe 100644 --- a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/listener/BrushListener.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/listener/BrushListener.java @@ -1,8 +1,8 @@ package com.fastasyncworldedit.bukkit.listener; -import com.fastasyncworldedit.core.object.brush.MovableTool; -import com.fastasyncworldedit.core.object.brush.ResettableTool; -import com.fastasyncworldedit.core.object.brush.scroll.ScrollTool; +import com.fastasyncworldedit.core.command.tool.MovableTool; +import com.fastasyncworldedit.core.command.tool.ResettableTool; +import com.fastasyncworldedit.core.command.tool.scroll.ScrollTool; import com.sk89q.worldedit.LocalSession; import com.sk89q.worldedit.bukkit.BukkitAdapter; import com.sk89q.worldedit.bukkit.BukkitPlayer; diff --git a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/GriefDefenderFeature.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/GriefDefenderFeature.java index ae7634cf6..50078c63c 100644 --- a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/GriefDefenderFeature.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/GriefDefenderFeature.java @@ -2,7 +2,7 @@ package com.fastasyncworldedit.bukkit.regions; import com.fastasyncworldedit.bukkit.filter.GriefDefenderFilter; import com.fastasyncworldedit.core.regions.FaweMask; -import com.fastasyncworldedit.core.regions.general.RegionFilter; +import com.fastasyncworldedit.core.regions.filter.RegionFilter; import com.flowpowered.math.vector.Vector3i; import com.griefdefender.api.GriefDefender; import com.griefdefender.api.claim.Claim; diff --git a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/GriefPreventionFeature.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/GriefPreventionFeature.java index cde423567..fd741d0e9 100644 --- a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/GriefPreventionFeature.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/GriefPreventionFeature.java @@ -2,7 +2,7 @@ package com.fastasyncworldedit.bukkit.regions; import com.fastasyncworldedit.bukkit.filter.GriefPreventionFilter; import com.fastasyncworldedit.core.regions.FaweMask; -import com.fastasyncworldedit.core.regions.general.RegionFilter; +import com.fastasyncworldedit.core.regions.filter.RegionFilter; import com.sk89q.worldedit.bukkit.BukkitAdapter; import com.sk89q.worldedit.internal.util.LogManagerCompat; import com.sk89q.worldedit.math.BlockVector3; diff --git a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/WorldGuardFeature.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/WorldGuardFeature.java index b49bceb13..3b833954d 100644 --- a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/WorldGuardFeature.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/WorldGuardFeature.java @@ -1,9 +1,9 @@ package com.fastasyncworldedit.bukkit.regions; import com.fastasyncworldedit.bukkit.filter.WorldGuardFilter; -import com.fastasyncworldedit.core.object.RegionWrapper; +import com.fastasyncworldedit.core.regions.RegionWrapper; import com.fastasyncworldedit.core.regions.FaweMask; -import com.fastasyncworldedit.core.regions.general.RegionFilter; +import com.fastasyncworldedit.core.regions.filter.RegionFilter; import com.sk89q.worldedit.bukkit.BukkitAdapter; import com.sk89q.worldedit.internal.util.LogManagerCompat; import com.sk89q.worldedit.math.BlockVector3; diff --git a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquared/FaweDelegateRegionManager.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquared/FaweDelegateRegionManager.java index ea6abd83c..63750e071 100644 --- a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquared/FaweDelegateRegionManager.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquared/FaweDelegateRegionManager.java @@ -1,7 +1,7 @@ package com.fastasyncworldedit.bukkit.regions.plotsquared; import com.fastasyncworldedit.core.FaweAPI; -import com.fastasyncworldedit.core.object.RelightMode; +import com.fastasyncworldedit.core.extent.processor.lighting.RelightMode; import com.fastasyncworldedit.core.util.EditSessionBuilder; import com.fastasyncworldedit.core.util.TaskManager; import com.plotsquared.core.configuration.Settings; diff --git a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquared/FaweDelegateSchematicHandler.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquared/FaweDelegateSchematicHandler.java index c14032e58..91ed24a7e 100644 --- a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquared/FaweDelegateSchematicHandler.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquared/FaweDelegateSchematicHandler.java @@ -3,7 +3,6 @@ package com.fastasyncworldedit.bukkit.regions.plotsquared; import com.fastasyncworldedit.core.Fawe; import com.fastasyncworldedit.core.FaweAPI; import com.fastasyncworldedit.core.FaweCache; -import com.fastasyncworldedit.core.object.io.PGZIPOutputStream; import com.fastasyncworldedit.core.util.EditSessionBuilder; import com.fastasyncworldedit.core.util.IOUtil; import com.plotsquared.core.PlotSquared; @@ -16,22 +15,23 @@ import com.plotsquared.core.util.SchematicHandler; import com.plotsquared.core.util.task.RunnableVal; import com.plotsquared.core.util.task.TaskManager; import com.sk89q.jnbt.CompoundTag; -import com.sk89q.jnbt.CompressedCompoundTag; +import com.fastasyncworldedit.core.jnbt.CompressedCompoundTag; import com.sk89q.jnbt.NBTInputStream; import com.sk89q.jnbt.NBTOutputStream; import com.sk89q.jnbt.Tag; -import com.sk89q.jnbt.fawe.CompressedSchematicTag; +import com.fastasyncworldedit.core.jnbt.CompressedSchematicTag; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.extent.clipboard.Clipboard; import com.sk89q.worldedit.extent.clipboard.io.BuiltInClipboardFormat; -import com.sk89q.worldedit.extent.clipboard.io.FastSchematicReader; -import com.sk89q.worldedit.extent.clipboard.io.FastSchematicWriter; +import com.fastasyncworldedit.core.extent.clipboard.io.FastSchematicReader; +import com.fastasyncworldedit.core.extent.clipboard.io.FastSchematicWriter; import com.sk89q.worldedit.extent.clipboard.io.MCEditSchematicReader; import com.sk89q.worldedit.extent.clipboard.io.SpongeSchematicReader; import com.sk89q.worldedit.internal.util.LogManagerCompat; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.regions.CuboidRegion; import net.jpountz.lz4.LZ4BlockInputStream; +import org.anarres.parallelgzip.ParallelGZIPOutputStream; import org.apache.logging.log4j.Logger; import org.jetbrains.annotations.NotNull; @@ -136,19 +136,19 @@ public class FaweDelegateSchematicHandler { Clipboard clipboard = (Clipboard) cTag.getSource(); try (OutputStream stream = new FileOutputStream(tmp); NBTOutputStream output = new NBTOutputStream( - new BufferedOutputStream(new PGZIPOutputStream(stream)))) { + new BufferedOutputStream(new ParallelGZIPOutputStream(stream)))) { new FastSchematicWriter(output).write(clipboard); } } else { try (OutputStream stream = new FileOutputStream(tmp); - BufferedOutputStream output = new BufferedOutputStream(new PGZIPOutputStream(stream))) { + BufferedOutputStream output = new BufferedOutputStream(new ParallelGZIPOutputStream(stream))) { LZ4BlockInputStream is = cTag.adapt(cTag.getSource()); IOUtil.copy(is, output); } } } else { try (OutputStream stream = new FileOutputStream(tmp); - NBTOutputStream output = new NBTOutputStream(new PGZIPOutputStream(stream))) { + NBTOutputStream output = new NBTOutputStream(new ParallelGZIPOutputStream(stream))) { Map map = tag.getValue(); output.writeNamedTag("Schematic", map.getOrDefault("Schematic", tag)); } @@ -177,7 +177,7 @@ public class FaweDelegateSchematicHandler { BuiltInClipboardFormat.SPONGE_SCHEMATIC.write(output, clipboard); } try { - try (PGZIPOutputStream gzip = new PGZIPOutputStream(output)) { + try (ParallelGZIPOutputStream gzip = new ParallelGZIPOutputStream(output)) { try (NBTOutputStream nos = new NBTOutputStream(gzip)) { Map map = weTag.getValue(); nos.writeNamedTag("Schematic", map.getOrDefault("Schematic", weTag)); diff --git a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquared/FaweQueueCoordinator.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquared/FaweQueueCoordinator.java index 22802403d..7946af39f 100644 --- a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquared/FaweQueueCoordinator.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquared/FaweQueueCoordinator.java @@ -2,8 +2,8 @@ package com.fastasyncworldedit.bukkit.regions.plotsquared; import com.fastasyncworldedit.core.Fawe; import com.fastasyncworldedit.core.FaweCache; -import com.fastasyncworldedit.core.beta.IQueueChunk; -import com.fastasyncworldedit.core.beta.IQueueExtent; +import com.fastasyncworldedit.core.queue.IQueueChunk; +import com.fastasyncworldedit.core.queue.IQueueExtent; import com.plotsquared.core.queue.LightingMode; import com.plotsquared.core.queue.QueueCoordinator; import com.plotsquared.core.queue.subscriber.ProgressSubscriber; @@ -12,7 +12,7 @@ import com.sk89q.worldedit.entity.Entity; import com.sk89q.worldedit.function.pattern.Pattern; import com.sk89q.worldedit.math.BlockVector2; import com.sk89q.worldedit.math.BlockVector3; -import com.sk89q.worldedit.math.MutableBlockVector3; +import com.fastasyncworldedit.core.math.MutableBlockVector3; import com.sk89q.worldedit.regions.CuboidRegion; import com.sk89q.worldedit.world.World; import com.sk89q.worldedit.world.biome.BiomeType; diff --git a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquared/PlotRegionFilter.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquared/PlotRegionFilter.java index f343401a4..9eeb549b4 100644 --- a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquared/PlotRegionFilter.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquared/PlotRegionFilter.java @@ -1,6 +1,6 @@ package com.fastasyncworldedit.bukkit.regions.plotsquared; -import com.fastasyncworldedit.core.regions.general.CuboidRegionFilter; +import com.fastasyncworldedit.core.regions.filter.CuboidRegionFilter; import com.plotsquared.core.location.Location; import com.plotsquared.core.plot.Plot; import com.plotsquared.core.plot.PlotArea; diff --git a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquared/PlotSquaredFeature.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquared/PlotSquaredFeature.java index 0f35e54ee..984b4d6b4 100644 --- a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquared/PlotSquaredFeature.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquared/PlotSquaredFeature.java @@ -3,7 +3,7 @@ package com.fastasyncworldedit.bukkit.regions.plotsquared; import com.fastasyncworldedit.core.FaweAPI; import com.fastasyncworldedit.core.regions.FaweMask; import com.fastasyncworldedit.core.regions.FaweMaskManager; -import com.fastasyncworldedit.core.regions.general.RegionFilter; +import com.fastasyncworldedit.core.regions.filter.RegionFilter; import com.github.intellectualsites.plotsquared.plot.util.UUIDHandler; import com.plotsquared.core.PlotSquared; import com.plotsquared.core.command.MainCommand; diff --git a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquaredv4/FaweLocalBlockQueue.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquaredv4/FaweLocalBlockQueue.java index 62e63f214..1e8e3531d 100644 --- a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquaredv4/FaweLocalBlockQueue.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquaredv4/FaweLocalBlockQueue.java @@ -3,13 +3,13 @@ package com.fastasyncworldedit.bukkit.regions.plotsquaredv4; import com.fastasyncworldedit.core.Fawe; import com.fastasyncworldedit.core.FaweAPI; import com.fastasyncworldedit.core.FaweCache; -import com.fastasyncworldedit.core.beta.IQueueChunk; -import com.fastasyncworldedit.core.beta.IQueueExtent; +import com.fastasyncworldedit.core.queue.IQueueChunk; +import com.fastasyncworldedit.core.queue.IQueueExtent; import com.github.intellectualsites.plotsquared.plot.util.block.LocalBlockQueue; import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.function.pattern.Pattern; import com.sk89q.worldedit.math.BlockVector3; -import com.sk89q.worldedit.math.MutableBlockVector3; +import com.fastasyncworldedit.core.math.MutableBlockVector3; import com.sk89q.worldedit.world.World; import com.sk89q.worldedit.world.biome.BiomeType; import com.sk89q.worldedit.world.block.BaseBlock; diff --git a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquaredv4/FaweSchematicHandler.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquaredv4/FaweSchematicHandler.java index f67b62009..02a87e35b 100644 --- a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquaredv4/FaweSchematicHandler.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquaredv4/FaweSchematicHandler.java @@ -2,8 +2,7 @@ package com.fastasyncworldedit.bukkit.regions.plotsquaredv4; import com.fastasyncworldedit.core.FaweAPI; import com.fastasyncworldedit.core.FaweCache; -import com.fastasyncworldedit.core.object.clipboard.ReadOnlyClipboard; -import com.fastasyncworldedit.core.object.io.PGZIPOutputStream; +import com.fastasyncworldedit.core.extent.clipboard.ReadOnlyClipboard; import com.fastasyncworldedit.core.util.EditSessionBuilder; import com.fastasyncworldedit.core.util.IOUtil; import com.fastasyncworldedit.core.util.TaskManager; @@ -14,8 +13,8 @@ import com.github.intellectualsites.plotsquared.plot.util.MainUtil; import com.github.intellectualsites.plotsquared.plot.util.SchematicHandler; import com.github.intellectualsites.plotsquared.plot.util.block.LocalBlockQueue; import com.sk89q.jnbt.CompoundTag; -import com.sk89q.jnbt.CompressedCompoundTag; -import com.sk89q.jnbt.fawe.CompressedSchematicTag; +import com.fastasyncworldedit.core.jnbt.CompressedCompoundTag; +import com.fastasyncworldedit.core.jnbt.CompressedSchematicTag; import com.sk89q.jnbt.NBTOutputStream; import com.sk89q.jnbt.Tag; import com.sk89q.worldedit.EditSession; @@ -23,11 +22,12 @@ import com.sk89q.worldedit.bukkit.BukkitAdapter; import com.sk89q.worldedit.extent.clipboard.BlockArrayClipboard; import com.sk89q.worldedit.extent.clipboard.Clipboard; import com.sk89q.worldedit.extent.clipboard.io.BuiltInClipboardFormat; -import com.sk89q.worldedit.extent.clipboard.io.FastSchematicWriter; +import com.fastasyncworldedit.core.extent.clipboard.io.FastSchematicWriter; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.regions.CuboidRegion; import com.sk89q.worldedit.world.World; import net.jpountz.lz4.LZ4BlockInputStream; +import org.anarres.parallelgzip.ParallelGZIPOutputStream; import java.io.BufferedOutputStream; import java.io.File; @@ -84,17 +84,17 @@ public class FaweSchematicHandler extends SchematicHandler { CompressedCompoundTag cTag = (CompressedCompoundTag) tag; if (cTag instanceof CompressedSchematicTag) { Clipboard clipboard = (Clipboard) cTag.getSource(); - try (OutputStream stream = new FileOutputStream(tmp); NBTOutputStream output = new NBTOutputStream(new BufferedOutputStream(new PGZIPOutputStream(stream)))) { + try (OutputStream stream = new FileOutputStream(tmp); NBTOutputStream output = new NBTOutputStream(new BufferedOutputStream(new ParallelGZIPOutputStream(stream)))) { new FastSchematicWriter(output).write(clipboard); } } else { - try (OutputStream stream = new FileOutputStream(tmp); BufferedOutputStream output = new BufferedOutputStream(new PGZIPOutputStream(stream))) { + try (OutputStream stream = new FileOutputStream(tmp); BufferedOutputStream output = new BufferedOutputStream(new ParallelGZIPOutputStream(stream))) { LZ4BlockInputStream is = cTag.adapt(cTag.getSource()); IOUtil.copy(is, stream); } } } else { - try (OutputStream stream = new FileOutputStream(tmp); NBTOutputStream output = new NBTOutputStream(new PGZIPOutputStream(stream))) { + try (OutputStream stream = new FileOutputStream(tmp); NBTOutputStream output = new NBTOutputStream(new ParallelGZIPOutputStream(stream))) { Map map = tag.getValue(); output.writeNamedTag("Schematic", map.getOrDefault("Schematic", tag)); } @@ -126,7 +126,7 @@ public class FaweSchematicHandler extends SchematicHandler { @Override public void run(OutputStream output) { try { - try (PGZIPOutputStream gzip = new PGZIPOutputStream(output)) { + try (ParallelGZIPOutputStream gzip = new ParallelGZIPOutputStream(output)) { try (NBTOutputStream nos = new NBTOutputStream(gzip)) { Map map = weTag.getValue(); nos.writeNamedTag("Schematic", map.getOrDefault("Schematic", weTag)); diff --git a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquaredv4/PlotRegionFilter.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquaredv4/PlotRegionFilter.java index 403f28fc4..5043e1b1f 100644 --- a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquaredv4/PlotRegionFilter.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquaredv4/PlotRegionFilter.java @@ -1,6 +1,6 @@ package com.fastasyncworldedit.bukkit.regions.plotsquaredv4; -import com.fastasyncworldedit.core.regions.general.CuboidRegionFilter; +import com.fastasyncworldedit.core.regions.filter.CuboidRegionFilter; import com.github.intellectualsites.plotsquared.plot.object.Location; import com.github.intellectualsites.plotsquared.plot.object.Plot; import com.github.intellectualsites.plotsquared.plot.object.PlotArea; diff --git a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquaredv4/PlotSquaredFeature.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquaredv4/PlotSquaredFeature.java index 9b31c0c3b..9c25b5076 100644 --- a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquaredv4/PlotSquaredFeature.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquaredv4/PlotSquaredFeature.java @@ -1,10 +1,10 @@ package com.fastasyncworldedit.bukkit.regions.plotsquaredv4; import com.fastasyncworldedit.core.FaweAPI; -import com.fastasyncworldedit.core.object.RegionWrapper; +import com.fastasyncworldedit.core.regions.RegionWrapper; import com.fastasyncworldedit.core.regions.FaweMask; import com.fastasyncworldedit.core.regions.FaweMaskManager; -import com.fastasyncworldedit.core.regions.general.RegionFilter; +import com.fastasyncworldedit.core.regions.filter.RegionFilter; import com.github.intellectualsites.plotsquared.plot.PlotSquared; import com.github.intellectualsites.plotsquared.plot.commands.MainCommand; import com.github.intellectualsites.plotsquared.plot.config.Settings; diff --git a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/util/WorldUnloadedException.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/util/WorldUnloadedException.java index 5c36e6716..606da898d 100644 --- a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/util/WorldUnloadedException.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/util/WorldUnloadedException.java @@ -1,22 +1,3 @@ -/* - * WorldEdit, a Minecraft world manipulation toolkit - * Copyright (C) sk89q - * Copyright (C) WorldEdit team and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - package com.fastasyncworldedit.bukkit.util; import com.fastasyncworldedit.core.configuration.Caption; diff --git a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitAdapter.java b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitAdapter.java index fd3a8c816..2c6f3e063 100644 --- a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitAdapter.java +++ b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitAdapter.java @@ -62,7 +62,7 @@ import static com.google.common.base.Preconditions.checkNotNull; /** * Adapts between Bukkit and WorldEdit equivalent objects. */ -// FAWE start - enum-ized +//FAWE start - enum-ized public enum BukkitAdapter { INSTANCE; @@ -77,7 +77,7 @@ public enum BukkitAdapter { return INSTANCE.adapter; } - // FAWE end + //FAWE end private static final ParserContext TO_BLOCK_CONTEXT = new ParserContext(); @@ -93,9 +93,9 @@ public enum BukkitAdapter { * @return If they are equal */ public static boolean equals(BlockType blockType, Material type) { - // FAWE start - swapped reference to getAdapter + //FAWE start - swapped reference to getAdapter return getAdapter().equals(blockType, type); - // FAWE end + //FAWE end } /** @@ -108,9 +108,9 @@ public enum BukkitAdapter { * @return a wrapped Bukkit world */ public static BukkitWorld asBukkitWorld(World world) { - // FAWE start - logic moved to IBukkitAdapter + //FAWE start - logic moved to IBukkitAdapter return getAdapter().asBukkitWorld(world); - // FAWE end + //FAWE end } /** @@ -120,9 +120,9 @@ public enum BukkitAdapter { * @return a WorldEdit world */ public static World adapt(org.bukkit.World world) { - // FAWE start - logic moved to IBukkitAdapter + //FAWE start - logic moved to IBukkitAdapter return getAdapter().adapt(world); - // FAWE end + //FAWE end } /** diff --git a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitBlockRegistry.java b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitBlockRegistry.java index b2350aa1c..f8c73ca8a 100644 --- a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitBlockRegistry.java +++ b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitBlockRegistry.java @@ -146,7 +146,7 @@ public class BukkitBlockRegistry extends BundledBlockRegistry { } } - // FAWE start + //FAWE start @Override public Collection values() { ArrayList blocks = new ArrayList<>(); diff --git a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitPlayer.java b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitPlayer.java index 6b483b3ff..bb0b3aaa7 100644 --- a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitPlayer.java +++ b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitPlayer.java @@ -21,7 +21,7 @@ package com.sk89q.worldedit.bukkit; import com.fastasyncworldedit.core.configuration.Caption; import com.fastasyncworldedit.core.configuration.Settings; -import com.fastasyncworldedit.core.object.RunnableVal; +import com.fastasyncworldedit.core.util.task.RunnableVal; import com.fastasyncworldedit.core.util.TaskManager; import com.sk89q.util.StringUtil; import com.sk89q.wepif.VaultResolver; diff --git a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitPlayerBlockBag.java b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitPlayerBlockBag.java index 1b054ceff..ecac5bc43 100644 --- a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitPlayerBlockBag.java +++ b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitPlayerBlockBag.java @@ -25,7 +25,7 @@ import com.sk89q.worldedit.extent.inventory.BlockBag; import com.sk89q.worldedit.extent.inventory.BlockBagException; import com.sk89q.worldedit.extent.inventory.OutOfBlocksException; import com.sk89q.worldedit.extent.inventory.OutOfSpaceException; -import com.sk89q.worldedit.extent.inventory.SlottableBlockBag; +import com.fastasyncworldedit.core.extent.inventory.SlottableBlockBag; import com.sk89q.worldedit.util.Location; import com.sk89q.worldedit.world.block.BlockState; import org.bukkit.entity.Player; diff --git a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitServerInterface.java b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitServerInterface.java index 9426b29bc..b16b75330 100644 --- a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitServerInterface.java +++ b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitServerInterface.java @@ -19,7 +19,7 @@ package com.sk89q.worldedit.bukkit; -import com.fastasyncworldedit.core.beta.implementation.lighting.RelighterFactory; +import com.fastasyncworldedit.core.extent.processor.lighting.RelighterFactory; import com.google.common.collect.Sets; import com.sk89q.bukkit.util.CommandInfo; import com.sk89q.bukkit.util.CommandRegistration; @@ -218,12 +218,12 @@ public class BukkitServerInterface extends AbstractPlatform implements MultiUser return plugin.getDescription().getVersion(); } - // FAWE start + //FAWE start @Override public String getId() { return "intellectualsites:bukkit"; } - // FAWE end + //FAWE end @Override public Map getCapabilities() { diff --git a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitWorld.java b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitWorld.java index 8dfb39b2a..5ee117033 100644 --- a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitWorld.java +++ b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitWorld.java @@ -21,8 +21,8 @@ package com.sk89q.worldedit.bukkit; import com.fastasyncworldedit.bukkit.util.WorldUnloadedException; import com.fastasyncworldedit.core.Fawe; -import com.fastasyncworldedit.core.beta.IChunkGet; -import com.fastasyncworldedit.core.beta.implementation.packet.ChunkPacket; +import com.fastasyncworldedit.core.queue.IChunkGet; +import com.fastasyncworldedit.core.queue.implementation.packet.ChunkPacket; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Sets; import com.sk89q.jnbt.CompoundTag; @@ -311,11 +311,11 @@ public class BukkitWorld extends AbstractWorld { for (TreeGenerator.TreeType type : TreeGenerator.TreeType.values()) { if (treeTypeMapping.get(type) == null) { LOGGER.error("No TreeType mapping for TreeGenerator.TreeType." + type); - // FAWE start + //FAWE start LOGGER.warn("Your FAWE version is newer than " + Bukkit.getVersion() + " and contains features of future minecraft versions which do not exist in " + Bukkit.getVersion() + ", hence the tree type " + type + " is not available."); - // FAWE end + //FAWE end } } } diff --git a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/WorldEditPlugin.java b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/WorldEditPlugin.java index ca3233385..4de9ee2c6 100644 --- a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/WorldEditPlugin.java +++ b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/WorldEditPlugin.java @@ -112,7 +112,7 @@ public class WorldEditPlugin extends JavaPlugin { @Override public void onLoad() { - // FAWE start + //FAWE start // This is already covered by Spigot, however, a more pesky warning with a proper explanation over "Ambiguous plugin name..." can't hurt. Plugin[] plugins = Bukkit.getServer().getPluginManager().getPlugins(); for (Plugin p : plugins) { @@ -122,7 +122,7 @@ public class WorldEditPlugin extends JavaPlugin { "Stop your server and delete the 'worldedit-bukkit' jar from your plugins folder."); } } - // FAWE end + //FAWE end INSTANCE = this; diff --git a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/BukkitImplAdapter.java b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/BukkitImplAdapter.java index c84613c80..5994fc68f 100644 --- a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/BukkitImplAdapter.java +++ b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/BukkitImplAdapter.java @@ -23,9 +23,9 @@ import com.fastasyncworldedit.bukkit.FaweBukkit; import com.fastasyncworldedit.bukkit.adapter.IBukkitAdapter; import com.fastasyncworldedit.bukkit.adapter.NMSRelighterFactory; import com.fastasyncworldedit.core.Fawe; -import com.fastasyncworldedit.core.beta.IChunkGet; -import com.fastasyncworldedit.core.beta.implementation.lighting.RelighterFactory; -import com.fastasyncworldedit.core.beta.implementation.packet.ChunkPacket; +import com.fastasyncworldedit.core.queue.IChunkGet; +import com.fastasyncworldedit.core.extent.processor.lighting.RelighterFactory; +import com.fastasyncworldedit.core.queue.implementation.packet.ChunkPacket; import com.sk89q.jnbt.AdventureNBTConverter; import com.sk89q.jnbt.Tag; import com.sk89q.worldedit.blocks.BaseItem; @@ -67,9 +67,9 @@ import javax.annotation.Nullable; /** * An interface for adapters of various Bukkit implementations. */ -// FAWE start - Generic & extends IBukkitAdapter +//FAWE start - Generic & extends IBukkitAdapter public interface BukkitImplAdapter extends IBukkitAdapter { -// FAWE end +//FAWE end /** * Get a data fixer, or null if not supported. @@ -225,10 +225,10 @@ public interface BukkitImplAdapter extends IBukkitAdapter { Set getSupportedSideEffects(); default OptionalInt getInternalBlockStateId(BlockData data) { - // FAWE start + //FAWE start // return OptionalInt.empty(); return getInternalBlockStateId(BukkitAdapter.adapt(data)); - // FAWE end + //FAWE end } /** @@ -253,7 +253,7 @@ public interface BukkitImplAdapter extends IBukkitAdapter { throw new UnsupportedOperationException("This adapter does not support regeneration."); } - // FAWE start + //FAWE start default BlockMaterial getMaterial(BlockType blockType) { return getMaterial(blockType.getDefaultState()); } @@ -306,5 +306,5 @@ public interface BukkitImplAdapter extends IBukkitAdapter { default RelighterFactory getRelighterFactory() { return new NMSRelighterFactory(); // TODO implement in adapters instead } - // FAWE end + //FAWE end } diff --git a/worldedit-bukkit/src/main/resources/worldedit-adapters.jar b/worldedit-bukkit/src/main/resources/worldedit-adapters.jar index 4869bbdd6bcc96ba75d63276c74ad114866c3b1c..c06d25efadd53917c26e05e19804af40f8c13b72 100644 GIT binary patch delta 279195 zcmYIvb9i0d6K-tVwr#tOb7I>zdtzHBHXAp#lQwo5+jisI-`9Je``5hBnprdR&e~Yd zUbC;u*sDs|kyYd&p%B2p;NZaE0-utQX(0b6c)mhH{}mzR|A}(i|HLf&|3nHjINyI# z3|#C#83Ha1_jg=P%?M!`B<2Gp1FEk_#A|I01;+;epF!(*FZc(3?v z2^<3?`UpkS8UYS5`OkOl9k@Be|BUcB$-iv*(iYe`Ju)Ckuj!0L~cc4 zfk^ome3ctw58^-Sjqo{VZBSrf)d(PV%l}9HuQe>F=JM|pY<7r&e;JX=K~()?GpPvi z=N}S7fw1^j+s`Qs2s1b^Fd|eC`xMmwtzcpcB1-GV47dZ_e@yD|Am0DYYZruA{Fg}h zF8KC8)B*?L{10hCLFoUBS%D7W_mACiFu2XX)h>$$kN8*pBLfK1e|9q-5Ly51*wVoT z|HXheg(&)0k5Gw;>5#wmU@2BE^|RX-EVHrXl@5EmumQ2Q+940tpfHj0}zo#FW6<1yfa- zu}2dVS4_+bC4(f7qGAH)-kewu4f-{~$7xbkBX98a%&|t=p;WSuci##K1D$Ob_MCIRT%yb?8NnAHC*iut*o$l2w!R@ zo>a`uYgxLCU(D0URX9%)#6IRybmRq8IaO5^_@t_D|$S+nwPq^EeQ~T^{#+1=3k3&EvuOcu8fZ2j=`* zuH`b7=|pEUV+SyQ2X%=^mius#mOQ>p2G&6jI&^odVshOO{EBOI|6cIbu8ObOsZfSbEUQD`8e+~+>4CZJq? zS9+m{DErp0Ejw|2c^r#p2q^X~%QTBwLWMH>_}1vtx{M^>&`}Z3l6c?usPtuo3f!RZ z8#%Z2LInU5SYs|==K9Mi+25QY6e$hD$5&4R25($lXXmD5p0F9JtRb3Z&bnENM0b$O ziep|6y3uOxebysf6s}2eu>9>OPLyYi(izoMEguguJ8rXTrwr~{li>i%U4-qR%nT079F*uxpn_cj6ycAB#^JiX|Y4PPaRKiPayrIAZOgq(hI06WAVB~}kGaoMv!p3AKu5zU^cW|dsWaF{Lz;kznOy#z#LV$ZOyzlMH9p9hZyQz) zw<7Wss~DUng8J7mc1o?>uNMQGxS7LelGUnNKaY;&P1w8fz+e>a4D;@bq#31NWfbN~ z1+^P!9IBre3>~_~cJ3YNB4D=VNI{ikL~M^4K=cR4T=aC;9HOtUZO;t1`gQZj?vwzV zUi>wjTLbeEo|ocp6&+c_?z$M+@BO)j#FiHV-1Bn)I7iX|xnk5acg&3m^=xo_#X^;# zBlwY3WYI|H&_!y!4zZyQy%U}|$K?~0j+9FOx$Y!loni%0$@~B&ol%OC>6bh4qLj-y z;7PGNuQtjJZMWHKa?-~dhw|0I=v8OJ<2ago!X(L1_UrK;L4ZX0>q$_PuONyt&vqIE zhi7d2?-TJ{k|O1xL*yD}2V}-pBVo4<;ht{A^&x??6lHuGj(4x{a z-|BnbfNq%weqq)*=IQA0l{He7JkTMcLo7MiaPfru1!7_BddxholC$Qa+|)MU>nu-L z@NCexNS=fqxjMUh>f9cM&k*}#D!iboZnXLx=|6cX9H!J{V+s#d3gcygb}_w9diIid zFA3(43@;r@TLn(KhH~AuD39POKpJv7n~pSuERMSugaAF;1+R>ba+b0QFQ^mgROzjh z;8&6PGWuVPQLr{rG{g_69xv$cc$p?M>)bsGc2(CUy4_X(n4 zq219Fw@-go^@Gsi}*4+Q)>%()-Tv{+PG*sc_1U4vW! z3inlU$2@%CxZR36XcS-^z((V-Cy4S48{DIxA`C6Q=bu^0T(XC#dJMv@rINK1mf!0l zl@-cO>9^}gl;YexJY7h>Z#JFlTMY$@VCf=;zNAAz`k}uUe9P0HI)aER7cXzS-skRu z2>rcvc10M8r^yG|{b5YHJHVe}D|4#x;JQbV8`BO&t@`@XGSyPn0!+V*N4~glI1}vD z^5LO;{k^-3uU~dUFVN{jBgKVtPc2L*^%A$?nYB0T%_FgHo^fxc=uj-WgcgP8r!N$v z97eb|--ikIy8|W@W90DEUm%~H*qv&jck?%Ozf+nH*7Ol4w}|`^LTzYmT$EH0B;jpW z;dNfi=7Sij?{@X?4j_!RgF&$iw`<1z1u+?phYNQ8_nUzxdKWd(3h0zrITqI4VFK3K zXL}J^2jOC0xjyfJJL$amsRx4%60C=28~<6~#_0sQ7Fp)UYAJP(YmVIMgS$RT$o5GR zst;`XTn7n|L08}z)$&4QPfE3q7v4&bZJR3j1h|78;lH1xqT5D5|j>opaY5&)4lE$j$vD%0X*)PXOh-R^lYR|l_LA8k|liDTTNY5DaO zHA9w^#|Y9>N&;8EnZSh#?r0BAhpa(F0dhymafBNbiy!j>q>05!K(-cD+aAP*OVwP_ z!33S|^$}sk!Vi+|tGhqytX>ExGSRn<0;2uO1GQwtC*7GH1)nEKWbi++9>)*Ly;b%k z1%RTH`SO0|3q-NcW`5PHc>EC??TFAJH@D`hmef9`&{BL8lmw#1cP1hOP0qICnfj`n z$Bhg%NCXH=QXYpc*rMfkcemFC{?+d!q7&EmPm)e(BoKaFBI!6an974WZxlbIdt;0a zr|sUNr|NF)RN~lQZ4vNhD;C2IYis+ASF-6=*+aIP&&K99TXxfJHaT9v}Fh{`wso7zmF+LsPY$>cR7RO2BRV z?)^7bj}Po(rrf+C^QxO@S5|0Ht5RTc^c4=2{WYOT?Tu5W68{Pj?q}X-!40X$2j-_w zj+^o!h=|DLs8OrsC+qe zhrJjpGb*e}+DpW6=SR}LgGJoDB5)0*G3Q756AtC5uw0@|OGtl|3ekq60oiF8tft_@ zP2FPocV<{PIcOIIXhrT$xBbNmDWwKgS+h2Dq<|7%QbJ_&l^?{W$O5KoZ`uo~9JBdzAY!^P1dDLf zn`UyH(D z{w8hq%FaiJt&c0RcYCvpfgTc(SAeBbI=V$t)z6!Nu)9HEnvQk|`J$z~(-!~5+iN_( zyKgz04`(_pvo`KE8CXgD>5~W_3~wT+C~~zyqTkp0M5uaxh4fRkccTAx;1_Ju$+3b6 zez?|+lF%0;p#w~!0?e;DfbDn$w&BpMo>(s-uib zjZ9ymL^I1&=pos4{-t2Q>Nr)oEcYgtH(V7oXli6v(e>BT(B|Lg4!wl2!E?!^abm5? z6%ut;B=n<9F0jyhyo;8cxZwPU_5v0{$Yt~1N|R7&0j;~tDd7I9D!nuM@gCEW-Sy%qG8WD zG4-mcLiW6kvFm|>QKrupQkoKzu^_hR z&5a{!fV9`{W(?<_CJWnq(D0y3Ww(~=Hz6nVqCHoqzK@U)j{J@1%gO=WT*gu%>!<lIf^9d?M?$m-&o|}W&qG))ZN?huBKm91X&24;7+JpPzEbj3E=he5fV=5I^ z`j(;hRAcX|;!NSWRp>O!%D|#rS$MkmxlM^S9at>IWVu_3qa17JxyW_{XhS!}`R2B; zt;SB++rcfK8Ur{;;ZvMwz}<@W;cuH_1@?YRY!VJh1$MjC7QY!XFxUBhh-dLgglTXR zEpkh8?cG$5va`#Bvr@o*+d|B$E8*}Z%@xC1fw}bpiSx!G{`CB$!9&>QL5;C z7NbM7Q%1K6CW+u1mw0jz7zE#EkSYx$dIHM|_cG8hU}l9#@z9Xu>TI^`C(9L)0$Pz2 ze;0^YyMb6dFBfXv!&_AEb-#vNbZ;jfY^rC`n{=~6oi+91*<3hK@7RtE9{FU5XnoS@|fMpaBdi^NWUQ zVFmO=DVHJ>MvVA3#DhDnVT|Dc78f3Exm_Z?qNTA?v?z13+Tz~=dd04aO!E~Ad&LAW z)~V}M)vBg(>G59;_jH6+YWb9NobFyB>>Y0Wmd?q2mCu5;==}Qo(QP-CS%BP4IH)zR zl?blKiCy{JYwS|lr$4Actim#z9YkJJXqm7zXYC>Tqdx|*CGv;xGGX!v3)_d0T&-m#uO+FMWF>k>?t(QMg9eUPvz&wO zZ7j>V?_9!1Q@?z}4S_!?ye>_A!;bL)hMjs1m}D?FR2_1eX6i*ACtr z`1Rb|r%zP}`lb2_*xTismx{616ty@BY?-YvIwa;MU(Wlh`tb$Q0l z9kshQ10SY+Iq*wOQJjAAH5BKSqV;HZi|5Zy&x0TP8^ih#mi)jIr3OQHF)GInP4{Tz zL?Ck5kW2&oYEv*vm?n?e(r}ZEJ&u8~r+#C#j-DK#DD#Vs6Cgdq^yaO_9$ImFEpv+C@ml>hXUM0-tpAwy(us#A>d|x_!eT!LSg}ZHf=ZU5} zPIF|BFKSI*lnopos?-lX+Zs2r)^zr!m`Mv~EovdT%q;!ub>m!@I6!Ne&CWW8HhF`* z1N`In;!F95Cr>IYGMDASY6gTma~3b)V~mT$r!DIF@j#&pHmj>2{u4fdmR8J+bj);< zvK6jJsW|&BMp}KaGN1l|mLxkm2DUANRvF`G28RUa{L7C)yi%7 zY|MXsK))Og5q!emoPwhIY9Qj(4;L|hRd{l#@6~S--;dx8DuCpwsnzCBFg+1khlVxr zK-p#+xbhNAP{Vn;HG6})YOd2#gA^T~rhdDKxdz%xZ3XiL5YBzF?0*V-H(kxI+(X(1 zI#vgJHq9zmhJ2F=xR+m*?=7o3X^ph+4T<;=?z$#DVShoazN)Kl>FxjVp;Wi`qUa0R z_!)-(Ig;<hi65Goc^5g)p^4eJyy@m_o=052PV;<2Ky&OK$G@*a}_Q}Ff|a@=_< zDY;M^0j(K>T?F((3X!iq42Jxr&?C(02`S`7bEeOHMlfsGr!`F*ObmOH6fkc@T=}Fp zkZt2-jn9q^n11_WQ?ElTu{LA#>L%&Z!;UH@JE7GBn?Tgy*yd%!KcGf+D3%H0QlNZ4 zqGFd8=9OgVpOlxU@PI+V$W55lD;54mc|X{kz19l33B0gYM*e4p<3I%-b&lKc5e9Y^WK5ykG0qFfA>2wWby8?JRt;3l>+{l1<=xw8w#tRo|? zh8HOYsU}=o7`Y=wkfJKvYBtaB&_hkpNm%idncp-l54(tLfqU@2Y^q`AYF@3;Ymwk6 z)b?fDh7fI_(V&!BFCo6vDIQ?kVhc{2IZQAVC|{VpRs&Z7PyT?t^GO4Po0+^7Ec@880c7o=IE<_~x2F-m> z&E15~PQ!k0!R^i;97n{!zDAWf7Gb zNzpBOBuj`3lAASTmw}oq%?4?)amw^ZI^im+<+TSXTE6E6hM zJEbj@<}hezFFOapOmsuf?$DrF7GsPZ9V}=Xc9ArgKklnhV!$RrRjhBRwdh_k2|Fir z4mhtaqk${-xY16k?QODUg@NS84^P400rW=e5oD%1?YFEnj) z9Wrh6{?6NbUr9yDFIzpaQH{?7y`_XKw}c(Hgz57zl-Il@A2&F6>%GM{y6Frt>LQm@ zff#a(mzc6{t~k$iZ+uAij;zjxrjGfvxse+Rn8{zbvmFkoO)AW>QbSx|fhB4Q(| z6D!PrN1G;rCrT0`U|@7fAo58F&h!dIoRqY`n>u?u9!e-FIXE;plP_S93<}BQu{ty~ zm^{PSPu;cK;f%JG6a#3^{WU5z9#tMyx}eqX&9-(9i@|Tx?N^iL7!o+mz0;phj6P4@ zULdzC;isG{oy|XQsDAlifqRQvNN8}GK_jO*(T7Bpejj$29gd_U#|#^lzP6g z&*M(iA*(NOF)u^LN=Ig%*FC|Olf^1sfdlEKrSW4762YQisMz^`!G$SIeRTrNtTom4 z{75Sr6Dwvty0ooV_B5*7lb`8D08ffHxI=F7pr{)+>yX=LePrLTtb;@72BOn#<;D8|& zXJaz?yvK}iT-B0&rEd(Aq2z3-JgsV?IR=f7M@!~mS@q3A-+w_{>vrFDGUr3ZEU zrFOfmqZx@)PJ6bQGt$T!QiP(@T;zy9(224jLaYCNY-kl-3MIl*%u#Ls-rjRam1T=A zN@6$AwlvE1x<|GgxTlx_hIzu~E}|-965wWFGbtdfT*TDtZP-t=n#V#H<5=1bOomU{ zfeIZ;`&iZO7F~j&h*dOdsV<=1U{A@7oH^sVvUO6bY3&gxx7RQ;jsy9+^w0Tz(y>$=vJaW$*3Vz|9E!v>G z*ts2pJM^n*TlW2;$$==RP`I*R?P(SlIOazN#sz&f0ssowM^9U)))F}xg(OxwU{(b* zu4;PmxqK9POgSfpsV za8M(v4z-2U%-oKcN84RvLS~1&Kppsb>~g4)BQxruHjVTV``;I}8wL%bTl(_yY^3wA76bieJq-_lXTU zx$vy-HD4pcmIm=*a%=`*_z+E`tOP|uq;!K?U9p+Fn6d=(X|&gCPMdxm^|iy~SPeXP z{rFYGXvd689~LUJbu#%OWAvqM)S4m&#cRaUWs!E99b7`3xRV!{L>&L zoSE-BBr#KwG~?XBi>>Vn@z|KmWmSrHRXv@` z<_%uCbq&tkHpQkuOnPeFHa>4WPrPfmluk^OIpt%-o&8!kr)dF$SrX*0257+>Fijct zu#Xh?H?Xb*UC2En9b-AVKY@&<_z37OY?LMHHCz@oI$>O5_m z{ku+DMepb>{LQjA4{_3+Us&EFp;kM~aF#pk&lU&c^3k_p27>T#x+em#blNJA47qonuCq#q z#@?EH23`t8<=8sA?!)0{KN4TM7Ehx9>?z3fVs8a%n$p;OKOVt(GESOU9r&9f7YNteYXoJVLUtitw{l$2v}X8Q8`Rin_UvfZzI4!(rDnBni(c1&Z)IK! zzu}U%a%va*)yB@G0?jH{8RF2*-aR}f#p`&qr<9#|&y?WL?k!}>`Oc1^6ivT4M|$1B zA`_qNcfiRO1qDM|wm=aM~P9Y;{^8^p6m{OjHB!QD{d1%ii*kQ$eCAtJ6 zPD9OP%{XK=)|0?4n2x#68ShRZCp4v|x#fkf=0WSn`k8bGpKT|;^2~nub`*>fw+q1` zCZFAFmgOn!#vZjiOraNHgO0gqIZ2sWVGyT6&aYk01K>}Fp~9*zMQZbWw+#wRt34u~ zffI2*%Jmk_%+A9s?ch7KU2Bq<)Aw@T*XT09lSAYT(b)iW+f1Jt=D4$JHvP4o0EGEZ zA3K|m%Xo!@(k=*j1tIwHs4|+GdbsJCsAobJ&Kq+fYNkEzJew-P<5?<5&|2-!{Npe} zk&&?SA|MEr`&UfqiD-nCliDo0U|vIpJBnuJ@n9Mk_Z)uD=2Qw?oia zNUo(R^3sn4&LSRJj|1Ac%aE2f5=a=H3~vFR@STDK9Ua+%w)oI2kaWWV=H$6?evE*( z`Ew_mwJB#UP14G--7fRgmn;2loxB5zY%$BFW?FqdY~0L zq-H4bj z>pt^eMz&T)Gnxb>VykR#d1-((_kAR+NoM!CecI&pg0qI0Fs60Q2;s#;0&)$B- z0aEe^|5Vk72(1raOE_XitX-31w%&o8iB1!33Bbq;D)>u{JNUX|i2k-PrF$#LA#KWN zqkS``=NvDl5eZM2-%R=XV>l*k_Ggb&iy5UCyPG`&}uj4PjacO z9^hoNf0o6XA-zP^pqH@ry-vVkd^0>XeAt%W*^cbHuq31#8MY>J_*?9b(&2 zTJd3J*HB&X6GHWq zdc#Ta4W(E17;sc`^Y?wh*xgV4vCY7clv8`OElDbWNQ5pHJs9HsvyW6khzZQZ8Mhc6 z^_74SKd@6UT824(_%4hs3=0@N^ZvEBuI2lLk&fimy)AB{hPd8glF6w>#mY`J0 zCJ{;<+maF-HJ&oX)3UO%_mr75FOAv;tDNj3aj;pYiFgY7Ho1aoB!y>)oj0_qnBg+*0R!tu)AHw({t!&y$mADvttpAPt}HmwLE3O_bkA06)wcTfo;=}h z`U0sidIsq6nGs6~05Q^{<;wq2lb2WuSZvj%i(478V;&iZh{u zU?==@u$x|Y6+MYq?GnRoSU|Fxx1V*Yeor{}K;!QlbHHJs*}aue!6lt<%~gfPIAwiI zkt&s=MlTQK$saIlkSOLA?WX9G$CuB!-$g{;#T}p{i+TRom@lK!LN z$+GSadRIbH-#j{Im>Q1utz;JXJLt1RtXU#^N2(U=@nMUh{6r!|cyAiJ zZAL|xw6-h-Mr^Ticy-R8T}_v4a!1}_9G6kmYKK=KmyIvNN&nlb zCB%68HT_&g=bV)VgGcWJ70DkKz&i6Kc?luBJ=W}_RI&k$`=;3+chXtcWb&5B1zf(r zU4sJ$rN|$rV$SW|kY)zj%$K~wkh>tBrUv39v(Bau{&lu3y)#6Z0L?$K4q--_yW%a_ zrp+~C1JzM|Lh6LOCZS0{gQrpCwrp92hLlcr58g+*a5xYA_ZW&X>XsNBl$uFDM-?C}`#jXTIjOm%Vv{}4ktiZ(MB=n(zB z3wCnxJRglXK864SP3k$)792j&x$3H%-Py96Q`aO`Zr4!v_$dK}oFcc9tu2>l7V=lg z0dInUuAf+)Yk=zMB63HrAw~x^E&i}oy)Q&`;3%Z=n4Lp*G+a@l^_4mcsvm{k#qzxx zNrzm93)(m7-fL(;u3^F5jZ5Ddyyk|K0Nq&$CGks7LfskBs3+u`AbJrj(v|k+4O^R& z`jeit&BIk^p=+SE#Qt%Q#7zVJ2gQf2h0IEisG%Wo1jUJ0-Jb=l{HWffwz={iCgbjl zIgO=`zrBTAy6>IzJ!nSB7r6B@;?~FFq{4&r#8H$KgJ_>*T(e^&(#`hJ%Su(|T!w8e zbIS#dZbMpZlW3n3$ICL*u{FfZ1rYA0acmtMWj!FI7t|>d}AVDGwVB63IU7 zqCDp%Q1#d=vK}&;Y`qL~@FM$M@&1*iQYWktsA>wpls{1Ln#|Kgv zC4RHQ{j}NXn$|M-(>1|tK_o~YS;LNQr@l!Wo)*dl4a@+{>XNSmb z6!CY-F}3Z>>DceOUE`KBkrU~wTl{>cI$phq;YPPTO)YuYe-ld~A4l_Tts41zgW0eX z_lAMXH+e7W$;5i&vxvrc0| zx@qqcK2pAUZZ)rYUn+9WYrd;FHb!;O$iONMY04m};LkG05`eDiy_upUTy>2m&%M*=HQ_aFW%?P+LuNh`#aJV%!P~8%LRyx@kpZelXFh zX)=;4A}g87L9C^Qcjgk%bG5;U z9~?smX2WKzbAO|{wu@;^`J$5URObQ9xj(z4bzc*(Nqa^6>!7*haW?o^wn9{(us3xL z>6sBALPz>zk6u=o2&WVF`%$t1;KI&az*`JQY=`VOo8V~uU7LQ6|8FcESJ;8=`zcBc zdgHMO__`P7b*;SPWZF#oimlwXE@nV7yxB0Lvkb<&o#5xzJWvy>we=fC7)KWY`3gtY7Br^>J{s_AAqPfTz`$$Dk7&a>D`H$Lj+BX~Y|IA-(V zD;7z})^(5;bL^iPNKDE(NcOC>vld)%St~Q2*y&mA7^6(q2KRcA=h@k2n;Pm4p3e_9 zx$D08=K9v^c|8<*xTgyMIdOsVLqUJt{f;M^8_}E&e{&=JZ7d!TBD%nS-UdIA_}J+` zbV8d#ftN;}x)P9SYEgRn2Z?;8WiC*2RRp7IRmRSjj=ob739(`LLKH7^UGd9WntN=O z(*_v^QmBwiOK!Wt5h_f8hG*YwY!F2e6(uJIl}dZ!OqW3J?^V}pjYWDc0FK^lrCuqs** zjfy`YYkFH7W(D+t^3|la#|#I8)%aTOQ_dHhMS@WrB*QgB1WM!BD}6@S@u#yUG(9y2 zn85P6-I!aO~RLq zR+?Dd_CndoKNm~}a-Y?(z(NNLxqD&V%dlpEC$nsr$HfA$E+EuYTGTC}d11#Mi#9@< zu}k5btt=t-p*xEDeBu1T?$XvPnTfk^cH&-?D7!>-qH!*ht-g%eZ3F?aj6Hwzw=~e8 zXGmwHqw83=@Y;D^$+felGu2k8S#Awg6vAOWf@!U{kvomdT7EU%BG~jvjKA&izDMP} z*m6aE@aF_@LzrJ-=bfxyvdUl!-R_gsW9v2^_AOJ*-aC{&_v&z82^!W*Wi!e3BQuh4 z&QP;;UR>Ww9reIxCIc) z)9&aKf{jD1dRkX;O7JcnmU)b}8i(7+h=K^mzlI7NgXqvr@(g>heNEh>Bzo7Ij6-tz zU1M;~DOK~c?8K%iCk|5-u#(nDO@v#HBV#_<5&WP!s4AEun{{Q!)HI`}FHO}Uw?`|j zX=BKD$jfERDTva0L*iXkMR<~l0-Liwc;ZE!P~@3CJ(zsywN;#l+?+FGKP|_*&s$=3 zUuOhFze>~V9k=M-QEuNoKWH*G4#v)AY?=iJ3K|+Hk46Nn_xv3Eqw8cKo#w@Nwy}eW z=J@f+PEL;yadLMa%_f;rc)Aw)LFu%rc;TJvb&q*FgVTD(rUhJk1-RZ;jINV{0tfMC zl(r@Qj)^Um;e@p(yR(l&<92Qw*mj97rDy6|L7!W|MHConeI527eLq4~*S?HTX( zvQQTHPf-HSdo@c-)q_T*T2)4VyA%z~Fz)8K$GQP)%ReOb^vl`N7Cf8<9JT~L-iWPK zK9N6+shJzDz4ppaicG&Q?A=^&KO~_Kq3o7)B^ul)F7TyrCTKt3aJfIltG&AGc~%2o znh)hKj?El=&*oPfy%yG%3ZT35*Tox2v|9lJ=dG~BR4Zr3ep!D%6y!@hZG#kiy$vxh zZnCtsHBm@o*s4ZFb6giNH*4?MWrgr3r%FjaniRaCp@H+~Ir=(wpQ~k6Tr&!~4&gkF zuU_Z)qUpQ|P5M!F^nA;sB0k9|dg{j#GuvhhiG+0Jl~ zn4;TY35wFSDuFHKwrqD(_<5JZNRrdaHhpQMAU*ui%y)aYAi(>W`f}x2$^uaGT}0k@yb_ zCPwG)qwqD;*K;=&UlCy{Itze{fVMqPVH#S3(=VGvQ)t;Cyt_9 z#B7Tv-;-=bM!lx9843uFHxT`w1Od;BHeXIlAHhc{RWkwI!P|!FMgUT6K)$8TG*>XK z6x_q3-{l22V56kAymR^a5*gs2mYuR->3hv1`lqpJUTT#)T zjE>QJXNGM+g_Lan^B#*^VxXmJLIvpf+Bs|hwQ^!C8@7V{pcRU~u`4YZ5Y1L`_x-K3 ztQJYK4<0_ymG=E&l+*=6O!VV|#uumPM`Gv6M|Q<4j@Sn}A_L{8D~!>ztkVNGtjyUN z-|H&j%dwqk0QQ?+&kIlhD*W^e?p4IVh_li%XI+x=qO`NL;P?|9gQGDI3Mq()&6yVu z)sBFqw3o#eww`F$B+Or-b*cGaFBwRm^)-?DNi{*=v?G*--6DAue4gY8+;@=qj>AjR z-%@REFYyPW+F)2urYr9K^pF7?AK)U`#9xqu(+=0%9OXB3F$WO#GMK%Fi&*|0LR|$Y zA6c7X{c$jpZV71BJT+ex)qzze$g0rlk1_7h;Z}jN z>}q})s=7u&HFO;DZKK&nqrOw-Ikj!YQ7EkAAl{7Qb^d;p)mE5~tibQsVKEvFx41PC zCS7@O69w*MD-W1hh63*+BeEvG*T1&LZMddt_Axc#=nu{uWgb4cs!UjVKXo2>L;iCO zVXA$FJmZC}IWEjxt`uK>%bN9ei_+INWSbP@UMhwkO_ z-4$*oP}B!(x@Z>Y6Q&?U4^ofEN(S?3p9Hd8+}2u zpK$XgdL_4H^yWcW_x%$Wze(dw#O!Q?sNao^#lfpfnEK@i!WhwEidgD*Zj-oI5?m+Y zNS|;b;?taJ526y4I0tHr&2G6il+4mFBkk;sv;mNzDWOSgYC%>2M=81Pr1a3iJb)USw6P(}8@Vi0`Pze}Dw;o1@vF~h_utEW-L%ybR z3s=A=zPuF#7ate{;gKHj>;iJzHX+%2@1gzPd%kLLGa>dQaI>+y*y}*{$3S+Wg86U9 zO|b5#;K;(pOa{UYuOxr}+(TuQvxj)sE3JF#W4tCXFbZkCUtBE?b2kSgDbrX7AKXFz z8JJ5I@1=T%hJ`-L8id0aX0C}W1Ox6(G!+V@jVylZx7_`+wnKlKM!m{;P3Vnd82WyV zB2@l#Yra}YA(!SfSZAa4v`S6eY()M^w?%H*MPfPTb>Qbay%l%<+9U`o`{D zm}tq^wryJ{wr$(CpV+o-+qUf!+jdTpdGDRxcE9>dYZo}pexKwOSr#rNUP@msJCK(#A> zyAQtAf7<7M@Ak1gBUP8DTk7gBTd^HtQ8S-bpz;-B?>|(t=i`Cn|B3or&u>C|BE_*M zlz;;wq(K6x1;Q_#ve^L9Iu!sM0E3|`pYhOml*<>jB`pp6w z`85^~U)-u2AqOl7!P+k`$?yUeC*?h7q{=5GrO5~YXv$N3WA*^949w-S%<)0UqXza6 z%CeTeB)0;fX>a9Di~1Gj|Sx!2r)Y%h1^e6G~P@H@vl4nb)e29pxmW?QI`<({j70`)AsO z{GRb$3#k1{Pd%XG&gfC*Bb9y;Md%+;^@8#7o#*0-07-PuhW>H(aCA-;X6NO3G;iNG z$(bmI7J*;vczd0b^%uMR%_h!owB%2i`HO>g?e7AQpM=dnzS;w!4Dj#*H2(l=?E(n2 z1`M+mocM?uCo9v~ClVW97t>gWxSEIAMD{-JrZLV9n;yXH1bdx*^Vn~S!QY?*UhA=O zGuv@%fe^n_aU$VY`{$IHq9KzyBm_%vbLbfRieLZp5Z9R4AYc>HkoZ<3K>;4q-=sZD z-#eILAUv91yF0JW+ChdR_$e5pt?ldY{W*k#`y?g$j7~@i;toBjVCp+N%{fFdrts4Q1i*(DL3zN#%Q{2v&RD7 zl7j=UN60EllE0d}$FEj=EdAy8PT#Xin z9Z7g`P%oGusMk|S8mKw^T($q^IiBNJ+wAqV|tMZ}b3uqgTUftW$c25#1$_vmo!sgOvFHL(IlxL{ zOc5`SyAPv0r*Aw6V>~E*9Y%orM4UFwc0(l-h{8;7M%#)_ zXL+`;$-k9mkzlqr?m-)(eNPJCEbKlMsn2$H z)l?>%u($2SF?lA|D0sj#OLCm^DTjq~4L>`@l`^bpyD`z|UjER+<9f@*+2r}iL-M36 zDS4k+LO*AmoX;uA{+W6om<7PHBl`H|Ri;L|Ya*@SYZE(otEu1%CGg0#(`a&G_Yat= zRKm%AsRc00$|wJvVUIEo_zQMBBU`k4!F)mQ_Hm;AEZU0G0osq?5dX)W@dwf}^_SL= z*0)!L2!4|UkNDtmq&=dfCuHWaXQZ4D`ov4>nUhTUW8ul^Mo#3uQ3AlT_?h7l`jPi8 zi;Y5nb3q`vI-V)X(7G2_dU26inSf;|*D6+GSLRmQgw=+g)cKp3O|<5{A2+*A%L4Qa zH%gUPNV%JLc>0=*R7{#IX~pTKkd%fq>H0!;_e6Htjn?I@{Aw37S}TBNc7tpZF&Pp1 zD#H3??2seslAWc*H zh0Y84W*SLukjR-DuT_{iGUi6S+#gL=%){dt$nCq1+nQm396~00^WzIeNB^h! z{2LwNTHfJfc84y6@-~^*@y%2wRs$W$YGrZs=tzp6 z#@oWaaB_GfTW$c$_BOjiPIo?IP-tS&D{NBns3m?`YR(IDv5hWeWhMU8A3-&63kspkPp3nzL zKPYu1)raudKXD|~2mW&}jY6g|$m+>{J#KRV--EC_cy)l<1N;-oIppDq3e$s)@A-$v z36^3X|9q_5k!d$J(-Tps?~4hOaG>&CCMWW50~#PyCK8?Yp7{C5-F7Ve0S^TLfoTNA zIKJaa+NLgq_3Ln$X+z~dzNMt015rQOEc6V%I!U^18NV$BSCd1?kdAZVcEH~B)kFUy1uxazh=?;TK^h`-N_S|&S4a|Mh)5rU@$sJ_Y5`Qx z6M<2pP~(OuWUDE(VO0aAlBE&bRMOLmha%0BNH6QQ3bkp`+{dT@9vL=3MeL!gTP>H) z4%wWN&PeB_eWTJ1QuYe!q5lh<-dl9`s>3M#CAm|zw~DP20L7!SKe~HW83{s{;7hSG-h)ixrGmrJgN&yJydo$u z@YkWfoKTHyxGK9Od>C0K=mU*hAH<|HP)Q}RH5J*E=)`K9eozb`P}uHZH2Q9z%(-wo_{_aP-LH&_ZCrI{iNDcFkDVQ=luIf`R>3Ro7Kg?j`PocY6xsq0hW0BnS9BpwCm+@=#d5X&Y)a_71A zF9Ea-Zbw=&Z80HW6v^J7SO6yj1As*#=zMll156S-aVj7?CWskZAcvauH)R;CCAmug zg)ynP8ltvXH0<1Tvk!8d7|Xl@1eAe@6zhSg@-*1A$~+lbp0WSr&E5vLFMKiF2>4e* z?a#HGN7Itx@`u3UBhY{lmhd`P-@w$!ZeyfM<s2=wbj5E>Q}m&JqWo3`BUl3hZPb9=uTkm zQJzxEWlo*`Fzfmz#Qm_@W1uVdu*-*-_%c<3dC9{Q@5GB)!3XNA+#4_C$iW)9J!B+T zA(5Qo}XRMGndCTO12YcpV#^ zAmA8)e>j`q$w>B-lih?a`=9>+9VP#`%#rdoMeG)>>949i40}m;tW?N+{W@sZ(OpR2 zirZ4-S^!(x%V)jLK}L^i=2h8m^HoRu?2Vk8_Z5$Q-I3Hz`c0&lxleW`QtqWYm&7SW z7i#Cly=)UY%J8vwOu{=aXJnU*D<%C_hU5;)KP8P-mHf;bdA$0)M;J@zwt?ieQbOCq zSSYtHQa)1quTgc$=_^u~udc5!gV$BYuSc1o5$`VB_V5t_LUe;>87<#t#(9x=zC6DW zA$~HjOqcSXxI4+>0Q5PmDUc}`Q2cs}g;3z2u2ITsI%0smZ9fZ zl~?p;GXZ7;1T>iwA|;`9H5R#*1vmJee7SYl^B-ewQC;HjsOn=Tr(8S+`(#orm;)Fr zh<>sXHkqSA%3*RmpkdX-Eco7i8{q^ORc7L}yF%6fP#EnU>yrIZdWgocid$8BY?Nuh z-@Wm>hO@3czw?0IQ-2m6&Iy(&Vtp|Pqqzy(WOt~4~+V3DfJE?qx9sd z>zmJ%>`(h>b=N6YL`5!Z!DrJT<7ZXxvg+F!;JQ~y0?A1wF2ZhHL8E3i5^oc#L$4ey zg^(||VHG(xf(av%OV&>;+e3)B!MX=QSm9j6D5N_&AwzFwQP{x=pewI59cQe3){&7z z5;hP=(LwRpwf+N38Hp3?hL4O{E4Dl-nk+U+9nvG2xo?i;j`W%Q6X$^+=7yy38K272 zb_n5AUntK$;x2M6EK*Cf;er)rxxMHm=KUv`mT8TeM2=RU@`S*|7q%o1+#m7#iCtB( zB)@wz^_6l64W9TDKv*V4?$&?eQGmdV;u$H<9|p|@Hjb*aXHB#hPryT0r973sOa3yA^N0NkXhb4qrtO+enXwj`2_GUU zldQD~N+CXK>A4bFF270v;}Yem8Y(ynOz=m|<1c2u(V0sP;Ibb&47mWS4H`l-F^cod zyt%rUEE{6NobjvT<~k-j+YgAsA}yU4zYp77!=hmT{?r={n3Se@m^qv8W!@HCBhO@o zm0-N@`i5l#3QS3Z*xs-#u;K{+x_+4;a3ucf&q(xle5?G%oyh^DR@jXBKj-nxW2Zv618-*L zA{Kp!MhfQL(3GtwZvH*S4BV2uUtM6f1D%%UsedT`V9YL@t) zI$ZCG?nK&?B?g#31B-cdWQ-Yg?&^TH`I8kpXBquJhDD zNy(ps!J0r5L`Ubj8{S}~ZKi~y-YRzI?Ab+qGch0N1N?wU^%l-CR1wXFeSJp?@+J#< zypPxez=VTp57*yfDC8j{SiC9SVLMA8mJkSc+@s7eviM;;&35948}VSIf$oyiT17dy zaBB`}@3sU`j_S$_zJX3E#PjM_=Vq&2BFsP)hBB4L5ZiywSY+u#PR`iOGm}hmc_5{a zs$6Oe;Sd+0t4$ztsi}^gH9>N!eR}G{^%dWwfTgKDlSzJfXV)ICu#i*9T3|Ti^lH~* z%|WLIb&Djfh_Z0C&^Y(|s<2F(@>IMray4jFyHjoJNb#mC`32`eMKuV#@B_5ucqx{N z_)VDG`_cjdvH=LfB9BK>yzQ*8p-Qa@{w7JH@hKMBrCZlF{TfTDYP>~cd@amT1u5h$ zKyr~Ra+bl6D%i0>ZOc=>Y!=OUySBCp`|xBonUuE{f}iPn-xht}9)$wdK(?>eX+Xle z5vnZ_=;eJtBQZ7C0PstuDV8Th3_bSfYoKwm;3fsIQ+Dh-KF4ACr^v^F%Bx81`-PEj z8D4`9j!fH-p-0Tt(D!Q`FH2;0ZIiqJz()OV#80Oqye+w+C%*04y3T>UU#oF-c_TF$ z?gbLZA~4(%ux;3nGkeJ-JCkxxam*$_-;qUkjF0v%%r{3A(+ zsy@j2gvT4**l6t>4k5eSATK#H_c zptcl~$RJEc-C$@im3-6Qu0poE`!j5>WemYmn@3K-R_gL@avVJ9%x z2VI@`&?0e3w1+^;s+340Ri4=)4@<^2)YF6tqdhk|t>$%0KwEUcn%9;Mp+wro@|MSJ&qL)aW-vo+^S5xm zHDdDu`3-lR>7XY4`d{NBte9X^i3U`Tfxd-QGBm^J8?RJS0DNZLzhm&5K_3F5AD;{r zOCNZArB!TsSmRdKl}wImKarF-;uIDx6_?Fz+vss7?!U&&+)2+NIm6rQGIOnu<;T3n zf4cMx_tH?#7H^6sY6qdm9&$`XwmpE9J@(g&Ur{6j_?#;PYQr5~MkW$?%}9*kM>WzZ z#|AZ)O%`1403l%Uh3{FCT;iXuy6Wo52~~c|byG60WOv~Kl$r9+7hcqPDc_1l&1Q@W z^-9QfvOC1V>QyO!kJ=F9!ezYGub#Ypl=*r^9%WG?cs8i!UrV0dUfo{UzsR16Dfk$t zlbb~Jv69jmH$R8Z5GAmhkRcYD;KTim!Ac?%M^eTI0BDH_E@BWlbSwvKiQsO=Xl&6Y zk;E?hAj~**NGAK<%oz5_M+d-8c)VoJM(tb#1gNO{TFl7$$X@q|%+P)4$p`($FfdLe z6w#F%259?4M#MKrz;%EH_q-yGg+xz`G|RLb@cIGU*`~?{+$z^FDVR*kUo{KlW@_Wz z`PI!!0G{yx^?e05;d}YVDsvzs1Qov;PQ#fB}$UYH_{96folHp-EtN>)9+%DN(a z0#Q7d)-Lg*306|;%bAEQ9+mJ8E&&_(8{(~^2zb5fcmvVTj!J!Ebsoc$#-Gb|68c`}Se z#L1=~nOWGq(Pw+|&y9WJTicz5zp8-LrTG#zkh~i#K23H0(F<+>KmB8%#Qjw-Ac@Bl ztZ$o^@Zf5FhJE9*Bmm{ooj(;bK)L-<@sh)>n?QEI(mJ{;dCG=Ze@D#o4fsXorC>{b zgSzBSXN90uV^5&$E?@EMJYUV5NBPsO z;VSB;R014h0$U9n_7|IyG^}}XF_sD!i3pvJs_i^W=Eig$_J2F=y65Z!)~(_ckU;39 z=aFf;%gLKp+`+5Otx%V1iK=Yv)T=dvwS`0NHK}RUW`f!QEYUttX2H3}Up(k9mWI*c zB?z_;1-*{-QSg?gd?myor}iT4B$+9NlucU^=#v+l(YCWdBs*KjqUD*`oKItpx-vWqRp$ThR34bXnl|Bt6)ce< z6(GxZ)VZy)CR+#&jKdE?fbmoT3x!3f;ZU*B*A^|**nB2s6mCO> z3q{v5O8dlk$X0$SrQy5{gp;_?$mWR6eJ2q`GK0l5U5g@`%%t-hLPuWi3k2cO<-9HP zdC>EDDBFanef;tpypYM(AXR+Q`OwuSBY?CdT*C;~<12-c9*nF$76CGl+`T)!a&SZBHdR}6C8Z?N)_ zA)@P>h~^J)1u!R!J|Z?aYRL*L2;3GcBZ$z)!+9%AuQ$}_LjSUX*U>7)#n%%_V^tyP zQLh+e_uW{7jsP9=dh^ndzC!K?6)?250CEd}Ar+Ha%+U~>-%0SgsewGa3VRh9YxhIrM6CyQ6))b*KJ!61mM~K!Im=RQr(@ zLNIZ;M);{@5KK=nXATcKAKD0XkIZQI1Me`W5l&hfi*x)Xsu;#djqQ|V6S(p3Tcsy} zv9BM<$j4$jRj^o!;m*gbY* z#pINZ_(p`rA535>t*OO+S#qveO9Px=Sd)UP+l}5rZNJ!;itr31V@k_cmUUQD0-Rr; zZ4>_rN%}vxQhcOg+7;%bHc$EfIQI(xlY3LyTs+#eE1FCC0Yn+vwyG0sd#=1uh)}@^Ma&4m6$-^% zJs!^}-@`gmDeWNo^?tCiw7cZyy5f(g+90NyuT&0a-s{2~4ZoF!IkrG$&8`hj?}w{4 z*C{)?!I%cta;Rriu+S?-DdaikeKd@|#)Hf|jZt-`9L4~dRBodTb@q&8xn`0c0_UCx zxVh8vVqr5G*QU|st7J>&w3s^J+U6Y{+(6@@`kkGj0Jgv%Vho#;1r{n?t+PFlPE_W?<`9FAUjDa9lg7$Yoqrl;++sKDHFd)dGruzLwAxPq zGj%PKv(hj6#z6;eYF9_4BOb9&-bE9WlcVf>)*|fLRu@q z%h=L2b;&E$^~N+c{bU1x+69$Yks;H84|PK?wWi9Gs^@$7s^+m8qc5WC4(&JU;-E%_ zF2P`A^5AE?<`1HGsE{JyyS+$O_+y#}KfyG>SmsQPFeWt2#I5ljH5g`_RC?574{s(m zkFr>XNm}$Cb zfV9@pZnx#M3Eyc)XH_EF)!1MJNlWvZhT)|&#h9~wH0PXWExuW9(s~FB0j+D03JOuE zGNuR#3*CHw`apa8OWP4aF^1J8zg9PKp>CmmHe}s@@emFnIuZmuj|cC#o;c;zuEwn8 zLBnnBq=3z7HcAUXghz0P*@|ju7OXh1Yix`x%B}W%&0siXsR`$MJ0CL3(QzG9H08CS zc-Ebp5f_JjM$S%dkj!xkR{HbiCCl}=c5muGoK=d>B1lld9T-gRmQ|CceQtNC+*|w9 z@00ljWFa>4U-DI7QZ`EH?b%%I$PNtOK#$B?xC53JpNT$T#iYwOfAMCF4=G9-3w&uS zMAF#6Ue++Wo(Q{<3kjaJBuJYj(`)6*{`R>wMcH*4e##u_;A8y!J45So87ofUgCu_iMSlmB5H+95Nv zTv}f)d#eHPY~$ImY?Wj;-Ii*ZsUe|s1Y@OTIoZ*p8pV<-rIp5iO$W``)j44CrIS)( zq%`wyTet*TA#J69a!fkKU_Letkxqm_f7f|N<4Kf18{HdkGWu0URS{Q9CTW5&OW}yiq^P|7;lLNxUoIiUZenP&~DR8Y;ZeyTaG~7y?o3=Xk?R>3*JExkiypJfiY#jYk<3kgh zY@5^0eyYPV?jq6N3PZ(`G|Mu7B>O$)?c!?p4F@5Sem}z;&gE^4KAt;`&>{c((}Z6b zdb%5+-6F;yi<{TGHMt*O%7t5fPv>(2-AB5}of@|sNwXx{tL^N#QekwyIoFaleZd{t zq0Ot9l#Yf&yxo1T&Vcf2ZhPFVi=AFBAO^I0_$$l%!&;|g_U_`ZAFTcM!T9cipMU1m z`d%ORZzn+fM-Ndz<(K^KAFY2E5aAuzkQ`_7d@njctfn`xtLzk4^S84!pXm# zp=*w25}kMMn6E{eAETiDgH-Ko<{u0IC9IVu%>Z;r|F{6xp-WBFMr-i}EEI==(GgnP zhCuD>{F=^&6C~mbXMd3UJ_bQ&ty+x4(OlFhgq;9IZ<%s@4LK7R{@AXc;aV6%x+8a}ncBBEU-F=8dq%+K7fC z%$9h^X_JMj*UJfQgoqnxe-H*=Fz5HkG$lzH@jB>t@X%warOQLGuN#~J@J}?9es5X2K2JGM z^$oPn`a|>kLk;?-(qxZ5`Nt@j1{IQdy>Z@{XtM7)7`hcq5c5PZcd6O;tgeo&{m1B? zEw)KK#;Be7pH)chOu0cy)u;fNRHa{SVCrfFik7H4-I;B47-?@asA&nLX;d><=u8ep z=HZ*b3EKj=#f+XEsh!(X6=H|FF~UnwMe5eH;=JgXeQ&dYo&sW))gqhZxdW@YB1#&2 zD6|kGke#>w6U9oQ)k>i@2H>kMOd;ZbExU&~j|5F_-2Qo^63VH(kGTVo^?d&MtVfOb zhS;o`DLk)r8LxFM>RgFC)S~vHLoFd}K`RY=EZUzDou3#qRx4+0;grGx868N(hXd@g4Umx)4JtMVxEb{NR<`Xzw+j)f0v@IMm`A(6_ zI)zfl!A2r12!$)zxw%V^-gz(0cdG52AMWdCY^aGT`G(Kr|_Zjw~)uR;G&sYG~uR zVQ$=W*#AHoymVNr>s7);$wW*KTMSoBUYwTQQ;y32y{)9Jx_031J})`OD(>hNFZaBK z%Ppm}k}Ts<3UbAhF1q#k{}?Wqml@W7!Df1h$&I&)$$)cQfTW6{HU@C8B`%EUmU7mT zvEtR0=@MM#Oh~3wVMkHNUH5*}^Z{#L8w??@|6}mDgSTS*G~wYx#GBj_hoWt8`K#;W z?zYFBUw?P+*J*b@qaVB>E`NOxqCYe+HhP8WM!mMy=%nqQlPtIWrns`qWgSbxys72B zRGtgF&SEn+Kt$@{D66Tww7yoM!OdBNa7kNL%_ZmO^yjqpJNq&ln`Wowc7-!>>s4zR z7dhf=qCz;K&^rS6#X2iHIBQsO**^u*iTv&|3}sz6UL}ng^9kz|T3&)RdC_%u28mTB z;zS$!DYU3S)4i698O#Y4Lt2x}g!vLH3;YqyL-!UAkbOz!x!Tk^q~4OG)b&(02?E}{XIP$2vtE#udl3HQL^HF0i zQPl`HO}o;tr##j4w?7^EKN z_)!F>X1c_0PXQlmB;v&}%15%QgX%tQIZQxPkNP|UW|kk5A;FD3;@={3p0F4R3P;b0 z7Ow74SSpx*4_FnIVzq_Y0b0|fOS3$$9TIZ=@93Tn5{K<>R!>r)r-)CCERHA^Vi45< zGJy*%q(loYlbx{Ml!H#_Brwe+2Q!2^RvT7iH4=AJoJGg{I`Vtih|=6$(p4B{3dq-Z z=45C%iVensi5ffO@>aH#sjK+!{$rsZYFw()+)|NIC17&mFu^IeW)X|rUKKVTG78y_ zn%MtRZh7LQCnlH@%rtcf*sKZVx2A9blWDqhSQN=qP1H*XP(#ABN7c>8YIM&g68Tb{AyMyjG;Gi=C4mYGP-b1!jQ{lOiC~iS0z0eCExDe%y{EeTDio?QCQ^wvvD}vP9tXe z401fsXBC(!C&1A8EOhyKsW`HMnG7TRUALhB_PZ)xR1Kq6| z(y`!*43Fw!M5Y%s@$d`*{8!vHJ0P}w3EHckFSZX7%Z}L?g)sht*_d_!H^inje-EF< zW0e?dw2ajje=rA68nM*8e)kLWmec<@3_gz#XvIzT*&BoNPd39}2;YAcx?qfQ|>M8rqM1 zmiv}#L8CLWDwQIUT;Z}hGE+obp&%K3Y6?cQwgP3c`GhIOOlc{V{)2yiv`4p_*8 zr{l+Q@H8hN7}lYG-~{C@v&2qwl%vC1!(wid|Lgkc=4$h4crU#Vya6?Tl{kO~S_pf! z!icLx+iP_4X3I}Gv%!`WP+RJzf&JpljpLbxsXMFw>^rE);w!B3>H+@(2i?YhdwHat zUS%D}y2QNHXj0PLnOrzFdnxboCsK|fb6XRtwIUfQNeMBtP(*Uhar|Viq;d{ggI-64 zSA!Exdy-m$clo$DjAH_Rs8xc~&4W=yt;DPWVS15>nC=LIjfE@?07pH{l3J}rk3aA1 zBI|;MlSKK>#aJY5WnYu%+aNq9T|*+9^NOJhLE7XxW_=senv$FOAiKIsuM(+Kc67r2 zM?F5fL44>xC+HCdh%Y)n1hvT~UkRv)im4E{7;9Z}qy9#NleokD3^%B{H0$zV0Xz$b zF{((dJdWdf6Sle-VCsQf+BK;4|AIcU5bR|3yzoZT_QkS%XCG$xXq-Cs--cXb%gJ^Ct#ZptaeJXIxL1))Q_2U>Z4iDV4tSiRGFX1p#yy0)tQl-Y0`0gBI zBV_8xTkPG8iQOX>f`MRFFg(867gLrL27lxZcRm`7NN0HzmY{HQN9TTK$ako3m z-@dv)0;2|)cj|3+Q?i)J31N#3Wo))EZ%P|4aX?qKA`^vFX_RYJD_nR&FflRXaL9j~ zl=LDMXEqPRCc!~R_eQSXt;EzX8_z~l`XjS*ogvy#X+E`$j?}dgKk>6SuMeeJ0;F_W zwab!HXOo1#UGI7%5MsCk3*9AeIH`Vri&eF-GYyWxM=YC`NEC{y#ybx_?$0KRd?h<| zX8|vd!czE~`yY#J4rNDT4lcgbcUOzI<0(9-;L?KDAHPawboy52XXMQm47K-RSI4+s)T4VOnS4jTbEe$ z(RxkX#_sW~?XADq#`!F{RVjyd(oT5lW&yBb^5umP^>bz0{7>?4aEqx7?Ev%^4AW*D7%r(#-+;F)& z%rhYWV8KT%5te~>AYbk43hpR_YVtG4QV8d(SjA996Qef-H!xZgUog@6N{me@^RGMd zEZiAVsZ`3rpO%-%7poS9qgSizT>yV*_eG?JnqTnuS^YoPK?%Drs;Ub=?AZ5Ip0T}z zkvpy!0pAe0k>$wNmEN33x9j}Tt$3*%ikSHKEXbcBZ|Lmb5EKNcy_5lfd{JoBO|6RL zl1oV5Aj$Q?U1Jy97Yd>rsUL#!J#UcOG8Z!&q#meh3vMuZx6Nu?WJV@>nJ3#qS9&?`8b#o;OyA=N-J~SS9Vq49ART zA06b0V|Vb&)FMHx%9rS{KD~pVXe#_2E8lol;D2+3r4IJCJzyZ9CD8xrDrQI*q=h3$ z=6E4YH21O-o35u0a5eZT|EN<;4)#Crz$bL?AI3%tb0VNy|P|9Ez zJB-ADHl4IEf1SyBn0vokJYxjnaBPkPi9%1oOJNqt*h@#HCc*BcExeSQz-l3b!v4CENX1%wj^!yQjlsGc8Cq4+!sM&{P; zoOP$IrHU)8q}^51U2%TRhJQo;=T0K5C}20V5~KPGcEUrk_b@gaQ5>IAILSlKl%~{m zNuunvk4h`G+p06ipE1f)#3#?>;E9C3q9k*Wh$QUeDLWIxLBME`tnhk0&tyy5&r>Yz z{f_RI0=##4SB3pnH7;M(zd)6$quhhfxp5W#A@HX0qwS3#jg>!~uAo%0`#v(9gmV@5 zT>lUVKE|!=ml~_AcW+76`A|9K>-OOtsGFLJCSyg{rEK}tG65^cAE&VsW0^(+v^@Eg zcg!C#-U}#+4&QRE$18Q^sLB z2JXq^0Q;JpB3r-5X@OuwI3^a~&im>Pu_WlIr#ny6U^-7*V}5kztoH;}bL$VokMT5D z+twR?K>qL9r+L|5Lu35cvMi8Z2m$&3W*`3s4^Ulw`OTf2=`lTRLM4Jg(rV_RgUKpD z5e`U1qJj?G4`O6xoXnWa=7NQ){pwpOwWi;)UTy1WT`d5O&~B-1TditcU1L~d*cxqH zTf43Jb-D9l%?wG%6#Dn$Pw3@v+x>QZw!PPR_tA?;;Da(iGH#2AN42p3Ul5EOmS0<+ z7~n0`t$De-eVU$JnnG| z1s}nd@d`MII9;39?y1+fL!JT_@&c%yIG~{~8l2TQL@D;0gy~Cr(mQ5AbJD}s+J5Ld zu2nP(o|TF)9+PSeEXe$cVukaR{^0aV)elIy<~T0o!) zQ?8;Nj+24H1RID_FX?SG_98u93H==J-sMWN`Afilt5tgl$PU<}k788j(t0!091Fm! zTGcR45PJ$b)QHb~zQ%S&Ye*ZBMya$=dtdV%s&v?LUTDS2Q8t#5)&URC$~Mz01bdja zLbwD8*3(!fotZw1gqNNm6XOi{1Q2AU^Rm(6NH%8V#fxFBN#+P5kB8KbArn`UsC1Mg zN@dL^Hd7|bCCgQKZ8*sy{$F!s!lu@rkoTpeR*+~XlyMt6G&UR_9?u@FOC1i=3ax`| z?qs`*QECtw#qnE16}tvuYlOeFki++nofVjxVGu##>D6QvCcsnE|9))ARsg0HjUcq_ z@8I&IG{U2bLDhc@e7I1~U+Gf;*+LMXT$_P$XW2=&s?gp*dtTag*F!G63 z{EkaZ_>rTfWJdM~o*9!1bq(ekcVaN$ufVk%10DY<#t7pzE9rYB-2W7)Ide%1H>&gD z!F=9S{uHFrWb;}MQ^1!)=K$hZo5ZU~W>cf&np}1KO3HIBAjoSkn`-jzt4F7wJLYaT zVw%~`L2jTNiQr9oOD~nvX&e~Lgh>tgPYsKPzSwla%sW}%zd`uscD8u}Gx zGD_JR@0O!X>1xyGm#_Gsic|_YNaXv{WGDA#zR>?2@@l1ODzPacj|t0sSE1p6UD5~(1$B)Ek_jH_P~ zHkZ)Zp9`e3<-|6kT-a?2D^55?*SZflQ~s7wXy~Fx+IR&|4D8}l>Ix{1O$$6!{od=WQWm1)=0xN z&DSjU(GeNO)tu*hvmAvu%xX#gF>96dtVY{BSi!GD>&D}H=HmbrbKO4^g&RB|=@@cr z^v!R)oGCVL7ms)Q>T;}K5|912jnUf2@J$;YZ7R$SG-0)gE(O$K<_{ylw?l8o&9g$` z^9I5)mEVY`V)=7_AO!w7k>#E-awEM>dhN}Q&f7lICZGC93L(u;|MV9#EYHG&wc|W4 z{sOyA2dW^VNUX+0gz-f;IKpox&53YZm6|o3+#`c-Js=JYUmV}B%w0&I^}`;UV{r*J z!ciJiQKEHxbOCtjCw@Z>ck)K~G{8z(&F$zaY~)Pkxio6*GhdsWl^Bk0S(?IHaNe=G zG;7=d({|kcN6*-OMGOV<4y*F#jbY8$!g#t5;ms)-lm1w9{9rF(U zOnH%q2QZ}0&Z|s$?xDXEe#a zUy0V`EFA#iP-3l;9cIw{6Fz3Z%mCzFZlrQR7zUTV2h$VT&hkaRdw!1>WLqIpkiQK98US$IVB%HQTHhUzcLxR_ziDpe6{IyD z46tHHf611<>IZ(wW?VR1IM`a*eD41bSKk<%Nf&KBv7INjZQHhO+fJU?wr$(CZA@%y zl1wt0Z|-}4-LJZ11Qs8P4zfkHQwsNGF*4hA6K>>7vZ-<;Xpm3H zFrO7)Ak(Tg2$v#Tu&P!dm%#xlD4r7X2;TtOjC$<>hv#hf8Ju;L__=gj1dHMb`Sk+3 z69ACR3jF@Fsa^@n_xZ)n1c@vuC1_b@dKJFK)~dCTnJwKPE4KD_8v_oaQ*AdVu4S!= z(7WbLT-iAL&APYHWGmaLf%e*Hlgl#?e6lo%h*e-S;1oGneX)D9?Q%VV}u#UnqnjU#`2Go@u@mo%Y;t>17v z0Ljfz^M?3wj)*i@s*N*;!4@$M4d`lVo!3XV_P%2g2dNC{xl}uYs1i{kS9d;|mfxN} zoaa-r@NmUzhH7|STymo$<$t0Ua)KsqA%M^#$fmRspg+h}!mV`weKE79yAFzR;RV#G zTp|&sT#Sm~;@MpXPgZ$-lH1gpPI6-WdtMVyH+% z;Av+he98GoIzm~g-5=!yG5jy~>0O7jDMQF5mQZx`%PD3nw|h{D+lH=**8>w=5XHS@ zvyNGT;TJ7A9Vyo1m3oj5v0v5^vs|`_n@8PsXx+JZRHENI`B5YoBg`G0y-Hu3dRV zoEhh~$uD|nYmZCJen0Q6MgdbZ1jsM=woGH2IX);taQ8gg+I%lTg)yhgN@~AN2U}tw z^hGjUx^9b_+m%swNrcDx(aD8WE}o<#mnG4k*iPMs97d-HKtl77tu8oW=C0$dzxjyG5;6$`HM`!j`?XqxHJ(;3&wNe}i({ z|B>73|8dqO+5k2tg=bHOb^iPvV7_QOJDn>yljwG#_uZjSz`k`~{Y=gC6jt$?1#*sr z1cBxAw!Q8GQR}JK;!<6w7v-~(W6;jS(zuLD2$#gcBX6 zb;pyUoa*rAQ#P%A{`=*nP%%KhM2Vkv(*a)!btEOYa~{}e@6g{Eau8)1m}}=_)(d@T zVpe@&pA>s;2IM3%)Rnp=JuK|IZX#|kS14TLE&=ZmA5!zTDBC36`jf$vOk)y*wf-SI zHZ%bh!IhJY0d1DcqJHWMUoPMZOIFOB-p;&=mTU++x|ZQA$3BjEZOW~|nD~1*zB5hF z32P4ejS2YCpyTHRMG99X+m}F|%k@R69f6mmt?Qa;`^V)mHy2|js|GP;ZgCYSyf~dx zNpLjAPaBmUJz%k=)^MQA3cl@Sb>wwfX*B%=<}#d!x#$L&Cm!ya|5n)F;_uFPmMaV# zQq8M{DFy>#=q;n!Kw8O8xTMw=M@KHxuR{-BmU|%IT#^`@5gpRh-eu;Y&|s5_;oW0) ztd?IJu`qN-{E{qbk{2Dpny)7AW4#m;$Mh}MwR5a%>;~T0F!K;|5>wy460xgn>COW? zO~nIjpD5BO=@WTd2j%m|bJn9dV>4Fm>YUMLDxN*$}rSsyq}^mrw_I> zNC7~dhKP|l;`q%arxx}2BgheD8a#1CB;j}YmB{soS1maVqogPq_K79!0kuglMQY}L zIrur|ypFQm+H!6S)N(|@G*1LumiQn{#PC0#%AqBV_$wdZ))0RNqDn4wu?Gg?nx1-W z`w3|WlFuG3SKnKD1DF+5j?JkwH?@Qpq%`~<%7z&%7t zvz4Yo6V6H#!q)aZDj)Rx@0}$;T7rq5_*zNkWJsC4e`Yf-E5X=Jgts;b{{pZ=vo52dNOMsob#$^kB~6Db2a; z_dB&K3J+pY29YV=u$-X%V~FE#6ndaRi=0y+>3GATKgOv; z_XLJj7JXt*Gfh+rRLy%7JRk1+x#If@5_;NGJ!U*Y*)%$2x+}96tT`n403cHw}FYSF?rIv zy2>{)M?qHs#|)#;-#tO{y-C29PK1;u7}s~5C{`|uc`;rN(x4V6fScaLfP*-)p-=?N z+*EqC^~!D*$6Q{!^~qk%3s25s*v`q{mO<$>A&5W8KM!jC<-6J*L}$ZgLo`J@!u4-R zlm8+``~M|gzPZq1DSYEebdBX@Q(ntmNB=QYbCcYgwWBj# z<~-ES8HMF7l$5SY-$)-h&u3LYQU1bUNY!OU^;OGWq9SjTyScuE%(=MbleAdDlTMxT zuc-R1-3d#Oiao{s@D%{;RXeU_aK4+Ek^Y+eFyc{&SLqi>p#A#5W5#qc?u|4(HJKeI zkN$AR*kXI;=5Y0Xqv#v6i(yI&kQ}h2r)=p5777kmkrX1|3@YOo7^5^4+1d*)So$QJ zP{Vzwrr)^Re|}lg>8dsP-H`>X7&b}LEa*>d)Mzc*vVhab!>IwY5$BiPoYI$fXt+-I z3f|{YBln0r%m01Zb<S_+r5(gq)pJ^c9yuz15Hfr zDDNkH`F<@7RqxGi=x#c6Sb$%pvgJ@)ua#?6m#t>b@-dbIFf4Hd0NYocQ~3+*HdA4!C^X08aMs8>g4q%_5t$7=F-N=eC*=n^U1|z zajBSH_02@mB@Am;=MjRn3d^1NSVQ17fFYPa-D*_7Je#mQU5N)GUN@t3c4K^YCjeHI znz>M2-F^Uy{`wcaDO_j%@s$GY3X**8tZxw{=iWwG>pdXpOFX_M%BfsL_h*Vr4KDFd z$Zwk-cfMRGCi#(FBqBDSjEnt;IE$6shz>h2`6EDbcNP4JNgl1fG|d#7nkYCMNeyTJ5&FAw%(H6e^=SG;ObAC)PK+Nh0u@x+RBF|{gt{>ZB-qr z)--?%xlwBQ@jFixeIOOl z##?R}F4u(dY5ffq7$v*`BH@SpxrIpF(k5yooE4G{Awp#6oRwxW15W&8BwG?~;&vA1W{zAENpk57q$6_{c=R%Oy>p_xQItI}3&xtd zl*fhEGOr#-As5ElW`h@xqwRPZKafQsS%5#6FP|+e2MZ9_-VnwXWVdtzybMTyl~f+SRL&f=o=EaoKcfPxjGi8FuCo}On5T} zJ%Vq!n!sS1d;bYUBqyDaK@R(8l<0*mhKRrwq3b{s@n(h#Sy8nr`7EdZd=a4LFHAiy z@a{<_*KQ}v4%q+eKiZ?y$I0q=m-VL6`!b{|31XD?1Oo@Hq$agOgwKM!&IRoAZ)b=Q zJa|Cz$^GmV@T~ZG3A@Py>EnBObm8^_5TTR|k};_lY&l>-(Z*gv*$`NU;4XJV<3F&nB) zlUqGxMc76PlQR$Jg zKX;c`+jG2)YYMznQh;4QxVQTIr$NmdMM74L$VDiahfk!rosCU|JYbCbNDqjxYK-Gx z({R*;*`+ziVUd?%>iW=%8ao3LOdCedJiNN?b$NbW%nPYUrQYZu%m=!YdE;2ynCd5t zQ1VOUg{hTjgz#uN)()DpHZ<^-iiYoqO}hSeLsiNA3ta(7fKXE* zWM0#9q(o?sizW(@j_<>;+48X7oyQR4?`tCr{OkTqd6^CKB zOTFaHx;&T4q5!gzd(Y8Z&jsr@>V`eDISD~2ry1Euc}v^cUU#e}$zfKQI0cySSo>U# zs^W<3=awPq6vB0@Un~ud;ix6IDv(;0+Q-EU?Csw>UBOpqf_X|IDl9fDidg!SU-HYZm$#AyL?5?&@(_H-k^f!_QmZB8VBLz{tSE6Q{dBsIxqn+ zEFGwH!W+AU&aL|9A%@$(=ik!7j5L#uPgan9&`Lc;&B||Q<_=0VEFai(LK4%SYGUn1b_V!gKRfo6=%;rQV>Fy}jXc=7C&5&&Qjl#-X|2vOl2LUzysUEuG_z~PmW&&}5na0W}40Z;5k<1F~pb-bcfd0ZE z(FbvtM6?rVW^3o}S#0EXbV@N6<#85@w4=b6NJztAMoGHK2P^>EnLv|pivD!59T$8; z%|j@pq6o6FbafTl(&F*MhBrS5l=K$#<*haoyri0!ObCisw#y0Gs`)qMf{j#R4 zy>j8zTzQV>b3MMDjv?up*U_-gdq7O+hKCN<`@>N6P#nP^xPdbEvE&_j`76GUEKEO2 z3nh;2Fxe#B74*FsvSE;O3I?h-?j!;G8h9yfR9A+KV$Sc&hYx}aLTTV1qbD(oNu0_S zSa-pTQV`N(!)E>xbmTR*MI^lvoB2WNr5{FU`+)XN9oFT= z3RQ{T#@@s8ilDELev-{iW9f0F9}nUgNMe4;1wEmVvKdf6#CVXAI_ipm^1Z%)1gyKf z_e`OYgC*}7_scFDZb*)cQ2C^Pfcy$S-gHcnCWyltUjOus-v&xq#G_QS94hL`e0z&n zVqB|p`d-=+mVDMgIu7s0lGS8s8J*y_A0_8aDcQ{z`n=sgAOXIsh6WC9&91ezEmNTC znmCnDV|k83aaTN?_DF%1DWzJj?79#CQbX12rD0oBm$7p&bpIoB$QyfP@?Tv z0xMKP2*kxl*yJQ9-!A=s_W6`j>Lh1#GFYoC%Tw$iYUe_*GRcaS#sm`V;#qA1W4 z92=1A1x0foOKFlkNOr2CDH5F3a7mAV=H@ctWnEg;?;qI2Rjd%%oJ+^a15s2OGg?{0 z!f+JEtf9H-=Ao%u%c#OmL~+M{wAy&V&J%rme)RemQ7Q3_ zRB=Td@z2X^A>kxV&f9l99fe-u5XhepOnl%l42GH22mI>Af3#^ZJJxhLW@*aQ;L40D zbL$E$=1I5J3W}jt=;=dT2Bwr%jayGQ=sHJ*%W}WUdVbjIoq+C7oTi2z!-DG4sXml+ zs*I?2X3y>rvfR`D)x_D%k6s{BuUl=5E*T+n01czN<)PMuXgpr|`{RXS$76442UzNPDX@3EO0N}z zt5u0Rak<>4UhT;Kk`8BUAQ}=7Ke+0{gtiPqvU7T`>o_v zfrZuFh}@kUH%HBGy%C~=oGyse0>?Q{msz@VP%1X6GUh5tYcOhueRl|-Kqdr%P{glz z7vGbFPBzv0616GG35YGG)rh}P77ORuL?|DxzKm8-p$xHVd?GY%dUvlu(eYC4rLTM= zra#7j0JGUQkf0hYS(uV)H^Gp&$L&E|JG;)X?i2p#Av9}wx)w8qENMGl|q+QkzU!i-} zhx>f!ftc_uuNz>5e`1qipwmw-8`Dy6I{0yMYPNeEKQ=RSucUCO2NTk4anI{6g7_0>`pppcT>Q3`h3g)X4!DYd#X5*Cj^Jn9J)f=w-gk7)p zNP;V5>iFm8*MSCt(x%?Cn0NzVYmW{l-|%sWR@1!c$I*E139H_Y)cseJ2{e z0k0{RQ+xa9b>sIu`UB7E{b8lJ*``NH&r$HB>(P_~(`8>q?K&d*LZMJ@^Ho z0~0toby^<9{iMelTwy-qLUpl}$tK@(NI>+SVtI6dgB85LwRSE=Xnn}XW*3Mif*Fr% zazFfMtp1Xv)M2qwtBZWahwqQwCuxJb30^w+yF?Yh5IID*tVw3yn4RaxH5?+TeHDcZ z4sW28$F;aUh3GSM>`G~?@-dG-ZfX7i1p`@-~hM zFH#(y*}uZV2Szz3NvP~Mg$U4!s2Es>Q{X#(*&+Z#2H1CJHJ-JWuAI9AnXftYqVudc z_h6U)F=2*816Lmu-z`G{gb|y%Q^*K-s?t6;g;@2=_qf zh-XtQi$khsC`3fWu1RCRaKohF0I_ki-JX{E#nct$-Wv1)Sy75+p~+`-o8)xalV_@U z*1ysb5HONRUDT5*lr^#if6m+H-sJH83PrfT=pH129W_&zJ8V%@^J0{7Apl&P&_F;l z%M*k}s-BlAebfwRXDSvUXj;s`%g@4>p|Ja>%0SYI04h|_(OOcZ)ke;L0y_sNU6^7j z7S=}j94IWDQWlo%QQ$^J)ajPRny851lBl4&sP119WwM>AMDVx~2mDqKSeAMCiTzQ+ zRwc!C$6hk5i}loy3-G?j!_Rme{}K&rEAKp(tdJ&A$mWZ0j-sm5nFGp3uUDf$R2yR$ z4u?$|2Z@_R&?=(R^jzOXfie{8v_Id~R(B{Y8mDWGPb*WWlWz2?@Tx1 zT;?x z#gzIeaJUxQrJ~&lssBwDWwyygn~zYizK3;BVk}Y3pFwao702s0Iuo2HS`|GR+KFy5 z8P~dbe?p`DWhZ^#Waa)MzZ~~y5(U_2TVe7_cO+js#d2^WKatmCG=xqh1#Y68PsRl? z9A=FnC(^`Ap4*sY05|6>A#QbXq@d7z!WXrda&)FVYU#4;{8 znqf-T2&>6T5^}OJ3SlvapTGgp;DcKq=|MslL_H8{OEoYZ2XZ@HiP283Dpil0=#OR= zBg*H$B8d&;U!MEL^98eswTCIcs-dk+gl^bZ${wXQrF0zgfrgql2)fjp3R2EqUI5aq zhA3fYkS)EvGy6Ep+n-v7Ez~c+2fcon6<@t{?{#P8_qaz)EFG@v`b4he`JE-^_IFC* zDUFTcfNLFGf9nQTcc!wru_=4_@Xvz~QvT(T9Nal~*|s?;TfaWt!f=l2)Ej{~f^`74 zX0%#F)r_uH13M+qHlnXl?>;5d{meon#uUsWDc#VGq+QB3fg-}rvl--dSx2m?shhm&kJ_P^ z%*M-7D(1!s81<*g++HWIBV{y2Q!&^P@8WvVpWZH=4AnZN4sm*8Q!XyTI*0&sEzg~@2t@cd z!5u*guHQe3iCcRDr(bq%mv{3IMCyF=t0c|aFB0hNd5d-kh2U%Junt4YH)@Ur?+x^q-= zoi?bu^c!FdB}jC7+ z$qdnqfVmg`aafYFtIa;-#T-XesMHy}Un)Yzdfij+5(`<4cNBj$e$35XFe^S}lr5%H z0>zzh{GY|5jo8kt0r(cY6wbK(-OeG2_KS`bn=2E%9*XXugvodp_iw*JeJn?tluP!o z+zncJvQ{dW$<2O`Fb0WZUXM@Tc=*ENIN;sX+AvyE4*m{MvHG}6Cr5U!tuvxSg%zzL zC0;^&@s#llza_?J_T)`oO=^7L^AB*P0Pbf;r%SyMBd~r&D4U{jibiPBs_+cUq_cL4 zoka2OJUwT%7rbX4c+*H+I!F7)Roy;uFHoSUamWW|g zj*6B)P?bMvRa)W}hWqc`flG(h1DE2>te+xu;2j+~+xUF;&5jHfH%m#s4^aaI_pJ$Z z3Q``*sAZsY@$+U!5&~$#jXJR)QOAp+r^a}xMaJ0}r!!-5B-Am8_2L60^TneSd)%M$-^}igliC(ldcX7N+c!F!-pZfJZaWki| zx@odHou?(&NIhP0d=aAD=z1a*kRhj%?6g21 z#-)~;silxThg@;DBI>Dc#$WF+_49-W{jXqq!1f3rOB>1zYZCd45-18Ahs5RgRQJbQ zI&q9XF@O~_cM_|_N-eFuk_u}{xjJSbBQ-RlMK+^V+NT*_`_CQp9v)k*x|hv6{4*76D+T zZh(%;+*2k#8H4;wB~U-`T~;r9^wUOpwX79Y102o1lO<~ayoi0P{ZFVPMyzxX=?t^B zUnvCMo?j|eIY>eyjj>&Hhd2GoZ<~spFY!94an-odff;s(#^Pd8EBinpFhS7BnOs!ew~|B`O;4dm=9FL+e|}DhXJ8oCAGzW?(Nj>yEHu3N_(J_Yp7iaFLb;bLeJ=}gIqD)e9jJ5d z+?zu;t9cUl%&*q73$i;!mES6PIWzU>clqGDcW6U{YB*`qw3bOYn%1mOI^R@bDfZj_ zrwVLIMYw`qu?);=*v(`?ccIDNJ1&x2zJ2)oNZdc^6ub&d1^*e{NJJe}HGQkBi~AV< zl;zEhl`g^oE%b<0IzsK2OYj5s{cY`n<~?HR#GPO^V?%GUGDU$Ls$|4Y1m|09T z;xd1T5QQ|*k7-5ByhNFgq3;DI^UDg$D%`JA5LBrf=7QE`R{3AM4(%ch473GmANI?x zyij>wpk9Az9T)WF^hjBR@%U23Nn<#ZoPH5b@;{JjkSWQkI8-}EiyvDkKxvMxI#)tQv~r(AN14V z59VXkOqh&el1}*aq0>g3`apLl^3@UbMR3g#g-%GG%N~BGJiQ&AVqf;u7|T)SKj=m7R7fSU}KU?uotJlg& zTt>Ob*1%dD*#<|Vu(r+*nj@Aa3;2zEKtXb7AuX50y!(Ux-XORG#thOdsv*X4@q!!t z+Z^qyOAIfeKzNZ8N%Rl16|6{15C!xOw7M@{^^Ww;U8E2@X{=57$&ckX?jyjX{JP;c zGaC?19jq?@To-Aii}b*bG?wSj4lB67@P!~`j49x}P>f|Q6J5fDeM7Wxtfu^GSFupr z4{9dd_}&B5XNkG9H>h5-zD#hVUan+-P&Z3~w!4aDB%4{buaHTdn`I{39b6!W2_8vJr#7944-XhBnJ{Py4P_jr-ey4%UPRA9at`;&K4_nEejI-14J-NV_x$_OK5=rYs;I7Sn`!uM7?q<$k}TMKk=_7P5Hjt;8ch&IFiftvTKh}x3$Hn{U0!7yqpI&2M3AhxS^fJy5H^Ff z7`CIzNiD2Lty42Bj16||Uly=@Mhj@u4eyQ>fE8LWHXT4VY+b3WaGU{thVV!$`gF9< z7QiB0Pt6PIs8+4P4n0sm+iC%M=$WQXx06Mthfz0{9RU6vDTEm82R0QS{#B+zs;-q~ zx(4f-u70NDY8Yr8aac#xYwCqckm(6suI*}hcCODC^9?9pDj@3B%(9##8v+(LmJ7yU zLlJLe2f(uiXL?8SS(*2<|Am-rKjV+t7Tz?UYu2gVl0kOu(0x`MO#9-FRHdQRrpyam zk*)g>&JBQ%*Tm3*qd1<;8u7A0KDR$dim?#)qoS6B^UpS;hc?+F)-s)Iu@L-mX^q5s zDZYL~w2e5O&{~M%HBiSSxd#*so!O>w&B-#59<$zoi#hANuov zb9t9=;OvzrcQL{CN%=tYmHPb+{|zk|(IEx(4Kon@cChgP@`V9-#|K)B+%rdvs)7T@ zS>9 z)}(vQyO$~Jf9|v#y_eemxO+Q7YTbsfMFpY*N&FXv07na@A6ZNgw4;WjhSK}zMoFz8 zaCAe`NAktwxEe*`UqJa@aT}eu%cFa6?g*~up!bM($`7HV80qJ@htT&7FWjfHIy>-N zQ4>9aooFvfoaus#eOx=bOv>9bb-?{{$y-n+Tb6*%M%BZWZ=x*lFW8Q_g+q`z3-%yz z)VG|S-Bqjnx)nulLxU%{&E5 zg9P1c>_`|KW?005a!axPbTPb4l+PWjdp%?D1Ar8ygE6|U%xEbV{T3BMC{{>Ssx%In z2g4n$M8%u*wHTP5)DYaFpuU_6KLSBTBYM~(XYs-nLc|20c0|-}PdKMXMuSc!Kn|K_ zQ*3fSbR{w`0i056mNOb42K-~cmH0=Re4EO5z#Rt|`R6a@vOPf0w5GOm(=N*Z>#Y@y z5#biGMvgh`d)dsP{s|{O$AGTTp5)=x!vb&WWdQrjG8 z>)cH8O;lT@KBtA$*~z3S`O{2qv{6rb#Tn@GQ>staKz47Xa=GF)s?=|KaW;k)cLrZmm-1DQCt6 z2p|%ojY)v2OexDIxZ4O%>C;p=Ee^~kn?)aXtvc5v_^OQA+Ja`}XO6fJF*&P+K&K5B zV^k9u(1kUt6aC3KOH9Q^jxc53Y}hPo5k>~FB@NqbIaf3Wifqx zIhx1-5MvLxoU~a^Vn^A08rggr%bAwT8nmQsNmYd@hhRzFBDV92i?XNpx3JKnx-{4A z^w6f8QAjY#B8T56F=l@Imx!E_!(NYJqsX%cQrp{l#czt`>b9k)oNCifCkXCJaRjV* zj61{mSIf}~I>`HmS1KHffIAjmqtggY)>0cixD$}iJ`Xb-sI@cgNt}%PM*oThQoUbiUoN?sH=cN{M%7lSbaHwXGN1j-Ue=z*3ZDy>-r2qu(oRme)Xv=z-tNedQk-X|(&dD# zXy%NMG4Ykyu@b**lu^b}s?ac#GX#}PRx1s}v;@CAke1Umtq1Cxi$!5LkL3%6NpXA% zQ%w3!Nbt?J2EMHjN;>F6dabAMGe*tFbByLM5;?aHoFD*rTIB${SMC zmsnLcXOBSzu05tdjU#FM)aFGGm8mK1>QpiE{5#@$EsM_}tY0on#F`IGe|+t*3M%C~ z$_oNLY<-Xmc%bE{r{QgXqrJnQ*O7Yl(zCfh59nk%gAbGonOk(B7}B3kJe(2*q(rC4 z*{-X;+Xs@q`-7AL6b}UIw?8`aUpv0r)Af&1Xyyjsp z*)LpR(=z6OCf1ngodG4{Bnk8Ju4x-{1i%w91&$Lfv1)W{=15?F&zOi43o z@+^b%;ndR>V+^t%5vi>5EQnGilv8O4G0Wj7Nup!DT6}crE9Ps!M6Eq7WtrV7mKY;v zi7_gdEvutod_tl%KJb`_p-3k!REok-k}qu*ym`$la*!3{17{6!FOO6djOLuCM-E*6>+hryi0*s#n-7Zbt*m@KH1x*Pd{&QK4+O}B4a1NEzdlQ$ON|czhB)) zZdB8A=B1JO6dD)Q+ORe61V1$kc{tbwW9M%)6GJ6EFF8Gt0!CV(h~AW;9^prrh#_9^ zW!hyEQr+c(8XjeVPL{IsZuaA>>F8?Mi9$A6iOxw%;~5U{5YUL+5T2I$Z>(x#2&0!E z`(j&q!$C&q%S%+tjeD{FLM8*2+`?jJniE> zHQC|hxqI@3k@DrzIj#2(p$^M^GrkvDOLgsYP(D&{!9sDsa9fm4cuJaIU$* zl7pG6?e)oj>HTO)6&OQ9F^#1(&=D?QUeHUV%|_6(Q0JoSf9Lu+MT|zex++d#6B_mm zDCqs27HEtx{o_xM6nCK>%{_x^y;6O;=LXFNH76D4R2lWZ%6(eShW4X4p0YrGQrT|t zZuu_A`d_gBGdtTN4DAR81`+s{(gLRd{clxqdox?iI2Z<1YSD&2hWYQ7AcoTatSvY^ z`w)o#W5c>2XW|O>Z`c|pgLn>9wB-OJ>c34|>~L&B|Ffv!=@_yD{qds`;y;U&0}O}^ z{&F}dV4a%2BAPHdzbb}~jBX;5ps;duI|Q~2Q-GR$sj$5Yb8zr)m5P-hhP}Jtd4|dX z8ML@@sN)vFX)n)c9DgSA2PRg}yItS;End&_&jdz85WNXKL6eK95t$-Pe|YoDwl0Ug z&aRm^{(bApaQp|KO`9bW91}_V0 zNdF7mGqh)naHAs)UdB0=MefgE+nKpVd*+K{War6Y7A^CJA}q+7)E3nC>uDg(6{2@| zO+Na3_rt9f@SwGr!c@tfZqv7GjZ;`cFaUiilhh*9fMoEN|=oSLO01L`-V69^0 z0H)m;f!qb`^HFB3{sOD7B_4af7`T30O2No=_TKA%|kAi9`&O6SMGTkJfo)^a$) z!Es6f(mx2K_us@lrjxLFgZpOIdcvZS(u%%<|VEN~eJSTzs6V?QD&uhvRH~W04e~!24+nUV zaQuTYE=0z`0~A9F6BABGT^Srv3k16m=zmWmlN9_f;;Y4;dI^bs{Gc@WuURl<5d%F% zL5LP8ucHEM-kn9Z#7p4NaveTto#5x(;PX?QgdoE-5S~{y&FzRB#|kaB$?L z=X~DQoI~@J!}itRPujWJ-LCUp*9HDJ&w2j0d4bpal7t_FCSy4epy+^QHmL~sP@0O4 z9=^ucR`Q)`Pp?0B9wmDKx_!Lu?lcCU9^f4u&bNzZ$AbRPqI;(4KN1y()Q)EZIqeI3 zY@UbZXWr1&8<=kY`h7x+!^Lh+@}%3wYqhOOsae=3L2-lYR-iRJ!}xS-f}u@guC8Nn z+b?!rT{`YA=?q)EV-De`e`iCIb_O7>8D76Z_F*I;xDaWEDdU_73k>UF6p12%zXAst z5?mJ*q@Cdh2wr}pu%vhM)gQ2g(njO-e$Pwoy~^ojH7b_E+(EY#*&gwX&leuTq;E{i z9?`(4srJT4Sj9q`8smxdlb0!01Cp56X?8ud?XjUJH}ldyn*bPGN8C}!K&<;psFa%QrEQZiak3*RJ1e>4_HG_ z4jB`PbkktrKwfJ0Y0+d}Gh^}?9{muJ%%DVEl(woR<0)+xcnywB2yq&8TcZfn(4$o9 zs?*4{q)R)`HrJ)$(!EI1$V-JR$d)2JW4Th^KU@ofi2XFPA#J+ItQlVt5jhm9U4G=BOLa51PLG`1K0fV~_wL6Z*9Sx56%F z2V@0k*h>s!i={#D948vhL2MkgAz0U|h6kU$@H=8+)FnryqHwz2d+}R^3S!G>gsTHN zfQF3{QcdOSYB^>RpzV?g9*F8Il0Whc190;U*;t`Qs0-reRJo6i*4#2es8v6t zL&zQyrb^3<4II60aEG#rE(O%l7>v<4tQq0gRs;vyp_v=!K;jcYu|%86{aJ8>Xwr3~LRCiXD5>);h3pnNOz3yTRC03u&esLn#-bJQHH z7UEYjk{+FqAb2P-x?5rnw-%G-MsJvdR+*>fMz`H!aOGKhsTC3|B#shfbo7p#a!kJ( zE#7bA!Qz-{I+V~nnT6CHXcXy!A^lU8L?%C~W~=^C7!an~GI9H~(FHv zAPeGbyW*(WuostF0sGo~8f6u-?Q!0N5U8y{q+8GEwTN=s!^r7{X@c zd&u!LDT>A^@ly=a$c^_k*@BuM*?{eepf4q+LdNOx zm&4)5usV+(FAxD(nCq@G(Xo1W`v3s+R}bMou!o9Ih3k`q;C)K;t(@Ayx;s*YLub9p z$ER19U+H)#Gt24lgY=DPRrH8T1kV0p=+q5suysP(l|{5l^f{9=!QMb|6d{V*dgUY8 zKPYrU8a5xni!1f1Bs{x7MGT1XK^C`*nt>z(ErwZ;e*YJ;_$&Iyu`__4kjyp1r)2A`W|LNCJY@@oQxIv zsxj550#zC*+1?5Gth>Ec<4R(pp{|m)z5_oWL_>v?`Er8VQYLpDeaJfq)|V3wtN{VD zO>3;7Um&Bk()YpX$_md=@hX8#c|`&Coev^!~+GGrS3&Wla9#U{m_h64=hOMw9se~l{-LG z?ImtW(Sel%c7v_BiwE4G`pM>a{s%%fue^*#Qn241*<$SVf&E+dtNHV zK-|5bx8Y<}&%QmU@|P1P95Y+y zTpcVt4<;v$IA8bzg+_eHEm+t&M$FAY|0&IoK_6NFzBbftTWwt zr-2zYwMI@+&W{6;rW~ zT$W0xr1<&R6fx(J@OGz*lQYtMxwVH?xfIhWn^+mWha0Nwx#L?Ie3mykQdbag?72a# zFfd@b`dMi|5>ZcNp^MIplETNVfE5RH$(@Jv(@*p3frl&-Z?#sP zB}drO>e!Z$7`~!o0O$$?)l~Ku9niFBcIhgp7d{#JCdhSbFN*q7bBYMvFNz_pc1qls zplSa6A;b6@uLn)i-AACqLkZ6@IRyuz<8%Ytt^;6$hz{@nQT5H?aedL+!NhhO+qSJn zZEV|SlT6gun%K4{cG9S^?Z#>vHMse;_dd_}{kLb%-V5*E=b1BSy=yItN=50qsBAOn zoS_VB=~lMl{D-O2fn){xLUS+g$5iG*;G#rm2deQVD*+Wh0socVq7*@Y_1n*?qD9ly z?|ks%iN*dV8gluf(`!U=H__}rZM=vDdNIyJ*N*lTneY6xy@XHb9Tuk}&YQ;Kv|}#G zx7HMiX9&pSc&YI%s*0t2;&-7XE=#l*1GDKptdIJcoaalTBuC6@j~1b`xMFn|fFt52 z+o3dSMHVhkU1QKNUHDH<1pTcJewAX*#j0pEo-iG}JBrHYtkaGJl!?us;sbgiVAYYW zTeCrwj|lH+-%k&t=R2g{G!i$=As@?&y`7;AMl5bWh74nus>xNZyK{GbU{StSL17sf zw{A{=!jU4c>DAe&?brzI(7C_n2Y#u!@*=>hoxYMYpgELk;jb*5A?)dv8>qa-#~&5# zfj~FDc9xDMr0^3Pu)XHzkXqP2IYV6Z;V*Zg?+9XB&~3NMqs=%hX5Gx&iSfev#&V(M zKY9m+k^ZRT+rPfzb+UkRT-b)`j4{oS1agHcQ7m71 zJV!Pq$P4D>bo5gg*MwJ;oV;9l>b@N?c@r95Rsa@JKxJ0N~(BCh-82;)lz7ZBb8HT-RzC-+661g?IP5ta)!{)%bm$S>x zr<2>{OS3uk150E5-cV~21$YFE1Ymf3w-S@O$p(&ue!UjESoIG%Oxk_wYtF#%&C$PXI;W}-{iqKQJgY_VE^WYo${S>Kf1t`RdK4?Gm3%`Rs zYGU^f{woAfHr%EmMdi1^iV12X3NYkz<%20oZeK3)VX{VR*JSmKMmdAo@MNf~9`wZ+?e0MlK+g0Y`;ZuW# zx%LVmwZ0u}64Tg^dni}{XZSsA3(12jA* zRd5_?KRi*b0ojz3O(UA)9$3Jh zCW8(qa^0NHkSbHDxhff$mKPb3kv8~sV2DmNaem&x57?oofLmH&f~bhhmJ+m%?a8D` z(1B?x%}zAvLVD~v=;p#!@P(ZK)?Az;E!}O}>|XN-QUXT`KAVPEfUj)IL85_(T${!M zK|m~(_7h}70lC~r1+KXQFF`&vRX>??m>wuCc-n1uqlSWp_*#=&nfb6j{uiH<9J$$q zVDb(K9f(BNfDwhxO+~@AmzZw~>Julgte)enmsA^p@vdXu_xKJ|TOF*>iG^4)N)IB( zF2-MIj34K$*UJ*i&-cEXLPVL8E6G_d7L&`^Z_%(S(3$@-ZPv2zJvc0JsFVRa!5p2lsy?&= zkF{$upI5ndB(T7+7=^MP>`E&h2{W0>+~XOR9-H^*eer1&z*rX%V}b?t=oW;zHQb;) z0AdHB9EShMaB@M;1mBJ+*K_Y>B+r|k-1~wa z^5e&Y#iWACw)YeuFtuR6ye-r(S?^m}Uv0S{?S;_;dn|u-04D}E8RA>07(-7w{9?Sa z_XDF5r#3IkqjHQtr>};_+4P`N{kR@V8t|HrYtWj`q>a?utlX0z;mMsDtm|PPwLMYw zfV{i+#uED_d%ETEI=2qL<+f0Ddj zv82e=(P~4V(kS#RCO)#6_v3cvi~Z4G_mD+hv)iQVW52hW+QR4@^Uz7(owtMG3_RZs z8;5;^s$k7<@k}gdAz_40zz>$gz4B39?}a+#*U8YW)YZwf<>Aw*$j~KZJXOqiAVFwcRR+U~xX5@oUbsJ+;ZS&8)B`(%aEcTpz|^-^Uln-KdGEmBrz#F87>gUlZWG z=Ca6~(NkC5qG#ABj_7DhJh8H`0ajL|#%vTud^Oj0SO3+%YN35ekg+^qPC;-oWm8?d zg8l16H{*f3XRNBS+GNyh=OyETWW`J3C7nUHbstjkEQu<%S^YG#)vSja)hWW>oJrHB zO6PP0J4{xvd^&*MC-G3GSluF$0{igcNqDke?Ay`8phRcS(04uW{6qv(4&YEBrMVdc zld7OJDWPWrfNXr{21L);0Rd(U&PwGX1<`aPcbRTFXOp zYtz$;=VQlfcM5sB5xDm4qL|)4j@7y>wruxz5e*yc3cmUfNs>bh6_8iNG%B?GSwA@` zZaUN#zBTDpU$oYbje+{>NhOsl0)CG)N?Mr19uHD#NmIM|`X|o}l?hqv>+eQnpsAUU z_#H(ShL^ul+9|eb-7}^H--tHjx2#9z*4crM{#b0C$s+xa1I5}IF26Zq^2+Jb5#@7g zPR9pF?1?zmjP2>7Nr8m(1h+^Y+Eb=l&}^eIvO0eK+X$|k&pWtTiyt>DuqH3B;G)}q zBYbKQYF(B@uI||N!)ntrFSN4&Oexmp(?AK9&itMLC9cKS>W*@-yXVR; zj1WGz?sI?W(d9Hf;Q1|z_j?_^7^TAUj&zz0+lMpx!2WNXC>_AZD9EC~w8eNvNaaz~ zCc}M>tFO6`nSoUYs*K8*ihKPqf(d+hoLSz|59HTJXCpsgBh#ui7_phMNWRX}QIm-d znwkJ22XVgrf~Cuix-uRc-FqVu27eM-m@QRf;AY4Qp3YXG{=F~RDOesa2vP(MYw=o6 zW+k~5(d^WklZFGcT_2|OUO8%OH`>-6_Ki0QRgq|H$N9f)wH(>{`d3jRJ&?JU&)L5q zeosqd9$FO$lXw9Z^)gnUz74>YAp=JenF1%gGgpXc+ zf>x@`Txu1iNtdlgE?v}%pNs5$B?++=yKxL0S@>ZBcopqSCSvcpwzX?=%SK` z0PB7f4i4_A@9#S0v3=%sEj_;r3lW{(GLkn!a_pjFb9;5^N_0zZxuS~G@*u^X7O(72 zHw{5=X`DKM2XHv)U7amrE7X=nX;U&(@)Smj-?nk+btla&t;TrGeVG-CgKU_~W|Hgs zQyBD$#yNoYV{*j?>KfKZsv2|c9-Wsw7=z=#{4og?D%n~zI z6sjm2yZsfPv(LxOIeb zl%3fCygq*P);BVE6m0EOY8>O~~_NT6=`affGqV~f7l)9yY4gxW~6Uq8F7$jgl*&iWV?>GJ^!Ns?py<6dI{ z-(LMO8n$8Ed$a{VeMVBiy!N|>hGswQpHN>whq1r9)0a>*Ms#zzt0g%S#4c$dLr|fhF2qdi+Et*3hCRK=S={S(NM0 z)+l;J17B>rwTMDXB&HikCR<3p#X!hx`$AgZC+Tq*AuxWk`C=A#W>nY%R&jI)hFV6M z+wrJyrdepqwAp|u9T1vEzVCm$LRryOyt8Xu(Y;3Aunb~1&6Yzh|16R(jBufK@_AJakbDSarO1q8{yqc!&M5M_+xM`pE>%MU-~#?}EMLK9q7ueXtY?rRp$_{f#~hY%t~R z5pTXX`IM=>L~p2-cekA=(dvd)p*(ibkx!l4P$7O!Q8vOj;)`7ADbdnJ$`Rd+lRoI) zwyzUEx_**QKp5d-dqg9Xlw3#_NN7uSK&31vBQmD(=~z~@%|K;QnvUlzbo7t2X%QwP zUua`Qt7yt^S<}pdTj>vAVktBfAnlX2N8RIgER8X4a}(JtCf@ID7)d*DPQTX-*>hDF z=^ncOq=U`tudpj0J_+J5yzQYQWIj1`XeW`CU(kS$f8aasBzvA#B${9Movdxm01|u5`N_!!60JqK85o)*9 zujn_Cdj@KIZN1Q*152(?A1FHmdjdpuJFch$2Xx8dHgP>3lF9-^u&lZ%GIm%Ba5ix^ zt~7VP-48K8bhJVWqkHy>3<+J;FC*oSeEcf(_Xz)RzqP|c=MPmso6 z%#&xp?Yi@U%1q@eR{5D`9#F;B_ujVMHURmWHn4Q8aYek%*#zt*_8jWQrM^z;AJqZh zBR7PzD|L;TpCysSU=V7Huuy|d^-go7H{LvbNPZv^a|s=cmNNR2jGdGp^kvAF-k_?V ziC(X`-#|17^BK=q3F}IP|q4UwPN>nx{NidG~S`TE#Wv;mh+t zqE8J~vz*0m)qqz_%|Y3!;ZN@@1z!%E!g0|N{QzG{BA02L0gfe1tt)V4 ziL6)1>Y>r$qc5;(^83$$hsxpECe~MO62sB&TQjDr>5mV8e0_!XjNQO=j}M`ROiUz| zg!ade4j6ZUG+9CZRqPwPhtIqHOP|BzUdl)j zh>R2b70lGlMy@2xE<+1mOo|>^`5A{va7#mmnoLckzpVlpESfQvqjp1uSnKgB*AQpF zN?J=;f2yT*WEeTZa2&I@K|5O*W$B6?z%w(&m@^ zptk`}b>Gi8+Q^y85aZQ-mdVKDytq1tS@tY^p%F$n2alC^56qIOuYHk38_WEZKjN064UsYc$MQ06Ll-HPDf!FqB9i(GY-n9< z6Za7fe5Cs5B@*L~aGLF+m`d-$IsQyFok#S^)%W@I>JhM zJlTBRBvj40$$ zUm1ZG*rLv<6Yq4+Xdc3jNos>}lbvY#2-y(At=?pz478@QL0Go>%~Psr$5|*X4s7gduWWrca`Tf_eytl@EaA(6I~(~MD5Sc0?!5;znhiQCo!c~xKxWKZEZJS~U?x8k$zUNa`5B7ozX_clqxZuf0yl*)!27Y4%uujj z&xxYC#w@;=EI{;WLjX|l5}MrRDVB^d>KB9 zj=eJYR~`I)!y_~6l7T8D+x3gNmf9@)*(Z|%f}J77-vgGvh)v`gM9h`;X#Zylo5 zD0^XP+@(S}Co?5hsWJgcyD$k%bX3I7M7GXVG3~#dcR3e>aXmuWvPfu5uFo>jl-qAs zqf2VF8t^r5p~Y)9!6io59hC0G64pqoiHMHt%y-FXkkqEXRMJePQ(xRbEY>K8R>R+S zO=<{zz1DBs{j#WSep=mtGRAj%DY$zamaxkOPnS7KOKLyzW-R>4Rd`g!x%9VhK#u#3 z(Y&KM#}NO4oBM2YYR$RZhSegLZq+H*zECs=V)DvuH?*A`jZnvILo!pOZocd(5c2<{ zE`Z^=AhZ8c4#0QJkp6$^HegS7$k>11f$1Ry|I!)2Wjv6R!v9edz&k}y=IGF{?;`m-EbNTn(2X*0!<$QFhOz1$mn34We=HMv`Rz>h%7wNOgRE`>OO!HgnEvI48FjEX-52ONQ)0( z4uJ5Vs$>3F#%vG^64d`%ypjQj4oXFW!fyTslkm^#?|Xm_z~5yetAKi#zqY<0z=Zy@ zI+6+IH`HI}xt%(02SEu%|L43z6B0V;p$M`AoR|T?!bkbf{uk{>$@k}dh!@bc6`a^V zkZMtpQNan5fIrZGmBh^gCIEj0ny8b&7J&4>|F1xBTqmF%{;&EHVwll?>d#IAqtJgv zFSzyA8@!7q0~rIL#6YY~sDh`+VRE7V zqHuJ$?O_hu=6Xlr@49$qBy5lZHxwS2g#ktj>aR{`Dj0T{zhYdju)cA>_dhxZ#iPKe zg0=?V{fw4{LIoQMy-)eO2YJ8jGQ;1e2qS~oCIKq{&4C92rIFylP!cfl|1kUr4P*At zWrZQY(m%&SQDB~7{+bkDxxH!v>Jj+gjR9}5!g&7M4}&GZCKTd-{%AX))Vx80y5ONC zLDR=b1mK4k0Kz|yuD^Br9f9-#|F^IHh)A#?;TJ?$aP}kM<{x$eurNOV44Cu;*g*b8 zKN<-5hV<9pIu#h=e}^@}1|}W)@9`sETKVxE009w*`1fdmu5OX&!JbiorGFD=G+^@o zZAL+?sCLjh(oCTET}Uy|wk!-LC^rKU8N87Si2Qey8}={j|Jw{+nExR91lk4y5I~nX zkm%r@r2lT1cL%|v@-X}VMsy}HPyei@wt%q$`~}%&+HP;~T|xouKWhShBe8-vbzmm{ zL7-}R&ISfeszOPD-}N8I35c$b|6}m%pMurviiBq`+(1`J^6#|k20TR#_*WC|`uCIc+LvYy@J8yGefR63q&=&c)g z(%OVDyuS-wNRudOI_M5y@ex*)a~^GXYfx>MM$KlIwX8^3lWNIvy}-dKT_0Z}xPdpF;<3En=I+ zD?9ovCAipb1BWy17L&#QBTu|!A}NRC0Mc}Xh}#Bgv*rBai|Z2Z0G4?Ly~FzM=3&iM z2ec5*q1o?>dR0?PId1;4aG=thRjN{>HL9w0Z#a~B?^Vdg#!O^5#wM(>gQ|+HzMe9; zjis&`CBECJ*Q|7r@T7k#Y zQwI5Ju(F7Aa<)88PC<>$VG2KPEwSDeKZOma(z+P=Gwb#-Qdo>=6HpvOf5yg$&;zaj zvsU_7pOi~zd;b-I&_x;94xyS7&g|rrMTVntDxm!&(LJ$8il3>3YMW)AXTs3gWtCC8 zRGI3`YG3Tnp_5Zb$G9V}6mN> z{kHvS=$i6bo$sCSbp%ENyl}oWa5W<{pV|MgKXCc6B46+IAh% zGmdi(dkMeHM{Lh5ufjFn8~iE3-qMCvNwm1!%sQB&|NH`}tkqy<5fAavZ)`=pNwt*W zn4UVbeDvE8mUuM7Qye8Sdg?@N@hRt1Sv1|!fK=jko+40@ok>xNsb175NbFOG61-grpT>Koy`Slk)PphXKeEi*DHBGs2OldW@uPInaL?U9O78{M(fQWdE+Fi{cEnvQ9m(?xi5e=sXNMn|fhYJr$@IAyt(MMd9+6#j zwv^YmSxCJ^Dyb*-=c?Hqp*SQ&UKiAz+?})bW4Hp>d<@+hZwy%c)JtWKl*WAQF|kwrFq0Rnv@B-D--+AW!y}j+M|`A6=IUqmj~Hw z;&Y~t>Xc;6(#AeU5nu>@sJWLx_DYrh%*LdY$EhY)62WyZWn3ZWM<*#Ef$EbO`^nWy z+TsdWgc&GLY;aNd)6FNRJCM?T7-@d|R}#-a+vW)}zY>ehZ6ap}D1D3?a=eL}PG!$j z{CAldQA9!bakZ5yo|Vcp1HWHXH%g<+SF?qY`JCxL-?40dw^mdm!IJxReX)o219g|q zRPy`f`UlMZ#Ksn@*!WVn7OZ1@*LrO2C8Ny_d7yCD!?9BqO^HsUMU5)O>%I5lt%AD5LX6zi$ zes^~g>-G>~AV>_`% z>eD8ux+|H+SVzKfN}*IL2HX^SC5=Dn;#u-F1T1UqCdMCQ&i1M46Y8do3=Xe^x#tvI zt7UWWA^p4z+11;N4SFX69-`ebB0khgJ_SFv&GLo0a!m#+I=_~8AlOh)zBw3v1{yBg zA97rsBHfa*F{V$m4~JExh9kM;g+{};a7uwZCe zL%Y}(BJaF?`#~6JCngagzvtq_3B-`-64h5ejam#DxX8AJW^a($5ix)RT|-Gq*90Vs z&6cRscC&)N{FLg{8h&=F121&xV|ISRwdhP{;4&!r#plahZR^x&v z)4bN^S8`3=ueLI!NUS&r1-g|pd%+JL^hQgFlr{uBN4^-fA<^r!Adg)}WkH7r;yYBh z-0zh|^U9_dO3CC((noULkXk(yA zuMiNKAL_-uuUk~j!x*R+k!7z|O<~)kwi&Y;=O}w8$cikG6TJ8&UE#+1%Q^YT7i;c# zFLlc~s#pXFW$u%u@Z6AcQQId*j``7AoFW4#_fz*lBfN0!XINzs*+eC@7Y0yTx@>JC zs}kEiY|>NCFU=7H|JhHtHZi#=X6pFad($+s*4~x1YO>6fYZGX3;Rc?(AIUB$&tCP* zsUE2v+gu2B8O3woWB_58Q7QI``Z?0JyWVE}aq9+#s=gcYf{4h|>G z#IzC@TWqIbKU`P%Sv0rs96yOR&Y63NHbxPW96_oGA3h#c5md~{WUPF`47~LJ9{$k7r|%QpGyzlEnK@iEcNTaNV_-fofU1u z5#dZPKTG-FqJgoZFrfJ3_;P4SDrL!tH8aeI*+ihkuD zjOP?2+>_N@NFOxUY#J=1+*AWghk=T+i=(wl=g+u^KDohLJDyyx9g}ZHgxl;gcHqg& zSjh<<2L|N0Eh6qt4csgel0T~j#vx#3l-~N$-$L2Ix6wE8jG*Q;V;$~N^VFMLNuc;S~qHM+F>rqA}G! z<>?Bd(#`tV1F0>t!3+yhE3!fs-6<^SzufCZf!hyhL~3*f+HPm3LFs#B-1gmODf*0q zlN%XYRZ6f)HnKS3#qDL-<3>sj?=3fOV#$6m5LcRk0DPKw>J+3k0ZYp>hk-q|CXck> z8nm!r*F90P zub&Q!nA%t1^4guJIFp`4;Vf?$wd>Mdsv}^(`Vp68M$#0=ywx_>B*s+asCjNLIh?`o z3wRLiTk1F4# z)h1unjX#~xDDxBl`VnV0kXGBNU?7+DW(50Nu6NlXD7)bkH=F9?p8sS4A{oQRX9D}h zD;9Z3kV4|z!6-=fr>1QI!(v0EKvEtQkCOu;fyIyB`Q&HY7qd;pzB9qY%F&yBVIWFG zAfKSK;a5ro+eFy8N(j!#MwI$KX;-XMMY{q;6JO@f ziGv5%jq-hUzR{Jvrx>@z#C- zcTeZM zM4h9z>|&9%;|$Qwv)70VGNuKvO3jS>e|!WaEM(8lPEId0NG7zTfR>EGX28K}@!r!& z0Y*}!j7nBxjdkr4Vd}6ah@;879BeQ1nb~5WP<+A7Gh*tSW-Xv$q-$ELq%b<(HKZn| zF$qC5!|Yn{z{^xQZo!>V)!G(U6;Avat9C6?C~4S2p)Sk#clE0@V#(jU)iTz-r%9G} zD%uJq2M8f`zJxB^3#0q@5J1%(KtRUwx8;??Q-szZ^D{!%w)?7N8J$b~q30j*)5!%` z2C@Z9P$H`6UuAXl6MZW`FH%se?fST2qdvr~pjC3M6Knryq9%7PQcP8Y)MIM=;=`%I zH!42epG@mJNYDHLJP?z8YKlCnRh=Q!zfTO&E@+FobjZI z#e41cq4N5l5qJ&{tnY#S+lqQ^n=OWY-TC(BV-V7<57INOE!GQ?dI~`f(Tq%fFo8u(%XoJm zP=pZ<2rqj(L@y{sa1em7g|e3y@ez!P>C^@u;f|4-oYzeHzPi3}E1n95Mapc5@Sb2@ zoyxQN`{AuFl`ON*mUfxjY5_NPw>!i-FPR9&->qNg+g{!yYkHJX+!FM){3FcWwNZur znNpAn&$3FLB~hh=bK1K!rCxols7OF+yjMLunZYFOUC<58;6AYGgYL7A!!?0EA!e}l zEiJYGDS8i9&(a`?+pB12`W3-I)Owe+Jnu5fS1Z*^Ge6C-6WX29D#hmW^9y2c2!uPB z&ZOf3%LtxEUU<1T@=tG-%uhpsjMunx-a~Kt*bDlB5V24VnN+8^(u%1T_*hJo0tn<8 za!QZVcoe0+`4zw#ze9EI$c2~e#oxrI?V9?QBTH5{^dbowOA50KTmzkB-MQ_#^1tSv zEa$tP*Ev&W!=;2S=$*c|mZTDs`x8Qw;a_nmDl%i>?UXt&qcePy-;7WD-SS;S* zueI_Nu@?AaJ?3!Ft~;}lY^e5h`;yEjt6e;2XMO<9d7c1FmZ@Wvvd@v=e(nq{nQm4S zU7Gpm)+OEqa5LtZp~bDdv^|XAD)>Z}OOwHdX)_NMqyizJuZP@iSFk{N56Cu#cD66r zpp5OP%M7(7Dkh4V3QFWEhURQ6_w^Ua78bQ6E}W&$oV!C#xy(l{J^zpb5(2-$r+D(( zhgpfKSLgtLDiGy;n^Y4lmt*)kneNe4Zx@hClwT3sAkp+pJH1*Kq5<)#{MnpDPjgz% zoob@Cq}ay5Ky$mab2S-)UQBrAJEULI^9Ye=Za{|cr_#An2xo>xzYONQDTotp(G8^- zH@N2MY&qGV(3RP#QOzbq0QPUG5x-5K0qntYQen%$a3PRN$ucD~{AE8dvVj?+r7RyBUdaTm&$XpUxEhD&e_$kfbpH?M~`zbn8 zJ8c7W#{Q^`JO=fr(?P3kalXOGW%mH%H7?0ytam0L+duG}e=Wndp1{I1H(Z!$Kf9_#2-`0rB=sN?$aU9ptRr{?WyQk2c%Q@3|g=@g&>A} zwo?xEE?=g9mIH$#4aOOmaUi1sb>PT6c(Dv1+haz&rqO4*tu`|Ou@!v%YP3G9InMTY zvffIrb_I&s#Dksy9)15|$Hzs#UgrAAz_J=XSrXfm(#%7=Ny4JfDAVVED(z+wi>v#Q z6Iu>f^yR3AAD8?m?o96>2A!Rjdk{y+`i)d-(kNPPOe6F829ST$e`uh1l{6|S@!rP( zq8T$}N-qUD?1Wp3&_6MrZ^d+R)VVm87dgkxpF1}Q`G+_h(`I>xcSGPv%-!G31w-Fn zvH92qB*&(Bpvj#R2YFO-mRg7lt?bOZDHz7(Y?ZVBHdl zNqx1duV#ONe=kyzPG8I^T6<7RQjn_-X@MEn?Vsomx3n5J*v+)k2$chc`bc@Xzv{kr=guG%`KR~ zWR2M)ULw*&tMhBvP{$HxE#Wyp67dSCq(@g1B%b9K+^XXX2x2S^ZD3~FA52CnR-BKR;Ncc`PRKgm` z^(_bokLQ(dor%yLzG*pgt?3m8F_q8w)XNKjqc-w%M}&^S0fRX$V(W@w7@Zpagnv+H zFYoT>GU1MEp>HSIo@7!KH(qLi?x2c`*WwE$wc_#)v?|Mt^G`A{~8(24^Xk-@D$4<#^x~n_93a z{#a@j%TX@BER6QuC<*lz6fo>z;~gp0R2n_t_*J@&{$an7z7%TPAR}D`n4X@SE`q~1 zk)E2HzS+Q#bdS>26=y-X(-7+`BoLKl9p>e)Ucxa~j&ikM_SrFM+3|EK%yFPO)6j#E|%m#}5^luVU$P%bFfS%k^8f+;Ii_9K=pN4+2Z@{fZDP`=jBz6YDH5 zsGP_*G}(8Bl)U}Hz9Eh!`2G=w#HigYd9h?qdcysXjtY?!!)SI&;_V5#Bj5-Ad<)B_UlEq!YDTedPe9T1Go2o z_@+E?0*O@G6LlF0m#*orKPL9H0cK zQ344Ujl5B)QB$)(+Dyy2fnC?#U&#aV%H(Glo`E--v=YVa9d2W3SifxNDK1i#CTg7_ zE*R(MHt3OYuGpN>Xq#sQFYpX|X;W~2LGMQOCcst$HO_{zN`gMqY0&u(b|pK^xba!B zUvJ5@;nw`Y0J@l2tx9MgOSsYT_0E7eugxjrfMr0MDo8`AFFvSmVUcM>t8ko|>070Q zZ1(UNtZ(y1jBg_+k{S#&oHetpNY7oL)!#~Rn(?=?*eG3Bya>v$sfpEQ97&R|VJGIJ z<5?YWj@e_sD1S$`|4#OL`$;Tud>3&KS-$)DMpcr76qpDZF$STtJOu`oB41hld91nl z2(IkI8$&uUDq7Sy&R`HdT>0`-9Q!0{*TgAbw%Npq?1UA|Jf9toted>?BilN=z91!W z%h4t5IQziCl}`IPTD0;Vv7}&o117sBzRA&5HuMR$upko|do%wi7rU=+9S4;o2|0 zP1x7>+JnV@W`@B@eGT7nf>bg@^m?+WPi4E&`^)mR^<;{#Iv+cOa7oRWccVhTH9{yK z+19y?o|)7e3f2rZY2lcZ926%peI3K6T}?fRF9q^PtrC9#7cFWd))Rhz)4X~UIDmdW zA$@ZS05+7(bbz_cJjh|zzS~$vkXx|;CbHIeA48SfmLb8r2 zPIZ&r$BQ2!ppYdz>GRyK*&<36#;uSGnman(amRtC^co!jFRs>fA&p_(XYjXjf^=F)csIDyuBA$iYfJLh=iN&<@_Kw)@NM z(7N6ZRc+3lYE4epppv@49< zJG}oakM<`S9PSsA&!zTx76P5Na8m`qY&``{lw4Kfg6iFm*NhiAMJOkAl z@lg54-UsQbgFNWa6Vqz4EokwgAy_n8Sz2c6l4-RSQh+q562mWdo_d|KCxlD}{p+4X z_k(CvGicQ_aYLVnSgK}ft7cAjQLbgUo{}CKA2Pjkr9O*&KNh}L(rM?_pTNGvOZ@f! zHof{UWIt|6TMkT`v5^P$mO#UR*9xE${so~OOQ0kFu|KR)Iu7nd-(%<;7=qE#m0*H%Z_68tknjs*yDRArMs0*I> zF{sTKU{<$~f1?V(`CN8a*U}=_Rbk((VQXuvi$?l(fB46v5rHhT?B(sP$M6TwmM@3n z=0vCWJtIpt?-e#g)^VCqzm}}3H2U!!fx3?sR!#(PjwxU=QK#o-6t1?)E&|^+j^AN?-MteT zPh;*tMTXxHSm-7t52w$8*6@XMUjyZom4{VmD8&;YnWbqy=Eu)ypW7pPWpXd5x0tGF zZyk+y<*h88%`HFJ__;$m_8J<3bo1FpnY8xok@vol&T*vT$4AD`2=PXqMGs3~ zmhkF)03-P2u>`3~Fx_d^B9NNZhO?K#lO}xxMt%=@MW$-8-k?SaW`N6Jg@?sD8k5fD z*=8tnTn-5sf1LY*724;tx-O^BSNov5oRlIMFl z+6Zxb#Wx%XXSOaQUvCwj3t=3QcCtc7Z}6$FU4KKyaxvyqmOjWhYmfN*gULJ{tU?+TQJSJECUxcGI5X7$bSJ}FAyrrps&8}U z^@qrjR!m;_BO3QoFpUiRI4U+e?%0H+AJYuPwuBSqE5?Q`e6jDv$9k^ACCeX}Mc1Ex zCC$R+o9vHlc5|Vz%+fO#MX@(U1BO{5mUHA2TVV%FryrnrSuf0TXiT{F^ILJ|BUoA8 z+BBqpH&cZ@Ra}N3Ku|nkoij8%WvHmUnfdck*;)q7j55#TQ|Tuup1C6q&CI@I(h4wE z^Ar%yY}E|}m1W@;TJ@1<7&*sf%uyS{Zn15&%zGE8^`N(6#=^)g&4?)V2cncEW$I{7+2+;;y$s-%2%Lfuc={EUrPKjo z#Xs`jh9&i%3WmCEM6M$hVSXqEKI!PZ=x%F3J8$5K?@pJT z@ZF-$Sk-p|L+UCn!){UF0E;!fW^d`yC*w-wBx9HMQnVJ2&{)4xBZCLJVAn1CU#|RA z^a_rRbtvkZ*mNP<=*0!JH5{=-6*;p8yc90jQp~Vr@+^$=MP`wS1K?1+MnbZugW@-1 z7T+r&b1-fM#x^gK%dW|Z;G9J>yQAxmEzGs7T1yX~?O;$b5FB!18AgC*qJxxa#)aqQ5Wmz^zFufm+8Q!-?8r9N$O z#8`^!FZCjjklzjA*&$k#e(Pn8WOQ#r-sIScyP}czr2Vz@fOrb^3W1P(W5uuu={5h` z0Z#F0`VYLT571nCK^@={)s@MEGrz<=&$FbS;$3O4O8;%*cTZjF9a(>n6|D@Z@%8k{ z)6)q)NjYtEvt2c&%oLNogH_q}Y496{uU+q!!UNznmX%ZP>ndsCqNeWUmI9owhL75n zkl6Or6`kX5wJ&{WyE@MM-20ui>pOnuIXZL7!YD7U0^1OZT5+Co+o9VJ4Ro+ zkz^jHrtut#Ag@fp&56ZQ-yX|UZX?Ues4CEznxBoBtX9BYMWP0IFWGiS_@Ii;jt|>Iz|?iFiRa<@ z2=O$JC3XG_ntesH2z&=5G{rh`6?zSWfCdA;iGSg9TP}O7u>ugW(H*|uI9OJ}VY~VwE0mAb1Z^N-V zx#*;S9nV?yQw7Dq{w#mfJcp)0!e*O_=d-arIc5%Tk|SW&>FeUphd zv!_*7`AN**inkefyNP$;od`3&#-`hrayY(W`s$jR8@2PCZJd%GML8x%_XULr;BJJu z-K7bE@ z8u*Y27voNZvE9L`tgl<`uWoL%LOKK~;IFHu?H%7O*>v4&G7tQ)iI3n9h;+_gQn-Yy zpZu=@Xr%5-;2y&t8u%j9g+JyU+{4_tlYW`8l=Ny0nz+w@;-hteM&_gOxSyrYfewyjsyFb-P<$c;Vq_ur ziN}NZl!=GNpt0w-IhtBMOc~?u? zFKn#x*LiDr&aavHI?tK$S<3Ew1AmW@-czg2z&Ghw^|bX&pO;9&z_&Z>fmU!?ayaoV zNMdREu8Hrlq?O*PDrR4QGV#wyCal>==H7ar1qNYpFRafVaUQl5j^bZT{1E?Y=>_fX zwA|>P{SM|iYf2xR_&5B7DBZ$;JJQ&X8X4|n>@Q_L_74+3MY2ufnn>x<;5gjf3lp4; zR{YGwf8&3w`IUy{WiIP(y^xqp%%7Y11%64?T|<&UN8B<<{t(wZX5w-FkiZ`nHTu^R z>D6df+-3?8NL#6=5I!Gdeyk|qN!}`?DU@)KdRgb&5IG{pBdO8y9tn|ucDa75Fia6E z;%FC|!tJMD9S5-bT0HcmAY{DgEBYD2V~YM_0K$+cqY(}J8XMW5 zaCa5aTpCB@G{_W##SpSqR{MQ5Rb~Flb@WZIb^%#Qv}K-%o{hfM?4ih=&21+;#V|44 z5F<>e6eEekBSu(L->7Ys(hig0TIzM0INcEGrpORvjQ2eSbYho(TDv^G3+1#6vqYb@ zY*XZjGg!H8XsFp#ti@49kKzWQtv#hC+lfMF`D%RCMAXGP?LdqcV+=9Y6ysP+J(Vuh z4G2CY#M5eKH~M^hbS4l_6M4*5m-mj1ap#Gqm?ZLvDy?%z!q8$g%*$RAQ^@QSQ`rf! zqJVgmKB;8NZxPdfEwR3oXEW0j1*{&D!bi%UpGc!B1%xOx#cVN$BTT%$2vy(CY0l`@ zamE{4#7uM^!ou{TZrk>jpQeBmsl@ul0#lTTg_f^J$G)0$@OwpX0%drYINKD9MJdT5 zEe=9}a-#~z$RIjPwFkr!6LyNFI*8YE6uJo}ZWrg6qFgM04+S>upe8#`dKcI{Wk|8- zaq%m~xu!TzoUaYsP;@<)Szgb>rb~I(R++-fj%E%$gcBf|3{lAeks_vSpD9+0YEr|S zLM>{&4Q2IO7R^uZ)@nkpcy@KRdvcijRZjwBTn3J zitmem9h}kW<#_7$^c7uAu*Y@Z453KjNoHhab7Ld3tpY;LUgrnJLx$LCiWc!O!qjgx z8hd=H8^W~oD8rrtt=Y|i=0+l0u|fQR=o6CTAQ7))5&uI|{75{`#-OjR%J#61>0Q3D z4l2DSo-pC}Vz=h21qH0AZx(w@u~!6%BCM!?dBNNni&u^xJt>dnL;)*2t)|#74zS?% z1wtAR>q87uJSl!+h^I_(NIZQC?}UArG&+S;v8bk*lyQsq6ltx#(r0DU^}P3F9{5>P zJSUzfO*$M1Dx%#9r}|9n9%ATlpVV`*ArAM}cRG8%Zg zY7$jMcXmEH#rxvVd>sC2ijTy{B-j_tC@w53D_mK&aHXAZJ+oI~>Vg`dS938dLx@Zn zZw=AyC*tph_y=)zcEwHqrT`h^f12W7jIp~j#`-K9B4~*JbjZ}^8w1`-qF@Ps(AE|& zUKL-M&?LTOQ@E(B99wZLs-Lh(Qz|cNoH!xc3<;)0DSGO$WMz?q8Z(L(bGl`Z`%HF9 zB^`#0F{L46iHLjL(-MKRe5<|9HKF+HshH5IeY4VO%6Ms7X=t{um6un?{fK+MAQMfQ zBwfVrG}kDrx4uSo<+ZQp4q7G^dR)_AkhQVukm)kR zkeQ~;VvB#?w+EUyoxf?e&c9BSIXpAYvq)dg?m_XO9Bs-max6O&ER~`#J&MNEF+u(m znuQa}D41VZwz9OaWEQpKV>H*4MRFeNYNSeOKQ^f`hAbv(J#{XGAxln?V`1G+ z;jLXt>tEkE&M6n*GyLay{&R%0X5Vw-QCVinB}_wc{wB*%tl~6(nvdh8-*-)(ziwDWTO_PfRR5y>nIvXLEGL*5&z8?}3!eETi6`rHGZQ5OAYYR>(?2 zR?*RvzNpFc7KkEtmu9C&jSGic)8RW$R+}P2uF;OllU%gX0oh69J!=;$*V5cJ#Y*C= zxS6-C&cv5xJ!2hzHOIc4(Q?NNO#DL9wyfw4gYL~fFmIIeWx&MO;Xko*J*nzNRfgP1 zytLESTWdvKW94R&NsH>640#bkpH9u#*P$C-LMME2y~Vv!z$q^?MVkDMj$w6^D%7<% zUS46!E$oVSRQW2JtDW*fd6g-zme*MN@T~e~okz%y)mi+1@mf<}C$G2s1G8)Dy#edn zY^U5HZ{(?-@02&oTMT(C6W(o6HCD?lV`~=aU0z#?xF4g%5^HGk4tb{`?=t1xe1#_E zl+JentY7THpb<9JxGtW5+iz;5f>-7%XSN!!r@GS?q*OWoIk0T{j zRiPNJH+pWU6?^`g<7O<6m;2#!Lz11H)>UdSea4b_+%JD(%BMJB9!o+o;PuxvIq@#} zv?-sF&xU;KA*3^Uh&20GOXc&l>5$Aa@~|n7Ff=;`Z?%e(FUpq;`7=}gT>c_z)>bKR ze&OnW)z+P}zLq&Mvv5Yi!jhG<=uuX*bVgZW^qW-?aEP_OAz$X>_NyMG_e6GN0sm`+ zaS>M!^wZuUTd&ud2D9jIK*zAF^d>Pof7O(~mA|w2(lYB#aP)hl)^T^jcKNy~kILWk zO)_F=H%G&J4qwUOL`O@jj(S;OS-sK{HcK3>WlNIr|5C(L0DayX>%kADVmX5Yuyy7Vy=$HV@$eVYujF5NZ9mkC#i{aYPSVh5 z${)#(4f!`yej@*Fha^wQTrGB4U%h}#?`mHoqrm&f0xT3q9$}{)cOTj|<)@~YE&qvs zFeJVEpk4|j$WIOVZ-fawiP-SEAwt6-O~>7(MNOJmjTL)K&^Piq zNEe#E_K3{>c7lEcuS#c_$5z<)_DQC93;I--{3BOwIjvGC0&O{PMn}!2>l6c~1@K#! zx1;@ZLWig`&8I@gf_omwHB_IdhEce+q55_2x#~C#+FnaA+rETQ#FJ)M!B^pbi2Ry5 z-aaW^$CT8|8!NQ*b^2C{?j21~M_yoII^%1GoTkEklRBY8ikb!4P$N5Npq623@EtzG z4iX{^>%7Y+F#^Iftj zJ!HDk7-f82`vwt@U?X>)eXpZ`)*m2s$BxRIk?8^m^S-4#fQ%JIL{ByKb=5WoV#PeI z#hr9xsM~#xs|a2ALFj+#n>s{zK5lYa&-7nT1*_Ay{Z(_bzpA6Dq|xGwAE8@Loy@3c z)DYfWL(M=)KIsYt4c^3eYG{Zi`)*C#YIg9J>gywuI(O*tc$Vzw5XPT>5{*g{DkCz0 z_|j!l$XywYVRlFz;&k4|M(c3d8gsM@At52Ts(XU#d|#rQkoqZ{pe*b(Uy%)bTR*2) zhneWMW+VS$3a;547PK7`%&D0XsBI|LnX(4oBbmXg;jHs*2)lnJHQ+7x1@yNh-$vS7 zV&d&-DLltR1pjIV!AYx6zlA1S z%u?X{H*35cs~!?1qR;no?8#^MCNGY!4uo^FIKJPGlBi%ps~{SGOYlYJ7j^tCp;E2# z#rndRksSd`n8ot?)M^#jsSmX+oYp<9OzD<8F@W-}G=OhuZo@hYgieBv+vN08Xq5dgG!{cO7>cx% z+9_rE`Q0tql(I5^YCi2-5E}%D*lw*p60tR5r8>T@xprlPl_@}c+h0)?UB!%W?9=(P zJ1=F|F&2<|Zda7m>t;pTb(`9;l0$|Z5MR%o3~wmXQ}8VWa>;P&Z2}5gKz_zDnqMcB zYQiEgyk^mChlt^*pIH%+OhU_F5e~T1_^$9OEewUhhevFGX4esE-UDxSbtBd32-&&4 zoPIP05V6~Q9+veSe6JuI>Vc>iusWk|s0kz!^zR=M?Uh@<%xHb#+obXKa$34(q7|+# zv{e!Q?TYF;IzH@e_Ju1GYP_`-Ro;;-)kjW3_}>4IDSi>ko<7gcFflY4YIlchnDCcQ zQ=6zW`MyDaX6MpQ0MFDvFYryWT$hIYD80^UV};X8n|DU<9IfmF&|&2=?mRG>amM7s z$yA{qtcxxL5SE`>o_}+zx5N79Ax!-ydCg1NuXj=qQD2ePfktn&Hklp%D!p3$J0lm4 z#j?6c#)odzuX8Iq6w7TI>jSzC&Z6zx#J|9Svk88GgFjG7ODz07_;J#R7$`wJv$Lc= zIjG)6>HsffG`fixXG-QtD^EP=%$^;k&I#=7$n|TgDlHvd3#;-dZ_w zEW+G>UjNS1DH%d1;A2jz8O;u_UPicj%2#kbNv$cBHTKUlJ4^L1CeGHT|A4L?_h<0V zkWeh~H3b&+Zoa$rsH$#15 zs=up$kUrCXDE)Qo>(}{mi}j*W5ASL(Pmi^KqT0x}pGPJ)*qy8aEHT+Mvber}U30_a zE)M)DI%=EYYkjna?7nZt$zRz%Dy5@7*@eq#RsQ9KSoN8y-cWD4)PLC5-%Hvi7@s@U z7wStxePxO?bqrzTNrPI8U|lnv9a_!1|M#nDH;+`Dy7-CP&MOnEP9TgaUFUCTpx#4& z=`&g3RYU8VYifqtj=D33YGXeivvH{Q!RHS}7pzS(@GF-?=y=&lnc0&wRusfK6e;(! zy>vXPh6d^hT)=`90^A8=a#D=Lpe=I5n(B3RG|6x{`7Pd5zf!Nzw*-DmG}R&XG`+d_ zE!k9iRghYy@>`mzeysM;w?6#V*Hk}$R6lY#Je{MXC#!U^jsXbnC3WlS>NnI4wM6ew z(rpMWf;Nbu4K~#~>P>nZ%5TF=^#}E?OT9}KBe`Ofsoqj=yVTnxx{K=Se2oP)-litD zE|e8saaeimjx2GDPT@N92eY4q_mqdPJFqgXG44;O?99 z&1~HmhCwVO0?Nf%be}sq1$iMu;i_JO|o*IYB-3E-2*sFZ1cwU)=_3E=-rge=)c5V^#730-2$B##58J= z+y@DnF4s>WWiO?A-wZ{LwGB|H8$S4 z)P`F*GWS5vV__6xbY-0eZCVX%(5O%xuscs9unagRa{x`R^P)C^0|FXCAFEXuxfs2L zG_VrzQWuB}=#0q5E)kJRbMk&2ByJ36~@>?Kw zL3R+PKS6!tAQ{qV#!^Fn9t;Nky_^>P3i@&-eY=LfUIlKr8a!~V9&so^b%Rn46{F|h zKRo~bicDvkKrEFF5M>5TqnYp>)NWBK=mAPM5=u7#|5kM}+)iI_B@}KWlCx`|zq?wHOLbAOi4I@>5u?CL_4*Uuxz2- zdYJgxBQSO+OWW~#E zLWN3IY2eWNnhG(;A=Q8@4dou?NE$fZP;b%mo{Cqh-#;%On4Zo(jdSYZN z{LbTet_9-r4SITvLj$)$L&R|Tj>z$d;tzTp)_^gdnDBrx<@rWvz!-bL7#=Xzu8g$@ zjMW1gdcZh;dV1mxJwfX-o;YbGO|+6YX{FwWSKw88z6wY6)7qoObbbJWw2J#+B(y>X z>?huQfO;QGn~3jIeXib2{(TL3p!#fGg<|mKesyRRafE>^7 zoMQox!5Ib~CAM`v{D-&!V}2R6<32+z8v9pq)_(Xe!d5U^;mcjbRNHo=Y{eMHOhsV! z7QuU)PUSnqFW-$2Vnc1rVxgbPgmY+>vTQzoqia;Q%|kUdZUa_Z`i{yWtQv8Y&3(?H zS#qoG1C7mjiWaY*Ta7&etL=l}R?$wv5g3yk3s1(97aw<7mact=ONRgY4%}dIoXCW8uvjOA`cmpOF3llHf0Y zB)vZ*CiM|ahL4HVJ|SZMJCwmcNG16vG{R@F8U7t6^qI6xO|;1d^;)8d)j@rys55Nx z-X7lS?cuH79^UHh_EtOKZcY4(V2@C_YP8MLl0cjQKU$Rh1+TgqbLv%2i?+(+zuqd3 zk67ij&a0f(yH%zW2w%~>j?sD@rc%H#Y}aZ)5KmhWRvEJQVR}gp6`phkF{@osOJr>a$#%dbNJm$MS}-<@_*h#l z=uhWtyqci(eP>85z%eS%-t}@@h+W4!loiC>1=)weogKt+B{{7)X+KUu2;$6tU78Az zRG6pol+1Iu9d5M)mgTq|V=YlL+Y_@NixGJ9_v2#b8RNLL4B=@UpC6m$i4Ee4Ag!8#mF z`#S_K!(ng*efuts)C)3~b~goo64aS$B2Bpw5_Kt#41-~6lFH|QoC)Tt$@2Sp$FB=7 z+;wV-nyS^s%hfb$C&DaCw^wIDjNav;5OWNM7&!g}BpPZu;&JG2-~t0n^S%J_Ic+oY zPkz{p^*Ft=!a3hw$6`4(tK(V@ZePoUfxMVx7q6PCm*m~7r?wFXM*psVfzu9RZF%OP ztbJJDzD!y>!VHK-Dq$83#cUXbIgm@`2{;<^aSTkuakOOP!%|}?B&nJ99CmP{|!L)}tO`os!Fn8kI|rDh=XQPvg~cY$?@W>yGg_N^LDCmbIK%(sBf?$wpuc z`$Cd}7lzqPKAkq8wQ!Ikoq&EK!L={|*TLzuwb@t)Z;jDJDc;N940Mb78t=fDSsyH+C{GX#|BAMaX7H7$=7&bTSY4S8Q!i3ke^_!^mRZ zd`l-Q5igBkIz||OkfG+QVm&z{Y(^Wl89hvVUoEgsL&BX@+n>hW$d>(xOtxXSLh?bp ztDL#eKHSRMKU@FwR+5>+suQbBLA)nlW$nl9%w1A<BQH<7Kw!tfWqV^)}$5!G|v7T6)NA2g5=1~WKnIY}RpHLaz%y)W-etc07?3k9e-C6EJ zlGA3g3!Zf3CwNThNs#oS4-OBIk?D>P;#c{JR*NK0qVy!Sw;1A%_ap`JgvaTQA4^}8 zjzB3@CAb}}LgXiUoajk($G3`@t>DhgBye!u!w=%qeJ7H)_t% z0*gFJnKCHG(?}0Nn&tq6a;g1wEKN_(Oa;Z6)>K=?%2DH;BZtq^BbxZ^Vq zh**^_)2 z(mlzoqAWipr`@DZX%))|0n_brC%BV5sX?)SVv7s6B$8-(Zc7sV-LoZu{ys>EtRzHC zj~Q`R5VSoD1|uKnUNZadI_ zlW+v$V(i8aUT3*wNCM*@Uo@YtYWZk zt?bs)lj2TvCsB_ZsE0dt8@N63N5Dn1IBgp#Ci$r?Fu@(W6=L17ElhQA8tofFz8OI? zC0&*0CM4ZyZg=(paT^JhR8PWT7}F|$?hK0W5ium>yFG4CYPKisfVhu7_wl58`UJ%T z`F%Zc&uJH^r|&LLDh*4@S!(uv@dyKVdQx?X+AvM^qo=3eAi0d`L|FL-C1zo-RHU|E1@D#W8;3497?ZQMDu6F;_q5I~MVO6NXUz z`7n*@m-17;*Xedk_49nkYW=KpH1N|>QN(h%lVENkF?uCwa96`fyoN;QcVQu359i?x zunKR4wRjWUh&RJFyagV_Tj5c>4ff*ga1if+!z7qq#I5jq+y?L9_uwPE2fo1Va02f| z1MkOV{66->9XJ3V#8LPVX5&tOoPdwuM0^Y<;}3BL{s`ydE+XV7@I2g&tBAn;xDT6% z#y8`Byb2HC4M-#5lXwr&^~3lS{urO7+UM{PK94Wq3-}ry#`p0EeuyvPKd9#4_%mVR zFGLc)A_m~AVmSUzoQ|)F9DH4j#iL>}{$9+$H^gjwQ)n88Euc3A~3Pav0V&wr5Cx0!R z^0y*hz9UTep-7Y;3zz(VOeD)=!mZ*(AC)BfDYxjahKk`TU5rp?ijiuH7^P;4bhSuK zRp*Fls#=_-YQ%KaC<@diVvV{=_|+X^t=cBmsryBp+9j@2&xq^Q5pkpXlekI!Rotw; z5cjGR;yy==xZmLv4>w&3Q%43pv&8|&7;(@sK|JZ0CJs4&3dOUIQt_N)DScl- z&-2Cej+NpCN2NIISWR{7=vhb4X7M6xB4V(%u;-}~l>sjPhXB<=wTKj-2jLcVHt8Sn z@F-lX7E{TDy>OW-rBVVMgw0yHN`&7NS52i-65I$aq~({<(Y^x)t0km_B@(UmRZFRq zgfBs%T1F~bqIe8{rrM=XNjcLcqNeL;Vrd7oeM6U zj|cR)@p1)?ah^IKQpl!EP%Bj$q{@Ymsa7d3B+Hq$L&qg2!9s0yCdq85(3WU|%!QSz zg0Yt#XjYYquRIy8s{RCjZpCVSn))j#@oQi(xE(QY zn)0i)kmhj0aJ5d=P+dQ2QLE~p56+dxb>PV<6U0PSuNnyFJMnRK0h~jleT?O*k$NP^ z&+u&3q;WZhMJm9Us&pKrn$>#3;2ijy+CZgbbrl>^8>w%K`T~kAtYD-gU(JVX(h7FUL5L4Q*$ z>{NCLJAz`cqAvEpnJdT;YGXTs4I;eP5F0?~;$6poA=iNG3@Dq9ZKOlTg&SD4XuxXA zk_2djMf`78pW?fL2Mu@=kqxcmFqJsr(bP8ZbPMrI5N(9G*>w{#+eR38HNi_e4vP)( z8U61#OfYag{jUv1fvfv|Ru9^u^#CVenjuE>2Q^~Q(1bRa$nNy$y{*B*T>%o?hz@$x z6*_c(q$bna*bUIzQF+}RJ?qv!VtBZyOZz1_jsszMwEk-cnSe?`-E@?V_=|iK9O>QGPbe?*20Nb10MkgVH zEE(~I^q*~}e;0=HFU;G9;H9(@Y?`KL?h%iF4j6kF`fDwEf%Pi0Z3`iLSLOgD?fcAj zr*$7TU&SvVPW+O%-^(yq{0fGOUx!0$bnfta;*o46riX3Fbjxk8&0PsN6o&Ed2ieG! z5^G>&lG!p0>E8oe#bcd}UGX}&#L@6b)FBK%SzT*;^pe$eIxH}Zf1%nMz_^%jCd*WR zJf1m-EQtYQE$6(;nsT;k6}z%`kq(xSy&E>|5kKAui4mX3bR(0+;c=Ab$2{wCkhS7* z(30$H6$gXjnWx1IWa*LhaU?%>xA>VSHYk4iw0Jo`Znt>Fet9+Dxm*0s6Q^H}2E`j> zebUR@`6l}Wwf*8T_hEW=P`tCu<9tScytfrx9_Q2Iy`cD0UIJNAT=~9T`F>FRg)84C z<3XeQVNm>ywDkN${r0JT`z$|6TM-0$2l%tyuJL)vo+Nkj_`DQ%N~-wp{V<)3o&+)w z+{p_)PHwPYd@e}a|BAF&Qc06{i{n8lgEB5Jr3FkfWmAJPAuol2xKoz6Q^*p3Re34Y zk>1GcXlc7c59m(VK}vt3+jWLDAdO{x{-6a;&rg$iZu&pFjr)weKGddiN_mz45 z-2Fly`{|GU_@k$VvM<5Q^mDH$7Xc#W zfLPB@D8>iGosw2h+{#awfjdPDwQCV~@Kf9=9^*CBi)CHzM!I7Vu&lrb1D4Rp&`93|s0Q#x^?G;xMZ zBxNKS7my0PNT%UZDe+u?*%w#KeppK?aWj=KlmqY*dR|L)w@}?yD&I$SJLEuYkwb8= z9EJzwaC||Iz@u^`{(;Kx%hT{vc{-`n>7+Vmh!~kE`pYaaOr9Z5ler>8juE-?G%-<* z7xQHvS>k7kQaMSK%PFE#P8I9ud4W7j1n7Agy{374>$BAD>JAcl=ZlG?`rZk#wC`E!E_FB2 z<3=%9ZB^TdAzvdB)%Ua#ev>fNJ!%3e;VKX0qQvG1)tH#r!xY_;Y>n`u%RQ^pDG;|R%s!u zJUxM}QHn%=D~-`g>S0$N#yF`hDIn6lhyaoqlq%C~S9QKTSInO&&a9Ikk- z1)TYgoaa1_L)p7%f@9!ZSV?29r0K2Qy)fU{w-y-&OBh~`9Eg~npqtkId} z3!V+Vcrr61b+sVgQ(n9m8?$L4VoS20%Q=*_OQ$TIK}!Mj-+2ABmSH%@qh&QX`1>|waCOtTey`t7rI8>rH{V28P zDAZm#ZIH{g10K&BH1-H*EZxsD2*SgIIP9(3~gW6c+4+ zSXUA|{zCEZ7><8Ogw3-(%H!bZx1}b^Ji~2h4P+RN>^8Zi4I^JwBA0}v~l=~$5EEjPkoxd|r7%|tO5 z!VGy4373oEe0d36ATNUr@;h+3yc}+jSHLzZ-!HF%A5s53@*2Iwi)kxn5F2jNNjRI~ zG%W%QqL-U>{9M5V*rZcx9E8(uwNuA`e0W(y)V0@2nbV~fm}FDea*H>Tg*R0*217k; zzyu8C+KeLBphmG3-Q`D;CZmXh4L#1^M&OY4d>qaTK>oMl!r?3{_tK>!1Z>7wF{5@y zqT^cf`Urw@g>iR9*d#Q+#OX+2hsoh~BA7{2?%=fx1jG5ylT3Tav?;f@0%9*~S5po2~LYY?Ytd z59iAF?MkikQ)NP?9Jo(rFKdAz?iiARRMjV3WfD1CWu27QtR5r$7r-shLR#VNuuVU= z!-M*1MVQyJQ6z7nQ+O+#z}x751l|q< ze1MqCgU~D=f{W!&xK=(4x5!7}cKIlg*bia5d>kH>yJ?hN@Q8c@b`hMQ+@m*uT{VrQ z8$H62Pq;c!z(5600`h%j`RI0~FFOZOb4mWC2T$K2=y(=slk8Gso?fgSf}l(6tV3PWE;U_Z z$D!0Kl?E{T(aYTWOQV$;Fz3G62f7H%;W;gj$1fjRbDI?7Ujk9J6=#F*A zxt;sq?fm$h@_h5z98Y{uF6MC5VTku61ZC+~NY<50BR?&)91Z!2oap? z7;YAqz}@0f*eNc9J>om?thgM0C9Z%s#g*_^aTWYcT&*|nM$+=`rgM3_+DE0Gkf&Nn z04G5M)aZDQpJ+PXDcN}*3-jSV?J|!eoAyraMt73Bb+rx= z#FIUCM7zwHKt9pVY0#x6+fDR|c4rG+(r)T-LXg$-DVtXmgK>2HE{;G z&i2yE`G#D8T=S-O10DrP_!1Ts+Ac#!M04$;C3-tGq@K3v?caoXU(!{EWNK1dkZlnf zCTCl8Cg+o|kWEa2sj}HhC6gP7_ULt!{dyshAH7~2ewPjE0~mkOw%rp$`u3HRVmVij zo=#7UgP*3yp!)AlO!OFvpQOhGr@H-Vd9xLOt@k9;vEFLMS1WAVO!cJZ zgh?}Px4g&78gqNx_UZ9(NzZDB9S4;U5?A!3c+!Hh#go!6wx6?~**CE-5$O-IJSn^7 zk4S1PYdP`p6JdXXY=nWdY_p)hD1@P6HWB34BJ|<0GdS!5#&O+ zQY?ZS#My9%SPb`wGWda50*{NOuum+5C&fANyeNlP#B%sltbotS6#hz_heDi>$zmlA z5EVFBSo(I5w60HSJI_( zdY%Yy8oZ@mAU+pE0_>OS2$c+IW-?YkB{IGk?v-n)u7xC5?I zKci9-+yj@YpA!Zy_yJs?;?ysQS@lQM2ZR#`hv--g=n@k&Mx=HTPU@G0lhyNONYbqBJ)B{)A~ts|7{3d{c#WBgZdGUt=&=yfMkJy2XtIWAsnv8l zNAG_)3^n9_TK8ixj&|ltFs%$mVnVO0qqfk#&33&{%hV^fILltv(OLGY9$k?AG`_K0 z{xm3mc~HJmo*k6G$qwQNt@5>f@{OQ;ds$1{FWM!y6&)BrXLKNp6oVjN42G#qBskdzylWiEuoQt1%K)xTDiXRDRX#}9;FrasOh0M|}k@d)$ZJ($2+^?~{jIEy(^{gnvoQ}s{vZ}nedA;Pg;jl|_;gT6HC51~VR!M#8a69^G2>tE%fi!{zdx&GWT^ivy&2c)g znHxtM`#MMZbPv|*Ndi8G58xxDp&vkm)sBpqIGOIqbY!bIIUOI6Q^|sP+>ztRB|Z8B ztG#2iW2|F5c>WJiO9KQ7000OG00)5gQlg->;dl=K04XVx@3TgisWAg3e^1Q;WX zLE>6jl0g!}NC7-rjif=lJ7RZMAQ@kE+@wx_t=lGT$w}O_G)Ljh(r0L!C zzV9o&ucU6A@4cBFjaJ95_!)lEym{|^|L^|Z_eNj)&g)+U@E|=ML=k)n{3-${CX}Do z#O(<)h;mll{6|9^iO}B0ZQEp4Ke@ew_tRa->Nz1T| zTnOIE5cd#@`dh{Jbt|sR@3t?I7Wy894+)T6JW|9yIh4XNg zmdg?_-w?tI>QvNYe=Cc;1X_ZhSwAj49u+u^Dk1_zOrI7L+g0qyPV@z_6T1}bR`DSA z5FVJ%?+MKsv6=L8P?@PFHoC^awKWutM#Jp|k+84!5{@n@tdav(q+OewXf+dKW+pk< zqYXQuRl)JUPsPI!kyhrv*jU_zMt1{%w-f%Z5kp7PKSU&%;+L6DVR_(i6;pa zbGLAAk7(&m{gNeXYM-EZO2yN7hTV{q)2l-BBtZ$D;|(WIMh^vX0?(^>FJ9pAjhRVH zGm_~?fAxtR4Z5wAksM|X#QyiGct5@`8}8P@R7#r=O3bsrKdRsZgcUQQ3#I`sk$8vy z1@R(&P?VCF_zVoSwS{|2@WX5xv8lsMTY}pMReT6P%9=8_b~8D=fMjhY_;Et1plsK* zv{ix+^Pzm43!ss<_?TwE?v@gKG-tBCyG01`e{mI`5Y8;tFJ!cMTEQnd_4Ax;hMCa2 z*$LXPUW%*u2^F8hPqOeSeVEZxY?6E#(By`tB;sbUJZ2WYbI@(3AX01;@1@X zx{BYxZ?b&~q!u0CME+j6OHZ4bR7~e$#;W}`zMJ^u7Y`Ub!8XrxkDB&qqYV z?0faTeES>o#k}_p9q#2esMQ?Q#r>TrIx~p@J=G&JlKZW8Gp5CRwUi;=f1OFcHDYjR zv=!2a7xWQ=MK0wklhTFrSly-E6@~PcB&#c2ol|rrOxLZ0H@0otwr$(Co!zl*+qR7z zvxAOpyE{5Lm*0O~w>4^xwPwxv&QsBe@F4ozs)M;4tuVE&RH z-`iYsWh`z|K{TMU%c$_E;V5%6X&ZR|D;6+pHk4@<{}0f~#lE!Ta4f&-2%n(sKXS%m zF-C{@{MrG#k=)rLTzTZMU4q8Lr}c2fVlYFYjp%o?I5y2~w9Xw)YDU9WUa@RR%bHx4 zur4i1<}&^)b-i`UvOm!iGU*+XU1q^1Ojv1y0wveY)u?UT4t||<;Gp*=xAg(V4M!@- z?ec)Jl?tGKQr`Jm+^$1zfySao+T~L79mZel@%Zaev;FKxjGktK9%+Y08WnJ^f}-b7 zq7XUOZ=ESdTZw>FvHtLYC-zH<6cINUiN^;~_r2BFM&le+3gnOBx(Ky=Kxj?QGQ|;> z$6VJuYT31?*`=y3!K$seT+hLqnCfy|OzIwEe>FgE9ujYRIdE1* zV2N?X6xKl+?K`(KXscXcQr z2hbqK^6hBc$v`h1xqIm>gzJMo^!+%6i-)~C#Mhh{UIvmYytSM-A~;(dX`tZIK%y-a z7N@puDujClY`0gbpVy^BR3Q9VmFr*5TUH1knEr38KRfkQy$bP1O zba2PqSIC_R+hQWQyt=M8Pg9o_=`xg=rlvlwCr^_S)OB25f)&h|^415_g#g@-htpT2 z#gj1ck%pEp3WO~acsYk}d)22N@GK`^r40;N0xAaH({tAHJe+rv@yyy1{d9ydRtO06t2zT6urU42#gsZvxoafiV zfaYc!o10vi(DnvAqb~TAbGJy;}6`9Yy>z@$tvC{?KtDpjXyi zD8a60F12cFRGc1gA5nNIDIyv7=t2g^_SVYM&X*$%J%^|4^ zV>ktIRFeud+P`3S2pe!8Dv}f;f?nS3KXVAj+#nTa-p?TvngvxHgi8=9RZ4dnBrOxE z>$eDwQsm&8XU+Fs7m4N$#ld52pjf5{OnbgK|F?GM`pF(>3tJF?*042P!*#y_kJSTW zt{mo)(0Hk@cxi5fHGETQfcV9QW7Jv;dHuYGZXl6zyPu7hnGYDpQmP}5Pcq1rY0!Y8 zv;#}I1W!?Wn=%BXeKVjNi9P$poNe&!W&--ME7p|uv7Gj_%J1|vzHC0e*uS1|YdF!) zUR@f&Qa)bD6BrK(`NvicZR$rdx*w$9#&u?~=Y$Z1_D zXkDJ^imtEVNfuRjPxdHtxpn-&0R}*;74$Ec255)R&n<`z*=Dr#Q%e8+}I)MjAzQyA^oTOL+YS@Gq zi9IhcW3iBa?Ng45FdB|);o31!-g|ZakSuqZ_M<%U-G$?aAp zMDIYw8nKE{$y?r0*cWn(TRp0xtG4&%>9H0k#dY5?EK$jqQ^_7bPnP#6hVf0#7hUlJ z#rod~og(IV3l$Os#3DmT1Y95BhNgl3z0Gc6)4dQZ%m7P@F0Fdjo?ao+iU1MpU?XEw zR{ZSQVv}y~IdW63d>3}`{)y>-VD=Wfthpa@NF~G_Xs!$d5*=_Kbmg=npl|N|w&8lc z={n7Q=WFnr|GIlEa{{#=%fPrRk`FeLg)Yvt3m$`WGsPvVd9d5XrF7-Qllh#w!8U7Jr3G(Stfdrf z6Br%E7Ks_gjk&gSTn=_=sYQni$5T8HB`$CdjIS|4M zRw2BHhQhMjK)(ardYlp_$HIO{Gd#fU)c0XH@x*r;{t~9Ds!LXqi(}nY+}zjAWWjIN9i$dHQ~Zockwk1Zq|~VDanQ23v87;OI(clglFKwh}3i{ zqEMQLGG+_PqqnVI*;6o%8~Z2LhjBIz3gdz!z&)|R6(Iq@DT`i$&f?C+o?77_ZEGQZ zqK|^s4qzo5B#~{bJw7W&q`_{1?!ZmYzM*aOlO;@b!A45TfE-(5ym6fh(`g;mrSg`M zV1qR02Se4{JABD!2HJ=E-o0 z^_01mWNdbOGa-K#2N<8_ZssK4;P6ScwX$=6YN7zJN3P3$%7dzNH^Orx0NISRnVr)s z?ojiXS4jx@IP!PA8;0x>5vQ#X)PfHDeE!u_&S!v4(P1|DXRf3%)cg`KIu5?`(dbJt zN-sA~AIJGvmM#;tb~9gbPgQv^7doq&4M&6j%%5XlIH4g@YaPmM6A@07BTmX|Lu0k> zacKauxI9!Vq#}yTJsHI0Ln-=YH<9tBQ}Xwl31c#P$Wu;<0}XlIp3}0Y%}J!~opxw%69X{O zXy*eACmp#uoa_M{QwU^=b!MfwR5j%O$b|sT4>26219c8Xm9$ZLwU!b{FZ{*j=`kIu zeS8CG3LoL&Q+PTn%Q8L6d3lGXgzmsWBLfCOdJx?6mLWVWjGc41DDJ5<9Y`#Ao@|d~ zeV(}Kk!LgGeFU?_VY+c;ocia4BH9lQOrt^#qVRJs!by+}mzm`~G*#|+l);=dze@l- zm2-39JL$(0lzW7f%q7JZt#rq`a6_8a{(!LAibSpD*}5~zCH5S#cnSjiZc$ST<{$1G zTwuG)R*MU|itkHmKuEx8gJJ((771}(sQ7@Ea##V(5>w?+!+PlMLeTDFm=J$uO{5o^ zZIzJkZ?=9vRCg}Ik;DI9V6vyFYyJY@Fi=;&qrz4W6EsmYMeA z4)$+V)G`CYhFnVLgdYkb2JG=IchRT9cKWrTCzUEIT&9BJQnYdJ(eoLNRrY#hiSPww zKD=UX_2hn$Kz;9P;DCd6EZ&RhYOanMsbtS#hP?!oT;;p=PU>ZVbb#tsjLM(oMQTeQ~%7g8=&r2O<{Q)vg>B zKd!iAye;C$!ws5$EL7uCHl7nPTW#V`ryewV#h64!5wd|g-)PP>=d5q}#YK7*IsNiI zY&Jo|h=MkmNnLD?3mi#5EOAI`+ZCf~a1je{L+&22Q%aL!uIWhYL4KCkzq(dS%TdXW zY3&3Acn;pGL4#>aZ2$%XFoS*(W>wNYxlu3WI^Q-Iz{n z{b`b}+yc-2OZIjGM#19{6+QgS-%xGOQBfw_k!bB2nr4O33~wTvqa^#1h<(H|+1|EZ zbwNR)&1Y2uf0mG}B{pr&;2vjEr^75FG*5JxF&qJ-*2J1(ACNA<>)=w*!JcoT0DbU8 z=oQquL3Zevs05@nno^ddB{;GiU%+nHELYp08n;`F_Ooy=ObN;>PDf7-VD0vwI)_Hw zD-11-72}>+a4}%qK38)8?`bft15G<(Yr=~L_WjJmSb;Jk)bE9uqDV`U=*A3Ne-v9T zRf0#X4Oe)p696J=l+yVtEqyVe-Y!`PFluO@o`+@Ns#!Eo3NC8?+mAoE~m`-K4q{CO*N5xibrOGnJ|6OB378ftHBtD zqQ4~Io%dhQXpqLB(oH=Hor$_6BJW7~R3Xc69-e77Rsg|RF^dSTMyXn_4|Om07bkpX2kn}5H6Nb$)E8 zQxo1QsfjB(BW{($RWdg5ehaSDI={Vi(=R(YnE;Tva}N~W9KmaM-Jx9Oy-^+3(>m(i zJeJ2CWt(2Gx zAs%{_-bElaCV97;Afz!@_+$846~35)RlppO^&b=sG%5~{3oYsrp_bE_eCLY8A#CbW zE-G9@w*`SbFT83S;08oRlqd2)(fAYYSJUKT=R$PM?7pyq{)J%pJ)f_;37^WzZxs%d zQ$`Q1Ck{^}|MD9JS{e?cq2_m!!YdbtTUDB?<~}Pt!skD~pWg95n{2#6^d70D?^|40 zZ0uoxJ#y|0y}Qp0>iWWwyj_yiBSk)t2#!~1KmH#_FKyevB;!T_+!xRXR>hH8CVEgz zTFR-sNDB+COqyTZ)<>bo=h?`0PPRKL7CH(}G$^E!$suwOg$ZLmY32En%X7GWzg9AD z1j0WkO8|jRN6kZR7S0SH2C9m)22vS%LrrmoW&wFuPhg5VyH~48k4{ai9jRSLlzLIFQX14x{SB9*Fz5EJs3<04c(y=^N4IXk%$pzZXlM*1_SFW#$P z!_Bs}>_9`XWkDZC(bcPzi*)Co=rj~?0y?3zcS&bS0UZ!`ia>(Y5tu$Ai>4 z0bihhm_u6Dsf;CUr|kN>R~<_3Hn*k?Te431TTkAu-#+xx2Y5*aBiuZ7g4b!#Ef5fgra{G%`)~A0N9!h0JT>|woGDg&9FM>129n)4UdR; z(_wTDnk;Ck54>1!qnxZeQ7IJ|e`H=t7@C6n3g>u%6^bl2>P^YapyFNg2ARg(;5$AS|w#FD??>^#1V&eL8;F%z9VIKZ+J zP?bQ#b{M*pZi0&q2pJWSFs>Ho=Mdnsc?NElIFw@~k1Rt>v4j-z{U|B}L`r9g1M?Q1 z!qxh*ayfDVrE<_Rj3Y!SbB~2~G)oI`*9P}fZ-$V~Qdgu!`v$e_QK>5q z3h1dcOiFU}Rd-voRyCQYqn;?u6gDTBHpOcV$phb=U zVKj=s;GIL^#yX8-*2kmJTRO`0(P71B(<{-mV?`y&)$`!D&=GKm(q6xCzz*@JnS>0| z;4Zl4AVkcX6%g3krTklmyZqb!aW;Rl`DtG?XvNyxqp_0LAw_rQVM>g-*B>VPzt!Tb zz2oC47~HI17uCYVSkN3Y~z0caCF}DMaEY&(!kS(TX}GisD@Q)iin39#pI>*iG#>Z;?V&} z5t?NEKv+aOV(hr4pq4Z=aqj*_XuazImSt#~jz5~g+nxGA!k|8HHn$8Zko{TT%agXa z>#GmAM;LDTGmK7Epaz)MA?|STM=<&=?R~#BE2=F%e(aS=&I}!(n?oAv0w@?{ch9*h z#$Oj<2e&NtWxKBVYs$ShZ^7q5H621h2POtgH~rvR4f_ z3)Zn`(5n(RQL_FJi@a&{7u(O6BcgvZ7lb{Z1qnM!PzX3XE18Lw5!kD@C(s#kJ%(9) z7_8P35;I$mbUOwJB=CaiMY=s@cYpdXe(0 za*bp;7irS}=reg22@YR5<#4~R9N$-ZkBk+ZHhTJJgA@TlI0W>bzKSA042Vl+!+GqG z5jOBv-(!JydHJn?Jyq6EZ*rR1wbMF-O{LDV=?bgnBT^3dOXqT$p8+=61U%i(JGJ8Xh_!Pz5w2_qS>|k27 ze|{kCDmxi2;K)k?Ko+dr^8{Jl(N{?NG?=3?ledJ~$im#hffKZtZE=6NWs z?pU>{lz$jMT86%rKm_;kACq%s$|U@BWZPI*=|DBW*H7?%M`w}P;I;xxNG_tCkwD05 z2ROfbfG-qlxEwSrByZy|fc}ONIJ;vffwoVWe!Qu;LYVVC^NXQkcdGQ(EA*Jhz|(DX z-E17)3{Ks50%MivE;(KZ_5%iBxsTbIpA!EfygU}P`W#vYLH5e}FaZ030H8_@J&cRO zOz{GU4FBm8_v5GTO8ZK&nHXVS5}B_*?R$gzVz?v1X_xgSmAu_>rf-t6jQ+;(mMD+P zKZ!qCec@z^pk0zNYbYtsHRP%-^QTqd(9z63!aOpezaxhdlkL}2s?Pco`5Ofy4f-KD zVY+JdWbhw?9jC)~v)OWb+pHe6)v;@%B^?i7&=vQEIh)*?HO;ji`4;ZA5q38*<|>K! z0aZC%<~#wVDxoU4e9>J~pSrutNr@l-=~SptZteAC94+Vgwf|MO@odP);|4{)$%q2aC5&zs#~j;R%lyI z^7|-ZNw7|(@YrV7KFx!`D5S!GN!%m&;+%em{CLjM&(R5#Pv6lcR=-+6@Viq}F=;Fm=^fee^d zT}yUePCZSYIoDu==CFGH9Neyqht*)Fkm3a?V@He&`x+W|6Im6#&7)CLk5Vo5d2*1{ z4ttTPMRsF6%5I9fMiJa?jrX3}vg8ZzCDor?BAh}Wx?Keott$iVE(lJ{m!V(e{Eq)sK@B|AgZ!Jcir zuW`d$1$JA@i)5(n&{+#@TVS2r*oRtpwrgms-j=+=b?4lWq|Q?}$3Un^o9d;xm}(&!c2opmPO~`Rj5vz%RRxnBv&(+MOFL z$dg%C=Qg79t!t;~disCK#pRK)m1$71DNXbXt4`pKi>A*j#Of082gx6Ht}&ts+E?8e zk8w$emHX$94BIIny5}@`{xlo%5i$Pajm@0u&r{SYW|{$X+wo-aAOpXXDqrBs7q^|O zB@!FZ zMw`~m_=*R}QXKF78O31V83)#S6P3LOCxl1q{)NB5a z&ZbeHPO=H(qwcJ?X$j3Tay)^B zUGbtgKMETpS9VmtHMQZz;#A)TyhC|?9%U=+wL2sqeN|%{-Gd|Y_H;_j~xr!LbNbvXcQ`Qqai<~iYHq1ZpJtd*b1L6dywRBq_rOLz7# zGfQ-qg+8nMih1tjw#2rZe4?bBoqCjW!UoZ_*lDqYKpBgfT4637zuup|WuwMdYa~t* z!X#XPPOMu>#&Ad9&E;}%WAI7_vX6sCUzvw4jH9H=W)3xk3w&B`H)%t&?iS!GrwfsB zhWI<+;oEobR@Bl{*8%oY)tU#eYGVHfi3z~S^Gl{J;=bGrx@_UmT9Sw@(|wQB^3zma z3{K9A?DF7%9t_hGT3dRza znn{(Q@o(IECV^Uo_3C-vb>+$GRDraeWPh=IPi<8xG+(zCi~F>I%_sVPuX1 zm`qT-ny{Qk=L;W}b{ zLS1SuPg7UO{N$na+@1h#$Jk!W0wr->n!0Y=CjS1d!$xTQ zg9A>MO9=e1pr*EU;tjGz)T=Ag;{))vZ$SFAs=$Hq-Do8pKvsb(a8FL)!p z^XdkreLReMvo}T9T{nT;rnKd>{)Rnj0EOPH20ng+iJuQ0@G>C!SBt{}4wx+gnE9pF zlO1Kle~)KePkNN5m?^J({{-}>V55g*=~wRgQ+(LA50L#RMpBUJvKEL~JeV&0G6c+~ zOX~ZFk7f3;MpOWP%}YCcZ+-%3zGj#rX*j{OY>>KHKh?kgLRgjm_(th*iqyh(@ofup z@wV!pS&sl)KP;gKl=hjB5>#IqbaW>)JK|D~45Gm4544Z2P+}Ea&;#JV_xb^Gme<=K z0Z7x=bM$6;c_M6lBOCTPZR~h0*r$Ts6XWvBnVL*U;uL`TG)6w+zFII-WY4Q4)90#F=c&om<%{!0D%r>Uhc1n)e7kLYo+?&7^;wJ?^t`4ewS6DRQ-ZQC1C0C) z^jRy1{)t@(8eMHbrY%wupp4OqQEo9B_7l2pNf}U7VLcnzNm!!ra{EprCJmO6WtS(_6! zK|Ub=`1TYS6=K8ckHhMZi1TqY%~3N&tLctZB{gf2iz}IH}7y%-~fO{ z-8TbWJA+3igGicb1Z!9Q_9N}K3sB>w z^bX8KGYQQR>9ME&~>IXd=IJB z$Vz6ckNcTLyI4&dlUpaV_Eu_3VSi`%AsNIM@slD{w*phBZWK@CxoQxT#pMjCIUq=PmC==Wm?6vBf!Sf;QX2 z;x=6=sXUk5fZTxbKd%8UINzsRuc*n$(g$zv{ok)TJJZvBr@4MVtL1?Em2bg-|3FqJ zupEemZ4=AHIFE>PuU=mHeD#MC>9~*FZl9rge+C??qchyCz8uDS$2DQV1T;6U{*7Qs zkD)*erKVUg29$9rrd zu*dFi{c(*~o;5gvIpI-Ay+{zES|M@~BUxe2g{S@23h&)ea@Xe<~^hC}OddiL;dyNBTUqr<^^5Sn%oElUIv zN4!#yjwbJrk`5K!2F^qKzcOgG4@wb-Kr5{dH}K`-)*)1Gk&qudbE*ieh%{gU`fs0P zWz-EAq2W<=^MedD9Cly6F*UO}SmX?;il#-iu?q-&+Qd&u!GduX;yw{< zIN#m{3{SA6F;Y-uPG%nBir_}T5QZyCY|5TFf~|XHSR47DSZd)3%GNo@(B$UvM}0qi#D?j$%k@={ z{C&igbh^p<<$ZN+rR0jFbWYBvF0d&x_H}8F3lHmG2q&=g?X9V06-KqWZB>{xlC*{n zrV$-DMYZ&GG{@KS18Na<&e>Hq9z(0jgNK(AnTq^`dX0Ypsm|;oEs&e;>xdO8IRC)= zPzYGJDMgF;j1v=!Kcu*u?D-2H#xtuh;g0;86y01ziWg{tEgLs=C#plso8}_ z?A(GJ`BN9dRUFPBxgdnScj|b@;`d3Pd~cg7-XvW%AMp!Pgg}&8x}OvcGI18w6ZXDJ z9A`RovY6&!BnH|YExFiMfID>dN( zD|)j%`=$K&6Xf_zHfN;5sgK!5MPOXnCv(ObZpF^AdFnBM-+U6_(?%_~0LH2)$vkK! z9;s#JG_!C7B^j2DtT-cx8jd#PRr%+q4D={QTpspc?p1JIIIC?fE8^)R{uITibguY! zj~!oPza;yrSFj69NY?mD({~aGmJbo|ZozmZWhmN#V*yZTmm6QNzY0+s5N^T~T4({m zOYowH<_dk-H)gv}GNC#aGCwd?=7;^|I~;_Ywf&YmkYSg}h%8Ku!(mK{kjy=E2WJq$ zilI{vZ)ieFC?1*k#6(Q1np{v5Jsnx{6bt%8RT@O;gtI#cZ+1(Oa$sdX`>PCm_LZvQ zM1mTI% zCcmLs3DXe_f{u;6=SX_oRjHDq)M0W^p#)*jDLZ%d$m5;pRI2=th_Gt>=2El<%C-VV z3ne9U8cSRpRg5o7S%+i2lbzc$=i58fM~L8q2mmO&v1jp?4B2pYN86juI-amEHUZoH zl88PhGZyV#N|TYwoQpR2bIR+Vmg_vREB}?*l%EW_>I;kFvg(%KKzBsEH(Jw>G%fu` z8k`K-h!G$b;WXSqoge-IKjDfx*DUVMvb@By0!?jEwQGXEtFX*&W*Lao-!O#a{zmcv zh#b~$&I(bF=G7J09v{yqgmtaMPjl;uBU~%w5>IM21q(f_ps^QP+^@J}lRfAPj|{}K ze_TU=_m;sZmrOQr6P#VzJ3Sv4EBoa1h6|i@xzai(Pq2hHx%@3ebo%T^Zpf)&$=A1#}y$v zvZQvc1j&~{@cpkWUMDk78J+pxr(dkLQY$^1lm1S9QMzI~K@&ILiE(~B=M2{)An&9; zF^de}h;y!Qv>O}&jxw=c6gk$V0yAHfe#yByevF&Jg1dQXkwzq?#-racrLslv_c}Tm zgq07Kns)J_3paStuQ435uz2{g#6as3>|dS)R{Qn`0HwiQq9`zn!``OzFyQf97k37_ zX92v_3<6^{` zwhj~P(iX{pqpmi?s2H#L>sS?!s4t1KdFka*QAEtbI?vp$rnnPN=dM3_ZrV)9?y`V7K*b68+IKg0*=QhsYN|09ha;Z^FU6z@uZSF4wIJfP4}(% z3bItix&FvyQ!2}y1PqxB11E4e2r;1NR#Jw86F4P?q;?Xm02{g~n;ctIU>Y7V~ZO~(=h`KAG$`8n)S*>*NqzSzm)*qqCFhF+9=yY4)hRqZb{Xjpt+V71nDky2x5??WBW-aAM&Y;y za=Xgg`?X`JiQ8SzJHIGhFd^)AFBqEVK>|?ach%i~6#M$?IFJwtJ3DZ9@YheEsQ>RA zg8#G;GI+)uQAZm8uHBojSO5pR?YV!=Iypc8$T19kxs-EQ?2E=%%t=Hv3XU772%J9@gML)4jaF45L%v&nzMA9`sXaOl5dfI% zrYAsoXon^^S8pocwCVMi}=V0uV7pWj*~vHy{azG&dtuVXN|-Bzgj|TE85w( zZ3Ah83*aDS#{)g#;vEk`LNi3!L>1tmlJ?9E;u2wGP1+)UF;D83;le$3zcemK;rRVz z=#vc1b@|<2)L^nWN~w@tqBF|pEk#<#5vGF-Zts54XdoZy_1`z#K%J2W=k33~QvnIw zsOlfHi6HepF9E5Bdte`e7sEWx+xe&Wv1qdZFM%vR|(x+!05)ws-HrA)iwY{ZUTmZ*CtDI{%d+;7yv5 z&L~aAo{=xteaZrj4xQw=TDAeaG44zM)s2LDrOwCXvAoxKr!8IA~@y-9tb4Ob(9 zjnZ$oLw$gw=kVt)H_Xy|;On`i*!}9AGrDWQ{Zar9910;T%0tS8`M^3KF8yR6bp&!? zEUw%fJuH(e?oMu1KQiLK$G^1~!l?@`N%_t#tyikvm0hl5z3vPUc9#M71NfwvRAiy5 zK*5w?Pgv8hLD^;%QMsmL0?=;Z{0Su9x1iq=nnxlP2pbadjO}kbP_x zswJjkF(QJziPaY});ONF!|DI9rO0jOLfk^@W55LeB^}#uuA8HU6-%S3c}&U1P;JyJ zBnPAb^IPQzjj+~7-Bkd^QHO7X=omXxr927I9xN$fp^Y_p)B8<+Plvt_fSa=CnkT4Xwors$RIl%Y!&&k_{niAQ&hT9ea)7(TICArFj=p9)k=PsYQ|MK$KDs+?pAsW)a1?-`8PcG zCK3D6V+b=(mlJ?Of5kKdT$4`3+Sm`xFY!oTrJ2F9iDP+-Pq-~EK}j8_zbR#Km53yQdUVzK#b>=mo7xvuBMa-EaE48(eS zaxNC~e0r6hy~9X+*%xbK1oveoWB&UMy`DA>6R+)W!{jJ6i010ygK(_rd3l$3M{1wT zj`#5PF2ewLYe*}J6RI9FTFMR>ZioUk$YqiapI*8&iEC>>jz+KN90&$B5f0_B5{heT z@}U^e%=bz*F2ahMDx>+m?JaJkVw`a2pF{^({%dAupCBkNI$ODZefIXvXwM?T`%RV8 zDXd=^731#G)EU}5#R9du=i#zC)%NSpmwqn$y>uo(_%}dYzdUN%!v&%z2mvRnPeM0l z|M}@5?<+{U&x|OQ9BMJ}umSJ?QmD9!Ht+G=Ct0QW2c58PlE9NQSKq*zPNea!2 zxK9L~9PjawoF9#`R*)zwar}i`CeY7ayivLb=4iIJe(Wthz5nmx@?pO`g9v0KF%c=m}@A zVlQa7Q#0E>nZOf8168&t+q`|o)nvKm&=&+~QmdW6X|t5+9k?AlW_wFVAjA28e#0uG zL7_|mr*vH*ZiYZIE)cQ)`X+3uR4_gV3eC4iMT}v&>(dh+TUuE8_~m=+<1dY(b$hGw zr#)CJ*@uLGRQ)j`102TWzUZVImN4*!ys^+rvb$(wDaELSmSrhu@#Hn|nf_d~ULSz? zd1ntv{>m82J^q-RWqF%`j7`fFn^$R9LhAk={8oAs=(dDac>ct1p`xk{^xIDiMK-UoN#}3 zV;oTc0kM(4g1-UU?!p+?SVv`a^aw!ggq^vPSHy;6A|`81F$jGIjsFSc*qmPkX*srt)I_xrTSd-IN@6;5Wi#7{s(;RC=Ls5iCC zdv>#V#L~OHD3blgk;WTkmL02H0I)}9XE00jXK&|Y-R@Fl>Ci5D(yjha}6d;Bw zy0+f*dBw^h~izi@Jj<@QfcU^&9^}mj;=`>lC z83%SHZ*lkBZ3t5w^NXW+(ZlOw+Xb1S=96{*pmb$Iw1$ z`Q|b*JzCR1Yo2LC=Rx8opLFLPlw#DreF% z`PaR;?)~4VJ(=L#x-S37`?&m!tt~4n&v&Nd1K+M28L8V}hVSSEc4uA5khI%TMZvwB zi&OmXI~FT2Kxmi|iBUE&d7J5R`)GRe5N?w8Kz!b|Ap!(~AkWNHArU^yV|GqiUG{3u zAllc@5kyN1=6?ZbVGwXLs$!Z6Iz+=gq@+4xB!QaM=l7dvN z!3zG3GW3Fc?M);{!oQ#M-X*BN8ZI3Ykj!m|Y9tqJEc_wam{d|=I3CuZn194e=pd>m zQmQew_lgPs68h&i^D87R?UHB`goUp7ewh_svpBOiZCbHIo9bTcAx>-Xp#>u#={#7z>Sen4_L9XmNN=UWc==#$p{9BgdAh1FHp1IKk-M;uFQ<&V+C-~T;fNm&_* z1*}=ZsukIsZ9gR+}9f048 zC=ksY9v>W|V#U@)?nMDDyOwHbCAihOK={Sc(}>@z)44_%=a{(R=e=TW;Tr!Cz8vqEyxG$ZksZP3J-Z86IaT?#wqg#!`%g9#}Y&z6lJ!7mcGb+871&nb|I z_Ue>QZWTQ>6MSR|?Wab=BOTz42#jdLTs-9(fH~rD z5m~V~G6qFC!%QDiJ7mgLWxo_j#L&ZdWH9A-lzJnq9y4%|p?BRF7tD9^sMB^B*+o}4 zj5$|WlCNAUm>ZK<7hdUC1eOkCoLXay##p0KZ#WwlUGbJ7rM|`y&-&*Gup9~CNf_&r zRM{K$UGV0+S78>(;Pjv_$NjMjFueni`azB!H!-Rq;SKHA)8__T#YqGl{SLz(0vT@x z`H+lxVPrUHNw-XafN+l3BJjGTBw;rQr1croX(Fya?28m*c^hS4RqBg|^Yc2uUH@Jy zT%A)T=mYih@7XGSW_f?@GmRP-ap37GOC`cU=A!ofdGezCQgmWv;yL>XU@ju#CbQH` zkBZ#+CAuWiPmNhsQQ-gS2NAi$W;~3^0$m-9zC))4syQIzfLIx3U4U90gw;y)ClEhB ztD6tmPSsjh$|Vm%eb0UGi6ZJjneLP1Q@X+`IAc#~Z+dVIiv|lo1t|X}i{(7y3z*n> zFxtK6T-uUEZHMe%+h!^OumR6uW0;f@GRysu<17oDF`{Nti!3$-CTw5HbiKCX{TGqx zFGmjOjqPvL?@_`>!nx0B&)hKv!aH9k0YX{f`!@}+uc@e({BVp$mh7{^y9lC-8R4gP zbIl*Dzs;porZfnIU%Q1n8Mll+4v94yl{sfmJ-a_pvIXESk@_uxnV!4Q0wDx&DI=@G zy^V@^0t>}RvO3)}(wRMdIaeZ*8HVnU6!KaNXwa?`8oe#?W%}jWJZnvh*=>9ci}^^q z>an`x$welbu_Y#$0b9;BnvG4?G*=Ux%d)Xz$ET%()jOntQWVLZKD?|=tk57Mk8>9O z*ji$ZRZj0qQXC{;pn>z{@jcCOmWF`b`qenbZo1{n$ipgZQ=^ajhu}YRjoq_2R)2dT zti=WemXyyeB?uv53L)usHxTpw;~fu=aGMvSxt5?J(72ga=J+LkIDH2gpKAz+U71#x zT(T;Jfs5-#Wxog@@lY9rTb8yVJY&cK@ed_p za_|!y!}nKDe!Xx^mox=;2yZ%7he^^-sfo4 zDkUvNNf*@yOl5Pia>3_eZcE00U2DXcFZW+ZW$Jm`;rQt%jnwCe^_$JEov()Ny2Bih zjB>}HTaFT2yQqdNLb`Po8A?oHyd|d@4U;}w<9ynBp%H0$fS9k8PSVnKnlgRRj};0T zd9;+wTIX@0yct5I4!kS!y-sW>kJQk(_q}vA1{HJeyw$lyk=Pzv0-`!TC z3>yK5#=IySBx1gZvkz!l zF(a8gfby&wSWW{d^$kdDA9oioMta>pe2dg$`n?G$A=kQ%^cGdvi&G*riYixCMAfj@ z@A|cV$i=}e4!E-Za}&^#2I5fNe^4yGkjaOojoJIaruNa-LK%cKUE^gup4CEj!}0A} zvw&h3$ra>dh+J*rpEoM5Voq8;kW5jrW7IkG}?B?E9{Ej!pY|f?IaeVuHYN z;Hdkz9l_tfTlH6@)dYd_0<%Az9lEkfEfVLjcgE%vPxIjC9YeAyE&l0@_707s*wiA# zB{_$u`e+4(I92oKy0|i~9qJ4^qn})%|I-*V zG%c%7-Jb7hSuw6v##QK`N}Kuh1hN%kbwAr}5X8L|LVN#2xI*hxs)w;|8FLGvZJwb< zKVshg2WRLtHd19{Mnux_+e@d>21oQCR`jgG_eVZ)8VLdq>fxzB;jb~c^?Dld2^o@_ zuw0*>knpoi#*A@HWiTfDFwGnq-3WL@AXRM97O`oA!Qk`&b!jDv6P<`54j!Z!zx9aL zt8t<6jTP%}4tUHC6b>v-pv9QI3IDO%$#z&KSakt(~(!TgtPaE5tswfRFAZIVv@~y z)pqrGV2^3h)|ye4AP2V>oe;|mFi&nNJnPf^L%^}26FJYP}ya`NC_I3d?M3&L%{I?YE(4|C*^v@CEa|cOppc0hihh^cGqj$_;-TW)0MU;Zc^s4?j%FT})aw>8TJ7Tcg!2CdO7$5`LqE(pACGO~@v1`OP5s zPuuiRBhV^{z*7eT-@w91S1K<9muuW-6|4G3!f1UvPU>pmwJjW$^A}QQ(qytxm#9g7 zMrvei33j-`U>oNdk4bJv`RPiZdHqe?r6EDfd}(H7xyfVYarh}iwdA#VyJ9I_@MI24Rt0fO}bjGt->zDt#0H1dIe^sba5f>5NDnLBN_P1AF|`pr;TwQhm7zQSiEke>qH zj1K&v_;f)DR@|G`9?Z*uIJBV|a?VF{7a`Q=-fgSJ?7*1Tm=#UDsl-Sf#ab0(g0nI z_sK!LTUgY)W^i*^5re<{HA|EZh}ya0U6w#TNy$ahveMPEw1(YpaYafLp)7w*>OG}?yo&(AeD zhg)-b30j8yK%zQ;>lXgX#p!cUXcl;*JZZEDyUF;NA=5lwX~-Kq{^m&t3^BWjOCs%0 zP<{)$QHSMhQ#bc%QYRd$3B9paD>zuY%N@1{BN)Dd`~BMw4;XwBLcjLlpi*Z+^#DEC z4Pi<0xiId;8NWtz*eTu_oXAIKh88jaCFOu0A;S9s6;m%pDT=f*+G8X9cvdtzPdiP9 zyaL;BpyoiI`7L9nr(=*iI=a=d;&8YP55ew|eOlCMZLSgi@KNEL+R+<^Ed@~R%H19GRH zno)(}-AiUaTE40o8`&8vM%Kf|P!c@Uh{_stX2}{QIE{;SmsviV5fNhUii#CgE;$Gr zF?-^d9+nqU{45*|3RFg;wW;RTfSvQFGl8@HK79!@9VOd0HoK>28%I^ytWGkRJ{e3xKR0-rR+$A2b4GhHtbLZY@D_qx!ggE?uiD> zykD&?Equ@6nRk&$1|6o3Rs|YKAzt`ANsIt-$jvjLSXo~q9-zU){1ZD)H~tV&1?0`!L%WC70gN>r55o=bq*5l>n z*WP{X_&4V;3F|$!+=yM(XgVoZ+8+jH8hkG9O>l@bH3`c)FkUY}yV&v&d7%J<8xh)Z zs026cRVV7~Hh}RKJ%~l1Tl1GHuaxa11cyfVzhIeqM%ydlX+=?m*$z9R6=k zs-IZSdbO=RChRc^wPE2LcAp&_A-D6Lkn z`p_b$GM`uMjGxz8e1qB#FjiYz>>d5GhFw z95>^?J*s~F)bcs3^$_ciRq+Ul>@q@~?`FSCL!-l``P-kt0)By^WufB8%{M%~EYuLL;r*E6D2f>~Q`Tw}}Im z+(BHhV=K01x8YV=G1o^?kU1{kBEgcc1PYrof*6mx4MAHV5|K6fjgu3TrSB zkl&F1O#wKVOl*vtovYOJmC!{n1ioXz6*HzF3yG*irUoL!Jg4BHTPbHP;E4$Pmd#%X zr`cH;Szs^xD2|Za54u?;HtXbrj1k1a^GMI&bH5ZgKF{g6+dp2m2eC8p17W=%G@_i1 z5)4heXlk?DZ0neK64E`)yf)(u_36_l;Sm? z%>hiOOrD|ixr`gGyL_{sy;c$m!?iv>#j8VPVl^`6=@+704+(^r=aAs^#C8U(6vcA| z%=Eb=oCu5L59w`<lPFC{0T=k63Px(3P1tnzk3Dd%-@JgH*k?4Tkf1`7w1Y+r93qUB~ z@R(}2aylGfakQ|!{KZp?nN8_khaTa~gN#$r;;gs?8I6CyLFIrdFx)PlDsi0D>eJgS zNsU!i_AXU>6TvL)J2LtPj4mN)ccVXNF@(^kvzgMG!t$6`T8WwOmiM)W5>#QSOdJ03 zm}^zE4!kvng6skLe?mL#e`;HmAcT4-ZTlKhrls~3>>C*Df7Xf*P+q%}b_k@?{;ff# zAxy(#wkR%ujY9mlwDbRhCHyaXJ^(BJUxd2~HvPZoY!eI)`oHB~Gj_ee@~_IqFA7BIk7K;rSRcmm(FbRY- z7>=@IdS`IJn0$6dZL9U-&!#2)x~eygv`ADc2K7FjGo7lnDIMLWB@Nv)ou>=nkFPxy z`xpf~=-SoO8^%$W`*zoHuJfh#)vd>C)@B??F9TyXBv=trCMa%vgz_$IV@fF3q~Pnq zoI*f;&8p2~sN6E(X0sxU?cUHKU;`!BWqZ**hxJ6&z+u^(`8ntHso&sunpwuayr3jC z1Abv--%Bh?Q>g%@xT#&0s>L~x6C5(&&)`7DqdVnr*pBoS8p+aM+nbO&KGbzcUI|jlUvA8H0jBF5aeeBNBxyl$&!dgda zT%#az8sZ>GjkeTrRQO(A>ot7CxwaARRo5Fa>xJQoK7|O}(x}}y0C=m}+ zff;ff%FPElC~dZ-Mj9Fu;nl&Zqk~zYqC*^EvuVbKee!^prR3m^(;E>ahq)yAb= zxV*C3PJSnwQgDQmThxO}iPHAZ(0mghQQAgs<&_60cL^Q%BrV!O*>`9P>xy-y%e$zY zmoZD_L>h*q#?{IVXnDQ8Mi}b>2yG*egGkrd1O<1xHcN$z`JeP|n(T zFC{>!Yg9)i53xkXGLEKk_6)|`w^#$RrG{(AUOiA_A|4yvHADhFrxqghw06?p%aVjX zr4tu7QMh&-n+$Un4jYTn6pNYL5VEo;F#Z%>-6#pP!jNnQo9onNvbscwYnrYjZZNP3(-Qt5QAL?6$nU) zb+mI;8T^uuT+}^9s`)PKTn;K?C<3ROLrRcX`IF0~SCWtmw-&dVW+Kfp1{ErSLgR(o zD+m<8_k;MnaLEu5}%U`pp z%tuA_0UVquj9$82RD-mi6&l8wOwX+MAM{ciOX8N_eTDELwD>R2<|WiPkpW=Q`%t?W z31RGjR$P7MK?Zdkc1=#`H<@oou`T4^d_eI1^~{rFhKLP(^QM2wAquGl&jEi!(NXTJ z3R`MhoNv-xb`xL090F32wj*wdveeUJe9Nnr2mUfN@5BN5?67Mv10&e(renP`m-3>Z zy)9-zovwROlX|ul_mX?3^cn!sJ~Hn&EL(3NrJFKcDJcnDYJk0Y5jk1dB?WIDKuU}R zZKlSguwY}P1gr}gu{u63H8{KVYrlu-L!E~T(0(%*=<}i>*icv~rG8%?^`{H8p4!1eFLiFL5E)e~jcnswk>I<7zO5i9EZ_*)slAhJjX8T?fDpLWO^%?287*whM z`+@2Hhdy`oU)qrxO>(DS)4dJ6{1&}6JD$O_A0{Ghz4zWHv3rdqo_~|(37RST9JVi{ zDJ=>3e2n1UQ2cCrqpkro(a?^rO)0yZ$RN}QL1#qv4I_*6hUoN>C9Od{RU8G7Da_9gl{AGLc8){zwUyx&Go1b}C>llg4 z8%!jr;A_M`ZWmn^1Ll?AUM^}`OiaX>kCO3ulM$ml5BK_;kI3+^?Ps7FhpoI z9*(=J`W2O14-LJ}t~ep#zjyIu&}RJdRjpsgKI-r4-fj^IyQu}V6vpGPraCB_Io7Zj zZkXM`eo)w3{|g`9XO_h_9`O~;F|5bApFn*z3?x_C$0D6Ytr#Lf=s*?i zgc+fEnAKE17>kr_3xHk|Lu8Hgj*LUSE*KV%T$Z~ zT^@rGFd)?*7AEZBdzx`+KLt~Gy<)bdA?ftQQDgj<9(GQ0@dj!XB7>2b5Y54s^gin} zzAN_GMK%5kwIoRvaMUZNOf&t9+}EI`bh7z4Kh5|K$87S{65D|4d4n~0_8 zh9WFKbh;Szy>qlU_G^zyVVu6HDJ-;Q^Ztf`0iPCdr{G`n(t1f;hiZuQh}mK4rs9)R zC8c6z(hk3t#m;e)^hC?gy%xOS{%|{hF3s?Gp+V$k1H8@)n{fSXb)&sHdh(rcP2RfT zM!_oh-*yI5S|f8btcWZ< z$j&xoU|h>KG?kJv#z!ZIIXA{=!&^R(5dg3E{&7$R&SJIX4~$QYIRTcJDj7_H2fX{+ z&nkB2`CT1wflid<(sPUcTZA4iM4R1*6n>@mtdl*sYWA6^voW1ej}KGh#D_Qv8H&|K z+7tF##E&9`S@kNOAw@#hC&QT73)+S!h&d0&h09OGNPDuGUJO=Y#y6%pE35I|q3 z#myLmyN=C9GCfCjI#IM%>VyMa$>J>yb3kQ;9n~BmSPavemetMsA4Lt{18JVWntIB4 zla!r~kn7@@^7+t!?O^ck28@uIYG zDQ&2ZmKS)j94!T0(k{oQt@vw|z6bnP=FA!!VRBD4(NgwQ$B+i^n;GqApaFYg3KVCV=JtYgQ-G@Sh;en@i_* zZ=O?UT3#>~9M1a7*zs|#34X@n!z{F~IJda_RQi&cN=C@Qy2W;5o}kn!;K-T0_iwt+FAvPjre2 z{8>|ip3FUB1qWi|bmd%|ww7FX=>U3lMT;kKy@z2}j!KMy-$nbd;6Q{Dnd#f!Zt)s> z0zxKw-mry>&r(8(F`^GBps;2T$jfyCT1KF1JNm_W_jbr$V7AC>0;i)=!y7su)Q{A8cUTWNu4o*{r0$ z*xNm~e_t%v44R26WwwfqupmXm-5bj<_-ppY1YD?3>HC$*iCuKQI&)2xLe~vLH6r2{ z^z*m7aGU3{uZrE4x1(@?%+G9R`8nor;NpW^s-)xD4lxs55{?A|&S+|Z8L`p*d1bej zR9Xvd7a=_H(LKaG905p>NnHc0s6DM~n87nIbqHtB=Rr(hjPBmp(EHKbK)OVqFlV=! z#V?jkD*~*G{@6nt!8?8NiO=EzUNTKObmrl|Tv+E(8U}5=BMN#ROd@;v*0N;S zEgdvleF@Ji=pTWx1u&gU6f>BUe@KE!)b#(s4PdIDo2*Y+*a^1t;W*Z@3@l61z@a(hd<2=w{V5E~x&7je@o<|0cFLCMB{YRYxl zTg=Cd_uSXAY{qdb5JRscxU5wLLsOcrIDTqqVr81NE; zO2&WpDwB6TT^g~HVvN6|JB2&b$QydMNjkC*PV&W(muM?GcDD*+W3%D+WU;A6IfK$Y z;GyjP^~RnhU2G|6okDsf@VyGm2$`#3Xj^rIZc1EiQ2G4vkT^JuD3m+xR~ z4nKIYl$47ETX0_fkm^C|Hk% zwv|6JV@ScAWjfll5?@wQKUSm1=Ymhz1{Le%re;Gb_0-JW?Wbp;F=b(+Yg3C@|s&xeg`$_dtSv z5e`8LiWJbfyD6j8Z>1i3?};JzGPyr=TH|fU=J#;*`K`l`J;H|44=S={l|2H7Wv42- z`jl5lbEQC#UIE*1Y|pukT_kN0e{cZi(tgn1^@dOEJ$F83Bi9kEtjqH!^veSO_|gxf z{W~c^ym}V($eYIJBvJ!(pk(3q)aI6<7uaX(Z}yx$6agAWuWv4~t&;jUR|N zSZQpVbaJy2r=G3h|Xa|FaPP?iou+`1(EyXeh@yKAn~a4Ng@n z0X+IXQ7mLeucY!K3QqywZejrOL>AT6Q=1%s!q9;IS zR)9rV4vU02?sIl}#l(55dPydwBQ=bD>bFpW!4ciMe?1YiYSJ+2+>r>ydd5Reuq`B% z=0E;L2KUl)m3nDm1Q;cXW&~llPObb4Yu|CQEL3KlPEFciQCa%%j7EWh18LXsR(uVc zRhox@=v-Tv6BDOK(vi`+!MP(BjbGkoXho?O;{&uaDf_6g_|g!$=e1=x^wi3&F@99; zg{1K6^=F7v?8|PAI$_ynbquqI6k>|0QmUzg0}FUCjsF@4?Y870PY^zIL)BK+XUY{) z{6di=V2n#x2OPS|d}cs*c0U~}=1}|>HXj$VjgZ2Zx4-J(3HSz5W_&k-G8A<8w1qHy zPX*RvHti2rmdCur!yKX|Sk|8btU=(Uej`Tu_68d*{jXgPsTL z2R5lqzfi{?-+JLl)roSDzuz-Cge@hwyN1ra_4l^h5B+94$Co@WE+_gpfRV?hV+C#Y`T2k-ck<|P(&9hvmjaRlkzJPWiNwfGB>6?$<4|@2&pfnZ`XNar4Fh^V* zOUyMkdImq5N(z9w!tS~NM}50d%;?`5Ek)Il)_I1bRMo!H?ia7+r{%BZ?c?Q8)&Fcs zshvXPITcDH6}b-Zh639uIT6(nmTX6x5V#t;jSZ%p)XVtTQ=Rg9sw7NOVbq z6H+h!kNfxEek+7(d2u*-!`x~M-6Tmih(L<}%HgVTXHyx=Gdh#&5tX;&eY~kR8m<3& zO;s=q`P=$s7)$xKuSsw=wGq8uIeK#!cS*tr`v*QS_V{#Vz0kt*p1n3gyrI-KN9fL< zw`Lb9lpsX$8j+L^eatTO2>MrTWYk-dgd$NeNtJI7cdorQZMmub-Fkom@l@P~&O>0D zCXxSnO5xyXj;CqkEf`i?rH7Gu^H?UvGC|_BRy>3>$}mb-3?R>y-Spn;?=Qk|cYSqK zDHjCLu#GYA(V>R7)C832?8&PqpuaQWQmmq$Mh|hme?vr88h2~_zE_*^nJZbdzHc5C zIiE*cU$TvMd@Q;|8$CE`tEj{7J=um37cvywNY%XpS6(K@)!J2p{w*1{@u@ARPU^~Z zY^9d-w~^*Z_(C)InKcafdYQk&xbXUqj$m)dmxA8+>2k#2D%_vNtPg8WHfBj{ z2fw*g#KLy=JpMFDsF#rne4l`NR1DW64x>6%A7vVsv$VrLQs&>QcFn``B^rmrZ;3?( zHbGbluZn%=ZcW3liL{6NbW|y$(b}I{>Q-$W*NORL4-fY>HBj*8_0{D#$u>6*S--LS zQXCNk5255v*3`Duyw6m?yvSe;qx^i6CwMX`gEkV`PHpVr5pcXH(GL;d_q}Xxnz{@W zj8nvr&lye{f=@DSI-v2z$X-M7n$E!n4)!CVF`4Z(U6a$~SVS?;qqSaD(p>pjQzdu4JsTg@U%I4ii9CMcHwoe^X&G8&3{$ zF`)db>47?UMElO30+hHu@uj>0F@o}0#*Vv&wnK{hS#6s+N^v8mP(nOM9zKuDzG1@& z7|by*yUmZe#6nH772bZzn1{V#4C)YO89Eb?2s@S%ULD#E?2*Q{j5YQ{n2 z8Dki2OBn^%#!1w~V(nb#`4@DNq25J4&fozod6Tv+g(v?A`%{Mtl9pk>-!*A5{Nfm@ zAL{~pO9th0I>mJh{e)534eNV(xiN7V7m^y#OVIqHkWB%-p|Ov*6ijV#p+ALA{kj_4 z&wFfDu3A#;@@o3;;@#-xrbUcmHQVZ2~e1@uj-FCpa$^ z?-udJyjr71u-0vd)vx*;KEU8lz9!D?^nG$!POp+e=zEwCwWe;2vadhApBv`sF-53P zJ?R(Ki<~~EpK;r@a6{Zw@GaTqdc{obY2{Rb{eaGyXlY5&P5 zcLN&bjV>u_=u;i=6>TZ6#lW#=n^WC18&4GNgHBrGUQpd6B{ZBZ>+2FD9DUhCcL=Lt zh64=-1uje!z2mFu!W}5YQ(etoNe?K9=!-o*=)A2NFY7{9fF4S?Fdqy-)PPW33jqE( zHSZr}t`Az%@0j`z?=+X{%Rly#PQ7@Sem{x8l%28QC@urA{_oRJ%E;TlsF_V?zCePa z@Ef9xh7OAQ<1_eo8?>GSb9C6-@8KY|W76_P*pXhO-(fJ>V0@TOp@lY85>=g< zmxLtLl{2s;vo46U6zNp9q#^|3HheWaH4=gdXKww#E8)za`wKADU7fQ_j^H7e^wkWzS79A$L%~~?0;;-$EBEE1hi!RE{(pp zj)QpzzU#LPKtJ9|JwAMYdoA|;Xofe-a7NykJ#cETcQZD}#xq+T;&XI>K&EvwYp>VW zW~wrsv*S

K}017#3))FN4nl^fEdeIfb!vJHa<|R&4r&-63?_^dY#< z2YNNqXCg}1rYYFGS^xR_dhiAR$K;}WMXVuBj8gX2ofztiKvGD#d+(K~np>HS3UT*XUXp;nu( zfm(DmX}W(eC2*MS$%v3>eiyK9hu(9|h&?`aT0drSDYPy>KR~6(q_ZL*?pIy^`59_y zQsGHJuKtBa*i&cB#&^43lQpfB2r3c*hn9!MKcoV=+(zm=F(C`F^=QaUm<2Y4OSLxhe(t5c!sk*YZYGAY55agABJ_{O{@6u3qQ3XX} zzIZrx^YD_5V=K*(?eRQl$;7!PnZ&8zYn8NdsFNHWM*(4r7(&Q8GbVr3H1~0saHqBNky@xox2L%+W&zT&zk#2-#o_KO61Gu)tsqV}Z z*K~VBS`x=P5hF)`r0x-#(p?4bk9}+0+nfn~QUzQ*h_hp#211@e^kUa{>~4+UYLnit z#17nB26QnF{31JQG2HhZpV=vi(^M)wxhIpSM=i#}uY&4szwI85V$m0}iMgM1CtRmf z0uttuC{!W0p6yA&69u=B?ej4B`k$GXZ26c53C!bZ(ntf>**+P+XJkrq<9iDDp#QEC zy#TtW^+_ns0lcK_LqDKTx! z-ve+HU{EH!T?_mgQ@Y&`K8d8`>Zcxi5D}Zpi_~k-c74WqkC(Zg>-l3#+nspxdy;Kd zY<-oLo8y>)kNey~xX15x23oU_lrBW}0APjoM}tW6ng-i19x}4^SF3DP>vxz{@roOl z^;|QRFJpJ{_evoUZB~#t)VtZ{SyfztuIJhW)Vh|Qqvn`DnEYp`cPSa=o_~mLTIVuZ z_4gujL;W;~yKi0DRHb*e;_cUVE?cU0ePrDRzk3fw``lE7dyxL<#6V@X59wpFodoP| zpqnFV?Dpw^0y@;2Bf*=Ns`#t9$PxK1#?NYlZAe_Es`a19Cbb@r2qW}H{KfNk*IvJe zt@qDQ-f@iYQXa(BhnK#Wcl3<6*yzf%Z9dmwwtHkMe`WcsOZsNScxkYb$~axe>S!mb&sW;9s8|z6TU3SXhF91w~m>WiDo##%%PcUQjFh_RfArrnP)EprCJh_kL zYshFUzqKH{M}E~RKt2`jbw;^GOhd*aPHHzw`OK?rQ0~q`t4|s2p#4}iw}udb<|lNz zM!*TRNUGyOm)y}FoO3qDIY9aRDsl<1w&**){lNkCv?^M(HTHCF8Mja)gAM#JLnYo$ zBVK`FYNq^oO+;Ju9@o#8k-+a!3)azU1@%%uxPqAab<`Ux3}F27^=c{EEy|r8;F-C; zrdXr$xSfSU$-hh=8sJGPRGt<&FE?{bacP(kk-e0U=Y{(@D-m$xFs_CaQouttOee;A zViGmwXvD&5p1_o&&Eb?cssvp8DP3LRizJ^5AMF!Rf0*JqAf)p(IuJ_ATfb;gIVqfX z-6hJ{R?|~8E}l(OP$exU_^Gewh9vNfjFv27)X{rrC7hwwz=>+B^*fe~W+;7wTnU$n*HOsNTiAU)UyzN zKMyG!%JgIjc{s|f+@JyV8*{w+q%14=qH41h5?99gB`E#*6fPbPDPod`59o~IZ{BTe zk>jtfW>~^MvwcZoVm|B;kQk}UmkKxcAaYx!G?GjiJYW=0iiGM*zAx#B{U%Ct9UpET zNr|x6q!i3upjC?SzNhH6m4P@^@VTcHghE?~LMP@kj`I|nOv?gj*Zib?q=$3%ZS{hi zUTzzGJfSd|>5jm zZL3I>y6u%|%%;5D`l!3OQX5Q3c%t7OhLjhzp=UA9z;=uGPF$n9Uz}~&DjQ!h57hJi62e&)2%?6g|Mx~NBERn|7e*PU#$O63^=l{{aJ z@6ZEV5YfWg?$nCW#cB!zb5dg%Og}zRd8#P?Q~m7)+{+GBfu*UaH?T8c2~N=wS$}!< z!LeO+j)YMcnQgn9DYS3xbzgr?*{cUMJ2Ni#!_)(8txN|-?+g0>aiRZ(g_=M$x(k5+ zLqNkO)m^fuAy2_m08<+4s^}sp0^|W9DDhd?;u7KNW9A5Q ziJLrp@VA_wfv-DF&7dfK=BzO(fG0+8jPTK{dE|F<+C=TM z_`SGulCPb2AGtrFk4`!V)og4AU8#tBra|YM9VxB^-=oe+cmcXTLQXE-wVpBq+9V@6 zP9|&tlpEV8y(n4N-`H8X=6vWkhV!^x5G1xDQEFoNAMn6b6Zd>hzPk6{uIW9iSMTZR>S|eAWA|sxFU{zwb?6*;ZX^-qyB#aU zH=f}c(X&l7hi-8^pctM@@uB%hGR*hCD%J6TQ`|%EMLU%fZ)bi6P^L)e*J~it`;RW_ zKtzh%Hj+r%0W-FrM#kYg7qMj-*v${WSAnLbxFs#AL)Gz!Kax_ZUmi+mU*(jhq&b;g z$ny2Ar?HEn^Rt}v*P{PWj##G2Uz+es*E`VDHm)O)maD)yYssg1*IXzR4#B^Y}cYC)*g|qz6mXj>l}RT3J1nS ze>C{p&^kqp!LeMJ6gdouYQ1yQX`s2n9Z>E%Ynh~-?nE@QwJf{ z97qhO>Bzx!U&jQi%z`4zIg33sj3x4RUxTMZ*c-|95|wF(Eni>TgPFfW#&XGO6Y&8{ z0DG9l0ir!NLPv^QYO~7buD1%8DrTzs^8fzH#Bj_m2Qk6GL{g1nAXPyCBenat4}a!8 z%2WUxoLC7OgjwI1o#v3HAx6&zgQ+cfOBBJKsE zd$dMp{?gWdKy9yc*ei+vht;|%nfUR9^Iophhl#5lF?9>JvE4VY#;D_1$5L|j`!CyQ z;f5`SZz?e6Hv7M6qg+d}x))9}nYg;pO70H6n?b9}7%K-!7NYeKfk377Bz#Ta- z*&xwUh5p#1blAwRheZny27RTDDUjQ7idJY#8cCvyN{bX26Q!BABAi!oB0+ir`qmuQ zp;U#D+f)kSS|N4tKV>_jonAw){yMzRwlIo8bI`SP1zJ~0^jZVui==92UDY#6AoWY-D@cIU5HB+1dsb}3<+Kjt^AZZH z_j}~^jxf6OB8Oc1m$dKwq=-4qhW(d0^s?O3`dCq%uBG^HzXF?oQgt#j0Hou ztU$iEjx-BQ?4fimS&r=(;ZvDP^#`%^An!Eq}N~LfCDxLPiZQJ%DKG1ZVX*o8C32p6}Wxlv{)Q0~pO}^@4Fmyp8 z_2f>u9Z?kOSxO%R9)ln%u_lk6^Ce9|a~3p`9+`mrI@(rkAf6dy{#Hb&!uqiDOe^NNCnO3nFWSwFCoEg|(pSzIC=XD0 z2_^4l#k{>MUqOlG+sQ(5lbogJ_k4}iS!>TVxhGrO%6$Pn90SB2d#u8#JifFNwNTMM zCI6YqlkCG+BT^x=hr=<3_QZ?1KMvU!`98|cNRVjdQs~o+69W5>H_>R*XYTIKsS67mF{`eGRW7d+` zExk4O$2q%OUXdj^js~no4dYD zeAv51N_zY$Uu5BL=eb3Zzh-H<%;Ax%w}I!RiizW$8kd?k+cDpreoS}ieAFHK{9Qh{ zgScxLberwT$%HMP(k&*USfCw9$@m%oe2X^-Rn#4dlF;@VG<8oO&0Y(`kRhZV8$5WD zsh-Rx{mCW8`(T>w{{?H+Dyn3&LZTvF)Aa@KjnK_nk5kpMF)d-DMaujpYV)cnx|$!8 z&E3n__%~IpN=Z?H;qjgA3zAugXZM(mFDw9!gNR2MIFO5T5eg%6fhSW)1!DMJ*^WCGtJHbvt(I}I8z zbb1cd79hwM4Eq(nq|j&GalJ_t_MF^tzwpgh?Q5C2NUlx_xBXf>=_hlhU~FaZ{%X?+ z>Mwb557!?Z>~VWRdBYh3nNpOUL1S6&EJ8J>8_5+uD$Uu+ry!078!t~HACJDi-!sa& zg-AP+1ZEex(47U(r`5a*F=Hv_Rq4r?%7>2&V=JzQ4p+-tmR9{TX}|bL4}5}vB@6$0 z%%9OPOQY449usEmw?oU=RK&c)3OuSOL<#ZhkYDI&{U*KV42(Mh!Iib~MZ06@c1oHh zGS5+El1q}Jr$iGX&|lx9MAGJz-BRQrrty6SLl|VrOm8zt%_{ zmO}*IHR=r(|G@@%#hT&r!W-e_mS6K{AKgN9s1efO8G`8n5POI$zE`^=P{-Qzs<0KO z)>SUxx!>T`OC3tg^@ugcpbg0|nctvir`~9X>$r%TO6~Jk=c>}0X%HRmvl-M}uK;Ve zzxDdo(-Ntt_NjsTf!?G!JNN}p^)D zY2ZSqq-o34LMQgZ>t>q2UlGx$vLKxORsnA zuyV;ag^O4I6hqW~`bE1cZQZ5T{Q72Rb1%Oke6yoXvt^^FLJN3hI#zl7)|#IeojM$P zr<$PY5%}NKN!mxYNVpo5?PSMJ&HU*Owi0;1L35WHDb#KT^gL|7J2A%6C08qvM(j*0 z0Tzqmd>NBUU7W1&;Nxq^bq}{8f0pzU8yTyYmUIeR zD2=915z>Z~rM}DqvR66q$%C8tkMHS}X<|V7AK)^e{k!mXHYLuLqc3=66fHHbIQAmX zD-H#`qVUD8wfcU)lde0oH0(QL#3vtG8Fk#hDBo8WbD1AOMK<(SN{|1}ti8CKH&Thk3L-vnE5KG%=Y_!c1u zAK>%cuO1$^!_}Z|j2K$X6GUB)CW)V`u{3S-7MC)^>^|BMXbWRC}Z7We3-HZFR+>1$t z`muh=C*>Z^EQ=_Tkc`?1@nnlGp@?Vnlu~gZkn>&SvhS!)ce}`~&uY|G>D+W|@JN>L)ava2SOEYT{Hf!Sf;{kQ89{9Pj zPcNrJNPecRU^92|IkQKU&Z)YUn5-xCmse=1!0-(Pw|eox4$zIHS} z^8gAJ=e(1C$_+lFdK_KlDqN8XLt?*cV|Q2Iwme4=zE|p`^=8&xUDkuHNPr{dj(ZsuP{ncKh_rdkwVe9P@= z5o@Yus1-Ys2-ZOGWg-Ps%?lJ7nLfI@m22liWf7}@)I4IsK5~WOr3p$SPm)O7x93{z zm%f26&})k#?psG*=kuh_@fZ@g9B%)d3h;xZ1Ps3)9kD7V(QkE^+cF)LpNdc3*ZgJ4 zDP7%@P^-E!zxiqfsi7B1jq{@MthlB43T0jHL&IrayZWsBT2cvG!S9w^)pX&RmdGn$ z=q8-6eDkmMKc;>3sDvWGGo+&w!sL>Xpvl$Ry3kGs>Y*@)Xn>=!PZGHML#J7F3FyUS$-@+`a={de%=Lnc)j^4ohi#Nvdc?K6r?-%oN}3 z@f2%}rZLsnnH7OXwh%6DzKRE>hkC@n{wBkw@`}$i%K&U@G(E-YG!vF4@wBPu}mK#spcn=p&nMk!aBkKNt^W zHxKfyA~V%r+@=ib<+9`>l=vG-Aw#xfrVZV2Ri(Qb(7Tq3Ic!at>witg-RZ0tTbt>; zBdd#9*R^kM^me9pb?rW_7s6KU&CFG)oc@M0J@X08;8pok2Td&rv%gh8Zb`S?hKh&2 zS{H`4BzKTz#-0 zhbr3R{HU~)Vg zM!ZjUZ$<~gZo6Cz&t@@UOtY=o7x*zgs^Nek|Si^#;qJJ^L_ed`@?YM?3&wW@PNF^V?#{i5TQHHeAf(Ko=w+ih{+@sT1 zBAqlm9&e741ubsMTY-b=*Wtvx&|&CslM^#p^U`R8{5zQweqE6urr zp!f&EqS_oJ^>fpT^m#FWgmR_Rw>0B6dU22s;P}rjM;m`TkKg!t5+fUKDi@Q$0j%FZ z%80+W%a`D*Gk@>=%Nxd>=HD~ zAEUuSQVMrt-vPNgY@#b=*mqMq?p}O{{)!>Ie)O(U1=3TtF*eS`PPwE!i;0R@$O`UR z*|;kV+}WcYeLv>G#p`16bVM8$tx9UU+x_kEax4rxEyl$>C?XXn;z=qE%M8&k8$mis z-OLrNl8N&5q}T4zWnJMb;$zUOk{)O{iB}q%7X@YcRc8ILarrO|P)L+yW+)r(p3CEa z&d`ILvV}Xzc1i8V@eANWsA8?7Ru?V(=bEHY6K%qv@+aY7r1`i+%6RrUx%D>&?x%x6 zj;F|1{#E%}97XY**TS^-T%SKAbTa~i)CXwZ9bxYWz1<#hGuOKbbA?$2i*}%sZ|TRd z^5U9%kNBCP8(`2IQs=IU4DOQ!p9-ZE{ZFPfJ8?tEAO=*fTVp|!5oG$; zF{wDBcgeM#OQP1X9&6~LK)RL1F^y4CJ?7fheHt-_NE=T#?o-IFy^_|!G#qkjW=Vw{ z`Pg;8m>;--u$)aXf2jCanbJTya|66`9`jJ*8h>|a;wVpc<_Rf|A(G^jS0GS|H+;Pf zi_Ij~bn_qAlsGrQ6}vH{_iA|hu?JywQOWH@qU)fm*qRgIZyq?5!o8PDobXb3l71w+ z-rfbSZ{^2p1@a1nQf!DO>?OsTv|hP<>$$q&;gBT-tB&dVIaNb5axVeeMCZG@sS50^ ziK0gs8Tx})iYQ4*OX`_GD14>H;F9G9!Cg-(3Dbf4B#L2qX#k~HamG6=kvT#-@olUZ zwvG{599t+#M?pA`IUFG`HWnfn1Z#DO!$CfWz2c z$X74cSu_LpfSmQ|BjO!U1>_w=tw2AqqBQZ+q4S%+!{|oN1FYj(R>BC*qP@bey{MB| zCspp2>J2g8oHqz6wE`92YjEW($n@gKb;7#Z>}GJL5@iZ6=Ip~6tt4YrWs7VDa}G%8 zbKX&BdgmeU*YW}z9eJdu4N+Uu_6!krPe>3BgL)y$6LC*C-`No;m4bq{VUldb+3u@M z2eHtrA5j{pO#GVd19pkZlf93?v+PS>Hqzzh&l$&3IhEnB|; zchE@x)4#Z2XeX=vgosN;<3Nx|Rni0?r(O~uBDDzr2DJTy5sCy*{Zo3eiU-L5zl z2MqnQz%>EraQ~G)wF0{Tz3UkY82o2tcmqcMS#6zwhktmRgMjsaA{`iX^mjF%bhY49 zSuLQ2|Kr<&(hHdU2mQJTsD=Iyx@H{!{Vyib*#LuofY?TWDcJu?4@&``E3Tj6ZTUG4 zn1c8(5*$%-zb!rk4V@al3;zE#&d~+n{f`1_8o>IW)tU%U|5w|29^l(Q0Z6##!y@a{aHjz2y7|k;ZRcZun_g^v zlqTgY$4b)rOfQ456lO3KBWDA`BN#XH<6IX`vde0T+v;Ogd5L+wbvi4Dxc$!z>s*WS z^pcF~48O|q66?$-zpY2YZHQEa<)e@3{jA%ZN54(Wt*IzxKesFCFFGa@-x5eOCEc@k zK{PqX%O%3P#tnR!?qR?;`87z9+>tBKfshy?-Im?mht{>D=BF9U)rE=inH|*g_Cuei8!hIq}MPo61t0QmfZu z;pQjdC8mC!!FW$!Nk@>@Ds#cETuRXfk{-{aH7~x$Qjp14iv108%UHqM@p}|sou&)sYd=0VRR7&Km9h6Sz&?Zk+P_?2{ zor`~zJ6`^|LBt{Rmh*Cc@vu6~9#g`i>a1{|eqnzh`lA`w~-<*THMY)-q#h$L<>7SU#W|(Jf8*YsT zi*J7q@3E|Z^nkZhm!Fa>+qC-D(juyc|I1v5jSE`e_$eCOWBHHaSrG(X zl8isYd{x$`lA~_&eoZPS2r}*4nH&N+%K2u31qCrEN*?hT(w_y?!U8INiXDa)a%oO z8&4_hynpLxpfeF%Dk`{QW4~v_WmlF<7IFd?RESjF8GLGkOO5Bc^6^`iP-^fT;#~9z zD3=yx)=$%Ke*RtNHvEeE0HOtE({WGV!N9L=oJ-bKm(Lv8GgKu$E^JCt{UT67aVd-e z+84~H5$3I+_wzgPquL$Mn>CfY^~k^UGuj^Eq)do#lC0$@=yCwXsJX#CH9hwqmdrfVDrv%)gXrVO)mP9iU}Zjz$jWRQ6c~SxyG|~r1pZ>21L+nWiMxSW#wNpt zv?X@#&zHwATsF_0KR(q-T;SdUByTSiZYgG;s58`WV8b0^$M8clKA9 z#8SrlKq^@=HAzpL0u|nJwhO-`Bal7xMTtr}5%4=gf#2IuWH94#c*GO1ED7`A%nsq} z7t9yCuCN%gt-6R)a7XhjmbeLel%lEG+OD6|b^FPd(*KbuiRL0-$G^%l3tsXOGbpRg zfEL2<f`n&O4^Wocx`dZEYnYtp zu1PaCrMRtK8x&e*s^zppe2f=1v$(gyT5SFi!bX8@|A?9 z`AGf|8FNa-Hyx=wR=_*FsMq?Q=FYuQINPN{b`e$W6Erh1f!ClZ+l&2p+L%ck@ZOse zt1-NR&7;b;2?~lXTj>~p4V9C^+H|U96G0Iun-{xd83bFbg6nOJi%9q)-qd-?{tMR) zg<3$=$JINjJ&#hb5U<;2jDhJD>Ln^UPpgVKuj|fe@jFOR7tl7TkmL<5Qw|#T8}x zgeWDrB^8;P21FE3?+^thIQkr0gJQBvut~S`4W)iPQO*zjvs@D5yC{I}$zP9R9MB z6YBiAcG?v+!9}}Gi1LTOLF<=sY}I(Sz|9t5;QMFpls~m>9e)YXvu0(!yDURvep8qX zt^pN5e4u2%OMi&ot7+)#c6-Z;ou{|D6i zwL# zvzHMBuOGuvZcMwBGn?RK^rJ?0CaR#ku7+kWM%YjbUKg%vi2O_qYhS|o-+eV=)rpKu zq}VPuDoit;cv+J??IsHb>E;wyE`lO^7;a1l^=ayAg=Ym=6$bcb&^@1bm-$rJb!;0w z`wA2|Yi*#};P`51+P>5G0l05|DyWh1Dw|65K=ZT(YsyT0Ccq&)c`dw9;miTK8x6&} zs}WVqVqzc_p?0=U)6y`ChqEd{txcVtpUZD^>Qy>tPf_3Ml=NHKn_$Gi4s*IT6Oc_P zj)-mae_mYmP`yvXUYd9|Qh=>ope=6wPcvgpPNP+*?#MbsXfTK z0F;u9U$Z*nvoE#iKLU_-A-}YX4)*JH!=4c0_ttItH1F)Iujk)#g-*|cn%n${B<&lj z8Y{lgbIXSHwI~Sc?tOFJ9NQAsBf$J-#ts9fuBiq|0sqz z|HrchAqeA{%5YGPZ+Nu~glRdgbBvm^^YQ&>kl?uN2;r1|qzcr#(N1L)UrXFGgvQOuu5STG<KQS~8Uik2_f(@&QNF zQ^ZfeGdAS4nZ==RnB*ichtgx_4;)NT4XsY{1Rhgxy4Xy z8s_S+cQ5l@QrCz8genl1`}>)8C|n_8aULi%f3))3h592NRCN8#g%JAw=ia?@VN)jD7dYky+v?^ zA@=Z{(K`Bu1CZY_aA|*w?Ja7Mj6kn?`!Ya=$A+D@3Dk`r@F70IzA6@fA+>UW>rF@Gn^U7-&4#`n7G!P--ZPh>?J;5~j^bz!M#oDf;QV zUj@{aPi8%LS7?x6%3`L{QqVVvvPSBP_*~w4N49NxB z@L2cyj{99GjlRls_gmex1%-}`OC3oblHTu-+F2=;g0u?gElziFSpl@`Uy3796-3P^t=6USvGP4M7~u&WaB8;3R~1yt%? zd#KFGOEo!a$({KUW2FM;so(&l@j*NJBzAdX>sVE_a2ffmqNwD8ic6L;DUx5LQ=W#T zpt`2QjY$*}#T@nO5{RgU0v!y_b}e$7osQu~`1i5_$9y^hZE_4=czjA^XSU!CDz`!d z93;s5DE_FuBDtRiIHj<^n`ptY?M+pgziIM9!K-fWY^%uIg{p=p&q~@a zSVS_m^N5kI$+%2lY9F@y@s%DSrn)BUf#!-3rh60UdPbI&x1b7ti{Fy|t%QYv6bZAE z5d0$a!#r$9uR+YkqFD%a%H6UB&`i*GCj5X_|j&B5$Syp-0YX z?v2PkMzXHCZPm%=N{6c@kKo}ZU?kp)ou^Lnmz5JeySzHm!o7pqUj2v-^6Egf0f>Pv zW)&58#JUCj30He7O^*=?u-Zv8UOR?Y%JFVERWrU(7RhoCl|eKd>&}mR^E&=S$~sg| zN1#cMIRsz`Nza=SBh#;c%FNR-T&VCkB=Xqt2?h)Y82N^|WigvC!wGlVHBQYl;(k~I zSE@OL#4^Rrk^o5MB^`Ag#o{Z;@y0emIWxxL^HaD;B%!@!@v)_!&f?{H_+}HE#NL?jEaP1 zR0k>Z&SDuo;X!L<^)Q;9bD65W{0u2L`Q4ovLj`u~G?>N8Zn=VsriVQS2KsjG!q5_; z8+3Ck@?kj!l@8F+nj{!ehNh4<^5R)WgV*%bQNwj?sUJHqyhLD_IsJ=^cxxBOFUGd0 z${Fxuj^ov8dfnMC5Slpf{TtTtY^;~mW&RYub})+D&K|FJud8noqlvbCk%83guswG& zYyRfiu1DsH@86FjavZU1BGAuGWnAX*a{P}at7kaOl~S>n4X$LuJfn8gvsl7h6{ z2gw(7DgkDzJ36nCkVy;wK2Jd#Ff7MHYIjonzNIgP6~xt1QPSn33C)d}4t}zxU%xdV zE@2E<%p1uXlFCJ=L0fL%D%X*gWHzuErJ#?Uw8fEN`ETd$;-T}KeE}_&2@+dfX&+h! zSCNS$zobxmt;7j4G!S4{$x!TTZ8Zqj_P3JFe7u}) zE(Gz_O%#lKXss1ejF$q+`!25I-NnhY{L5ndV$GFN*VLHEAE(nxhPBEfm`WCxEhQu& z{3#?e(TP`IQ&;(`)<7uM_osZ~+#>EFFKeH3{+JwB$;Cy=w!P;sr0mS!Hnd#+i2Usx zpM2L(-*HGtU#l~fGPP!ndrl%!)d8LU#+Y>yxCr;@uGgL6?z3z%N>3p)zQlfSm~9-? zijX%OFg!#z3O4rpt>p=|F1C;GXg*s{r<5==Xqb*of`%oR=m)xJmW=aRjAz$qz-F~4 zvb_Jc?;t6&w#a0=!)po!aUKoI9Rs!^m8S7+NvuSkC9l zWdu4?|K3;;9t~|u9OBKJXL8T@<1hVnEpVNCu#L)P9m)!S(|&SI=?#&keC)Ku+7|xM zeHJw706b(lz*^IPC@nX_p=>`3D<}O}5eO?Yf`oaT@7(3#oW)v_ztwm4R42^+sG@%_ zKY4Y~aS4y)-oGq0S2Q-{J5YgkA1lN<(GgKUk-@Dk8M4tcpubWzIFE#s=*|7ZRn<-8 zeQnRb0p7MD&3?>O)k<)AnU8U7P}Po7*$tBAbQQ{$>%dA)G1UYRF;8I}1(9P|m47BL zg^iWV_q~>PMl-@zPH5HAgLtvE`rfLhSK`^KtcOgT@RUNS^6daCK4O2{r2gLIlqaU1 z!?{>8JtM8cIKUfRE3I%4pYbAja=5`e56Zczb=bs{wmAiH3sEwc#Vw;clWuX+FBY_W zcyXM+&@r0M?WV(>9UT^`pA^PRPy|+@(BLtDxXUwkTr#lF80#_QF~2Bq=q8N=U3W(6 zhUzvSJJ9$Ig~gBpwBiQKOcIL44-xewSUf{)wNU7ac^*P}28k4BJmh~>4X8v`q9iI> zxGUN{&~ZY4#axO!71p3k(sQ9Fwgp*)pAI3BTA`Uo5)8@9uyaRc4l&9!XAV`TXxm|T zI8oRA)p5>jC0ak*t8Kek3!r`Gi#jt@iIn8KH?Xqrl%!_EZB;Ft=e(gY@DKIF*mpG0 z9(Ln)PwkijtDM^Sx}`TSkvg3XtPZO=DIs{kTr0+w(GS7@k}zQiN)?S}sRLQEyog1= z!=8E8Z1u8@(O!W4a2ZB)W*4f0&6ri3L5v~=5YA=0rWX?*4|ai>Fa6<yh;x zNqAR}_xoaDkV@^mPHFy^e}zOqT+=ZPXfLz@jwUv@bzE@iKL3b3Prh*nNoz{E(WTP9 z5%2KxaBfmPjH|Wr?N0nB`7{V?Ni0l1HYg8z&PPOPktxHHS%ycv*1>5=`p|V=F`XU# zVg7VT!M6RDw98mNRpHm~BsNdOf>e=J`k8c+dGQyxwm+6?!a`x#oygTM&>Z_n6~%@> z2srTX2yBYCR090J9?kJxX@S)2>;U=IN#qxYa#Ck{GFXq{K4Y{ImzJPEZf}TPQzm7d z9Vqm6%O5V+`p!b)+XX}>EuLT|w4`Fbiu|xdS_=0wBWrzAI&>H)5n*GqwW^0zU-N$Q zC6~7NNq~iugcP5Lel1&ubKA>b1Z;Ue>&+&FoKMJHW z%@i=VT1M0IW=yXkIekDVqkdocZD_41Ve58I()yoKpD#m2eGNq>xsGUB z@0U66(iIX9Y(8Y=%h0#UA-Lyh)sl&e$Zyt6UjymMD#IjxeB%bmXUuV@ImQm-@aiM4 zbruXpi+7ZUVMN|BDXfkhwK6g!7L@*EnYlJdehU(@(!2fa=pIBYo~uEO~p7rN{sx3 zKE^x7i+G$t*VL1I=`27@6(A>%skH5Ar6M;Kxu#eua;OoSBxv_ibuOX*mFyMJ0t-AS zaNWKW#qrS_tNHEVaBd=WG532zyJjD;D{R2iiIQ-es0_51NIP)sOnHCRrrn|(N#B?3 z8qXZubUpOlT~)=o-9`R*jS}_OwfYvzLd_{W=T5kzAz~kpyb=+USpmdSQAdq^QJdkTT(F}uJ}Tb3?%c1Ejc0A z9_cyk@;eN8h9BKAh39TlzVhST%IfvkUa|RS$EDIu zH=q&;IA#6KyHR+`;P4OM7c#mbv)*N$m6z6&{x%5mk2b&Z7LOoy4xl14bdC(#{ag-J zp;M-xdxneFry~ygTfHAOh_M|PWb;gTO>qgGI&}!Njl1WJ9hn4m+D+Vy$@JB`Q$HzdMmBQ{F4DgwVkr-dq~b%U z#i2DZkEZ-pXxzlz#!#7y9fXV`P>vJJX}S+GXZTRHo>JqTl;sqJyz^5SGMtHIi(!^M zOBP|p2g5>OM0o}VUn9TG-ozvHAs-*3R@QULtxRj8IRDVY{$WI|wJsk|J<2$34;J8> ztJ?9@4x!7vwLH{c>_EBg@`?Yr@$ib%IWH3LW?a9)6NGl* zO}4m!0futV{p^fLxv_SIa12GuQb6hqnc8MAOWttB=APp{%a>irt8B$W%{=x_a%^!T z*cdp!gAKDn$(4w6i6`Ex+r77Tf?KM@d~l{fv7A9a5Z{fjz>M6A+zQ-kYE*eO=!Dc} zEN0x*zb0-KNSwj}p@JyVX;wf(xke`{ha0=oxa4ls^E&gdDJs4)%;?1Odn0Byk-43E z7$D=At?yV@=Jh;v_dQ96dsTtX%Zb_b-OYCu&^*#Ht_Oj?K8CiKuUlI3bbHZ;-J*h3 zVbr`6CIh^{3x-8AMx(aTaOTVmQ1cg=8Y+}MK2Sf@WDe2)4)sVG%|C*M0E;EXDQwjH zml&f#;wQaS3irGEe>Qy3c$L1(oJirBl|ON__WIEX;?uWsgI`pOY@1PW^?1c;WD42(UTUc`yAg8%hYH{Ezlw^LWDGJm~0qiq_>0E^x; zMP>IiDH}5&5Oe~Ahd&hdM&<^on*P*YA-X90XYf?(W_9D#$Zl{lO^?_6Ol?SDpum}m zWmv5+cPdgUPM@F&P8-a*tG=9cmTDYn>xb~CvkO%8A4_*eMlLj!Y(;(Q2suTzi7P_41fjXyfoGdhLg%hjzH=Jw@vDDqZsz52y#l7bd%zda zAQ!6r$vd(p7|$cRvpp$#{9{*SctomoDIV#@q*8wC$)?}Sek?jw=-7|Tyt{XdKA1)y zxKrGj!2}taI&cY!TAIVUvevwBp(W1i7%bgo=O-$lS04a<2mfn!%{vU0XCA?9#tvYC z>Re3Cb4Q|!{pbUvqnS{x`20-Q$1txTS01h>AuGfcbzmLFRs^%`R`K4TU(mX+F|A)A zY=+8o*pRQgNU$$&Mm%MjZ_hNzw8_lBuvm?4CNiB+hM6>JDyut4IQ{tl)8G7e%~`UA zHyLK--#Lzi%1>?1&x}q@h^e0$o!C>#5HMOS(qWik{yXLI!*hZCQ5X#DBK3c%YB*Ab zxezf@m7ow|Qm=Ah0H6on$IY=!IfDf0Q82M(ZZYgHQE2^NP$8higwel)V^NJ!L{p@v zK?lk-MJ^UQRO>ib7SmmP=|>eFs#ZEbtXZ(Jt=6bqu(8*N-xoUS=1v^T$$R_gS?K(` z*)h@fnBz0$k-{zLVfV2I=2TBU4;C0tY*#kL?%IFqD5yA7(esh=RAs!n&k$v8-? zzkS*nHxiRCMnFx1Lk<@SuYTZWyjf6Rd@7G>gbQ(dFF9Kk&NlS;vGK=odE0Tc=GyUU z$?UXw=w%EMhlgwtEEUe#=*wg^?4kvCO)l44*4ekVl%531X1FW$my^u0MB&fe-|oqm zdY}jXHg+(6I3ecrm58E1P7{g(V8C?=nJ%fUS<$ubkJ+NV`Gn~N^ z8zx@?&!zT+5G1%70B_JK>F@I$&ia+BCUi_s*-$#^`qmYLjTECVf8^_*+h&)&2r9FI zh(RoGHw93sHulxt7?qs0j~s>&oC_k)O0YExk+JV%RF>hAo^GdqVh*vJ#%6lfg^jI2 zu5rIyT1dPWR$2M%n(;Y~z5VLRf|uWUq}K^%Fu3JkuBUoiU$=!7%2WLBM=xd6IFq4m zRFkGu3RRAyTnCacLDr*{kiq8KT{Xy26=P^~*Yg3qLDQs6Y@>?UQ^yKOF z;pst0JR8AmS|Kduf7KU2m2YnLU2#qA++0sK8E>+csMsZL#Ce6jr(&tzf2Ub?duv^k`4aoHwBb2Vb2kmgWm9Q0&p$xmoUrL{+9(z&K#cFgVt5?CeGL=ixH#?3`DS(yUK&3xuC$eJj2xMD;Nix55gA^AM%6ueHFG^^ zJA;CDu{DP4n08m{f34%V`Ya&3E&ILdLLSPf4Ge`L*r&f9MPPRtjj;t|!2eat<~auW zw)O^)q&bmY8mO#YXzPmFrp{~&mGaJPGs7=paW4ICHKNzE>!qZ6MP)j7ZUIh@?P|OQ z;}iwN`k>gVOx;&K-1^4IogO%afD5th$h1}@nw=}SVl3Ifobe5w*k5tOWJ*(VS}?cBmcDSKopbjpBDMZ# z>gNic?VA5yS42MVzTq~Fp}T@=WumQsxsKR^>r@HX(l>2&?=xV5Pp<|0YfRh1ekCe&ZJ|Ey$A`cHyV@!#~?H5Y4_ixJ%z07j0kQWq0E0E!Jqyu^gGVxQOnY`~{ zS~?znihs}(w9F*YtPnPu>IQ;4c8KTh2ZtxVyYkfg@Gs~T?L!A4B}2Q(Pxykvlt1>p z!SMIG9QV~c_YSlE_6w+mr4)dxof2~es_NfYpv)^^5QpkF{xrs_uOe$DQyP=yZnIq9 zsBwn^U4{z41j{WWFhYsGEM@J35S8fkuCQ zqpg=!E=Y#wO!zhY#?k}@RmF@BSY6NKcfT{?_x#TAHO|}AVf3@@1QBD{oP<}X=R zQnse3VBWmKe3HG~;uUz+fY(fT9sWRE+@`xU<#aj~Lt{FvX{+bWW1RaY!pJTbNbhKP zd0g-Yyv2a@ZEjd#A=0(*XA|CmzgT~2y(CcM&#!9=G?5Ni+2xYA>#@fLx1^C@_mL-@M^ADQqm{DT&`m-@6dMyzg*Y;A{BCfd86sguC&ywa5$B)Yzsdak-x>QzvXG9y6hp;0VOl2OEoO8z--%*$?ZA z)&+Kf%}x|1N^a$>pMA*`2f!-I% z*)PGliW%(<9KfWfgk{NMel(CD4Pv>sctQao0`w9r#3B5kfFHbpL-~KfATA9zaRk@J z3SOL1+;VidGpf2C$FllhI|#?~%AG(gN-r&IWC2bvF#HJgIkjE-S5dNnn?9J5TE zh}o9AEiBDWie`cpD+=a!BfD%FVao>>PQu9sPBC#Ro`f)}*A~{Xv(Q@jNlscj1lT1e zwL8(EG(0x^98V@_h|_-%PHBhp+SAxI(raHQ4s&safiq2t8h{Jqb zWMTm>Cb|QpJA7o7Aq;FM?+Wbav>1iB#K0mGm$KYT?p%d9ZJmFwvB1tR0Oo{dJAa4cgbu zwn|}7s!cmUX7ub|Y0m)HA}siB{PQln27kf~e;qmi;IWe~LF6xXr|ySnOo< zW4}m31{!}CP~9cLN`EZgg0~uYn+fOP&&ZbSsh^5qT~(mExxos)P*02_XjiB9$SqyB zn!yAA+{Eqp3*wm5R^+cBV)54=_u&1!eGjl$?f`!ZCzKKx#)nMYX$jD}rUn+EakvW? z8Td#$|1Ui^a8Ee25bk1ZKDUX(-MH7p7Cu+(OgYuRiP6q}6Ax&CO^;6J2alQfc=$mX zKX}5#C&Ld`F|#~v;xqV5+I!MPwp6izlzw~I#9!gFw%^fmV@3wf%Dea{Vm4P~64bS;`6JOvtGd-mo7BKLo9-|7~*klI2f^c%b zo6Yn4h)E25t=+C@yvmBig|9*)E6z7ee3O-~^i@`}9DB>exA9LTf*Qzb+u*mlK{)ex ztjRt~B*y+P;yWh(1>d#MLYqfyY}el0_Evv4S$X)LiSHwsy>5%{Xv2M6UkvwBmSrEB z_;>t>G*Kgg9^D6{)#I_F+497HnD_~PYE7v)qBtj|P3WiUWcL2d#Lw|x#P2nv6m$S> z0x2SrqyIMXKl~z|Uo2|~Y#?T=(USQq6Til9Xe;$>A}59{iq&~M-z)HliAV7mVf24G z|GCj4l0f82tNN%@+En}%0!)EI&^|Oq<~+A4SR1H7xH_$$^ZsAfE?^&(Qz%n71ZN^N z>&Wp!)-AvNE}&Zf}VR;uHO(I890b_#XI3Aacx zM6xLc2(pMr^fDUpv%jH%?F>&>ansURVyuCt7$gRh5mOcL*Ho4SD%R6Gz2bRf3emQC zqgpojtJvv~y@2b^aET!z)evNAmx*D-?NKAF3pQvIrnucC_$jp-Ax0Wvlqr8ki!n6S zZh9xtsUhbHT_DyjtQ9_YVw@?)ixU{}*4Ni;D%8p<(0kyr-R5=+a69nne1DC(XQpBF7Xbi)nuxy5TiIDE}@_-Gm;!RlM}MB=W=zgwxUrdaT=j>6Z*r zm?WyjY*U;f=2-3)9aL)ML=9Tzeng<~8Zplld4jCpI4!=z9Zl+;P1?nlSrh$SEHL2? zu~5gy`c6a-ak`sDfhiV?Q^TP`J50zvj6Q@4yA9FxCqlecEHOoqSgL=G(r~0%BfkEG zB1?J0PBX=FcI~pqKN9P2G(-sp9}1XzOHHv-oK6_JF+$eSisTF;BpZ6Xl*afGQ}FP)>5y9wjb1{BZhN9V1@t}V|a$~95gxgA3n z5i~_T+Ys)E`*FF(XpLk`z<-j#AsV@Bn!>v8MDw=y?sQAm22-5NWW|Na3iun7Ax3Os zVm9lbeEXjIY~OY_;(4an!hGhmBM~&5A1{d>?mmu8me-Y>utm=x$E-813OT}e|xZH$*xWW!G^_1UYSqZ(>(%oKZimSxc zmQ(sP_9vu{UGv@#?k zuA;f2fhAEMk!F9d^Y!8eL;TbfH;Qctv%b}6?0ThU2(#0A8MYg;7Bn|C6F7+z>%`5( zpO6#_3AmM2_HCy4nYf*;GJjpA?e3h|k2GB!o_R%VH{o^h3oR$}@)#Fy5_g*7F0q5y z!HPKNEt!F7cpv$PhbC@vzv{ zjdQ{7O-~@79xSVACbVn`sR9kVD|Fgt*ItdTThHKucbj652ocncgkuV5Gb0H!(|YbP zJiAUUXBeWTzZuvI=B~_NQ(PaY4mPa`2Yg%@6#GqaKs;*WCfnUQwGX*;941-jtMNBA z`KCvOqiKIfR=4&v-YY2bY{bkA{DEVYK0Y{an&OY* zEmG;r<`(9cl;p1|S-NIk;nF+;g!B3p63(mf`?RpLGIPij^3@Q({z?4V5buxzU=P}y zZ`&bL{H`hf$`pG#QmjwCA$AzzZ|!oUIVIm$L7XcAT3dPge>Wjte8e_tL01{A;vWbn z_U3;oYGhwwc7f(oUg22rsraWMJ~PGV;$MArI5J%1P{iBqy@26|JTOi6ri{ z)F=sBZ%^vo1=n$1XK;V_NNGyN!rN#du}pt}pFpsTF{L4$^ekvmfUxm6`tKid>PqAh ziH39$zKIe7HLN^ptkmTEjTQcS=4nHk2*cZpiiU<}PNj&{amfUjYskcQEF9GXt-+9X z2%{-b>yK*fmIF+PlPL&;qx~3>4+OLwnJhV<0T#O;K@K*hS8^glQ$wJZ&H7c^&c}bJ zNo~tvCN|391ff^=AHqa^5o0NVu@T3E94SW`ajlBJ&wK9%>9}C6%p{2_v#jMKM6y<9oAN~cIZJJG zV^dMEso1x{&lM+|atbqYY^|?h{rrDGL(`^MyhWa5${cwzX^O&vg^NlGipavBbvyy6 zaPt|la=Oeluzz%9TBjIs zyBc)9O66KpjFyBw7I)!??Ye)lozmU?JEx>0gPWX^mH{{OvR9kvEZAsB&Uxujja?PG5@$0k4_cBT8C-IM zDdOe1{INn$**0DKy5%NQZe~ZfqtajATXDneiK$YSMB-qK}dYx0Xq3OGl2UdfsT1^I>Z2`0KbI;0G_t$m(}UJmB+ zn@xEOZ&!>JEOg-{S;&)MbbZ(`(V=>})o{Q2`2EFb|beDg^rYknV#_~Lrsxpg{md#o-lCkUdIP2P&)lBG+?>MDOczAiYYU*2QNd*yu` zM5wF`hdR&ddVAV0{_zevVO5-b0RCgh2T7E7l?6+$aZw!Zk`J457YCJ{q$8Sqfx1Q) zUL$v#a*qs!{n=rP$M=O|_G%W&7TPsPVtujSln1ygJ4kKSV#)HDDIb>yt%Iex5n)V^ z7No_pvGPgzlp%kgHsv$&mz~lY8~N}zW*74%zpBdmR!WqUlpNjB3DK!0!QPkUVLm*+ z((cXPDCs>?-TRQNI-f(B5(rv(`n46-)!u9ynd`v*eEQp@L&lYQzg=*%{EaDpD}Tq| zJds%XK~E$v>AK91@9)P*B&eR1&oefCffRpSSD*LT-?nnSmrVJx*5~Yg zvnC`){v`iw z$ahTn7x}K8xzw!`wB%Z_dI_1g)&2%1fj5ZtOE`!+#!js5Ij(EU_e^oJd>>&%TF>#a zWQdpV8S;NavcUT0{OaH!ChCd<)pc5?5cl^q*33RIe%}^#_6&r&{tVTpOqL!X0S`E+ z9b-mP@=A%{@`9CYKC|nksJXV>-%w&@;U{a?M5(VKpuH8=L)Ek{K+Bf*9r)$-2pws% z_$AN&sy&|6Twc_-{AQpr`j)@4wMzX-rzA3H7!H4|c)Bzs2_)56QLT9WjX8(E!jspY zh6UeEIF0(N)cMoSa{F6!(%3zA-Q9=lGx&=PjpHp>$du#wW|$U!UHA#Y#D4V*lH)};*ySRX3)L`D~(WLnX39pKIAM}*Z-2?!JVT;EXcp8ZnoCqqnT zK>&Z-kPk;RX^!RmSs5LI#`a%!6t5>f7~7XmKxozL^hX}LNmjqU2w^7Yul6`Ogj*+e zpn@=<)wiLBw!^5F6=?8haE2WvBs|h_i#y36;?Sn3jJKXRv^x=JWs~c$Bw0=Eg%ho` zeMYO=2Pyj^w);;COVrYi-)7D1qx|npRL6hSwe1thDKc~TD+zXQ=GO+A2ng9RcQZN} zKpVv0iCCJjx_}s~CRkT(Qy^9^*5Ry9U*q(+-Ld82Pihc`bpI_3@t>cojOhc&<|M2- z{k6MlZVptoH>fmC{3S;C^PvvLR@X|k{Q$E`7)(b<>hw_qjoerh;J{XlzBcNx4S|22 zV*N2kPR9m)8_ZH$?Lzo7dt;9Hil~ep{&ul3>>%u2R<=t9;)L3U2J1}OhRCR1!9T*< zp1G{!XA3=q)VpyyvX<2{Mb`62?Hvu6F3vA;Xw63c!@OFvIil9vXL(aKqp7yOP$#Dv z{0+xkp1!Nje{RIbDyaf*vA;>bOZ0zlq`f3z-ImL3rEO0??#wp*+eByUR4P z_QkH{D7UUX22widPz*4)Sc@CZ%`!F9T9y@m5z1CbxsRum($!9dxt!B7=(Oo_VcV}5 zQGe&O3$UN^E%N~o60B22jZ0`u{-CPM`~?00W}T12&Let><@1Lz_T)4Bliz>FN&JyS zD~{~9ktE8Q+scX2;{DOdLhXN#rdXp)r$6#7ucOJ*Tuxq}T8+6~`dr!?%_t9Vi&1W6 z!mv*7&tVI17s({rjGC@a!T(MjuIYNX?A1S)+BNl7A^^$oKsix0x&QG}I*xWHrR-Y9Jc8!-gOZ@GR-iq+1KL02SRIGDH*h1v z7mls;(?ISr{Mz$0x=Afz8z{hZ4(rgiT@ndv!^o2LZaGAaLM_ems5E~OTL1D$44sB` zN0w)4IC>pzW=A5ryxzX*>IOO#I{sAE@2U2F{yXh4p9Wul20E@W40Usli56W?$52_M zB=k=R68Du^KW%8e;qN=+>~*yeXMz$P5rw2ZIu)s|QK z#xfQdOX&CJ{~uEVqriWmKK`!AWEwlnU>d@lK7OdsUCL)^hb~V>nE5SoUrWPooqngT zF(UO-_<7kEV0nPJ!O-4pGv*#nnhO6qTkqNcVO94U{@WY9?G`)-A@{g*n@icR z*eS%QKUvmcNME%!mmPshy;MUwQWgo*GIk^zMAsVJv6daB2!6sdYe?LKP;$ODl zA3Si>2bwBqeMO*)-}dY-JWAc2+)-I~j&gSqr{^W?+UeDKkeTV77W||RpV#WNboLDg zv@%QS>PH#qtzRp|fl+VULTxkHOzPaMua@zQE<5dO>vofyN;670cPaRe&HPUbItj{Ap@x;^3@Mw!&<$%*>AkUqr2`YIl9 z1F4mn6*czH6uXM`uL3U6w!F8i0Ki1v5>jkM{>G*yehxe|8tPB|{iUg{f9QfI?4B14 zHZ?Xi`0AJVo7M#@8xv#HUtH>4^;bi^XR7zr-$=5yovwdC-G<C2HZT^6}Id z;M7Ln{U$nr!ER&?VCk^Nv4z3l`sVr>U7Xx*8fyH1TraI5du}_S^INucis@|6aAPs8 z%HLh!R3Dk@MfH+f{iCaIn!Dg+YWJy2{ZoBrsLxFiul_~tIt^q^-1;(eL3jmk{NJyj zT|FAfbn$;vuN_yzss4>Hsd#;$zMfi-q}OCjSB|V}uBjPm``IRr)BqwEGjXJLpy!T6 zH=Lbl;1_Q7wT`oON|~N9VRfEU{g>3h0v{cR%8^Y$>aNM^Dco^~9+PN!kMXv&n(FuJ z`9#BkbmtJJI;?(`7~@cU=P*@B?WH?|@0_N(Up;?7HC=ocXR3SEee^D#?-ERPm)hZW zxI4yFJ7X-TBbgxkin{f6!E@_IT7qXJ!4M*gdQ0KnJf?b8y+n6|_-?SNUQ@5T)$8;i zl^+Z>)ywJ?w|a$?Zb4n0zag*2*VxF$fwDp(4lBXjF&bgsx6hFz@M}Bh49B?kzx3Wq z@(6z&?Wpt-!;ywCu1}n4IMUlCymnQUKW5gIVH7wa0Z@KGe~0jQ&Hylke}0Xg{hi7} zegs4Kht(qY9|Q8w*-#nzcXas5KNha9*>Ix1PO+~8VUWHK(O1F0fUd8jV6?uDv+vXN zHG^u#$$!vDpU~YZQ1pL*g!GIj07D>$4%>eV#>1M1PwB6V+5uETJox25sg!QjmY>Pb zf&Z5P8S-D$BbS&ip-W7eeWPD3e%k%rdxi2KAY}rKwZm`z8kXckB|_fAJ*xvO{;?4HOha> zEW7b+>Xti>Nl&HebzIa&a6pspVW3qjLR^gALK;~92Y%HBA*me++1Mo^U&^n#Xgp$P zhsImFYRsQ-+Kn%!C6Uaq8HZ@2l-_@tT`)BSxjVqQBr^na9_F7Bgd|9z8B5*sa4_ia zg|z4w(VL6u-KF&Q67awe!3&q`5l2$59#HaY`Hi0ckjVUp$p7LcH2M)L8z4#yn5~GU zs$NLS>jOzw5lL6mn``Oab@cYfM8Z#qq#KTpq?O`yo1_P+;~3ua1F)dX9h-lIuoo5; zWf3i>W`tmA3#`ah=^#P?t+ai@cosv8rxx# zSEV{O4|QxF=GYv9i+JvbAZ7=6w+h_R`dU|SQ;DDnA-HT8Tpfbzy^a>RsReG|L9=2e zw)Qn0SeovjJ-wT#yodJnUXpzG!6djJa^L}y0QbTv@GvZeN1_(4F0y}cb+U|3y>*-` zY)Mcj{aO;lf?vgwqE*y$xr*ceCWz*M0T6Q(1{ko_Q1Rm&i9_cYDv=f?N#Ja2>F7~RjT*p%_@bor_^QsU$OYF?o z-{!{H4`X)0^LIk5H%5Q9z{_68(>ow8*PyG{I5>10)JF}M>xdqY&c;5k!x}Kg8xt8Y zrYzS84;W()7{dcP?T1c#K&Kwi&;!QO)f;>8VOp1|By%fhq7@`_`Fbb3058+^W%z@> zT6?sdP8vW9t>Qiy3;SUL93WPFlv+Oq1@Jhmgo7l@BGz5R)88{Dq3D?6RV*kVN zGZKM!!n4%sIV$}ceh0sWKf?2RFVCPIDu5J~3@_2H?zc-$YQI(uP$|Tj*TX{PQ3Lg! zzZKc@x6~ke&)-smNiqnc>;>9~6x#E#uul!47E15*JTQ;JJOl1CAlXo<^9?oZ2qe*F zUif1O{=~d-7#z6s0K8k~Rr}#RUd0dg!Y6I~pR6_8%Wwj`MjGvPTGu!9+Dx^^iOhLU zgwN+h_GOSl$Lk z3w*Vc#P88vh%Km?G8IMHpQyh-)2V!iBTaY>nG*)9(S$Hijj`p7exk2o^G(n-&69cpaOQM7o2J!a+!bE*o&^*n0C#)4sVPKVZ1elH>Nms=&%+{KG|UpI?&OAo)#R;*HrsT6$XcJ z3|~eVeI9L7 zKC!n!tyXAebx_-xYP`+fw??-5*2q@h8rkYw?X7=yz>S*u74IiSQ#!74O8-{*2oZgh=5>tLs}*t(VFn7AhYAYN0VNni z({(}vSyh`c?*H8?r>hKGHe5)}_{2=Mae|E-!eAkUW0pj~Mdn@{SCmDCM_nOIYlCzN zjEjHBdK`jDkcP=o*mrV-@X0n*7((YPQ)Ow(z-2=P#EEL6z3Zj661$XlC?kZKOEM3E zCo_a67G{$ey_a^3)79o#uaOz+7Cb8GRPSshP~^dJP6@o0D4d8rbz`+0uIm zs8(=8i~&ww480%#sk97ETb`4V#J_K5^ISgl5KGUuW-u_}gOGVAj84zogX`0?9)Apj zd+?krnZ6s(ky($oU~_s1zqgWa50fF#Wd$mEVkUdlos1^Atf*3%^s3?zp8tOYULYqI z)ANfwFeur7q1; zbM+bCs^*CuTCZ=_;>F^)ByfKmflNXlsbh*PNJ7kYK!$9wLR+CbbkGt0VFx1=x6rZw zew0>rL}+qoE+@l)e=*kXYAHxfhmpZj`SK2yB>o^u+!&FL43($m>&Y1rQ`@jj?NQ># zD&IN^@#oOfAvEqf!UgI#B2k_Ohz4$uI zORsw${z1S>uiL9y@Q*uM*Ls!L9l}3{@UPbLm~7DVqYrkp=E)o<8xXNi(QNVKT$jv= z^TfH`+wpcHBtjPc$m3L=xQ!R&IQ8Ryl7=>u-0-L)H{NSXZ@hn`8+~wifC=fIxDbAk zn_$&Q^d?AeVq1+7o;Yt}2*32YJaLohZQ@}lrbqD}Qp^9%P4K$Vo8XCS!PafyNlz#0 zUETzG8y6CC2g;~c!*&THyrZ7D{bWGFK9MNMu6t{j@X(Mg!W$C9y@@SiY_2=KEH~*X zue&Ta`6CSST2jnp1Ab=;v@h)7crgZ;!U(Cb5kdBXGX|P?l4VnvKA===;|GC(3_<1Qt0YU zIk+_rcN|-ju}{n*_KWkz9fI?jQJZqj=-o9#Vy?`ImpOk4o_P11?XX%hBN^MFQ0BNj zZYs?3#(5GZ=O%fR4ndkXsYT@HCTF#o&B-ld5fNZ|+@5$(qIW<@6mE6n)&x=_Pj5}6 zzq_}_)89LY5MugV(`!bZig<6leJawqWS@$JbZ>%vES7PJ`B@Z)#EKoQFQ!vJWu&{s znOyR5sSmwX5y0Yb$S3)_$?ks{K8xo$O8K zMN76t!f;(%*|ll+JPDpeYVmz);c?ys9&g-XaMOPr#uKMt?tmR|lE=9XoF3;6W-%B~ zyGA|#06_~M{V2ynEa6G+ufA^rq|=*U;;M z-W2b^khm^)kT>>e?GE)0+UXrY!xH=&khxFX#GSjm19XY%Fh>oht9S50%#F2L#O^F2 z4w!#~xyrg%J9E8O$$JpuMV5G8yhOtLCGonxo*>>9@6h!f@jhR1uETUpAz7T_I8k4x zIHvIxM$q#GFq@vw=BvIh)%9lU>jFoSzLq*p=c@%pL=pUi`n-hHtPSx00;1=a0qXNXYpou18;#p;jQoy z-UeUe&)^u|js|YWB>V*q#yc<-@4|7o12ge%JPGf^X~f1e@FARwJ8=>2!sYk~o{770 zE$+nt?!!jhkDKuTUV@L}mG~H5kB{Rmc#v8@K{cPDx4)#jL--sX#@Fyy_&z?1AL4(n z@t^n`{5SqqnD~2--9pd!A zi1YDXaWVc)T#Fxw8}LJM8~$C~fgg#-@gL&1_^Ei41oDTtOMHr7h%fQq;s|~zC4MDc z__Z8>|CJ;0h@5~&&}EkJ+f3zVfo$O?L1L+=}?-bN8CFAy$yhlrDp3R4~w z@$y-bAYT%0`Km~kZ;Ju)eKAP>TMU+8iy^XA3{@^MRwavZYLpnS#)}hFrbt)Q#3^cy zn4^}8xvE6WQ>#S2suE|bI-te5rLXJ;96Bc*dh+@ zgUi)oDw(hcE>NdZDIN~MW(|Lw65tJzqXv}{;VRfc@V$_Z^Yt)XEg^uFKzuex6;UY> zpM!k0l;Br_xB+I_r8gnQDiH^5P|K*ENqiJkr%@@MxF%aIr?-h>G#pmNss!95K=07w z#>spdV}&Y(WLZi^$Vz3x0687f)#<7Xl4Pdsrg6(LuvFWUiE<#6Yx{qaq!Fx9tC)Hz zp;@g~E->XCWW+J`3G!=5QfCl&cdPpen4hW6f&uC`;8AO+MT&Zn0Qy=OPWPX{c;!>& z^z3sOttwO{cnDFZD8H(Lfw)M%rvpze@ukR7)oLBld;vb70#He#y^1T<+0-IlzKu)O zdQHpwxKPzFr79UyRjq%jBMRogKU9!PN%ZeQRZne`)jLpVQ3Yciqg5Vc68@Xw7@z^K zf~D$9bq>+zfHT#Hs)1U>z*_abYNQz%I77v$CK|)(SV$|v?s>^bF^n-CYsF~Q%ox+L zR&Ag$EaR+-_`%xUb0OAVsg2>4Qk%eS&wDcrwC1S32c|uX^CEw<*b<(F`aT(snmRQ$ zOda)NFbEfqK+bA1a$4C&U}Fb=YKV0pbn%*_kZr)_2CSWft%Q$bBNeQtXh4-^A_BC+ zGXBpsck|xB-3Ez4WFzV*nQjKYIG`20J@)twh*l!p?79k>WT^&TK>ej0h2@5LkN!Cd zCm9%|e_CN2xO;zYXSJX$3IZI1>4vz6U#Qe!!&=EO9?+M@)>x62012(c27PJ@?HW>* z*{y8e_jgoYc1PcuwT&1VuGf_%BmXFjG1U16Y&}X^5RZ_sIRZ}1`39Wy@+*Gt(X9%< zffJ9xVnbcPwMH4ZD=z8+Rfz**6X(#Ifi&9Wq*h`>SNDIT1K2L=Ryqh#T*-tlrGIS; z{0A_af1lm9@y@4}V5>7NeYdzJb@Cw?qEYe^>sDsk;6HO`dMXmS&S>*Q4`j^Lmv`%7g`Y^H-QYTv; zcegd=Ow}TOp1G4?SA6C!*tlEVaTg>+y&|iOtPzLTQI;F?l-CgwcejWKLgJAp#9lJr z$gbFz>)a(C^EyM~i6_L9xv{&%)Ar4wT-Pq~D{p_SzWH@X{FY2gx_Lg=WEY>dOuXh^ z9G4jqFRb*so)jCmlF6V{Imy(J?#QOt(R#fe&=bF%5PgEjJ<%GF z#-;W1jZ9cea}n5v+a&7ic4h z`xu)}W@KWRZm$uNjvP1jo9J<`(ALeHx~hL(gN2!%#Hso%FNLP-b{O782T8hvq!ped zJ;S6-eW$zIyF(8t+c%&Qbj?JnNt_X(PIsiI#%({@0V8t<$(+HS!Qq#K^~=Hh(mROe zofw&S;!gGfgk<~y>1JQKOg@d5y3w8B2IJ*68cKqDTaYr2~Ir zJzrriUMsGXvGz3%ZxNUAy?u?-&+nvmd{0+#o!G%wdcI9Oq@Q2QS9-piuNJ1qvtT7X z`x71ZcL)*v1yaPj;1z#`RPjDc5PySg@c~Q~e}@_3BbX~bfd%4II8A&8r;E?QFa8A$ z;@@zg_zzqrzJgoCf8l;{1X{!~I6!~O>RCF$uSo%aA)NDpRPd>Ez?U)xQ5u*eoj8!F zA4@aIlJPiIx^cQp!kL7Q=Se~MWgsq>gRo2vMjw@{l z6UA_Oq8Ka3i7Yuq%#kOFe3>H_$!VfU&Jd@|nPM$ns|cY7=-N#8Tj+Wb-CrV45tqsN z;##_1C+CP8TN(Xf5{yw7t4jz!eE_S}57niR z1fN2&G^mtJc(zVsLpPRzQ~iICN=bMs47Hzav7ZejHElifz_aj@x=fTX2f;7ZWR;TMWz^%ITSFB5U^>EH!y;bn4Tp2-S*xXB=-E$6*h}Ki2W|K13~`=DQm+;1 zZ82A1tW_c7`J7~_8{AoVWr8%Uj}F@+-i-p8)AhZSaPl#$v>lXCaH<<}5@l##@H zH1Y{dz)?7vh$3p}Fb<)I4vVUkFjd~Z^sPyXCM$)>O6+6PRg$b@CoVFCS1 zwv!?4^b@F{zFFa?WE_V0h`PEzGlLXWTSQQY#pGg=U8fSiE{T5v3MmnwkfKi)>Jsy; z2t$$tK>jaL*aQB{&UY#1FLo}Eri#X74E_H znKVylQRdTG2Qzl++@y&xiTaoXQ}xxFueol%CjLy z)4~sx2s;$&qYjMY0L%9fn*hk{#oXAyAli7dYLC?CT2$wPQG_9Tf}D z^eV4|L)w29Oq4l>$IxJ86pidLrZN!(c07i48%A} z3%`K7XaaY^efnxG-C~+J$a-+fbBMtk2>&+0aM?^uu>o@BxiD95q|M(1XUWZQjyw;} zm0RFK`F*%jo)0%s`F43BJV@<#%dL8em(y0vC82+suQO{l!+0&w4Pu#VbWmKuNw7)h z$vB9nUFtR+&f#SZGuR$0V~$IN*QVPHw#t%pWZ})y$J|i28*mba6KICfL07}ri0<;G zpg$y!MjqvNsW_r7$%f;o$p7uNNTkY2y>#mc0GlyZIH*k|=#Z7XG>W0z5!&5RHVMry zVGe)iVtVBen}d1Mj;TVM1Fn|$ zzzww2+vL4)v%C+sQ~SH+gOMDIO@wKF&f!b4@AA}k#YvfKAxC2Y2hr!Y-`-4{_6vV? z2fbYaE7YB&#U-S{1)3Fk!|si2*u7fYV??uC{oWYqcblDmF&SLrj}W5_JqGElTv-1c zieq!!*-C^dRy?eASl`52#<|_b~paQ;>h)7W{F6 zeb{#Cj2D3E87d?*GUOgPF(V`=aV%C&-7TjP=Z4F(IKVb^SV+#{tVb6KR$i2c+p7R^ z9XQ1G;3Bw}AZ~>5VjE4!_B zUoE!W3AqX01aHhfxs2>hS<3O!0rGT@vqi27$u%qauG|wFbyw+eh3|jjy@?@NsriM^VLwVL5nu>nfNxlkcC z!8)-S>c#h9i#QK15?kO3aXwrlE`S@w58y6wA?y|x!Bb)@JTESW*TfIuJ#i^~Kn4%* z+f@X`ZiG_^U_D5syU2f_cu4JpM5u>qoq-q+*$`3>t6jvxGw4`9qIPQ*{<(IGJK6*)yWLi9iNtqUl$@!!QWPrJEfLw2-e#u&5JGu?px91S&(QRYo*5F*} zcuo>>atcApE@5QtC*=?Ohuye3$usJAU5Haa(8Q$bwa(hVLy>iE~j~|XOWCIMPWm^D4 z#6lP;77Ct4wU{J)m?|o9xUfES2@#){gh6qOR;7C2u$O%%A{UV?2$ z)iWfgh9K$#!ijz(bd&{ji5a?018SPoFNr3rj)35g)@<}tNz^d{ z-^3|zOETLhyj6u0-uB7+IUc`^OAob6ADq=WeQ=-LDd^3}=(GuENIpU}KOjrX_R3d6^3{%?D!mc)EsCl21yCO^t5@tkX4risalU-|e)&dpx_op;rBQz! zB}F=VwO_=Pc1g@@>UF!1T)PiO=Lh`h>*B7yAA`>Pvt1mA?N*-ycy&>0ezUn?GEVky1>g6l<40aF~un z?!l2{-w&V>bl;AFq{Xb#5XUeFe~Y-71VJgRcZ`_h#VS2Xz&r64+)jXeH&i)B#>C2z zj!}*=DppR%TVxKIC%;35ecmyjq14S#$T*LnYc+Fgyb3`j^^LXtU*VOK&d_a%%$0>R3X zI97;&Y~#^tBn{f#5xcVj5yv=n+$Qdorfm{(61NR)9XFU70VY?Q#BG!GZhGHGdZzc4 z)Q$VSH?yPB?rOE>=L)p@=DqK}-{>pfdG&JucG1NkD&SM#R}nxZq4vBsseeThT52?M zZ0Nimw+NN{jFe&RC-_3)0R>fr#S$oM8HvbIEi=}uO$4F9SB(Ww6)aS-2sMPRxS5P( z#&_?z5V>fk6T|wjVMT_rXyQoJxPVRJ@yxj`=eF!R z*J(~n5dzFe&k$;QX81DCc7Fwn3uKAuRuHweEK5`@#WF&bp0W(f$S1*|OkxG0Vz5(y zuT;^9Cf0XIO2GOK+6ND)ScTOrhg5?Q>PhKVBx$7dcv>5=A{jkB$+{%;Nj(ucEns4D zr#*JQ6%S!OVaseZNzK8MEF)6RsYpModsr?B3r2P8xS3(`&3_bOT_~K#J8q`g zb^<#G#au%OD`-*Cij9QT^C1xY%;as-zfpm_Nkv3pitRIEV~dKdxs9_yY{w1-J5}t$ zZo)&wyqwgmF`LN%hme`x#zxjSls1N<(P+4*EEM+5Uc%uw6-22aE7GG~p6WD{6J|Cw z+^>zwK&s2eXh<_+%B?trgPAtP4?Y88jra79>*^tSknTiZ)89frqPD~^W>G1~AZyI_1)#ULIdEMY=+ zwTg1!9khc`*r_DNT(A~kveHi!WU0`*ucMz;&S@XS5tkH9skn@{ z6Y2^r*VbNos!#2LPesx3V-ipfK#WUhk`hPXH~ol&v9JF z&6K4Xsm!DLRGtPgD{Z7kSpxz8Ju2Rf_vGT(I+#vtQ$mR%@PknW-%D6DBf4N3;39}O z_$P?x@q?m9yq9}gsJlBnP=)ugX#`NOnXv@7A5rn6ct2~(+qqk+C=unP9A=3LnYa?1^;Sx_8?;fq8rSe+Dt;V4K_HH%=3?FPq&~`g(^H(p*Kl3MPvWN-T4Ps)*ivHi zMPZCj5l-YM$!z=*9ivBl9@UM}G3#JFu4ghFNPmOT@PHT}en!Qoaf6@^c_ilwRDxWg zrtQ_ZiJw*Qii%s9cG~U;TU^UbrQ$QmCnfIUUf8L{$C!&R+RNp4Lr+=YY@s{2tKd}? z_e9n9%vN>?bH7@YW@i~`T)k6xUtQSk-85!n+qUgAwr$&74I10FZKH7-+qRSc6Qjw_ z`+fW5-N$PluIn1}p5q?B(K93WV2%cB+&feGj4wC?Mh;gLpHaW&a8IFA{i})Nau;eO z8vu}m>UN`OdqbF9`=}iUOoVg_JJ53?3wcJ}E!a{s%-}!12PpS5RXoG>%2?61h&(JAycyOb@2mLO7u zKmureCA$~20eF3bgv<*?9V+yo?1y6fYCzG!IW$|rnS7Kn_g|RH^(hyD&`6Ypcyo60 z*ppNHC|Sak9%18dU)YZ3Ei~;1GB89?Agaw59y>G21C(kPb%s(8*oc~~ z=IttCyk|rTjT$18QZU;i?W-DDWb0KO-Zu_06xr9KZ{QrJ|FZmtwOcooeUC^<0^F6d zh4=OE&_45F0C7ON=`@W(%v-QIoG+iCKdBn)1C!YU{hR7!`y6_l@0IKHNz>}l=>#6q z5AsiOD~4eCGHP2X@vhofoFba3@lx&GkF}Lfe{+K$|Aj%!q_6h&<>WBGRkk?_J})=c zx$l8p6XYD%GhQblY^TY8;nD&UfZzN~_vy|IEcqpfpi8^g8kXRLeJdVt6C6#G)Yi<2 zpE_6pWS8A_UC~MdiO(C?;9Iqi{~m|^K-JPRdQ-!Ybnl-Bn!|e&2aX^1jo)%FE-5}@ z{$omW>y)$N&oGBf#J@_C95Fh5MB^5aVxIi;wMYY0aFk5L~U9Koj)xK-3?*o!4eJo$emvC)(;z;XTS!#SlJ!Yt|3D z<=w79(b_zaGm;vWC6jRs6Cs0s|4V1TF-peItjARxoQXXtI~h^3 zx$PltT9w=tKLS5nE7l(4sd*O=qc6?qNU92C#h4u(gsSVHX&<^1aJT6g8R_YWDbWqP z$NNEPf%>}@b-;X(t~sZFA~oVh&RW1);haUk*XPW+hX_W(oEZ{zJ^81hp@p6}wqa%B z{;eJRWFW?(q?9-5~P&ES0P zUcbT#rHO58iQH5-Yott??DVGGh(xI*dR4Kp_G`T>dG)CUM8O+_%u+qIbpRn5Y6#T? z?(U%(MP&U+?6f>B1zu_!_2`ruf0hC~PiLda2devGY&F*~5N6MBQrsNk=h{(>ttska z__^Iv;&pRzbHZ5v$uJua+wc^#SRe3(h{RWShh^YludZ>WDsj((ExWntam2Y|!A|08 zW#q}^XFj=Xl@6b=FC1iN=oPg_>*?gMK(e%T zVS->Uj<%2pJcEnOzuj}($l^l(wQy3CMZBvYL5tJ1P#DtDGp-_k2@t1AnVw5(VOPF%B$n7JkW{4+*vgn?#Sth%_ACh-Z;Tez_AsZ>%pDfz$v;jKL}(WzVRSW)wjK6OV_O!k6-y^sFyCp1ti zP60TWxR79yPtMeMA)^GWM}HnBnR6PyV}0l@Pt~LUx`W&qXd`&U!ITiTxAlhXU$(B! z7=Z%bs-`~H{h&9ljb}2JHRq5v`^nmzpBZCcoqQzYdB4bD^@JM@34LuQVN$>BYrk#W z3VG$=pnYKN?6HvuiwlB-k^DhSGb`ELB>P*=`Acks^9GL?_0vCbj2NC+yc|m$H!D;7 zxa+j)50(>Y-XU3{Srp>6jD{k{VbaONA=L&z_JF>d5=U#Vr_zq74(fz!hS-MaQn90wxs{?T`%PuQ7#zFY|Jv$C%d2z zMqn%6%8pld$cSJCNP+%v#x&cBiksa*(WP{VTjiA{Qnft@tQ)V)8PW3g`%Q27=q+mQ zZioOCgInTOH>`bgbZS!$6c2)i5;)%>jpu{1=fig_df%n!r$#XiR-iTeqCIPItW3NR zhF!#)Km-!YP)e>pVyVgytKj~<4f(y5ntoC42Y1>nI}|oOA2}y)g3{ib8X@8!8WaW+ zVqweuuHR&mE3@HfChYN#DMb?#LevZEV6lCaGYtScjGlgja+%yF*- zhfoC86J^5rFWEU<+6hE&<=D!6W^0BBadAQ9hJ8I5|8-72ywuUA=o!;(E_F>lg zCk<>6^c>*y9FX*KM=T#-@!snS{^P~nQ5RX+dG-O_Ns=6}_d21~$sgDve(*iV@I7x` zRIkdV*C9%zR0|1q2Wu)ed1O$~sSf@xKUYGiD zLiO!vrT+;-`kT;InN*r4Cloyv8n8K#V}lEHsJE{hd_KhRa}ph+KBA;$azZhK?WIj{ zLJ^}#;Z&x*;`?t9ltxam?;z&gr@eDRu@LjS^%SHP>F&+fIGv4*=lfm=o<1(ngk3v0 z(_tE4yve1>b3tJ-+_{o(Zk$GwZE52kqWSuHML!XaaN)1zn$xogR@sm-+@~dQL7~AIno$9;vbW}G)m%_GMhD~`;`-hLC{|^r)uL2>OQw}Uoho?fPsnMZ zXp#)mPFyjL$9VQ#Wwqrln@5+V@+$a+?f#O3-CPQ=tY<-T?uG2y>=B`#;7YRK5O80W zkud)sLeSK^*oW#18>saoZC3NssW|Ui72t^XQ&fkXnfZjHW5LZy^D>UQEaFUgZ$>sOAqB1=&1Az^) z%yKniT5VbZjSUZT;(^uzR)VDAk`Hh;f!U*+RA$y3=AX2*!kA6kyzB5>U1lm;Ay}cd zlc2M<_ndBhDK|%Oi9*;hTQBX)D5#|2=g!jG$~OUXD1cOGHS-UZTS$K8#bsm>$Y^rk zakHygXz0-!aVl!j3YUPxtkMeFz_xgwkVlZ2ckXJ>HPM<^(@^wMveGFnL;)snO0z-| z-eM=1>nhNNtACdHYZgk2Xh}d+VOuC#6ilgZUT`42%xe#dn#4p}SRsh$CZ6am+AF8G z=oh^qZpG2&zuVAaWgP$YqwV#E~hPuN!XgWhLvt4HMt|VcNAQ&>T(UTRo?%Coj zaJr>Y{R{G$V*M|)M7q=p1`lv93o8HB7-0-@f5yp_t~iL*AEJ7Ryz@f|S*8icdT<=U zg!HVkl7bd1c2N$+Wi^LxLrWD2O0okXa4E*pfMKPf^I9;hRu;lvoI%?MwR`CkinP+IBW>3l7+)g{luTwu1X% zOqD|%Y!qQKq*Q}-TSK3Ok|>cBDh^psg7IX+RHC*Fl5_qKJJo=MQMGH(<=)LOK}u%3 z%!KHgY9>0eq-OI3!FJ-3evO@%ySHGNmvKD4k~6y83z=MSkPS^zlU2G*9y6i}t6CI= z=7^kv7ZnZxLppk{pd1j6hC9gZt+@i%N0^{n3vJvS3V^i6z+^?BqYak)Hz3QyLpPT@ zr4#nIIMOaMG)&AXUfoIfH@pqO1RWer3g^r%G?FC^UaWpbiDtw>OqgxEUPnhLLa;ze z4V90?1VQh<0RK<-?geS=LO!(VZ9R)cCus4q;(*z!(@osNS{h(GYAC;*o%vqD9w@%v zKR)H3vd`RrQCJ(k$>-U4NFf zjcq2&zd-Q)Y-2#@mro11C}|9`#L;nJ=cw=*o?^**<4N0W?XeTC^|@JR=fTgSAuec7 za&t_B*WM8V8$(rR?gq6C&rpJ}KH_RYIRBNH{IWn196lS}0X2X+>G5odPx zywr5h`S3@d{L(DpRSdS+yHN(Rykz?~Xt(>jn*W)Hl;(KOhb}WT1(SOvUbvAIHmYUO z_`mhCn?{NLMue+bx4rbpc4Ne2Fphd-42(07Raz|mYz4Gd8@uhi{GbZa+jqvV8CB*bW!d1|REYA;Z6B%nYG&Uh$JmVI&)-!Il{nI_SU^udqr}gT z5=5@9!`eap7IR-hJgPnH`ASV1OY3vo4=omJ(L=5&e-JcQ>0Cc{?o6HV`=C6A9b!}& z>jkw*aRIRT=KY!@$@(Xbo0m4C1($YkoH_KiufPczXZ182Yd(2VqNh3 zm31_j+|q_?`c&5YYQZQBgi(~zzc!(cv-7f1cHeEO>W#m9*6;)?__S*J|IR66e0S2x zBq3%9674%t4$Fg`XG)JVY(VNOfbJ{$0sJhN4fg~Ha8D!e>)CrhQBMQ-gQQ?DP1!Y- zIX;;dskL6HGB3bMGbPv*60HYTQ`IeJrDli)2ET9P@ZT~VV_6y+xqYuVPzowTuFm`= z;D&P~*Ky-5`X8FcoYz_)Lt1_FE-b(HP$7v^U@yz}$mbiZyyn=TGIV}dk)gt$hz5l! zn7cf(I3=cD2C+=L5()5bpWd)_GBS7uNs_GH3P!O95Q2ZgSRK?+fA$mDKZjEj9iaJz zh64W&n0Be1b-ynsXHtGD(s$nAxmpBA@WKZz4VOyj&Udw0=XUDGIjx-AlFKK3=;-yveEH(uC|* z%3DrP3i{sMT{SUT&inxKJ~97b`e}sy|B_M^TA( zUcInkt-^efVMHsl)i%IM2?z5`Pch1jeX0g_kCpz6Z-B}hOheQwLDFSV1!JNxW#NvZF^o|u(i3|zT>6ZiS(fzmJXv@#hJ~4Wa#tzSbnixSz5G_l?_c* zS$#s4dUZnADz~lI_ISIPhp3ix$E-c=vI&7$jR>XFj0bjVTQaa8g>eR9E5J#;T3!fQ zQ|u@RZ!GJ|#Te_|OC(hyo)sy-I*Huu_usts7UfkRCv$-KseyRl$gB#Z%@-)omSqC( zFcginh*#Zh&qGvzgdZrvSx&H!_0n0c54pZg)^tj?h?F+A5k!ML&uN$K$E4{=F`nXh z##xuHxRRUnSqDz&1Qjv2DkLbJH9oh9ZCk6_q0uMy#wBph$C7(CWio>xPS*C}EE7em zA@l~y#Ls7AebwEH!U743=qPEr)b3xC4@fTi4Io)C-s2*UTAjotge4!auaG$_%3hOIF9`}PeSrxKG)=Kf ztL>P$iI#6hJ5i)SX^kaR6o2nwc;uUNxQB(F!qpdG<&?Imai&x`-&Zv1VRBsDtWhw3 zpP8^Y+cT#4RKA3o?>)QEC&=YiJmT6UMRJTI;&RB2E(96YCS^;n5oq~0E){0TL# zf&pQP=Iy~lmu>TxdPE`&{t?Y3SKF(om%J*DKfwlzIB7Zx^lVo^vA9Qc&xokTvCQ_jRv zd9yJvZDbC@`zWPhV(i5JQs8kv1$0IGlibP;=`=9-r)Hgd8l;YBjODa8C-|D}eaCqZ zBL&tUU#?e0kYFh;yNjZ>Lhnb`8%J7YA<-*(QXLW*mc{#S=RH)0qZ)0i6*9cjGBelP z0jHjxuM6 zWxm>-ZN!x*>!8!pD{%u`$ATNvhpq{ztsy7KyJJfb<^?Z~Nxvy3CR(TSVq6yFlqN8( z|Dd;w--Mnv?FnGS?TdpeDCrE*%W^9NNnN#eE=%*ws<$ZWbCDjx{Zt556HW6VWg|&6 zH=x1i~moKjcqlC!OGG?vX8kXQV4< z9--h^oK2Qs`>YugD*d@i$NIPX;k@bRd;%hIjxDBqls=WFXS~M)&mmCQkNOC&&icg8 zbkp7l@U(m+BivEgeX`!Yz`lCP{#T*7ZRGe`8k5g#HCcGR_36U6T5vZ+ETy=BIE>*k zCeSQGVp%?fBAFIPFd3QaF6J9BVL(jWmmf3Ip?}d1Q34*f2O>pB42*&y%OCp;c=69r zz6}W~W0ZkLujrRmbD_xv>EF@k-i@AszQ>5@Jd+#zM-v5NjiF_@g$wk?yV><$w=lx! zfmC|FpsM{5{vV0pNSW5lkN-VgeE(jsdj|IH+u~OPd|Fc^7=4;B9Rg|EG$aCAlH3Cf zaKJqUxsck7PQ4=evw5#EBrPa1eqC5X868G3KhC#8~Z$iR^t|7x>JSn8fb9|si&+-(CNdeA; z21S^ThZql7iDWoxXzt)&v&x{K#e-pSUl*++ZrHa@$Ldr0P%)^rG}9_HW61+0{4p{H zk2by;-r5?9nv8S%61Pl`i>+6SC-;9AVwHi{Tu{|Du-+W$;$j0e7R5E#89%GU30F;V zP|homB$i2W9kyJ8r=Yd|kQQ*qs+!8pKtwd&X*Jv=8rET2DM(ibb{A zYHEb@i}YL@coOP1=jVdJe-X($LrLOi`Um%wWhys3cc6zBH=DfC3Win0Tb4?34}fZNkm%{gE^eyjgyciyP?2*$MNwBN|lI+fDZBf{_X z9GvOp>uINJvK0ZnUH9KOa=#SqnEqo{zonpzB6TRclFYKE>{g4Q;R=m-#1$anzZVLpG!@s|(@0@JLPB6Lbz}VKb`-B! z{Pbn>HEUY4GkHFI%gpe<`*`|i;k9=~l?zorpm8092nlydi|>RQ>1oBsp{T^xDS*f4 zdD=_e-@$4GQD}(FQ}V4dHI z`^<3PkS!REzPsQj(An1z#$rRFQ7e)F5)F)0ys{d#x(!daUWzN zR8&DK?I%h2;^it>vs8O}x1Q_VSoFyL zxCm9O(_~Ik$}ri%V)bia7BbD8Q!@N>VjYiFhqBc5;Dlmf+#19~du&2z99SSF;14GD z^t+|DoT@O)lQjts6@ah#kE`Flzz+V|2lmjt00BNE1`G8PV|(1A|A`a>qnsQaswKRo zsguWXX`Hs??p!z=#|toOAdk+bqT^>d}%PP#y-8r+|NICT<-25pQ`v4(kjmk!mQq;htm-r zT8)B0`F@*q8=pD9cMyI^h(}WG2zr59&yXwx2 z(`0JqrW+ww079r=Pwvvbqpez0qc#=mT#PaBXEq2w%Q%A^SAX>vCM2G^-9Q%%;-_me zOHRCWF~i~2z3&PPl|!{zor6SH5CiRcLyD6RrzqItGP4+x@%9B*62jY0;`v%g@PN9O zr3!U8U(o4C^vNQT_D zxqKvaEfyZbik5fJG;F+Jbm_nO_%S=A3eADkONI2U%nPx1?nwtiI8UnEOyBp(7^>m4 z@2&3{)?LNo%l-ovXZbPv-l*G1tc_fN*^i&6POf*4SuJPgUlAU*JO zyN%ocpmg0JL1YmN?xM6hOEf{49hvofbZA8ahAzB3oK!NMta^4>TO;a{#g9hpr-|*_ z6|4<$qX;~DsU7~nW z0}cNA-@vIB3+w4_`_4vBWCW_5vfJh$OEvt#6WFp?q|Hm-OzQ)!% z6X{@M!rWmj3_s~%S1&=TA8UWs5ZM(PUeJG3^wpJnfibz{M+~6BoXbnHBOeU`9qxML zaf}V#D&ZFr@Q>;kOa~aP+M3*pmXu{nn_|B+F30g-)=v*TM6YcZ8aaF5dKIV%CX>F| zXm7RZM4iGJ5bRqnn@W!9D}OC4JnKJW_SWq3(e_5Iz{pB6kV;uFlhYm{lOa%0#>__D zR6TRz(~OY4%4C-(tS|Kgfu`&;>Tymm>(IDDL9N793}K{cJVCtS_xnvwP=v6a!n`{ z;*&UEq+%4mPTvddQw_wFz!ljUr1O+1%-t#FW;?3>F4b%^UHVv>+Ny!2;FKj+oEQVA zRae9jy+)*~Dq&9euVIt6RMe&Xko-4K#KT)jYS!rBiro8u_rD_5ToSSfdQ1LxIs7}1 z(dBg9Y4?_2uy9agJCFtvZCFkGtIO38<{(li=gAqD6LN*IbRF$AFrf#{&xxbZNf(1e zA5_&cWfoQ?KW0mF1rmP675xjgNM*JYij9VyJt@v9@Lh3Ym_!y!#*d zhq?Ss;ggjDMNMM#H2ZBclW`H88>H#8~l@@6;ZlfzmI+ zA%%0E^7nShyoJpX4)X@5^EV>4SJ4k)P2mfKa~F$j)dXis!wgWCCG&crN|)En?k%J{ z1HDyFoeH%5!R^A^YmqN`>0gYDe7K%0x>fGjBUwE+upUinQ@;MOZNxZ4cYmmh4c3-< zgP|g^GEqSw1&@evlA}Y?8g{uVD(MCQ@l8xhJ?&LGK<^B zWdT~PQ!W}WX|lIK;sn&9>H+WY8ZVOuKP!Dq&3d{ProJw#=>m7NFwleA5V4R~5`q6# zkuoOb(5X{mdrGEP%}oI>48n|*vafx9Q9)f>mM2m_TGUADhQ$;{lpO(=0O3rP0YFbf%cBA9^%Mk8-Hu{aRf_ibWIA~v3J@G`u-_>kuye6s}^=PH|>uQ-lHwNM4 zuD|&4o@(sMzf3(oZUKg2YWHy6D!>j%1Qj;$-rP__5Ux*sGGa=}SeR7d$it!3kxwy! zbGvx`9sTFpS3(mu;|JD4JtO`Xr$k75rqLp--#Q80?;bWf0{iuPNJ@}jJjG=N8}a_^ zD)8s8H3#N)g8Ax*8o71rHYr&~pP?0|MmEbA-YHc{2MuN9rFL*#{&m8j-N;g)g=S*p zc0FhzfkeMu-bpF-pOIm=8S>ZORX~+r1Ez;|TO_|MdXG(lP=b#(X)C1hb@+67IJkV6 z10j_fqJTX1@up1pwJcv?CC(H|#yjC(EO@E(g=1ku;qJk>@w#Pf+YqMXFgyB8CeT9` zwnu7=aqKS0^j?WB42g);m-i5mRT;?W=*z+NkPx@s!Zz;t?xk$-$K=G@lst(*SC!MQ z$e}IFyNgk!U`_UiH|M^k4J`he@C-p!N+XFb$M^_6eB>F%;21YY`Gfmw3uJ}nEj%V# zYMix=g*j&JJ!H*{X5Q3-U59U_9wdWQ5kDh%Gz_1nEj8xjnJsuB_0$BQ{j7-b-+#r+ zg;IrhZgbvF=hOxSa1vy5^~-%CagQPI3DOE1=xO$q_L(Mh%JvKPY}ocP%3!9J<(g0I zvPH}x%Ox*`Bp|r8t+bDe61UIBUvl3sI0lIp$>1}^3bwU?)EU|^aCH0eRl-bi*Fg;= z|Mhan;2N;URTFM)I;uOs%ZN_ZUV;-#1pHW8{Y@2H+4JA(z95w99G*WghENPqoY{jZu*G%{#iP+`mqqP?hYWuy!- zXbC$Ea<^GBO-BKwmRRU>8}FGF4lckt^qCKnb!jnCG}o)!~=cqQ@yc;9)Na zB&Yai%yk!RI0M%T>Q4zzOqPGz!lv?sRf-OC%> zdp|Msq8ap)wf=r^0c{BxVl~#QRvl>JN!@9){V=@~Y<~t^J_6**1;0$;V4>JraA{vT z%VjX8p|$~4XF}Vy40~q>TyXd#1o~pf1l(7UEq`h=8qM4nizW4qwo668E?_$tom+mlGcO;`_c><@xn^%dpIt6l#vrzI4>q0pLc4L@`)4>h6Cthikb zLg~XPf)KH1H5XZL{5+b59n(FXYij4sP@3;sD4VkBcB5PA%KNL(>X!@+qoB1)R4M!) zi>1k3_-M~J8XBM%{9%Ih2z#xe6`Srb|Kpz1ArD~4iKI3(^x}D?=Jo)|O?oNYJ~C5n zN?&?u)4W1*(?2U%cLI(TfJ#EwPz{hV=;MwbfPWF>X(*b&Tn|fg@0xEXo}ukWUua=(D|uJ z6HRwZOrLdfdRi9)5O%^3vL2z60$duKAAmQWLBjz;R~o93iB(O(@ZZnzGTw!sdqPKV))&KSAwaaj^patd9?PGY_7xl;MzVom0xA-tf?ybfxC3r%ObqOH|QFSD_@=89HPtbCsvGqHVg`hb9rJnsz8H2PV+f z^=z;rKv&$(0ookGzujY1Mi(Y>Ac2V#)RLhW>&0YVndB1p-%BOGomDO(Wv)sjoM|z! zz%=!d%l>LoH-8RQwK&tRg~3MGYmoBOP{^i`13#LanaZBtv|`_sc0> zZ?cHJt!Po3pzOtNl?dc6l8w1cSb8pYSfM&JUE-``P>ElV!kJ9#tkd)3QOXuAJgb$` zaYDsLXPg5uoQ+LNDVoX&4v2NZ@Jq}pDdSe>kMZCiJbT41yI?Yb?hT>NO*&tnoU9v^ zzQ=l{qjLZ|KXbhI#F=a;?lh5hA5J`v)ILY`bQ~YL68}j%odCCSRn4ujKmqG$61+C$ zMs+8PnC0(pG2jze$ApxGgJ##BWY^BXc^olQ%n&7KsUa@j7FDZ|40MUPZ5!LH5z`U1 zpo~8nr#@7#`Yn?>95ww@LRwf(Epii)QkU1hBJoko@&Cn0-y$TUUv0Qf^4uaDFtOJ6 zD~)HRCn)LGeOh;CxAU1+!>P7%)N>Wha1`^MUmL!vU|z_pO-aXBrP9MEs)_*g%KJ+7 z*}`I%(c&mTIp24>1IXRjrV5fHT|2^0{@Z-fc{|GN_-sGwLX*&K676ppmFVwI#Y^}c z`%aDEOm&0#s_T**9a|~3xI>?Xg5_&!CbUV{)wE?>xTrs{ z;8*j6qP4s;Dcs0*#4gCJRA72FN++S{OHw6nHEXk%B8ifJKbzMpFQru07bI0Anv5&! z;nWJ((2@=a5?-7LM;bYc)cZ+Eo}d?uM^8Rc-Ka{QFmzTqS(p@?PaUz#i>D2vp`DqL zdng)CcFsTH2G}!tlu|WpnKfyzD#*q{tME8?l3)qdl85TrL9RiV#Q4!;!P5jju3cgV zm8AN^Rkc4wF4Sc7X!80QqkbS|k!5Ksq+4_dU?nDNU$^qqIJ?Ftk+oJ_i;&m4}fo!CYGHgmSYj$ZiCo1G@V7i$%T2Ye!ig9gT97Qj3HV8CxuOw-Rt z(_M{dm&%xB$Q|?wjl>&!I^V5PwPD_x7Vgb-BDd}s~oom)B-TO7VXqO8~&&jc?s2N(9TRnC( zyV^W^1%h>Q`{sy=4Bl9Ibb8?S$e$Y*y#NR#jxie- zNVO92DeAf$V^UfZv){q16#EtvP?LR~#>B9nuwyw-l~U34?2Y z`<-vAR6IydEon6gcQ`U)kLTfr(DCNqPtb*P7|Sq$+$?f}OeUhW@_J2eH*3T?P$?HU zq-+w5>guoRP91DL)K5~jbBh3lqG2JL_V)wxyIn-uqyiK_K;c@*@`o54#vO~Cg4MW@ zR3w2@G3=%On{na{dHKT1{K7_K?wL(PKdDx=NC}dqV)g7EyH-TJqHSyH416w33TkGNgow@! z0x#^c4Yz)<4*{+b;y`!A9N8i2bgDr}QIRjot%7w>T3y#0 zk%2cG{3KIn3Huc0b!$5yq+;msv~a2{qy%xDW3_nDf;&!b`sC)vMU-_m%rIl0NOc@D z;a>B&xUhN+i>iF0k99p6EfXT|7~g2LifqI6AQFX#4I4m|;TX(NKLDj`oCUR^4W$nw z+oX;Qgj6D^G0^^k*ZPJqm0dk5w@^dBSHt`)ox-^!|Gu;A&6Q5llMa%N?;JB|nyqOB(qZXik7gb_D5 zuh&3j+wgz|IF?sNf?&w7v>H_eYXYtzTma&CfEU6T+xR-736-1N7+biE@|@} zAnP#*!`qb%395fvuhrB2S_f%DYKwlWjmq1u9JD{k_1M_edH#h&6v8)IX35vnLm0fJ z)@=`o@aX`@Qwm0n%e#oC^QnJJf_S~WN7$a$p1Q^kfmfgkD@XRXv$U~HwQ?@EB@b<6pDogrL$}49@fC<9vZHn zN|<857|cTA4>ktM5rQd2D3)pG^{+zB!u~RMFLc3Rr3}iE(W9mg+G8@i%4}rm&S)|c zjD6y}bfmaJG!}SP0a5++O$tHm#tAJw7^z(v#N6dQ9GC>v8O{e1Tn}FGDM80sK)R4a z%-s_#dO#U5cgYwbx2QcSA(ei0mw@on%{LlxJD;z8W?W(Rcl>mN;MZdv3>Bj}ply0(^BqKUv@lVz7!Pr(L=u0-{`hVI5h-6)%d)1vH7@Q$yvMI1 zXry^4ra>(B=R%~qKWWIR<}nB)0M+iMJn1U-Oqh5yY?L%>$Xy%L#Vy7&Eze4RUCukb zm|^O7AGD4)=g@|zKH^_PA$18{;cukTp-}aKeqv#c18vmkQ2q#Gji0IGUS2Ekow^!V-P=4~`zk8dD*@{i<&l05#@@H*`24RNIa<32K zJO*}ZMhou@qq{p9wcHQ%Z2Oo4MC~KKWHo7#o@thEr?x^xuSrNiXkYr8GBnGdN#ay> z4gGkWo@IPmiBBkCWtWH-ct`t4v973)F>;BGVbG;^vp6gMEE)v%05t^UqYHV4`tE~7 zIf8&yoL)#r+uK+LBqS7@CT*@D$Ow10 z75P{$e@g8TO3s7R$5%e6wXe%7>1(b~-;&eGh+S~v6-9w(2|d|h-FuN1r~U8IYQ>o{ z6>a0~y|*75$Qvpv3n!w5IXtkNU+Lk@4#vQpF8LXIhdizdnT>hrqT^b)DC>Py*Ne7ftUX9ry%OTZTd(4PR!{yB2WI1B>XRyS(VrDlu~M_n6kL-o zsbdB+*KSGNa}S5Nc9@Ok;ORB!T5x_$_d_vU2xpK)bKxi8li)s~RWr5tB#DL57f7Hn zwpgEm&Q)n1P&Csp<%DF%@`}*6S7JkuIfy4mxy) zH&S$`6No@{D^K5}=GY_>viY+RxiYz{LrvKKT=p3f#8f>rj~ z!>sBup}*i~J{vaqGH=j`0bSmI^SpTJ_X51v!~Pby6A;Z1F(PQ6v2M>>?34YbI|Ppt zIBysLOj_|QCtHOn3oGMzT1OGUI%cO7ta;|e(L00SeZY4HV;OzJYrYarHQ0k$x8T$l zyK;btPF{%HWF7u6e5U*ocl+QxT1}xbXbMFg=aPgJw?7q0w#GHxM8^jQ`p3H+*_QC8 zlDT%q_T;X>hqE|^8}MuXshq?0&a-LeisAv-u3s@n$e0=u?G_v5fJeyMGk0%7_*1+-$DwUvWG-;37Gk+wP+?A{UhYir=X_2usk-s>zz> zwFOTJbWOqK4)Zcy+ygy4HL=dQ4>L;9`I9Eij6$O@+94#0CSE;iK=@-Y=6Sa5{m=mP z0?daAJ)JBiCVYC2n8FKWX;D4w>G(t2gxZ^OB^fH}Bc%og*|Hrz_3#1^glhMw+}_Cp zBJVjmiT7jXW@=vVP{3O5D?UKxnTFdMOP`xxKRs%B0LdR2Awi-@f^~^-%u{ z2uZoi-b7P~fd|DS-GNx9Q?jab?4AJ#!sT0Of;cDH9-bV_KDSkDPPIuEsK4b)xxa#! z*@ZI;EBB|)x9$3?pf_;d7kCBH99F8z)O=%h%R{By{V+!xx5;9!sH@25H}SSEov+#6 zHL4of3;@-~e`vOk&SIwdiCHi7f^~cFyo9FkGHnvfvFU|5)51x{Ub+>NEIt4{h=RX% z@5Jq$KUX-N@IfLlf5!=_arSHgR|HO>pukU$&SsMsZq#s$b&HjzX>Z~gu1wc(Up}fC zpINMdCq@N*i0R@P zZsQ3XOAm13P)671XO=I{x^;v=QZ((m&|V(LdsHl7KGVjGBa%#W#ZI#()4O&eltLdl>v+-u ztbmC46NubE!NA$`&26xQL*TpS=;vORntw;OK_g>Y!GGtAA+6MTZNtPr4&&7lTa7PRx>05U-aPYWUA&iiHYDc9 zx)Nk3_n^003!Hu!mPEpOilWMkncBNeA+~VEu3LC1%c1H6j=O(%7ikHq%>l?h8{$g*7%Q^^?r}tXL zI7$|1@WZ6?^cL#X#f#hma&SWjvhgr?_D)J_7lo3GF0uG9bZ7&ep2+A|qgGi<2c|!MX5ae;>e)s4 z5cHDbj1$UOG=-HzT$#^pyM26ZJALK*|+z&=SvG3#+K1p3Gl4(as~C7u`s zM@5Zka3?vDNo8c=Xtf=9HafD%$$4Q)l15hH>TOc1O`*WXQRYj(w#FEu7OOQ{mUqWV z10n^ZCV@5zL7^(z$%RSPYN`{=qzpEh0;gYdsj$6F=2J>V;$pitVsxb}*4F;_ss(0z zm{+JGplk_~;u|iIJB7dV$M}j=Uyt4+{>{mu5IdKZJ47+1Vx-(Dl2E?gZH_MbP)hiK zS$XkN8nr7aSW)qnvyboe5`;Z&{%~+o&+o2R7hfuHB@`?orIw3{NEEB(OD(?dD;Jo6__ zAb4@eeJ>zONAg60w#R1$FL}de-zS9Tp!dHkma}%2gEUfVns6xxG_GIGduaQZ`rU?` zHk4P#BP#8m%pXS1LoYkIPUn$=DCc0K@jF=e9e#vTLa-CYL3^3*3r@`M0YQlDAQAmd zlIvnCTS8&UXJN@DGZXa(1I+jXBxh7zK(IKf%e$(Yn>m*Oa^Ju?j}qy0KLBK0MJX*Y zAc@-h;1FbIy&*^Ap%Y0qh==_bywgj`FIiOnZtbKkuglcb_CULM+#0OBGXD97r8;ui zl)I;zu2c{NrY18qG&)Sh4w8=jB!6_j!OW*5EJWbfNlEnU>=hfzT2<`LRc8aTOaTz0sy&`)S`#MSznvdA;1q~wy+iL5Kt1f1j9>XqIelpA&# zc4xNxR_zm&5YDY^^+}V{P<0Uii#|VGwQqbj?818s3^6dJ-}80@VmNCFf|*;^c?Ihm4adjdp zI-12(1}F@xy{B`MwJ!iz1R+iz(jG^YCTb3U_+d4(g?U-ExI#~E>DSF!^c0;<- z5_M^V*bSe}c?8b`9U2MLU6as-|7Rjd1^>svU3;%(Y#3DWaE?@273T;npdWMySjhhSOaHV| zy^Sxuq{&4HEDTR^^LnX~gsVAaC`c?M4D>d3BRE)srl1!PyI!rWQBJo?RW>MUq;-Z)oBa>a% zZ9Yc*&Q|$(`uX-BllvSoySFJ4Mb^z9r?SK~Gv`(9_n=SVNYI0X1IRX1`Zix7_t;!BR`%3RMW3e-UzD`Q@O?*!+j0wZrM(Y5`kPgOSJ;RIe!I3 zvK>~rv=B8<+E}^s4f0pQ#A(y`wF~Kh;nwD{V+U(e@s&eQrF%eiMQyFc$SfOuXf)uJ zSsO1ZUkVBVXB%p=evPRrqUd4bN08qXGbj;zYbUrvlu@if-5mXLM8V0V`YUgCV)!L< z*yVKkh4#97=2!#ym#@wuRz441o9Y6mLxg% zkBFFyYNt^%O~K>cHGDDuV2>vs?d1i~g|lmkSo7&yc_jcghog6n-*U#=iIk4BCHmhR z?Im@?JdPj^b`SfZP1#Pfpvnl_*VtLmAvog!vp=wrtJXPfp1(HbbtguCd#$S+Lsl2j zyrhIPu9MtfjU5ZBIvN+G?) zp5o)N|@eahX=am&BTU^XI zk$jCwB{`_jky377&64)3%gg^`)YrUTe8D;B5@ZG7dh`L4fy*_JAr%vxI^W;xC)aTp zI+{^=mZYXCX2Ni>$h?0qq47^Gg|WCe!m53la%AF)RFZ$jY@tS8KyXm)anJM*wNTf& zrahW@Rr;(>(;EKa_X z@0#GG(o3ReHsn-+UTXLQ=DG~oR3X!PyS&}9hLh9LMq*>fj_6q=Np>lJ$y^#%5}4axVO88)b`$tcUO$qIix zh~qs8e7F)xe;_Cu2!Lq`KTd5+diz*ow>o-l?1v;p_FSO$MpacSIqH- zRRyW2DAQElPv;%s0rEni$!|$bhakt3Vk=VlpYLbRd4U%zpTFPF?B@FQI!g8Y-XPfL z*G{IkY{csCah98j13NoWvhjj6=v>Y>aOpCtFU)z&JIrX5MOmzZ_yFlM23pq0ZCA4Yb(1?)0U7Z8x)qfAs>)8Eej8KKOlh?QR+y z^==wbwzcbG2mJK^)!u-gK1pi@w zYln)q!kFZL>o{Re(`FRI54{WBr+R14fi~{+TdYnxtg=|@Yb5wU58}FtzIi9t!g$%nX1N2AZ#*L!>P9&w zCPxPTu!f2RP<2C|F6_;rnhGiDxPX-oVvn2qqNWYf)x-5d*zRjIUe*n6+~euN7>1L) zaYDx24cgxev=jF#dH)q#JjqL#{YsHPw{*-l`@-u+5(+ZxzdHc_6V~AP1owykHF&pg z{{}AW2@Zb{uLS`Zg?po0?cZ~v`2?Q}0nku*hEkscz-a7`Ria=s#V&kk287hGlECCG z9>Sjq@ntMiH;sxGoeOShQ+uEETNXWXAKsoP|US};p#YOO907-!TjjXCQ7e8%B)OBB$PyLEtAi{IB)xymfod&v?%*FDzW zi+QMDB4ae|%%(dFT|(p`w)=De#VRBm)*;ddXc7*(NIJRL&P?SWh|JrFwsTybs2Bg3 zI5ky7h+^#!W-PW9#F&t9W-0I#!|m`ymt}Y4ux(V;%wiN?WyTPcG?$2Hg9RI!r$#ba zYqdHxDV(Hwz#PtBq*uQd(9$2@7}wFZ1pR|q5g@td&1OI_!SF zaJezFul?A*kuL}xt6-eMrq0zN zVSe23FS4@M)zywG)CTC5i0w(su9zwNHlf9v*|`bJ$3qyYtFW@D@Fy8&>)8eXAz6|w zao@<$_7M7C@MncNH!E%=-7G{~xWzQKGHSCi1Da?9nxtiuZnUvXDY1=_Mw>sBIKvwb zX0TdYerIGD7cB!B4%1E^=xyVSGZ?`3N{v{)|CKezwQyIlt>qb)RCiWh{^4V}+iV!h zrkj2)6A3LVrhN_A#~d+!sOPBxe719+z*KUE%wcyG*DBP*5}ef5_pf|qv(BUl259Uo z*JV{22wk_u**Mjbe27wxu+rmmP>Ie{a=s*aF079UR;Lgrl{BQzYdJ48bsV54l_uZD z4&hU)wqeQ-ZtOGHndVL#P>B}@K?4Ew{j%t13u*@EUg-3{vA$d(kmUye&{pH`tK%x4 z<&|9LIvyCrli;{R@!dH7DT|Z08ooSZhf_RJObnOaNX=DM6L}}i&iyyTc@BqjkPru= zhjS9cdC{pvkXjeKbaFjLF`d+}DChDnJ$ zbq00x+0PWVhwlTvQhdAqQ&+2Wf*qCp7C9F{*Sj@lUs*Z85#=;N zw07U=<8_%j?9%0?gUYBzfGcE6LY7Ts%fX%-bIX5t1YIiA*9<;Qt_2MLq_WFmy;9iNFA) zANI>4ANGYirOhXXWmqo~8RdX?`JvAFHAOhz(WyMy^51|sNaM%|IY`wwp~b$wg+74l z1j^t)cJHShWYx3>71gbHiAjGj91%n81Ff9v)G*Ro#TS*|`=g^K8+EF4q~*#NrnQSJ zIapqQs(C+`S$wOmV0zWi(NaFGiV72KO<5uZfiV#@_ASSG!|Y8aFp(E6MJ5)$0bV$# z33vTxyZ3<}h*st>6T4s6`*Eso=7V7HFv9K~4om$MamFKEl zq-o7-8f#(0tW}+uWh)YiRY+(ZaeBVl><_S7G2y19dKw`Cv~Zijw1W%@1`_=U>GXc$ z7*g$Z%EpQ8bSPz1HUn%ljX@+{6>v^$4clO=rl5c<{ii}L7Z5nxxJV9?hL?IspPc-l zCZ0A3t11*^|AKGMnPi&hONdd%AfQiX~1^?407Iho@KZaVT= z9*njiAnB~HFB(cSMuj-i)DE0e>PX2_QWm3pO$9G-%H@Cq+4Xyilk>O zX)lOoP>42YOLD{<+B5Q}M{I;GlG^)%&J#fND!n~WaMx8UHXDv@xaCqu(Rcvkir?Mo z4H4~%Ya*ggV&Db3xN;Aa&mVX=_iBXo#Y}1=%X+NvXfcui$>PUL=scOp?qrWHm6asv z4_qyDs*o@xDnnsA#K-G0!Nc>S?EW`SwVvr$$DrWmKu;I|1|P7G)Q0J51BfWl zTY|9d+%zP0>3L6Yj|HEbV$Nya9`!#0zf_48pd!EJCB601@g*l0beH#y5){(=)BMH` zc<{W&PU_``VY_rWBHnZ{Eay{fs1&TbZ5Ox;rIG<+C5||deCp<_>AUnJ5_Ni)qrCLD zbJFb!AAC!q4Jatf;@U&*f<;ry0CZ(0hBDqn)i;S(Np;|lE=T0czMW^ zbLDM|(TxLNS+SR+PN}80Rol@G{os%tX@gj7E=lIhM)&?4gSzz?`mZ;8yrX`+%DmHf zDenl75~s#jbWt4}zo+<0LZX5e-FG9@G){R|Qn z09V2=K14-rwV+BQhK|P0LAjXEuFVn@gpqqtSFrN6$xa9Ot~Ui1+B&?GeJ=@Eq- z5sC7~%;s^s?Q@&aVp2-lD-nbW;#dXA(d?A)7tnj3z-DbD9Y3x;CuVS*2@LqP^ zZjrRogeyU?O}7iFF4AwpPaDW+7=P*v;4_?MN?m)(kO<4oH?Eon8^|adr6Zq@?&U_4 z`As(A_$?kW^|4=okVZIXQ|SyL`+2)rOSo;CK9yOE;5p@9auTi6pZa?XVt>5V^-VLR zuRtJF)!LgakR9p}NB)o?OmXtq(8E+3W-3Y6{1Lu*)%^wGn6&UT&IGcTWc$uxN{R;|1cZ8iqcsc+oP(0mNfr?o8F4GE(%~FKFLq?a8+B|v092095AWQz zAv1lbk?ioXCk(E|578LGH!p9qlieUq@pxjL^dx|-wTb5Q?+}#8l>$ZR!K>=G;Opye zmc_lsZ##)5Ol}Q&RQDbY7_~=XjA^1_0j8Uoiz5iz%Q$TbB`f)hOX(}Q?59==$_Da9 z`&9oYlvUfd?jgg#{)^VFamWnF|DsjB!Qho00t7?~4j9i0%a*nbi3?=>f=2>w^ui*w zQSL)BL;U9#nC3X5^v}-_;Xl7N<}Jv8|3$vXETr`R=E|)|J#YHQz@~`;95{q#1lG?& zlC=>nLoWR9W6?f_90U7rGJ%pDvUeH~kSXu~AdmkR#YoLZfC6?uL1F`f9I0)DQNaR* zxycEjy3=MTwKuLAyYLxp1upgDy;}-bt7vmI$m{~tA!~Hzyq7mOD>bTGS2n%(o?mx; z1-mvB+_~U~?}&v$|4vU^p3Y=({o3VVBhLNUs|^R)ceL*zgpej=2Y3E~ZCuJXuZd~k zGn{x;$q6CaOR1F1rP=~0^}EsWZqL*kh@etGv4{Vt%+$x{*C0`f9y4r70VwGRT@=fN z=QX>c1rfnWc7ptn88~efT~M$%!LRp)9h*H#IcjdcTG+^7f@QBRCoh$p zYCJUF^}f<7M{E@z+Q}+=jfDl*h=relAz+CCE90Qx`NH9WP#6GF)IoB|f(^{L_Q9;r z+vZ@^b5GG)=^r5pd^=aKl5vvUUCn|hHjyj(6R~9_1n4S3(1S+j8J%&Kro%_^>N6_w z%NnW)rFM`?Dh;5)M$Dp#p(SOjXHnCS?4e+{Eimm-SKNp=U}6=DKaTAmKJ zM2+tf&zT7d_zM8*gw7mN)vk7eRW|L)9FG0WIM)5tII%`lm2)odS-wPIDmt2Xui}-P z-Tv`lDwr=JtLQ3zxz9v-8`{CN8Ka(YEcp9%qK)jj+(YYa}10tJ}?eH&YamE8GwFl84| z1dz>WP-TH3KO&3S!Ap96T2F@RB97rOqg!Oa`)U5ze`@~>5wCoya!ptG-2Q7aE7>Mh z0}s7Cs7DAm#Z`uWs(8J|LZ6_#Y#KNsX%0`(Id75b?xk%Cn)*q6-$s2}X*mvW?OI~~ zL|BiLcJ5dWDpwF_rg~{X&Iwk))62{NQ{(Et;Y<1846fNPOAAvasDjCfR}ZJT^tQua zfQb5YSWcB5G$XWjzgZM*jta+-G+W$J-+_ozRLuqu*!lC(OXsjYYwNEAk;n=?lY(D+ zPwX2rvR=I;bQ`FGu<3--U^Ml*e35I1E-Dh^4Y=wC96pLRR3#>N*#w$|i-13&)v&3C zX&;yJ%Js8XrCy@+cvq>wAxZC}m&K?vk`}xm;U>bp*pE^82T8qDi{WBa##%xPf(OCD^Hv2%!39#Ej&8T87Am=N2E z9E8i)qgzXRQ02;2*7+A4&>$2vnoKJ^_qYaTct0ltboVtwl2T@{N8wBePn^nXpNUFg zE=~=0N=c2Y1utf6%=~USW^Npzw=0GK`rYDpk~kR%{e6_G96rf=E2nNuNMYDBI$_M6 zz45feuv`Omi0#<7Vkotl%@$Z>4Z|k}_(#85r}*|k30raN2@5Z#s|{u%_N04>GaS-_ z)VZ?jvoB2$u{%G-QF5yZ>(#>b<%1X(*(Q{?0~5lxnmvaS=Swr)3r+DebbGu3avF6Z z;xS`&Y2n~RA>po`>3kasXzYJYxIpQj+cP6_VLUQq+Zi0;rr_|B*G`@s+-XkM6kc-| z$+j9SSt4Q{nP9au-=+3d2>qvmeGv}ke{YxjZ|FqOMMEi(i<%@z^3(neumw{f;#zp* z^c)P>8%QojLg!H9iXmfV%>CU1NM7~9%Uw9o2G0%NBa0c2fveGu-&3Grtr9I(SDJQi zR9&yV*h1}FYHs;MYF0whZPXuqk0u&Nhx0q}<-;0)W34^sC~I50Dmy>ijR06azy$w- z07&8_kEE{;l1YhfcsHr(csiYLEJQfHMS}uD*T$0&wfzuet^LpiAiD!$*d6yR~?w*~68()}R+mKeV+u?QoiS zLLQrf3kE7pwA_cCb%-he=mk>Xo1zT;9s05FDYSnt583^4X(=@;-HEpG%;E*qgm6u>aAPPgEYgh>22B|)C*}!dc$8RpzN}T8 zZAP4T$&Z+d2|tet(BzSpO12qpHD=7MH--uoH>?69b+eZ3^gA?@M1D^8v#RYjU~h*A z&Z)h%RbY|mQGRMD*eNECg8$VNHO!)1j#JqhPG8iYD2}Z@MJ(@qMtoycYde{rgPyBC z2)w&JOwW|y*FHqGC^xk@sZEd6N+lxXraEc0E1S$SW_K+W0GAuLEIqMCf;__e#Q|2V z);m2=?ZNS}WV?pwRj0|>32s2URdkFD)#fFuOO7&mFLVhZJ5DO2G6=VMwJXumT)y$z zrjTpqlTr_}ZrA~TmiZnhJCZph%O^9ED+^}Mohx~>G4o$jgQY>3DPk2jny^J2RX2_N zL?wH`hT9+>0Nk<(oIx*SWPDkV)v{=8$3aqy@=y=_%$RVnU#p&nM0IJ)LqS|!0>Y;j z(;^-cYV}C8(3tz&9#&kQVla(|iLzAElOq@Z|S-n2YBvT9VpijSba9V0{i7% zXE|io$gJk@orYTY*r=q<@2h_4gnB(}0E?2eaKhPY1!54+}S zDUolv+?yHfS)|a>4QvAm_`r5ze9@z}i4}E!?-Fg??W^R`Jwa>R`&HNU=ySUX#I}-q zLy83gu#yH3Dh>F76-9y_)J<^*GyHa(^`UKXaH&|*o2v(F2H;8uei@=3hgs{T2pfrgp=i zhn$Q+xbAH>BADrtQ!^pyqZhLf`7r^-h2c&B*licnS|!fKhcOr_3%O3ut_<6VZ+!=e zJ~jmYObXJi+bLA~V)wq@UD6E_)o>(lrY(!>~OY0)hJ_!@70{4_O%NEfyx>|Bz5q0R)}^ zJcChwPoBX>zYAA?;w!^3IvJH`%n!x-ERAs{FSLvze}{dh^rFWsenBO8Vi=>_h9j(Q z$uV2R?teEs$_YlBG!t^FWb=xuMeD>a3Y2H$slOqz_{Y0t3&4U$)Mgbr-lpb25eaj zNoFY_sHQ^rBovHHIFo}&d!U!3RYvl~%UgKR2G29)vK#f!RD)iETLUIt@Y2}QzW`~z&yYR`olb~wxlv~$B)cZp5egt;NP$A^-Z~urNM;s3GzLZ^2Q`u{4M_L z^`SrI)N3#hlTb*K+x`2Uc|b@D*BSEWjmE$9=nTp~(9q&|4#FgTW&)PVo>Q<(n>7nX z%rC@{4YyAO=DQzZrOP7@AQwAyhww@4|0@$=H4zBAL4?B`PsMALE-VH^G9wU85opvE zk4XRzES@28?=9VU08ccH&?`uO;~Jo?_9pOS-{>c~9xRCF7sDYH%F)R=fp1?M^(iTU zm}w5@YEvUXxRJD~nA*dz%3AH(Ys3sS!Ujj+mc^jPxdeFhUhf|YN zkVm1l9wc!D>tjTVbmG`W1cx*k9bppu)qyf$g(*1|SLXqQe&ph(R1$TBGdtu#4{pQhK1 z+JG4BC=)|qiR&5wP|l{}YLUo3iiegjk9dm7?+3@hN}c1aTLNoKOGU@g(GfjWSMKnq?HR{JNrC=C5lU-#4`f=C)sVjM2~8@$IO9 zBI@`induHhvpF|TfAmO{lHJ-}eTj)g9xF7V)uW3LS;PncV&cd?^c2S$y5>3;m5rF3 zB1?f~>%(^5)hiPAqv*W;b5Kh&PaT{K5D9_$bFlcD=Y@=9rX|+6tpnQbDoj|HCW$0i z(G+Ht9`O|ZSem-4?Pf?lmnViBBdQKt3Cl6Rxt&C%v8PZaOVd#Vv+%MoN?&Bf2&nL8 z&Rt_R;RO-_t00Mg(tk@)qR&fnfKoynR;?Ub=@Y~|DtGdBawlTBmYOmmm19!j4~`(k zFI>XSnW#Scx9hh$AT$(r_!{3K1K7iP^Bkk9(F|;CZasz|?V%Y!^j%j9vds zJILZH)lUH+w?ELM#UU{5q|F%Rap#UA4s~ODPp{%JVHB1^sn^BY9ydUp0jiRN}UA zu*}z(jhI&Pb_5ra{JIxaPC-T`#;l^pSZh-GosA4XZMeerv1hu$#&I>W61GlSOM-49 zVB0b>V~1WNOAtiyua$=$bIs|*uu@khQiC2AAfJ{>;$W2HPbT_={EwzUC6~_2r-{U$ z!a-#G`C|=wHFMOujz%jdO*@I|k~4%x`vYb1T4>!@j3fs)?9V;pAF-4VMp^pssW12AsXp3 zfGst#Y=nK-I%6TN33i43>wD7n;EA>Cl0Q%7Feo3&WRpiZ?u>reIa(iyh`qs3eRu7N zUo!Oo)1329J%vHBFi)*(N}q-6I(#@{@Y6p*J_~h>L?Tw#QVZhOs^~ug>sbb4&QW}Z ze`SOdADu6LzSFzrqVz3|B!_uMAt%Mi19}!Jal(e!O2PH75JSm09}vLmPrkBA{O1x~ zv*_$DeehAXu}9=O--1aDEb@x-%VdNf2byYgTy02>qkn42{*AoLp1zw>@)Yg1iRg>y zBVFIp8-R-E+gD=7XlnSYhA0Q>zk~9N8F9MlFG4!>YbnX@p(;_EGl%Pg$6)g-3E)+t zDUHFUWf@{KD9~MqM;$sMa+>fC_mKE7uh~kJ$is*Fy2N^K8KvvFrSR^lpN79eFpGKj z4*wAR;aBf!N&8|q8fO~pwxtVS!CzvrPau~oRHiZGQ*nI91)U&P-ua;#crA9GN+`s; z@$UVx8ox{;CLLoMG~+`kN$>F=A3(>c45_}aLbJTGzTmFFV@90nr+W@#uLMpK22MnR z^^)HoMPIV7F}=S68}E^ml7!71!Bcduk$=&6xtB>qWG@wL>^eV*a|`#4>cJ@|^}zGc z$Ichi>etlUxDOZ)6&8)h`FpXVTaa+5o)EnP2!!25>0eqx+Q8oegonFj7Xg19#5c+O zCKSppoQ?XF-O!G-&Bnpa|M97@5`8L%Ip4W-Tgw{-v92dT%anCyZ6i|jdZfJX13Vx~ zE#<)eMiAIUI632Nb<+Iu`2C1&MdFY~Ha?w7mWrFQgIK%UraofDlR0fC_{FXm$6^-g zEYWkYk;`$zV539uh{B@?ECGbkC!dHj?n&H%ersr8#mrMAg8A+saWCQYNkD0)zcH{JH^gMO zT0Io;SWM6iL_QYuNYwn!JlhemXsGm#|r`G5p#Gj^RH->`o3^%;pULMifKj-u;W7(7r{Be(1KVlp1OPU?p06tBoJ8Yu`_ft%yC zmUCOnaOQCqd;m~?O8Y$-%VXv7s6adMH}}7*fr&G|>J-*;zyT*<&AcscvdR#JzEBKJ1bKX0b0Oy~s{cv6bl*gl<9XF7n>Gb(`T?t6U#maJ46XwuY|B#UtH zYWKrltfusKivsh};V;&jt06OoiNq-gGzAlW5){@FA<(*&jp0u-3=3BUM>jA2A96M9 zix)D?-scf`kAEr}aqoJ(Ws@5#-yp@z7TQokP&vu-qX+rig^h)B z)c(uL#6vokJ-%Hzd3RMV@tY{5lJI^VWi!-dxWJc0EffjsgOI20sK zLQwMr#e(eSZ{iawv_`UO#6?qR(x6s&H&oXr4f$XzD0H7BqSR1&j=*w{ZZioMc&M%d ziC!7pb4t&|RxEX1j>er;>m4FDTQuxt)!*b`qXTbqg<10|Zg!}wdmY7d{$|&E?34j; zpD~6Pv={$;4{d#G-}V<5?3g{h{5uTHy4J`X*UU6?BwW{7Fo!orOC+sFw(FpTSp+Qi z_|_Q7z)p+`r&%I=P{E8;K}^&;wWrY2XK*{22L=%}#Fp0b6+BOIHV0CmFOhDtQrC!9key7oBYHmF{(_ZL(Ra^DY zTT~|~72WE}Le(a+y7*?Js^%grZ9MK06R$mnLQh{dOJ;fuA%hnnz(>5=4Djdsh0$bS zjXDblLF#MEW%U7l0NSBbAV#-{wA^AMhF^?Gc~#)EJM*Ne@oaOV3jcGPYTOneH!YBC z^`;X$jWn&45+ZjA9@ug-U`-Pf!;ZM(wdCh*?VizLuYK3X!I)P!Aa_{}@)z9IJ_0<1 zb2-6qq7MEXnLxputivvaL?}5A+X}j@eW>TPu?b{s5hKRDKOE-~{oOk7GsTGt#cUJZDd?iLkWp1WkUv|ev`i`)hs9H>0J#7@gdCMi)KuA&v7AzoROfx?FH zo;x{nyiG6G8?6DkpC81dr))dkcDx1oXkVyCh&|19d{yZ$aE68VX#Nfu1G8`V__6)< zhY|7-8N!<;*n#<2E@f&Z&BY;<kUTc*q0+98x_t6`%*`jDao8O!Hpr|9sCxSVH~DyGsJ{A;nvpt5>MeK zVp?OOiIr~13WXU21kM7t~KDSKkS#!Wf_?=7^-V1Ml zF0di{bZ+D+xeufym%$>p@3ZQ$%PHRb3n@>1PEBQC|4yOm><11&eohSJotQJ9$X}j^ z>3IGd1bmW?c8sq@kvm_{AsqbfXHK4CA9O(Rp6&n=m)ZxX7t{$7N7gvoiFW@t;y!>Y zpx=2z>3Cxqvurl;tg;pS%`glEk=={P*T(G+_esZU=HsKiL8w@( z7)1%~YyYtA52;;%{w`=TpHb!e<2d#74}`WL&AAm8IG1T`_`-TCKKiSGqe+i}2N1pk zGtkYQkTorCv{ErdX^ui?$N9S)_ROw+SdSr`_HY|lte1GDuCN!#+o z8Wt(Kxw2-&<8@44&|(&SVN*1IN_&>r-yo!0UMHb5k0Mrp9ndnn@E`HNs8HZnvMOd^ z;At?oL4^#|4Nyays#+c&LeKbGsP)y^G@wyZ_9yzqv=-dTt z<#cTA=TdL?f%AIw|EjbntRJ&>xm5A=rQ)Y3*tXt+oCA+NKvwZ|!|tA);PMzETX|vh ztV{Hs+<^K9#0>V;oJp-dv0c5VK7WpS`|m|IZZ1H!aqto<{z00)5ijDc^Myu=I1D_Q z)w9f9x?QHF^*9h&Mn~F-EJAf3YQOQ6e&^&D--TWX{y3HIsmN2sO)!wRW+6jKBaNj$k0!w75TtG$jEwibQas=cMYycs67jCT z>ZrdC5P!(fJj%M8=w5F8?Zds2d>ldx+N^QQGk?1U1P zXd^Bj{fNznb!ZRD{P!Q`;~_F~P$CN4XI)w^1jXs|mIkgwP>zyRPu^bMviIQ{|Y4Z>rv?2X+wtgip; z4azt0Zr~pp*_VOfJ{AXRFDm$ej|J^`BRCOXR||8<00%(61i?=V6u=h`c8YP!G^{8JGl&qTzkW>o*p=d=K*Ntyb$ zp$j;J4u$=Xr=(1nLuMeoJ6jfb_iq3YdSt{(1g2IGR_Vk~5Sr@9t|*<5!-i&d_M?8r za-oC$OU+VNRWRunq7%izNaoN+XdTBQsb`VXdA*`<6ZrRRbOHLem!Y1(i8C~}wj1Z9 z9mY>NMK3;1YKZJdB-upHeIF=Is-_6|^f+kO18AE>4I?W5b@WGhNUsEKHl%j|h*w#6 z^scRM&tMRj#tbH62fUCC{awEj??YAY{3#X6NPWKbqXUTorsxOp3Lgc1(VM-xuo6l% zy6~~KD~Cd;4-BE0tJZmTKOQg_eC%l*M$>$Rvp^!WMz`guuK=VyMswR4vU%GMh4@7H z-PWt_(kj1OX}8XbS=oIYI${=(xh?4)6!}aJZ`X27@;q_{IwfU94Co%~&Tvs*Z>vLBCZeBUOV_$G1o^ zjxsN=7K`bu6N@S7D~aivcn+0E=*E$~SEU}A%15h{Hwuk(B2{3Aj6Ve25F}8j>I7dw z47|e7hcGr=S05D9c|djJu^ZrUztRO9*MDo0_Q<6<5U-IgS~oT znCQ`@#77e0=^{1`vTFzr^APc%}^AZF4l<9{OKCx&a3a2IUW#_%~UVzFKfdKuwl>e@yr`~#Xf`T8C&f^bwwB> zhLem3ap?NYRI{%cMfA>10-!Q6TBB+c6PBGU?uKSc1Ae;A`MbK6ByI~j83l6e$hmc2!tu{%n-Z}bdPt>#a>=hhPx zHIYQ2EO}Isl^Hzw@vbXt9TLk(T%?ZF++X$R^bYZ043P^+?JH6_Z!RSQDydFNURBEp zO8BiG5OVKc$7(ti`05CnR!E&{herCQF{?b&n6I3%R(-js=eHHMM&quJdRDj;hIjN z@H9#1egq9jJt{ivb!aHYq9a(-Wk!#Yu9{FZ9VO0^5Yar;VrOuyT(LqrJ4-u|eeacor#5H$^=CfRhyFo*A zLvv0ngOc#>nCdCiv)s?3~Q<55Kk~n-X_cVq_aI_)w zfNj+s&bvFJty4)Yf7>E@c)_A}wmBgiyF68=O7C10bkw+r$-pGXF zqx1e~8sq!_&s1N+k2N>~f|kbqpSn*ex;&(`Un}T9LR=_Z-0-&ubJ}*S6ztqSHDAU6 zGo!B{#s>vcuQH$#E|d^zd34>i_}IU+6e|dxAr5bz0+@#jMFdE>O$|#GsDX9{ceIOI zq2wO428B`fkUtc;R-7oGCUIV2>!9tNFfWp*rEMK^&E@_dEJAb2=q@zO9xP*T%F`2D9UemNhw4+#T zYWL0Jm+gSVJf>E^O_7q*+HjfVMdziC^H8Sm8(>=bW700Yss_#ZUh_G7X{1w`4r6=m{_PB+fERvI* z?M7uOFk!Eo)U@l_dcR3}K^FWM^nv68nsdVm6tIdd14tx4`WS~i(G!29QYYV{F*F=_ zuQAdcUzsEhsK7+-KPKg`k*>9*_Vk9%b?Af&B<&EvthwrUvsl2Ca4w?ltOTz+EF5%_ zaBiZtzUkLQcTM6&yN7;*5Ddrjguy;&c#s}`W{&gUA)m+^km0nUX&yY-57ps@OdHa% z0)P>R6d=xm3F%3yeoDd&_S7R0kK9Dwih6F^|^4>*#f4M=$6=*27@sAkK(ypy&E)psEP2T$7Z zYGdfWn9lG1;K_Jg-biICM4DZyH8lk*0a|V@YbwAc>rejh;FeD^LM|7C!KF3z7Z&HV zD|gsricP60iA|NAi6l@(IhD8vtkb?kOg)fk3xEE_BPzh0-=Z@P;6y2QN8zy=QnzX6 z6veMmHEl+-&rYRXp;fO`#a9B%G)8V>+$amz=$w?@?GNZYriZ6vCfDQpKIvRjUC5#qBXa{RJI*i><%AFs?YEA+~m7qO=wrR$TmZ;MA za@S0+dtfpW8tzapc}%PP6!xb)ah{WA!RfMd@f!bsRK0U_Wz7>V9OJ~cZQHi(iEZ=5 zb~53_b~3ST+sVW>CYsEb-#hoNZ{7duoL&7??W*2u?e4Dq)a0YSkD_PZbW6Ypfrn7Xh>5zf=rTRF&mtV0AC*fID(UcN@-6idh6@vLmF?tjP8%XX064Z8HjKvi z^aI_vZu!b;bFDI#0^*XvdF$ zY7F4hc(iWj=wZ?ChVE);%uFLay|h=Vv@WLY+Pc|H$5=R+a8!XAuFO;Qw}N1s{gKgD ziKM^J5%Q|-<$5r))i1mH*D|&;ez@FX3=RpR>QfM2Ja<{Mb81p~@7U@3BxCn;(ZufK ziy=AtDnVf6-Lr|j!WMs(h9zPKOQ~`I$9tHv7aUdee)6R@llVUQ4FnsE76smFv)kooThQeEaXWwwo$JpdV$z z3HmakSlz}$V$T^GOiF=k=TmL0KfB37vonjnklii3-6rO6zh(5^<>vRFi!XJ$LnLui z0Y3u**br^nc~}D~i^KHvP!MbvLG7Q29+M0sleG{+Pcf!L&# zJ}I&o!@ut+2qVhSga!5Z-Kc(i2bkPZ9f~Ece@Sp}Qm#Nm96KL^T?(=@Ad@zr-R?5Z z#=-JjF#0R&ECze9b!nzTN!5`nS(i5sN7p$y*6d_RuKwhiTh26n`*IK>t|ASL@c@__tD;Ubde#J2|@{ejTa8#Aoz7=$v zjEXzsCYLc=U@>@{Y4%!?L5=>Edlk_Y+LLPZfcbFaaI13cIoo9b2EUv>(clLiu zZ1fXMZ3Om=>hl$Mk^`-*i;cD5A2coZIR4-AZGBR=nLcz7kQfdS5b2bDIOhL7c*yCW zpzv_OVO`j7=toaLM_2iuIMUMM2$rcJJUToOCTqD45gLGwH(`{$J{JF!G@>O`viI?!#XnbbsclV9| zjbKk^*^bZ)G75tWx>-ud0=w)gO$cjdns3N9u-0jHA5GEo3MTx+-Xfc6e*^RCd|=p$ z&4<)t?C9e9u5%-fptOqT9PWj*6IY?Pt_V%7##Qfx(PRPFR^a-3RaR!HZwp>`_@pBQ zuYQlPWBsIC4GURLe~X4>{Qj9O$EnL8rKTDhFF@K;wFhA z;GH}LfExGi)nMmaA09&3ln$y#@YSpXIkvHcR0PH- zPECqo?6ASGnFKxGh^Lx{9*mPTVFzevyRVM0jrWh)~aN`T*7O-3kG3s0AA4FZxF)e)7#ldNzY*+yDhl! zAy8G?kbG>k7tz&vQ{qc93nz5s;bi&8k#h+-ib^ND4H=sO-pj`en0tldWvaB`KwJCL z-AiUt%Ejp7a@C?5+3EsOcoEM9d>3oCABwKlghQ$D?Wz;FWMJda`MrdLST4}t(r_po zJgxl&{j7o%M;Aq7u>}M^4dmHmWe+Z^1aNO9^Ib|7c;5?T;Y}M9spe2i_3d`i;xewE z&+U!XoS5hU4UHuAFm&qr8?a921TKuE zh)fn$nm8{**KI?(?3*_=Ak4m{`nCwNiDbYb77A>H6QcvaNvDjV3FE7F)WgTF%2ZdE zwbE4#P9rK&Hu4>PF;wI!W|b}{M|PdmL#)jHFwFNwI2Q$0lma7h*b1-1{=D>4G8{<~mM-ae;fAz5ss4oGL}FP}{-o|`W1wZw z*wND7T+w12hI>4XO7UA(zc=A*jO0j6e{F}#xHEwUcvvk@I9Fk`VAdgiXg9Pc#w#F< z1onsXquu<_7??w-LS{(iAJJ1aU&QO5KxoQqEq~|Go>ks5auqFv_gyaA#Z^2w^+K_A zv-UN2?o7r9fT*k0-O$p!&H!eTl>@KTIJ;>sndSMEQAr#iS!Nm5icfK^sbnu#LzUg5 zBs6y#!7HG|L>!AaTuR;snuG_&k^vBi$kYtF9_9TL3N#Gu)Rl;A_I4j4D`vJ=nsCN1 z$z@5^)wqUeZ;&{z$UA#(CHE%<9+($~Gx&~Ds-Fo9I@m>?>YQVu-{)?oR z>(mqX574koXpRVlSJepc6Pi`cy;zrD-Ud%SGU~ka)lsfalZH4sa#g}iLIkv%w2c|AatN<2AKED={@J_D7p%Y{;}(S>G|U!Tn#^ z06&_LzQF@G!rAun+Zxo#oiJb5xy~GNyCEOo|t)(>1ebka1iTg62lDk`6zH0hp5M zy+7){kiJx(1TPU8fk-$lzxXdUH^$>kD-7S@y)oX4OEC%3+e{(-(_}8jy>;GnY1BzE zB0=&HYyC7)s&di5rb7J*46FM#)t}LiH^9sN1NPji2mV~gbicu)eYn7rz`a&*`TD`@ zt|1A8HJKJSaF1o4K}Bwv7z07W4F~BKjzaD6GCRZK2NOZiJK1=3_^3=NBxma8ObsQT z_ULpQKT;cT!x472l8@=8&-$?2TZH6i*1KW2ys2eerq%XvEpma_yJ(LZyG3*sQlJWT zRx6tZrHleuTHp<@VZ|M7&bIz6I}b^ctqo@&-Wq1ANmAuhv7&C!LHH`~_-{IQzV$&{ zc857{h9Z`{v?eKVrOeN7^>iB{mn?^oR47gjQbC&5TNz!T3UgED&W*eY8rK=q3|%S* zYHmA2+0gMuOD&OtrK}T=#|jrVEI*zl}h8M7--C z)Z5*-t!H*F?;ssX1NHQa>jb~&)LDb4P{8#hWAQb&CX{ow#s%YAFSds3<1%R~Bnjdm zH+209q?h_=$!Ltp_$HIgVolJLp$C3Hie!X;Q(M}!4qCcS-G^0O!A`{(wg#>Fx=K}1bBN9Uo~TYmS;+)D$1vX z4>ohwIEptmc^vTz=OY$eQUZ;n`s&Z8k18bUOCs!lq-luk5xohFE~Fx=m?zL1d5LMO zQgk&@u7%4n)@LHjU)x)huV-OLcpYAW>Ari*O(>je8=0oI5QF-Dqy5ArJ51TWWLPZt zyzQHeP0;4bM^)A%BTV=%m?|Px5rSwBh-2B;&0_76g_YGw2dV}W@c~&1E9jR*pW7uc zD+d`Sw@ai!tPLo$2xJm74LeJ-GLv~&dAj(HPT<84ozm;d=Gg~C#K}j~j-rO%BCk_`Mr4?`=U!&BfA@JP!^D zYOPrLSe-5-e0cV(iGf>+QFTxR+ni#C-HHmjpCMFya|pH6xHVMY?#ab?J$kNbU#*f~ zxhrtGNrJcY!KDqqJ}ZE)vSs_TFs}s^cL)oHuiIrONBVjzU`%ff2)P*;F)gpKUHuhU z3hyA`mrhTeMT-gBnzQ8cODnt@Rg+Uj&-6-IDjtch^i)$Md1n z8BVd&IXm)xaKKqPXq7=Hx)^Q&cql58!H)~XCOx>!O;9%C-C1W$Y)=)qHcLI@ ze3f#bJ}DV~PzIiFs)6Gade!~_E+>4}E(1oWQ)s^4Gk=6KHotI}9z?jZYBLge6fVUb zHZ5JW3Wa9om}o(u%D=*pD;8LE5|yOYt%~QEcb7$a!}cwbZVTZ4wfZIPvP9w3Tl$Ut zkmJHH8Jv=WUgH>sQTy=z8#8LS&~NRga96fhOT|x~zoNi{bhm&^BV%3<2qQuY!D{9W z1f~VdeGNs=k3}{L8h~l6!AL|_6JKIO3sdq%mLEzZZ32*nO6du<$1bobfTB#WcjZ+k zfEMYm^z8Br0?vERj8b`-(AXl8`}M&e?~h~So!VBATL#dNn3>&!(fgM=0CUhN$n6c- z3sMf!9XQbY198B1d@K@t;gjLp&H0Bx0K3wshRNAG>vPZy(gRt0CZY!~emwhhQtd+$ z;v>#5S@AdPVcwQ1Jms6Gye=R6Tk+8i8TIc+b93e!qYkIfZDW;a^9bQ&Rv65@|Rp7?1XLUq3rI1{y6IXh>z8M zx(v*nVQ33vE7L32CLvul^HOZx53>e*$ny43w2bEOnQs&k8G}DpN!fOVW^UZBJV$5v zY*IKd1%D<5rIb2icDRYY2P0%5hLLeoNq3zDx7Awc=(>o1i!f-D?DxD%NKwk<#P4}_ zexl9_QhOnco1%5!dQJs<_Bi&BTB!rRbQf#ENd8<4RWcZdLW!lR6XTY#jhNXJIP~!t zjDzYC!AY#((wNYswXtFBhEONijP6vXMx6j4TBq58u91h3!gbO8xQ?a#IPU?72IEBE zn2MAIJ_P8JR19H3C53JQr}qRXZ$n;M*}SB!#J0nPL9+QSmW9BN0IH?Rd463$wVZWk zhpykWDql|U`m}PN=B*p;FWoZ;UIgVD^_UA;qP+{<$fT zfAs;w1pWM4c8h0e8|#&pBHO12*Yr%*0GDTG>GT{Qq>eIS`c1MvH{KR8GEcyJVoA{D zCW>aWqQ3cHqu`XLQP|Y?r+px;4yHL_Wh>tU zBk8I^az(7ic7k@|t2F`2@6rsXQI0iW>vyCZmE;@{@2H}-rRC&H{5E72Bnz>Oo01}D zhGJ$6H3+BfrbG{rj`T|Bnt~h_I9jObRk2#pKhfBZbT3dHSdTG>KdEc#F$z<-mi6-4 zVyemtQsDKgkmf6xPglb419;=CWqgc%gbK#GgDABK3(d0+QHECo&acY|q3ySTfBJ2G zX>>JpoD&5Z>;fbqa%;6Sia$Q}?Ysz&=3l*fKt`NNa^zcST(Gq9Mk1>NBCjx47qSC07nz;K&Ck0fkW%U%oxarsx}H-%aX~?Ag%^nmGUIr)D)!UB%{V zfRlmVh;k6Oyw%vFF&6kv<5RVr;$B16fUz9fstkU2bKWkDL62saIMRZ<8!nM(tZ_fo+ zB78@eoue9vB^59q9}v8DMH*D#p&Uso=zZFDBd@9S=gtjg*K#Ks=Dd92t|w0yDDO zzg!+QWzu-Y-(OHbOFU}#^MY8zjUbK4lVqTxp2He~RF)cmQO2P%jPQdjTXUWRZwnE4 zaAl#~DYS!ZJ_4C-PpD=11qtm0IFR#5*%*!jcoDfFDg=xk2-m zDn4`1>HI_4@t31+U}UuwJQ{j~pAZ;}lL^B<*!z6cDB%6~)|k;yQw$cQjsz>&{* zNsyo*Anl<4BfwxxSKb6rruS^aLA82*an6ALr?Z(Yf*JJX4+mtrP!2#nJpmpbxpl7% z5CaDO1<~r*2?&MwPuk>!(}MbMNQ58&xA7laOur9=aBH9d+|EC3od*CN)PLF$uK*?R z|0IS>fYCpR5DN|u?!W({0sspT|6wf{^j&9vVfjL)gZ6!yU(bR@Y(<5DD*^lOvKv0r zh42@Jhb2t<|4gO#Ny1~KE8c*@xBfZ-$o_*!I4j}dg#-a{g-vfb_=2cygM)81+5w0| z{%0!_0WR#HeH0eBhkt&u=K%Qd{xd*xw`Oql71UMefA;GT;SpPv768Bh4Ut&^O#Zw5 z=UxCh?0qL|*|2hfZg)fD~?3 zc7Xdoi93l0aQyQ@Sr;zrAC_44aO z-e@Yp?f;Vs%;Ek|M6<2oEdP0UWdO$o{$CQRKX0jEfPlcjfc$Uv ze-^?p|4R}zHmo1uKW8)8)K+AOK|rDv|3?JFo)YK|nZ64K4-YhA`FEb!?FXxmfAsqI zp{tX*9)1sTot!!eoad)v1?1xJz|-G?wREX~zwiXms-zMRg&fd3m9!CvfuMT~}?@A+B)zRCY0M z9bGxRgCMo>#DLSj}t-b8aficEYP=Sd{a@=bue zBFUgJ*{Jd3AZ}rAGU}BonTkhE!DpxQCH`4mma^ePsRK(;A9?}~)~j$M1r!=$D}A)I zXJ&DV^A*vW1Lu@2KgQ=1Bxu(36V)`9xj6wgf*!S{%eXc372!6SKfhL86n+RP*RZu7 z-hRKb_FU*rmZ{rYH1`chQxmpFdtZUP!SzauXKwA@rK3h`d*{qxSJPpJN@~V6U3Jgw zEY`XCK8bi7=S@K~-=e{%(~ysY4nBo#dnv0FYTj!m@M?36v>Bn7{p@@x?H5kzbMzs8 zc^?=7YVZ!-D$Gz8^;5P{Y6|gt;A@3xwahKc*@*w-W#?Bi@HVUBEjAqJL2&|GWgU}p z(dI$z2$@g-uF&3NRcd@XJ6GuGvsc5I?FVyuY7TcxB9^x3b2QSbdn53uPqn|&mKpP^ zG-#`8Y&b#%>U>D6WK~hzTV+e_O=%~ig3D-3Dndf4?av-*91XQs*XQ@1s6#ID8FOX| zTr)3A@lQ^~4N#KqPS~aiu_l4|ZX^c9^IXM7?bs$n9n@A3EdvkXD9UA$q_4>&t`TjZ zt_Y#7um+X$=DY@qTCukjrVLWzF8z^3_PQ7D?l_>$9?ex^!>x{IkM?hfYLcBOHV>Uj zoT3*3B1lVG)4@atrn#f7%e}+Y`ZX3=9nfFATUxemaf+)8?rQ;VxwOE*qX1x^!4ceY z2fy&zP5~p!!X0tejxd*vTZ$srB7?k+%5Mooi+I)=qFS|iX+sHNMifa^LVXk#XsCT=UVYQ(x98|6LPUlZ`942uV-bur|7mYXlJ{Cd(~D21329 znni~W=r?dZUP&C!P9U(+tP2lECC0K71tu$zmcM}0JlLT_sqFm>G!nF0=ODtG2#-V} z(#ji&Wg6QR30gqf*UcxiqkzJ&2(riK9=Xs)-Qw5%KsWPM%Jq>-X(enFMMwI&Qa3Ka z+*!UGdj%O+IP^0#ZI=i*WzoE;{3y~kuF~8mLl^-laBTPTHzu&9V*>$VCcDXG=ABe;QFlq|0cq3gH}#+M zOeH^dO*XtB_7O~1uu(ncHXm){0?2Z99g_}XH^-%J!RLWG%iJBha(M6EiZ^qe(!~BF zEd?0I6=F7(ps2Jp*VCnk#xN)akltE5{XHX zGbiFFaA$y9BEWQ>XQ2$mw~l)DH>#91Ws0QFR>i+6(t2&OO&Fi|M}OVk)O(f`qR-Fe zF6hqL-}Gw@X{h`v7PVXkih~?tetdCqe^Z^ve^GLV+|2h!JSW2&8sp5l!Utd7g8v~J zzN{l`lG0c(@z%;O?`!61 zERM}BcPg_y*JgEPX*G3K-LX4ZMgig`EjG2g`6 z)4mn>v!Ze>#YW~2nKzr*Nv0osuvZLLZT>vW3q?1bOVuR?Rwi5gvNz&MzOFqd|IR1u z_jV23lb}K?h-OpUGgdipP_0$oyhm!1wS>+7c6|`X8P|UE{3c_HVD1rsyI}muq%y{B zYn{7&3XEgo84=T=1TND`dt|z>FLYQnaYzFYcKS2EHY=@}7&{9iz0sHgX1iYX;2^UU z!JWV+$IcnFAwMMDC1_;wml@?8M%D8eJy~x0Llkaau`5lwL``9q8CH$*(*iNw%h$4S zD|3HEw`dt0)4jr5gDz2K%{y!cLmyVKEiu8p05BefO$SBa*H7UWeQ1ZV=slPN95Mh_ zQZ67?uk8d?ig9EW76zdQYd!HnmW08uKt+Gs4DnwTJ1IC?$29SX;`^)Q^J}Nk~=?$iCv5+}&ElwVqxc zJ%7S`9P+;~FFV99smCt`eUE%`*TzGh#~{T#zLyX_`9&P=p6dz^U3aLM)5;3$if>sy zx?;D{HLKCUFznRPh3|2{hW=kq5v zA?ex~QpL@59=YX8a=xdK=Qya2htiZ{U1gp9h5;JPCw&G7Q5y{-+ zWj?sA7wtlYjc=zlXb;r;+T{fz))x;SgzXIt0y#?+-boa3^!(Ha|+Jv^yW9%F^e zI+l&rv{5`ANai^1XDeW?G{1sZ!V}Uw@uDp#=6K3Tr(hKOC_P|8sFpkd@_*bL1En=hE?o0HyQRNbCoDOqw-s`Ese2G z8wkQdD)$hhJuQv^g_As4r0)W0Zr>t)d4+@+op7;#wim;$-%r5+C+X7{dgnk5eAN{H zQY`*F4bz42)A9-?V9Z35#d@R*&^s`?_`s9Q>^y|o6HdxnYF!~a(7X1D8oe>EF`)DB z>*Vd_I;9G~g4A2UhO|Kp_AHxSyryx37NEt`EIqyp3uZN=XYNL`pt>b`nPmq3jDgS7 zK-mahfD)X0t-F5!=1(7OkUPIfpCp*uzEL-F*k>uWX|cHvi*ViUx_4x%aA+p9`f|3c zPdvWoeK5uSt$6?zGfu~+4rEmH=(iD?y@10F3i9PKf_^BSC>@;#%|r3Lwa*yA-g!;#n>pH%&Flplh4Xz}|{gFe&V;M~#&$SSY zB`7oG2_cTHlDyHsN!0_pBC!w^$c1;q;+rU=7rBmXIXx4Zq~ekO2vAi)AO3!Q)1xs- zmR=D5$*3w$>v9ZRW8ngUkhf`PAaObof9jUWrlIwWnp7JD|0=;@dz)gaA=hlw@>sdC zS-|}(s#OjRn5jbGd#DEMymf`FHq5RdzbcW&4aj1#QaCcyVzvs{Ff?ZOH2@v7r$}-g zTnz6}2H|8c77!xk!dUOfAh95w3`x$wiT|J{M@t{sdU9^!Q=AH41Qq-}1e-d(g-fN3 z?HWS~7;#n?D}i#a$JVMsp*qfdBltX{F~p}jwlxU?GGazch|#{=^djYs8}2IW1?g7# zU_VhL^GS4Qlcw$4W0OtIO3716{2KatD-k;6VlUQ`u@A?bnF$f`Ym3|JUz6NY|ifDKd z8Cnv=zmSHa6vmJbEvqh({VY9{XQrNC#nx*tfrx)O$r7&|$HP6HBH2RW#(S)AHQAo^ zh`^>~_g2D4)Z*QYEPYc@%B?Fn^&Ps>5U8lbySHvQ%_!jzt5w*}4JH6;8Y!;ba2P)? zeX~NIm9wE^Cde?)(0D_jjug{4BF0x25_`8pL|@N;z)l?eJ-V#ilGMPipi(BVw7cmG z0g@>r?ZZ=V<-c`*McbA2wi5=eaT28FgBw&~gjhQFoAAy80<*O0%pdp(% z+A~japRn&Anr#~=EPQodBd7JP7Bd;c^&8=Iy}vUGAx*1EjkIi6H#Cvh8y8!~f3|=v zG#@Bt%=W7N*(Hva{>WuGxS+9=6V9}T17x1c5R}~E@v1fVYo}SNU;l_VV(w{F`7?<> zZ9JMY(!L^&$h%}hpfwRy4ML`b*thR@C1Tr(W4e&QfUZ&YdzU>6q?!!Qb!7U7`GL5T z4mbGJ@MOalrVZR!>1W^QfLG?Jj`mb`A1Iia$XB7*91grjo1O;xP5r{~kjHE{0Y zuQ=SpC5+HI%T6O>VA2Brec$vJtUnec;b+hy;#m@+k@QW0BB@R&lII@U>&~p3XedLW zj(wY<^!$h&+jo|pnZnJ7sQs>A>5PY{7+itp1g6GKyA<~g z`$_yeC@5EAm?7Ki!MQ>~^>DrtFV!l9VVPX@Nk&7gJm zsB<@iF0vhk7J@KVnv;uH)$R%CliIhuN*j*m@MAT6Skf$UMekThPet!&af6VRC!dRs z$&Q`UTD2o@P;cOOAqtgM@`YuN{;rA7dY@d0#^sOS)$T-9uhv8NWo<)+kV;|XNSdg_ zhgVbq5L}{T;|(@WnO1{F+dqi;O&a}B^+H#5{Wy+?_j&m)7918jI%w`xS5bXeYEqNF z{~jVpU6LF3PPux86kvY^-2~6DQtMM2kMB)aAvI9Ubb|yEi0!K4F@PC@P;N+c^YU=( zy@VRs3+lQ3QY`Om3`#_>EsF#>ZH&o}y2f&gB^V16FN?zG0?!KfjPpiVRsv61_7-6G zSLokz$XXX0B`obS>0JCo$G9wpDEq^VaVXSyf{elb%}HpQE?xyKhed#W7biq(xZ!n{ z+cd9w=B5Bh5mDYo0u*BKMSb6(NvExsBdk$g1yrhP4R~=dXdc|_2KC$X3tq3y$0IS3yT(rAJTFho_s^j^D<8dyHBv-SjCpnclLb zvAE7P)NM||_g*ahJy+pXzANLMu}BQbY~Rrx!HGF4t;j`0spMSE))LWj$xM2&`v8dw4ME^^0&Phm{dT%}uJ#J?4J-@jDH)rVEFK^tOiX^?ed$mhE zCLpLe&g#{g!8I>C6AmG}e>+Yn-aFbcbAU_K6}i1Q&j*8sP|lQh*eICZBamTcGVb^0ez zVc$aTjgR;pVycT%X}?Wv;+f~CkV|B(O$MjG&^8o`*n-e$Dbe#>cf?sgp^x^2wv1<8 zssmE7UNsMg>v929SxX)vQ~ads$m4>s<(9}B$~>r#q4J7imL*fPka!(Cw<)=+&nd@o z?8~1=$%etKYi?;r-Nh0$Hja|ma~Oi?e57eVySuns%2U1@@_A4tw&_mte9Oe8Y?`()-ZZK35=Obfr&v_TKcy7}P~C zP04-p9>ZJ%c38Lo;YE8185|j$6l8>)1{|5Y=5+GA>z>}5(uxS~RuVBK8A{8`fEgx5 z7fPOH!d$ATG$a_!;qe)5y^&%=L**YXk?FdPYR|6D&gUeI)~Cm4tZtU~B8*fUvs74R z>(L8r3v8&@`4lr5v5($B2^>XVNl9F-Rkw%p*jUKnl$;dbwrggt$J_9IdCM%e2M|Y8 zw+)K3zOz>c55AO~3W2SaX~C_Miq6KIaU36}h}&PWLVcSm?Nn;vgIDtBM{qwqRHE5- zGTjoH!kh0(zyi1`xDDD%-OjRp$oNJd{P6fSH@WLFA|L~{uE0bD+@~u~HTs1G-SyHq z78$t{A?pu<@q+AdPWCdMU`_G|;q4uXdXuU?0;odpCtLRn=!WR8h&7+?M&Tc(y)Na+ zy7RRcJ4x`!?EFAI{s><2c>Kq-niq@G0h%|jmJ4Rx zUXhmo(e$*}V*DL3kZADafxhR5@5tr{3>=QEO6vLvPCWT!)Lgu=IH&Y-N#OHiX_D#aT{+n4$F z$x2b4flU?nb2su;!3HCu1mz+7GK>fA=~?h-oAtHc3y`s4&FL9a=8Po<_sVz&{~Q^% z*%>%9`DJ$fm)=FgweIAXOY!KY%=n#uQxbmuskcHGj0mvs z^LM8EpnPQXu$Ygd)|$;aK*wx8XbEu*oje0DPM5El8^h5Umm-20dHzWF4$5}Hs$ z%a77jkw`7GNb+!%k*|KwwwTWh#M+V}OAeoghDf^s88=%YAL+m`-z6Jpid&359Ow^a zusY%#Iw0}DM37e@nZ67~nyu=v((r6x{r9FiFw>-_UdEmJpOIP`UgSR9K%(957*yx> z)(E0489t|0XzfeBK4?gSV<{~xe!0z~3;&N7#*J952;Y}X4%fW>6VHY4_J~*SSJoSl zUMsT9Sbn+hF5XCgi_?Lc=qY(9i-Wz1IFXA1fxunV+X3hoPk02rj_loWt;0_evSX0H zu%FIcJZ2VP3!wXd96p(MA)Z>d(OYqsr<0|GkK3CwfJ&~;(d;YS$-!9D z*rPf|83j$VRmgQQ1RzY^gdlw)*y#h_jqmhglR8pftF1ldXgEudGUH3{idb!jjSOp} zb{j@|gWn!7e$v(>bftQj>LFCsQ}LOR*aK70@)Pp80vLjAzM!@xX@$J_MoV4u)G zO(F)l^lC;kB5h+OGC!cTGUU{_spRu=EO?5pchG>!8%O9!Q9{Xmr9f0*3nxQ!6Sp8R zFLLq%B`PGFdnv|9bZ-YB7qG9vDK&vAH*6FMdhLJL@73Q8aH>N9rBZ7v`1MIE2yE)h zF~MmQE43(35Z}0^KM!NhA^<-tF(vMH%Q&OR4_GpaDzIZOu+bdnfIsYEPTUYyC_)Ha zdXodWa|Y%Kvsdb-w^1v|E263Sgt{{2#a;I8ki~0?jh2&eB}WDo=-7-!*oh*RSd>JW zE{`?eTKpk%T^eJ!wf#fZZgZ%~4dg~s4){Cw`&YzLaqHrc{`-N6O-PL%`pQ$}aMe9? zfM1<9R8ZqAf|5Hr)Qxj6 zINhL7C{ragY{OQp9qDZj`q_z}olI*oDTq;QxC=v>@54GultekpbXnWXeZcM19@?96 z4R6gNVx>}%gmM@j@Jx}0jv1U=B(4g=>9b#+;DrWc1PXYk+S-p`;_V04Xy-|d$~7HU z0vyK0IGk6K0t;Y{i?UcL5e~)EO))L`*Y;(;V^Z(8&#=7NhWQ}fk|I6{qK{aqvw3rz z5F=M(i5-auIU&;igtPfELBRP}{%l4NNvwe_#(l6isKOgAXkG-a1<#?~q1`(-q>r#m z9_DY1SbzI6K$__9qAo{4!UO-lma%S#-!XZiEsoEU`x0?B+7@baU_|S*pqmkkF3~fF zBuGP0eb%r)3hnnE*X{$cFG3JEtNA*;Ef?+XIJY~p&9+O{RPEK4a%dJgm($GobTdg~ zT%3a$vVZ)A{{JhF{#Wq;WyI~_@m1-Oke*NoE|qS`@l{&!lME2}uZ)6&3K06QyvJW` zw@y$51SBQnf6buS(#qk`(h(Q|#Nw!t^iVJ{iO9s*m@*)s7?k4>lF9P&lrZHO80j|6 zjLXq_-z%M~NC)aG+C&Y`gIk()t5!6tT3U23G>QNIc;Aty^bJmTW&~gYPsf;riOrxc zRt{4+s`ap7j#5`&X~jIe|Ey`4Qq}76bCw0tr9)m+(&`81%R33zsT~I0r z@}1ycAJye&+C%tZ^lTslL1EQbHILNaX6{Z7FT!~~l>;>D{S5xl#_ef`wp9dW30v_F zoW@@7tEjWvRKO(@uY+(MBnK;xwW+_Ii}k$4aU4ybrb1tQ@K|!a;CCiaS-Sag?CUWHxW-? z(nNO9&$AZAG$Z2%vO~da3u+VckA&iLC!LDk%vv|ikk%4f4!j)O=)TD$+V+W~QTCgK zCJ{Kg8Y_sok9WlR1VL0+Gw>2Ttvm`2hgL8nkhHTZYm^`j@v`u4#eS!Q>wt@{I5!J5 zw0vE8cd7K_uyv7LU4fjvLm|hKkI1AvWW%BQ`fVdhL1F}a?O5P7YR^mOnGF46HhzQ8 z2w^T@ldXFWTRA?27R|~{TUv@Z|0uX`4(Rx3EQqX|;OG4gfAKjLZi03^2nJE~lTo{S z%@eV;X30M0mpV9RwlY`=Oe1ghd@qT(7HwGzqxN-O9n#8C_0t2T#=DK{@%e(Ek^R|- z?go>_K~*VG3imGi*nk>#K6rIbktxg^>W9UEi*^um%Ynf%aP`GDs{pCB5AVWX1K~65 zJB%yqhT>e-s5^ME;OC+OH~38Pg*1L+APthSI$rqtv*tyu_)Jw0V$D>jOTI00pY|=R1GyBbp^YAB@{&2)g(sKL@yLbxE;I}#zfB-Q+uAOVqXPcE;@ES z9>CnNlz|M9HIZLo@hU3FI~S`$chdfiV2LFR^`ZLm(n3d$e!=#K&dd<&5%-MQ5kKYZ z^4zxpAL3vIa=Ux*ejA{QLKqNyAZnW%f4i3)z51c%ZV|^mQ~~OT?SQwFV2+AqlVG;C zMNk6p8qMBo{zC$W3f;4cPh|nJemxLQp)FF0spR#snyjE(uJR#o8@c>}31)@fs=U&r zAG2*JP)?x@p7G|fX`^<$P}5)#PgQ)iJ4JxzAYkRi&q(0F2U6dd5oRlwru+BDYp=N z^S5tgg%&r0OG?&JCk!xoq8IZ0!;flI?0CE_f0sX<#nZ<3k7em|q3(MQaDoR|4;TQQ zxW>m6mtf?qGpuRQ$l027MQF7prRt@ct5UVCMu@H0wwLFu2D+Vy#(hW+Bt$y!d2)7a zrd0vK{TA==w2z-E_2&J7dueMXPxl`>y z)t70z36H=II@pK^SyUHXAE@B18`rt+-J*9?2Y=rQy9@}Mup9P}64JBb#AgT#t;Q7A ztf66D;t={2m1|pjJNmk&T(jGI6_soHLy;_HiIVF9y>>|Z==7ia6M@x z#dJ0NHMC&~Z~&e(;3-D-X@nWy7a&4OyVtSx(RVF}VpV?^JPXemaL|N9@N44tom{_K zUw^H?t}0NLvxp1D0n%uVK)rs^_R9(vq{0g(ya+E@lAx%vgtY?}*ZJJ`vI(zno8ha^ z-x%_fDxV6knQ$0hM=%TLFDhNWYC%zcesLl3ULNsV_?-d2H{nhA15t6a?9!Oi?NqE9 z({0UInV-*k?%N21+u0y}qLJ-!!CUYSD}SVa;(2+$e(p>_*j7Ad zLK7(@5MLXtUr=2?ZW*n9Kzq2(wtow3c%m>-@+enLbvcZYZOh;^=DLVF8)G3sd%ZZeOndUI7D=6v%;6@QUVfL>Az zu^(3yam8EMpDX%sX`qRNxG$FT<_zJHLnFYb>pC3H0)#Cg9LYO(0+A>+TK33n9A#oA zX3=hjg4&RdV?%l+4ZH$Jn>Yq@ET>z9pPdv-1WT3_&FX-A**wDL4=x;w;|v^c;siVi zVMv!FtZQfKYmu7Vj21dzyMJ1#4MeM@k-6bcoJh(cPC_`jg{IdM$M$u-mVFX152qM7 z)x>Eyoz~Ii2uqHYgnS{tWq)@vg4NvUe$Bv{2IiYsfU|7duFFxx0BEiSWwwz!u*Ga= zG53$*{IrVMq*FDYC2I)@Scr2?EW&w&cYvgakL)sp-YxiDkzG%lQGbl{4P0R2Lgss^ zZMzVqt@YI}@NWol-&0Loj3w+&p^Db-6x+gQLRn(sQe1|RK&x3&6F9rUUqpM5+5!np zc`jUzD-2v|;^}xsi^Xs=kun*kzAECep7z`eD|of5Ok9oZ5vbRahLjMZ{BN<`#0vCB zn6p+wS~7jAq8(ggyMJ%Lr`K}$SQl1efG;Q6*ef!A2v6vgqLsxh50}Im3yUfftC6e* zCkYGNZF535y+Q`ocEh08eQmzT6V{nn&nC9BJ}UEay7n%|LZO3RkLMV;!NiTYDWb_) zPO^=p+mbCD?_-W?d6F~RIqjl$sL#Z$^s_v%T4?-`%Gm;fCTlG_!9%KGVyBs zDZ`25vR+W@bNGJvcMsl!5x$)OUWc!XJ;f;%x@rZo+x^3$iLZgHs-? zsSK=XsIvkw1c~(tI@t-GQcU}!rtrjfnz#*rNmO&{lENiqw&WcLpy7Hffx8>;F|g6Z zdpWc*>39Lr{aUbaRcTSdDXV7BEGeD8a8{v#_qXu<&42aPuVv>d-iHtJ@%@U~b1UU= z)KXH4@nI9UTa2_ORL6`o0e9eB10QYS38s1jcSV8>5fH-*c}xQC#N8(D;k(6dl~ep1 zS?k$n;(pDzsp>SYc-+J%A{EQI;z<*qid3v%VtK~IXYn~Ydy+{uXR#D2-FnExU*q$( z2hwtAjeoT~ke#@IELRc#)gqpF!Hf8kfxj{FWu7{-`$H|^y|At#P~)rOHNR@&YrJO0 zXDJ5=41B%Q_(BJ^nSsAWnAqcC`Fx{n}x6RRa7u9 zd&k5-;k(3y>d1Oq@3+7poN+u>WjA>e+W?30eSZ`Gj2~E9L$hyec>8|cmi9MUd-zuq zKSVNr-4@=lCj5x*nD9%PmwjyFC-^Bzqk2+)Gz`{SkH?;73l#rh;%E3zYe^+h;W;*A zR1d``llSK)eu4icdaoj}phIb+NEi_x{f~)XaYG_EEUF8vCt|G9ocS9Qzs2w9DD`Th zH-CmKiFPE9b7E&ChRB^(bW^G{i}@=Bm;!~MbEuE5d1feB9Vkcm zX+{s%{lDy8#NH~WP^NGQ&P!;}G2}TcTVDBL6u53u|NnGPRu&X#tx-5l5ieYH_{9t7 z%qd(9$Tl9-#cV{;{<=E0I6UpeP?yFNY4tWmAJLc0 znaY5_s-iSdzK+`To)?f&LAMkQi);A*L8AhS5?xfKJR)E1oB`qqnwWxA4sqBTO+;oWOc-ZEe-YVlA!$ zT?a8+9BzkdZYxTi<*)LuA>uCaSNm#dVLHAnMiFxone2sM(NliJ!?R5>T8trrvMvtE zIg4X3Q~IqqkxV)83bY%&=T9I>c1ZX&bcBJ%~r)H6q^>1%fQ$ z1kJ)DfW~%BC@mt*ERF6IvrV{5%+b-Z?jzAj)b18hWQuv>lt|#v4jQsQqkkKL!wv&> zJ&6}@5%W#4KrGb8X(aBfwZ5JNCYSPooob53?B-?ve>C!6Z-`P3MHDgpE;Yq6aT@8- z^^qQQol1jRWSo-Gsovk+RFx^51H;&?FvUu7x}`kY8C?#d9xd_3nWk7JR$C&r*!GFq zc*JpLkOiX56y*#;D<5`77k`iTo1&6O_o{EMj{qQr5WX@*AmR+td~0z-O$|GcQ$dM! zrl=BRuFJZHn&zyJ7#Brx+i|SEh@dHI*^Y2WU6G5mo>oux1bmeW4pGmbX$fcjK+?CR zuct%A)|=uSMl2zMSioPO3UOj1qq9i|>03hTww2q_jOUr+e5N#~9eer!UW#zj|5bITXhnNywu`$e!? zjr4JV^0thX?Jcm|b${Ovp;&=P#$0(rT^)0y0z%E+=NrV0hWNQDZW3D&rhTv3*cD5| z5T<8zF>MEE&29)akcyHZ){0w*LLns{l5h))?b}W93vmZqXa1TB+x0o72dTR{T=QG8 z&4f3_FEy_$C}8b)qqy4?_lQO!2P+0$Fn8wSRTEB}oXfnwz<(v~6Zae90aHB4PQQuA zsdRDFyIdz)xx_=_VMA;;#Uo-z2TleXnqEL5RV=D%Af4G_Q$8knqX*EBmlH(oC||u zpDFf>$87D%c7MK3=th1W2Tm6Gs{Eml-wOG$+3C`vW24pdH^VJ#RHH4fV3}eS%f;cE%=jfx4N&mN|_xO#5k{X%Ui!RHUOc6H`$Y3xFys z;ka-^xxbdF+K_Pw17mvC5cs+VPLGK8aY-l4G-P}WB94KOfY7gnmJkY5`(sACWTFWP zG6|t?tVbf6_OI>1RLL0^GQ~RFTJD^ zuYc^hLK5@Mi^b4~N1X{WUG_KR08ci;(wrm*^U8*>8MT64f8qu? z%#_3B2zEbM3QJ)|7y4Msy!HR1hSCtelm__~gdQLUvG&!9W zLekf?%bK>skTZyUJI-q`WPS(v64nuv^*t9JmVa|i zS;V9iAE>vC%nDA1`D=nKmh%m{z?2K+BKvEWo~k)yMDZ6Z3ut%N6XVRtXq}L!QR>b9oybrFmEp`#c9{w2A$;=t1}ERJqa= zL*?mox!Uoqwm;ZT+3vW_DbFNaH-9?iYIJy@&ElZN8B)O|&o)J(tmBUn zI?JVL-+wJbrfgv6wWGpc*09DUtK>PR+#okvis`IigHEesf95Q1JlB-x$$#@L!+v&E z&=<1WX1nBCc>yoA)Fm&J7a8(mKG`iDd^^@6{m9l2GTQyFDCS!Z&G}j1l9$TM40*XJ zf6SkIq_*usOfgtjSVaPqaJiBZ`3b`8u2T%UlO+}}ua-YG_Jd0FDcWW1uA%E5~gG6r!Q~8ai{5c<2 zoD~9e;aFM5e{MGAE%H`&qWVLuMOw1KnK5hDtl6`PLCf3aFARByDesiq5OQM^%sBnJ zIVa8UV-{ah>pQ1LCuR@V#l@tKXkk;Zq@;A=e6pd6j}HXr?901Md4IROhXVr@6_Ehu zne87>%gsODNk^?nkoUq@hP;nhd3!mo)QoczaEE-*l)vIov6Ey($QP)oci}biVN-6G zk3>Aw5sXK62V?eA7RyKJ)F6fB#V%8Z8I&D*wt6vV*<;GRa-VgvG&Ld&>(m;wNH$(R zCLcHC6Q(>MpKOz~Sbxu#zdomgABB~b*0)fi%!e?vwM(H*Pf~&3kWcgFc?Mx^*O#a3 z_;c4&vgmvcVSFHH<>6PCTTlD2Z7p4g>u1s5kPZY_=<{~LE%J~le=VQqZ<>fLUDz4Q zbNE{W&i-rvTe)`g-+TJ85izP~<%_JPzC;49z0Y^-Z&$hB%YUYPMay$`rdbP;r$RDQ z#$i*wF5h4k!^iTt4IgVy^mN@N6%yb>(kbNcdDGrR$nH3iq>WZWOM6ScZOA{G@*Vjn zJ0Gb-E@<(!;F|el>aOwEF$#P@EMFpl(P4JlZ0E6BQ@&@4iIObeK^dJ#z)~SmzGuk4 zkTuplS5_;BFMnZI5?E8Cc?wZ~XLC*M2H|&aQ>RZssOia6-O5ktL?z$}`?Mg;XsX>( zqPK!z1)I|BhFQ>1UFNSVwQ}rJwVPt8uP&fH7gnVTtqst&75*T8c0EUHtSpKtu)kY3 z1N8+lpX(=*+>3qZ?`W-3Pf{fb5t@cWC7yPTN>Y=mtba&VqW+4ULt2sLYrn(nA0|Xb z@G5kEw6o0q+MHx|r=UCfG<^zxaiKMN%P}(kIKB#|jb9t7K^W5`2(hQOf=(?GDz>mW zvCHJOR-sxtfPnQWa%X6?6CS1=Ez?2UtR6&74Hb_ts@weymC(7Ds^wyc$SftmHsvEx zN?KzXe}6bem!Q7omm4MPhz^E#=MxXw^&0&VhaNJzM_+s}k@I(Xobth=lUrdyTA&5n zP<>ixsg@mR@P}@O9rq)Rr1cTE;X*{Ap_ojz&M34aCTC@e>p&yfO)c3I?X-PID_e#g zyTiD9jtcYCrLDicn%YeX&=s>zsA)bY;!|Yk@PAhj?CdP84unV*vg7DxY=B>z#6JjI z8nv>B2&*bsv&P0itemIAQ*FMs>GZhc%Oao5AoT0_TNk1~KX)0{4K3}%GT9ccgi+JhIFa^BdqS6%36Pt z&`F5A1GghfSqEq}J&+JtH6{t|^&ZQwslt5ut#V!dVdHgz*X)wRVs>D1uwGiLJg zT{Zr5qFz=>9r%d-A>Eej-#}+c%(^*8+kZ;Oo_yT-YWnww*mkfoeEN2jJ!GAW-OEvC zJv$Anw2`40U}~{8H?T|7bFDb3PlZsF|CtA>L)8*pk-zg$^XSWEL zpZq=J`v^(at)juDG$(&B)o#84f84Ux$6@3_UBu@3qZfPe**(cw=u*l8q?{Wlg!jk*%Jd;-k#k5ffhNWwLEAg z;keJ}9?Fc;|An4nsB%NCLa3fvntzwq*_KT$Ev4?$e*n2bfQSWG>zm=MiYn3xH4W9P zYOS;Y;^BcZV({a79zCV&XaiZw&Sfkh)!eQq4eD-1+Q-|gWhF=JIPkrm2N}Ldbft$T zatFcK&KJ@_st8*_0mgJdtFbMTLRcO~H?3>iA!ZgDY4QY%{B?zvI+jotjen`rwC?Bz zEsR97V-4+Se3y6Jw`NTpT?-w9s_gMnyXF9GPMPn6uO|~7*BpkrvD3th_LpO*3=$Li zX99`-mRmnyXtnUyn+f*5S~_Qv6)i5bRTTcUhcz{Hl`2?g>MD4zB~x@{VwJDDtim^( zwSnQ25pMbaG087RJ=6@q6@Oh!eXA8rLYUFb4-h&^;#}Ga{=k`2Hqyi^IxA z$UE*_=cVkGY!jl?pEBz(rf-clwjF^Az0LhvV-^kbvgSz^jPBL9b$>5A%FBJ~f+5|9 ze_cUt=a7kEPsTzgP(FMdfBSRXKaMupQ z5l`zbYr*v-lBSkd**|3LD$&0hI9q!H(%TOpjNwBevADorADZvy&_%tW-tOsdQFZh~ z7`$kAelQrS57qf<=lerzgBA73aq3Sl^{#r)Q16@S&*}r>%zw={EKsvPxXzzbtapk= z_$qz8JXVmZW8YqiO@gooSrb??uzq-PFu1Ovc1k<9w}XM&f;g^5Ys${Yj%wS=)=~-G z?e=Kt2hf`XO|?TkN^g?ilz*uj)xF7vBaYt;Q{AoZp|*H_ zbD8Q+wax7?TgPSF>S#_!5~=)4YSz^R(~F`vPt#t>Qr&CSqKOm$ejLT|nJEzMM~ zt2f;04XWtF6@5+hs(Q_>UL(O>?6 zjv+075r4jm1Qfd3F)1j9V>rTyZc(P;7}+9yw!Nke1js*jLuKS&+2JSuptyeKz=`@f-hTFmKKj{DKL!6zx_%CU zq53((e$UX)Eb5sc|3))?Om8bd(fpv6HVHFI9)wEV0 z;eWW6a0$Q!I147jx){9kqIl=&-9%lA;GGx2TmBP$Hr_dax|bt!CyahDib9;OtkIxN ztAh<1<-g$9?F>$DJ-EKz!Jo?vd+>C^iLr{yOsBnReIgsc0UI@h-d3;Z%Hs6-)5P)% z`R{fR8MM6>BImb<2!GgV559!9L^8o<9e<>QQu<_ez=Sa5HG*?~b{J+n!ap`YE+sOKm@+*6Rp`>j|YBj}N6~;xrqjhX`;SAKQMIy?@*t zpMtO(<}MgbxSWy|hJ|}zNuJ6K!^)ko%B%K*U%->FF3;h0aHUs`4nuVq&Tc;Dej3`% zMBukTD%?s0ej5?~?Jx~~p;4V~%@##)y8K3dtIu${{7#e-`iU@B{#PEMC8fhKc~l-F z499?5HqlLR04i*k$j7#(({1gMhkp`ET7%Kx|DFb423|-QLU{`F9R0-|H2bvvJ7B{e z_|Y=jjcqX2tI{2t`a3oaaBK?0#k}@|5Z4IaEdm>xe&1eeIw3SF3_sohKMlhTUdJA| zc@Nyt2nv~qt#i!;=BABwruPz-_tClDPn_=o7z+`_C|xi#ElS z)2&Sr2?U1GddJ$7d(!v7{R^zcJRF8c_4V01dM`X7AWwPKK`7Kz>{ZM298d3oXSPCu zSB2quB4>X7CNIvejN1XP-hU18-Z;4j-tan}X@rD4gPvaFK>w{!8#7&=BX&Nz8+*MD zYr;5hTy(;?<#|SA!Z>@vIG)gHS32zpoq9q;PZ&>6Z~TErXkR7}&n>5gmJ`qA=iTrc zyg|=5;1Bv~ozY^tX#jg@7x%(&*axFvKat{NH2QHUf+t`Z93Vda6o0IPXCMgA!g=r< z+yDoO{13q|h@IXI&(o+EsPrPd48MUt!mIi$Pp1{)JE|9P20@s;rqXDHB>eU&4~0M5HV%OUx9^7!mV4Dc_$%+?-*&@i&GetDCEFWt0{osN+MBemZ|S|6 zV9gU<^Nc8+&xq3b44ckR0J?puzrAKB;1L*O;9+8L=fju84SyK(&D4*_47OHP=n!PJQkd(z&HJ?PnkefgPg zKdD3CFb;k&dRXIVfdGFaq(6pa_=H6Dr^KZG0aM^JBDH@JF@FxF@C7L^UqT&x1)JdO zD52-mF%=Sd8#HQ(CRPWHovMb|0ri^zKHhbfSOsWH0mxG3V|Y*nEj-Ln%^hPDh`wyJmj3;lGk7MD2(NE+mnd|U4JZc*(8|`t7v*gTdZ`@v- zgTN=h7f)e^F`i3{5T3-bdCn}aGmNESJZ&rV<$vOdBwgZTp*J=?zr{fc!oAqcS#n9a z0qg_u*cTGf3#r%-24R1ggacq24usQj5Uj<)5X2#HJ`RJ;)OIP3)Vnd4jy4q%Ri?_K z^#&nHm*VO0hp22dn$Bbr%vEFLb^5q3kM7##Do35DwaN?BSn4OD{7Uy%<46bpTI-N; zM}J_Dfn$$Bf}zGE9)*4e78+Qb`z?rXSoPu``mnhwi3zQj&gD%kmeaCYZsfq`jZEy% zJ9#F;>S=mE-p_jCX5zhAw!Q!K{aCp?b3oQ^T-&@yS}(#Zk{;P$;Aj|tV_+!eKsJ@f z;W(Ix{SeRIG!!WWkr>dZ@w;(107^V%!v^L0V&!wzfckO3X^OXltKY z$rhDIqopoQQB(CD-lC?7MlIL3Xn*!%QCtc*jzBhPAL+vuSSkq-S6Dt`vz2KCm;pNI z3SZXBj>Pjxm;OTM6n`-;fysO#zAC}2B^HxaNkJl_`{<9meW4)g}1b_6lAagV; zO{^@1@rFE=wHI$>*3xSS-m(+#*ok+MUZQ9K-K70^-*Q%>Ki`cHVa!r05;EF_#Nun_+ z%agPhpB4l=uCZxHmM6hudVdo4;z32M?1kK9Px4k+&H!Iw;D__vTFD;mbw7n~Y=seC z;}Dqp@psF2Pgr~1{CZS$%5>Dr_g^!GMmX70i2)++aioSPw@%VL}-A#pLQFK#VEz_H-SxPT@ zdV3x4rs%gcdV13iY)QbzW2>_EifKfC3EqT*Z~+r)D9?;NU4JtyX3E?|nVaNEbkEoZ zDu?>o4uG{0L!ZdG!Cuv+>iZ|sTWO!5dh{C+o(amOa>K-wd5HLM%PogK;+bb-J zx43aj5($xKwj|Tvom&#=?_Gol5q+NNHDhi?qBqgL6`5SJZ$(n3H_5&hi@3z}EK0&+ zNn_LDOoFqVWPi6fgG)XxRbXDCW#r^0Sq4sSve!5WLrD`5YxpYm^%{9@<8iT;CyevD z_ldIrN@#oy;o$bV55jP|4dQI>+s~VL2;$@H&W=p(U1#-fpx$~LhI><5^mf?2l{aPd zKC!{-eJ=G*^``QsrP?fEpzf{g-gJ7NBu_Gp_z{ipIDc;jk2m2ExM>X|iBd4HS0kL{ zac%{t$Jxjv1|#Xz2=avpn)&FeTn~|iC(Yx@-Y2$@@aW}DJP2d=h|9v_CqxQ~c^Q}Gqz2asD?(+81CF;Wz)t8>$ zz6UTb-hUbqzkLBwzzob&*1OuC=e0`S1CS_2i&w?##Jpb@Z|dg>;!omzdcH3{gRaJB!0pms-F$hseU>?_4`uYZ@PZYb}Z1(rH<41X{jP&0bEZoFC}q# z8L4SMhT(VxiO4HqAzlqi*o8O3e*8I?FoJ3?i1s}$lxE<%>4qS|n;u*LTSL1FB z;9ji9eYgqtOt{z>$bABsNmKccVvR`ioiqQ7#9;VM;(P(#E>HBy|QvPGtvBu-W{#0<4i z%v7Z!U#$>@s#2V#YQ#EqzNk_ciE4GZs8yGgTM9CN0P%!lqW4^R-BUHE#jj{rDV7o8cBVhL)ZBR7^vowf|W#c)<+dl zDH&gXfI>Bo)UPCQBTTbPZ$q3_A_`isPN9A#(NRzpQz?b`)X>P)o?Jfu;ksnyB{y>YJms}4N5#MdHMm8o*Vc{Bb>RX_#J_B&jr{4^p_ z{s|YVN{!2hI7h8vOjRnTtF6k-1!tQy=nqox9bgULb zRW0k7j@9aHn!_^ADv2Jf)2)Med#CCnJEcP4w%6SNy{$E>^C0slTxhu)YX<{3JjUD`dxgpkq(8X(xLXH7f7_fQ(Jvfc)6CU|K_VX-0J zrGJjXNd^Y#pC%Xq?#{vCtw$Uh3h47JICEk{WT;t^stN5F}>-+_}Fzu|U| z9##AuoOlf88R}f_HN?Oj2{8|-Ozs_@JcC+#(`@5XnurWt9nTJ6yQrJ!BE(Q7BfgOS zwJq@TU?~4`yKUoLKs&)!XGZ3KPH}7cxP#D7YsvGiSD9@q|JmC!(~-36tY%MiZ?;Uu zD-bVUCFb`U3>1f9uy`XHSxbf#yo6XJ8-N*6^Dx8m#cNAe0uF{D{9`>fG9|~-xGhY@lU8{s1|2sB1-gvFbrdFLhRw?FE)ck`09WkA5T zK_J`Xo{*d3P4=Wr$W8U6_7Z=-17?sRlSoRxCuO16#U1vF4+LrOAChiLie}0V@wc$} zEG)jvO(oezhA7z#-{ht;5Krn7Pb%4wDmRq|(i@o)jZHV`2|bB_+end5^0>!X6VhB( z^GA(vLSCB8_0a$9KAthTy{S)c-N(ay$RNrlRiC!;h&S#TuX}roB@x2v7qD5|J`7`c zCRvZk5xl)dSTyCj32w5-y+j)|Z|kml59VZhk|*d^-U^M^9WbyR04W+k$`VhCUSUeM ze$(J~H|i;6%K4ekPET>AxSgL=e~q|D*I&+mPpW@_pOz|*XTmb7dzbF` z`=ki{8PdcD;1z#?bnzjK5+6a1_!~?RpTHFHDa;g~!EEtQI8}TOr-?7XFa8a6;yP9&PACW`xIXMhpqVi!m0^gA%@dJ4Rej+pQ3pq-}$xKq9N0Z__MtJ0j zB3+IU!{vA}QJy5G%3N`>oFoe66tPfF70c*(1}Wx$tLa%q?;(0_qWAOV$zrpdB`&Au zm2!r-O3oD5$$W7u)%}u`_Bx7@iyN zCw|O-{gUwmn51WO<0mjyUCQ&~Z%KvItzsgnQ9L49%q5l5s`J~WzI5Vw>N0gX$;Q*f zc)UdY7@TzaBh?k^N{A;K@T#AvtB7-N6shWJt*mbr3F@aRgOv3h_y>FCcfu#?8dk@} zRjl->YuRfm9*S^w@lYg+OLgB_a)s)yBOWh*i9YYPy{1z{y;i~s|ji#kpw0SeQee-#BM{~V2Gy-aggNe&jAveU6Xwe630-66@Urr5&pcK6 zpqyZ{oKMR-1c^~`^le6L9?{l$WHw;;7of1w%gIkNwm;)#kB1wW-g!qbmYaGnHj61h4F^v#k+7_Hm%dS zAp4oo2eP*7l%z2*mSBv93HoWRawx}^WjQ!x1(|7nGA=90JYGXa*;>e!XF;y4iiuE6 zipHhJ(+X;A%`p|^QOG9sS0`bAF!qXiPvzi;PRKchR>MKzkL2_LZud5LKWo6aL!5nd zm{$;ndj@a_TQ$d`vpImRtN=D?c!wa*3Sh^1<46}QxCfl>WOngIV%c#V%Z>?wXM2^` z!I5lBJCwPG$KZ)eWv(Cv1Y#w8z6BvV2;{+ZCJy59kye2d&~SYO9VE@zF(y_#-PBk4x%im~0dAT1aNT zMaJVa%}NY)ivcHLBsZroF%#97?elgU1^pqOH~1*G^|mdvcpOWA+|c^R&gS8OE%JZ< zEgBND(lp&V)WG(V6?bZ8LOM1kuZkgIcXTE07~_Xln>2&-Hq)fXj)wl77S55v`p)&dH~o6LfyEp%wNlX;;C_a*8M(ixS z5A1%eUtm<1u;5-Fh5Iu*(PJFAMjjzT>3<9|S)8%NJD9)}F4++_x{_8{O`c3L$6*EA*T_$+<1Nz_FtXr;%q_|6&}}a z_+wte=;e9l)1$o!VL6*aSqJHICx+#mt&pOBE9b>F&9nR#c}dv16$XlW}IV^o%Q;Q-uJ-zM&jZGOWht|SdB!Phb{j+{r zY+wal9}s85Fi}TjR!`&=BGPJrQ^a~G73V;?*a&OICa4wX!ujGnxLBMISBeYZ8nGFF zZW0&5J>nwRDK3Vm#TIx~Tmrurm%(4fC*CNG92| zMyEO^LJox0gX&jA!c*v4KcpVkBz&iqMou^dZq^bi9!lX_Ewx;vbY7&R3<)rdWEFee znKnMw{%z2uO54@+vG#}yUDBTJD8sOqsA>ukeV13CEFr4c```^S;2JJOIBLh zW^yeNAibVtzg7_q(rZoh)!_8(M9xcca@IoH4q=SmM=Aj9mGuG|n{M;Q$*^2M*~#gA zfAn;D;~e}ny$029nv~=<6hGPTA%DaX-aT?Nv8zj-lowhN+@Lpw?)DW{fVRvg&|cnN zqoeehwnJWJ<(7H89{UP;xujQhy&XuEHxO&|rh3!D@+NO;UuR!eU$akAA0pSSS>Dtg z^0u)2<+8?Oe}5!Onsv~hwrw`_6LVlNf7!P=q6nsoc`%=}$kRnJoF(Q%wO9xZViA$% zsc?x{3|EN~xPh$dTg6hiUo3-%#c8lxEQiO$3V2qmgxAFB@VPhxz7c1_f5j>kVl}1+ zAEt{694M@BYr>?(eon_(qIMFgJPXS-@%ADcf1W1ZG}sLlIx8oYteF3*T|{<@f5`an zDy()BDNcuX)E-h<<4B6VtoBjKfCjinma6?k(C5SL@=PkZ;1ZIVtEptdRdBU>Og&D- zcmrIjo}f}P+zJ<{1B8Ja?k5HC8}%e{tbU04s&H=MARX8NU1HLRB|eM6-o*BY{l{voxf396x2N9|HdAq;uFAulv= ztRboWRGab#HNhZ|(Sg=w5d6iQtx;9b73BP~jht^cKf7hNU1cQOZm(?QWPn9ny1zy4 z;V~G=vgT-PzEEf}?Oyoj9OoX7A40Y6ZgP0l>zOx`p6NHltt6Azfl5_^7(=i-U zzt-03#;Dxds3UVoWD=qSoM1=D_}HwG&qqhTpp*Ex*CboB&VjflLRKg7(blT*b{gMN z7-YzMX`he4c!O1C)5>rpfA;gDddZgAKet`@`I-8z7H8QzIU&p5$iwrq!*X|a7~k6= z_wSKU?U&CkkJRju2Y1UC!tyuE8k?SP7T#8*VF2CGfsi2v(d`@zGsTdoiro)}tKSfl zX9k?FgQB1pk^sV@zwcl&A^Ea;#YQq$f35~}di&+6%XiCH!}7J(f8R;H74spCsbvTd zj91lbHjF7Yj1*4R&)g?}8=I>i3utK!pp+<}!#zS~X}ie0uHLX=LXnPJ>Z|2{_l z9@ry)*BZ`}7&vbATM}*nPW3yw^A?s{zd&&{Y`yB4CG(>{R{PP^`(CQ zO22=jzNLSy(vfJXDN=HXXvtxh{^D>t5*UIb(SA>+88mE1D&26a)SFbRe!#Alc*1j? zBYlP!EA=7)@5Wnk8!72Kq0-SmE?%ZP1~>+(csT)Ym1D_dEV9?%@j$w`w zjuXK9e*jQR0|W{H00;;G2!Que%53Y8cMkvnu$QqS30Qwz9M^gOf9x&;tC2vU3jx+) zS=t4m)qNq$66jhC=vagzVOt)S0Y>cZpxs#{h#T2)oVxCn^hm3uX;inV+9a-J)k2b$ zxM|ZmN7JTPdf!KSruUW9jr+Yfv%|2vENlH-BzE7t_ucm!zVxlvUI(y?E(K8mp8~&% z04fQ!7qou~Et1euBa!2S7xcJAsN83y3~N8Z7Yg?)s3I(uKv~O3M2=~h(H?C)2nD`s zEP$$Dp^8PQAsmaF$w+2w_nwQ9OJ+JTqz@TZWH386#$VcyHg4(Zh>;vmM259XdZa@h z9M!Fkgc%>poZoVO%P#)tG{+|i0cNFV2sPa^oSA=XyMo09(!_Kth+12kB`TI;8KFu~ zS%ziglVDILv4T)B&?&%Is%S(LYdk1rV2uatg9lWs!fKX7DnbZ#r*tclG*Wsztqog| zjGmrgZ4&x~o`{?gFfqB)9>iKas9>Fnhp?WoWj30m=3q&d5h>?nq>t4-ESH1@Bf53M z%&>p>W{R*b6wc!vH`8oAft`b5t|5dKw5VvsM#Ad(5D0!|@-FG&s6gJNA|f!w_F1v9 zMa9DHzuJI&;{nN1D#X(LW3)p5MNj+&AQ##>LXkPN=2(Sl7L_Qy7?jcXS z4`)+x;cpMI{soAlOTnWmy3s>eI4i-}QsY^+)NY50r!KS??t}}s1oh*>=qCv4ix7V) zf}-FQVdad|F9?@<+!;h4PAlkFaRwZ+EhWN3X5wMqIFZPX7%4lKqN$9frQ&StO`+m} zSRA`uFg~YZ0FM!tFd@5QMLF~i+F>Z{RFYyYTnjK+=_d;EROsE?(Z?$1v=8EO_=3%j2??+)S$(Grx zS%#1+R5UR1B7h}e&Pk*cm@39`aaOFxL_YhpA+F6!i%~l#P%|nlWSO6+*3p^ys0iMQ}qL!-wpyl~=U{{9O@)2u+S& zg~_yCWK8f^Fb%txUR=DDhIu0Dkm3cqX9!QB4wx{|a71Mv41H*0$FllW<(zVwS9n6s zA7xGJ13NIQfZJ0lf|;5}ls@K;esJQ0Dl^uk(A+(G&b*VI!;U0o>`4&_g0dweyvBnX zo-6kz;Dx`)mvOEAMm>&Ww`m-k{i+93SJ@tBTXu)qG}1C{!61_CuYO3mjUw3cO6PVb z<=6h{h0|Snm{-1;cRq<~daV<^c*R6n^O9Au>p($1{g1Cz2R`NdA!&-u zfyJ{`(<>Q`F-sSP#?NO;UKx8@@6x7)H%XE#!a&nh2&88(~D_ zS?OL2qgW5p5tK?)hlgErYI0OGqb)G@q9MVSoMVXe-xB25X) zo=u>&9Udt#deJ!QZhjZnz2&_#KFohjWPZp8 zE;cNiBLr$#h7gs^loKx^_=P>HvSb;$lUDx)6;YCYHGLlZQo$3cRlRA z!^=HOqO)C%!`qpMzr5^S68FA)-f^@=vM-HixT)#9O&TRGy4DqTxUqJG3Fyp?m(@dY8B_Zh3&Z0( zZUM}qa0k7A003?#Yo$bj0q6k-9^gP<$JVdKz3%Rtf>VM2hnU~le6t4nJqlg*DrNq1 zyAuhEw)))dw$;fk;-_b^+-Z_o9jxki*!$h=uHQXi`od5R`gXvRrV{EGV9W98u)4oB zBwm|;$BwE=Yp+GQl)2hbzR6mMYvn%meub8cMT#^k?B^c$#%b7=0fhDuzvi^;s6s|T zc1PT=40ZcfZe72=Zb5ovw%c+#PBmqEBdp&EdI$>{qTtBm`8B}Fku?;*o)RiuI1m}6 zSu9ldCjL4*Z{aJERdRf2tMZvTE;uP4wtoR#@@D1%}?sd zb*!<`HqKx5+WtPCBX{A&rS|eEI~x86DZ3=f*>XOSIHEbvX~0as%7dlQ3KY365S&16 zS47Q58VC2oBprhh3%{EN0bVAdT6Gf0@?2szvA!@HWBXvQKocc8>Eu+5Ld?6d8bf(j zyAa;b>3q9bz0uSs+I3rTr0Kjl0W7Pn_`NW0Gx4eQwLUgHHYF|Lh9w;vEH8U~xz*K% zee+Kmu?_Rw2ZSQzAb;*nBwS?OD#JedB|^Tu2x3~PQr>nRyW zQ>CEjoE-|eO(&qZbZDQ#vs+|PbfQ{Xn)FD9vJ@d+#6aL4^nM>xD{VJOyhOR9PCGge z;$~-!6vd+IQ89V$Ee9kxz>YO9qsQ9|fiuiE?w$uwmQ z47We9YTx%U9zI|B<1Kpa@3d3}CvfP&*M>-rB|LVbPbf;Sww3(;3MYKAvA ztYoAHGSfh(fslyXC94nGpG-{%;J(|vMpsY?Sq}RvZ0~vfTsVM3 ziR1IyiQu{?n%`_|FUWHrm9!&v$O|wX&dC`JTxOS}33^(Oi~Z=q5fp-SaD!O~{T;}j z&baM+#r=r@L2*w24-etgPQ`e9LMkWS0zu5t>az!#_f})CM9nbEr6P3*-(CP`UsM z0x__*gGv5L(E@?FWrZ9`jKGK&Cb4V3qQn|(q=;U7NXVK;Q6T4Ru(Pz}eWTSpHS+!f zdwmergaWZwdTOVm!UO%0oo5hy(|NBbLAHOTDInN(C+zoU4bWV39g_5|=vxZf-k$c0 z#K-xUYUir13z&8W2oVk_^n9Wkluuj#M+P9IBX4cr6CXlsfI2u=cl_rV|ADfrP2Qnm zB%t`w6uJxm^T(Ui+6Be>j^ZW|GyZ^DXaK?2SpN*W%Li-IhJe{x5XA+*Iv>_^T;uwp z==ws6MfbUq;OqDBYKuYCOWjMa9#hzyL+56vEQeIAJ^XEYRHv>?YTY+axU|GoC_`6$$G z-WaGc!tL-NyzP!vw>|KSGdhye0*=$Kf}L#zJHrlDQ3<@{_Xp*ZSJj6k_NFTT(m9~z z)u$){K=`vKlDG8k81^s8$0*6iwTHF?&GeeMW(niRBUfFX>D}&B3s|pqa1QvLcXy8d zZ?~p-7ju3U=wMZ7sKy6m^zgdJCS}9_umlm-+HfIgbLwyW`^q zzQY4oNz(gfbEq~p+xS!QacDp{g3kzerLW-njV#JB#U>(5}ICqu#ZzbH`=Raoh_og)GVP1We=^I>|rT8!Hg0oUmeX zl{eqz&!d9iyHMI&`#A`uw6^S(>U;a)UmL0@&r)uO*ubU93ueqLQ*SIfc7_Gf3c*x3iepeS>^zXTl za?2{#Ipr=`wPaEvyg-@3p6FSD#oQtYk%qDGG4C5w|Cz*JdZU=&p-LJ{yRyED))V0t zt@P~FDHUFk9*t>g6oo$q>9DPH_!fy44?dpvc=gaGDb+7qREDcnhC|h^C{2^>ieDHl z=U)l@AcU38WR_EDiGw@^Mj6}(b%aV8${Ab40B8VPKGWqxWKplBSKr=+R=5$_Wz2(D)2)+vOU`+r+EHpvpK( zp|RBJDk6DBH(_PHQAj2WT{=FJnV2@3Cab87jUT$TX$`V;h!K{+wI~dUFTAFap(Pw? z1)u`CA1W?m$FmU?$_F~k22;*bjP#bkRj#*$f+s+T;$A^^XIF9o6aIyP;&p9m1996t zB&|IMO9)PmM%gmAl(^I=ZDZ-hMOsC(erd9jy=O5dW4-zy13?vlXeb!SA0;NQ>q(^Z zul*I$bb;`MpkxoUTs9>c^3PRuU27yrgNcS{#ye}ifrX|HwFp(4tM{fsa?CqYPWRk? z+U6#s;+e4dF}Tkwe4m7{0}G?S!Rs!mu@eD3*|6_0Am_$g(VXqXyY}l#R)f^wFOKVe zZ4keQ$eXFIn=mY>C3I!kkh&&2%kCjGd+!^2bB+}qsRkAB$FFt`amgPW1N9dIAIK=h z%Z=f*=)V48KDA#YY;lGW{s;ovLjReL76#E-j8Y1M6*s14+6xl*kqwAvW)tnB`bUHi zNm`_@k`_Qa?u~IvODuGLmd$=CSP6{LEme%n~1z@n9yx&wPa)sS! zeoXkcLnLD1+7@a|_mggQz|&wVEA>cDv80q?FbyRz$W#EIIzlZ-XugMWb8ED|HpP){ z$%8mCA<2|%rv4xE!QGipj?sR&C^Lp#oF>&mgNh6NM_5c~5r@M(PGfCxf_jh}SDP1= z#Dls+pPsX=^|6nhFHN+HcEb}$0mW7o0~DU zqDec4&6I?aM;i4YuxZRC9e&!5Kvyf2M=hdd$@eJgL~&qiM^Kx-h?!?;)4hOQ!hpLJ zu5@kX=(>}q7vj1i;xIOya8;ZSZKl1d-LeDhjF8>&n07>Gpflf6Tp_ccK2V-f(gzT* zf^pPS*&3BO7`~`=!or2loqE~Eb*;IUPinU5rd_u4%pH~FRQh;R{@}e!3vILP4)Lm} zS210l$w^&IL1mSZ4W@0EN5RA?pLD<5dKvLCK%aC@=xfjIM4ghiV!&9KLM9d7|b zOL_cuj(%gdPDhzBbUX%O6kW5c$0loG?jotOe)h(U0V)a0&hneHORd@nw*ivota!A! zp>CSK3im%kRS2|aXXU+=^D+g@zqWk-=uy<+Bg%#8pC z(y>;+c8e``&EpmQJK{@T-~ABG95RG0HP!E)7={nUgg`Nrz!BUJkn%^I(+BWC%t)!* zKvm(_;!xh5aB{xiEj%f8ef)xY63|5*$Bw^qd|w~`)*7_C0dX-N)N}QY-T%*<=yy0D(D6=!0nal zZjVyLof$zz&if=PLMrIuXR(Sp?mj=OeA!($Z|@I0DHc`QM@-`(?b3$1$K{RPlkW`I{mLHt&dEg)b{{CR0C31<}!K&1J6MBHC>( z1Kp^T#n7wSyxIKnEGTYawp1A;WxVNBbykdrs#!#*UfC3WY<6<)nndM&E zCdQO@aI+YKN_u48pjp2tz_TuXo7F8f)}VcDF;so-!w5#*L@=d3 z7H_N24Sz!Bh9wvf-U6EH{_7^OY8PWwqpX*IPmZ!`PUwAO3T2+zY3I9s>m^RatYP3W zN0OMopO~`p$UcIo0bZ5Q_e4O(7IYXMS#+eYnx*mfqtHr9dz7CI{|far^#0W5tfrkw zyKSyEMc6r@uiIys!NwX~_NPHy6$GRQ*Qomv4Q<-rayBQbZvhE@KDEs0_~+3HXhzE) zR)2PhtzM}D(CG4pQlmMRlj!|AQn_FdW}8NEW}#v95ZXgkB9{wMUMkMSd7%WAbrjV- zE6(odX~ow=dJxSRuE#_`wU<#xPQb#dZ>*9oaO58Jo*#TkM4I&Tx(<@C7GDn$e`_Is z7ab~qnW?goa{_W|Uc!WCPfCW(6~2{9QZ5hbWN8ImnCl%7B79!t0d`@bW ztK!M?%T3UcYWHi!h?NbOe~YQy83-~m3K2#oV$cIo7y-#jz8gvr!VZm2=Cdz%*a|w+ zbh+}oMJZN}mb!V_d5HZm}+hc-~8tMj{t@$#h>+3BDqa3H_q zJqr~Gs2p?K(S`}l!OIK%B*B`^7c!|(eAyJ>4R1Fef1zNf%Z302g^8?{UkUoiXC2Qx zM0ZOPTmx&G$CE2B5S&f|kWS7Ek7T_K=N|727bsSaHX5j$3y&?6-7JFQuND^%4KU~F zn^6D8N7H#Hp}yLWR0o$4Y}WC@Rwz=(0HXbT!dsnG^vVnythd0j7+%g&#L+83*>gVM*t&Vd~#CeP^ zoeFpdE9k~Umx#NncQm_&cEaIP^)y#8^S*!D$q@1m1)k_MJuVtcoJG?{?bOQaza4OS zX8Sq{CeKO9uVdy({GimqN})dOQ^HMSV%_2Z@=PjmilG=5lO`_<^$``uN4{tZMI}G+ z$pI%YnwSnGm99G*&$Sewlm=upRTwuRV1BYy)6dDn$psO_h8BP}ZM98UMQzV2qG|<> z`dwo3JQw|cjH zwfFrcGg>tFNlZ{A!miWg8&qJ)>K*UZ&`ksw?dx~SJ9jf253aEQtanziUt`$H=)*Gp zLr_4|nqU-QVT}lxk;d>Re?=N@YnyUWdM%VY3XW>Le|+jl87sg7c4A32*c!b$YXG=# z!0)2)VabY~U@|Wc-mYyi30{mFyYn=pK!8iUWFR|;X)Ut1Bb8M;ET-C05D%buE zbhe78%AQ$xUAdv;d_Vbf^FH&sjfW-*yN^9ZCCD_c`d!OZg2r^**D>Ve(e~5o^nUcI zQ&4d{=ky8aH}rr&02B6v*a$CiTq?VM>Bh1m&fMa=jtWDt;qpz3O?Kq_5qjlL5RY~F z({jhDATMmNNc{C3C^t57RlC=Qv_`lZE_b)p^JkOXR=FUaPIaw5bL)zY=?!ep;ICDQ z0uRpB89vLMNrFo&OxO-?ujuOv2h-h0bn-HR0T?%+DoZ(<7Q12sDee~0T^r~EvZZs6 zk~Cg5F**@?gi59SLNNK#ZmVY|=(ZCDuuFB0rFmq^H9)g~KB`U2MX;QmQ{_?PQL23S%|P!bx$UA93mnxP3gW5T(j#YO0qQ!hhHUU*fU#qA*deeGlK=RwZ=5_` zUgrZ>u{}YL`>x%S-Y>z=pe|Q8iN?~=RbO9ORwodI0!WUNvfO_^qIAyD8&M)P z!6#qnKi&=CFWw#Wzp}B8_kelr3hsKpMeG3YET+|5qM|g|+d}#XkJbZV;hr8Sck_+0 zZr3FJMFuNij5_515p>~tK2PqktC5(~sxrct*5xFOiSA$bNEngk(l~;?P z%BpmKAo9Re*|r==CF|-4(}jtZ6{(L*kO zcdQ(<4_efapy*cZJK&fM@Q2dx*mD69_-X01rv_(IgIc9`FEQ4YS!C_epaiJeT|23g zr1W*om#T++5V>$-U78e17LLSyDk3a-vzM7nwd{Bm9p_3Q0*NhT(4e!;y<>$*PewEM z6(F_(ofcW>6Meom>2uhWc$0>=4TV_YFy9iAItwgaHIweuMCl)B%$E+vf71sdQNIbT zLC_eqb>vp8;<-~?ph9~{tl|VE@Lr+3PQ8z;y}>iUSHM$>DrAdcO4drN*uhZcIfm*3~_c!hnp~r-%cSd zf9kV?rw~w}Hu@B66)%jh+L5=U$a{lbOsxyLrshpRPKcKz?TCAtE-g{^F3f9nsKPk! zKTk|qr3QMI^45yodB)^Mg=|{VYVY}TK;gn^=tV0Ttz?^UDr}}3y=M- z^@8tZQAX{N*^9G8eC%##wTX8JnAu)c?NV3RQ&&c72igU@!a0yqDAjnmbH56uI^@Rv z!lQaz-Nw75@Zzu40c|!>9O8w^9{a{PF9(6OrAocBH1Y%bLFEwdnnDqOwpFj7pPBIlkk}m)~>#3>@um4(MW9RL389EH6MB~5ZM(vGpsD#wt5;5!!e~o>f+djMZ zdsLFKC!V;%fg^Nt+&DK-8KVi;TzSfenV>OH_% zxdO8c>_L=ET(CsTOH zpAaXgUh5?sJxiGBD6GdLY20R@k!Y+)kwbLDw0)6f)? zSPYxesWAk$`5zZnrfyey#?i`EPJXpDm!dX{fUV%laBbHO*Y8$x=oz8cyMkZSgQG7- zFF3)f{93x`LO8&453Swofa)385AD|Eks z`85#*6eH-ZMfqD;17u2NA1&;5DT9rlZx2V!pJykY8Od5-EfoNket;X$-ZU9;kY{fwEd zy3Fri_Z3Y;rLJ(f(hoQSMkO$sV)$!AfpLy)Cl7L`g3FY6>WHGu3wlbmBH^Ft5-z%a{1-&kUI{aOJo(J+?mITJdY4 zGM~k06~Kzm{6O92ylMu`;to9Gi2GfLwDpZo2{!b#E;+NrxUM{c{ko@Dc;o6txIsucjRAEt~tVMMMj?`{B97H<01lsgV=B%YA|=! zv>573!Qhx5d#EX9XFc(^($8(Y(Jj0Ms8_;F5r&NPignuDP(%f1l)tFWu6%?aAQn3d zwk^7XC4S^iWx>qnA1z-v*x=Rd%wRdd-YJDKpf-alqm@ct|Eoc-7DMcwDWAT?!y=vI z3X|`>G+e}`^SG;yxv?y!Q|?Y}G(ta|Ad{qT>Dl`J`BTRBkKC|$ew9`ysMeAah(D^3 zXRq^AYF13LXYS^_h|k*c%A8t@Cov@(V$3O@ZdWMZ-r1`m zzu_xr6D}`ki+2D$N@h|$&a6lo+4+ozU6dR@M+g8aWMir@A-Ww9C=H2)-@)0jmThVj6>eEdV zg4?shC2VbDrQ#YjwAIK(mOa3&zj_@^&tY4K4N9B$h9@`F)~t*6jjV&4U(9|hs|iXE zfV7}OEysc}7EM8*N1f>!_{56^iRO3+G#Fk;Ox&0Mog_azB?Bh<5=Un2>c+a`bTN6t zW6Y&=X*qZ_y+~STPv0at_Bau=`yx3i`SH7S9ZuLD!Dm|-)Z^&e!+T`e%J{L3YkSh4 z%KEE$qGALu_fP?Eqom0{cGQ*vP?U(V+K!dIyJj5x9gVhyvFZ06&^LG~$)ppIyH6(i z1kvlANhXQ*Dr7}q&g{VDjPnnO?z`%s!UWSK>3}pCN}8*N0hi9R!^cB+;cGWP^Ol0X zlk2{yxtLzW_Vz1L5EGfbY-N|H&fDN?+Fm*PD!NI`+^Q~@*OdV;BI46?K;Axk@r~+3 zCn`Bb_~y}+>frX{zo@217e!%9_0M`12%#FCezVieKUB$t23iab0Zv_AKG7`d1q&Kp zKC56_TXy1#Z*ymLsp{kg^JB2gFj0vxJL7!YWi8yk%@dJ2zmm(aP9E)jtt_o(+}@|> zw0@qIY%IQLpCjsLfqcHf5@2{fZ+@dXTgCH}Qp?(wxD%C=1x|As#F8SiE=m0zm@pq7 z{6D&H~i+OCJ?|PL+o>mZLnPErZL@)ruSin#Rl*rfe(pG3<3tcVl7=pNK zTwh50xO}rf;|xNERN(F#D+{O5frG3`e8&E&<_SlqpZY1xC0iQKeD%9o{o&27=c-8} zVM3o^BqaD48n}{Vs|H^=b+Z(;naHOL@`C?*35Kd;fdE6b26Uc@7}5J5DnQKr;v+mK>lr zq7CM?lc;O@qYp*Pqncr}p736ctxIIMqicM%s7Llq`ur>9Pw(Y^RkZ04 zW~6Cx1LLf3=`vNiH+x=Ids?Hn_%}Z_?1zUj$%cAPUTd0)0n#zcvh=W);~kYZWp5a? zEt=Knk@Qdh+`&Oq);Kc&_DWeSe@v?2_tUAY9(9-z! zTx#`>e(Q*y9I|30CtH|t!B2K5hRYAFfiFE)<@;{WLg~Ta>B)bGnT1W_gsK%l4*OCt zx}7FcJgM{S^bzSzC^=BB&kPxBxFYu8M{}4d=i3JJm5y6=_(CsKa+HF+-hN{lo4Db# zxdad!@9Kxy4wAhz_TKtf)pJpMb~g&kD>?w9e{3N-Quw)5#{&{*;hSC6a5wdYXr|}0R9QL+( zPxyg^BXiX+qkk-#o1aE<4p>d&fgLGW;NvUCEjE}f>bnitO};x@8UWx0wr9ek2|)2D z@pD)`&eZ3xqVoWQFd33VKQT-lN3_nO7ERF>!Owoa)XWbp3Vx3GI+?rhOceq-?yTfn?&&QLxo)M{2OjS0G7WH`Ko~R*@XU47s?np< z78|bVX*TeKISTFim&FrNQcR+QM+i+MFDXr9Y^gb}J1tms>2d59gEeqbZ_&OyU#uk(4 z*`rrEZZTzXNYg(e$1-Z2pHtrLK82ENE?9_K9?7f!_jg-lz{Ew!7b(#kNn5^r)gP zO=cA}mll*$^*y53FgIP7x!qTzB@;!cH|@_e@aIgD!U)X`_WUUDPR#C1*Ii(3N-`0n zw=U=C9+>p!H2yOxUV_GthsezwJJpc#Ir0=MBgT{;|5_1d`Y;nSm4xwogvRuk!>LLV<`%NXx`Q%{ zIC0cV*XU$f_kEWCEONZ&nZKnhOxJ`pP2F*6HZn5j}MV^EJ{20GWq zH=K}*U_slnNB6HoO5_0vdgT0@oq*;LxSZu8u?)#?Y-!~2E7k(NmHt;M^cIdnD7D|d z0#qS~vMe&ys&gDjO0ANZB?^M+nHJC+0BD^>JepvbQY-1v4)nu_$yp9Zm9g1zzE=CQ z_DDxhpg&o{WaJ|6zp!n*dHZg#CS-$jt-_eNcs>!61x1GKCT&$jR}Ec2ms?vZ@=u)b zJ==z2jw!$p)1Fc|m1){e8nRpe)jk!VM*6(eJwlOI&PkQvJa0KC6ZN5I7vLE_Vn>mg zhySEjOC#31-ruYE-la_bv>yQ<&E$ zGU?qNX;HTzrl3yvr(D~PudBSQ@VKM}*0&D)Qq@Hqp7Bm ziOWeMc5qFQZzVZ4OjQk0L|NfRdlIxP5>AnYARxV{q!~`hex}1EhB>w)qfXgeyY98H z92tzVj2Ceyk*HPyT5@a%oHHZ3|3dzEN`=QI6+waK%NHrT|CMy6-^xHir~B(7NC082 zK}^?O9(yefUHafv!Xi{j!@}0hO(g?+FZ&mzu8oz>kGYPU8Mf(B#mASo4^i%JUgvA! zmukb39M@9w%zr!i#&Sk@bk2rwk3qOZ(b*gL-f83* zQfut|eT`Jg{W8f&0izk>lngC&e*QzPqk83gBXy_d_^^w42&7w@h6i1+EfsJ=tZeQU z8eO}1FuMa;Npe#^N}p)@OBXDs2OUTc{y|8(pMC!x-$=w-rJw4E?00Q{;Fy4i*!U$k zXrNgIHm+U0Y&Z~{k6gf&stmsY;cU=jc?}TQR#vGS@~<4$ zFOZ6{NK1<$OKtaA|`aC~222kk#K@hBc5i9CDqUb^3~e{xTHMn**s!?m6X>{GQGM zEexeiW?~Jk^5Iwou%=0C7Uerz%Nsk*X>WFoVk9}m19l|JAnsz`ie%|=Y80CS!JpBz z9XS?x?QL^s9&b>+e`tbKSvh)OLw`3jc@slSg}Qxbu3q}ygG%(Ba&XZ5;*94R|9V`H zY@du?XZhaKCjew#H3F=$TWe0!EFH)$x9ojf($XZU6w^A}?%$M_BUxmAI^QnYC_$*9mXiGuwAPRqqS*H)U zvn(GJCY(653_`&rD(DKOQxN0HkRO)A+a4Udgu&`uxZwCx(AMB_~mHRFHu?dfp}2^s#e20nBDjRG9Q{kd@bl%Q&8jD}LBp?Y@V z`~<5XzJ276H{ynTH~NpDvbv8;;uN-pUMflF*VHyO(X52lkPG8Hx)8y0LBBCUVzG&} z5y^qN5(M|B7!_`xB{V1DWurhy0}J?KOCrK~-Gv(Xo1a8P^!i+xXdBh*(gkhXUS#L& z(Y*_7Mv~5Jgn)*ChHB^1hleZ6PF|AR@c}(e5!hC9+0@T)LxOHo5gyf zSsl*aS9_)i$FNEp0T`F^pALd=Lt({8K&H^9`X5%MBa(cXFn4s)9TG%B2t|ZKB|}TM z$l`iQWF)C_7M1z2^&Jj_Vo72ke5N7x!*bNQfd>pM4qfo_*+_( z-NggPSI)NyZ{cvd5YOh0&R7p&VQhmwbuYPCWdRLs0)En zc;8c--z6N}PACISIEO%!=+ol<*9s7MNfeJa+~>#vcn>S6S{80r`_Tk7{U*zp6Tr&J zcQWXgqtf$pxj@pdHP-m|=9ol4c`{5Pg2krn7pr;`b?rc3yAS;UJ2zD`5GYf?svyly z-v(+WKG9U0EuS!sED;CaB4P6-A6B$d^};3r z8`M)yBmNEMISN-!?sve-mrwY)($R(kL#73nytoGd#NakUbLOI4ACP|5SEX%YJ}w@Y z5Och{!k@OORdr0tJ4bIOD&_52(;^UAEUa5N?NT==mFk)Frx)4a-q_ta0)rR>yoEWp z-n9skz^yk*y6XH$3H(STq&8MMoWi8pqnjbp;f;r3Ef}FaxO#C8)l;Kel19%)e)Nvv z&>P6JI)7}4n5A0=2FkS)k`Mjz@Elus^d4b{to+k1J?1;An#ls}nHq!LmbJlM!>r&4 zvoslb5^(B|wfOm&5McZVSSTkLKXNGd#B=VANQ;}?QHpcnP{R6R8XZ^Dp4s0qM&$C8 zAZ`2r9QpDu2E*p5+$Zt}Hl zGZi*=Q~Znj9dN%31Jz%#io1dA5FiYD=L-^IC>GoV!9#S?`K%?l)>0#Qwx|5jd(6%~ zy|%`~)87w#tY`4W&`;75GCxjA$-Q^%@J9X3^>~TjPab+a*0>>oA7ZavTPtF@d;*H% z>=|?r&)5M!q3}ULVAfE6ziP@42|v-Bs=iqPe7)wy01|P|W3$0d-+56J?MclLZ$B5s z29m}HiVSWbJkAWWcE6E^uIJdK=d7Z`i{wZ|=CR~%rVq^P`wqN;#b%w8Whn;Ri06ap1ITQy`yuUXGc;*hilvK&4*}i$r2%ZCE&8#CG4ea zUg!1tIF39Yd6b-x?!6NiKR-Xc%(G7awxUcCVB&-|*cxND94$dS>6d3ZbT_q;@f_(8 z9v%Npa8gh0Hxs!f{oZ3%+5Bh)Gae{~ZBQBSypBW-Zn~}yX6%q~4$GbpQ6Onw{=tsG zZb*#uD2-$zyYGgHjbF|+xjE8t=v}hEVZAkpSt5xU)IOT;Oa1yG41qIdXzpm3&Lc z$+AjTA!a}G#V!+a6`Wwk2UtJ^gMp%|EX4{L908JX_s5i3+Vzd8cGEYAKS|rdZFB28 zXp*=2wLq9tPfC)VA7@V}mP$Oc^cn*K&Rux_i>>ON`x0~d1SkVTOue%ZmWXybUWIz| z4|Lo=7rtc0nfX%Oqd6mm!Jz{q1U zCR<3uM(lUQ!#4L1p1^P}y6>-0mAYwmH|_go(ec{d(YX`~Ct4(Z(R-BX^I%tC)w;i# z-o0|9r3O4?Umf`J6^i2Y%B(NswtpO=PUX-n9s6d8H-U z8*F2?dq?PWPZIIsY{4>9fTpKz1`hPuz4DU$o!xad6#~ICKV{}PQ2xDoVy4V4Jn(Ya z1D?IAT#us(ybknve5jlaD9^s`t=s`$NyR zCHz>)`W$SD_}T$?V%c*v*g}-vk=&l*tEm{KS~yR+E`G9y8b0EWCn)G(NFIL^#S(W} zYyg4KMp78sxeJ1fY%|bpji9sMEtW3&l5f^Hn+~^$i`@XvZP>8!Au>29dOj($`72IrE!IBnvT#V8qPlPUSKIoHENFLuIj>kB{kd-7_xGBv0wu(o)T__#S zE6Kd!xs8Q(=Xp3R2T!yZ)wP`(4UbV2uG}0Y0BA(ji9DWG=!wHA6uZN0GbA3$r&*;~ z$6B@EZV=glY6OY|e~^l#n0Zsg7e{%RQP$aE4IW!I$nYK3ayq+d(CN?`w)+#*p_Hr^ zcgA^KVD?2;utZUE4n1+Qk%5#Kq&OvXvJW?I6G!a|xpxq<@l8W;JpUYc*kTxX50*7j zk0|SsRG>Q+8ex^4n`N()x>YVi#+m963H(kh@;sb=Zv;wy=dRRYMq4R}&OLOmI$=9P z^M)Ipm1T}1=laA>-RMmV*~;wXQ@9dGpPj*;zyd|gSI~O+Yx7B!(R8{mFvq;oA{R*) zu5S>~29MGH%z64HqSL=|&XWSZSUIp2>jxOAs~+8>&UfCMAXSd!nH{j&8h1(c(QJ3( zqx-kBv;Zq-bO&GyzQwLwYdx+XqIVu@-w!QSC=DyB>+5wTByrg>7O-yLf_i>2blKFaPw__Hge8pHhJJbi{ zBJ9nOq^fe8eegfJptqBsSfB?K7QB;$h&cCe9eW7++71xY5X_qJqQQtev#fu^;ypjK z0sxUlj2_My2V?0i(;D7Z#xmvO1Z`x^I+XC*9#GYKf!(^U!?}maS$z4?UBhM7S5z2C zm$q*;P`8a0mPkRriiyLs|2cntE{s@@oYL)cISJJ~r5IgiU-E|T;>k&VI}WD;wwWHc zIt`th8nHh`qRC-WVVR(N*&mXQLagc4O#uC|gR@>KOz#>#QmVV{$Hy|8hU8{9R*uVc z(qZe;{kDdC4)fz^Bi=g_TATb0;=EObiX+1}_JEO+DP~fkt}Cw#OvN$UBomi+x@GbX zhZq1^toVz=dheK9GyNW%)d%-*MamNg?-+#8=IAQKLj)t}5jH7}w5%4eG`@b&EHJjh zp{t}Zy(W^fAgfA0B32prH8U4w7rUs_TVBYKG;U`UX8nv(uCkm=dblY@JdOf8O)5aI zm)Sr_1<+k#fMp__`gr zW$HJhqPP?Gdh*!nyIam}<)lP5L}sILLI$uP4qb|*ZGP2L^Tr#hi{u^qN1*lI0(Jgg z?LzkQYEPsIl#A5*m;RxgKP9o3OdPJC-IV;g6K|~m@7pdW+UMIs*Rlw6UODM0r}RHu zeS=pfQ1@=;n_X|VZP#SmO>W|3*IP}tZQIsl+qSLAO?STEy=&e3-L=l2@SMHR-si!_ z6xauBzu6qVBHsKmDgKY%)#LllGM(;`1I|K}@Oo{lOQBHq59KRv+EJN~f5Jo-kcp`j z&lRps0tT&A$&SF2X0jq-91t`i@}lo(>Xm_h6HG%!qrU}pK?}avmH#|j7yq}NYIR4! z4zy;Qxm(TD&^KM*xR#zx^&-SHq@|924NqN>PlWjEpB~N1>aAD<0`*{iV%7%3ig2=c zPe(k3a3G#j71RAiA-bR~D=re3zkARt?X41jk-KuntD5Xzh=A@MlQXE6b`3#_sG?ZL zMfcCPwrR8)vg9bIXUlvWUbtas-eK;-pZq@2T4o~`DIf*cGs$o^NsZi*PXpVTE$Ah? zU2V9!hc~;Vq=e&fN#IhivoY)YF#A)y7hSF;;y0iNLlj|9Gv}4)58hCi&SZWz*Zy@( zc@^sZ$|Jm6J;B#y)hduD22lv|D|lmvlq!Jmhg*?nRyx4q%gNPaHZUP_;VSn)1uv{W zvN3_EJQBi1~t zBO(Gp^D^u9jx&Pq;D=PMPNW`yVN+2jW%%g%_*MHW_V)dEO2YfT2lfOJxRlCnL# zrv8^N+ywRF{px`~9lCq;nla!*GL4Jqa1M$gFZHoY+kmZDO>r2D>8jLlpp?=j`ifM& z$S-O9F-ajMC2FT%-mp3n>GxeM$G_vEQwuhkc`LyZXm60c#V}wh94Wz}FAr%om=Km6 z=}r`W=`+A{39_;fKBQj3|0VRx{khY#d;~vA(9+$E!Pv3XYg@W+>T&CNkojybX@lVO zr=@|og2FoFqRP%vbLGTo!nm?$*6&*PCjw0dxWNsbux7=JkD(DY>vc({l98zxvWcIB z8uioyL4C*p-xHCR_*I3i`-S(7T_a8$$aHm%qFjk59zj2NVR?d;BD%?xph>F~INnbM zDDTX)5?Ql2g-*+d77y2gn$f3-_7Y+pzzUg`8;3y$G*P<>H1>pGYu}~rY?=c*mcgO? z*jt&Gs%z2)P{vvsOazI@TSXDGLSz##P(&x)Lc(W5mBTDjH?o##SK*&ZUxO%pS=3Zw z5a)h7qJi88bXi&Vrrq(uOUz7!@Dz0GJwEb^QIR-)U#h zs@K-$od8Cql0j>h`SzZv2{Y7@K)3J=5jVxTvLymX3aMs@Tj|kN5Urzr2V?|>+Nc^@ z{kk{PK?uEp+lrG$AV-7!8B>4EtY~9X7d`?1;Rp)E!7O}>mvE`r>KW&7yOI_-KcN`D zdAsG;9+NO;oX(q>P~MPZN`-f5XU|BXgNg%`aF1-YnN*#*A-lNo%Z*5E&lkg;B>6Ic zQ~y~=+~5htzYQIKX8rTH$X(aw^CM~_G)#Dc5`m+5+~}O$SfL39P%2zJLf%x|6dm`d zkqN>zBG#eRI8%`9U7I+8Ddd7h)l|eKK4|Ap=2>)YugopX|A2IWztb5{ehx<{ zY~j+tFud8|^=6&P$dmrHLXcN>1LQzl`uoA~ikJCO^^rv-Tsy%$+KF}?3m+C3 z*}CJvQ7KVOG@TPyeT@9g@6F;cCv0g9*bDk#L<3nhu51W%;94eQxJG#>(M&NEDoYpX+t{mCiM{$#Il7CbaY7?>X8sD#X@(peI}e}ego{p}O-dV=i0*$;i}hKxD!{@cg#=aXWz)CP~_ ztCy_#70s6qi^3O%rUnI-N|%%;p>QFgYuj0|o;%E-<6NG@+rbe8T{-7cyx z=@JRo(kaAf2qM;<%Ijs}JCVW_0V*Hi<+s@M zTMxa|7|Pk^joCOh$l4jK}j? z${GILR=_!$>F%?v9L%ufe#d3w?YB+v!WMMLh(E_MM*q&1LhLX9>M&%ieLty|t|a0L zE$n+tyMa-sx{Otc;x5kUYtYqHOb6F2mEZG+g+miIpB9dhp6yg;1Hq!QgQk$?fulo5 zCrKx%{?%#l7qL+8or88iJxMI+uOT9|10mxX5(}bz(7`U1HUjqmT^sarZ}lvowNJB+ zP%)H0FSBO@DOcTDPr;`)knRrWP78e*p9Twr0V-YN7y#VGyug+ZYtmqTVSbSj(uaE8 z{q!21chH-E$wu#F@Ifir>s%z>GrJ?U$=1f9GxVJ=i-t0*$%jJZaE}SKRO68SDbz4y0KFz-- z&1~m3DciqQ9+HKS-Z=?>9)h)v{>XG$R%YbzzWyl;=ux4$%0qje`;8c~w@;$)hPfV zrBT*~jy*n44BnEOysFGM53oQI{o=iaN)n5Ev`gbK3R)*5t@cFc+q1guW#0|8-1Ff< zNF8wg7uTdw(4Iw;g_8O&9|s$oFP+pA8exyFiV7)-PNhy_%TL01n-)@CtD&z znpo0`I#IB@HAg3Q5NO$Kqw&{mZU)eBL#L^&tBK3|8102P0qSCmdv;wV5yjd?H5kj& zt()ej)fB~hQL53KF{bDwmmoZddr}x~;VRJr>+m~I=3gxH*<6xy&etbfU2TRYOQFyO zWDz2j5j;3pQb-$wOK4`%8o@8#ELX7UhLcshCw;s@-i<40=KiA(-mqfM#H+;bL5Xyi z(4q|d2(>Gi>xiXBOI2w4z(Mnk*MadhG-5@DaX8-$TV{aCl_<|#&d(W8Hwqg&k;Sy! zWxJ@rtN)wy1Kv@G^tGKfOsFNOfhPqboCYxz;`+1U5ppO3#mz5KVrZ|_1Mh|nJdcDKZfdj?sEH^$ID z{>U$=TI6(u9_c)%V6=#1`G**sp{nj&nTbc3s?TFxZ=|jxoJ9?4IyMf`s!sXWnzXJb zo%qGqn+MDdVT;+`@)(zdjdhZWsqE5Q4-V-~iTnRaL`q;cXDtW43uINw_ri>r24qQe z9rnvk#y1`T=jZt*i!4Q(lt6)FH(e;HgBN#N? z?ukCVL+zkX=$y}14#^hd1lGM-f`z8F3;Qx}`Y7Jsg;$vxsIk^d;;?|!6AY%-rnaIh zXN7IWg(jG-ZgC*qO~q|{+>KDj_cTWZRg=*IT5C+31~TB~W8Fv^(}cMM9Q&9oewnPM zp3p}tg+O!-XGx)81V8QhK3??_d0QpbKdmd-WMg8E+me~4`UZQ>ppbP2XT&Grlf3sb z3o=mbm{R<%A#4y~l=)hTOgahWl?N}v0l~PnoZ_0StRKW%haiU;OJKF=Ik;wWmM2jO zVL-&3O4Fo_aoj2SA1;&`gsE zChV_)f4yh~lTQV~4GxSDlWhms)5Y%Q`P2LijwFLhC$OO5#w>r~{D2yK8bq&*Qj*W1 zv0*Sdp$3t-*)!B1V4zkeyUNSwP-y85zLhJ41VgR9-t`-bX!i!HF_L@8G!bQkt+hcQ zI27X-^`fakm4$Xo>I(UU48e2y^Xw=sD zjY}f(2*kfFT9aVqo4szv#*9VCIFpzr?ZjA#XESYR_@{rM8cVdxia*wo-nU|`%&RZw zj=?dzPX~TmWTm{$-wP*x;OGLPKNGRv-UE39&%VH89>CY49IM%|I;9+?X9RAKG$BH* z{S1n6`nf=&RFiyxNmU8=U|@V--L#1ulos*weCV84rW z%g;Z!_IN=p=d>I{{t^GL3oeR$-;8qNmgWT7M;64nOSMqo_elsm(%33EPt5trYjvkJ zvoZ6;1i8cx`#?=s&ZEX83*@%w!^U5S3!)%Qw*((W>enn$_30p00Yo}SoW%uK!5pN_ zI<+xdUImJrNm=9gO$sHId45iYZZ+~EZUQs?v%PFV3Q^T)j61oM1VL-sVV@M76W~zf z$e}uLFth-(UlREhra5hBkv`T*x(9ne-<6YEAaRTEX*TG+tQnDN&ps{ilVdM{1s9Zy znGf+WkeF7hisFpEpaXrsNWr2CzA9V_a)7LEOFBC7Vl$P62 zddXSnR?Vw{98XtMLW^CB9)qBsm{>Yz$#E6yrs2M zYDg?g!EmY7SPnIAemLxx+M`lCWktWS+_Cr7bg1UnG%_>*iZV^+x4C* z51*{gT2|Xc)>uV6kHToI@URl*^;G!C#?Mp*8L(S5wbY@9(CHa5sntQTNHqx39>Nl> zu+kXBK?k?_VQ^YR7I|5LPyP`O#q))@Y2b;)scHLg&oCbXLUgFq!`6NIP-RBSIfY{S z(3-k~e2gZI^tl+Wuq3VbWo3vFOQ8(wHc&vUXw#TJ%tH*bSkZoGa&#r@fuMYJGXtP4K6O1N*xkw~KT|4cgZ1PI-Z4@5ow3u8Bc*t5{hGGWxqw;t%7mF>wwdsP$a^nj;MviUX)>CP4 zUUh>EnE)uil?~~b3-?MB*z}odjk=Sx#w)8tZ|at7T_SFy!+M|49IwH1_9X}h_7lWm zMQv()T0GVDWr&3xrJJ)5*awTxb>)rw^p{^R_is0vs**7F=`n4;Q)_%Ot=@TKf((D@ zy!^UV#Tbptjne|r2P8>iwz-VbSkDd?BLVFY&R>UgBS#Jxi5hXmk|eYs+@#bY8sxp8 z|9nK$EqSLe@s|d=G{yrM@B)C5{<{#ZST1xjd07ikbo{!x)Xv>+Wo{6Ku8U`$H3XT6cA0yCufd=qX5{{;jLFl`r%B7o?|Ir9 zi5j1Qf){I2GO5_{L-xgYtzw-W7XFBvF0N__XCaP%WV(|2zs#GUQpHIP!6`i`8OY2! zA!-8>@Ay{b{q5)tI?vYS{QG0MLpZrm+{P~s|H!&S8Xv)zwFRAD!$g?%_lKw743GuF zX0-L>rd)sw(mFH^8W3!|+KpuV8Yy2tB5+7M8}@}}*^pI3I5lNis*m^KnB!{qDa-hY zW*#Ae;G7Tfi!|DGwoTB!A}U58Ikf*YFOQ$2-SJSujQ?6Ti;9Rx#(qy6*vCVbQX6zG z+z*baFuq$N-?u?;iS5r!az&2(8S6=nA*N7RWzGj0n?+u5q#F7(8E3PU7%UE{bHP`C z3OmQMj18R3lia4;rixBSPTpsfJ!dx}^=#TWyh4lL^l^fnBGKC}uecE?Y>zKb$> z8h`{yu!t#a9i~sdyvuls7~CY}vRxVYW&GVDze$E&+WNc~eWi4L4ilgtPE;x*A=@Rm ztpMQG)K3_Dev1kG`~v?k+F0wZAABSvouE2QG_SBYzH<3p z2)bFR-8n4%-SY)5!r#Lnjuycy%fZm68d8%cSOMxJC*+?#J!naciflVO6F-Yb^TKr` zKZ2LymQs`XOk!nnk)jAHejb0{)t)etdpG(yVPqqYIH3A-)rBBq%*YIlA!I@&f-S}g z32PR2S+9RVNUZu+jTIkg`9l%X2bWTTTuQytGbf7ioMSV{ljt-jTw~GXL4lAp2yfoOXYpS>1 ztAqvEHwQw7Selt;)EvOADDt!Jq09HUsLLO+1G%MwDZ4LV8&qSB<12MaO2N~eE}>qX ze7}*mpv9)uP*<&4w@;f4SlN8LNqQD{ssWK26YwPbs%%0h3R_hqlY>0U%b&n!C)_B2 z>vp*QL1tr7vNZhH2}*fLrP>(J8kY|zz#4EQ8P)4bpqm-q_izwza2^uDwci2}mM;cvpEA%INHc&?b*Noz%xQ0_%`Ir@xDQHg z5*>4(VoOV)g|T4U6e90q-5@ozuneWVwBg(&Wt}N#Zf@5ZHmuDDzo5wpx^>!L1CEFG z#$}Z$DNw%?pzi-zoDGTwL_^!KF_8Y=att{-R90cK(uNm2=PgMl>CCJT7GIeKRHz`W zY-p)T1aM)4o3LC0rdpOgwtUkol|YKECInKMAy+>vwUbeFWPwAqn^NN zDj?dU18~6sNNo}9NbYJv9h@JLgFlLC8q(4g|B^SOT4>~jc67Snfbxc?du$hw&(W!e zmm$8jwZ)Bmu(R1%fEB4m{w19ElWKt*aqHlV*B0N4obYbBJe6<~Aw)L=Zy@ zvNTK?ZHeETH9@V&r<8|50#S>Oyu9^~9?g^%8c!kpI94jMFy2wXnC5OyHr@~`JF)p$ zc+gFP{sne9Hw{4K`u#ZcnVCo*o5?uH)AJevZ}D0QB1Ab(#NT95+=& zZfU&Caani%UA)`z z(*o!-6pIr|ZYv#@KyhF5Q(Y8fm<6)@RhcylF7ciBW&MBhXz>jB8#nFapGMVEvEj+nF^FQL|4&7f^S!PToT}z9>wrtG45Y@FNz5-@5O*-ft&;id7pi6r7g%irzjix&~?S+!5 zzJ%R`-FXs}6qpI?i3_^GeKq+`|2|y@Gk&5zf@;$TvlF#JNSRb~ zZ{&PElJK1o*;=F4@YjW%mq`J+DzV>LMCK{)Wr!SwiNKO5$W3LvP*KX)x^V{w=#~v} zamnOVBS;mULB$jfvehLx@PJ?RV}n-B$A(cP;cS%A{bXON4ecExaiB;_j*og7l!(V%??bROdS>u;^DK`mCjo1hHP<+sb&*dtqOsyWw|Dy=wBTByPW^ z4={Wr31FCaoqg)LU;aNMC8X5T*VKSw_+%(*kG+{z{1W(b$p2|#)8bFhxe#Dr8ZiG) z6J!71O>9ctKnX(>QxFpI(})r4Ti;D=g;x`UTig|yI@*uFifYgpH!u95jY(9R* zIpICxJ5h|NVOWs=%wM8|EjtW2Nq`Ko&uTiq`%Jt0@nrVUcsBucp2^#K!^P|l=)f$KyYJdwB%T#o3w1!{ehxzVv)Ryg zgQzokITF|F0VPA2%G#%l@2?Cz`l94oVAqOVLB zvgdN_e||=oJYJ*rEWZ>_F`6hWYknkeR$CHP-P|qMXoz0ja_ZscnA|_)E+M7sGXQUv z%~z?w6eiQ!aII5wOIZ6ip)#b-b&`A}u8E>lO!#y8;mnEmL5Wilw+Zy?6#IFp1P;NF z+56E=w&v`8bHw00O2s;XAsygFt~2l$Z43ig8S{dU{tzMKf5&6s=N2yX6+Oi83~~51 ztkNGawMVrkCrDwx$Azj(-u-2^1EVzl{OmPcF8!=tRDsXA3m&e;H)i`1_()PF~ zpQE29bz}VIiA!Xhp)3wAymDgmo%Qt&;C_awb>U1Ln#NJho}WBq`@$W-ij&|D7vf6<)!$qs-8RsSC>t6?J)GluO_)BKoI6$-&e=in5Y zCE?Ox4Gf$M<;zBPIdj8tbBlbd01(*ybo zVT6YWDV;|RPakdg$XX@)d&u?SDI3!76xQBgDLZbZz#@@K1?N2

1K^{WXRMq%NS` zIetKJr)`H*IdpU`S?@*PIyj5N1|djr&FyEn0*(UfQqEifBWp@94X> zr~#=*5$#Sm1AoIhd19v&+;!w33u8iks0(cu=%At3?!#}f%8{;G%+{DJhAl1wD0PG( zFI~F7d0;IHN|L?McZ?VCj=zZjSy3!+W7zc>>|NbUH49P>sG=7F7C^)+%D`+*F0$IO ziMvr$7pYOJP4l{OKLb|4T9dJ$^^*GSw?+N&sMQ|K>lC=Gmrok2q3GedWu*M}Vs!D^ zwP}a_oIFXk5^H4gq1%?YL2kTH*Le0YUv4uZe69hGz65O&9#11b5Nb}otI{Y zBcY7opi97e!LY)FIAeB$f+Rdi^wK`TG}AJ18->VTrx&wJ>toM*xf}!bixnxE_R)({hN*=}AFwQUh{!kC%z_p7m>U2! zdmW?`BvQTb7zzYzh}?i-g+r^BFfSNqs>C6IDcbc^7Mhp;j1pK-2w-4vaA5zL8`2fL zkjejn)En~uf)vF0ze{els-6;t3hG})y^baZRn$W=vQva=9IiN24*bG$xgVF5R`3G1 zvsu?f8^s%f9&UPn13*KToUFsRe*VJaJf$2aVS8g!*ONYt&bhCz7w^3O2CF(0aU5}M ztRWl&4eEBCOE+$xt3nBMw+z(47ugU&v|+#*ILaG{%tU(vCuU-0O=!jlhzF^Ifx&_Y z)Oxxsdw*Q>ewW`si0zV`-aII+S8mziN4j+XkYAN;lK8R0X@}gBq1QR}rs=$~ZoFED zZ|QgGM)$E;@UbibcR}1t6(fgdeH{``dsy~Z;aqpKh^JXotA}DXJg6|qhO6r7HwqbI z)}st!bBHuP3qollysfj-GB3Pwd-6f^h*4ENvqhxBcIEoz#F>3gP~B-~@>&q6+kM|* zYZOfCj#skGhsLzT|F<9MV>b3Xaw8#IQN%n3K+RkjbIGrkauNI|bWu93Tq7CdPB`8hrZH^G{)}jKN_=bC6mndhj_zE6zP@L<3n*8-)`C8##Ip;(%S+v<1jNW< zJ#NL_EN(X6J7?OxA7((6Ajr0e?-*fwB0xeI3ez$?H;$!`qx1eeZAEfjt7-? zdBj#vjfh?sI*k>ETk3wmHx-ZLDlevGNgSzKrs)_ElOf(@5?O6lqQ2ywSZ^gD)NBkM zRtk5x@!dc7T8tXq(FN}`q|ZUg7~6x!vu$5zqu&}A&EX7o3R_b`L^6gqhx{iSP#S5f zvJS{P`-?)nwRvpHf%XF4N)xE04bD8;K~O?(-OtHcxCW+J^0a@&6NAqaA{2sXH_BEQ z$YlYN4d^o6g?bCOUyV$t zA@4L6kf7#pjBth$7h&*32k=be@gcos3d@!a(%?eaJGix*1 z755o*h@)FHFy?8dOb;GyEIRN$9$c5i*`S8mI=4}$&Z^h9PTjoWq`!jsiiT?4g1ZLc zR)h>xVT?a=wNe};T8Z6v(NmF`1BPDIiVkqu9UvF!VHRD>U*yio*7ffL8yN!YV%V=o z6DpdKwJ<3LmedD|edE5Pr>J&T3RrbT^E+;G#`Ot?Jb1Gw<&RV>1a&Loc^5-_yJV5d zUdcV%SAvkI)IQjHsz1gOCgs(~B6mUg4UzfW7kZo7Cjo`qD`AA^dWB3c1TP6HsBe&W zJWdeCGjOG8&yZ8B6LwOZm&mbNqfmwTFDY>1zQYbJtd}~uUaoR~;#2F7N*BvBc*6%7 zgOB2z@tHSw*OM$yH}E5p&%Jo;x$k1G@c+_QAIB_b^vJA+XQ@4UbO$+gzRrWVdhS2d zCg?pgQMiT`q7h>=eiL-&HLFZcnzU^a@rg5b5*H5J6y?#MNCi+*0h8xVr~U<0dQQ#q zl8f=4g)Z78xch!r4Lw@2B9-eQd;&t;h!JT5Tfo6H7^ZEh=I^ZibkcOPp%ZqY?c=W= z$IfavdOkPOJ~{I{0%fk(YT!VyjXmFED$bVg%=kq$Dr()ewb~mml`pJ9I_;<9$+EwN z?|BqTHO8NmljUbz${3Xsn728q13auJFYU~W?ij+lD1HnI{`UQ8N1;L#$dth-4vFZI zG)R7qtwyvYJA7nJbL#ZWfh7-|02JD-5Uy?LdOCiLI@l}GMjcp&B=UnA=O^_ohr!wx zWgveO%?9e!4ydA19O@kXyH|wH1y+(_ib5SKVKu;63a6y5AsUW1r?}Ia?8dbxSq)zm}qk{C*HY73sYQoUt zLSw*LwR2F?!nfqBNHfP}B>3w^l(%8hoMqQsanhtvYUzsZSw6Zy=4Z>OW`ru{@_#C1 z=Oinz1hM6Wz*fh&J!jqUw=VttGxHz}CSQ={ACeZs1$h<5?jn5Lx#`l@X;*_u6j@*v zrnFJRXo+i5{%8Tqln)Y@>KCB~ge(eFq3OU)uemer!-9L=f1N3 zcYS=6(t1|0YuZbOtGB|d!^f(d!>hf?9|YnWdv>vfS1nKB+}fCB<+_IB8p!zan+O|E z+lOYKgXyO>5gh|y`J31)f4JgF7i8wEy=@|m=X}Q!8pt|AumWk?X<_;rrnqL5kh=w& zc9_%}d25LNy~a?PZ!|ZeqazrhDrta!%+ngtfb?w}W_j9yapuq08}rQhKHlk+yb-jc z8EJS`?jzKl)_ZZf!fIrMDh@Ch>1z>i&lKG`Ql!xw2XvPYHMu(RZiwS`+V3g=5(Nz_ zc`>U=%ne)+8bE_hwAV+ojItZfQ?DT+cWvRVE>XB`!5e^9y$Lk>TQb+WVt5F%d*S zdy;F%cEgES>G$ng@*#&Kj|?)U?N|6HGE*bK0U*^@%f4b%k~8aOkT8w!xc`I)+Kk-28HWY@PYNAR36Gx zie0}exW`gW@p;`SW-9xrbN^3irJNi{m@5%q1~v+yA!E`D9C7;ui>$dv#-fgfbOjgT zpVHQZW{@lMW2DKpX22;wVL!jMuz=tSDPd zGt_c@{(&=OrpKVeLt4$%wHKDLZv0JA-$WOUVD9w5wDrTv&eVyVcsX)i?^XhNAlk$O zopCj<>&1Ml64gUcK}FJ6t9Gcscka)7>lps&4iKY63&Hn!WAEW`&*A*E#XHx)zu`N$ zFHneEFEM+X70vT3_cin%Sp&aBlppY>dvKAa;q6D2%!^xcXs#I|T#(u>2o z`xG==Qy_OSz%hlgvUE#o;V)e=KqCWg;~{cCCr=Gdtl}X(&p`D<9STUcP;-fdOt?R; ze+>Uf5bD9m&hrTT2{z+!pcEw}{&pg*#j2{s_~SFo1`;hX%0${HCJkVU+z#iCOB`QB z8UyYVPkx`r==2HCgo6AT)2eRDGuZvz5Ns$p9)o1+nkayRfJAoOl$Gtx z%50!t_0e$HnjABC?i}X@VaJ3Xp<41)clh}bT?!52^Z!?xuXG@XDE+H3KLP(wjk#t4 zAcLAUZPW-faQzhR5lMsL7&()~?5q?5-STnTp$ef9zhUdj40U=W08hCxx7s>I_K0~7 zV*Ao{n~AghoQLnUUbw%FJYR-%PQ}S*$v<_SWIf+^wK`AVe09BG_2MFIaX^{Ckqx3& z+%_2D%9U`awOLDWOUxbH)O47yNy=~zmVj8))oig`D#_IC5o@*!XBe0}Qo6Il$si;| z^#E64Y*9I)p?$5v)zk25iBRHZvfQrR6D&El2x8X7kgQp1v$O{1CT&|m*dg&Sc zBOW9I%+W9w%pZ?Dxy_><-}0Tk*?x-7$uxMQBWnd){MvNO$~^GtA=g-W`N`(5y&BTUtT*u9 z&6W7ceTpW_+84_L-t6)3LP1$ahdCdDJ^Lf@_|_;iU$C||b91W>{_|OZ5G3-2__2sE zurI?iQpugjzl83J5C<`DLA>}W;ybn2p>&p8_=PN9#~^+9md+Q9zs)|$vWeOf+~Hq> zKTE0h+XuTUnocm)-Lt-Hw9>Ge{>6W99dDB5a&gAglm}nIYjQVPEF4AU6*-z^)9ND?_924?jZz{hVBwnF-#HT)GA)QKKKI+$DsYR!od@HwN-W) zcc3V@%;hP#TITf*JVH;&Um-OSOds)5DPK*m`Pa!du{g5F)gn1XAQ) zq#vET?$Ej2LNQ2lGXT{6)KBPp1~Vapd|<&*EG{q*r|?j$xNxL|aNRo;+ZzOL#W;9C#8Q=B<(k=Ix;8wLmh z=+f2(D51Hn{dQud%so+CA3J9nsq?SBXcJb+ouc=F{aw`Y1EJe({zJOzsc>^6+I^NU zn+s?~&)X0^{#8BDJ~9Vd+R#$_-~aoG(^jqW)tAax{ck9YiX?$s4rJEW!>~1g>vK|wdntMRj|c!smVJpJsMEMUPqZ;0-D&>8V-Y0>g4m#^SR?E znZhWIwa7su%{t5yYtv`6gi`b^>0x@S$dL-%tI;nt^oa4qK|v{_GY#MSd$>J)%+t4H z2!C+T85>jc!FTSUXBlBz&!EOo;`3HXIR|SsP(L76$!D%gtlquhC2Io(SMBx*5xsAj zNSm=UI{kLB?X;L=R;Ky=bk6J z7dO?d?Qdtx;0lpE<(bArIuBu(*f!TB6%^?uflaqW$o0I!4bBSgPHg)jKK=t#=-3Ik zBu${|HA>ukXC-u#a5Kr|m;B&ZhosrPAl?!Bb|Su#;G7HngeDY;6Om`b`nn2H#>a;}WVr{CN85H05Gf@Avx|Aj2~ zSJ`8ddyrJps663ds)*z9^t)b%kKPGVIjexMd6ubz25QHArVuNWBZ$8>@aV(`aCJW_ zh-xOyMj&oxo{dE&I%bVX44umbT@O|a^umVo4=$<$aT^`*@Q!bNc2n6U%riU>#@fZC z?KRJ#ISoF{pwtQ`WlC0r9{bIc1Xmz)e?7RYWIO4u)Og80eX9=dAiqfc7~s+cXlzTU~I zksFgDVh(}~Y8b-%8<91#HxdRJzqbBL$kNF=I}9F7$pF)EPe{7dJvBBVhc19EN$~5C#Vc{%Q|w zq3RM@QFCd$X7&1`_=T`-X$V4G@Bkx!!j*z~y1C-IE^ICg#wvLQJeg*_=)krOo1%d5 z19}dagJ3@hZv|B!AtleGCU3VLn?qUkN03D1xLGHxXwMK8xk`$eb=aC*A`z{JwHWkV zEA{lX*^jkzLhcgiZMo(wQPV;C*eJfto|efK;SyfqPfHzX*eiJWob|}tD?kuj0SuO< zIA6yd;aM+KpG+UZ-5k!6Y-V6pWz&%N9bYV1|P9%?`JI`(Wm_5V1#;c z=u)h-N1(xDCNih8^F5uquxwj3;#uf`YGMkuc7#>0X&w_1w(B<2xYv{NoX&kK%Y-}X z7r}qmwKVeM`o4dx3p3QzdOGO;8QmyTCmP_fK^y-Pr*OZrsix-ZL>N)kn;4ZzXh&5g z5K5rslIJrZ=5?#e{&4VGrP{k4T$dD=c}U#(Jx_6e&zi%_j-L;}3w0b;!MjPt`Q9b$ z;eChV@G&hTy?`h$$*1t_b8^YM^ZZ_Ovf=!d<3}vQZirY20gfa}m<-3NPJCRrS=T0L z2D&5=U`P-WFB@u70Ktlr;9o4%`5R}iCp{=kNb|X|opkg+ML&_Xhk6fe2@r&Yh+tuh zt<*`6m@pXgB)PDKa5vb!cMqo>=+efs`I@qDvxz|}-BmH`4@{adl245U?M3|KHozV_ z8#P(wm3!`rEc7-bb+(@nCzbLCDX987f(Cy&LtAPeA~|an9R?k;f5SK;jh0JFJu8bx zg~WsRB~3ZgjtR@kl)|MeG%%=VYQJ$J)Y_E|3C0sLqcX5B%>qDP%sXI-S2FsLo2~~M z7JYWbgiuNbCxc{tyBs%&xt{n+sHMU8oOT?a5m(skkeUH2seJ`f>(W5w2JfsaP$s6a zeze!wpa!7thgKDHRI)ZX4nA(nHw<$YMsu9lKQaa@XWFqeXBiqVm=+<~M-H8JDR(UR z^`Zlkge%gJKQpEkJn2Q%t`iDFHi55Whnn&5YZ*2yxKA@$3}YTLw}l7Bwql7KYt4Z4 z2GbL=;ku#KyfZT>%0-@lI|KVSP!8$PAJt6{tC1-^D)vW% zJsbn72-$;=D~{h`Drog2z#Oz!grA6S$jmUc&KO?SZCM3tgo8 zb>cBxA#69k{lXk|VbkD`txaMJ?YI`;$d#LFgZ3tqX?yNobELU$`(9kyO>c}1&)}>k zOoLfZ7M*hNJYR5hL3zap2-wh`>s$_SNlhnZWQVLU+m;~<2_o1*vpmg!^|NM5FZbG# zYOdRoL0hJ5$h({}hY8-8fMwJzm*J7I|Kqrl^w4iIOUxx0(s?`u>8!5?#dHd9H5n&i z?S(mrrJ3lXyapfRppbPJlu3~b@7c-wtyu-x zP*=gy;e_&W!bnt0fEytNpeMkdwvW^mP}Rc6$Bu5X#HPAl^v37?I>kFaN_iqT@nP8z zb>;9kX4`H&&Opfdi>e$hxwO0g;h86=c2ATp@c}I8vSq^2CpIhf3j1$e;(bcctu$`z zJ}c6Qt3V9(D7=~*h~rAd@*6Jv5gA|Kf`AMfJCk?m{90+TA3bm!aaEi#oU$t<=pgE_ zp*Vc|p!4`~G1slmU4Z`Y&P3N}WN!47-^Mg!<;bH%7rv5esK7`y$HLbWok%pNGk4fiupIBT9!pakPm%w$%n-vMh61RW&nxn z$YMW+FSWrwR$JupA_2Mq`MWXaa#GiC0>rSIK`_Ca{AB7g{Mw`)V039O{*1_laBxK; zoKpN!v}+|*{Ue3u?E3g$_O_1S*O;fRZxqWtm1$01hT*8aLSk{gB3EyrixHqG&Pxni z^Ai^7n+r5$P%f8D5tsx#-vDMZ6`g;b?ImK}Hpvk7?5gSxFbe8|8ZA?BnJbhmUs`$I z8T}_teYH52@jC$gi5I(pxh}~!Jo%E|`r`Mn*Ao&~d( z{*W+)f|S1@$vyIJIM9Q3k0pV_5|(x4zwZQtxU>3?LGBT#hZc1=$zjrdrgNB)M*A$? zsh895N3JHNbE~pdnjBh^bQeXM95r-N3nxvLUg#?dM(-55o0#(54#Asb z7!LE7K?|o~R1On5mubC1XRYTGH+r5v=&*{mNZC7>@UqY{p%8~h`K=Lo`*~8uA#;!@wHBPINZ^!qicH72&;4S$K$kH3t z*=J>-BvirQq|8Mf(a0wVq1+4hXM@TIA@IN~GtW2Mu`}g87wzSQg3}0r6S{e?<2~V$ zaG^j)&f~^snrpR#PY;pkky~Zsn}Nd|3=f2vect3K@CwwCTYbCPX5W&><^KH`>O!YF*g^bH&jY494ZxG7P9H)ef@lpzj>stT;;{e)eLv(eOcN8u zBFdF?TTdA39$l2Sw$wiKgwkJjQEsL1EL*YSZKNNK-I+RfxY_ynh5h{Ak-;wNl>Gr_ z4{`Kj#E;}r*AK{+tXiG6jrGi8k+Wa=bXMO<%y3ezJ#j@|P^lO#GL&+CO<==g$kAjb z@U0qUK!H+ScEJ`6OEGK6!l?3*2Km}cSAV8uea*WK4a#e$y`?DEY=1jriuM(V zzi%6Ec5$0YZ}grg@d5n(DM0`?ibli;1JXJ&1^tPjyDF~Gkwqs=PTtyA{mHO|I^2I? z9~7EuBI*HZuRGCy8gn7tNZD9?0fzPq$2>IhhfAeZmW+?5l*y2nQ|swJq~tyO6|0N6 zn-zq)&^dhFvmb;iYRVj}a?W+zK^m{ZU4&N(BrwHpnygWVCTQa2*JT&+Vb&Jgybs=O zgBba}f&wB~o)k=MiH=cazjoC~Fef7XL}-tP;bd*@FTX>u$CX-r!!4S-q>iRas3L73 zO8l1K`}`ZikCYNpVtwmY%mT(KU8haVt==0x#5jmTfj#OE+_C^nOduh*8MeT!*K-}L z%Q}z#A6BV7{A}Kc)TV|~6$a0U^y@u%1l>}F7cg#V;>+RoHMtviUz9Figy;MCj@!B# zJse0aC1}O|MG2Jq!zkExB=;XP{r?Dn8RxD}*w?Q@B+d5N$N9I2{|&ciuz0L4+JA8K z`j1DVcxrDCJWML%Dm)y>(@1^k&n@qB&*7B3AqfQx&@7o`jm4IZibjkC6)rMp$UkD> zkP|F``DzJ z|I7PF%Z z7b&Q5?J`o`?sT&)o+-ydNoo+F@w(3cp~09lWuY-@%L%DL|Kk2xQhrfN)aW;~_-6t2 z(MW0#2M~lNOP~s_PFcCdR%sC(dFz0?3xyL{xfHe7;tInx9ZmvZuC8Ua;n`{&Q#*Qw z(ydIf?0seyMvtuS3yW2&cV zq)HUHVx!qdh%aO#b)_uX%0?H6F z^A!fwf47f4>Sc3QP;*9|KtakHk%@@{W{TzT?I`3LgAW2_lq3wjxRxHv>^s&NB9)=9bo~L;8O)A^5%aJQ3`(ZurIoFtTjL%L(LthysY>^2% z0XhqTa^ah3(vT`)@WOi|*YQwI1Qv28v|CNIFfaaHb{+(IawYIhm*gZ_@UbVeci67d zXFuet_OC%v=yMZ{`@C&)if!=#o-CRIp@t>NI?jVzEgc-e_Xy)(8VFj@Vuqqi=|7lV z`#H302czMtgCrMZDzcL|01+oIgIwfI3lbKwnZs4c+9-CX-?i_f&rMPx?Mz7Kua6-e z;=Cz@7fcbxm_R`HCG3+Kg(odpy@>^CbpvN-z-3WNw4vQV7JW73cbyCuxRQ-KK;g}q#h65 zW2_N7>!j&Jk(}ftW;H}L4$gKn^jI~^w0w>R+ zRD%6;nqkM$qRY}Z*3PTk=F4_*G9cecp=2IzhZ(jnFif%-Rh(gBsv6UwifhG#me4JI znkAPh&8!3HDZ|gf3O&kfbBef-CdAR^ySCH_+}Kl%$b3XI-`UFVLkv^7>DwK)GIew* z4U^4Z1o?nQkx0mG=q#d{In_?p^kx;=Y#NVESsGlK#WoaqDAnilp=`ZeINbs1rx3r= z5PFA#J*Hp&F#hq^Ij3L7dh#97${MMjg<3?@E!Tx0Vm9O`Owybkl z{^@T;ZiA|&s_X(-l_sTE`>rbu$W^;$TFMp?oWufCDyvZ1;A*KW5cSY7PLQFtWSqMp zdHY(Uhn@k8jX~BZp|l4wY)!lDdo*j7D5+pL)0HL$ozsO*G#BIDa6R{@Jjm98M+}CC zqMBoup@~n<5L#0P_IJ1CE^Ydq$G^^zs3L58kvEiKDQVLgL!?7rCk_>bvgJ2e-xz7k-`5cETEmpV`m^QoIgv4F2t3)X_p$5Ki3nDwQJWHSBp@CS701 zgT)}YH^OY-0w)fzx<654Ju`+8oRz4&HT0tM;>KH2iP|R7k!IxWZ5TJ6Q5)_cBoYB{ zU<74O*ycIz2Qq)UfQzqlt9R=5dA|xe^f~Q&0n9jxMBP@9y(`2MG@|0pD|Apb5wE!e z1X8>RTNHs|uUuhP$lkblVq+k8_os1R1Aab7-4(N(h5V{UBrYyskjVKBE%ZAw@Ox$w ztj6V`3R^)}w-0?l7vJ4w+YsODau5)2-|1*N;!-%G?5;1m2+HuJ{P4Q?MOJNLWlbjT zfnEs2&{aBk0oMij@e99Igbx#blF?`#7txW%BPS(?uMe9%7WLz@j2M%8HG!4c#A8A5 zsTI*G4`=O~!?Lw}D;UUZeg$Je3y05+m6eg6JnQQE8xqFU5ciZ^g%&)nsNM7$gM|+k zfGAIh?^d0KVFNLW$FWKiQBGYH&_yj#bWvK^)bg`yES6@~=*^r*_2DlHOUQIX#9`ae ze$F-otvp2MYFg)VD}js3Ex?WNuV3BW2~P(EIlOGj)I;lr?;P(NX!D3#3|vV&f{A`d zjQF1{p@+%6WPRM3`WQ0^5QSx4LJ^mmkt=vIQBbDRsFg7plhDh8H|%vemn%(v55u93 zVraVF3@J7)Ho0mX%}*0R3=!z-(Oad8p&(s|qZj|8>LB=&9Cguys{zd4Ae!dFJ==PO zChoC6$eY5@)$Biom>`kbwg~*)bz+ zHC8=7IOr0RKrQ$W3j=jhIpg)$0`^LnsZfr&F+J_KTfL}8hx$ue2|H~^W7sku7wGU& zzV$xJdc^%XbovT~(n_EP9%4(CsJ4#P!bO#jr4qL@p<*joPfiBs{_nPCr2ah}bmE8^ zT^_jQ=T5xl@d0*aqkVJ2s4AT>0Bpb!U&va`?u<)n^%Dtq{_8F-X$Hdhzp9@*O*h%j z8eN$1PJEkvSk9;e(vFTTN$xyYrMZTdEq?_ltH)=?kw*zNU4(%_`XroP-15VfTtWOn z1G>Hz^DGcq*qq5%D3N2SbFskOZy7v)NW2UBs;4yw&rv>K^ThKWjHP3Ie{;1}ixqq}I9$BwxKq%0 zwf)WZeU*sc2UAf5VU>=D6TUex#cvSQI#6Oz_$SVe84%JLncHcIc50ANd0JM}F5K{Y z6VAFYZl}2s zlpR~DYIQ+zl$}hSmw5()v}mLju>t;2Qm{$!&hKg0(uSbHesdsiDC7#;kb)pP9Zz=l zIP)}I=I{cr1}-n!sv^upfBV58o=DlyT@ZeM&E5ywiPs7mp<|TD)sQ;1#%Kxj}@k8>&Lzx|{=LW3K_5Eifb9$4CI*SpE}Rl$R~2eWsnrM{k@L{pxrwo*y~UTK)E4Aq|m@@sAL|`x-h~RcBCgh5TKc0)?00L{uLLK;H|0w|Y4S{U-xFHF>oHvh8$O=Qsv_fRX#lY_e zR66qn0PV?2Y%Y;ejN98BWjPH>w=g{b>T532$7l2eh!w6U2q;0P6kcOXrU&VG*Od7n z>u*BUlzyAQ7Khmy+VOJzNfgtQwCnsA8Z{BY;iBU9k zLU=J;ET|A}a-~Qtk)cHQ*R?*So5eVetUlB#exG&oWg079MNKTs%14l!CGZFjkZaVb ze1DyfrJ8!v3l|vv(U=48*E^ZKeuewnleWV+4MOY}`iko?*jTD8Ux9@2XR!x)LaS}g z(~mjiWJ=d@bZuiC%>Ykf-NHRg)cvLKNpzn9X)EJD|3Y`-L59(3s8#mh3D1~-f^I;~ z4NO+(U+%XTW<3LdBKuI#A#g}JOd-?)9&RRXMUQj+(7_Dn8gp>$OY}e(cbhrUK6Yf3 zsR1(Y5Wwa1i;Xo{k2aml@j;@?K~9i_dMFzcNnED)l08IQ>l%}C*rWsBB5K|gd7xbW z%yP$_*!H2~URXz0^BVhb$lHL}u@A=->KW(kxRt+!w5_P$xti2r_ES?TI8$&O9h!R0Z1xK+o`;BqX zG%K?VRNKY>zqqHZSVgLRq`C5Fm!>3M zpz|O{(5gt)Dn{HDwrOtl`G4?S<7qdwI34uP4p{}V;O?>yDVP$qV`Q(@GTWKVT02l+ zv>29-y8;WJShRX1NEBtOO)reWb;zFu^ZvSu_++)kOhl!OG1sq?{0d#<+t@uU4=k^) zqiwH=c7~>L3jBrC=kw&ZgE^m|hTCb`OcBra#Q{s$aVYl$d-fToSB#&xJaFm-z!^qq z13GAi#EkPp0jYsFaeingabCwLekPpWcC5|x0|(y#dGb$GVV}?nz}W#RjuHYWh}<(O zmmv|a;^OWlHDrj}hH2?LTrCysHsE+YaxL!EQS1^!sQ7mc7J(;ni>)yYwfMOXOMI1y z_Z&J}bmX{G)4z-G0fCU`o6qd%s#q!X6_m;tisTBE6w@_K6BGC7?gKog(cYt+#X^Zs z!VxJ};>7`inBcg8>`1BMX9F=vPsI4E_BMO~Bl3wG>Nna)6M5hyzh@+^y-pxJ`j*vD zV~6()`mEcl%G@gd7iN>Zd6|`Fbnq~lj^0}|+Ak(TI#X}?*I{(ls9p-bO(Bx_QeJ#% zXM)CPDAnW=h>vM>R(7=N_;=*Y=$B4%py7U*d@JHtcMze;25|Icp`B67SJy7|FG>Fl z1gw^rIL_p#2r{VjiB=&e>Fh6ZcmUUp9+6pOpC(!tKc9p=w=vep%Wj0XT-S72SDL;q z?GOz|D7^g@Rnso_kYCpl=ag)Kj$UB3hY=|FDUn5(YfrO3n;p|V%409J^_I#4sC%ie zL+U+58}XEuczdj?7vm1%2XXX=J^L7pJB7=G20c5TFip%=v%ZKbDqfoig2JC-O8xUiJ>@KzM^8Y4>kkL*9PH0jP()^?kCmPk}gtul_%L1Z1e z*lLGVkb0DB){E1*!XYYFnyDCS#)`?YAsxu0Wa>2 ztLLwZHjM;|46OvsD`ijkj(=o&IEP2tuI)Z#OH}+jNuSx|OL%!!j;Hn-K9@w~^_2@9 ztsZN&JOs>f1~N4mE(BOGfy7cg0s6#I0k#{|jKl5b3rAeI9cK(O&OuVPfQlkhA4Z95 zQKh!{xJtR1zGj~rJO0I_(Ft4Egs+0+!ZHT=;lVRkfEcU@QLLZed~(PWGa50>;hkbK ze{SbhU}L1@U^!On3DGUfCSR=J%OXH_Y`+HvoGQpO*j+akEad*&R$=Mv227Mls&;7F zq(eICEU)5&scQ2&O=r6PX~e&}){w7)pzvC5w(0#F#JF{5iAL1N&H5Cpj<|=2tIP=t zR~VWJ8x)!!KLIB&KphP1m6G0Fg0a9+9Ab`d7*bN#w8;9(%mTi9ry>7I3LySW4@j;Av;iL%P`TZ9@)GSMmQCu=1 z6#;kotj$*)NYhL&O3-TQ;GR=06F2W>Re0pxHutE&tM)0HW9*mD3cm?Lm$cfNl(6T11MdKB9h$6M4&AU$rbHbK$jly}Q?4pPyZns^+X|^?>x-66 zSTBVeJeW$0N)N4fsyM;5@slP{H%vQgiODb{-Y%sg)?F?Y(bu4b>1s2SgkjVA9Q+Vh zWn?3sIk3@&)So|a!EdB% z0;KCLKfzHmB&$q)s(tt%w^9EG{ZhKK?zhrM@tAfUcV)i{e997qAes2~u7_XP;zR3n zb#)ah8)b}^70O5kFRFIs{mGi_?LPENz>1Xz)cEeqKC;3T_r%iI+oo^YdB|=n-=WNt zW|1!^ErDg;|p z+Ozr)?MB>8L`==vM7!lb+}-2n^fa1UWHEvK($XQs@z%jTy{sN}Gom`uuj@}0m(qdO z)Cgq{TFWQ?dLD#Ji;iohUoyc}@UI~w@)!)=Zwg%bRZZ@E;+G(VJ<<0HS3oyhn5v7d zfaOclM~E;ma5ur8dY#*KG+)q_jS#5x5@D$%voVN3tybpp!$T#eEs0pZ)8iw|ZG5T1 zf8dvsq)*@FQ{S`OLO6-7kFh_l1}8aRcTEe}rV$ zwD-XI^^~9HqnpowzxycA$Gvvmx{nA5FF>1LyAj{=qKX{2RG%TJM}On>$*I4X6_4|) z^i0Uq59pRqYOuBtX}Y=}m?VZZadERKext*+2d#A7>yWt#{ucMh%Cjm*Ya$-XJ1(x? za&4Bc+DI!G%uq!h>CepqOl%#-Px&fw>*zZ3lL>7Jh@+O2v9ZMDJ`PjX)iyNPI9GxB)v0Q*Z z`*{;|413=!_6}eQF-vOc7Ix+z)hbsOJ9_f1hP&R#T7un@f0X=YT6-r+9CO8+T&p<` zHj!^A8!)mpndp-9qjVQJIkZ&TD!TzQb-fSjzZv=+Y&&6Y8+0Zw2j54hILnB!wbeHk z(S$oCmlkX|`+j4sVc~3LzW8WaIeg^(H})IHIH*nK5~=`&_ectS2=xzobg?n{^^#4j zhgF1bPO^+|sry5>34(S3Jm@d~(McIn=On7PQK(P3F3yS18jAa~6 z!h$UhX7mGqW9!&p^0jUN7o2BQEq{RY zziyHoXU6pFB&)@3>vsXV0DUFG*yC;*d)fKr~4fy)_`Pl2sK+J_Ke?prEezm#Wd z;=Iu6hO%J~H0m}|Q6ZZpE%A(3q||;?uCh$Ygp~2bbQ0w?Gw?dZ#=yDh9=t|3MT2|| zRTErghJB*PiYsMurl`FROPhWjoC@hVXam*chfo*o%rq6En-o*%>O6m)D?V+o7tv_~ zwI#+KDCyCnR`asQcN&6o1CawKfYTgNXdfz3)0H`anuMiw0h46i5oV1kpStob4VApb zK;LkUf-J1X0OXk0A>TCYD-0h>8G6qJ1 zy=BC`SH8ZBmi|nZE^>^$VVF6Ga^IrP8v&QSU1011+QVM%R2NxlIcLUA&*-lZ-?rLu z8vEF{Hlj|zxAp+M;amY1rFPRTMgQMh2Yr+RAT6qUrfe&Ee%7L0(y_=$>whBhF*dA1 z1wUaEQ<^@YP6q4t#Iq7F_FMp;;xCpU!fe0V4WS^4QNPhVB&#XpD+*e0hBH)G$oD6_ zJRr2wA@4rP7Th)F!Sy`0f4=$*{FC4-yiph$$m0oLBwQ&BH6M}JpJrs>&w=xksQO@r zDXu^Dxp6*Ud`L5dttsb86q1S-=U-I1FPYC^)n^nofN6S{yrE*rACr*R(pTIgtS0?+ z8QbYSAIpn;j6wrL^15Q3uZG^o8r~u{KY$$diiXT}#-o%?Cp@k@mlxxA)5;_^ zTPx%H5V>O|d$C8>?ky4wN3kKXcPs6YSa6};K(l!Im84Pzb|me1o{BH%`PZSc^FI36 zAO#L7Fe!3O;Mm~K@K6k!2iR4#tc@`) z^c1M(gZExWByxe|UFN6sDN> zDUARS?qvnSg~~32Cm=MKlEQ zX@E4>l)`qdon5;lzLoLKK*JuXr1HDrHg-reA%sH~uyR5i(gSD-a+Ur!l~*F&Z{8T3czq4B|ZEja4 zu9NycdT~PrM|pg<^pq)DBE?($uZg5 zJ}yS%a#8uXR2Cd$Nmiqzi3eXFsZhe#zEL44;Bw9b{u4IZVG|v*=oM|OF8&ZRz3d}o zYNwWXYR!OYm}@@2D8Iw)vGk$w*xD~sMpZcG=lGm?6` zuoe59zA+jC;r>1`yJFS_HQva!Vb?|2-4M1B)xo+_kKGt5MLfcJhf;(qxe#gYPxBEu zseoN@+H<@H=NqKnbGV)<*%XE8gS&)BP%n zF?c%s!({pA5Lw5hKCxD)ls8SU)G7swIll7mF|w$@EGr=}`}rV(Q{T9z6IU$K@gW#t zQ?Ox*LH;N;EV@#Ox>H!B@j^u6UWbJh+JUSKiiIZ)%#(|3@|vg}TaM&<@`036`|=AD zyr6ZM#qXY4G-a^<&9A zJoO)t(Gsd&?0p4J#lmhp2V8!-kyqfN*aae8h}JwjYY}!+{h%Pk>EwWP9)T1TpOVs( zk}J8p0}o0{49{|Mw|ck-@A=1U`=c%&o;(Yg)@5;aV5JuPi`@z+RMyj^=tlm>1@Q+0FKeSaoU!!$9$_ z4wRTJ-RHG&zoCosdxNCI72oC-M2&hZ$vv9PAU({xKOuagNNFqL_i@do>Lq`UZd($H z=Nt#x_&dDgl;1;Ni{io2JQFjnq6s4(@jXklo+oi$|9#Sc6tJ~8ZF~|Ip}@M9QQB5l zdG*&S)=LG1oM{d8=U#nSDfAq?1Iatzq)J{6+v`ir>qZvX*#q#vq-Sg*Y|_=F(H3Qo zHN!RTN5E5{h8thouvJS3q0C(HK&8JRN<>jcS{S_K0i3CY8*!-rz(*Z6qq75T7qt=9 z&aNp^qA%@-Wv4IK-z;~~PhjfPQ;Pq(q;oX0jF{h$FykxbuA-@JSwHv`vjG`=-6F-S z-ZMZ-5*)~_=$B;68TlE#BEGc}wEUj z&y5{Wr=u_HY!Y2N+%e^Wd1#d3w3e&XSk_u3$UvfUb}lezsE}!b3dHe+X#R-w=d3mP zMxGdOKT(BXmI%%V8^vJJeK7B;Hl8~?C!m-L@H2lkz`GwKS2)JO(IgJgC~>8+2=?F~ zLM^0~IxgU9J~HteZYw7?>n0vm^UKKjvdw?B<*2ig5mko6f>dL8P}Cru99lVqk)lkU zkYCK8Q;(OirZJ&H4NRDKjfT9Qc(lKyE#D{>@H4kiOBQUN0Wi&5*5 zjVJz{AzW`SvU7Px)hQBuMFd|ndQIwJuH2C{z+--;OYl-=0*VwQW$xk);<#dX>?P$- z%wD3N&@xz$$<_Q~PU?8wf~%Nhy?p*P$-3}=+2jlYO&nm&wBeVt63WIh!Dp?F>>($FF|(;A_?&2p6@hv}F>+iQ^Q-`OBn ztJvls8|dfC0W4QbbyAY+*-qMO;eT$S4%BR(L%$xv=wKkHu$z=!+($!A^)TD92fL;X(6<|I=%dqN=3~i?MKmZ zWmPTzsqBb2ame){;WYgfHa5{1xhYvs6lb%buOBq>GIEk`vS$>JXgX>Mn{66H{QQV* z}N+aT5>3DHn0oiS`qUqvZpk~Dg%k)CRqT=uT>H2(<%IQVia@FpZ zsCV7jAJ&t97Z4e0D5h#dMcFaGHZRk*f#~^^C|e~25Ik+{#!)g6ek>PQtLaJYyu?1d zy|@E8tPjw87@ec+&fc+|qXo`<84Mm5JcJA$b?%SRUv#DP`ToMRo)kZlI@=JP_UO3T z(v+@LKA%3HWf>s_z5JhuRMqDqNMdnl2nZ;I)cPyV476z^A|S8Pf9Ii2Yi_Gz$)UeX zLLre;7$-=HOC0?|kRow={f^=~1faGUqelq0@cFL5W2W7(9^csbJ#R!ynf0}%p{sEM z@5X}Z;!cs`i!S0sIPc=^;;qNyYWL#H`(hO@#7J_i8QKQZ5T>;hyx4V&HQ)-dZs3El zMp}>4T^{(E_(n^xp?Ws#=w3J}Dj4iYg&$$xI}&Lh&5<4=i> ztc2qfZVZxI_!ifodmtWqBQ7fY))Q`Ujj_1Sl1#EdbBElDCbbcuNWHqojLG5$$Dten zQY66$&%80Ci&5(dN)c!Ne!KM|I`-(71RAz5Gh~CID~0`ZgNZqOi?P(KRbnMV0IBry z7c`*$dXi)6R^fU<7s{TuIwvLaqv~e&y}=G?7)P4_gC|ufO62-oVYo_!Ua$B<-0$YP zm6i6d<7~HX&zp$j=#$SD6pluDrmSJjDe6dt*edJ!j}H4Rh{xg=E0*%C0+56Hfp~}G zDIR(<1;?ejZ%O~g5gkmXRMgjA<;`0^WqLH#3E6)PBt21J|@wUV{XhMINj;dFkp(3BM!GcCef1gML{!r4aGpYhJ z(ww`3V&laOZ#2AEVVPgI$npva5MLO;kv_Q;pXlmM^} z&kv?U(X@LT>RgWwEUh>NMEWHdRe%hgjI6>ux9?D^HKFGJh5k z#y)P1|6We<-rn>0C5pKHBZsIGv@rBeGW)VBP6~#leyM@h3>ZUvTyffN-9;UOeYOLJ z?i>5(ekrT$So{|JOBR~?pkF!Q3nnU6p^5-;9hwBxTm8SkJfkX%#E-YjNYMP@pZIy> znCOa6NfsaucW(Ap#oAN(elE?mjX=_U5m>y<)tTumTScCw4Eivg{ckB}y*R zw2cbu_tLi1++=rFSz8jKAFil;IQs+m0}gr-rYf2m0~HnKqSNeqVbt*biZay}QPtz^ zHAkcakZsG!%Za3EFuPiN7uRks7Be#4O7Hh3-+ibXE!A;HA^x8k6f>w1|1u;j~t~$4Oa8W#j6lN82tbqitrt^~7g? zg}HsD93es`i@Mvq*SqvKD)s}W;#{Gwqf8K9q~V17%$K$o3`!Cm&+!f-`unfq~XorRth=n|BEYoYQrvl&)xUd}n%vW-u9A(Qi zEF*;9+2_${4qEEUT#TkPt?H_6b8o_IKeV+iBJ)|UFeJ8TNtHENbS)1!E^)`~@C0x5_W z*o|3q73?F7*wT{%O9n|ow>JpE^x{SyWhs)`(KTz52=Hdp(4io)uRE8TjGGEgq5qg; zHlUNCJ>}R4i{fS~WGR8cs(`NwmqR#PqzcL=ek7X#J&;yuZLPEeCU*HP-i;g#SGnW{Unpz^ z5y2ugPGU{nb$bH!{T^GakG}oZQ(!K_uvimD+)&^(+=^Sp_pXW7b7qtfZvPtxC>Hfo zaBIuhq$wtcZ7E88PVps2sT(Ci?wTKR@J=;W9AWw<jy4aUtXebS;>7I&e`OBLymQ)atM}>L^9NFG=sBV2 z1`B7SZfsVmQsy&0EUNgWxD6ukgTcb9*m1N(;HLF8~W26#^!Jcukls8$-NPJap>4=CY;Z4b=al;&;(XH0iC z<}RJKmYZwpZQR_XwEWyQ;e?nwHF5+iDPGw7<5Z}{W%q;&pdOQcxxZHG3fdf`$)>k6 z(BN@k=Cgw!NI$pYo@UD|NqIm~c?jMh1pkG;GI^jsVIm?SEe>eqB3#l+SSKB?A@FP^ zVMaU2WBUBI{r4_}U)-A=R{;Qc-qY8G^ zFn%@WJGFi%EK<2h62Ui%1_d0I$AQhTMEaG^#NuWJa&gTO98`x9SE;zpuAYKcJ|0T$ z6>L=p)$~P1S&?5ChU#wY;1VxeQ!e+nmVo$9>cXYxL@Uu}e%&;hv*ZG`6iRXwc~Kiv zNBmDU(YyPP$hn$djL}rvTf3F%12{V5HUU&cy?DT(eB{^lA)_0u(yPlgEbqer&$jtv zJ2MSQVjZL!08q`j6gJ=uD=m=gy8s3r0!v+uv+yfx*&?d*idm-qO|WMR;wQu z!SLl{>f7fu?}k!M{wKq5^?k1D8!={qG+il8{yxD8&P5w;E1KWpe1$;OA2H38DeWo#l>(=f|RAKe8I+e{>G-Y6Hh%29Lhl zhi|cAoq2S!9hc)Wmnh%EI==DmDhLux8n#O}@1;3t={Kszi0W8O*tTb?$Qk_BW^m2p zov7gAC~E-AhE{VQVXgog6n}rI5@cz6t)>QP!w__4Em26aq)LjdWG_$=aTrd+qaFH2rQZ$4})-je}4l?l`lGZf#q1b9Yt zd28cZp?DkOf*{2@6zWT?p4vbI&P%ob@sin%{QTx9Ch*d_J=`YP#p zS7`&SNcCu(Sn2}AFre@5rYWqLeZ^sNjB=RFFzHn_BXO`6%pi`nghyPcipp86siEKZQ~!9|lO zf&lzjxbca0TkXSSYopCZhYJBY{=CW>=_QJu;&QuiC!pn_8i=yg0mtyl4`kHIUJkDu zsHeRcacjuut`s=vI=q2Rp_*F_>! zh(}RtqQ}uxZmp`TiT@K~61Uq%_V*aQ*t+Q4ZDF~9K45NYJ?s}H$8w@|6?PS)FE>_S z-NF6=#plm5C*j4G2c=P-gQQ>F$obyQbq!icRC5CkZ;v!plJEfQKPJS5`a>_4wfd4- z&D8jpcYxOB19K%k3-$)fIvbDf`L}0^{n|)}=GC)TEBKV`8jn65H?}wfU659o&3a5L zvW|v!OZ3q$k*W}~le*ls@3L`;U2e&yY5YD}T2L~P)V(|&=g(wo7x+_nBj4pd_5-Kw z0YhAJo|_@s2hZ!F&u@~b9PiBm7R@)ip>!{uATRn}{T@LP#wkKoVWE4Zhf zNa$+FDzfv*vcWn&U11-Ty=zJNRqaNZ;LO06bl;a|dNEgE^y>qY(WU^xlOOC8yqYj` z;*YU>E@Q%c@;xK$JtGBvO0=}GT>|4O;K(R(%7YT@1FM=aeLjQA2kXg-)zVgDsUTA# z_McCM7Ub=UtW-zD8 zIPmEX(H<~4Lr9CC%F|QxgW`M!3VUf8%)FKJ1wTu*@k-Sm@3yl&t&YBXK!dokl#tk4 zQbwn>VSBqms&G(Qd`h|y&wH1%Jm=l&eq2Z|-VSR*MfpBf zq3C6-L5tG=^na2*KF5mp1AR5HS?xl_n_itGt9&Hx`mgj0XPhW=E zDVl;R1!vNx#{}Y!`_MIoLL#^&+u7|NWb|DTFWi1FuFt#T58EMbx%l)Cwm+&?!2K{` zRx*h7_;&`dC>UAlUshz;Lqs&k+ke?UKqW6zmm+mX-zzwO=w1(Z|7u0;T?&g^kx)X;1` zx8Dr9zf_9p?fK#Zh+yt+iSL)pmIT-m&nvlWc-Vl->6k9Ead%LSC1v!f*3;4XxGL;x z7_*mcwXC^R&d*8uU1n|%?y`EZXg@90Hnokd{e#Fv>v6@Ru5X;c+Epc~2DwwwZ&6hy zwNfsm`NvVeFhj#)O{q=85(<-NX@*iyv}Cfbf9d1g6Qy)HBnh~XooS^oepB?plhBgR z6k19gT*g|GA>CF2_z0{s^s8Q`dfgnEpt-JG6|_07aORb%nC>w^KRl~HsndH>_St0AOWaXU z1e~B7a))KxUf`nbdoZ5qEUp}p4(rKYtHyOR!%J~NF4A8EHw}0!Pyb#YZ$fvyhu{E5kW!YaQ~SnK&Cj;0s#I6L?5VN|Pa2qY{r-Yy*$ zq(3)ai`Sf^dllJR5}R)e4uaxzl}DgCCE25m323 z%umN+(&%TXt?p1w-;K4$cw^i?RSVb=&B(p`9`l9NZsH-+U;J2GO zy(_y8%*ojDHy7M+IXkatvQBhePKBKmp_vpRm~9{q?NR=5NKL9?^Hn`6ORa#`9d6f( z>BS`b@QWhTB1?mAygu2u-ep^V;>7JKAQuQlJ^dj} z;GB=K3ZZ3+_`yQK-pm&X>3~XkAgD=pYZH;NV6%F=K9HOU>&VDrvhPRW*=S0zvg|*V zQ3Hl;Seh8viv?3BoD_WTsqP>LI{cu%5uE%hZ&U4w{2U`QWwbc(ufrd@Lp?YbKf@Lyj}{eU{C z{{Y;o+5z8T{=>dG$4!dWQigzl*~<8W2g9H7>pK7@<1ZaDpmk^zV50n=+w2tpCv+4@ zC~WBe0XY1>wyp#$tD*~E_T^soO;$lc6c9my+*r*e72L|)Ak?%{Q#4JJLM^k@6pLis zSKLJ<_a#7cR}>9*4Jb`X1zh^w<$veg>;3Nii0A2vXWn`ZGx=x69JA@mmB@d!{41E}I8`(K2;_rIss7GvNYDI~a9sA=qQ6h);e}lt7CmE{smKu;1 z*MVUHTVQ3ZognnpS?S}-sr^{P4w7tOK|37m__LYkyk(J;4%7lBEtxote zZmBve$9;*PnpXXPtW&V~u zN*Is2WIuAnE!cY)+xxmOeuTehvM;&94^pTmxN3BsE8 zf-p#DC90#$AH75LAuIX2U}b!|+`83X@}k6DYkIxtJ!IosM65UP$A>a?#csvG(w#7n z|B2kX+)k3S(YzR~$H&R7EgDF^ohkDx4vWf+;}=u&Y_-*jP3a_Bvh-vn-}^g1ET~18E|@j_>Zto! z?o`xK@}$hxopClDiuLB>U`+jJ0jCaPJ>ry<_!hxy(n{W%!lpWjj;w`;0#)$2Pg*BK z?MCp}He5z1#tF4TyGh?ev zO+TRI*uD@3&Tdy*Em_Z%aNzH*5@_)Z3Oi9G3ZWA1eWkIteSoj?1m18%cgN>36wp)6;V6)&ZEQ zS8XJDBg{VrDB+v}HIy1rhbi09daI1L_GZ=FMQ2LPr=3Il&cdv=Mv>@e_4*}F9mF!W zDWAMda1q$iGV8n6crzedGKg2{J#?{jc*?1X z?8N6Lj_kUnQYBN%4h=6v+^-$6&*}KnUdeo`FHPLp2UZH-YT%1-=TJcipCkxx>-fKz zv$0#n1oqx3WyDv^G`k)F8)aq#g5Luf)+}J>r-<*Z{M+ z>qYs4dhpb$l%zO8X!@fdyrVPc^Rb3+wLx*;E+OWp8hb&o4aV_D$3L=G!_V3v%AXAF z%)c1c0F#%B{i~Ob@4rjtCxl9VIhl7vHg%)2I!^4U>UsvV@(=vz`>Z>l>GP^uWOZ-) zoZl0@s~p?Nd89_aJKsE{=@av>I}5w0_{sfZ^gSDQ?5**}g&2E8(#1=VItUbwELw+RV33*db zk!p5$JvlI^17awZQ{f8Hkrw5-6{5FEx&fG5B6?6^5ZZkuyezioUZUBuH}N_Qt8ANz zTzWYf&u=wR<8vz9Epk3>YsFHxDBqL<($j|8qk=~ zpMq>yi#1Ah`DHrUmte-vVApw9%^zPu2ZG=G96;Y<&CSfrkEq5S(UQ5dB-f>0+Lfl3;15 zhq`EN<_0 znv8F2X%cFPeb#0`*@M-tfrehAwg5UaOobd+?OP_AC`X(EzC2IH^Ph_DEMkqRT-E-T zsND^fmq-4$oUq!-JGEz}cg&q-O#wceSqXbz@6tddEV!xg>Ss?}QB(DW#n*c^{1&lN z12Zd_8e9ugQlSPaFR`+h)da_@I6mUA2CwnPc?wYPeG_k|??Q6N*OL?rj%oOK$IzC< zg$?gC`PK9Rm)Y3;qMPZV5}8$eM+~Pl#6P`k_uuNm^_*(3F-y6Pdf~RtSIu$Q^q(3d zvrOT;Sokr&V(@uxb`5Qwn~L1j7aB{-RlWx4H{);((Z!kSpL(IYQ1v%`dv zBVuoW;AqJ6;-8eh^Lvc5zTo(r^(+%Z8R(%bUcD%L!TWV`K z+g2^Q6O{1)(A@Sa6vRkma9htg6qlrjv`T}=SDAisSPkNwtk2K$+E?fJ?@pQB^z}Bdp3{L_AWSkE%>Mo=GC`&bN=)dwHIpg&-)cBBR}ND!Xp>!-GcY{Ir(UxG}U zsOiLY2#q+gZhoCV_@&TL_}ox`@}@1!)bP1Np*r-tbfx4Ndr*KnjGm$rLS&u7$GhP% z0vtD8g*wq}X7W|#{=M27$d)g%wPm#x%HHzJ&6)yUz4aA~G+WcDW|@gSX%|YZ!y_1# z=4x=RRcKfaW+nKVQ9+o8v+0NGp!mn}qj?&BN&r+0kNWEWcv^qfLyDH+c$=M zgJx-4PqS>={f6$&jy+ZOkqZ9V?Ddx%7fFJ(#M|b3*_xLBn zULW@rggek0db#2EnA4+Wr7`-7=oY~Fr#@=BVG3rmzS8LCY@X9=LLw_(Yi7Z0FN>~} ztbohdfTP`IXzFFrgRFdFxBu3Y1VL!N(D)#D$Va9o=bPEEEhVBv{8cMe#Kk# zW;th+X1_B^%KjO$c-m;JxE)BF{xCoHJaN0SC1;dGnK}gpjs&;vMRv%7@Xb6vLQt6DCW=&aB5RQ$+x9EaEJ%@G1q%xMJ#0XLpAuTQ8$5vA26qz+9QZIgU0$9OaF@!WB{<%X0E$R*)AJ*_U zvJ+zjp{p*S_#hqKkG8PUd)Qq5&rp$6d|6Y3P*AchYv)Uu5$(<3sEB4mzf6h~hta=f%n^e9t<06H!wnc&|hbXyll=**Rr4cn0VY(wC+#jGs zSd*Zfb$T>F^S41tbHi%Ulg1uVJh31hX?%pK8>|Z^tEs|0>nQ~g*CizM@fPs<;Y^gS zr72Txk1;Eq=EChovR zSH}$Es|_R5-?4p~Lfn3&bch=@yL;Jia4qT;U0g3E5LNq7hjIR%)1Tp75e(yc?bG00 zrGqMbesIBnruS8v9o zOr+x#9O!p|qD+Nb9ByS!H#jtwxwaU~mMjCNkv$uIfvugUU|jN$k6!(fPfb8PG4&+R z_tS|xmS_w2`0Th1+6~b3D`U#{MC(U4IK=(-NB`GF2zvl#QJ<5WKPc|`y$(g}%cJs~ zXK0r1aL7);i!aNv;PW_ArN5%?lB0B3fypE8#slsy8{l(3>Q?VFo+(^a6bJKOmnTZ)6CXk7sGI$w>z3@CuVp6|`dpOg(M*G3ZlA38 z$EgB$OnPoRW?~^l;Wssn*~n-moG&;OD9KQG8p%s@k)y()@x6WC$;>miNOY)h;q{)r(pF^Uo4>o?VYxb_puV`fB#pX4&v?Xmr zPKJJwH#wMBK|O8r*HF0=E>G~SJm!)s@h|MWJNX7?@K!x(GkJuDpJJi#O-)x;RAKWe zLzU=1XpUuQ_-8DnhGhSC@S#9EXqw;Sj5ST@XBvKgOJ&gGdS{jQY$8D08YgM(OybjJ z$(&@2nNKmzez#{hSq|JrFhAK@mW@yEaq z#GXG~x1ttRsQfsRNEFq+m+*S)mI^gyeq|P}@-+&Ns@rSeZuga_c%C=E7Q@I@?3$&G zpFs+pnrvJRKQBYSNkd5{S87HSXXLRg!6v?2=22$me!=|D+-s*%|k%YS%`1`2C! z?M6z7Ms+AH^jR$Cx)J8Oj~XObgq3YHow@}|O(}sU++KEj4RorN)}HC5J<;bNi01rZ zEQo3oG@aT6;SB|z@RT6f^Z7}J=$dBg2E13cmE-)SvD&vJZ9%*SejO2EK2BKRV?)u)#f-m>L)OJ+0{^QAIr-rYpB(fLY0rnF2 z%XslK+Zg$kFm5k)dez=r82U@t)V~gqQ)sZq-wPv4lRG1a|FVO@Z*oYlfpJ6DravVO zKu*e#6a5bAQerT~NHcN%`PAa-#c<58Wc4SsJLfcfy0QVE*(PEPugWx#K_7Aac|7o4 zS2Q?X*>G2dD_5pEVg0ngR;broAD3(R^nMsO)ut;<)&40%Q@cv-Y3Li0nPB4Nu@&XgK^*SrGM`0jkJh(h@mg7*%lf;y%fexb&Z9o{HqG={`*ujgnq7 z;}cfYXKe96)bM$n9Q1XG7gY^>!(|Xpb#*7$yOJp52~lD&X(n=2#Ea=-XBCPhiA15- zH7>jI5whlh@bznXV^^7vT8f~z(1`#3v)g@M;E)oD%<1LVcgZTh2_u!nquR%p{gWOV zh~7uz&^4ZbKJV%w%}Z$%`e!yenDi1F@Ba#qK1|>0uYpu8M4`GZpHQ_5 zwZ&i9)7Mt&I`21Zqitn?bAxr-O|33KoW#RL+fp2)rjk}NN z3HLK*7+^+{h(lv|WW_V}kn(C9$7iPifAoU}SFeL8oGG1ud$JknT8?z-C$V~-rW2P# z#LxV!MPePoUxe`W9|6uk%l!1gxLb)mfhVin|A-j)|6ze@%9EXpfmY&B6^Ax1m7$2Y zq;}+B`|=q}JwgS+ej;+JtCBzSR4WbGf+jdP!AkGTHzLx`BlrTSh7LM@YN^bJsB&R` zO`rleKXT@ZIbPV3#zIte*74_Ei|_ag!mJcymO~|HMdVDKV8Qj2#O_4l z?8L`Y7lrZsYQhrRp_HL-yxHJrT=;Wnax|c278>Y!v=Yx(9m==HB?>~$0^`$j5LB3I z$}t=lz5`?Mw2u$sdrS5Ww^KRT!K$+DM2ho5H8q z*cehYXvf9kqxe9s_A4>{q4m~~J#>bE_ zJ9g(;C00ZLPHTF85d;{|3h{ZuC^cs~{O`$ftT_G>yPj|Jn}#pGnGiN)^qxuJZ@{GJ z`A$bQ{8!-H@Y-0IJlVc6ThU5#Gktj6Kxh>mK6KRJ&py+tH%|A?oG`W-OlM)f^#`Y{ zQ-j`==m$+>m{TNt_(8KNgY;*o3T^D!)JUaDFYU9R!PVIqWJdo)>i7js zr|Jmh@UthsSKUGI!$cgTb(x=iRplqhFQf6$4c}I8{IK?Xxyq;Sua_korQh&%zs9%r z&bQT0KI~zn6h?f*_q7^VW_gv$_ohk?;6WMwQkU_KmZ_`ADo=~=uzt-YH{u%pz>x8E z)=m%N#LL%zW>bGj6Z?;r6Pl%H*plZMMh~H&}OL1NumkZR{>VxV#t>FZ>@;M#@?M delta 280217 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%0Dl(G@#eG7u8;9Lyp2(1=b$nKXVb z5|46C^f+;PNJV?ocsoHxWSoD4nur_-`!Rz#21oKXrw{wiVY@Vfv4K0TSet`o9KIOi z!OeSmx&Vzq{yRIE7cW!U1?QZ487JkK^;<2vwfk73=3#psB&*5U)-?=tBE`gt?WpU4UJ{gqJ(-O9l;ee7x`TYmO9_4F6{Id%N8>Obq$KzxSC4XqqXdlsnP%6;@#!G~AB3}EySv13h;1!c&7;t{V? zAb9HF9q;oSARTVo@LTnn|Iiev5fK0>Rlb@b=Jw|zoFr?u3&dV0XqM9(KJM%Z7-pf1 z_=9s^+;Ayr{q6IB=ROjl`;1=Xo1I_`N%(dSf<4f6YdDWp4Az&x6B?~Kz|Lxlj=DR4 zm4hrATL|f00q&qaV!WA3CY;-T=FVFZp3=ymv<~Hv??Vnp;q`!+7meRye&PP&D>hT2 zT^m}w(TEH|3r%%@BN|MNtxfo)r|}^^u)V_)Ax!9~dLK7_jl_L>zrgmy2vR#dvVVn< zih1s%drJxhMm(pEWV9uon{e*pV`p$a%th59ah2?-fbR{9p7#=%Uy&>>b$oO^adoa| zhSjb<9S92$!~F^FndwIeZ$BH!Z})d`nT1G3lQBvrgNnq@?&ROqNjdVvF&^GJRxb;_b^Q}g z>5Ac!0Jty{N?vhd;``KcB0oQ)Ic>|wjrp+a&wJGQKvMPueTSR=*# zs@48X-kbij3};BFj%3XkLv4pGHDb(7F6zr(O6jQZFz|OjIK)9sbWJhIq8f>UJ$X_3 z0sY8uuqV~q;ySz_{p^}KhMuI(s)MfPmDI*!1IQ+3Y*afmMwB0@YseQykd~-LXCBQQ z>zXO~O-UC8TO(2Ur=-acNgl~r4(3JMK{ui!Wn6vIZ9A0}e9J#P5-+8?Xq=3<4;x#K z;2ltmr;JSeRTUnN)<7o#i#{V!CL8H2y+yi8c|yvO<=1LA78dsJw?c9x6vL5NY$h5E zF2IRw@kBXf3THor24akmo~|=Lo3p43AG5vWP+&l}a1|sfgYD2~t+$&bLBB0BwP~0* zhJhM~er7m=Q>enQQZ~2F`PM`>*oan6?PC$2Ox0ekkx_=Bfx(gP@O;0Qe-wNv(^?*h zr#lfBZ4ol7p7;zMy$#lan^}fcxjts=4a9U<#!MYYHD{C^GHl|gvAD%;Z&{!rnr73j z*g2Q;MA7|N5BDz1QX(H7dR>7wqB<*(L7(;$;hEkV)Eb5c+4y^@T^=OoOh&_#k9umj za19it;c)I{t?L)4*FZ-?Do`V2LME?4{S9AbfbD+c9eXzSqtsb7jo2`#`ZU<7ix8IuS%N~* zV3?G=a7&2nA}d#v&BJDZQJ{&6Wi~}>W+at@GEE~}e+Ow_EyM^N47KRa38(4dFhT?q z_je{Tl%#72JX-G3nbcsIyS)fQOA zsmNIpq0g@aoMoBojNDh+N|TF#*GR%o=ua4e53*m=L7Jh1avUz@Z3v?G4?9CPg;6nn8c!_`o~oy>P>Q#|FC=x7#>G1`ml`#)_7`{a&J@0>Kg5=7nvI zx>0=(tpNemeUaF|iZhusqTib7OtGqIhu812qtF%wTIk64FIc&r$3TcIU$hc-Tw?Nm zcGJ&$oIvNPel$=tl~tG?H}aDK&inTGg9!zs(t?m?^5UG9&j!NhYX}~PQW$q;rWmg~ zQP|B!-h0-EJ!T0cUp9uXX6!fJ39n-D9IRQT6LjGU;yM2ZxzcnQzZ>e-D}>q^JR*q; z*EzOPyJxY(T15P413>eILmY|L#F_t(&o`7YH|lzCSfN}|#ZOSId%Vr-yW&!oml&vH zKb)736Pv>d0yz=tOFgiZk7^V!FX@qRf(#I_%dg6IxabYqjhLke z_*?C!Z~wS@d)JIK2RGRH%uKC#6&y&;=PQU@MJF1hwrLL zLZbLjWP6Tpo?zWClGSNfg!pA5IUD{z&3PCnQ0u+RlN(paob;oe zUc4=^xXO*n1Mb@Iu!S&?&wT%a1Xmt;ZUWRT$+OgQIlNl3xC7dt!rTK|4~mlbKX3~j z{iPGFzZm)8#iMGpM}G*d20ce5S~dDXs#147)z)#)k5)L&DL+C!2*Xr`S%@U<5k zrJr{WmAl>8C^<#;xnlxgsc}|@V1r?K^kEhmp@aP?f%x9E6Ju@x;3C z3%oCMz%#osd3>{9B&BQ@Z&q)(6)Sa6DC;zg9tBo5VbA)H`G)22ki5U}g~+@Tln~)w z`pE+OX=Fe@$?+qqkUXEu$JgK~*LbPUTe9u2#otGij>L(ASox+&H@I=T^`ACTe;-e# z@$(l202hD_Li8$U6gYXzh4R0iIrSJshCfNy#VOyupa|G2sJ#!FPh>a+xFvvl{wfApt^&!w_~r zk4GleY9o1Bwz{Hfey*~rnDhFV<&+Lp?-O;y+29Y<`RmZb|SjhHr1&5!{7m zj%Z)dFdbx*@Fqk?Kl6bj`7*_D2?)x`ikJPOZoiTkru3#2WZ9@82(3q+knEKLq=LnO zUKm_wi0xg5oT5?*s)*N~SFm5}v}yA8?N?z3w6>AA0TekYO*$V*dhy`22cur?%U4NH zQ_U?K*I~v7E@@~%l%VH#te46tME7{d`iD-8KlI^7!uc;Fa7fg*H~~j3%X+| zo~LSdXZebOGv5|Oj5Bi<@@{PxCU!fTw0J*y7(#8bIolFpv*=cgC z(w1~UMRyVSKB4-c>e_=Fc=rus6;vb9v zW>D^$+=J?)YGhP5~xZ2ss0^NAMZsbJA7 zJHaGJzI|Fezqp3d)r+h;x$vMWerKYS(Ty$Sc#P`x8=i;}wx8PDhB6Gr`v}Q|u9p{t z8|JLeeA4o=$Meog@qXDa6Lz2Mm^E^H9d?(DGGiWzGUJU9^)dhmT#|w)M_o+PZEuGQ zG#hI)dU%ws`z^v;{tBs+C)58C)8Md>NZ*iBPRU9A#L>J7k@q$9fvKEah`5v;=VZ=q zUuNUx!Q0ndRf>hCl`bHI1_9epZ8(+Gb248tQ z%m2<2k6a!jcoP`@!X{@w!VyL2`)59jjABkea(5AG$^)a|94>Osq7N&zSIH6fr~gm+ z2=du9a>U@`9l}T2>j#KO5Q2GdcJDuFxYaIJXe7rgtPF;aV&bO-$j{uzEdkO_(86v5!7x3;fTfbc1w_czuW)EkcFrS-GlDCGMN zw(s8U0racL7T6cYpT1F3VLvjft7neZTrh(#cKtiq`@dqw)%d%_PhpZVW4e19RmR30S zupG!$;XwbMO<%6eqnHM*He3t#(QveM=oTh%k;0MzY_qf|jRO-zXQ*~>is`7bPlx#e zftI}2y9ZzKI!IloJ`AVPb&ndY*J7_|7~z#9pKBFj?DP_5O1>RA%zI?zf`9;Ra@B;*6_mq@VLO&Fl?&{@Az z9pa<~9hy)ng4Q_#PmK*R=&*j|AK*yanJQQ93pZm4Xhzb>9Z{)L!?V_4-`Z2kb$7Zy zBohH$rTD$`!MnUD_uMv9*h&cw^6ao=0hU=__-^K%heNq%v3uFb{o07?+Cm|Bmc3a} z5`tcN!iVdL_g;;rpnIBot9ztwrTt)GtWHYR>!o=^fi>IPkwL+=&0IZ|WIB#0y~tPi zfZ3n0N24k|lgVe1aiF{VPlgkT`mv@an-1W^lQd*jK<6N9k|?=ZpDY2Fn3jnTq!fBr zE~GUr%mCJw7U~>fZp#fz)=fbENw<@P7=wBn)hk07jS65B$7iSwg&h#5EIl%oYp_-3 zfY(aRJ}i zXHQKnn1qN2jFz!WL3gd~ud+;^u|)W?Q=_}52bVU;g_RoP!`vCVYOeJK<(!<@yY_JV zn^#ih8%93&-I|NN-P^%HlnXxTM_n`l6;cpriXn{Bfy5nwAsy$s^oGwj`-9vAGf7r2Aydd%xvj!wRsqIO31~VRXuwC?Ps|gp z3ZysOJ6vkc1%0I~A}UsYnWu>w32q}B$th+jQxRfU3XUoOSuxbitxj|Jb!ULNt0nd{bXE~Ejrkjo?t+kLR&Fhu*9~g?kmk8$O7qN z3-Y4GEtct;1D`{%HA)T}0?x%*$HH04D7y1GWiTQXEBqgltvIT z3VkFvH%%YQ1rMe^*&VF>>QwFPP+2xddBz?v_6BWlubt6^HoJ;`! zr_ov${RaKAKB33AjLXhiV3b2v`fO>F@5VvJ$Z2srXoEqCJ4cII+A9b*UZzKjTuB(o zAtA@M0XURrl=#bi0j%n3G`aMSz?Uw+f=|LMQs#uee0tp3CleM)T^R?l%@_1$>?Azo zw`tkiHDjZen7KqCtbyn$x)z+mvo#^JQwQ!`M8CLV$G9}p{K#bKQ}SUa_>rVRU56wR z37!N~MPvL(mZ~xp0v4)6TBR8^s{zvb6#t0-F69+*OL0WZ0we@6Z+PnZi>zS(}L z>&uy?)X1wS*5j4M<_N~)0xxL{8Wt79sv3&TQz9BAGVIb?CCCG+f-WiS$>|U%p>_V! zAXZ#7m(OvOSw0g}X)VhzY7h-KXP}(#@Nu=^L1eHq7h`1S@bB#dTQ`{FL-*~2k+RWD zv)usR7Z;~i;MI2NFuUHVmuT{$XKmDJL@0nd#RIrH3{Du$nmvgWKiWW!f8UazM2=_nhvc&fIRfPlcz9vy4{akdqdIm&^Y0Pfsp#>Sa|-*xfW5*5 z-LYN;DVcE7IfGgDhhX>{f!Oy<8923xM7pAIE@d)U={CFc6?qnXnXPU%{){J+!24mc=UX{#cKD2#8Uxlt> zm_UH0C1To(+OLYm00NiTTl|>ABE3O>C%dLfnXal+L$+BJqHJmW6xxFD-(ja@vCO*h zZ-=G{F51(%-pBA#WXY&ik}`W<^0+3_udsGGis`=;quDEuqCP9*!79DKt1&K<7nVg= zZ97`#-5Yh3>>F!VU_ans|0_Be z_tk^&Pc=k?lxu}F1WW!uVNIq9SQIqUf8AP&3mgJM-@aKUq_W_Hv!|kzf?=ilTZ7>P zRiV=`V5l%);G_(&#v;QqY#`RjA@hNfwu7Ek%q0XdtzV4;wrDiizvxeRB z%0>m$-(0ud%y9}3gDsHzb*uGo<9o~WA3eei@2=a7|KX$Xl|T5mSS^5Egv1;guhNY^ z!_M}je``YWHZsq^kkjYy*`=(N-XEyt&f*iPln$Xq{Ff`viZA_&bJBQM4Kt zx3Y?11c=Z8oUv*KEwJ<1y`w#$syYgVeF$IUifs-G(2nDZmE><70=33Sj7r$a60HjZ!t)>*XK=9tIKZLWkk}3kb)<+{PjfEmMte;0$C-PF=Wp)T z6+NSDy_N>nx(&JRc4IbqP7^$McT@4gULkF~C(V^)P9J)If$MWBjE5|X^DI{gOR^(( zs=tAei#GFR`g(SZhBp8Qpe&aKZz+Q6l(RmR_|r~m`j;vCi5P59eF3X->s)8XF5}{D z7RxROsxE#gNnIL@8DfCdz!t?IL9+z`3%70!L@8p&SB38&tx^5Nnsn-eAC5kpp)oBA zI4}w3J!`{FBJiw()b`XtxPsgNbZ!3){n6QHomkjknf{u}G*G&S4Yp&IFjE8{XQh7I5$B<(?T zljgDxL6MYXt*##NSsU!UIBk-SiV`4(e3N3+;1%Iv}@Xtr*Ty(Cfys~{p? zs0BY`kCnxyZ2=6}YKxnz2HSj!WY?DUOi2A1^`I5(@UUT-JF9+4K&cL9N936VJv(y^ zgwL$_LEE%}I~~iKb}?k|=Td2JRbMoXoep?IXE_Z(O|2hk&gfo|;U~js1#JXoF
hW>9ovw7gJmxa=Q8npWd)`;hkhC&Y2i2*!)o;}n+tV{ zL2R(-r1h-?%V6%$On`GCLK)!huiUdo7D_hptujZ{+3jOP>st*xJ41;1P;-qph^R46 z{s1p@zz{Qen}3@*n;SS+t;vbeP;x@W>dKUF!{tg`CgGYzo?D2y&gr3pfyAqfya;~m z4j2(^?E|Wzw?+#5`2$O4HaEEvB_AI#^Bd@MhP zL2q3Ys6WQJUVnojKLiObQBo2<{Zd|BE@*B(*#@W^);d>Kwc8^9Q!4DGJ*%W18SWpf z8~i1ewv`Qo4u~1SP#+0VgyT2&9PT(*G!g}?$FgUS zO#vt!XdtO)-pi*PUUiQZohXc&Aw;XGAbA=cKgQ(dic=PeQ# z@C(_iU#Mt)vGCVHccFR9|AzCjN6?YK&+BNFyfDzH!gjNjxJ;o2vFBE zRoTIy{rtrDbL`tycn#`wX>Fki-?P7%IzOCPg5_s1O20#Xr4HN(6;YEhSWKhjcn>6; z=Nn|Qb~-bn@*Awye|A@pr{#3(2ln(Jdf4}UUzrD9bMk@7HBFmjoXgruJ0zdx?`|eO zo!*|Zx~0tQd=k3Z2^lf6UqXtChJzMy)h;9LfS z8*^T;6$<(aP2=B$#Ubq@Sj{@NtZbDZ(hv#(IJ3x+ul?|8)~1Oy8sna{R4)sj8bkCy z-AcO$vsIt*t|l!(CVVgClBPhSu8$4rJuc7OkSI@D8a{&cDN|^6r^S*pz>dV~LW9%@ z{=;OOOGuXvi;*s4r}(X*ITT)MPZ}bQm6ebkCDgMtp_!Ob9w#6%bqCtYBi!D8_Iob^Ctq#@poMH&#O$~FTEJQ!S7G+d3dsZ-3&n^ZI`siX)T$W<5 z0&fGH%$cl{T7;8A{3TX85B_N#xgzog|3S;>!~*B)5L#9kiqxYvpnfY{xUR*K-Qgq- zO3}t<>I;ER$-4TErr;n$eSc^z=MpVzxkHV7;ecpw7r>nkSPN=Ra|3n;J^G zPp->ZO)IJXmnVgesIN#gJ&TftFSHR-T9C@kc^*}KE-Y2&WIB&ZpHrW9g`}B&Hi*f= z*}(6?VfmvKToAejxLSZ(;dBU@2+npiMO<-RV>jh<>wwFa{39x-9|s13FE0RrKNvq3 zSyM%6tS==yJz22^mt^TtHzPqP&`@BA!%>f`l`vud#CeZKoVn8;xHw-zmMN67%-Ocm zr;EN?ugyHp#c(~olL>3Gtad<@Fw^Gk~9Kx;hFmop$)AMB)nJ$ zmWb<5T6_s3+A@3IN=_sRXDyUUi}YOnL>Poo4O{}W168^7NY?{$cdjX~^l7((;S_pu zt)xh`BX$T~D?>(g593##9SNq-+|zj#ZV(zh+Fe9WEO(OVD~Ad&W_*_=Y|6a@M%!D~ zA-Lt#v1|*#MeL=zHJ>AA!uK8Pga2rQD6IMm1|*KakH5lWLoZvFwjI1W13lB)(#8K| zi;d3k6)Q{NTIk)3Fk>>zgq5{p~AMwV0ZDk6LgbA3)hDE|~H7RpE#_8l3g| zJK{^kBP`SX#F@%&>okB!evy&?S@>|cA&3lK?BC>&)7@^<*6^d{41>OOPVkF(7h;wr zFjkGIuI2U?QFEv`%UHtSpi6sn8DMwd`6?)u%jXnROQLLaj>vTXT}w6M>8D^R@tZc^ zX*h-|0nv~+^r!KG2^dUpCr*s{+UnZa-R8E6kgW@YAqj}KNEvjk_3GcOVevVE=Tq8l zAR+|Cm`+_`QRoEK`P9zdcJm`O95s{_$f8n@)K0uBL)C=F<7{AdV22Hmtv&$RgnOw` zg#XC6Q1PL5E~;N+B@}5#5)ruNOt6o{n2*Xg78k$XFs<&P@4(DNX1-Q&G2(~KzNviH zNK(eW9IAJY+6g@~i|j$Thz%v=I}hT9J#X5;jS(VtAe@i;nQ=C2>uxi*pl)ZU-xJj1QQyH$A$wWlzgS^irvRAIlg%rRdb`vkK&E#1%qZ`S{ z`FfX%x_?;+%1G{0lFed_!arOAhfTaNp2?fl$$C6c6Pnk$2~GpgrUi=0?ztdEG>_CM zba_^tESwqGjlUvD>}OefDvd7NN}7f=B^jm}G;@ZAJjdyi8CCDNqr+V|Ath=3qFP9U zQVk0Vp=rb8fn-=~>m_OAk+3mbA$CjN_!Hn8LsJU38=jXdGJz3(G(qP8E$grV>n^y- zOFQxR@z4=y(|lT4iFAwDsOtcGS<~0C@a17sHHLjA4(WQOPv=WlHHPDr?hM`BF#bIc z>dXTS$r+ghi*XtS|9X^_surTRkm}Ac=_ve;TNc^kcI2zY#m%Mqyaiq`d-57`KqjtlA1OCf z46_*U7Edr+)B=;V*opH_(==_3#KoP65p{gvil!wU8v-d1rSPCp(x$6FIFni1GZ9N1 zd%g}fTTpC&i4+bPrQLP4DPB$nflIDj4k4Dbscii~Gd&K4w^T4_^V=$e^|l9t!^yYj z7^ZT8*V8p(K~TZzb51?ra_J;8Ih$UMnH`k6+-T zT}+zWb}^8{jW)DLk>q2~*$Dd9!~X94XXmrV2AeB^j|mLqhDVgj?C%Q>3ZR?(4HRVZ z=&KH4$G&X=)5z?tnDWkgDb^olljg=4DophTP0mEsS+Z-ZQ0zm6R7hxXI<69Dt0+n+ zMCTr1!|K5J<{4UC6g97rmScEnrvNU-a#o=k(|xj6;_%G^J^^o!l}1BsH2?Ht=~ zVnmlDQbQZJzTe2YzVtG1lzsbyE~cqo(;%w*?=OIG6dzv-&CVHHnnqD^3@$$X4w@7G zL0pNKRM+Nq9UcTPQkN2=?%4O=o!g<>Z`Aiaq(UsiVF%=BLyoOYQyV{b;hfwYcqF_y zBwU}q6}+xt0H{DSlKeWDsAa99LIQM`mY;3p?9i^X#d)?7R^5&VuCU$l=@0^<@t0#H z^AM1FgaTcqf`aEWCpDWVCq)-A#xf)fW84%erNY=b(yT^L@2{W`Vn^qX_%;{&3Ri-6 zUt&ZwT{&$B>chsj;FV^t56XgVe#r13MVpQ?lT8BPP+r}_ zV1R{`>#p?ECtpr>jEx;y@y53+dB+d7GrRX$A5Hcz4%_o`nV-_Jkf3BoReWU~j{}?^ zBkCJ^35>@AO9+N`(d0j1{S#=MH-dfT*^g0j)GwX}4$6-wPn8(c)U;c=n(EB?mdSMz z2IYD6T_Ho}yDJrFuR`A&lX~Mo;boKvE5!06cK<0>bAOE@44|v??VhJI< zRlw(_wwDkLlVMysH4qHa37y`{W&s5Bqqq+|YA54|s3ZSy#za5i01{=fEgcCu2Ep!s z^$^xgF>*O1)c6lSHqu;WQ%9GpnId__(zACgPS{j4 zUv|8Br!im~L`I?G!XrJl6a2Y4e4n!#;!j#uXl1gT37K^gB5udmv$QU-rU4VG`i(?# zi~5M!exs}gP`tCsZ_?AG47*mQl^4B}_oHF(5ObHA|`U-WS5)aBrY zCX(bo6jLs<6sf-}@Wm=lT9gQ+i!a8~8A-S`%cV@HDYWb7SoTk!2U_}L#6ZL>{`@H^5|!eUm6>PJdsp zeka-LabQ?`To5}p{xsu3AVpoj-xE8{HMnc;p$&&j_hlqq$p7sLmwn7G342lw!MmK6 zIVqL=NP>9m;Bm6rs?E=k3%?j~XZiWf{L$G!|Ll>=212v0tjT^y-}QGSppWgRYG`OP zQF*kS1zT1DcS_T301#s>!QY#WPHW>)*M=w|{Do)3Ak4-tUiC615F&A6IgasD9+$zQ zIeT8^ZofnGZlvX&P}pB{Njr;nM4L7lIe*a9{UL1`{Iiqxc5g@Cj`#X!9RYGgRd7q% z1Cuv*COz}zi<)mmq>rW`l>QynI%E5C@}Kc{88>gnYX7FLHvsh{&f|>vm`nU~A{lui z>}9#ffznQKbu=bCo~lcJD)BttudiL=kCOe6-&@nGmy zh_n8m2I1=IlZ!k92yW48l}ub z)kX6n|51B%%K;gebbc`wEAz(~*GWt-TyM>pwu0*YzXMG5_h-=rm(7|=Clb@a-|3gV zRQ;e-h|e-UOV0E@)o19Q_g-=4``5xO4{zqQNX2#SEC>#ssSC0)U}g>9Ga3VG%)dWt z7bB8p#tb1E2|&_|JhBd1WERax%289 z>UxB~KB;}|s+;jn9z@vI{D``ya@dAJnY>SK5hA&SrYHh&Zb!qh8oCq(F>z_Bf9nqZC3VRlnQab=9usY*+>Y(#|>ZH1!7W{%F}nr z2iQu%V`BZBF<;DCJU&?2g&}qLDVa%O4xIAFI$A2BqE&562qw?>eegvzi5j?)iA$Zs9zlu@rs(})KRzZcBfHU0CBQbl~v>KT)YP_$Ic zmh6=basTnl(-E0V-Ah6G56b8zKichAG1QZXz}~C}TG(jX)?Zh}3w3|z?~{E0$$y3M zy~Q^wuRKb^FOQy-t5g3m8;9ge;?m*gd#LIJ1X#&us%uIvQ-A#&R{R$)R<)>lT@~|f zx9#nu;}}u1Cz+$7x1hof2j{nMfrB--;S?$#0||_SFb({ftpuOgO69eVwlK8NgDQ?=cU9Zkq@*oUdLm&& zDbm@-kO!5A!)@X>11|N}6@27HiLR zg0qDRi~o zE!R#P*-9CCEb8TQ<#!kEv`}%J{VPJsc5Ji@_{`v`c>D%w}8ZB;$@-Uu> z9r5)NAtH}*!V6UKYmR&VW_XiV)L>otx*nZO)RU9xFJH%vHX0bP>RnyqA$3H8$=p5{omZNn|$Crw`xX@euxW>%RMER*C=bDHRkSjS}C}f@I~Fc zJZ^)jW#{9SpZq@nWUNhCr>IS-do$uZ-)kd``No}GBZ}Wpcn(9V%Qq)>6$N>X)gYmGY;eS#3>!Nl5%OM_4laJ}vy0&~=^6yMj39{rq>XA!Km(V4qO!7Ej z+T%PxZ@6WC=5C13OiFqjQg%UVxX?FK?t=cAxC;hns$DRQZ%1Zk?ShQV0lOe4bKou* z-AdE3)Gt5<^|yrRI*I0A4*h8+X|RmudNR>iNwieKIPk#)Sbq^kcYcKKe9cYNr7+$3 zVY=m$SZ>puOLe%GBXcL@Y>SW(qaXTp*QQm$?i%G&;ugE{Wa^eXj>+s#(`(PvdT>BM z_t4v_6(KH0FCh&qpN7315YoRrAx#|;@{D}8gT{lmw`;tnqsIJAn%($9Vu@sd&Du{3 zrS!_|fN>$n-+v0ux!EC@@-VfHg=9#j8B5*sATa3fdSd$7^yXZ8cLBXU58QA*c;G@k zVjA`81|@$j_v`uhi_E{DJb-7@=)a+|0iw)+$%;r?+674k-5}{wBIz=Ea|OM-n%-VX zBwR%#UHjumnj?yBk~Y{IY1E@IqdX}#8DTffD#;;Q=6_^{VBStB%?d$z3oPFQJ^@cc zO-=~vLU2Z_RHW$kH;_o*NadSo(Qb|s-BA%zM#<;o^Ln*L$=`}uL})w=lP}2MY0-VL zL(v`GUSe+PP-0$^FWZg3=U;-StCxunL36&se8&K>8Ai(!2JC>fEpW~fn&TE2?NR+5 z>jpU14S#g33&DnbhsUuWVzz>3gTSqa-{|OVg2&MUm$kq(TR|a9qqRVpv@ZZQ)8gDo zgl(Y(x{FlU-7p&NfjqdEw(?zYA}Nx2uuT&`*&;B)7q6U1+ZT1I(B9HsIa6=xSU5?( zB3~s=ny^UzUcN??=B4ZfF^8a+0T&wb42J9qtyo*|gpok=X3ADf|q_b+^F$lopa27m461@*Lk;LBtPf@R|(Vl_d zz_aio?1y*YIlY!A(+U+qs(c%MO{==sE`K?x{b}-#@*NV!8(^kUW+P#&Ic>l|t2~;@yWzzUynn*7 zaR3~+{ZaTsxkv4VH-I?x_HKB;RsOC0|2sGaULw=__MDx72jN%)Nn7wotE2#!@^h&kw@I^P?4#nWJwUi;BN#34*>=*SU+#df zTj1YJnTn$94eIYr+LdpSiu_}g-G556DRV+!`5BpGlz+2Ti+&m ziK->o+u|oKp;D9`NR~f^GWd-4(&umnd;x3W%ZQv$gOSig(rr+yGA*kP zYCBPWVN3U|k(ItRveLIkR{BAQ8IS)(B!5G*`ZsawKg6f+h{xX( z4-djDI0U8e15^`(8c@I*lu2bH+o8PsPLF8gacZESpuUQ>VLlDM(E4M;bdK6qkjk3dic2w4#EWYVXJ1zBkTg00I`?|@#N*EU@{EGUN8|;VG6oo zIf-r!_JKz13+G}#xPabWiUT!6X3^@VK)n2q{FbKNNKOftV#!$KZ~*}&;} z-+}m+mKpi?2W+i+i0&C+&awGeEKkU4%gaHnyo?{f%v_9c+6kH^A7nkTiPSGH-9BLQ zqj+k0=D@7ocv>r)G&I7Y;KX6z!r_pHBVYuMgj^~ghZ&HMnJ^i%iDfwvlaU6AO4yU1 z6H(CxN-BnhE`OMcCuwn?0&z;QxNA1BO1D}P8|?ZHTY>ijb(j&80Z!(J<_SQ5;)K&u z=_&>U|74Rbd4<$NEJNcg#wN^{?0aBnX7(ajf2j{v4UP6a6yhi59HO3}Mp} zzCA#ozQYPsa>tDEsC&p+)MZ7L%B4q@hH&+hxJHgCrGMvVx??oQBO-=0$B1}sAh+-dtxz^-&z%*@24#>hFLlYOV)ahmpj_f6ZQ3_zC1VL)GB^%G zHUW_S!+%OFR6_D~humZBvxV%5oZvh}&$~Zu1avzKXYYgGpcl`qH>5?8y(yWS?~- zBtMFml(QDvjh8X>XK$bGN-}d8H!)rc;g$I+Ykv=3#oDFU4!mwB-nU_4EvC=mNXk#hEYDAT+LKV8pG1E{B9%8iZ`a;51aEt! z9j&+dR+#UJ&y*qIp^@%^RK1;vKPgwRAr`m( zP?WVtj3yx?5!w&UEQ`(guIM#)g~V|(FHW)~B~94^3uIorJKop=(78BJ*F-4OS#0dDrSa6(bmJSW>P$Hj6U)WOV4*ekq1IA@RWQB^&w;g?U50Std> zljQ6bE3Mi!RGa3#AJRQZ_C6k@Yb(39^dz}WcRaPIrxxy*P2l##9)KhwZsaC{4Ef1h z;W&59MsT`gwz3ET$%9EfpMjv&MG8O4>qSJmQ{26>_lh8?`(#htei+>%R)@q{w6bye zy*#}<$=RNiz2aPYo$5*Pq=v+Xd^dj?4jqj2xVL+fX;^|yy|VX+%eZrwCs~(lBh#CW zOz(Y|Z&)pi?Ik%Ovc~z!x>wut`&gwu`^dwTrK-#UP=4yVJ#R|`Cdp>Tf*^|_u5 z+}VV!&V}K49vQXsVIG-+Q}7Z3vX{c;cp2P;m&2WS1>A>M!VbKO6v@@_3|<5K@j7?| zuZMT=2KWSTgn!~q@EzWa0&hVF-hocsj0t!ry74X?jCW%u-b0Y@KFq@ha0>nsXW}+2 z#b4o462%I92>rMnoAF^hmz00O#TddXa5vtBE!1)kK7xDc3ID$8wZsi3EI6^um`!e|%Y_<14f?UlkMZ_hJFQCYItKLPOIesVCJA3|28BO_^et>MM#=nwYI}#T+$G6svqO zPt6v!YMH20UJ+1diw1wSL7btk6X&R##kp#;I8WUzHmDt9qk2Nzub!dnesPQXt+-Xa zByLl0ip}az;x6@faku)4-hV^aZ^b?8J8`c%B(^$0-0yJE)k)Vx@c`R;;Ud`h3G`D5 z@>B9~Zh{(>sFHLv&a0Bi!n@!;SgKN}6bCzCzUoCK6Ix)lhA)5d@CIawFQ}9Nm&0oL zUzJMm@f5gEx#1*;Az(E~^(Me$5|rwr`cNsJ1{lI3Gb=_Y9J(FU)-xHh?VJ(ss^dSkR)>R3ocw|riwa-8CA;ZV7X zDJ{o~)M(<1OFo37)EH_JCwF7IVkBkCeVC@kF@5p?_Emq!sXU_jpYV5eJe3kv8tl_N zO;XoEu|*XOSFfo!$R-pvR{dJTP6hMS{c1eX=Rl|YN=;yhslFpVaBy2PHVdOVM~X;L z`HbouDQY71XL&>mY5lB~oD^P3`8mNO`84Me&pf#Z$u+t7)_@ z1aZZB7`sZ0T!_Prz}c0+s|~Rngf3ok2yzYBY(Uu*{DC020V~MgIt=s41q)ZT-rKJX z+-ATFi0p|RCI`;haWw#P*$$Jt=xYBS32Pg;hL;_d0Uv+a5N>`UKN^@8e;CF?a_8-= z0V0ja=RZu&Ko^amO%s~i0WeBav)UA|&H_QeEsQrAOST zbSrGFJw6GT21EGQKWt*kY+@L_WQ0*`{{b!H%65MapV$M*VsB(9Y7rSAMa{6IS}AI# zj*AcB-*mM`FoHBfKWcw(=0F1A{l{3*=_G5;*{Vfco4uXTPJH$bSi4hPe=j6Nz49nV z`VNnyJU`}X4`KgQkArah%`M{Akl6C1xR?Ad;?aHi&K+W##~Bh2Jt?;5$L~w#L-P-9Ad-6>Vhq>cu2#>iNJ=r0#cZtXKlz4n2BzasmzV5GbSIC?OL3?460dHC zDV_v(Ji%*s@;r}=E9?=!7le{uXH<9ql6QZIH$&pRkoa?6%2qHvhNo9Ze3F;Kow!pL zxl_n*Q+X-WknT1l5k9{`59p5H0)46Lq+_iCX)NpYU$??B`KdC`P5)=taUYx4o9gt| zb=+LXle#b46Z6dWHZvhQ)g5rI%u949a?|0N{K zuBxX#GuxdwPQPUiXmU2gm&up`AAgdK2z9z6JtJ=W#a2km?<4d2y8DJ-_SG-@@=L2mS$wlE-$Rc*o_&NtJ|qO$OenS)SL^FGF<;b>1lNc5?6|^ z@OE)2UtucVCT^#Cw~H(IO3&`%tA&VhA?-0Bq!BBggaq*vq>87(Bc6f&;yc%nA@)PA zH~{0sb1+dn4^zc&VTO1Cib*dn5wF0h;#H^-zlSyA4{(ln9WD}Y!bb5&xKq3X4~lom zkC&pE0VxD7Vb1ZF&zS)v5Tj?8(6ei(d?P*EC=TK6q?ZGl0Wg2L(k-URK4PZqD`v}n zV!j+GmdZh*g03rNny8`cYPvs%t{2k%C31+kQVtbY%VFYrIb7T>N3s^e(_k3{dmBh`8N1Kl@oml;%Y`-YAFW`#l3%FJxwJ$e@Ug^T4sU}`ZChk zlBDxCJ6JeT)M%{hh=gb@nocH~EJ{uxNJ8qhhd1u9i3OCw==l{W1S+hwBmI#?lH!OMU$1v zWF>a9DGy^DQI~*+_-a0N2r2wCdA5zOq<-0Ar)C|1_=u6&mYqfBr8NVl(?Bwlv{n}3 z>6|D_pBl0Bsd{IjF0s6dFsMiX8%@#frY4z-tL z(*W5VWzX5p!MM5E2VhcWdCAk^n_+f!1`FI^u166tqA~{@vpG`#%vNyaJ93`!IQC_4 zrwNXRlVLgV>9IR1 zK!JapOfKe$ut-jUrE(gqkkcc_KYG!IX4gu9hc@649b+#b_mZRS9JpQ?Vbe$DdIDLP$*f5k6v2qse=_2w6XOpithwxi5^pJ`*R zzft+(Y>y&D2!}0jDDw=rp#jJc8rW@&V;Yh?4!2?5hQzlU3_<|!l9{(sH8Gs3*&ylJ zLQdGMqNeu%pGA2--*T_NkDo^TjcwG)HO+V34?6tux08j)OJ& zB#DD)dRSHHYzK2SEL=OS!(m)fl`z2;uBDc0B){$itrrYcWx#P5K4S7QX$JW*d%+#P z6!eD_*x*C-PJV=gTaTge(JbT`StOBToia?);dJ(1tZYfE9?=;cSr;WwNfCeAlcHP^ znqR^c1mvHyw9h}8G*!-TwX`193?JSkP14H>=p%>r)o$_qHhIDTUgXO&2ZY2A8(}>; zP=^PM2}!{T4yey0$G|gSOi2#=2Z~(+WxE6nB zEZGW!-7#u2_uD)2$RugD%KCr!S+m+k^v{KBVJm^c>tU0=-UfH;tCd?lon0Z>NSm;U zHeir8U^DcWs~}CThLLhD94ptsGi6VGzo*!T z7{-8Wh2YaFDq;Q(J^Q zhs=v{$G9C^V1P%tW5$0loZk;FkD&wQ8)9fVJ|dl&NRDN!6-LMHIawHzuI=1Ghr|h>862s-en;t0!sS*2C#+XI8@7@GedIUGgX14SR{Czk3ry=EE?tfW&Me ziB~C!RvF9@i=a#_hDvb~tQ6(YAeO>tW2;Zrr*iM*3s)l3NvE(zNgmxUirgA}z&M`I*pT!cfYcrMb5bz|^jy@wl#gnohDr~Xr<>{3Z zk;>E^GH4x@a(mqN#_@1T&uU$MZ%?YHcSxQ^3Q;E;9YwVt-bv#>;qY%h2PW^0j6h22o4Pne{Td-7j(HVK;|;r)MH zouker0h|o)s`J$OB*t^$MRfs{3}}XXs ziyPn~bupC^;Z`_DT|yKj5g0r}KBq1vJ=G6UZxB8$H&~}fK$lpcG3q=M(WEXTnyi+W z6J%u34zg$)TC~eJPW*r^*d*1k!jOOS3|UJ5BZzbu>Y&%r-b*P3fwgspTxsA4Lyk4% zcw62FABMpoBMq%BAo%kw8=wd6vw3G_>63Tu4QX}6knWM!aDIF~m#!nh(uY~JV4c7v z`wU)eHXmat-XpIU^d>F(R6=Y>-b6L!EeM%>bKBO#`?O8IxmCXONhlFZ1}A@xY^(|C zBAyIQ0x7;km?@HAkw_*vOQEfn3bn!wjiL|9S{$4y`bADc&4es139;nrOjlQ_t7(M? zk;Gi1uGKj5tcaO9D`KY3(kU)JpS7CS5N%b&j;__mFCu+h$4W)la@e+c48$BJkEBNJx4T8&+rFRqQT-&TTgYYrIMuDRsjPmE*KYv&w8(!49>K5oO6uSd z_;Rm&gs)$-)L?6n0!pac`BYv2O5MgosoT{ZdN6^fs?BN(mDfPLx{L7c1L~LRLA9N* zQ%K*ps6A@0zJE;LKcV)~Kdba~r1a}Z={I)i0rgw;qHg!Heg7);YxVdC^`>2VOTDAs z)ox=fA>bPI-V_g>s;5T=cpF}ie3E1vtWbZ7iIq~luRc_!7qTLy>JByL*#LnR~b^B|Yqitx8Ql|~M++q?07$#B?i&DqEY?D%PNuP@x-E%1RZpU{Zf( zaSx$vuv3t)Q&Eowws=VDz!neM3-_wnfJW9s8bWC9HgqeJNf~+~tBqKZoSwbN)?AcI zpWGHXEy!YWvOS3VaKD00DjvXQLTKTgaW?d@P?oJ;p46@5W{wp%4MHRoUPP+&Tww#t z4I!+cNkubSSmh<`CHPtN<1*q=!KZ&sMMN+W)BR#%n~Lp)iGd(?VwZy5Djvih!UJ=~ zJ)>Epwvavsm6_eaPS+S*Eum;M8tyJ>3&(0N;pmcJWei!7Zf$a+)69&Ud1E-PB^_v0 zGyeCfco+iNYzCnxw1|VJgVS!SoHWg3T95EBV;YemEvH9f`SI~|O2+*F4k~}>P|=A) zgvLea8Er~N&zPx6op30$DEm?rcnC*CS|4TUArI_F@ZqLBw%NL7$4# zV5BxJfC`z7hk4?7I-g7#c47}jjhv+!33hf{Xm0$?y}Os;sR0^))=oD12~LTHLD<_7 zXY&i52;wY!L1-9KkWeuUHfYnr3<~ANpVKZf^%IMsex|_o#i~#d`En#NsvxD}JjMt+ z@5V1&z%8>^vrJ5NbnVPZ~vkop~1YBrYkKP%(+82-UMmIJZZ&T(5q~k~MWe?0Bn+x8WHMgCVC^ zhvrCv3cQ^OPMwM#3gQIbsp4IDj^Udy4NFTIxkvShA`4nRp3K}WnyQyuH~!>{5T)V$GHHeauy%c%rMqbfsYhTcE>t| z5+76X6C#-9`h~of&MEjwPW?qrwv?ICV;lr6sR!|K{FH*9R`Cg3B^f0oc1 zDt&*rPxL@9skn~M5!4}%0bH$?V(v2Bz?6cUDsJJn(fPM}?ui!Nmzksh1wwl>w0ZekMGj?~%CNt70mSmU1&G%4&S=@AV z=qw3Nc9^<75^d&kkrn$oeo4VMRQxi2g$w8csGosx#*NGZ!r{<-yyrgX=`1jmxQJ3V%B>I~!UMmP5LwMWUi{j2hfSwa?q_&X87M zFE0;#vVYrAabYQ)qj_WOs5sk}#ZpN_v+`MgRyRKL&a|(@Uc2~2^|W5?`?;jF&b&wM zTa3PKF(7;IOyNF0_BzdBUEJ4rM{hneq-W#WP?~3|yUm1_?$fd<@$5|ct$!$%g@3Koz+`j0pn$c;9t1h9hc<#*#rQ*mXY%IQi zjm@Gb&?Wvv`NM}DO%m!)=GlM@8ZF(^x zO0S3>Gu=?kM5O%;M$2U|3cYK1v2b`oQLa0iHkY=C9ikNq;O@KYm6GFqn zZ2b9rio5Lr{<@{Lq~xP%kkJ}}rHs*H#uU-lO^4uz+WaDj8$gvC8wbn>%8 zIlJFzSxT?NM)6J4RmUHahHhM-3ZLZLnGEbm*38HopZMdPx6Hy*C9kGUZCJWBJlN@U z$+l(NO0>+YqbPHQ%q;X|Tw$t2rOISdmZc9nYr>6gE)crkv_uVylIG`sMj}l(S4s~j zyDL$HJ(pTOwG4TJd22G?&J+1;mKBH`$%`ILlu;X6OA*6P9!VKmTD}lmJ(o~IdS86+ z-i1W(i^us4*#G~xkNI%)Q^v4<$u853s_L|s85-6$xoy&>t%QLky+mE&@feJm`D{Wz zBAb=Q1-iF3VFLrI!!)gboR!tadvt5m9L`miQ(ury)8h*Dt9-Hy67HKeH)UKj$Mi_I zG>dm=Bbw--#H;v>_vstn7aPtdTfi~R80H3!yB>2aKi)q3{l|P8B_{7`(H6Pz-tg?z zPDXw##o1VeXV@!G@Fj`PsdSu9RFNj?)slmwMh!#HcBZvlPR}Vz#MR<~lDwqQ2;ts^ zNx4Ya#MsD}xiT(Ke~bXC#Xp*O{3l$a%J8TByau)I^PlnOIzGqaYVmI!`MUv){JS20 z-u>rH`4{|j0Y0Xez_0-se+8_)fx4#V8(9C6WdE1^y$o?tS_3J4Wy1e5xP^{n%4^p@dOoG51buw>a} zle?PL;NS4?a=ixs!J{%c`cEGD@L$f}|K{KC@TUT_8uH1H@8W+PM?USS5W0of6#9Ga z;4FvlTrX=>)6(2JFNL?<#)#DDHqvFYy>}1_Iyj7-9LPf+9Yd~;A-sX@BfWPgz)%d|@-d-07I5XwW%uW2zUjJ1bZLNNvWKb_Q%7+iMR{t1(I|Q3st1o*A zE=z(BPZI>_T63L$3Lm|UKE;;sg9?JI;hhPImw-~q4%PPuLpWA-!hkPnalT334E{L z1>eJT#NoR~+=~TleXq>wlx}+b>UTN&or*|wl#V&5a1(A;io7yU!bPdeNvcPwn^)|9 zp@-)l#z~~%8j-p+{_Sf5JEtA8Qi^$% zgZyQz##f~1{Wc3%^aj^48(hb1a2ylBItdy-?_N&5JPOFV@|dI0ZpT@(gYY$vt7g@e zs-U=pxIBC|jGCNoZVG=??6mEkx}wVdma~gaN{%s#+iP@+=g!bsdJ7H7R3}Q1P8>

<1q-K|KI07@5(CiBkmk!(k3x9nHcpKI6_{>|| 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≦w8_KS%7$<4ESXue&o7XY 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

%p} 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

|^arj(ACDNuO$vkUQL>z%( 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

GYFz^_`q@PcFxB;n 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

xN0u@f08FC*(S`CgkSDwM-8#q^Yuiw4+s|h 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"test") { diff --git a/worldedit-core/src/legacy/java/com/sk89q/worldedit/blocks/MobSpawnerBlock.java b/worldedit-core/src/legacy/java/com/sk89q/worldedit/blocks/MobSpawnerBlock.java index 82db080fe..d4084ccfd 100644 --- a/worldedit-core/src/legacy/java/com/sk89q/worldedit/blocks/MobSpawnerBlock.java +++ b/worldedit-core/src/legacy/java/com/sk89q/worldedit/blocks/MobSpawnerBlock.java @@ -40,7 +40,7 @@ import java.util.Map; * @deprecated WorldEdit does not handle interpreting NBT, * deprecated for removal without replacement */ -@Deprecated +@Deprecated(forRemoval = true) public class MobSpawnerBlock extends BaseBlock { private String mobType; diff --git a/worldedit-core/src/legacy/java/com/sk89q/worldedit/blocks/SignBlock.java b/worldedit-core/src/legacy/java/com/sk89q/worldedit/blocks/SignBlock.java index 184a673a6..3b54302fc 100644 --- a/worldedit-core/src/legacy/java/com/sk89q/worldedit/blocks/SignBlock.java +++ b/worldedit-core/src/legacy/java/com/sk89q/worldedit/blocks/SignBlock.java @@ -35,7 +35,7 @@ import java.util.Map; * @deprecated WorldEdit does not handle interpreting NBT, * deprecated for removal without replacement */ -@Deprecated +@Deprecated(forRemoval = true) public class SignBlock extends BaseBlock { private String[] text; diff --git a/worldedit-core/src/legacy/java/com/sk89q/worldedit/blocks/SkullBlock.java b/worldedit-core/src/legacy/java/com/sk89q/worldedit/blocks/SkullBlock.java index 88d0fe593..e5ea3da6f 100644 --- a/worldedit-core/src/legacy/java/com/sk89q/worldedit/blocks/SkullBlock.java +++ b/worldedit-core/src/legacy/java/com/sk89q/worldedit/blocks/SkullBlock.java @@ -35,7 +35,7 @@ import java.util.Map; * @deprecated WorldEdit does not handle interpreting NBT, * deprecated for removal without replacement */ -@Deprecated +@Deprecated(forRemoval = true) public class SkullBlock extends BaseBlock { private String owner = ""; // notchian diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/FAWEPlatformAdapterImpl.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/FAWEPlatformAdapterImpl.java index b1f09f1c4..9f9e175e7 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/FAWEPlatformAdapterImpl.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/FAWEPlatformAdapterImpl.java @@ -1,6 +1,6 @@ package com.fastasyncworldedit.core; -import com.fastasyncworldedit.core.beta.IChunkGet; +import com.fastasyncworldedit.core.queue.IChunkGet; public interface FAWEPlatformAdapterImpl { diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/Fawe.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/Fawe.java index 04a30772b..eff0ac4a4 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/Fawe.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/Fawe.java @@ -1,6 +1,6 @@ package com.fastasyncworldedit.core; -import com.fastasyncworldedit.core.beta.implementation.queue.QueueHandler; +import com.fastasyncworldedit.core.queue.implementation.QueueHandler; import com.fastasyncworldedit.core.configuration.Settings; import com.fastasyncworldedit.core.util.CachedTextureUtil; import com.fastasyncworldedit.core.util.CleanTextureUtil; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/FaweAPI.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/FaweAPI.java index cc9bdc76b..463f024f1 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/FaweAPI.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/FaweAPI.java @@ -1,15 +1,15 @@ package com.fastasyncworldedit.core; -import com.fastasyncworldedit.core.beta.IQueueChunk; -import com.fastasyncworldedit.core.beta.IQueueExtent; -import com.fastasyncworldedit.core.beta.implementation.lighting.Relighter; -import com.fastasyncworldedit.core.beta.implementation.queue.ParallelQueueExtent; +import com.fastasyncworldedit.core.queue.IQueueChunk; +import com.fastasyncworldedit.core.queue.IQueueExtent; +import com.fastasyncworldedit.core.extent.processor.lighting.Relighter; +import com.fastasyncworldedit.core.queue.implementation.ParallelQueueExtent; import com.fastasyncworldedit.core.configuration.Settings; -import com.fastasyncworldedit.core.object.RegionWrapper; -import com.fastasyncworldedit.core.object.RelightMode; -import com.fastasyncworldedit.core.object.changeset.DiskStorageHistory; -import com.fastasyncworldedit.core.object.changeset.SimpleChangeSetSummary; -import com.fastasyncworldedit.core.object.exception.FaweException; +import com.fastasyncworldedit.core.regions.RegionWrapper; +import com.fastasyncworldedit.core.extent.processor.lighting.RelightMode; +import com.fastasyncworldedit.core.history.DiskStorageHistory; +import com.fastasyncworldedit.core.history.changeset.SimpleChangeSetSummary; +import com.fastasyncworldedit.core.internal.exception.FaweException; import com.fastasyncworldedit.core.regions.FaweMaskManager; import com.fastasyncworldedit.core.util.EditSessionBuilder; import com.fastasyncworldedit.core.util.MainUtil; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/FaweCache.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/FaweCache.java index 507519dff..67089b862 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/FaweCache.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/FaweCache.java @@ -1,17 +1,17 @@ package com.fastasyncworldedit.core; -import com.fastasyncworldedit.core.beta.IChunkSet; -import com.fastasyncworldedit.core.beta.Trimable; -import com.fastasyncworldedit.core.beta.implementation.queue.Pool; -import com.fastasyncworldedit.core.beta.implementation.queue.QueuePool; +import com.fastasyncworldedit.core.queue.IChunkSet; +import com.fastasyncworldedit.core.queue.Trimable; +import com.fastasyncworldedit.core.queue.Pool; +import com.fastasyncworldedit.core.queue.implementation.QueuePool; import com.fastasyncworldedit.core.configuration.Caption; import com.fastasyncworldedit.core.configuration.Settings; -import com.fastasyncworldedit.core.object.collection.BitArray; -import com.fastasyncworldedit.core.object.collection.BitArrayUnstretched; -import com.fastasyncworldedit.core.object.collection.CleanableThreadLocal; -import com.fastasyncworldedit.core.object.exception.FaweBlockBagException; -import com.fastasyncworldedit.core.object.exception.FaweChunkLoadException; -import com.fastasyncworldedit.core.object.exception.FaweException; +import com.fastasyncworldedit.core.math.BitArray; +import com.fastasyncworldedit.core.math.BitArrayUnstretched; +import com.fastasyncworldedit.core.util.collection.CleanableThreadLocal; +import com.fastasyncworldedit.core.internal.exception.FaweBlockBagException; +import com.fastasyncworldedit.core.internal.exception.FaweChunkLoadException; +import com.fastasyncworldedit.core.internal.exception.FaweException; import com.fastasyncworldedit.core.util.MathMan; import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; @@ -31,8 +31,8 @@ import com.sk89q.jnbt.ShortTag; import com.sk89q.jnbt.StringTag; import com.sk89q.jnbt.Tag; import com.sk89q.worldedit.internal.util.LogManagerCompat; -import com.sk89q.worldedit.math.MutableBlockVector3; -import com.sk89q.worldedit.math.MutableVector3; +import com.fastasyncworldedit.core.math.MutableBlockVector3; +import com.fastasyncworldedit.core.math.MutableVector3; import com.sk89q.worldedit.world.block.BlockTypesCache; import org.apache.logging.log4j.Logger; import org.jetbrains.annotations.NotNull; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/IFawe.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/IFawe.java index b1f8d084c..345009367 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/IFawe.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/IFawe.java @@ -1,7 +1,7 @@ package com.fastasyncworldedit.core; -import com.fastasyncworldedit.core.beta.implementation.preloader.Preloader; -import com.fastasyncworldedit.core.beta.implementation.queue.QueueHandler; +import com.fastasyncworldedit.core.queue.implementation.preloader.Preloader; +import com.fastasyncworldedit.core.queue.implementation.QueueHandler; import com.fastasyncworldedit.core.regions.FaweMaskManager; import com.fastasyncworldedit.core.util.TaskManager; import com.fastasyncworldedit.core.util.image.ImageViewer; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/FilterBlockMask.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/FilterBlockMask.java deleted file mode 100644 index ba5d84478..000000000 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/FilterBlockMask.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.fastasyncworldedit.core.beta; - -import com.fastasyncworldedit.core.beta.implementation.filter.block.FilterBlock; - -public interface FilterBlockMask { - - boolean applyBlock(FilterBlock block); -} diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/ListFilters.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/ListFilters.java similarity index 98% rename from worldedit-core/src/main/java/com/sk89q/worldedit/command/ListFilters.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/command/ListFilters.java index 27c292987..61fd874c5 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/ListFilters.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/ListFilters.java @@ -1,4 +1,4 @@ -package com.sk89q.worldedit.command; +package com.fastasyncworldedit.core.command; import com.fastasyncworldedit.core.Fawe; import com.fastasyncworldedit.core.util.StringMan; @@ -13,7 +13,6 @@ import java.util.UUID; import java.util.regex.Pattern; import java.util.regex.PatternSyntaxException; -//TODO This class breaks compilation //@CommandContainer public class ListFilters { public class Filter { diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/MaskCommands.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/MaskCommands.java similarity index 99% rename from worldedit-core/src/main/java/com/sk89q/worldedit/command/MaskCommands.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/command/MaskCommands.java index f4424f1dd..019e309ff 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/MaskCommands.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/MaskCommands.java @@ -1,5 +1,5 @@ // TODO: Ping @MattBDev to reimplement (or remove because this class is stupid) 2020-02-04 -//package com.sk89q.worldedit.command; +//package com.fastasyncworldedit.core.command; // //import com.boydti.fawe.object.mask.AdjacentAnyMask; //import com.boydti.fawe.object.mask.AdjacentMask; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/MethodCommands.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/MethodCommands.java similarity index 91% rename from worldedit-core/src/main/java/com/sk89q/worldedit/command/MethodCommands.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/command/MethodCommands.java index 8e781b075..ca0c5ee9c 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/MethodCommands.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/MethodCommands.java @@ -1,4 +1,4 @@ -package com.sk89q.worldedit.command; +package com.fastasyncworldedit.core.command; import com.sk89q.worldedit.command.argument.Arguments; import org.enginehub.piston.inject.InjectedValueAccess; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/PatternCommands.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/PatternCommands.java similarity index 100% rename from worldedit-core/src/main/java/com/sk89q/worldedit/command/PatternCommands.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/command/PatternCommands.java diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/TransformCommands.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/TransformCommands.java similarity index 100% rename from worldedit-core/src/main/java/com/sk89q/worldedit/command/TransformCommands.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/command/TransformCommands.java diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/MovableTool.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/MovableTool.java similarity index 68% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/MovableTool.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/MovableTool.java index 2e7eed451..8e4d8904b 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/MovableTool.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/MovableTool.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.brush; +package com.fastasyncworldedit.core.command.tool; import com.sk89q.worldedit.entity.Player; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/ResettableTool.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/ResettableTool.java similarity index 53% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/ResettableTool.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/ResettableTool.java index b8f7655b5..f2a431f27 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/ResettableTool.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/ResettableTool.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.brush; +package com.fastasyncworldedit.core.command.tool; public interface ResettableTool { boolean reset(); diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/TargetMode.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/TargetMode.java similarity index 71% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/TargetMode.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/TargetMode.java index 43318187e..22287894b 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/TargetMode.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/TargetMode.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.brush; +package com.fastasyncworldedit.core.command.tool; public enum TargetMode { TARGET_BLOCK_RANGE, diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/AngleBrush.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/AngleBrush.java similarity index 82% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/AngleBrush.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/AngleBrush.java index a93027316..6a033afa2 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/AngleBrush.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/AngleBrush.java @@ -1,7 +1,7 @@ -package com.fastasyncworldedit.core.object.brush; +package com.fastasyncworldedit.core.command.tool.brush; -import com.fastasyncworldedit.core.object.mask.RadiusMask; -import com.fastasyncworldedit.core.object.mask.SurfaceMask; +import com.fastasyncworldedit.core.function.mask.RadiusMask; +import com.fastasyncworldedit.core.function.mask.SurfaceMask; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.MaxChangedBlocksException; import com.sk89q.worldedit.command.tool.brush.Brush; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/BlendBall.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/BlendBall.java similarity index 98% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/BlendBall.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/BlendBall.java index a09066a58..4e5fa9acb 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/BlendBall.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/BlendBall.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.brush; +package com.fastasyncworldedit.core.command.tool.brush; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.MaxChangedBlocksException; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/BlobBrush.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/BlobBrush.java similarity index 96% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/BlobBrush.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/BlobBrush.java index c0b93707f..260047483 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/BlobBrush.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/BlobBrush.java @@ -1,13 +1,13 @@ -package com.fastasyncworldedit.core.object.brush; +package com.fastasyncworldedit.core.command.tool.brush; -import com.fastasyncworldedit.core.object.random.SimplexNoise; +import com.fastasyncworldedit.core.math.random.SimplexNoise; import com.fastasyncworldedit.core.util.MathMan; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.MaxChangedBlocksException; import com.sk89q.worldedit.command.tool.brush.Brush; import com.sk89q.worldedit.function.pattern.Pattern; import com.sk89q.worldedit.math.BlockVector3; -import com.sk89q.worldedit.math.MutableVector3; +import com.fastasyncworldedit.core.math.MutableVector3; import com.sk89q.worldedit.math.Vector3; import com.sk89q.worldedit.math.transform.AffineTransform; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/BrushSettings.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/BrushSettings.java similarity index 97% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/BrushSettings.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/BrushSettings.java index e30642f87..d77d1f3e8 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/BrushSettings.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/BrushSettings.java @@ -1,7 +1,7 @@ -package com.fastasyncworldedit.core.object.brush; +package com.fastasyncworldedit.core.command.tool.brush; -import com.fastasyncworldedit.core.object.brush.scroll.Scroll; -import com.fastasyncworldedit.core.object.extent.ResettableExtent; +import com.fastasyncworldedit.core.command.tool.scroll.Scroll; +import com.fastasyncworldedit.core.extent.ResettableExtent; import com.sk89q.worldedit.command.tool.brush.Brush; import com.sk89q.worldedit.extension.platform.Actor; import com.sk89q.worldedit.function.mask.Mask; @@ -15,7 +15,7 @@ import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; -import static com.fastasyncworldedit.core.object.brush.BrushSettings.SettingType.BRUSH; +import static com.fastasyncworldedit.core.command.tool.brush.BrushSettings.SettingType.BRUSH; import static com.google.common.base.Preconditions.checkNotNull; public class BrushSettings { diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/CatenaryBrush.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/CatenaryBrush.java similarity index 96% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/CatenaryBrush.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/CatenaryBrush.java index 343cd4bad..11b81be66 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/CatenaryBrush.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/CatenaryBrush.java @@ -1,5 +1,6 @@ -package com.fastasyncworldedit.core.object.brush; +package com.fastasyncworldedit.core.command.tool.brush; +import com.fastasyncworldedit.core.command.tool.ResettableTool; import com.fastasyncworldedit.core.configuration.Caption; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.MaxChangedBlocksException; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/CircleBrush.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/CircleBrush.java similarity index 96% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/CircleBrush.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/CircleBrush.java index 718a12785..7a547b059 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/CircleBrush.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/CircleBrush.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.brush; +package com.fastasyncworldedit.core.command.tool.brush; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.MaxChangedBlocksException; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/CommandBrush.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/CommandBrush.java similarity index 97% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/CommandBrush.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/CommandBrush.java index d2002b941..ffad2cdee 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/CommandBrush.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/CommandBrush.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.brush; +package com.fastasyncworldedit.core.command.tool.brush; import com.fastasyncworldedit.core.util.StringMan; import com.fastasyncworldedit.core.wrappers.AsyncPlayer; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/CopyPastaBrush.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/CopyPastaBrush.java similarity index 93% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/CopyPastaBrush.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/CopyPastaBrush.java index 7ed301f49..4a9e93957 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/CopyPastaBrush.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/CopyPastaBrush.java @@ -1,9 +1,10 @@ -package com.fastasyncworldedit.core.object.brush; +package com.fastasyncworldedit.core.command.tool.brush; +import com.fastasyncworldedit.core.command.tool.ResettableTool; import com.fastasyncworldedit.core.configuration.Caption; -import com.fastasyncworldedit.core.object.clipboard.ResizableClipboardBuilder; -import com.fastasyncworldedit.core.object.function.NullRegionFunction; -import com.fastasyncworldedit.core.object.function.mask.AbstractDelegateMask; +import com.fastasyncworldedit.core.extent.clipboard.ResizableClipboardBuilder; +import com.fastasyncworldedit.core.function.NullRegionFunction; +import com.fastasyncworldedit.core.function.mask.AbstractDelegateMask; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.LocalSession; import com.sk89q.worldedit.MaxChangedBlocksException; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/ErodeBrush.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/ErodeBrush.java similarity index 98% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/ErodeBrush.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/ErodeBrush.java index 31929f721..03cd09d6d 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/ErodeBrush.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/ErodeBrush.java @@ -1,6 +1,6 @@ -package com.fastasyncworldedit.core.object.brush; +package com.fastasyncworldedit.core.command.tool.brush; -import com.fastasyncworldedit.core.object.clipboard.CPUOptimizedClipboard; +import com.fastasyncworldedit.core.extent.clipboard.CPUOptimizedClipboard; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.MaxChangedBlocksException; import com.sk89q.worldedit.command.tool.brush.Brush; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/FallingSphere.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/FallingSphere.java similarity index 97% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/FallingSphere.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/FallingSphere.java index 6bea6a95f..e4796cd3c 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/FallingSphere.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/FallingSphere.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.brush; +package com.fastasyncworldedit.core.command.tool.brush; import com.fastasyncworldedit.core.util.MathMan; import com.sk89q.worldedit.EditSession; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/FlattenBrush.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/FlattenBrush.java similarity index 84% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/FlattenBrush.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/FlattenBrush.java index 3740137dc..4eacf1e2e 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/FlattenBrush.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/FlattenBrush.java @@ -1,7 +1,7 @@ -package com.fastasyncworldedit.core.object.brush; +package com.fastasyncworldedit.core.command.tool.brush; -import com.fastasyncworldedit.core.object.brush.heightmap.HeightMap; -import com.fastasyncworldedit.core.object.brush.heightmap.ScalableHeightMap; +import com.fastasyncworldedit.core.extent.processor.heightmap.HeightMap; +import com.fastasyncworldedit.core.extent.processor.heightmap.ScalableHeightMap; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.MaxChangedBlocksException; import com.sk89q.worldedit.extent.clipboard.Clipboard; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/HeightBrush.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/HeightBrush.java similarity index 88% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/HeightBrush.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/HeightBrush.java index 8400e0f7d..b5a2c8c5a 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/HeightBrush.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/HeightBrush.java @@ -1,10 +1,10 @@ -package com.fastasyncworldedit.core.object.brush; +package com.fastasyncworldedit.core.command.tool.brush; import com.fastasyncworldedit.core.configuration.Caption; -import com.fastasyncworldedit.core.object.brush.heightmap.HeightMap; -import com.fastasyncworldedit.core.object.brush.heightmap.RotatableHeightMap; -import com.fastasyncworldedit.core.object.brush.heightmap.ScalableHeightMap; -import com.fastasyncworldedit.core.object.exception.FaweException; +import com.fastasyncworldedit.core.extent.processor.heightmap.HeightMap; +import com.fastasyncworldedit.core.extent.processor.heightmap.RotatableHeightMap; +import com.fastasyncworldedit.core.extent.processor.heightmap.ScalableHeightMap; +import com.fastasyncworldedit.core.internal.exception.FaweException; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.MaxChangedBlocksException; import com.sk89q.worldedit.command.tool.brush.Brush; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/ImageBrush.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/ImageBrush.java similarity index 93% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/ImageBrush.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/ImageBrush.java index 5216f04a7..37003ba68 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/ImageBrush.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/ImageBrush.java @@ -1,8 +1,8 @@ -package com.fastasyncworldedit.core.object.brush; +package com.fastasyncworldedit.core.command.tool.brush; -import com.fastasyncworldedit.core.object.brush.mask.ImageBrushMask; -import com.fastasyncworldedit.core.object.collection.SummedColorTable; -import com.fastasyncworldedit.core.object.mask.SurfaceMask; +import com.fastasyncworldedit.core.function.mask.ImageBrushMask; +import com.fastasyncworldedit.core.util.collection.SummedColorTable; +import com.fastasyncworldedit.core.function.mask.SurfaceMask; import com.fastasyncworldedit.core.util.TextureUtil; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.LocalSession; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/InspectBrush.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/InspectBrush.java similarity index 96% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/InspectBrush.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/InspectBrush.java index ac6b74bcb..6d2cc4d4b 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/InspectBrush.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/InspectBrush.java @@ -1,12 +1,12 @@ -package com.fastasyncworldedit.core.object.brush; +package com.fastasyncworldedit.core.command.tool.brush; import com.fastasyncworldedit.core.Fawe; import com.fastasyncworldedit.core.configuration.Caption; import com.fastasyncworldedit.core.configuration.Settings; import com.fastasyncworldedit.core.database.DBHandler; import com.fastasyncworldedit.core.database.RollbackDatabase; -import com.fastasyncworldedit.core.logging.RollbackOptimizedHistory; -import com.fastasyncworldedit.core.object.change.MutableFullBlockChange; +import com.fastasyncworldedit.core.history.RollbackOptimizedHistory; +import com.fastasyncworldedit.core.history.change.MutableFullBlockChange; import com.fastasyncworldedit.core.util.MainUtil; import com.sk89q.worldedit.LocalConfiguration; import com.sk89q.worldedit.LocalSession; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/LayerBrush.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/LayerBrush.java similarity index 87% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/LayerBrush.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/LayerBrush.java index f71d93941..64d82f5b7 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/LayerBrush.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/LayerBrush.java @@ -1,9 +1,9 @@ -package com.fastasyncworldedit.core.object.brush; +package com.fastasyncworldedit.core.command.tool.brush; -import com.fastasyncworldedit.core.object.brush.mask.LayerBrushMask; -import com.fastasyncworldedit.core.object.collection.BlockVectorSet; -import com.fastasyncworldedit.core.object.mask.AdjacentAnyMask; -import com.fastasyncworldedit.core.object.mask.RadiusMask; +import com.fastasyncworldedit.core.function.mask.LayerBrushMask; +import com.fastasyncworldedit.core.math.BlockVectorSet; +import com.fastasyncworldedit.core.function.mask.AdjacentAnyMask; +import com.fastasyncworldedit.core.function.mask.RadiusMask; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.MaxChangedBlocksException; import com.sk89q.worldedit.command.tool.brush.Brush; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/LineBrush.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/LineBrush.java similarity index 91% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/LineBrush.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/LineBrush.java index 6e2658b76..fc6606044 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/LineBrush.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/LineBrush.java @@ -1,5 +1,6 @@ -package com.fastasyncworldedit.core.object.brush; +package com.fastasyncworldedit.core.command.tool.brush; +import com.fastasyncworldedit.core.command.tool.ResettableTool; import com.fastasyncworldedit.core.configuration.Caption; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.MaxChangedBlocksException; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/PopulateSchem.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/PopulateSchem.java similarity index 96% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/PopulateSchem.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/PopulateSchem.java index 766dbb91d..c6254a404 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/PopulateSchem.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/PopulateSchem.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.brush; +package com.fastasyncworldedit.core.command.tool.brush; import com.fastasyncworldedit.core.util.MaskTraverser; import com.fastasyncworldedit.core.util.MathMan; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/RaiseBrush.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/RaiseBrush.java similarity index 81% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/RaiseBrush.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/RaiseBrush.java index 0852e76ab..f4f5ac6e3 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/RaiseBrush.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/RaiseBrush.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.brush; +package com.fastasyncworldedit.core.command.tool.brush; public class RaiseBrush extends ErodeBrush { public RaiseBrush() { diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/RecurseBrush.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/RecurseBrush.java similarity index 92% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/RecurseBrush.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/RecurseBrush.java index f046321a7..0019833ac 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/RecurseBrush.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/RecurseBrush.java @@ -1,7 +1,7 @@ -package com.fastasyncworldedit.core.object.brush; +package com.fastasyncworldedit.core.command.tool.brush; -import com.fastasyncworldedit.core.object.mask.RadiusMask; -import com.fastasyncworldedit.core.object.visitor.DFSRecursiveVisitor; +import com.fastasyncworldedit.core.function.mask.RadiusMask; +import com.fastasyncworldedit.core.function.visitor.DFSRecursiveVisitor; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.MaxChangedBlocksException; import com.sk89q.worldedit.command.tool.brush.Brush; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/RockBrush.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/RockBrush.java similarity index 94% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/RockBrush.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/RockBrush.java index 6c8ac2ac7..52704d1bb 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/RockBrush.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/RockBrush.java @@ -1,6 +1,6 @@ -package com.fastasyncworldedit.core.object.brush; +package com.fastasyncworldedit.core.command.tool.brush; -import com.fastasyncworldedit.core.object.random.SimplexNoise; +import com.fastasyncworldedit.core.math.random.SimplexNoise; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.MaxChangedBlocksException; import com.sk89q.worldedit.command.tool.brush.Brush; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/ScatterBrush.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/ScatterBrush.java similarity index 89% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/ScatterBrush.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/ScatterBrush.java index 54e8ca37f..78183387d 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/ScatterBrush.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/ScatterBrush.java @@ -1,10 +1,10 @@ -package com.fastasyncworldedit.core.object.brush; +package com.fastasyncworldedit.core.command.tool.brush; -import com.fastasyncworldedit.core.object.collection.BlockVectorSet; -import com.fastasyncworldedit.core.object.collection.LocalBlockVectorSet; -import com.fastasyncworldedit.core.object.mask.AdjacentAnyMask; -import com.fastasyncworldedit.core.object.mask.RadiusMask; -import com.fastasyncworldedit.core.object.mask.SurfaceMask; +import com.fastasyncworldedit.core.math.BlockVectorSet; +import com.fastasyncworldedit.core.math.LocalBlockVectorSet; +import com.fastasyncworldedit.core.function.mask.AdjacentAnyMask; +import com.fastasyncworldedit.core.function.mask.RadiusMask; +import com.fastasyncworldedit.core.function.mask.SurfaceMask; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.MaxChangedBlocksException; import com.sk89q.worldedit.command.tool.brush.Brush; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/ScatterCommand.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/ScatterCommand.java similarity index 93% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/ScatterCommand.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/ScatterCommand.java index 623f8604d..de8c94e79 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/ScatterCommand.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/ScatterCommand.java @@ -1,6 +1,6 @@ -package com.fastasyncworldedit.core.object.brush; +package com.fastasyncworldedit.core.command.tool.brush; -import com.fastasyncworldedit.core.object.collection.LocalBlockVectorSet; +import com.fastasyncworldedit.core.math.LocalBlockVectorSet; import com.fastasyncworldedit.core.util.StringMan; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.MaxChangedBlocksException; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/ScatterOverlayBrush.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/ScatterOverlayBrush.java similarity index 85% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/ScatterOverlayBrush.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/ScatterOverlayBrush.java index bbed13b2e..d9efc25f6 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/ScatterOverlayBrush.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/ScatterOverlayBrush.java @@ -1,6 +1,6 @@ -package com.fastasyncworldedit.core.object.brush; +package com.fastasyncworldedit.core.command.tool.brush; -import com.fastasyncworldedit.core.object.collection.LocalBlockVectorSet; +import com.fastasyncworldedit.core.math.LocalBlockVectorSet; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.MaxChangedBlocksException; import com.sk89q.worldedit.function.pattern.Pattern; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/ShatterBrush.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/ShatterBrush.java similarity index 94% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/ShatterBrush.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/ShatterBrush.java index dee338dc6..7a8629933 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/ShatterBrush.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/ShatterBrush.java @@ -1,7 +1,7 @@ -package com.fastasyncworldedit.core.object.brush; +package com.fastasyncworldedit.core.command.tool.brush; -import com.fastasyncworldedit.core.object.collection.LocalBlockVectorSet; -import com.fastasyncworldedit.core.object.mask.SurfaceMask; +import com.fastasyncworldedit.core.math.LocalBlockVectorSet; +import com.fastasyncworldedit.core.function.mask.SurfaceMask; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.MaxChangedBlocksException; import com.sk89q.worldedit.function.mask.Mask; @@ -9,7 +9,7 @@ import com.sk89q.worldedit.function.mask.Masks; import com.sk89q.worldedit.function.pattern.Pattern; import com.sk89q.worldedit.function.visitor.BreadthFirstSearch; import com.sk89q.worldedit.math.BlockVector3; -import com.sk89q.worldedit.math.MutableBlockVector3; +import com.fastasyncworldedit.core.math.MutableBlockVector3; import java.util.concurrent.ThreadLocalRandom; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/SplatterBrush.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/SplatterBrush.java similarity index 85% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/SplatterBrush.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/SplatterBrush.java index b4c7337e4..d5d63fbfd 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/SplatterBrush.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/SplatterBrush.java @@ -1,8 +1,8 @@ -package com.fastasyncworldedit.core.object.brush; +package com.fastasyncworldedit.core.command.tool.brush; -import com.fastasyncworldedit.core.object.brush.mask.SplatterBrushMask; -import com.fastasyncworldedit.core.object.collection.LocalBlockVectorSet; -import com.fastasyncworldedit.core.object.mask.SurfaceMask; +import com.fastasyncworldedit.core.function.mask.SplatterBrushMask; +import com.fastasyncworldedit.core.math.LocalBlockVectorSet; +import com.fastasyncworldedit.core.function.mask.SurfaceMask; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.MaxChangedBlocksException; import com.sk89q.worldedit.function.operation.Operations; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/SplineBrush.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/SplineBrush.java similarity index 95% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/SplineBrush.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/SplineBrush.java index 54292ab51..f1ff105ac 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/SplineBrush.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/SplineBrush.java @@ -1,9 +1,10 @@ -package com.fastasyncworldedit.core.object.brush; +package com.fastasyncworldedit.core.command.tool.brush; import com.fastasyncworldedit.core.FaweCache; +import com.fastasyncworldedit.core.command.tool.ResettableTool; import com.fastasyncworldedit.core.configuration.Caption; -import com.fastasyncworldedit.core.object.mask.IdMask; -import com.fastasyncworldedit.core.object.visitor.DFSRecursiveVisitor; +import com.fastasyncworldedit.core.function.mask.IdMask; +import com.fastasyncworldedit.core.function.visitor.DFSRecursiveVisitor; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.command.tool.brush.Brush; @@ -13,7 +14,7 @@ import com.sk89q.worldedit.function.mask.MaskIntersection; import com.sk89q.worldedit.function.operation.Operations; import com.sk89q.worldedit.function.pattern.Pattern; import com.sk89q.worldedit.math.BlockVector3; -import com.sk89q.worldedit.math.MutableVector3; +import com.fastasyncworldedit.core.math.MutableVector3; import com.sk89q.worldedit.math.Vector3; import com.sk89q.worldedit.math.interpolation.Node; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/StencilBrush.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/StencilBrush.java similarity index 91% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/StencilBrush.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/StencilBrush.java index 62dc8e970..b2d185653 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/StencilBrush.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/StencilBrush.java @@ -1,7 +1,7 @@ -package com.fastasyncworldedit.core.object.brush; +package com.fastasyncworldedit.core.command.tool.brush; -import com.fastasyncworldedit.core.object.brush.heightmap.HeightMap; -import com.fastasyncworldedit.core.object.brush.mask.StencilBrushMask; +import com.fastasyncworldedit.core.extent.processor.heightmap.HeightMap; +import com.fastasyncworldedit.core.function.mask.StencilBrushMask; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.MaxChangedBlocksException; import com.sk89q.worldedit.extent.clipboard.Clipboard; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/SurfaceSphereBrush.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/SurfaceSphereBrush.java similarity index 87% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/SurfaceSphereBrush.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/SurfaceSphereBrush.java index 99c7776ed..9de687268 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/SurfaceSphereBrush.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/SurfaceSphereBrush.java @@ -1,7 +1,7 @@ -package com.fastasyncworldedit.core.object.brush; +package com.fastasyncworldedit.core.command.tool.brush; -import com.fastasyncworldedit.core.object.mask.RadiusMask; -import com.fastasyncworldedit.core.object.mask.SurfaceMask; +import com.fastasyncworldedit.core.function.mask.RadiusMask; +import com.fastasyncworldedit.core.function.mask.SurfaceMask; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.MaxChangedBlocksException; import com.sk89q.worldedit.command.tool.brush.Brush; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/SurfaceSpline.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/SurfaceSpline.java similarity index 96% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/SurfaceSpline.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/SurfaceSpline.java index c3c3d660b..9b9c0350a 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/SurfaceSpline.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/SurfaceSpline.java @@ -1,7 +1,7 @@ -package com.fastasyncworldedit.core.object.brush; +package com.fastasyncworldedit.core.command.tool.brush; import com.fastasyncworldedit.core.configuration.Caption; -import com.fastasyncworldedit.core.object.collection.LocalBlockVectorSet; +import com.fastasyncworldedit.core.math.LocalBlockVectorSet; import com.fastasyncworldedit.core.util.MathMan; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.MaxChangedBlocksException; @@ -9,7 +9,7 @@ import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.command.tool.brush.Brush; import com.sk89q.worldedit.function.pattern.Pattern; import com.sk89q.worldedit.math.BlockVector3; -import com.sk89q.worldedit.math.MutableBlockVector3; +import com.fastasyncworldedit.core.math.MutableBlockVector3; import com.sk89q.worldedit.math.Vector3; import com.sk89q.worldedit.math.interpolation.KochanekBartelsInterpolation; import com.sk89q.worldedit.math.interpolation.Node; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/scroll/Scroll.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/scroll/Scroll.java similarity index 97% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/scroll/Scroll.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/scroll/Scroll.java index baeb3e6bb..9de9615a8 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/scroll/Scroll.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/scroll/Scroll.java @@ -1,7 +1,7 @@ -package com.fastasyncworldedit.core.object.brush.scroll; +package com.fastasyncworldedit.core.command.tool.scroll; import com.fastasyncworldedit.core.configuration.Caption; -import com.fastasyncworldedit.core.object.clipboard.MultiClipboardHolder; +import com.fastasyncworldedit.core.extent.clipboard.MultiClipboardHolder; import com.sk89q.worldedit.LocalSession; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.command.tool.BrushTool; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/scroll/ScrollClipboard.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/scroll/ScrollClipboard.java similarity index 94% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/scroll/ScrollClipboard.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/scroll/ScrollClipboard.java index e5e1cd6d1..4699611e1 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/scroll/ScrollClipboard.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/scroll/ScrollClipboard.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.brush.scroll; +package com.fastasyncworldedit.core.command.tool.scroll; import com.fastasyncworldedit.core.util.MathMan; import com.sk89q.worldedit.LocalSession; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/scroll/ScrollMask.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/scroll/ScrollMask.java similarity index 91% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/scroll/ScrollMask.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/scroll/ScrollMask.java index a35cc4f2c..037fb7ef7 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/scroll/ScrollMask.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/scroll/ScrollMask.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.brush.scroll; +package com.fastasyncworldedit.core.command.tool.scroll; import com.fastasyncworldedit.core.util.MathMan; import com.sk89q.worldedit.command.tool.BrushTool; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/scroll/ScrollPattern.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/scroll/ScrollPattern.java similarity index 92% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/scroll/ScrollPattern.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/scroll/ScrollPattern.java index d7ba467a3..4aca2ff21 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/scroll/ScrollPattern.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/scroll/ScrollPattern.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.brush.scroll; +package com.fastasyncworldedit.core.command.tool.scroll; import com.fastasyncworldedit.core.util.MathMan; import com.sk89q.worldedit.command.tool.BrushTool; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/scroll/ScrollRange.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/scroll/ScrollRange.java similarity index 91% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/scroll/ScrollRange.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/scroll/ScrollRange.java index 31d9cbb07..9afaf84c4 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/scroll/ScrollRange.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/scroll/ScrollRange.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.brush.scroll; +package com.fastasyncworldedit.core.command.tool.scroll; import com.fastasyncworldedit.core.util.MathMan; import com.sk89q.worldedit.WorldEdit; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/scroll/ScrollSize.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/scroll/ScrollSize.java similarity index 90% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/scroll/ScrollSize.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/scroll/ScrollSize.java index 0c191e99c..448a72271 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/scroll/ScrollSize.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/scroll/ScrollSize.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.brush.scroll; +package com.fastasyncworldedit.core.command.tool.scroll; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.command.tool.BrushTool; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/scroll/ScrollTarget.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/scroll/ScrollTarget.java similarity index 84% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/scroll/ScrollTarget.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/scroll/ScrollTarget.java index 6c8dbf6a1..475e162e0 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/scroll/ScrollTarget.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/scroll/ScrollTarget.java @@ -1,6 +1,6 @@ -package com.fastasyncworldedit.core.object.brush.scroll; +package com.fastasyncworldedit.core.command.tool.scroll; -import com.fastasyncworldedit.core.object.brush.TargetMode; +import com.fastasyncworldedit.core.command.tool.TargetMode; import com.fastasyncworldedit.core.util.MathMan; import com.sk89q.worldedit.command.tool.BrushTool; import com.sk89q.worldedit.entity.Player; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/scroll/ScrollTargetOffset.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/scroll/ScrollTargetOffset.java similarity index 88% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/scroll/ScrollTargetOffset.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/scroll/ScrollTargetOffset.java index ef959e7b3..f6612b68f 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/scroll/ScrollTargetOffset.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/scroll/ScrollTargetOffset.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.brush.scroll; +package com.fastasyncworldedit.core.command.tool.scroll; import com.sk89q.worldedit.command.tool.BrushTool; import com.sk89q.worldedit.entity.Player; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/scroll/ScrollTool.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/scroll/ScrollTool.java new file mode 100644 index 000000000..7300a2846 --- /dev/null +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/scroll/ScrollTool.java @@ -0,0 +1,7 @@ +package com.fastasyncworldedit.core.command.tool.scroll; + +import com.sk89q.worldedit.entity.Player; + +public interface ScrollTool { + boolean increment(Player player, int amount); +} diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/sweep/ClipboardSpline.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/sweep/ClipboardSpline.java similarity index 96% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/sweep/ClipboardSpline.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/sweep/ClipboardSpline.java index 090af0a43..acd41f34e 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/sweep/ClipboardSpline.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/sweep/ClipboardSpline.java @@ -1,6 +1,6 @@ -package com.fastasyncworldedit.core.object.brush.sweep; +package com.fastasyncworldedit.core.command.tool.sweep; -import com.fastasyncworldedit.core.object.collection.LocalBlockVectorSet; +import com.fastasyncworldedit.core.math.LocalBlockVectorSet; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.MaxChangedBlocksException; import com.sk89q.worldedit.extent.clipboard.Clipboard; @@ -11,7 +11,7 @@ import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.math.Vector3; import com.sk89q.worldedit.math.interpolation.Interpolation; import com.sk89q.worldedit.math.transform.AffineTransform; -import com.sk89q.worldedit.math.transform.RoundedTransform; +import com.fastasyncworldedit.core.math.transform.RoundedTransform; import com.sk89q.worldedit.math.transform.Transform; import com.sk89q.worldedit.regions.Region; import com.sk89q.worldedit.session.ClipboardHolder; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/sweep/Spline.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/sweep/Spline.java similarity index 99% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/sweep/Spline.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/sweep/Spline.java index 65ac995e2..27566d6c0 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/sweep/Spline.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/sweep/Spline.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.brush.sweep; +package com.fastasyncworldedit.core.command.tool.sweep; import com.google.common.base.Preconditions; import com.sk89q.worldedit.EditSession; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/sweep/SweepBrush.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/sweep/SweepBrush.java similarity index 97% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/sweep/SweepBrush.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/sweep/SweepBrush.java index 87d5689f7..87287e639 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/sweep/SweepBrush.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/sweep/SweepBrush.java @@ -1,7 +1,7 @@ -package com.fastasyncworldedit.core.object.brush.sweep; +package com.fastasyncworldedit.core.command.tool.sweep; +import com.fastasyncworldedit.core.command.tool.ResettableTool; import com.fastasyncworldedit.core.configuration.Caption; -import com.fastasyncworldedit.core.object.brush.ResettableTool; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.EmptyClipboardException; import com.sk89q.worldedit.LocalSession; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/database/DBHandler.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/database/DBHandler.java index bbb39bfba..d160c24c8 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/database/DBHandler.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/database/DBHandler.java @@ -13,7 +13,7 @@ public class DBHandler { public static final DBHandler IMP = new DBHandler(); - private Map databases = new ConcurrentHashMap<>(8, 0.9f, 1); + private final Map databases = new ConcurrentHashMap<>(8, 0.9f, 1); public RollbackDatabase getDatabase(World world) { RollbackDatabase database = databases.get(world); diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/database/RollbackDatabase.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/database/RollbackDatabase.java index ed0b680f6..f0f142171 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/database/RollbackDatabase.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/database/RollbackDatabase.java @@ -2,9 +2,9 @@ package com.fastasyncworldedit.core.database; import com.fastasyncworldedit.core.Fawe; import com.fastasyncworldedit.core.configuration.Settings; -import com.fastasyncworldedit.core.logging.RollbackOptimizedHistory; -import com.fastasyncworldedit.core.object.collection.YieldIterable; -import com.fastasyncworldedit.core.object.task.AsyncNotifyQueue; +import com.fastasyncworldedit.core.history.RollbackOptimizedHistory; +import com.fastasyncworldedit.core.util.collection.YieldIterable; +import com.fastasyncworldedit.core.util.task.AsyncNotifyQueue; import com.fastasyncworldedit.core.util.MainUtil; import com.sk89q.worldedit.internal.util.LogManagerCompat; import com.sk89q.worldedit.math.BlockVector3; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/entity/LazyBaseEntity.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/entity/LazyBaseEntity.java similarity index 90% rename from worldedit-core/src/main/java/com/sk89q/worldedit/entity/LazyBaseEntity.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/entity/LazyBaseEntity.java index 768b3fa77..4d510b713 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/entity/LazyBaseEntity.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/entity/LazyBaseEntity.java @@ -1,8 +1,9 @@ -package com.sk89q.worldedit.entity; +package com.fastasyncworldedit.core.entity; import com.fastasyncworldedit.core.Fawe; import com.fastasyncworldedit.core.util.TaskManager; import com.sk89q.jnbt.CompoundTag; +import com.sk89q.worldedit.entity.BaseEntity; import com.sk89q.worldedit.world.entity.EntityType; import java.util.function.Supplier; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/entity/MapMetadatable.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/entity/MapMetadatable.java similarity index 96% rename from worldedit-core/src/main/java/com/sk89q/worldedit/entity/MapMetadatable.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/entity/MapMetadatable.java index 6cedcb415..adbd68cf5 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/entity/MapMetadatable.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/entity/MapMetadatable.java @@ -1,4 +1,4 @@ -package com.sk89q.worldedit.entity; +package com.fastasyncworldedit.core.entity; import org.jetbrains.annotations.NotNull; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/entity/Metadatable.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/entity/Metadatable.java similarity index 97% rename from worldedit-core/src/main/java/com/sk89q/worldedit/entity/Metadatable.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/entity/Metadatable.java index 1062a3f39..9903b43cd 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/entity/Metadatable.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/entity/Metadatable.java @@ -1,4 +1,4 @@ -package com.sk89q.worldedit.entity; +package com.fastasyncworldedit.core.entity; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/event/extent/ActorSaveClipboardEvent.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/event/extent/ActorSaveClipboardEvent.java similarity index 95% rename from worldedit-core/src/main/java/com/sk89q/worldedit/event/extent/ActorSaveClipboardEvent.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/event/extent/ActorSaveClipboardEvent.java index fdc84e369..4507d9c75 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/event/extent/ActorSaveClipboardEvent.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/event/extent/ActorSaveClipboardEvent.java @@ -1,4 +1,4 @@ -package com.sk89q.worldedit.event.extent; +package com.fastasyncworldedit.core.event.extent; import com.sk89q.worldedit.event.Cancellable; import com.sk89q.worldedit.event.Event; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/event/extent/PasteEvent.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/event/extent/PasteEvent.java similarity index 66% rename from worldedit-core/src/main/java/com/sk89q/worldedit/event/extent/PasteEvent.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/event/extent/PasteEvent.java index 00fa8b829..c4928b587 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/event/extent/PasteEvent.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/event/extent/PasteEvent.java @@ -1,23 +1,4 @@ -/* - * WorldEdit, a Minecraft world manipulation toolkit - * Copyright (C) sk89q - * Copyright (C) WorldEdit team and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.sk89q.worldedit.event.extent; +package com.fastasyncworldedit.core.event.extent; import com.sk89q.worldedit.event.Cancellable; import com.sk89q.worldedit.event.Event; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/DefaultTransformParser.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/DefaultTransformParser.java similarity index 100% rename from worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/DefaultTransformParser.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/DefaultTransformParser.java diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/RichParser.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/RichParser.java similarity index 98% rename from worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/RichParser.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/RichParser.java index 9d281e87c..1ceefd959 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/RichParser.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/RichParser.java @@ -1,4 +1,4 @@ -package com.sk89q.worldedit.extension.factory.parser; +package com.fastasyncworldedit.core.extension.factory.parser; import com.fastasyncworldedit.core.configuration.Caption; import com.google.common.base.Preconditions; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/AdjacentMaskParser.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/mask/AdjacentMaskParser.java similarity index 85% rename from worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/AdjacentMaskParser.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/mask/AdjacentMaskParser.java index 71fc4b628..c20b0c78f 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/AdjacentMaskParser.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/mask/AdjacentMaskParser.java @@ -1,10 +1,10 @@ -package com.sk89q.worldedit.extension.factory.parser.mask; +package com.fastasyncworldedit.core.extension.factory.parser.mask; -import com.fastasyncworldedit.core.object.mask.AdjacentAnyMask; -import com.fastasyncworldedit.core.object.mask.AdjacentMask; +import com.fastasyncworldedit.core.function.mask.AdjacentAnyMask; +import com.fastasyncworldedit.core.function.mask.AdjacentMask; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.command.util.SuggestionHelper; -import com.sk89q.worldedit.extension.factory.parser.RichParser; +import com.fastasyncworldedit.core.extension.factory.parser.RichParser; import com.sk89q.worldedit.extension.input.InputParseException; import com.sk89q.worldedit.extension.input.ParserContext; import com.sk89q.worldedit.function.mask.Mask; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/AngleMaskParser.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/mask/AngleMaskParser.java similarity index 92% rename from worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/AngleMaskParser.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/mask/AngleMaskParser.java index 0b144e5f0..7bca15398 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/AngleMaskParser.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/mask/AngleMaskParser.java @@ -1,10 +1,10 @@ -package com.sk89q.worldedit.extension.factory.parser.mask; +package com.fastasyncworldedit.core.extension.factory.parser.mask; import com.fastasyncworldedit.core.configuration.Caption; -import com.fastasyncworldedit.core.object.mask.AngleMask; +import com.fastasyncworldedit.core.function.mask.AngleMask; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.command.util.SuggestionHelper; -import com.sk89q.worldedit.extension.factory.parser.RichParser; +import com.fastasyncworldedit.core.extension.factory.parser.RichParser; import com.sk89q.worldedit.extension.input.InputParseException; import com.sk89q.worldedit.extension.input.ParserContext; import com.sk89q.worldedit.function.mask.Mask; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/DefaultMaskParser.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/mask/DefaultMaskParser.java similarity index 91% rename from worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/DefaultMaskParser.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/mask/DefaultMaskParser.java index 82685458f..17075b403 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/DefaultMaskParser.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/mask/DefaultMaskParser.java @@ -1,24 +1,6 @@ // TODO: Ping @MattBDev to reimplement 2020-02-04 -///* -// * WorldEdit, a Minecraft world manipulation toolkit -// * Copyright (C) sk89q -// * Copyright (C) WorldEdit team and contributors -// * -// * This program is free software: you can redistribute it and/or modify it -// * under the terms of the GNU Lesser General Public License as published by the -// * Free Software Foundation, either version 3 of the License, or -// * (at your option) any later version. -// * -// * This program is distributed in the hope that it will be useful, but WITHOUT -// * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -// * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License -// * for more details. -// * -// * You should have received a copy of the GNU Lesser General Public License -// * along with this program. If not, see . -// */ -// -//package com.sk89q.worldedit.extension.factory.parser.mask; +//* +//package com.fastasyncworldedit.core.extension.factory.parser.mask; // //import com.boydti.fawe.command.FaweParser; //import com.boydti.fawe.command.SuggestInputParseException; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/ExtremaMaskParser.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/mask/ExtremaMaskParser.java similarity index 92% rename from worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/ExtremaMaskParser.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/mask/ExtremaMaskParser.java index 3b04e5ff0..2b1371fe5 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/ExtremaMaskParser.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/mask/ExtremaMaskParser.java @@ -1,10 +1,10 @@ -package com.sk89q.worldedit.extension.factory.parser.mask; +package com.fastasyncworldedit.core.extension.factory.parser.mask; import com.fastasyncworldedit.core.configuration.Caption; -import com.fastasyncworldedit.core.object.mask.ExtremaMask; +import com.fastasyncworldedit.core.function.mask.ExtremaMask; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.command.util.SuggestionHelper; -import com.sk89q.worldedit.extension.factory.parser.RichParser; +import com.fastasyncworldedit.core.extension.factory.parser.RichParser; import com.sk89q.worldedit.extension.input.InputParseException; import com.sk89q.worldedit.extension.input.ParserContext; import com.sk89q.worldedit.function.mask.Mask; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/FalseMaskParser.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/mask/FalseMaskParser.java similarity index 92% rename from worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/FalseMaskParser.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/mask/FalseMaskParser.java index 50b93fcb7..64e8780d9 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/FalseMaskParser.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/mask/FalseMaskParser.java @@ -1,4 +1,4 @@ -package com.sk89q.worldedit.extension.factory.parser.mask; +package com.fastasyncworldedit.core.extension.factory.parser.mask; import com.google.common.collect.ImmutableList; import com.sk89q.worldedit.WorldEdit; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/LiquidMaskParser.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/mask/LiquidMaskParser.java similarity index 85% rename from worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/LiquidMaskParser.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/mask/LiquidMaskParser.java index 77fe732fb..fcf54ae93 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/LiquidMaskParser.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/mask/LiquidMaskParser.java @@ -1,6 +1,6 @@ -package com.sk89q.worldedit.extension.factory.parser.mask; +package com.fastasyncworldedit.core.extension.factory.parser.mask; -import com.fastasyncworldedit.core.object.mask.LiquidMask; +import com.fastasyncworldedit.core.function.mask.LiquidMask; import com.google.common.collect.ImmutableList; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.extension.input.ParserContext; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/ROCAngleMaskParser.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/mask/ROCAngleMaskParser.java similarity index 92% rename from worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/ROCAngleMaskParser.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/mask/ROCAngleMaskParser.java index e2af7862f..8bf85f178 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/ROCAngleMaskParser.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/mask/ROCAngleMaskParser.java @@ -1,10 +1,10 @@ -package com.sk89q.worldedit.extension.factory.parser.mask; +package com.fastasyncworldedit.core.extension.factory.parser.mask; import com.fastasyncworldedit.core.configuration.Caption; -import com.fastasyncworldedit.core.object.mask.ROCAngleMask; +import com.fastasyncworldedit.core.function.mask.ROCAngleMask; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.command.util.SuggestionHelper; -import com.sk89q.worldedit.extension.factory.parser.RichParser; +import com.fastasyncworldedit.core.extension.factory.parser.RichParser; import com.sk89q.worldedit.extension.input.InputParseException; import com.sk89q.worldedit.extension.input.ParserContext; import com.sk89q.worldedit.function.mask.Mask; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/RadiusMaskParser.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/mask/RadiusMaskParser.java similarity index 84% rename from worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/RadiusMaskParser.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/mask/RadiusMaskParser.java index 4c3f8e274..609663629 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/RadiusMaskParser.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/mask/RadiusMaskParser.java @@ -1,9 +1,9 @@ -package com.sk89q.worldedit.extension.factory.parser.mask; +package com.fastasyncworldedit.core.extension.factory.parser.mask; -import com.fastasyncworldedit.core.object.mask.RadiusMask; +import com.fastasyncworldedit.core.function.mask.RadiusMask; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.command.util.SuggestionHelper; -import com.sk89q.worldedit.extension.factory.parser.RichParser; +import com.fastasyncworldedit.core.extension.factory.parser.RichParser; import com.sk89q.worldedit.extension.input.InputParseException; import com.sk89q.worldedit.extension.input.ParserContext; import com.sk89q.worldedit.function.mask.Mask; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/RichOffsetMaskParser.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/mask/RichOffsetMaskParser.java similarity index 92% rename from worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/RichOffsetMaskParser.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/mask/RichOffsetMaskParser.java index 0139dd224..52f501519 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/RichOffsetMaskParser.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/mask/RichOffsetMaskParser.java @@ -1,8 +1,8 @@ -package com.sk89q.worldedit.extension.factory.parser.mask; +package com.fastasyncworldedit.core.extension.factory.parser.mask; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.command.util.SuggestionHelper; -import com.sk89q.worldedit.extension.factory.parser.RichParser; +import com.fastasyncworldedit.core.extension.factory.parser.RichParser; import com.sk89q.worldedit.extension.input.InputParseException; import com.sk89q.worldedit.extension.input.ParserContext; import com.sk89q.worldedit.function.mask.Mask; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/SimplexMaskParser.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/mask/SimplexMaskParser.java similarity index 86% rename from worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/SimplexMaskParser.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/mask/SimplexMaskParser.java index 17bce6c2f..f5941fb07 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/SimplexMaskParser.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/mask/SimplexMaskParser.java @@ -1,9 +1,9 @@ -package com.sk89q.worldedit.extension.factory.parser.mask; +package com.fastasyncworldedit.core.extension.factory.parser.mask; -import com.fastasyncworldedit.core.object.mask.SimplexMask; +import com.fastasyncworldedit.core.function.mask.SimplexMask; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.command.util.SuggestionHelper; -import com.sk89q.worldedit.extension.factory.parser.RichParser; +import com.fastasyncworldedit.core.extension.factory.parser.RichParser; import com.sk89q.worldedit.extension.input.InputParseException; import com.sk89q.worldedit.extension.input.ParserContext; import com.sk89q.worldedit.function.mask.Mask; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/SurfaceMaskParser.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/mask/SurfaceMaskParser.java similarity index 86% rename from worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/SurfaceMaskParser.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/mask/SurfaceMaskParser.java index 8407b650e..ad8a2b9d1 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/SurfaceMaskParser.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/mask/SurfaceMaskParser.java @@ -1,6 +1,6 @@ -package com.sk89q.worldedit.extension.factory.parser.mask; +package com.fastasyncworldedit.core.extension.factory.parser.mask; -import com.fastasyncworldedit.core.object.mask.SurfaceMask; +import com.fastasyncworldedit.core.function.mask.SurfaceMask; import com.google.common.collect.ImmutableList; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.extension.input.InputParseException; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/TrueMaskParser.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/mask/TrueMaskParser.java similarity index 91% rename from worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/TrueMaskParser.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/mask/TrueMaskParser.java index 90a51315c..17a5da720 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/TrueMaskParser.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/mask/TrueMaskParser.java @@ -1,4 +1,4 @@ -package com.sk89q.worldedit.extension.factory.parser.mask; +package com.fastasyncworldedit.core.extension.factory.parser.mask; import com.google.common.collect.ImmutableList; import com.sk89q.worldedit.WorldEdit; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/WallMaskParser.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/mask/WallMaskParser.java similarity index 90% rename from worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/WallMaskParser.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/mask/WallMaskParser.java index e9000b212..7c81b996f 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/WallMaskParser.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/mask/WallMaskParser.java @@ -1,6 +1,6 @@ -package com.sk89q.worldedit.extension.factory.parser.mask; +package com.fastasyncworldedit.core.extension.factory.parser.mask; -import com.fastasyncworldedit.core.object.mask.WallMask; +import com.fastasyncworldedit.core.function.mask.WallMask; import com.google.common.collect.ImmutableList; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.extension.input.InputParseException; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/mask/XAxisMaskParser.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/mask/XAxisMaskParser.java new file mode 100644 index 000000000..a2a9b04d8 --- /dev/null +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/mask/XAxisMaskParser.java @@ -0,0 +1,29 @@ +package com.fastasyncworldedit.core.extension.factory.parser.mask; + +import com.fastasyncworldedit.core.function.mask.XAxisMask; +import com.google.common.collect.ImmutableList; +import com.sk89q.worldedit.WorldEdit; +import com.sk89q.worldedit.extension.input.ParserContext; +import com.sk89q.worldedit.function.mask.Mask; +import com.sk89q.worldedit.internal.registry.SimpleInputParser; + +import java.util.List; + +public class XAxisMaskParser extends SimpleInputParser { + + private final List aliases = ImmutableList.of("#xaxis"); + + public XAxisMaskParser(WorldEdit worldEdit) { + super(worldEdit); + } + + @Override + public List getMatchedAliases() { + return aliases; + } + + @Override + public Mask parseFromSimpleInput(String input, ParserContext context) { + return new XAxisMask(context.getExtent()); + } +} diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/mask/YAxisMaskParser.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/mask/YAxisMaskParser.java new file mode 100644 index 000000000..d37fbbe4a --- /dev/null +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/mask/YAxisMaskParser.java @@ -0,0 +1,29 @@ +package com.fastasyncworldedit.core.extension.factory.parser.mask; + +import com.fastasyncworldedit.core.function.mask.YAxisMask; +import com.google.common.collect.ImmutableList; +import com.sk89q.worldedit.WorldEdit; +import com.sk89q.worldedit.extension.input.ParserContext; +import com.sk89q.worldedit.function.mask.Mask; +import com.sk89q.worldedit.internal.registry.SimpleInputParser; + +import java.util.List; + +public class YAxisMaskParser extends SimpleInputParser { + + private final List aliases = ImmutableList.of("#yaxis"); + + public YAxisMaskParser(WorldEdit worldEdit) { + super(worldEdit); + } + + @Override + public List getMatchedAliases() { + return aliases; + } + + @Override + public Mask parseFromSimpleInput(String input, ParserContext context) { + return new YAxisMask(context.getExtent()); + } +} diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/mask/ZAxisMaskParser.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/mask/ZAxisMaskParser.java new file mode 100644 index 000000000..015a5ff9d --- /dev/null +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/mask/ZAxisMaskParser.java @@ -0,0 +1,29 @@ +package com.fastasyncworldedit.core.extension.factory.parser.mask; + +import com.fastasyncworldedit.core.function.mask.ZAxisMask; +import com.google.common.collect.ImmutableList; +import com.sk89q.worldedit.WorldEdit; +import com.sk89q.worldedit.extension.input.ParserContext; +import com.sk89q.worldedit.function.mask.Mask; +import com.sk89q.worldedit.internal.registry.SimpleInputParser; + +import java.util.List; + +public class ZAxisMaskParser extends SimpleInputParser { + + private final List aliases = ImmutableList.of("#zaxis"); + + public ZAxisMaskParser(WorldEdit worldEdit) { + super(worldEdit); + } + + @Override + public List getMatchedAliases() { + return aliases; + } + + @Override + public Mask parseFromSimpleInput(String input, ParserContext context) { + return new ZAxisMask(); + } +} diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/BiomePatternParser.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/pattern/BiomePatternParser.java similarity index 92% rename from worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/BiomePatternParser.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/pattern/BiomePatternParser.java index 9c36f4a04..85eb3d8f4 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/BiomePatternParser.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/pattern/BiomePatternParser.java @@ -1,9 +1,9 @@ -package com.sk89q.worldedit.extension.factory.parser.pattern; +package com.fastasyncworldedit.core.extension.factory.parser.pattern; import com.fastasyncworldedit.core.configuration.Caption; -import com.fastasyncworldedit.core.object.pattern.BiomeApplyingPattern; +import com.fastasyncworldedit.core.function.pattern.BiomeApplyingPattern; import com.sk89q.worldedit.WorldEdit; -import com.sk89q.worldedit.extension.factory.parser.RichParser; +import com.fastasyncworldedit.core.extension.factory.parser.RichParser; import com.sk89q.worldedit.extension.input.InputParseException; import com.sk89q.worldedit.extension.input.NoMatchException; import com.sk89q.worldedit.extension.input.ParserContext; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/BufferedPatternParser.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/pattern/BufferedPatternParser.java similarity index 87% rename from worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/BufferedPatternParser.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/pattern/BufferedPatternParser.java index 5e1c6e3a3..3d1b3a735 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/BufferedPatternParser.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/pattern/BufferedPatternParser.java @@ -1,9 +1,9 @@ -package com.sk89q.worldedit.extension.factory.parser.pattern; +package com.fastasyncworldedit.core.extension.factory.parser.pattern; import com.fastasyncworldedit.core.configuration.Caption; -import com.fastasyncworldedit.core.object.pattern.BufferedPattern; +import com.fastasyncworldedit.core.function.pattern.BufferedPattern; import com.sk89q.worldedit.WorldEdit; -import com.sk89q.worldedit.extension.factory.parser.RichParser; +import com.fastasyncworldedit.core.extension.factory.parser.RichParser; import com.sk89q.worldedit.extension.input.InputParseException; import com.sk89q.worldedit.extension.input.ParserContext; import com.sk89q.worldedit.function.pattern.Pattern; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/DefaultPatternParser.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/pattern/DefaultPatternParser.java similarity index 90% rename from worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/DefaultPatternParser.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/pattern/DefaultPatternParser.java index fb67973b1..60f8cc94d 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/DefaultPatternParser.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/pattern/DefaultPatternParser.java @@ -1,24 +1,6 @@ // TODO: Ping @MattBDev to reimplement (or remove because this class is stupid) 2020-02-04 ///* -// * WorldEdit, a Minecraft world manipulation toolkit -// * Copyright (C) sk89q -// * Copyright (C) WorldEdit team and contributors -// * -// * This program is free software: you can redistribute it and/or modify it -// * under the terms of the GNU Lesser General Public License as published by the -// * Free Software Foundation, either version 3 of the License, or -// * (at your option) any later version. -// * -// * This program is distributed in the hope that it will be useful, but WITHOUT -// * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -// * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License -// * for more details. -// * -// * You should have received a copy of the GNU Lesser General Public License -// * along with this program. If not, see . -// */ -// -//package com.sk89q.worldedit.extension.factory.parser.pattern; +//package com.fastasyncworldedit.core.extension.factory.parser.pattern; // //import com.boydti.fawe.command.FaweParser; //import com.boydti.fawe.command.SuggestInputParseException; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/ExistingPatternParser.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/pattern/ExistingPatternParser.java similarity index 86% rename from worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/ExistingPatternParser.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/pattern/ExistingPatternParser.java index 838bf3819..c1c6d618b 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/ExistingPatternParser.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/pattern/ExistingPatternParser.java @@ -1,6 +1,6 @@ -package com.sk89q.worldedit.extension.factory.parser.pattern; +package com.fastasyncworldedit.core.extension.factory.parser.pattern; -import com.fastasyncworldedit.core.object.pattern.ExistingPattern; +import com.fastasyncworldedit.core.function.pattern.ExistingPattern; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.extension.input.InputParseException; import com.sk89q.worldedit.extension.input.ParserContext; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/Linear2DPatternParser.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/pattern/Linear2DPatternParser.java similarity index 92% rename from worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/Linear2DPatternParser.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/pattern/Linear2DPatternParser.java index 0d9d58eb1..14c082a9c 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/Linear2DPatternParser.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/pattern/Linear2DPatternParser.java @@ -1,11 +1,11 @@ -package com.sk89q.worldedit.extension.factory.parser.pattern; +package com.fastasyncworldedit.core.extension.factory.parser.pattern; import com.fastasyncworldedit.core.configuration.Caption; -import com.fastasyncworldedit.core.object.pattern.Linear2DBlockPattern; +import com.fastasyncworldedit.core.function.pattern.Linear2DBlockPattern; import com.google.common.base.Preconditions; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.command.util.SuggestionHelper; -import com.sk89q.worldedit.extension.factory.parser.RichParser; +import com.fastasyncworldedit.core.extension.factory.parser.RichParser; import com.sk89q.worldedit.extension.input.InputParseException; import com.sk89q.worldedit.extension.input.ParserContext; import com.sk89q.worldedit.function.pattern.Pattern; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/Linear3DPatternParser.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/pattern/Linear3DPatternParser.java similarity index 93% rename from worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/Linear3DPatternParser.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/pattern/Linear3DPatternParser.java index 51eef6f57..8db342b7a 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/Linear3DPatternParser.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/pattern/Linear3DPatternParser.java @@ -1,11 +1,11 @@ -package com.sk89q.worldedit.extension.factory.parser.pattern; +package com.fastasyncworldedit.core.extension.factory.parser.pattern; import com.fastasyncworldedit.core.configuration.Caption; -import com.fastasyncworldedit.core.object.pattern.Linear3DBlockPattern; +import com.fastasyncworldedit.core.function.pattern.Linear3DBlockPattern; import com.google.common.base.Preconditions; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.command.util.SuggestionHelper; -import com.sk89q.worldedit.extension.factory.parser.RichParser; +import com.fastasyncworldedit.core.extension.factory.parser.RichParser; import com.sk89q.worldedit.extension.input.InputParseException; import com.sk89q.worldedit.extension.input.ParserContext; import com.sk89q.worldedit.function.pattern.Pattern; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/NoisePatternParser.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/pattern/NoisePatternParser.java similarity index 93% rename from worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/NoisePatternParser.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/pattern/NoisePatternParser.java index 40c3bbb46..d90df8a32 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/NoisePatternParser.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/pattern/NoisePatternParser.java @@ -1,10 +1,10 @@ -package com.sk89q.worldedit.extension.factory.parser.pattern; +package com.fastasyncworldedit.core.extension.factory.parser.pattern; import com.fastasyncworldedit.core.configuration.Caption; -import com.fastasyncworldedit.core.object.random.NoiseRandom; +import com.fastasyncworldedit.core.math.random.NoiseRandom; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.command.util.SuggestionHelper; -import com.sk89q.worldedit.extension.factory.parser.RichParser; +import com.fastasyncworldedit.core.extension.factory.parser.RichParser; import com.sk89q.worldedit.extension.input.InputParseException; import com.sk89q.worldedit.extension.input.ParserContext; import com.sk89q.worldedit.function.pattern.Pattern; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/PerlinPatternParser.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/pattern/PerlinPatternParser.java similarity index 86% rename from worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/PerlinPatternParser.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/pattern/PerlinPatternParser.java index 1d968c8b7..8bd9e2987 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/PerlinPatternParser.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/pattern/PerlinPatternParser.java @@ -1,4 +1,4 @@ -package com.sk89q.worldedit.extension.factory.parser.pattern; +package com.fastasyncworldedit.core.extension.factory.parser.pattern; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.math.noise.PerlinNoise; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/RandomPatternParser.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/pattern/RandomPatternParser.java similarity index 77% rename from worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/RandomPatternParser.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/pattern/RandomPatternParser.java index 76045e1be..16ace2476 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/RandomPatternParser.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/pattern/RandomPatternParser.java @@ -1,23 +1,4 @@ -/* - * WorldEdit, a Minecraft world manipulation toolkit - * Copyright (C) sk89q - * Copyright (C) WorldEdit team and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.sk89q.worldedit.extension.factory.parser.pattern; +package com.fastasyncworldedit.core.extension.factory.parser.pattern; import com.fastasyncworldedit.core.configuration.Caption; import com.sk89q.util.StringUtil; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/RidgedMultiFractalPatternParser.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/pattern/RidgedMultiFractalPatternParser.java similarity index 88% rename from worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/RidgedMultiFractalPatternParser.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/pattern/RidgedMultiFractalPatternParser.java index 969acc1e6..1ac5fa62e 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/RidgedMultiFractalPatternParser.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/pattern/RidgedMultiFractalPatternParser.java @@ -1,4 +1,4 @@ -package com.sk89q.worldedit.extension.factory.parser.pattern; +package com.fastasyncworldedit.core.extension.factory.parser.pattern; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.math.noise.RidgedMultiFractalNoise; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/SimplexPatternParser.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/pattern/SimplexPatternParser.java similarity index 67% rename from worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/SimplexPatternParser.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/pattern/SimplexPatternParser.java index d408c031f..1f5fe17c1 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/SimplexPatternParser.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/pattern/SimplexPatternParser.java @@ -1,7 +1,7 @@ -package com.sk89q.worldedit.extension.factory.parser.pattern; +package com.fastasyncworldedit.core.extension.factory.parser.pattern; import com.sk89q.worldedit.WorldEdit; -import com.sk89q.worldedit.math.noise.SimplexNoiseGenerator; +import com.fastasyncworldedit.core.math.random.SimplexNoiseGenerator; public class SimplexPatternParser extends NoisePatternParser { private static final String SIMPLEX_NAME = "simplex"; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/VoronoiPatternParser.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/pattern/VoronoiPatternParser.java similarity index 86% rename from worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/VoronoiPatternParser.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/pattern/VoronoiPatternParser.java index 5afbf53fd..9cc3b185d 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/VoronoiPatternParser.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/pattern/VoronoiPatternParser.java @@ -1,4 +1,4 @@ -package com.sk89q.worldedit.extension.factory.parser.pattern; +package com.fastasyncworldedit.core.extension.factory.parser.pattern; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.math.noise.VoronoiNoise; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/binding/Binding.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/platform/binding/Binding.java similarity index 74% rename from worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/binding/Binding.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/platform/binding/Binding.java index f6a27e276..c40c6aabe 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/binding/Binding.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/platform/binding/Binding.java @@ -1,4 +1,4 @@ -package com.sk89q.worldedit.extension.platform.binding; +package com.fastasyncworldedit.core.extension.platform.binding; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/binding/Bindings.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/platform/binding/Bindings.java similarity index 98% rename from worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/binding/Bindings.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/platform/binding/Bindings.java index bf18cc3c6..c383cc82d 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/binding/Bindings.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/platform/binding/Bindings.java @@ -1,4 +1,4 @@ -package com.sk89q.worldedit.extension.platform.binding; +package com.fastasyncworldedit.core.extension.platform.binding; import com.fastasyncworldedit.core.util.StringMan; import com.sk89q.worldedit.WorldEdit; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/binding/CommandBindings.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/platform/binding/CommandBindings.java similarity index 72% rename from worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/binding/CommandBindings.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/platform/binding/CommandBindings.java index 54dfbc5d5..fa359fb48 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/binding/CommandBindings.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/platform/binding/CommandBindings.java @@ -1,4 +1,4 @@ -package com.sk89q.worldedit.extension.platform.binding; +package com.fastasyncworldedit.core.extension.platform.binding; import com.sk89q.worldedit.WorldEdit; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/binding/ConsumeBindings.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/platform/binding/ConsumeBindings.java similarity index 98% rename from worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/binding/ConsumeBindings.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/platform/binding/ConsumeBindings.java index 4150967b0..bf13f657b 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/binding/ConsumeBindings.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/platform/binding/ConsumeBindings.java @@ -1,4 +1,4 @@ -package com.sk89q.worldedit.extension.platform.binding; +package com.fastasyncworldedit.core.extension.platform.binding; import com.fastasyncworldedit.core.Fawe; import com.fastasyncworldedit.core.configuration.Caption; @@ -14,7 +14,7 @@ import com.sk89q.worldedit.extension.platform.Actor; import com.sk89q.worldedit.extension.platform.PlatformCommandManager; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.internal.annotation.Selection; -import com.sk89q.worldedit.internal.annotation.Time; +import com.sk89q.worldedit.command.util.annotation.Time; import com.sk89q.worldedit.internal.expression.Expression; import com.sk89q.worldedit.math.BlockVector2; import com.sk89q.worldedit.math.BlockVector3; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/binding/PrimitiveBindings.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/platform/binding/PrimitiveBindings.java similarity index 99% rename from worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/binding/PrimitiveBindings.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/platform/binding/PrimitiveBindings.java index 6110cdd30..8d4859bbc 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/binding/PrimitiveBindings.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/platform/binding/PrimitiveBindings.java @@ -1,4 +1,4 @@ -package com.sk89q.worldedit.extension.platform.binding; +package com.fastasyncworldedit.core.extension.platform.binding; import com.fastasyncworldedit.core.configuration.Caption; import com.sk89q.worldedit.WorldEdit; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/binding/ProvideBindings.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/platform/binding/ProvideBindings.java similarity index 97% rename from worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/binding/ProvideBindings.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/platform/binding/ProvideBindings.java index 933ba7883..009658dbd 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/binding/ProvideBindings.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/platform/binding/ProvideBindings.java @@ -1,4 +1,4 @@ -package com.sk89q.worldedit.extension.platform.binding; +package com.fastasyncworldedit.core.extension.platform.binding; import com.fastasyncworldedit.core.configuration.Caption; import com.fastasyncworldedit.core.database.DBHandler; @@ -14,7 +14,7 @@ import com.sk89q.worldedit.entity.Player; import com.sk89q.worldedit.extension.input.InputParseException; import com.sk89q.worldedit.extension.platform.Actor; import com.sk89q.worldedit.extent.Extent; -import com.sk89q.worldedit.internal.annotation.AllowedRegion; +import com.sk89q.worldedit.command.util.annotation.AllowedRegion; import com.sk89q.worldedit.internal.annotation.Selection; import com.sk89q.worldedit.regions.Region; import com.sk89q.worldedit.session.request.Request; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/BlockTranslateExtent.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/BlockTranslateExtent.java similarity index 95% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/BlockTranslateExtent.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/BlockTranslateExtent.java index 609c90461..977d8c19e 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/BlockTranslateExtent.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/BlockTranslateExtent.java @@ -1,10 +1,10 @@ -package com.fastasyncworldedit.core.object.extent; +package com.fastasyncworldedit.core.extent; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extent.AbstractDelegateExtent; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.math.BlockVector3; -import com.sk89q.worldedit.math.MutableBlockVector3; +import com.fastasyncworldedit.core.math.MutableBlockVector3; import com.sk89q.worldedit.world.biome.BiomeType; import com.sk89q.worldedit.world.block.BaseBlock; import com.sk89q.worldedit.world.block.BlockState; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/ExtentHeightCacher.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/ExtentHeightCacher.java similarity index 93% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/ExtentHeightCacher.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/ExtentHeightCacher.java index 135a31a11..a2b98d4be 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/ExtentHeightCacher.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/ExtentHeightCacher.java @@ -1,7 +1,6 @@ -package com.fastasyncworldedit.core.object.extent; +package com.fastasyncworldedit.core.extent; import com.sk89q.worldedit.extent.Extent; -import com.sk89q.worldedit.extent.PassthroughExtent; import java.util.Arrays; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/FaweRegionExtent.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/FaweRegionExtent.java similarity index 96% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/FaweRegionExtent.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/FaweRegionExtent.java index 088d8a854..4382f7d37 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/FaweRegionExtent.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/FaweRegionExtent.java @@ -1,8 +1,8 @@ -package com.fastasyncworldedit.core.object.extent; +package com.fastasyncworldedit.core.extent; import com.fastasyncworldedit.core.FaweCache; -import com.fastasyncworldedit.core.beta.IBatchProcessor; -import com.fastasyncworldedit.core.beta.implementation.processors.ProcessorScope; +import com.fastasyncworldedit.core.queue.IBatchProcessor; +import com.fastasyncworldedit.core.extent.processor.ProcessorScope; import com.fastasyncworldedit.core.object.FaweLimit; import com.fastasyncworldedit.core.util.ExtentTraverser; import com.fastasyncworldedit.core.util.WEManager; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/HeightBoundExtent.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/HeightBoundExtent.java similarity index 85% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/HeightBoundExtent.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/HeightBoundExtent.java index 6cae172c6..1e13912c3 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/HeightBoundExtent.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/HeightBoundExtent.java @@ -1,10 +1,10 @@ -package com.fastasyncworldedit.core.object.extent; +package com.fastasyncworldedit.core.extent; -import com.fastasyncworldedit.core.beta.IChunk; -import com.fastasyncworldedit.core.beta.IChunkGet; -import com.fastasyncworldedit.core.beta.IChunkSet; +import com.fastasyncworldedit.core.queue.IChunk; +import com.fastasyncworldedit.core.queue.IChunkGet; +import com.fastasyncworldedit.core.queue.IChunkSet; import com.fastasyncworldedit.core.object.FaweLimit; -import com.fastasyncworldedit.core.object.RegionWrapper; +import com.fastasyncworldedit.core.regions.RegionWrapper; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.regions.Region; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/HistoryExtent.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/HistoryExtent.java similarity index 97% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/HistoryExtent.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/HistoryExtent.java index 87402445f..ce6f7265b 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/HistoryExtent.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/HistoryExtent.java @@ -1,6 +1,6 @@ -package com.fastasyncworldedit.core.object; +package com.fastasyncworldedit.core.extent; -import com.fastasyncworldedit.core.object.changeset.AbstractChangeSet; +import com.fastasyncworldedit.core.history.changeset.AbstractChangeSet; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.entity.BaseEntity; import com.sk89q.worldedit.entity.Entity; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/MemoryCheckingExtent.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/MemoryCheckingExtent.java similarity index 91% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/MemoryCheckingExtent.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/MemoryCheckingExtent.java index 8191cca1f..1114a67d7 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/MemoryCheckingExtent.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/MemoryCheckingExtent.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.extent; +package com.fastasyncworldedit.core.extent; import com.fastasyncworldedit.core.FaweCache; import com.fastasyncworldedit.core.configuration.Caption; @@ -7,7 +7,6 @@ import com.fastasyncworldedit.core.util.Permission; import com.fastasyncworldedit.core.util.WEManager; import com.sk89q.worldedit.entity.Player; import com.sk89q.worldedit.extent.Extent; -import com.sk89q.worldedit.extent.PassthroughExtent; public class MemoryCheckingExtent extends PassthroughExtent { diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/MultiRegionExtent.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/MultiRegionExtent.java similarity index 92% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/MultiRegionExtent.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/MultiRegionExtent.java index 6a3fa5cf5..f74af24d9 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/MultiRegionExtent.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/MultiRegionExtent.java @@ -1,8 +1,8 @@ -package com.fastasyncworldedit.core.object.extent; +package com.fastasyncworldedit.core.extent; -import com.fastasyncworldedit.core.beta.IChunk; -import com.fastasyncworldedit.core.beta.IChunkGet; -import com.fastasyncworldedit.core.beta.IChunkSet; +import com.fastasyncworldedit.core.queue.IChunk; +import com.fastasyncworldedit.core.queue.IChunkGet; +import com.fastasyncworldedit.core.queue.IChunkSet; import com.fastasyncworldedit.core.object.FaweLimit; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.regions.Region; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/NullExtent.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/NullExtent.java similarity index 94% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/NullExtent.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/NullExtent.java index 9981eccb9..98b1384a9 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/NullExtent.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/NullExtent.java @@ -1,13 +1,13 @@ -package com.fastasyncworldedit.core.object.extent; +package com.fastasyncworldedit.core.extent; import com.fastasyncworldedit.core.FaweCache; -import com.fastasyncworldedit.core.beta.IBatchProcessor; -import com.fastasyncworldedit.core.beta.IChunk; -import com.fastasyncworldedit.core.beta.IChunkGet; -import com.fastasyncworldedit.core.beta.IChunkSet; -import com.fastasyncworldedit.core.beta.implementation.processors.ProcessorScope; +import com.fastasyncworldedit.core.queue.IBatchProcessor; +import com.fastasyncworldedit.core.queue.IChunk; +import com.fastasyncworldedit.core.queue.IChunkGet; +import com.fastasyncworldedit.core.queue.IChunkSet; +import com.fastasyncworldedit.core.extent.processor.ProcessorScope; import com.fastasyncworldedit.core.object.FaweLimit; -import com.fastasyncworldedit.core.object.exception.FaweException; +import com.fastasyncworldedit.core.internal.exception.FaweException; import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.MaxChangedBlocksException; import com.sk89q.worldedit.WorldEditException; @@ -15,8 +15,8 @@ import com.sk89q.worldedit.entity.BaseEntity; import com.sk89q.worldedit.entity.Entity; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.extent.clipboard.BlockArrayClipboard; -import com.sk89q.worldedit.function.generator.GenBase; -import com.sk89q.worldedit.function.generator.Resource; +import com.fastasyncworldedit.core.function.generator.GenBase; +import com.fastasyncworldedit.core.function.generator.Resource; import com.sk89q.worldedit.function.mask.Mask; import com.sk89q.worldedit.function.operation.Operation; import com.sk89q.worldedit.function.pattern.Pattern; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/OffsetExtent.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/OffsetExtent.java similarity index 96% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/OffsetExtent.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/OffsetExtent.java index 95a76f2ef..165c783b4 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/OffsetExtent.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/OffsetExtent.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.extent; +package com.fastasyncworldedit.core.extent; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extent.Extent; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/PassthroughExtent.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/PassthroughExtent.java similarity index 96% rename from worldedit-core/src/main/java/com/sk89q/worldedit/extent/PassthroughExtent.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/PassthroughExtent.java index 7f3155997..b088710ca 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/PassthroughExtent.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/PassthroughExtent.java @@ -1,12 +1,14 @@ -package com.sk89q.worldedit.extent; +package com.fastasyncworldedit.core.extent; -import com.fastasyncworldedit.core.beta.Filter; +import com.fastasyncworldedit.core.queue.Filter; import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.MaxChangedBlocksException; import com.sk89q.worldedit.WorldEditException; +import com.sk89q.worldedit.extent.AbstractDelegateExtent; +import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.extent.clipboard.Clipboard; -import com.sk89q.worldedit.function.generator.GenBase; -import com.sk89q.worldedit.function.generator.Resource; +import com.fastasyncworldedit.core.function.generator.GenBase; +import com.fastasyncworldedit.core.function.generator.Resource; import com.sk89q.worldedit.function.mask.Mask; import com.sk89q.worldedit.function.operation.Operation; import com.sk89q.worldedit.function.pattern.Pattern; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/PositionTransformExtent.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/PositionTransformExtent.java similarity index 94% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/PositionTransformExtent.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/PositionTransformExtent.java index 6ec74f6ad..77c50db98 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/PositionTransformExtent.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/PositionTransformExtent.java @@ -1,10 +1,10 @@ -package com.fastasyncworldedit.core.object.extent; +package com.fastasyncworldedit.core.extent; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.math.BlockVector3; -import com.sk89q.worldedit.math.MutableBlockVector3; -import com.sk89q.worldedit.math.MutableVector3; +import com.fastasyncworldedit.core.math.MutableBlockVector3; +import com.fastasyncworldedit.core.math.MutableVector3; import com.sk89q.worldedit.math.transform.Transform; import com.sk89q.worldedit.world.biome.BiomeType; import com.sk89q.worldedit.world.block.BaseBlock; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/ProcessedWEExtent.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/ProcessedWEExtent.java similarity index 98% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/ProcessedWEExtent.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/ProcessedWEExtent.java index aa144a437..95617a5ee 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/ProcessedWEExtent.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/ProcessedWEExtent.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.extent; +package com.fastasyncworldedit.core.extent; import com.fastasyncworldedit.core.FaweCache; import com.fastasyncworldedit.core.object.FaweLimit; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/RandomOffsetTransform.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/RandomOffsetTransform.java similarity index 97% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/RandomOffsetTransform.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/RandomOffsetTransform.java index 3b0c27caa..f13c8f2eb 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/RandomOffsetTransform.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/RandomOffsetTransform.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.extent; +package com.fastasyncworldedit.core.extent; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extent.Extent; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/ResettableExtent.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/ResettableExtent.java similarity index 97% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/ResettableExtent.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/ResettableExtent.java index dd2b1b141..50f19a99a 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/ResettableExtent.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/ResettableExtent.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.extent; +package com.fastasyncworldedit.core.extent; import com.fastasyncworldedit.core.util.ExtentTraverser; import com.fastasyncworldedit.core.util.ReflectionUtils; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/SingleRegionExtent.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/SingleRegionExtent.java similarity index 86% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/SingleRegionExtent.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/SingleRegionExtent.java index cd763c3a8..2a848305c 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/SingleRegionExtent.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/SingleRegionExtent.java @@ -1,8 +1,8 @@ -package com.fastasyncworldedit.core.object.extent; +package com.fastasyncworldedit.core.extent; -import com.fastasyncworldedit.core.beta.IChunk; -import com.fastasyncworldedit.core.beta.IChunkGet; -import com.fastasyncworldedit.core.beta.IChunkSet; +import com.fastasyncworldedit.core.queue.IChunk; +import com.fastasyncworldedit.core.queue.IChunkGet; +import com.fastasyncworldedit.core.queue.IChunkSet; import com.fastasyncworldedit.core.object.FaweLimit; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.regions.Region; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/SlowExtent.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/SlowExtent.java similarity index 95% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/SlowExtent.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/SlowExtent.java index dec8429e5..4e83befd0 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/SlowExtent.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/SlowExtent.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.extent; +package com.fastasyncworldedit.core.extent; import com.fastasyncworldedit.core.Fawe; import com.sk89q.worldedit.WorldEditException; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/SourceMaskExtent.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/SourceMaskExtent.java similarity index 93% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/SourceMaskExtent.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/SourceMaskExtent.java index 5ff3e7fb9..53589b5f6 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/SourceMaskExtent.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/SourceMaskExtent.java @@ -1,10 +1,10 @@ -package com.fastasyncworldedit.core.object.extent; +package com.fastasyncworldedit.core.extent; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.function.mask.Mask; import com.sk89q.worldedit.math.BlockVector3; -import com.sk89q.worldedit.math.MutableBlockVector3; +import com.fastasyncworldedit.core.math.MutableBlockVector3; import com.sk89q.worldedit.world.block.BlockStateHolder; import static com.google.common.base.Preconditions.checkNotNull; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/StripNBTExtent.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/StripNBTExtent.java similarity index 97% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/StripNBTExtent.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/StripNBTExtent.java index c48cc469b..e01ee063c 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/StripNBTExtent.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/StripNBTExtent.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.extent; +package com.fastasyncworldedit.core.extent; import com.sk89q.jnbt.CompoundTag; import com.sk89q.jnbt.Tag; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/SupplyingExtent.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/SupplyingExtent.java similarity index 83% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/SupplyingExtent.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/SupplyingExtent.java index c944b5300..3be2937ee 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/SupplyingExtent.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/SupplyingExtent.java @@ -1,7 +1,6 @@ -package com.fastasyncworldedit.core.object.extent; +package com.fastasyncworldedit.core.extent; import com.sk89q.worldedit.extent.Extent; -import com.sk89q.worldedit.extent.PassthroughExtent; import java.util.function.Supplier; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/TemporalExtent.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/TemporalExtent.java similarity index 95% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/TemporalExtent.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/TemporalExtent.java index c0aff255e..41953d966 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/TemporalExtent.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/TemporalExtent.java @@ -1,7 +1,6 @@ -package com.fastasyncworldedit.core.object.extent; +package com.fastasyncworldedit.core.extent; import com.sk89q.worldedit.extent.Extent; -import com.sk89q.worldedit.extent.PassthroughExtent; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.world.biome.BiomeType; import com.sk89q.worldedit.world.block.BaseBlock; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/TransformExtent.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/TransformExtent.java similarity index 95% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/TransformExtent.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/TransformExtent.java index 42ca894b9..057c6ce27 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/TransformExtent.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/TransformExtent.java @@ -1,11 +1,11 @@ -package com.fastasyncworldedit.core.object.extent; +package com.fastasyncworldedit.core.extent; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.extent.transform.BlockTransformExtent; import com.sk89q.worldedit.math.BlockVector3; -import com.sk89q.worldedit.math.MutableBlockVector3; -import com.sk89q.worldedit.math.MutableVector3; +import com.fastasyncworldedit.core.math.MutableBlockVector3; +import com.fastasyncworldedit.core.math.MutableVector3; import com.sk89q.worldedit.math.Vector3; import com.sk89q.worldedit.world.biome.BiomeType; import com.sk89q.worldedit.world.block.BaseBlock; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/clipboard/CPUOptimizedClipboard.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/CPUOptimizedClipboard.java similarity index 98% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/clipboard/CPUOptimizedClipboard.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/CPUOptimizedClipboard.java index dd5770c3e..ccfba4f6e 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/clipboard/CPUOptimizedClipboard.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/CPUOptimizedClipboard.java @@ -1,7 +1,7 @@ -package com.fastasyncworldedit.core.object.clipboard; +package com.fastasyncworldedit.core.extent.clipboard; import com.fastasyncworldedit.core.jnbt.streamer.IntValueReader; -import com.fastasyncworldedit.core.object.IntTriple; +import com.fastasyncworldedit.core.math.IntTriple; import com.sk89q.jnbt.CompoundTag; import com.sk89q.jnbt.IntTag; import com.sk89q.jnbt.Tag; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/clipboard/DiskOptimizedClipboard.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/DiskOptimizedClipboard.java similarity index 99% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/clipboard/DiskOptimizedClipboard.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/DiskOptimizedClipboard.java index 012b8def8..5c282af12 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/clipboard/DiskOptimizedClipboard.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/DiskOptimizedClipboard.java @@ -1,9 +1,9 @@ -package com.fastasyncworldedit.core.object.clipboard; +package com.fastasyncworldedit.core.extent.clipboard; import com.fastasyncworldedit.core.Fawe; import com.fastasyncworldedit.core.configuration.Settings; import com.fastasyncworldedit.core.jnbt.streamer.IntValueReader; -import com.fastasyncworldedit.core.object.IntTriple; +import com.fastasyncworldedit.core.math.IntTriple; import com.fastasyncworldedit.core.util.MainUtil; import com.fastasyncworldedit.core.util.UnsafeUtility; import com.sk89q.jnbt.CompoundTag; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/clipboard/EmptyClipboard.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/EmptyClipboard.java similarity index 95% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/clipboard/EmptyClipboard.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/EmptyClipboard.java index 6c4917dec..26e57b414 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/clipboard/EmptyClipboard.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/EmptyClipboard.java @@ -1,6 +1,6 @@ -package com.fastasyncworldedit.core.object.clipboard; +package com.fastasyncworldedit.core.extent.clipboard; -import com.fastasyncworldedit.core.beta.implementation.lighting.HeightMapType; +import com.fastasyncworldedit.core.extent.processor.heightmap.HeightMapType; import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.entity.Entity; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/clipboard/LazyClipboardHolder.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/LazyClipboardHolder.java similarity index 97% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/clipboard/LazyClipboardHolder.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/LazyClipboardHolder.java index 7c2ed2af3..508af1efd 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/clipboard/LazyClipboardHolder.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/LazyClipboardHolder.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.clipboard; +package com.fastasyncworldedit.core.extent.clipboard; import com.google.common.io.ByteSource; import com.sk89q.worldedit.extent.clipboard.BlockArrayClipboard; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/clipboard/LinearClipboard.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/LinearClipboard.java similarity index 95% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/clipboard/LinearClipboard.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/LinearClipboard.java index 8ee9e8c90..d0854837a 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/clipboard/LinearClipboard.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/LinearClipboard.java @@ -1,12 +1,12 @@ -package com.fastasyncworldedit.core.object.clipboard; +package com.fastasyncworldedit.core.extent.clipboard; -import com.fastasyncworldedit.core.beta.implementation.filter.block.AbstractFilterBlock; +import com.fastasyncworldedit.core.extent.filter.block.AbstractFilterBlock; import com.fastasyncworldedit.core.jnbt.streamer.IntValueReader; import com.google.common.collect.ForwardingIterator; import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.extent.clipboard.BlockArrayClipboard.ClipboardEntity; -import com.sk89q.worldedit.function.visitor.Order; +import com.fastasyncworldedit.core.function.visitor.Order; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.regions.CuboidRegion; import com.sk89q.worldedit.regions.Region; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/clipboard/MemoryOptimizedClipboard.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/MemoryOptimizedClipboard.java similarity index 98% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/clipboard/MemoryOptimizedClipboard.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/MemoryOptimizedClipboard.java index c7d061a0e..6836c9790 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/clipboard/MemoryOptimizedClipboard.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/MemoryOptimizedClipboard.java @@ -1,8 +1,8 @@ -package com.fastasyncworldedit.core.object.clipboard; +package com.fastasyncworldedit.core.extent.clipboard; import com.fastasyncworldedit.core.configuration.Settings; import com.fastasyncworldedit.core.jnbt.streamer.IntValueReader; -import com.fastasyncworldedit.core.object.IntTriple; +import com.fastasyncworldedit.core.math.IntTriple; import com.fastasyncworldedit.core.util.MainUtil; import com.sk89q.jnbt.CompoundTag; import com.sk89q.jnbt.IntTag; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/clipboard/MultiClipboardHolder.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/MultiClipboardHolder.java similarity index 98% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/clipboard/MultiClipboardHolder.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/MultiClipboardHolder.java index 598d3a974..9f83a4a89 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/clipboard/MultiClipboardHolder.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/MultiClipboardHolder.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.clipboard; +package com.fastasyncworldedit.core.extent.clipboard; import com.sk89q.worldedit.extent.clipboard.Clipboard; import com.sk89q.worldedit.session.ClipboardHolder; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/clipboard/ReadOnlyClipboard.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/ReadOnlyClipboard.java similarity index 98% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/clipboard/ReadOnlyClipboard.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/ReadOnlyClipboard.java index af29eecd6..801cae39c 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/clipboard/ReadOnlyClipboard.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/ReadOnlyClipboard.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.clipboard; +package com.fastasyncworldedit.core.extent.clipboard; import com.fastasyncworldedit.core.Fawe; import com.sk89q.jnbt.CompoundTag; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/clipboard/ResizableClipboardBuilder.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/ResizableClipboardBuilder.java similarity index 91% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/clipboard/ResizableClipboardBuilder.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/ResizableClipboardBuilder.java index 0510d6ed4..b32216070 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/clipboard/ResizableClipboardBuilder.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/ResizableClipboardBuilder.java @@ -1,8 +1,8 @@ -package com.fastasyncworldedit.core.object.clipboard; +package com.fastasyncworldedit.core.extent.clipboard; -import com.fastasyncworldedit.core.object.change.MutableBlockChange; -import com.fastasyncworldedit.core.object.change.MutableTileChange; -import com.fastasyncworldedit.core.object.changeset.MemoryOptimizedHistory; +import com.fastasyncworldedit.core.history.change.MutableBlockChange; +import com.fastasyncworldedit.core.history.change.MutableTileChange; +import com.fastasyncworldedit.core.history.MemoryOptimizedHistory; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extent.clipboard.BlockArrayClipboard; import com.sk89q.worldedit.extent.clipboard.Clipboard; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/clipboard/SimpleClipboard.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/SimpleClipboard.java similarity index 97% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/clipboard/SimpleClipboard.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/SimpleClipboard.java index 0410743c4..94956c161 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/clipboard/SimpleClipboard.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/SimpleClipboard.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.clipboard; +package com.fastasyncworldedit.core.extent.clipboard; import com.sk89q.worldedit.extent.clipboard.Clipboard; import com.sk89q.worldedit.math.BlockVector3; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/clipboard/URIClipboardHolder.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/URIClipboardHolder.java similarity index 95% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/clipboard/URIClipboardHolder.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/URIClipboardHolder.java index 1f6486b37..a3bd02bb0 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/clipboard/URIClipboardHolder.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/URIClipboardHolder.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.clipboard; +package com.fastasyncworldedit.core.extent.clipboard; import com.sk89q.worldedit.extent.clipboard.Clipboard; import com.sk89q.worldedit.session.ClipboardHolder; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/clipboard/WorldCopyClipboard.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/WorldCopyClipboard.java similarity index 97% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/clipboard/WorldCopyClipboard.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/WorldCopyClipboard.java index 3610dfc13..cdd4ae8df 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/clipboard/WorldCopyClipboard.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/WorldCopyClipboard.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.clipboard; +package com.fastasyncworldedit.core.extent.clipboard; import com.sk89q.worldedit.entity.Entity; import com.sk89q.worldedit.extent.Extent; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/FastSchematicReader.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/io/FastSchematicReader.java similarity index 93% rename from worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/FastSchematicReader.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/io/FastSchematicReader.java index 9f10aa19e..f637f8cbb 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/FastSchematicReader.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/io/FastSchematicReader.java @@ -1,32 +1,13 @@ -/* - * WorldEdit, a Minecraft world manipulation toolkit - * Copyright (C) sk89q - * Copyright (C) WorldEdit team and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.sk89q.worldedit.extent.clipboard.io; +package com.fastasyncworldedit.core.extent.clipboard.io; import com.fastasyncworldedit.core.FaweCache; import com.fastasyncworldedit.core.jnbt.streamer.StreamDelegate; import com.fastasyncworldedit.core.jnbt.streamer.ValueReader; -import com.fastasyncworldedit.core.object.FaweInputStream; -import com.fastasyncworldedit.core.object.FaweOutputStream; -import com.fastasyncworldedit.core.object.clipboard.LinearClipboard; -import com.fastasyncworldedit.core.object.io.FastByteArrayOutputStream; -import com.fastasyncworldedit.core.object.io.FastByteArraysInputStream; +import com.fastasyncworldedit.core.internal.io.FaweInputStream; +import com.fastasyncworldedit.core.internal.io.FaweOutputStream; +import com.fastasyncworldedit.core.extent.clipboard.LinearClipboard; +import com.fastasyncworldedit.core.internal.io.FastByteArrayOutputStream; +import com.fastasyncworldedit.core.internal.io.FastByteArraysInputStream; import com.sk89q.jnbt.AdventureNBTConverter; import com.sk89q.jnbt.CompoundTag; import com.sk89q.jnbt.IntTag; @@ -40,6 +21,7 @@ import com.sk89q.worldedit.extension.input.InputParseException; import com.sk89q.worldedit.extension.platform.Capability; import com.sk89q.worldedit.extent.clipboard.BlockArrayClipboard; import com.sk89q.worldedit.extent.clipboard.Clipboard; +import com.sk89q.worldedit.extent.clipboard.io.NBTSchematicReader; import com.sk89q.worldedit.internal.Constants; import com.sk89q.worldedit.internal.util.LogManagerCompat; import com.sk89q.worldedit.math.BlockVector3; @@ -75,7 +57,7 @@ public class FastSchematicReader extends NBTSchematicReader { private static final Logger LOGGER = LogManagerCompat.getLogger(); private final NBTInputStream inputStream; - private DataFixer fixer; + private final DataFixer fixer; private int dataVersion = -1; private int version = -1; private int faweWritten = -1; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/FastSchematicWriter.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/io/FastSchematicWriter.java similarity index 92% rename from worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/FastSchematicWriter.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/io/FastSchematicWriter.java index 322b620f5..b8c02d12a 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/FastSchematicWriter.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/io/FastSchematicWriter.java @@ -1,27 +1,8 @@ -/* - * WorldEdit, a Minecraft world manipulation toolkit - * Copyright (C) sk89q - * Copyright (C) WorldEdit team and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.sk89q.worldedit.extent.clipboard.io; +package com.fastasyncworldedit.core.extent.clipboard.io; import com.fastasyncworldedit.core.Fawe; import com.fastasyncworldedit.core.jnbt.streamer.IntValueReader; -import com.fastasyncworldedit.core.object.FaweOutputStream; +import com.fastasyncworldedit.core.internal.io.FaweOutputStream; import com.fastasyncworldedit.core.util.IOUtil; import com.sk89q.jnbt.CompoundTag; import com.sk89q.jnbt.IntArrayTag; @@ -36,7 +17,8 @@ import com.sk89q.worldedit.entity.Entity; import com.sk89q.worldedit.extension.platform.Capability; import com.sk89q.worldedit.extent.clipboard.BlockArrayClipboard; import com.sk89q.worldedit.extent.clipboard.Clipboard; -import com.sk89q.worldedit.function.visitor.Order; +import com.sk89q.worldedit.extent.clipboard.io.ClipboardWriter; +import com.fastasyncworldedit.core.function.visitor.Order; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.regions.Region; import com.sk89q.worldedit.util.Location; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/schematic/MinecraftStructure.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/io/schematic/MinecraftStructure.java similarity index 98% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/schematic/MinecraftStructure.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/io/schematic/MinecraftStructure.java index dd859eaa6..403c8399d 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/schematic/MinecraftStructure.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/io/schematic/MinecraftStructure.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.schematic; +package com.fastasyncworldedit.core.extent.clipboard.io.schematic; import com.fastasyncworldedit.core.FaweCache; import com.sk89q.jnbt.CompoundTag; @@ -17,7 +17,7 @@ import com.sk89q.worldedit.extent.clipboard.io.ClipboardReader; import com.sk89q.worldedit.extent.clipboard.io.ClipboardWriter; import com.sk89q.worldedit.internal.util.LogManagerCompat; import com.sk89q.worldedit.math.BlockVector3; -import com.sk89q.worldedit.math.MutableBlockVector3; +import com.fastasyncworldedit.core.math.MutableBlockVector3; import com.sk89q.worldedit.regions.CuboidRegion; import com.sk89q.worldedit.regions.Region; import com.sk89q.worldedit.registry.state.AbstractProperty; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/schematic/PNGWriter.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/io/schematic/PNGWriter.java similarity index 98% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/schematic/PNGWriter.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/io/schematic/PNGWriter.java index 6a21c578e..d14b14353 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/schematic/PNGWriter.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/io/schematic/PNGWriter.java @@ -1,11 +1,11 @@ -package com.fastasyncworldedit.core.object.schematic; +package com.fastasyncworldedit.core.extent.clipboard.io.schematic; import com.fastasyncworldedit.core.Fawe; import com.fastasyncworldedit.core.util.TextureUtil; import com.sk89q.worldedit.extent.clipboard.Clipboard; import com.sk89q.worldedit.extent.clipboard.io.ClipboardWriter; import com.sk89q.worldedit.math.BlockVector3; -import com.sk89q.worldedit.math.MutableBlockVector3; +import com.fastasyncworldedit.core.math.MutableBlockVector3; import com.sk89q.worldedit.regions.Region; import com.sk89q.worldedit.world.block.BlockState; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/schematic/visualizer/SchemVis.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/io/schematic/visualizer/SchemVis.java similarity index 99% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/schematic/visualizer/SchemVis.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/io/schematic/visualizer/SchemVis.java index 93295efae..76674758e 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/schematic/visualizer/SchemVis.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/io/schematic/visualizer/SchemVis.java @@ -1,4 +1,4 @@ -//package com.boydti.fawe.object.schematic.visualizer; +//package com.fastasyncworldedit.core.extent.clipboard.io.schematic.visualizer; // //import com.boydti.fawe.FaweCache; //import com.boydti.fawe.beta.IBlocks; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/ArrayImageMask.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/filter/ArrayImageMask.java similarity index 76% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/ArrayImageMask.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/filter/ArrayImageMask.java index bb1a01092..a9e46a792 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/ArrayImageMask.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/filter/ArrayImageMask.java @@ -1,7 +1,7 @@ -package com.fastasyncworldedit.core.beta.implementation.filter; +package com.fastasyncworldedit.core.extent.filter; -import com.fastasyncworldedit.core.beta.FilterBlockMask; -import com.fastasyncworldedit.core.beta.implementation.filter.block.FilterBlock; +import com.fastasyncworldedit.core.queue.FilterBlockMask; +import com.fastasyncworldedit.core.extent.filter.block.FilterBlock; import java.awt.image.BufferedImage; import java.util.concurrent.ThreadLocalRandom; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/CountFilter.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/filter/CountFilter.java similarity index 79% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/CountFilter.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/filter/CountFilter.java index a0ee6f8a2..375cdb8e3 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/CountFilter.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/filter/CountFilter.java @@ -1,6 +1,6 @@ -package com.fastasyncworldedit.core.beta.implementation.filter; +package com.fastasyncworldedit.core.extent.filter; -import com.fastasyncworldedit.core.beta.implementation.filter.block.FilterBlock; +import com.fastasyncworldedit.core.extent.filter.block.FilterBlock; public class CountFilter extends ForkedFilter { diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/DistrFilter.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/filter/DistrFilter.java similarity index 94% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/DistrFilter.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/filter/DistrFilter.java index 6e4429eb2..681c9b23d 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/DistrFilter.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/filter/DistrFilter.java @@ -1,8 +1,8 @@ -package com.fastasyncworldedit.core.beta.implementation.filter; +package com.fastasyncworldedit.core.extent.filter; -import com.fastasyncworldedit.core.beta.implementation.filter.block.FilterBlock; +import com.fastasyncworldedit.core.extent.filter.block.FilterBlock; import com.sk89q.worldedit.extension.platform.Actor; -import com.sk89q.worldedit.function.mask.ABlockMask; +import com.fastasyncworldedit.core.function.mask.ABlockMask; import com.sk89q.worldedit.util.Countable; import com.sk89q.worldedit.util.formatting.text.TextComponent; import com.sk89q.worldedit.world.block.BlockState; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/ForkedFilter.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/filter/ForkedFilter.java similarity index 89% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/ForkedFilter.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/filter/ForkedFilter.java index acc00b8d9..9bff8deab 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/ForkedFilter.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/filter/ForkedFilter.java @@ -1,6 +1,6 @@ -package com.fastasyncworldedit.core.beta.implementation.filter; +package com.fastasyncworldedit.core.extent.filter; -import com.fastasyncworldedit.core.beta.Filter; +import com.fastasyncworldedit.core.queue.Filter; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/LinkedFilter.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/filter/LinkedFilter.java similarity index 73% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/LinkedFilter.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/filter/LinkedFilter.java index 8db003a6c..776b74da7 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/LinkedFilter.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/filter/LinkedFilter.java @@ -1,8 +1,8 @@ -package com.fastasyncworldedit.core.beta.implementation.filter; +package com.fastasyncworldedit.core.extent.filter; -import com.fastasyncworldedit.core.beta.Filter; -import com.fastasyncworldedit.core.beta.implementation.filter.block.DelegateFilter; -import com.fastasyncworldedit.core.beta.implementation.filter.block.FilterBlock; +import com.fastasyncworldedit.core.queue.Filter; +import com.fastasyncworldedit.core.extent.filter.block.DelegateFilter; +import com.fastasyncworldedit.core.extent.filter.block.FilterBlock; /** * Filter which links two Filters together for single-filter-input operations. diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/MaskFilter.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/filter/MaskFilter.java similarity index 87% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/MaskFilter.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/filter/MaskFilter.java index ea5eac268..bccd3e07f 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/MaskFilter.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/filter/MaskFilter.java @@ -1,8 +1,8 @@ -package com.fastasyncworldedit.core.beta.implementation.filter; +package com.fastasyncworldedit.core.extent.filter; -import com.fastasyncworldedit.core.beta.Filter; -import com.fastasyncworldedit.core.beta.implementation.filter.block.DelegateFilter; -import com.fastasyncworldedit.core.beta.implementation.filter.block.FilterBlock; +import com.fastasyncworldedit.core.queue.Filter; +import com.fastasyncworldedit.core.extent.filter.block.DelegateFilter; +import com.fastasyncworldedit.core.extent.filter.block.FilterBlock; import com.sk89q.worldedit.function.mask.AbstractExtentMask; import com.sk89q.worldedit.function.mask.Mask; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/block/AbstractExtentFilterBlock.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/filter/block/AbstractExtentFilterBlock.java similarity index 83% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/block/AbstractExtentFilterBlock.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/filter/block/AbstractExtentFilterBlock.java index 813888dc8..00110fbdd 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/block/AbstractExtentFilterBlock.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/filter/block/AbstractExtentFilterBlock.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.beta.implementation.filter.block; +package com.fastasyncworldedit.core.extent.filter.block; import com.sk89q.worldedit.extent.Extent; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/block/AbstractFilterBlock.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/filter/block/AbstractFilterBlock.java similarity index 97% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/block/AbstractFilterBlock.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/filter/block/AbstractFilterBlock.java index b6aa81ffb..0c08aa0bc 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/block/AbstractFilterBlock.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/filter/block/AbstractFilterBlock.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.beta.implementation.filter.block; +package com.fastasyncworldedit.core.extent.filter.block; import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.WorldEditException; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/block/AbstractSingleFilterBlock.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/filter/block/AbstractSingleFilterBlock.java similarity index 96% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/block/AbstractSingleFilterBlock.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/filter/block/AbstractSingleFilterBlock.java index 01a6c259e..6e8cf181c 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/block/AbstractSingleFilterBlock.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/filter/block/AbstractSingleFilterBlock.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.beta.implementation.filter.block; +package com.fastasyncworldedit.core.extent.filter.block; import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.WorldEditException; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/block/ArrayFilterBlock.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/filter/block/ArrayFilterBlock.java similarity index 97% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/block/ArrayFilterBlock.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/filter/block/ArrayFilterBlock.java index 9758c8bde..ea117f69a 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/block/ArrayFilterBlock.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/filter/block/ArrayFilterBlock.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.beta.implementation.filter.block; +package com.fastasyncworldedit.core.extent.filter.block; import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.WorldEditException; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/block/CharFilterBlock.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/filter/block/CharFilterBlock.java similarity index 96% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/block/CharFilterBlock.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/filter/block/CharFilterBlock.java index 1e873cec6..919cb32aa 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/block/CharFilterBlock.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/filter/block/CharFilterBlock.java @@ -1,13 +1,13 @@ -package com.fastasyncworldedit.core.beta.implementation.filter.block; +package com.fastasyncworldedit.core.extent.filter.block; import com.fastasyncworldedit.core.FaweCache; -import com.fastasyncworldedit.core.beta.Filter; -import com.fastasyncworldedit.core.beta.FilterBlockMask; -import com.fastasyncworldedit.core.beta.Flood; -import com.fastasyncworldedit.core.beta.IBlocks; -import com.fastasyncworldedit.core.beta.IChunkGet; -import com.fastasyncworldedit.core.beta.IChunkSet; -import com.fastasyncworldedit.core.beta.implementation.blocks.CharGetBlocks; +import com.fastasyncworldedit.core.queue.Filter; +import com.fastasyncworldedit.core.queue.FilterBlockMask; +import com.fastasyncworldedit.core.queue.implementation.Flood; +import com.fastasyncworldedit.core.queue.IBlocks; +import com.fastasyncworldedit.core.queue.IChunkGet; +import com.fastasyncworldedit.core.queue.IChunkSet; +import com.fastasyncworldedit.core.queue.implementation.blocks.CharGetBlocks; import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extent.Extent; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/block/ChunkFilterBlock.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/filter/block/ChunkFilterBlock.java similarity index 85% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/block/ChunkFilterBlock.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/filter/block/ChunkFilterBlock.java index 6a059d960..121bad7f4 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/block/ChunkFilterBlock.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/filter/block/ChunkFilterBlock.java @@ -1,12 +1,12 @@ -package com.fastasyncworldedit.core.beta.implementation.filter.block; +package com.fastasyncworldedit.core.extent.filter.block; -import com.fastasyncworldedit.core.beta.Filter; -import com.fastasyncworldedit.core.beta.FilterBlockMask; -import com.fastasyncworldedit.core.beta.Flood; -import com.fastasyncworldedit.core.beta.IBlocks; -import com.fastasyncworldedit.core.beta.IChunk; -import com.fastasyncworldedit.core.beta.IChunkGet; -import com.fastasyncworldedit.core.beta.IChunkSet; +import com.fastasyncworldedit.core.queue.Filter; +import com.fastasyncworldedit.core.queue.FilterBlockMask; +import com.fastasyncworldedit.core.queue.implementation.Flood; +import com.fastasyncworldedit.core.queue.IBlocks; +import com.fastasyncworldedit.core.queue.IChunk; +import com.fastasyncworldedit.core.queue.IChunkGet; +import com.fastasyncworldedit.core.queue.IChunkSet; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.regions.Region; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/block/DelegateFilter.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/filter/block/DelegateFilter.java similarity index 61% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/block/DelegateFilter.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/filter/block/DelegateFilter.java index f9e033d38..88d10753c 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/block/DelegateFilter.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/filter/block/DelegateFilter.java @@ -1,7 +1,7 @@ -package com.fastasyncworldedit.core.beta.implementation.filter.block; +package com.fastasyncworldedit.core.extent.filter.block; -import com.fastasyncworldedit.core.beta.Filter; -import com.fastasyncworldedit.core.beta.IDelegateFilter; +import com.fastasyncworldedit.core.queue.Filter; +import com.fastasyncworldedit.core.queue.IDelegateFilter; public abstract class DelegateFilter implements IDelegateFilter { @@ -15,4 +15,4 @@ public abstract class DelegateFilter implements IDelegateFilte public final T getParent() { return (T) parent; } -} \ No newline at end of file +} diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/block/ExtentFilterBlock.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/filter/block/ExtentFilterBlock.java similarity index 92% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/block/ExtentFilterBlock.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/filter/block/ExtentFilterBlock.java index 326ac742b..c94119a6d 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/block/ExtentFilterBlock.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/filter/block/ExtentFilterBlock.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.beta.implementation.filter.block; +package com.fastasyncworldedit.core.extent.filter.block; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.math.BlockVector3; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/block/FilterBlock.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/filter/block/FilterBlock.java similarity index 98% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/block/FilterBlock.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/filter/block/FilterBlock.java index 83f254432..3b3e89ebb 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/block/FilterBlock.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/filter/block/FilterBlock.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.beta.implementation.filter.block; +package com.fastasyncworldedit.core.extent.filter.block; import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.WorldEditException; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/block/SingleFilterBlock.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/filter/block/SingleFilterBlock.java similarity index 88% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/block/SingleFilterBlock.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/filter/block/SingleFilterBlock.java index 65e8e764c..899fd3d66 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/block/SingleFilterBlock.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/filter/block/SingleFilterBlock.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.beta.implementation.filter.block; +package com.fastasyncworldedit.core.extent.filter.block; import com.sk89q.worldedit.world.block.BaseBlock; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/inventory/SlottableBlockBag.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/inventory/SlottableBlockBag.java similarity index 83% rename from worldedit-core/src/main/java/com/sk89q/worldedit/extent/inventory/SlottableBlockBag.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/inventory/SlottableBlockBag.java index 410adf328..f3f8940de 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/inventory/SlottableBlockBag.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/inventory/SlottableBlockBag.java @@ -1,4 +1,4 @@ -package com.sk89q.worldedit.extent.inventory; +package com.fastasyncworldedit.core.extent.inventory; import com.sk89q.worldedit.blocks.BaseItem; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/processors/BatchProcessorHolder.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/BatchProcessorHolder.java similarity index 83% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/processors/BatchProcessorHolder.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/BatchProcessorHolder.java index 12d018d0c..55be0618a 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/processors/BatchProcessorHolder.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/BatchProcessorHolder.java @@ -1,9 +1,9 @@ -package com.fastasyncworldedit.core.beta.implementation.processors; +package com.fastasyncworldedit.core.extent.processor; -import com.fastasyncworldedit.core.beta.IBatchProcessor; -import com.fastasyncworldedit.core.beta.IChunk; -import com.fastasyncworldedit.core.beta.IChunkGet; -import com.fastasyncworldedit.core.beta.IChunkSet; +import com.fastasyncworldedit.core.queue.IBatchProcessor; +import com.fastasyncworldedit.core.queue.IChunk; +import com.fastasyncworldedit.core.queue.IChunkGet; +import com.fastasyncworldedit.core.queue.IChunkSet; import java.util.concurrent.Future; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/processors/EmptyBatchProcessor.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/EmptyBatchProcessor.java similarity index 82% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/processors/EmptyBatchProcessor.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/EmptyBatchProcessor.java index dae055df1..42bb8cd13 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/processors/EmptyBatchProcessor.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/EmptyBatchProcessor.java @@ -1,9 +1,9 @@ -package com.fastasyncworldedit.core.beta.implementation.processors; +package com.fastasyncworldedit.core.extent.processor; -import com.fastasyncworldedit.core.beta.IBatchProcessor; -import com.fastasyncworldedit.core.beta.IChunk; -import com.fastasyncworldedit.core.beta.IChunkGet; -import com.fastasyncworldedit.core.beta.IChunkSet; +import com.fastasyncworldedit.core.queue.IBatchProcessor; +import com.fastasyncworldedit.core.queue.IChunk; +import com.fastasyncworldedit.core.queue.IChunkGet; +import com.fastasyncworldedit.core.queue.IChunkSet; import com.sk89q.worldedit.extent.Extent; import org.jetbrains.annotations.NotNull; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/processors/ExtentBatchProcessorHolder.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/ExtentBatchProcessorHolder.java similarity index 81% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/processors/ExtentBatchProcessorHolder.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/ExtentBatchProcessorHolder.java index 77793a4f5..e7938da79 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/processors/ExtentBatchProcessorHolder.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/ExtentBatchProcessorHolder.java @@ -1,8 +1,8 @@ -package com.fastasyncworldedit.core.beta.implementation.processors; +package com.fastasyncworldedit.core.extent.processor; -import com.fastasyncworldedit.core.beta.IBatchProcessor; +import com.fastasyncworldedit.core.queue.IBatchProcessor; import com.fastasyncworldedit.core.configuration.Settings; -import com.fastasyncworldedit.core.object.changeset.AbstractChangeSet; +import com.fastasyncworldedit.core.history.changeset.AbstractChangeSet; import com.sk89q.worldedit.extent.Extent; public abstract class ExtentBatchProcessorHolder extends BatchProcessorHolder implements Extent { diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/processors/HeightmapProcessor.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/HeightmapProcessor.java similarity index 91% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/processors/HeightmapProcessor.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/HeightmapProcessor.java index bac8f1a12..e4956343c 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/processors/HeightmapProcessor.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/HeightmapProcessor.java @@ -1,10 +1,10 @@ -package com.fastasyncworldedit.core.beta.implementation.processors; +package com.fastasyncworldedit.core.extent.processor; -import com.fastasyncworldedit.core.beta.IBatchProcessor; -import com.fastasyncworldedit.core.beta.IChunk; -import com.fastasyncworldedit.core.beta.IChunkGet; -import com.fastasyncworldedit.core.beta.IChunkSet; -import com.fastasyncworldedit.core.beta.implementation.lighting.HeightMapType; +import com.fastasyncworldedit.core.queue.IBatchProcessor; +import com.fastasyncworldedit.core.queue.IChunk; +import com.fastasyncworldedit.core.queue.IChunkGet; +import com.fastasyncworldedit.core.queue.IChunkSet; +import com.fastasyncworldedit.core.extent.processor.heightmap.HeightMapType; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.world.World; import com.sk89q.worldedit.world.block.BlockState; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/processors/IBatchProcessorHolder.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/IBatchProcessorHolder.java similarity index 84% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/processors/IBatchProcessorHolder.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/IBatchProcessorHolder.java index 026027187..0dd75f8b4 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/processors/IBatchProcessorHolder.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/IBatchProcessorHolder.java @@ -1,9 +1,9 @@ -package com.fastasyncworldedit.core.beta.implementation.processors; +package com.fastasyncworldedit.core.extent.processor; -import com.fastasyncworldedit.core.beta.IBatchProcessor; -import com.fastasyncworldedit.core.beta.IChunk; -import com.fastasyncworldedit.core.beta.IChunkGet; -import com.fastasyncworldedit.core.beta.IChunkSet; +import com.fastasyncworldedit.core.queue.IBatchProcessor; +import com.fastasyncworldedit.core.queue.IChunk; +import com.fastasyncworldedit.core.queue.IChunkGet; +import com.fastasyncworldedit.core.queue.IChunkSet; import com.sk89q.worldedit.extent.Extent; import java.util.concurrent.Future; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/processors/LimitExtent.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/LimitExtent.java similarity index 97% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/processors/LimitExtent.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/LimitExtent.java index d4d90bc4b..ff98949f4 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/processors/LimitExtent.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/LimitExtent.java @@ -1,10 +1,10 @@ -package com.fastasyncworldedit.core.beta.implementation.processors; +package com.fastasyncworldedit.core.extent.processor; import com.fastasyncworldedit.core.FaweCache; -import com.fastasyncworldedit.core.beta.Filter; -import com.fastasyncworldedit.core.beta.implementation.filter.block.ExtentFilterBlock; +import com.fastasyncworldedit.core.queue.Filter; +import com.fastasyncworldedit.core.extent.filter.block.ExtentFilterBlock; import com.fastasyncworldedit.core.object.FaweLimit; -import com.fastasyncworldedit.core.object.exception.FaweException; +import com.fastasyncworldedit.core.internal.exception.FaweException; import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.MaxChangedBlocksException; import com.sk89q.worldedit.WorldEditException; @@ -12,8 +12,8 @@ import com.sk89q.worldedit.entity.BaseEntity; import com.sk89q.worldedit.entity.Entity; import com.sk89q.worldedit.extent.AbstractDelegateExtent; import com.sk89q.worldedit.extent.Extent; -import com.sk89q.worldedit.function.generator.GenBase; -import com.sk89q.worldedit.function.generator.Resource; +import com.fastasyncworldedit.core.function.generator.GenBase; +import com.fastasyncworldedit.core.function.generator.Resource; import com.sk89q.worldedit.function.mask.Mask; import com.sk89q.worldedit.function.pattern.Pattern; import com.sk89q.worldedit.math.BlockVector3; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/processors/MultiBatchProcessor.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/MultiBatchProcessor.java similarity index 95% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/processors/MultiBatchProcessor.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/MultiBatchProcessor.java index 793f246d7..84ecc7c28 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/processors/MultiBatchProcessor.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/MultiBatchProcessor.java @@ -1,11 +1,11 @@ -package com.fastasyncworldedit.core.beta.implementation.processors; +package com.fastasyncworldedit.core.extent.processor; import com.fastasyncworldedit.core.FaweCache; -import com.fastasyncworldedit.core.beta.Filter; -import com.fastasyncworldedit.core.beta.IBatchProcessor; -import com.fastasyncworldedit.core.beta.IChunk; -import com.fastasyncworldedit.core.beta.IChunkGet; -import com.fastasyncworldedit.core.beta.IChunkSet; +import com.fastasyncworldedit.core.queue.Filter; +import com.fastasyncworldedit.core.queue.IBatchProcessor; +import com.fastasyncworldedit.core.queue.IChunk; +import com.fastasyncworldedit.core.queue.IChunkGet; +import com.fastasyncworldedit.core.queue.IChunkSet; import com.fastasyncworldedit.core.util.StringMan; import com.google.common.cache.LoadingCache; import com.sk89q.worldedit.extent.Extent; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/processors/NullProcessor.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/NullProcessor.java similarity index 78% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/processors/NullProcessor.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/NullProcessor.java index 776e482e5..9dd296460 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/processors/NullProcessor.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/NullProcessor.java @@ -1,9 +1,9 @@ -package com.fastasyncworldedit.core.beta.implementation.processors; +package com.fastasyncworldedit.core.extent.processor; -import com.fastasyncworldedit.core.beta.IBatchProcessor; -import com.fastasyncworldedit.core.beta.IChunk; -import com.fastasyncworldedit.core.beta.IChunkGet; -import com.fastasyncworldedit.core.beta.IChunkSet; +import com.fastasyncworldedit.core.queue.IBatchProcessor; +import com.fastasyncworldedit.core.queue.IChunk; +import com.fastasyncworldedit.core.queue.IChunkGet; +import com.fastasyncworldedit.core.queue.IChunkSet; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.extent.NullExtent; import org.jetbrains.annotations.NotNull; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/processors/ProcessorScope.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/ProcessorScope.java similarity index 95% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/processors/ProcessorScope.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/ProcessorScope.java index 93c97e91b..4314a0be7 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/processors/ProcessorScope.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/ProcessorScope.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.beta.implementation.processors; +package com.fastasyncworldedit.core.extent.processor; /** * The scope of a processor. diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/heightmap/AbstractDelegateHeightMap.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/heightmap/AbstractDelegateHeightMap.java similarity index 85% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/heightmap/AbstractDelegateHeightMap.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/heightmap/AbstractDelegateHeightMap.java index c174bf4bb..9c3d86b4b 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/heightmap/AbstractDelegateHeightMap.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/heightmap/AbstractDelegateHeightMap.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.brush.heightmap; +package com.fastasyncworldedit.core.extent.processor.heightmap; public class AbstractDelegateHeightMap implements HeightMap { diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/heightmap/ArrayHeightMap.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/heightmap/ArrayHeightMap.java similarity index 93% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/heightmap/ArrayHeightMap.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/heightmap/ArrayHeightMap.java index 16ae614d7..292aff20c 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/heightmap/ArrayHeightMap.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/heightmap/ArrayHeightMap.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.brush.heightmap; +package com.fastasyncworldedit.core.extent.processor.heightmap; public class ArrayHeightMap extends ScalableHeightMap { // The heights diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/heightmap/AverageHeightMapFilter.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/heightmap/AverageHeightMapFilter.java similarity index 95% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/heightmap/AverageHeightMapFilter.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/heightmap/AverageHeightMapFilter.java index 34e7af512..d1e891115 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/heightmap/AverageHeightMapFilter.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/heightmap/AverageHeightMapFilter.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.brush.heightmap; +package com.fastasyncworldedit.core.extent.processor.heightmap; public class AverageHeightMapFilter { private int[] inData; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/heightmap/FlatScalableHeightMap.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/heightmap/FlatScalableHeightMap.java similarity index 85% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/heightmap/FlatScalableHeightMap.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/heightmap/FlatScalableHeightMap.java index 39014cf7a..b1839acff 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/heightmap/FlatScalableHeightMap.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/heightmap/FlatScalableHeightMap.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.brush.heightmap; +package com.fastasyncworldedit.core.extent.processor.heightmap; public class FlatScalableHeightMap extends ScalableHeightMap { public FlatScalableHeightMap() { diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/heightmap/HeightMap.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/heightmap/HeightMap.java similarity index 99% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/heightmap/HeightMap.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/heightmap/HeightMap.java index c344700d0..1f6d28bc2 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/heightmap/HeightMap.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/heightmap/HeightMap.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.brush.heightmap; +package com.fastasyncworldedit.core.extent.processor.heightmap; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.MaxChangedBlocksException; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/lighting/HeightMapType.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/heightmap/HeightMapType.java similarity index 95% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/lighting/HeightMapType.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/heightmap/HeightMapType.java index 75de71f59..ce458a6f5 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/lighting/HeightMapType.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/heightmap/HeightMapType.java @@ -1,7 +1,7 @@ -package com.fastasyncworldedit.core.beta.implementation.lighting; +package com.fastasyncworldedit.core.extent.processor.heightmap; import com.sk89q.worldedit.registry.state.Property; -import com.sk89q.worldedit.registry.state.PropertyKey; +import com.fastasyncworldedit.core.registry.state.PropertyKey; import com.sk89q.worldedit.world.block.BlockCategories; import com.sk89q.worldedit.world.block.BlockState; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/heightmap/RotatableHeightMap.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/heightmap/RotatableHeightMap.java similarity index 86% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/heightmap/RotatableHeightMap.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/heightmap/RotatableHeightMap.java index 0087db2a0..633b02507 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/heightmap/RotatableHeightMap.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/heightmap/RotatableHeightMap.java @@ -1,7 +1,7 @@ -package com.fastasyncworldedit.core.object.brush.heightmap; +package com.fastasyncworldedit.core.extent.processor.heightmap; import com.sk89q.worldedit.math.BlockVector3; -import com.sk89q.worldedit.math.MutableVector3; +import com.fastasyncworldedit.core.math.MutableVector3; import com.sk89q.worldedit.math.transform.AffineTransform; public class RotatableHeightMap extends AbstractDelegateHeightMap { diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/heightmap/ScalableHeightMap.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/heightmap/ScalableHeightMap.java similarity index 95% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/heightmap/ScalableHeightMap.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/heightmap/ScalableHeightMap.java index 1b999487e..f795a8eb7 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/heightmap/ScalableHeightMap.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/heightmap/ScalableHeightMap.java @@ -1,11 +1,11 @@ -package com.fastasyncworldedit.core.object.brush.heightmap; +package com.fastasyncworldedit.core.extent.processor.heightmap; -import com.fastasyncworldedit.core.object.IntPair; +import com.fastasyncworldedit.core.math.IntPair; import com.fastasyncworldedit.core.util.MainUtil; import com.fastasyncworldedit.core.util.MathMan; import com.sk89q.worldedit.extent.clipboard.Clipboard; import com.sk89q.worldedit.math.BlockVector3; -import com.sk89q.worldedit.math.MutableBlockVector3; +import com.fastasyncworldedit.core.math.MutableBlockVector3; import com.sk89q.worldedit.world.block.BlockState; import java.awt.image.BufferedImage; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/lighting/NMSRelighter.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/lighting/NMSRelighter.java similarity index 97% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/lighting/NMSRelighter.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/lighting/NMSRelighter.java index a98fde58e..21e8dfe2c 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/lighting/NMSRelighter.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/lighting/NMSRelighter.java @@ -1,17 +1,15 @@ -package com.fastasyncworldedit.core.beta.implementation.lighting; +package com.fastasyncworldedit.core.extent.processor.lighting; import com.fastasyncworldedit.core.Fawe; -import com.fastasyncworldedit.core.beta.IQueueChunk; -import com.fastasyncworldedit.core.beta.IQueueExtent; -import com.fastasyncworldedit.core.beta.implementation.chunk.ChunkHolder; +import com.fastasyncworldedit.core.queue.IQueueChunk; +import com.fastasyncworldedit.core.queue.IQueueExtent; +import com.fastasyncworldedit.core.queue.implementation.chunk.ChunkHolder; import com.fastasyncworldedit.core.configuration.Settings; -import com.fastasyncworldedit.core.object.RelightMode; -import com.fastasyncworldedit.core.object.RunnableVal; -import com.fastasyncworldedit.core.object.collection.BlockVectorSet; +import com.fastasyncworldedit.core.util.task.RunnableVal; +import com.fastasyncworldedit.core.math.BlockVectorSet; import com.fastasyncworldedit.core.util.MathMan; import com.fastasyncworldedit.core.util.TaskManager; -import com.sk89q.worldedit.internal.util.LogManagerCompat; -import com.sk89q.worldedit.math.MutableBlockVector3; +import com.fastasyncworldedit.core.math.MutableBlockVector3; import com.sk89q.worldedit.registry.state.DirectionalProperty; import com.sk89q.worldedit.registry.state.EnumProperty; import com.sk89q.worldedit.registry.state.Property; @@ -20,7 +18,6 @@ import com.sk89q.worldedit.world.block.BlockState; import com.sk89q.worldedit.world.block.BlockTypes; import com.sk89q.worldedit.world.registry.BlockMaterial; import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap; -import org.apache.logging.log4j.Logger; import java.util.ArrayDeque; import java.util.ArrayList; @@ -39,7 +36,6 @@ import java.util.concurrent.locks.ReentrantLock; public class NMSRelighter implements Relighter { - private static final Logger LOGGER = LogManagerCompat.getLogger(); private static final int DISPATCH_SIZE = 64; private static final DirectionalProperty stairDirection; private static final EnumProperty stairHalf; @@ -58,7 +54,7 @@ public class NMSRelighter implements Relighter { private final Map skyToRelight; private final Object present = new Object(); private final Map chunksToSend; - private final ConcurrentLinkedQueue extentdSkyToRelight = new ConcurrentLinkedQueue<>(); + private final ConcurrentLinkedQueue extendSkyToRelight = new ConcurrentLinkedQueue<>(); private final Map lightQueue; private final AtomicBoolean lightLock = new AtomicBoolean(false); private final ConcurrentHashMap concurrentLightQueue; @@ -84,7 +80,7 @@ public class NMSRelighter implements Relighter { } @Override public boolean isEmpty() { - return skyToRelight.isEmpty() && lightQueue.isEmpty() && extentdSkyToRelight.isEmpty() && concurrentLightQueue.isEmpty(); + return skyToRelight.isEmpty() && lightQueue.isEmpty() && extendSkyToRelight.isEmpty() && concurrentLightQueue.isEmpty(); } @Override @@ -149,7 +145,7 @@ public class NMSRelighter implements Relighter { } public synchronized void clear() { - extentdSkyToRelight.clear(); + extendSkyToRelight.clear(); skyToRelight.clear(); chunksToSend.clear(); lightQueue.clear(); @@ -157,13 +153,13 @@ public class NMSRelighter implements Relighter { public boolean addChunk(int cx, int cz, byte[] fix, int bitmask) { RelightSkyEntry toPut = new RelightSkyEntry(cx, cz, fix, bitmask); - extentdSkyToRelight.add(toPut); + extendSkyToRelight.add(toPut); return true; } private synchronized Map getSkyMap() { RelightSkyEntry entry; - while ((entry = extentdSkyToRelight.poll()) != null) { + while ((entry = extendSkyToRelight.poll()) != null) { long pair = MathMan.pairInt(entry.x, entry.z); RelightSkyEntry existing = skyToRelight.put(pair, entry); if (existing != null) { @@ -242,7 +238,7 @@ public class NMSRelighter implements Relighter { int x = lx + bx; int y = yStart + j; int z = lz + bz; - int oldLevel = iChunk.getEmmittedLight(lx, y, lz); + int oldLevel = iChunk.getEmittedLight(lx, y, lz); int newLevel = iChunk.getBrightness(lx, y, lz); if (oldLevel != newLevel) { iChunk.setBlockLight(lx, y, lz, newLevel); @@ -293,7 +289,7 @@ public class NMSRelighter implements Relighter { if (!iChunk.isInit()) { iChunk.init(queue, node.getX() >> 4, node.getZ() >> 4); } - int lightLevel = iChunk.getEmmittedLight(node.getX() & 15, node.getY(), node.getZ() & 15); + int lightLevel = iChunk.getEmittedLight(node.getX() & 15, node.getY(), node.getZ() & 15); BlockState state = this.queue.getBlock(node.getX(), node.getY(), node.getZ()); String id = state.getBlockType().getId().toLowerCase(Locale.ROOT); if (lightLevel <= 1) { @@ -724,7 +720,7 @@ public class NMSRelighter implements Relighter { if (!iChunk.isInit()) { iChunk.init(this.queue, x >> 4, z >> 4); } - int current = iChunk.getEmmittedLight(x & 15, y, z & 15); + int current = iChunk.getEmittedLight(x & 15, y, z & 15); if (current != 0 && current < currentLight) { iChunk.setBlockLight(x, y, z, 0); if (current > 1) { @@ -758,7 +754,7 @@ public class NMSRelighter implements Relighter { if (!iChunk.isInit()) { iChunk.init(this.queue, x >> 4, z >> 4); } - int current = iChunk.getEmmittedLight(x & 15, y, z & 15); + int current = iChunk.getEmittedLight(x & 15, y, z & 15); if (currentLight > current) { iChunk.setBlockLight(x & 15, y, z & 15, currentLight); mutableBlockPos.setComponents(x, y, z); @@ -831,8 +827,9 @@ public class NMSRelighter implements Relighter { queue.flush(); finished.set(true); } else { - TaskManager.IMP.sync(new RunnableVal() { - @Override public void run(Object value) { + TaskManager.IMP.sync(new RunnableVal<>() { + @Override + public void run(Object value) { queue.flush(); finished.set(true); } @@ -849,7 +846,7 @@ public class NMSRelighter implements Relighter { } public synchronized void sendChunks() { - RunnableVal runnable = new RunnableVal() { + RunnableVal runnable = new RunnableVal<>() { @Override public void run(Object value) { Iterator> iter = chunksToSend.entrySet().iterator(); @@ -973,7 +970,7 @@ public class NMSRelighter implements Relighter { BlockMaterial material = state.getMaterial(); int opacity = material.getLightOpacity(); int brightness = material.getLightValue(); - if (brightness > 0 && brightness != iChunk.getEmmittedLight(x, y, z)) { + if (brightness > 0 && brightness != iChunk.getEmittedLight(x, y, z)) { addLightUpdate(bx + x, y, bz + z); } diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/lighting/NullRelighter.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/lighting/NullRelighter.java similarity index 93% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/lighting/NullRelighter.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/lighting/NullRelighter.java index 2396fbbf0..63ebe2f44 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/lighting/NullRelighter.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/lighting/NullRelighter.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.beta.implementation.lighting; +package com.fastasyncworldedit.core.extent.processor.lighting; import java.util.concurrent.locks.ReentrantLock; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/RelightMode.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/lighting/RelightMode.java similarity index 91% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/RelightMode.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/lighting/RelightMode.java index 8822526c8..a54bb4d58 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/RelightMode.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/lighting/RelightMode.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object; +package com.fastasyncworldedit.core.extent.processor.lighting; import java.util.HashMap; import java.util.Map; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/lighting/RelightProcessor.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/lighting/RelightProcessor.java similarity index 83% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/lighting/RelightProcessor.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/lighting/RelightProcessor.java index 4f3bb2bc6..e4fafa9d3 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/lighting/RelightProcessor.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/lighting/RelightProcessor.java @@ -1,10 +1,10 @@ -package com.fastasyncworldedit.core.beta.implementation.lighting; +package com.fastasyncworldedit.core.extent.processor.lighting; -import com.fastasyncworldedit.core.beta.IBatchProcessor; -import com.fastasyncworldedit.core.beta.IChunk; -import com.fastasyncworldedit.core.beta.IChunkGet; -import com.fastasyncworldedit.core.beta.IChunkSet; -import com.fastasyncworldedit.core.beta.implementation.processors.ProcessorScope; +import com.fastasyncworldedit.core.queue.IBatchProcessor; +import com.fastasyncworldedit.core.queue.IChunk; +import com.fastasyncworldedit.core.queue.IChunkGet; +import com.fastasyncworldedit.core.queue.IChunkSet; +import com.fastasyncworldedit.core.extent.processor.ProcessorScope; import com.fastasyncworldedit.core.configuration.Settings; import com.sk89q.worldedit.extent.Extent; import org.jetbrains.annotations.Nullable; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/lighting/Relighter.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/lighting/Relighter.java similarity index 96% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/lighting/Relighter.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/lighting/Relighter.java index cd9c9cdd8..9ee72350e 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/lighting/Relighter.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/lighting/Relighter.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.beta.implementation.lighting; +package com.fastasyncworldedit.core.extent.processor.lighting; import java.util.concurrent.locks.ReentrantLock; @@ -10,7 +10,7 @@ public interface Relighter extends AutoCloseable { * @param cx chunk x * @param cz chunk z * @param skipReason byte array of {@link SkipReason} for each chunksection in the chunk. Use case? No idea. - * @param bitmask Initial bitmask of the chunk (if being editited beforehand) + * @param bitmask Initial bitmask of the chunk (if being edited beforehand) * @return Was the chunk added */ boolean addChunk(int cx, int cz, byte[] skipReason, int bitmask); diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/lighting/RelighterFactory.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/lighting/RelighterFactory.java similarity index 81% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/lighting/RelighterFactory.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/lighting/RelighterFactory.java index 48f03fab9..28913177e 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/lighting/RelighterFactory.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/lighting/RelighterFactory.java @@ -1,8 +1,7 @@ -package com.fastasyncworldedit.core.beta.implementation.lighting; +package com.fastasyncworldedit.core.extent.processor.lighting; -import com.fastasyncworldedit.core.beta.IQueueChunk; -import com.fastasyncworldedit.core.beta.IQueueExtent; -import com.fastasyncworldedit.core.object.RelightMode; +import com.fastasyncworldedit.core.queue.IQueueChunk; +import com.fastasyncworldedit.core.queue.IQueueExtent; import com.sk89q.worldedit.world.World; import org.jetbrains.annotations.NotNull; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/Linear3DTransform.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/transform/Linear3DTransform.java similarity index 88% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/Linear3DTransform.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/transform/Linear3DTransform.java index f2c007b4a..d8b7db502 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/Linear3DTransform.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/transform/Linear3DTransform.java @@ -1,5 +1,6 @@ -package com.fastasyncworldedit.core.object.extent; +package com.fastasyncworldedit.core.extent.transform; +import com.fastasyncworldedit.core.extent.ResettableExtent; import com.sk89q.worldedit.extent.AbstractDelegateExtent; import com.sk89q.worldedit.extent.Extent; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/LinearTransform.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/transform/LinearTransform.java similarity index 88% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/LinearTransform.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/transform/LinearTransform.java index 55018bdf1..5a469dc5d 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/LinearTransform.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/transform/LinearTransform.java @@ -1,5 +1,6 @@ -package com.fastasyncworldedit.core.object.extent; +package com.fastasyncworldedit.core.extent.transform; +import com.fastasyncworldedit.core.extent.ResettableExtent; import com.sk89q.worldedit.extent.AbstractDelegateExtent; import com.sk89q.worldedit.extent.Extent; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/MultiTransform.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/transform/MultiTransform.java similarity index 95% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/MultiTransform.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/transform/MultiTransform.java index 43e08144c..4a63b9a86 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/MultiTransform.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/transform/MultiTransform.java @@ -1,5 +1,6 @@ -package com.fastasyncworldedit.core.object.extent; +package com.fastasyncworldedit.core.extent.transform; +import com.fastasyncworldedit.core.extent.ResettableExtent; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.entity.BaseEntity; import com.sk89q.worldedit.entity.Entity; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/PatternTransform.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/transform/PatternTransform.java similarity index 85% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/PatternTransform.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/transform/PatternTransform.java index 2fd2be0ce..746cf8323 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/PatternTransform.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/transform/PatternTransform.java @@ -1,5 +1,6 @@ -package com.fastasyncworldedit.core.object.extent; +package com.fastasyncworldedit.core.extent.transform; +import com.fastasyncworldedit.core.extent.ResettableExtent; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.function.pattern.Pattern; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/RandomTransform.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/transform/RandomTransform.java similarity index 87% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/RandomTransform.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/transform/RandomTransform.java index 6f41dd8a9..58b41ede7 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/RandomTransform.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/transform/RandomTransform.java @@ -1,8 +1,9 @@ -package com.fastasyncworldedit.core.object.extent; +package com.fastasyncworldedit.core.extent.transform; -import com.fastasyncworldedit.core.object.collection.RandomCollection; -import com.fastasyncworldedit.core.object.random.SimpleRandom; -import com.fastasyncworldedit.core.object.random.TrueRandom; +import com.fastasyncworldedit.core.extent.ResettableExtent; +import com.fastasyncworldedit.core.util.collection.RandomCollection; +import com.fastasyncworldedit.core.math.random.SimpleRandom; +import com.fastasyncworldedit.core.math.random.TrueRandom; import com.sk89q.worldedit.extent.AbstractDelegateExtent; import com.sk89q.worldedit.extent.Extent; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/ScaleTransform.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/transform/ScaleTransform.java similarity index 96% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/ScaleTransform.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/transform/ScaleTransform.java index 2c0490a9e..b38e064de 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/ScaleTransform.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/transform/ScaleTransform.java @@ -1,11 +1,12 @@ -package com.fastasyncworldedit.core.object.extent; +package com.fastasyncworldedit.core.extent.transform; +import com.fastasyncworldedit.core.extent.ResettableExtent; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.entity.BaseEntity; import com.sk89q.worldedit.entity.Entity; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.math.BlockVector3; -import com.sk89q.worldedit.math.MutableBlockVector3; +import com.fastasyncworldedit.core.math.MutableBlockVector3; import com.sk89q.worldedit.util.Location; import com.sk89q.worldedit.world.biome.BiomeType; import com.sk89q.worldedit.world.block.BlockStateHolder; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/SelectTransform.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/transform/SelectTransform.java similarity index 94% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/SelectTransform.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/transform/SelectTransform.java index 3114392b3..3686502fe 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/SelectTransform.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/transform/SelectTransform.java @@ -1,5 +1,6 @@ -package com.fastasyncworldedit.core.object.extent; +package com.fastasyncworldedit.core.extent.transform; +import com.fastasyncworldedit.core.extent.ResettableExtent; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.entity.BaseEntity; import com.sk89q.worldedit.entity.Entity; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/function/NullRegionFunction.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/NullRegionFunction.java similarity index 86% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/function/NullRegionFunction.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/function/NullRegionFunction.java index ba7ca4847..1df94ed7e 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/function/NullRegionFunction.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/NullRegionFunction.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.function; +package com.fastasyncworldedit.core.function; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.function.RegionFunction; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/function/QuadFunction.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/QuadFunction.java similarity index 65% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/function/QuadFunction.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/function/QuadFunction.java index ab7bba08c..4c1e3bb0f 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/function/QuadFunction.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/QuadFunction.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.function; +package com.fastasyncworldedit.core.function; @FunctionalInterface public interface QuadFunction { diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/RegionMaskTestFunction.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/RegionMaskTestFunction.java similarity index 56% rename from worldedit-core/src/main/java/com/sk89q/worldedit/function/RegionMaskTestFunction.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/function/RegionMaskTestFunction.java index d4f13aeb7..629597463 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/RegionMaskTestFunction.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/RegionMaskTestFunction.java @@ -1,25 +1,7 @@ -/* - * WorldEdit, a Minecraft world manipulation toolkit - * Copyright (C) sk89q - * Copyright (C) WorldEdit team and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.sk89q.worldedit.function; +package com.fastasyncworldedit.core.function; import com.sk89q.worldedit.WorldEditException; +import com.sk89q.worldedit.function.RegionFunction; import com.sk89q.worldedit.function.mask.Mask; import com.sk89q.worldedit.math.BlockVector3; @@ -34,7 +16,7 @@ public class RegionMaskTestFunction implements RegionFunction { private final RegionFunction pass; private final RegionFunction fail; - private Mask mask; + private final Mask mask; /** * Create a new masking filter. diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/function/SurfaceRegionFunction.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/SurfaceRegionFunction.java similarity index 91% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/function/SurfaceRegionFunction.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/function/SurfaceRegionFunction.java index 02e3345b2..fce9734c3 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/function/SurfaceRegionFunction.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/SurfaceRegionFunction.java @@ -1,11 +1,11 @@ -package com.fastasyncworldedit.core.object.function; +package com.fastasyncworldedit.core.function; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.function.FlatRegionFunction; import com.sk89q.worldedit.function.RegionFunction; import com.sk89q.worldedit.math.BlockVector2; -import com.sk89q.worldedit.math.MutableBlockVector3; +import com.fastasyncworldedit.core.math.MutableBlockVector3; public class SurfaceRegionFunction implements FlatRegionFunction { private final Extent extent; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/function/block/BiomeCopy.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/block/BiomeCopy.java similarity index 91% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/function/block/BiomeCopy.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/function/block/BiomeCopy.java index c8d3ef390..31d9b5e86 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/function/block/BiomeCopy.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/block/BiomeCopy.java @@ -1,10 +1,10 @@ -package com.fastasyncworldedit.core.object.function.block; +package com.fastasyncworldedit.core.function.block; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.function.RegionFunction; import com.sk89q.worldedit.math.BlockVector3; -import com.sk89q.worldedit.math.MutableBlockVector3; +import com.fastasyncworldedit.core.math.MutableBlockVector3; public class BiomeCopy implements RegionFunction { diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/function/block/CombinedBlockCopy.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/block/CombinedBlockCopy.java similarity index 94% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/function/block/CombinedBlockCopy.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/function/block/CombinedBlockCopy.java index 7e5826525..995c33080 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/function/block/CombinedBlockCopy.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/block/CombinedBlockCopy.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.function.block; +package com.fastasyncworldedit.core.function.block; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extent.Extent; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/function/block/SimpleBlockCopy.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/block/SimpleBlockCopy.java similarity index 91% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/function/block/SimpleBlockCopy.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/function/block/SimpleBlockCopy.java index 116e38dcb..10ce56173 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/function/block/SimpleBlockCopy.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/block/SimpleBlockCopy.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.function.block; +package com.fastasyncworldedit.core.function.block; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extent.Extent; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/generator/CavesGen.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/generator/CavesGen.java similarity index 99% rename from worldedit-core/src/main/java/com/sk89q/worldedit/function/generator/CavesGen.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/function/generator/CavesGen.java index fce236ee3..325a33143 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/generator/CavesGen.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/generator/CavesGen.java @@ -1,10 +1,10 @@ -package com.sk89q.worldedit.function.generator; +package com.fastasyncworldedit.core.function.generator; import com.fastasyncworldedit.core.util.MathMan; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.math.BlockVector2; -import com.sk89q.worldedit.world.block.BlockID; +import com.fastasyncworldedit.core.world.block.BlockID; import com.sk89q.worldedit.world.block.BlockState; import com.sk89q.worldedit.world.block.BlockStateHolder; import com.sk89q.worldedit.world.block.BlockType; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/generator/GenBase.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/generator/GenBase.java similarity index 95% rename from worldedit-core/src/main/java/com/sk89q/worldedit/function/generator/GenBase.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/function/generator/GenBase.java index 3f723022a..ef55c0550 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/generator/GenBase.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/generator/GenBase.java @@ -1,4 +1,4 @@ -package com.sk89q.worldedit.function.generator; +package com.fastasyncworldedit.core.function.generator; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extent.Extent; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/generator/OreGen.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/generator/OreGen.java similarity index 97% rename from worldedit-core/src/main/java/com/sk89q/worldedit/function/generator/OreGen.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/function/generator/OreGen.java index 858019623..924453513 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/generator/OreGen.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/generator/OreGen.java @@ -1,11 +1,11 @@ -package com.sk89q.worldedit.function.generator; +package com.fastasyncworldedit.core.function.generator; import com.fastasyncworldedit.core.util.MathMan; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.function.mask.Mask; import com.sk89q.worldedit.function.pattern.Pattern; -import com.sk89q.worldedit.math.MutableBlockVector3; +import com.fastasyncworldedit.core.math.MutableBlockVector3; import java.util.Random; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/generator/Resource.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/generator/Resource.java similarity index 76% rename from worldedit-core/src/main/java/com/sk89q/worldedit/function/generator/Resource.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/function/generator/Resource.java index b37a6790f..9e7c15cba 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/generator/Resource.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/generator/Resource.java @@ -1,4 +1,4 @@ -package com.sk89q.worldedit.function.generator; +package com.fastasyncworldedit.core.function.generator; import com.sk89q.worldedit.WorldEditException; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/generator/SchemGen.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/generator/SchemGen.java similarity index 90% rename from worldedit-core/src/main/java/com/sk89q/worldedit/function/generator/SchemGen.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/function/generator/SchemGen.java index 630090c94..7f6c1fdf8 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/generator/SchemGen.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/generator/SchemGen.java @@ -1,10 +1,10 @@ -package com.sk89q.worldedit.function.generator; +package com.fastasyncworldedit.core.function.generator; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.extent.clipboard.Clipboard; import com.sk89q.worldedit.function.mask.Mask; -import com.sk89q.worldedit.math.MutableBlockVector3; +import com.fastasyncworldedit.core.math.MutableBlockVector3; import com.sk89q.worldedit.math.transform.AffineTransform; import com.sk89q.worldedit.math.transform.Transform; import com.sk89q.worldedit.session.ClipboardHolder; @@ -20,7 +20,7 @@ public class SchemGen implements Resource { private final boolean randomRotate; private final Mask mask; - private MutableBlockVector3 mutable = new MutableBlockVector3(); + private final MutableBlockVector3 mutable = new MutableBlockVector3(); public SchemGen(Mask mask, Extent extent, List clipboards, boolean randomRotate) { this.mask = mask; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/ABlockMask.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/ABlockMask.java similarity index 93% rename from worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/ABlockMask.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/ABlockMask.java index 651cf97b2..8761538fd 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/ABlockMask.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/ABlockMask.java @@ -1,7 +1,10 @@ -package com.sk89q.worldedit.function.mask; +package com.fastasyncworldedit.core.function.mask; import com.fastasyncworldedit.core.util.StringMan; import com.sk89q.worldedit.extent.Extent; +import com.sk89q.worldedit.function.mask.AbstractExtentMask; +import com.sk89q.worldedit.function.mask.BlockMask; +import com.sk89q.worldedit.function.mask.Mask; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.world.block.BlockState; import com.sk89q.worldedit.world.block.BlockType; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/function/mask/AbstractDelegateMask.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/AbstractDelegateMask.java similarity index 92% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/function/mask/AbstractDelegateMask.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/AbstractDelegateMask.java index d416b9fe0..7fd489927 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/function/mask/AbstractDelegateMask.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/AbstractDelegateMask.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.function.mask; +package com.fastasyncworldedit.core.function.mask; import com.sk89q.worldedit.function.mask.AbstractMask; import com.sk89q.worldedit.function.mask.Mask; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/AdjacentAnyMask.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/AdjacentAnyMask.java similarity index 93% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/AdjacentAnyMask.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/AdjacentAnyMask.java index b5d826b3e..e66f23af1 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/AdjacentAnyMask.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/AdjacentAnyMask.java @@ -1,9 +1,9 @@ -package com.fastasyncworldedit.core.object.mask; +package com.fastasyncworldedit.core.function.mask; import com.sk89q.worldedit.function.mask.AbstractMask; import com.sk89q.worldedit.function.mask.Mask; import com.sk89q.worldedit.math.BlockVector3; -import com.sk89q.worldedit.math.MutableBlockVector3; +import com.fastasyncworldedit.core.math.MutableBlockVector3; /** * Just an optimized version of the Adjacent Mask for single adjacency. diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/AdjacentMask.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/AdjacentMask.java similarity index 94% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/AdjacentMask.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/AdjacentMask.java index 5df583d6d..02366d474 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/AdjacentMask.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/AdjacentMask.java @@ -1,9 +1,9 @@ -package com.fastasyncworldedit.core.object.mask; +package com.fastasyncworldedit.core.function.mask; import com.sk89q.worldedit.function.mask.AbstractMask; import com.sk89q.worldedit.function.mask.Mask; import com.sk89q.worldedit.math.BlockVector3; -import com.sk89q.worldedit.math.MutableBlockVector3; +import com.fastasyncworldedit.core.math.MutableBlockVector3; public class AdjacentMask extends AbstractMask { private final int min; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/AirMask.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/AirMask.java similarity index 90% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/AirMask.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/AirMask.java index ba2d34290..227426921 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/AirMask.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/AirMask.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.mask; +package com.fastasyncworldedit.core.function.mask; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.function.mask.BlockMask; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/AngleMask.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/AngleMask.java similarity index 98% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/AngleMask.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/AngleMask.java index fa555d524..80201b021 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/AngleMask.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/AngleMask.java @@ -1,10 +1,10 @@ -package com.fastasyncworldedit.core.object.mask; +package com.fastasyncworldedit.core.function.mask; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.function.mask.Mask; import com.sk89q.worldedit.function.mask.SolidBlockMask; import com.sk89q.worldedit.math.BlockVector3; -import com.sk89q.worldedit.math.MutableBlockVector3; +import com.fastasyncworldedit.core.math.MutableBlockVector3; import java.util.Arrays; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/BlockMaskBuilder.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/BlockMaskBuilder.java similarity index 98% rename from worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/BlockMaskBuilder.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/BlockMaskBuilder.java index d18e52a4c..e34615451 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/BlockMaskBuilder.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/BlockMaskBuilder.java @@ -1,16 +1,17 @@ -package com.sk89q.worldedit.function.mask; +package com.fastasyncworldedit.core.function.mask; import com.fastasyncworldedit.core.command.SuggestInputParseException; import com.fastasyncworldedit.core.configuration.Caption; -import com.fastasyncworldedit.core.object.collection.FastBitSet; -import com.fastasyncworldedit.core.object.string.MutableCharSequence; +import com.fastasyncworldedit.core.math.FastBitSet; +import com.fastasyncworldedit.core.util.MutableCharSequence; import com.fastasyncworldedit.core.util.StringMan; import com.sk89q.worldedit.extension.input.InputParseException; import com.sk89q.worldedit.extent.Extent; +import com.sk89q.worldedit.function.mask.BlockMask; import com.sk89q.worldedit.registry.state.AbstractProperty; import com.sk89q.worldedit.registry.state.Property; -import com.sk89q.worldedit.registry.state.PropertyKey; -import com.sk89q.worldedit.registry.state.PropertyKeySet; +import com.fastasyncworldedit.core.registry.state.PropertyKey; +import com.fastasyncworldedit.core.registry.state.PropertyKeySet; import com.sk89q.worldedit.util.formatting.text.TextComponent; import com.sk89q.worldedit.world.block.BlockState; import com.sk89q.worldedit.world.block.BlockStateHolder; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/CachedMask.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/CachedMask.java similarity index 90% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/CachedMask.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/CachedMask.java index 5bb0ad108..145a99282 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/CachedMask.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/CachedMask.java @@ -1,10 +1,9 @@ -package com.fastasyncworldedit.core.object.mask; +package com.fastasyncworldedit.core.function.mask; -import com.fastasyncworldedit.core.object.collection.LocalBlockVectorSet; -import com.fastasyncworldedit.core.object.function.mask.AbstractDelegateMask; +import com.fastasyncworldedit.core.math.LocalBlockVectorSet; import com.sk89q.worldedit.function.mask.Mask; import com.sk89q.worldedit.math.BlockVector3; -import com.sk89q.worldedit.math.MutableBlockVector3; +import com.fastasyncworldedit.core.math.MutableBlockVector3; public class CachedMask extends AbstractDelegateMask implements ResettableMask { diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/DataMask.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/DataMask.java similarity index 95% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/DataMask.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/DataMask.java index 7479a2a16..2b3ad7edb 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/DataMask.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/DataMask.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.mask; +package com.fastasyncworldedit.core.function.mask; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.function.mask.AbstractExtentMask; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/DirectionMask.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/DirectionMask.java similarity index 69% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/DirectionMask.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/DirectionMask.java index 844e7b324..e443e7e56 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/DirectionMask.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/DirectionMask.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.beta; +package com.fastasyncworldedit.core.function.mask; public interface DirectionMask { diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/ExtremaMask.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/ExtremaMask.java similarity index 98% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/ExtremaMask.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/ExtremaMask.java index 2ce78b371..63c43b784 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/ExtremaMask.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/ExtremaMask.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.mask; +package com.fastasyncworldedit.core.function.mask; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.function.mask.Mask; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/IdDataMask.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/IdDataMask.java similarity index 95% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/IdDataMask.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/IdDataMask.java index 74cae871e..6f3fa6d15 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/IdDataMask.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/IdDataMask.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.mask; +package com.fastasyncworldedit.core.function.mask; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.function.mask.AbstractExtentMask; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/IdMask.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/IdMask.java similarity index 95% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/IdMask.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/IdMask.java index b9a279374..e76c78a89 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/IdMask.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/IdMask.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.mask; +package com.fastasyncworldedit.core.function.mask; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.function.mask.AbstractExtentMask; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/mask/ImageBrushMask.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/ImageBrushMask.java similarity index 95% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/mask/ImageBrushMask.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/ImageBrushMask.java index 2682f6491..9c3c80d59 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/mask/ImageBrushMask.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/ImageBrushMask.java @@ -1,13 +1,13 @@ -package com.fastasyncworldedit.core.object.brush.mask; +package com.fastasyncworldedit.core.function.mask; -import com.fastasyncworldedit.core.object.brush.ImageBrush; +import com.fastasyncworldedit.core.command.tool.brush.ImageBrush; import com.fastasyncworldedit.core.util.TextureUtil; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.function.mask.AbstractExtentMask; import com.sk89q.worldedit.function.mask.Mask; import com.sk89q.worldedit.math.BlockVector3; -import com.sk89q.worldedit.math.MutableVector3; +import com.fastasyncworldedit.core.math.MutableVector3; import com.sk89q.worldedit.math.Vector3; import com.sk89q.worldedit.math.transform.Transform; import com.sk89q.worldedit.world.block.BlockType; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/InverseMask.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/InverseMask.java similarity index 76% rename from worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/InverseMask.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/InverseMask.java index 2389eb981..3054bd6c3 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/InverseMask.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/InverseMask.java @@ -1,5 +1,9 @@ -package com.sk89q.worldedit.function.mask; +package com.fastasyncworldedit.core.function.mask; +import com.sk89q.worldedit.function.mask.AbstractMask; +import com.sk89q.worldedit.function.mask.Mask; +import com.sk89q.worldedit.function.mask.Mask2D; +import com.sk89q.worldedit.function.mask.Masks; import com.sk89q.worldedit.math.BlockVector3; import javax.annotation.Nullable; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/mask/LayerBrushMask.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/LayerBrushMask.java similarity index 95% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/mask/LayerBrushMask.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/LayerBrushMask.java index ade248f7e..43400959d 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/mask/LayerBrushMask.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/LayerBrushMask.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.brush.mask; +package com.fastasyncworldedit.core.function.mask; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.extent.Extent; @@ -7,7 +7,7 @@ import com.sk89q.worldedit.function.mask.Mask; import com.sk89q.worldedit.function.visitor.BreadthFirstSearch; import com.sk89q.worldedit.function.visitor.RecursiveVisitor; import com.sk89q.worldedit.math.BlockVector3; -import com.sk89q.worldedit.math.MutableBlockVector3; +import com.fastasyncworldedit.core.math.MutableBlockVector3; import com.sk89q.worldedit.world.block.BlockState; public class LayerBrushMask extends AbstractExtentMask { diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/LiquidMask.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/LiquidMask.java similarity index 88% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/LiquidMask.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/LiquidMask.java index 6f4232ec7..1895dfb2d 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/LiquidMask.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/LiquidMask.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.mask; +package com.fastasyncworldedit.core.function.mask; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.function.mask.BlockMask; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/MaskUnion.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/MaskUnion.java similarity index 76% rename from worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/MaskUnion.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/MaskUnion.java index 4adf197de..5a5ca9b23 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/MaskUnion.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/MaskUnion.java @@ -1,24 +1,9 @@ -/* - * WorldEdit, a Minecraft world manipulation toolkit - * Copyright (C) sk89q - * Copyright (C) WorldEdit team and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.sk89q.worldedit.function.mask; +package com.fastasyncworldedit.core.function.mask; +import com.sk89q.worldedit.function.mask.Mask; +import com.sk89q.worldedit.function.mask.Mask2D; +import com.sk89q.worldedit.function.mask.MaskIntersection; +import com.sk89q.worldedit.function.mask.Masks; import com.sk89q.worldedit.math.BlockVector3; import java.util.ArrayList; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/MaskUnion2D.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/MaskUnion2D.java similarity index 55% rename from worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/MaskUnion2D.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/MaskUnion2D.java index 28073e2d4..53edf2c45 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/MaskUnion2D.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/MaskUnion2D.java @@ -1,24 +1,7 @@ -/* - * WorldEdit, a Minecraft world manipulation toolkit - * Copyright (C) sk89q - * Copyright (C) WorldEdit team and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.sk89q.worldedit.function.mask; +package com.fastasyncworldedit.core.function.mask; +import com.sk89q.worldedit.function.mask.Mask2D; +import com.sk89q.worldedit.function.mask.MaskIntersection2D; import com.sk89q.worldedit.math.BlockVector2; import java.util.Collection; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/MaskedTargetBlock.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/MaskedTargetBlock.java similarity index 96% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/MaskedTargetBlock.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/MaskedTargetBlock.java index 575276d3b..6e136e9e9 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/MaskedTargetBlock.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/MaskedTargetBlock.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.mask; +package com.fastasyncworldedit.core.function.mask; import com.sk89q.worldedit.entity.Player; import com.sk89q.worldedit.function.mask.Mask; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/PlaneMask.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/PlaneMask.java similarity index 97% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/PlaneMask.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/PlaneMask.java index 6fe28fed9..e668d0a5b 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/PlaneMask.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/PlaneMask.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.mask; +package com.fastasyncworldedit.core.function.mask; import com.sk89q.worldedit.function.mask.AbstractMask; import com.sk89q.worldedit.function.mask.Mask; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/ROCAngleMask.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/ROCAngleMask.java similarity index 96% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/ROCAngleMask.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/ROCAngleMask.java index 1d6430839..beb9e799f 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/ROCAngleMask.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/ROCAngleMask.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.mask; +package com.fastasyncworldedit.core.function.mask; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.function.mask.Mask; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/RadiusMask.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/RadiusMask.java similarity index 96% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/RadiusMask.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/RadiusMask.java index 78d8e2d46..66746f5f7 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/RadiusMask.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/RadiusMask.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.mask; +package com.fastasyncworldedit.core.function.mask; import com.sk89q.worldedit.function.mask.AbstractMask; import com.sk89q.worldedit.function.mask.Mask; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/RandomMask.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/RandomMask.java similarity index 93% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/RandomMask.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/RandomMask.java index bc29a43b4..5aab4c497 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/RandomMask.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/RandomMask.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.mask; +package com.fastasyncworldedit.core.function.mask; import com.sk89q.worldedit.function.mask.AbstractMask; import com.sk89q.worldedit.function.mask.Mask; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/ResettableMask.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/ResettableMask.java similarity index 72% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/ResettableMask.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/ResettableMask.java index e72277300..05d6bb88a 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/ResettableMask.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/ResettableMask.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.mask; +package com.fastasyncworldedit.core.function.mask; import com.fastasyncworldedit.core.Resettable; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/SimplexMask.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/SimplexMask.java similarity index 87% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/SimplexMask.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/SimplexMask.java index 3eef3d4f3..9dc8fcb21 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/SimplexMask.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/SimplexMask.java @@ -1,6 +1,6 @@ -package com.fastasyncworldedit.core.object.mask; +package com.fastasyncworldedit.core.function.mask; -import com.fastasyncworldedit.core.object.random.SimplexNoise; +import com.fastasyncworldedit.core.math.random.SimplexNoise; import com.sk89q.worldedit.function.mask.AbstractMask; import com.sk89q.worldedit.function.mask.Mask; import com.sk89q.worldedit.math.BlockVector3; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/SingleBlockStateMask.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/SingleBlockStateMask.java similarity index 88% rename from worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/SingleBlockStateMask.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/SingleBlockStateMask.java index 5810a28ef..89c7fa236 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/SingleBlockStateMask.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/SingleBlockStateMask.java @@ -1,6 +1,9 @@ -package com.sk89q.worldedit.function.mask; +package com.fastasyncworldedit.core.function.mask; import com.sk89q.worldedit.extent.Extent; +import com.sk89q.worldedit.function.mask.InverseSingleBlockStateMask; +import com.sk89q.worldedit.function.mask.Mask; +import com.sk89q.worldedit.function.mask.Masks; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.world.block.BlockState; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/SingleBlockTypeMask.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/SingleBlockTypeMask.java similarity index 89% rename from worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/SingleBlockTypeMask.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/SingleBlockTypeMask.java index 29a017c11..30261217b 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/SingleBlockTypeMask.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/SingleBlockTypeMask.java @@ -1,6 +1,8 @@ -package com.sk89q.worldedit.function.mask; +package com.fastasyncworldedit.core.function.mask; import com.sk89q.worldedit.extent.Extent; +import com.sk89q.worldedit.function.mask.InverseSingleBlockTypeMask; +import com.sk89q.worldedit.function.mask.Mask; import com.sk89q.worldedit.world.block.BlockState; import com.sk89q.worldedit.world.block.BlockType; import com.sk89q.worldedit.world.block.BlockTypes; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/mask/SplatterBrushMask.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/SplatterBrushMask.java similarity index 91% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/mask/SplatterBrushMask.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/SplatterBrushMask.java index fc0dded7e..a85ab448b 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/mask/SplatterBrushMask.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/SplatterBrushMask.java @@ -1,6 +1,6 @@ -package com.fastasyncworldedit.core.object.brush.mask; +package com.fastasyncworldedit.core.function.mask; -import com.fastasyncworldedit.core.object.collection.LocalBlockVectorSet; +import com.fastasyncworldedit.core.math.LocalBlockVectorSet; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.function.mask.AbstractExtentMask; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/mask/StencilBrushMask.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/StencilBrushMask.java similarity index 94% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/mask/StencilBrushMask.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/StencilBrushMask.java index adbdaf324..a6cc4edd1 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/mask/StencilBrushMask.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/StencilBrushMask.java @@ -1,6 +1,6 @@ -package com.fastasyncworldedit.core.object.brush.mask; +package com.fastasyncworldedit.core.function.mask; -import com.fastasyncworldedit.core.object.brush.heightmap.HeightMap; +import com.fastasyncworldedit.core.extent.processor.heightmap.HeightMap; import com.fastasyncworldedit.core.util.MathMan; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.extent.Extent; @@ -8,7 +8,7 @@ import com.sk89q.worldedit.function.mask.AbstractExtentMask; import com.sk89q.worldedit.function.mask.Mask; import com.sk89q.worldedit.function.pattern.Pattern; import com.sk89q.worldedit.math.BlockVector3; -import com.sk89q.worldedit.math.MutableVector3; +import com.fastasyncworldedit.core.math.MutableVector3; import com.sk89q.worldedit.math.Vector3; import com.sk89q.worldedit.math.transform.Transform; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/SurfaceMask.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/SurfaceMask.java similarity index 89% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/SurfaceMask.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/SurfaceMask.java index 0dbf0dff3..2680feea7 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/SurfaceMask.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/SurfaceMask.java @@ -1,8 +1,7 @@ -package com.fastasyncworldedit.core.object.mask; +package com.fastasyncworldedit.core.function.mask; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.function.mask.AbstractExtentMask; -import com.sk89q.worldedit.function.mask.BlockMaskBuilder; import com.sk89q.worldedit.function.mask.Mask; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.world.block.BlockTypes; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/WallMakeMask.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/WallMakeMask.java similarity index 86% rename from worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/WallMakeMask.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/WallMakeMask.java index 5834a1fb8..b2ef0cd9a 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/WallMakeMask.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/WallMakeMask.java @@ -1,5 +1,6 @@ -package com.sk89q.worldedit.function.mask; +package com.fastasyncworldedit.core.function.mask; +import com.sk89q.worldedit.function.mask.Mask; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.regions.Region; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/WallMask.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/WallMask.java similarity index 93% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/WallMask.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/WallMask.java index f8bee3ff4..24e560971 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/WallMask.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/WallMask.java @@ -1,9 +1,9 @@ -package com.fastasyncworldedit.core.object.mask; +package com.fastasyncworldedit.core.function.mask; import com.sk89q.worldedit.function.mask.AbstractMask; import com.sk89q.worldedit.function.mask.Mask; import com.sk89q.worldedit.math.BlockVector3; -import com.sk89q.worldedit.math.MutableBlockVector3; +import com.fastasyncworldedit.core.math.MutableBlockVector3; public class WallMask extends AbstractMask { private final int min; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/XAxisMask.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/XAxisMask.java similarity index 93% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/XAxisMask.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/XAxisMask.java index 0d80b09e9..7531d1465 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/XAxisMask.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/XAxisMask.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.mask; +package com.fastasyncworldedit.core.function.mask; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.function.mask.AbstractMask; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/YAxisMask.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/YAxisMask.java similarity index 93% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/YAxisMask.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/YAxisMask.java index e99e099df..8dace5fee 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/YAxisMask.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/YAxisMask.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.mask; +package com.fastasyncworldedit.core.function.mask; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.function.mask.AbstractMask; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/ZAxisMask.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/ZAxisMask.java similarity index 92% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/ZAxisMask.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/ZAxisMask.java index 2daf4ddcb..269fc5dd8 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/ZAxisMask.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/ZAxisMask.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.mask; +package com.fastasyncworldedit.core.function.mask; import com.sk89q.worldedit.function.mask.AbstractMask; import com.sk89q.worldedit.function.mask.Mask; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/AbstractExtentPattern.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/AbstractExtentPattern.java similarity index 89% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/AbstractExtentPattern.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/AbstractExtentPattern.java index 7a04d1028..ccb4251e7 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/AbstractExtentPattern.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/AbstractExtentPattern.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.pattern; +package com.fastasyncworldedit.core.function.pattern; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.function.pattern.AbstractPattern; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/AngleColorPattern.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/AngleColorPattern.java similarity index 96% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/AngleColorPattern.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/AngleColorPattern.java index 154e9f942..b98dfb526 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/AngleColorPattern.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/AngleColorPattern.java @@ -1,6 +1,5 @@ -package com.fastasyncworldedit.core.object.pattern; +package com.fastasyncworldedit.core.function.pattern; -import com.fastasyncworldedit.core.object.DataAnglePattern; import com.fastasyncworldedit.core.util.TextureHolder; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extent.Extent; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/AverageColorPattern.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/AverageColorPattern.java similarity index 96% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/AverageColorPattern.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/AverageColorPattern.java index 2cf4400d4..384e53009 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/AverageColorPattern.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/AverageColorPattern.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.pattern; +package com.fastasyncworldedit.core.function.pattern; import com.fastasyncworldedit.core.util.TextureHolder; import com.fastasyncworldedit.core.util.TextureUtil; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/BiomeApplyingPattern.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/BiomeApplyingPattern.java similarity index 94% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/BiomeApplyingPattern.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/BiomeApplyingPattern.java index 0206cc8a8..6f6ba379a 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/BiomeApplyingPattern.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/BiomeApplyingPattern.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.pattern; +package com.fastasyncworldedit.core.function.pattern; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extent.Extent; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/BufferedPattern.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/BufferedPattern.java similarity index 93% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/BufferedPattern.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/BufferedPattern.java index 9a62d502a..b964a94c5 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/BufferedPattern.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/BufferedPattern.java @@ -1,7 +1,7 @@ -package com.fastasyncworldedit.core.object.pattern; +package com.fastasyncworldedit.core.function.pattern; import com.fastasyncworldedit.core.Fawe; -import com.fastasyncworldedit.core.object.collection.LocalBlockVectorSet; +import com.fastasyncworldedit.core.math.LocalBlockVectorSet; import com.fastasyncworldedit.core.util.FaweTimer; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extension.platform.Actor; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/BufferedPattern2D.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/BufferedPattern2D.java similarity index 88% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/BufferedPattern2D.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/BufferedPattern2D.java index d14b9f640..f96b670d5 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/BufferedPattern2D.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/BufferedPattern2D.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.pattern; +package com.fastasyncworldedit.core.function.pattern; import com.sk89q.worldedit.extension.platform.Actor; import com.sk89q.worldedit.function.pattern.Pattern; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/DataAnglePattern.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/DataAnglePattern.java similarity index 95% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/DataAnglePattern.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/DataAnglePattern.java index 9d4636bb4..0e3354108 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/DataAnglePattern.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/DataAnglePattern.java @@ -1,6 +1,6 @@ -package com.fastasyncworldedit.core.object; +package com.fastasyncworldedit.core.function.pattern; -import com.fastasyncworldedit.core.object.extent.ExtentHeightCacher; +import com.fastasyncworldedit.core.extent.ExtentHeightCacher; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.function.pattern.AbstractPattern; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/DataPattern.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/DataPattern.java similarity index 96% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/DataPattern.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/DataPattern.java index 3db455fb0..687edc890 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/DataPattern.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/DataPattern.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.pattern; +package com.fastasyncworldedit.core.function.pattern; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extent.Extent; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/DesaturatePattern.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/DesaturatePattern.java similarity index 97% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/DesaturatePattern.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/DesaturatePattern.java index 9a8ed5b32..020d3277b 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/DesaturatePattern.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/DesaturatePattern.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.pattern; +package com.fastasyncworldedit.core.function.pattern; import com.fastasyncworldedit.core.util.TextureHolder; import com.fastasyncworldedit.core.util.TextureUtil; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/ExistingPattern.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/ExistingPattern.java similarity index 93% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/ExistingPattern.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/ExistingPattern.java index a598eff71..cd4411331 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/ExistingPattern.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/ExistingPattern.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.pattern; +package com.fastasyncworldedit.core.function.pattern; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extent.Extent; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/ExpressionPattern.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/ExpressionPattern.java similarity index 97% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/ExpressionPattern.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/ExpressionPattern.java index 08d9fb860..4244f9207 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/ExpressionPattern.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/ExpressionPattern.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.pattern; +package com.fastasyncworldedit.core.function.pattern; import com.sk89q.worldedit.function.pattern.AbstractPattern; import com.sk89q.worldedit.internal.expression.EvaluationException; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/IdDataMaskPattern.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/IdDataMaskPattern.java similarity index 94% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/IdDataMaskPattern.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/IdDataMaskPattern.java index 93cd8fb9b..d5155bebb 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/IdDataMaskPattern.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/IdDataMaskPattern.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.pattern; +package com.fastasyncworldedit.core.function.pattern; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.function.pattern.Pattern; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/IdPattern.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/IdPattern.java similarity index 93% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/IdPattern.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/IdPattern.java index 4adf1c7e7..ccaa25097 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/IdPattern.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/IdPattern.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.pattern; +package com.fastasyncworldedit.core.function.pattern; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.function.pattern.Pattern; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/Linear2DBlockPattern.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/Linear2DBlockPattern.java similarity index 96% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/Linear2DBlockPattern.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/Linear2DBlockPattern.java index 31023b9c1..4cc4dc037 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/Linear2DBlockPattern.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/Linear2DBlockPattern.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.pattern; +package com.fastasyncworldedit.core.function.pattern; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extent.Extent; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/Linear3DBlockPattern.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/Linear3DBlockPattern.java similarity index 96% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/Linear3DBlockPattern.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/Linear3DBlockPattern.java index 6bcc929f5..b36132a62 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/Linear3DBlockPattern.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/Linear3DBlockPattern.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.pattern; +package com.fastasyncworldedit.core.function.pattern; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extent.Extent; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/LinearBlockPattern.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/LinearBlockPattern.java similarity index 95% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/LinearBlockPattern.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/LinearBlockPattern.java index b852e4fb2..be1a25c69 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/LinearBlockPattern.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/LinearBlockPattern.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.pattern; +package com.fastasyncworldedit.core.function.pattern; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extent.Extent; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/MaskedPattern.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/MaskedPattern.java similarity index 95% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/MaskedPattern.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/MaskedPattern.java index 3fbfb17ce..e08aa6bd0 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/MaskedPattern.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/MaskedPattern.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.pattern; +package com.fastasyncworldedit.core.function.pattern; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extent.Extent; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/NoXPattern.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/NoXPattern.java similarity index 89% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/NoXPattern.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/NoXPattern.java index d20945ea7..c75b70f18 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/NoXPattern.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/NoXPattern.java @@ -1,11 +1,11 @@ -package com.fastasyncworldedit.core.object.pattern; +package com.fastasyncworldedit.core.function.pattern; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.function.pattern.AbstractPattern; import com.sk89q.worldedit.function.pattern.Pattern; import com.sk89q.worldedit.math.BlockVector3; -import com.sk89q.worldedit.math.MutableBlockVector3; +import com.fastasyncworldedit.core.math.MutableBlockVector3; import com.sk89q.worldedit.world.block.BaseBlock; public class NoXPattern extends AbstractPattern { diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/NoYPattern.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/NoYPattern.java similarity index 89% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/NoYPattern.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/NoYPattern.java index b0de8e0f7..18d22e4b2 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/NoYPattern.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/NoYPattern.java @@ -1,11 +1,11 @@ -package com.fastasyncworldedit.core.object.pattern; +package com.fastasyncworldedit.core.function.pattern; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.function.pattern.AbstractPattern; import com.sk89q.worldedit.function.pattern.Pattern; import com.sk89q.worldedit.math.BlockVector3; -import com.sk89q.worldedit.math.MutableBlockVector3; +import com.fastasyncworldedit.core.math.MutableBlockVector3; import com.sk89q.worldedit.world.block.BaseBlock; public class NoYPattern extends AbstractPattern { diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/NoZPattern.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/NoZPattern.java similarity index 89% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/NoZPattern.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/NoZPattern.java index a53466caa..ee33f5cc6 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/NoZPattern.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/NoZPattern.java @@ -1,11 +1,11 @@ -package com.fastasyncworldedit.core.object.pattern; +package com.fastasyncworldedit.core.function.pattern; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.function.pattern.AbstractPattern; import com.sk89q.worldedit.function.pattern.Pattern; import com.sk89q.worldedit.math.BlockVector3; -import com.sk89q.worldedit.math.MutableBlockVector3; +import com.fastasyncworldedit.core.math.MutableBlockVector3; import com.sk89q.worldedit.world.block.BaseBlock; public class NoZPattern extends AbstractPattern { diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/OffsetPattern.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/OffsetPattern.java similarity index 91% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/OffsetPattern.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/OffsetPattern.java index 47d319441..e7c4ef416 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/OffsetPattern.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/OffsetPattern.java @@ -1,11 +1,11 @@ -package com.fastasyncworldedit.core.object.pattern; +package com.fastasyncworldedit.core.function.pattern; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.function.pattern.AbstractPattern; import com.sk89q.worldedit.function.pattern.Pattern; import com.sk89q.worldedit.math.BlockVector3; -import com.sk89q.worldedit.math.MutableBlockVector3; +import com.fastasyncworldedit.core.math.MutableBlockVector3; import com.sk89q.worldedit.world.block.BaseBlock; public class OffsetPattern extends AbstractPattern { diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/PatternTraverser.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/PatternTraverser.java similarity index 97% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/PatternTraverser.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/PatternTraverser.java index 6d0b824e2..e284dc9dc 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/PatternTraverser.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/PatternTraverser.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.pattern; +package com.fastasyncworldedit.core.function.pattern; import com.fastasyncworldedit.core.Resettable; import com.sk89q.worldedit.extent.Extent; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/PropertyPattern.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/PropertyPattern.java similarity index 98% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/PropertyPattern.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/PropertyPattern.java index f82594ada..131414683 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/PropertyPattern.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/PropertyPattern.java @@ -1,6 +1,6 @@ -package com.fastasyncworldedit.core.object.pattern; +package com.fastasyncworldedit.core.function.pattern; -import com.fastasyncworldedit.core.object.string.MutableCharSequence; +import com.fastasyncworldedit.core.util.MutableCharSequence; import com.fastasyncworldedit.core.util.MathMan; import com.fastasyncworldedit.core.util.StringMan; import com.sk89q.jnbt.CompoundTag; @@ -10,7 +10,7 @@ import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.registry.state.AbstractProperty; import com.sk89q.worldedit.registry.state.IntegerProperty; import com.sk89q.worldedit.registry.state.Property; -import com.sk89q.worldedit.registry.state.PropertyKey; +import com.fastasyncworldedit.core.registry.state.PropertyKey; import com.sk89q.worldedit.world.block.BaseBlock; import com.sk89q.worldedit.world.block.BlockState; import com.sk89q.worldedit.world.block.BlockType; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/RandomFullClipboardPattern.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/RandomFullClipboardPattern.java similarity index 95% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/RandomFullClipboardPattern.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/RandomFullClipboardPattern.java index b606fdd47..3ce6fc3fb 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/RandomFullClipboardPattern.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/RandomFullClipboardPattern.java @@ -1,11 +1,11 @@ -package com.fastasyncworldedit.core.object.pattern; +package com.fastasyncworldedit.core.function.pattern; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.extent.clipboard.Clipboard; import com.sk89q.worldedit.function.pattern.AbstractPattern; import com.sk89q.worldedit.math.BlockVector3; -import com.sk89q.worldedit.math.MutableBlockVector3; +import com.fastasyncworldedit.core.math.MutableBlockVector3; import com.sk89q.worldedit.math.Vector3; import com.sk89q.worldedit.math.transform.AffineTransform; import com.sk89q.worldedit.math.transform.Transform; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/RandomOffsetPattern.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/RandomOffsetPattern.java similarity index 93% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/RandomOffsetPattern.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/RandomOffsetPattern.java index 08de59796..9ae88cd16 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/RandomOffsetPattern.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/RandomOffsetPattern.java @@ -1,11 +1,11 @@ -package com.fastasyncworldedit.core.object.pattern; +package com.fastasyncworldedit.core.function.pattern; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.function.pattern.AbstractPattern; import com.sk89q.worldedit.function.pattern.Pattern; import com.sk89q.worldedit.math.BlockVector3; -import com.sk89q.worldedit.math.MutableBlockVector3; +import com.fastasyncworldedit.core.math.MutableBlockVector3; import com.sk89q.worldedit.world.block.BaseBlock; import java.util.SplittableRandom; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/RelativePattern.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/RelativePattern.java similarity index 92% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/RelativePattern.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/RelativePattern.java index 25be48c49..52be69e90 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/RelativePattern.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/RelativePattern.java @@ -1,11 +1,11 @@ -package com.fastasyncworldedit.core.object.pattern; +package com.fastasyncworldedit.core.function.pattern; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.function.pattern.AbstractPattern; import com.sk89q.worldedit.function.pattern.Pattern; import com.sk89q.worldedit.math.BlockVector3; -import com.sk89q.worldedit.math.MutableBlockVector3; +import com.fastasyncworldedit.core.math.MutableBlockVector3; import com.sk89q.worldedit.world.block.BaseBlock; public class RelativePattern extends AbstractPattern implements ResettablePattern { diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/ResettablePattern.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/ResettablePattern.java similarity index 72% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/ResettablePattern.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/ResettablePattern.java index 1107dbf5c..fd4be743d 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/ResettablePattern.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/ResettablePattern.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.pattern; +package com.fastasyncworldedit.core.function.pattern; import com.fastasyncworldedit.core.Resettable; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/SaturatePattern.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/SaturatePattern.java similarity index 97% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/SaturatePattern.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/SaturatePattern.java index c06e295a9..e79d649d9 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/SaturatePattern.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/SaturatePattern.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.pattern; +package com.fastasyncworldedit.core.function.pattern; import com.fastasyncworldedit.core.util.TextureHolder; import com.fastasyncworldedit.core.util.TextureUtil; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/ShadePattern.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/ShadePattern.java similarity index 96% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/ShadePattern.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/ShadePattern.java index f5d2c780b..a6f6a5899 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/ShadePattern.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/ShadePattern.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.pattern; +package com.fastasyncworldedit.core.function.pattern; import com.fastasyncworldedit.core.util.TextureUtil; import com.sk89q.worldedit.WorldEditException; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/SolidRandomOffsetPattern.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/SolidRandomOffsetPattern.java similarity index 95% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/SolidRandomOffsetPattern.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/SolidRandomOffsetPattern.java index d0ca1d7fb..dad91f91d 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/SolidRandomOffsetPattern.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/SolidRandomOffsetPattern.java @@ -1,11 +1,11 @@ -package com.fastasyncworldedit.core.object.pattern; +package com.fastasyncworldedit.core.function.pattern; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.function.pattern.AbstractPattern; import com.sk89q.worldedit.function.pattern.Pattern; import com.sk89q.worldedit.math.BlockVector3; -import com.sk89q.worldedit.math.MutableBlockVector3; +import com.fastasyncworldedit.core.math.MutableBlockVector3; import com.sk89q.worldedit.world.block.BaseBlock; import com.sk89q.worldedit.world.block.BlockType; import com.sk89q.worldedit.world.block.BlockTypes; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/SurfaceRandomOffsetPattern.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/SurfaceRandomOffsetPattern.java similarity index 96% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/SurfaceRandomOffsetPattern.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/SurfaceRandomOffsetPattern.java index 4919229ea..8d5f4d964 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/SurfaceRandomOffsetPattern.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/SurfaceRandomOffsetPattern.java @@ -1,10 +1,10 @@ -package com.fastasyncworldedit.core.object.pattern; +package com.fastasyncworldedit.core.function.pattern; import com.sk89q.worldedit.function.pattern.AbstractPattern; import com.sk89q.worldedit.function.pattern.Pattern; import com.sk89q.worldedit.function.visitor.BreadthFirstSearch; import com.sk89q.worldedit.math.BlockVector3; -import com.sk89q.worldedit.math.MutableBlockVector3; +import com.fastasyncworldedit.core.math.MutableBlockVector3; import com.sk89q.worldedit.world.block.BaseBlock; import java.util.concurrent.ThreadLocalRandom; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/visitor/AboveVisitor.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/visitor/AboveVisitor.java similarity index 96% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/visitor/AboveVisitor.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/function/visitor/AboveVisitor.java index 044acfc4e..24fbcb72c 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/visitor/AboveVisitor.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/visitor/AboveVisitor.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.visitor; +package com.fastasyncworldedit.core.function.visitor; import com.sk89q.worldedit.function.RegionFunction; import com.sk89q.worldedit.function.mask.Mask; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/visitor/DFSRecursiveVisitor.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/visitor/DFSRecursiveVisitor.java similarity index 95% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/visitor/DFSRecursiveVisitor.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/function/visitor/DFSRecursiveVisitor.java index 5d013c2d3..8e32c56b2 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/visitor/DFSRecursiveVisitor.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/visitor/DFSRecursiveVisitor.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.visitor; +package com.fastasyncworldedit.core.function.visitor; import com.sk89q.worldedit.function.RegionFunction; import com.sk89q.worldedit.function.mask.Mask; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/visitor/DFSVisitor.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/visitor/DFSVisitor.java similarity index 98% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/visitor/DFSVisitor.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/function/visitor/DFSVisitor.java index 9302b170b..ad8b32c06 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/visitor/DFSVisitor.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/visitor/DFSVisitor.java @@ -1,7 +1,7 @@ -package com.fastasyncworldedit.core.object.visitor; +package com.fastasyncworldedit.core.function.visitor; import com.fastasyncworldedit.core.configuration.Caption; -import com.fastasyncworldedit.core.object.IntTriple; +import com.fastasyncworldedit.core.math.IntTriple; import com.google.common.collect.Lists; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.function.RegionFunction; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/DirectionalVisitor.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/visitor/DirectionalVisitor.java similarity index 70% rename from worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/DirectionalVisitor.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/function/visitor/DirectionalVisitor.java index 5f036c403..24a35b989 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/DirectionalVisitor.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/visitor/DirectionalVisitor.java @@ -1,26 +1,8 @@ -/* - * WorldEdit, a Minecraft world manipulation toolkit - * Copyright (C) sk89q - * Copyright (C) WorldEdit team and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.sk89q.worldedit.function.visitor; +package com.fastasyncworldedit.core.function.visitor; import com.sk89q.worldedit.function.RegionFunction; import com.sk89q.worldedit.function.mask.Mask; +import com.sk89q.worldedit.function.visitor.RecursiveVisitor; import com.sk89q.worldedit.math.BlockVector3; import static com.google.common.base.Preconditions.checkNotNull; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/IntersectRegionFunction.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/visitor/IntersectRegionFunction.java similarity index 92% rename from worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/IntersectRegionFunction.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/function/visitor/IntersectRegionFunction.java index 8d0f5ea10..4cd8486e1 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/IntersectRegionFunction.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/visitor/IntersectRegionFunction.java @@ -1,4 +1,4 @@ -package com.sk89q.worldedit.function.visitor; +package com.fastasyncworldedit.core.function.visitor; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.function.RegionFunction; @@ -11,7 +11,6 @@ public class IntersectRegionFunction implements RegionFunction { this.functions = functions; } - @Override public boolean apply(BlockVector3 position) throws WorldEditException { boolean ret = false; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/Order.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/visitor/Order.java similarity index 91% rename from worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/Order.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/function/visitor/Order.java index 913d4a0b5..35f82a0cc 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/Order.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/visitor/Order.java @@ -1,4 +1,4 @@ -package com.sk89q.worldedit.function.visitor; +package com.fastasyncworldedit.core.function.visitor; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.regions.CuboidRegion; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/changeset/DiskStorageHistory.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/history/DiskStorageHistory.java similarity index 97% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/changeset/DiskStorageHistory.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/history/DiskStorageHistory.java index 928d13f70..93a945d80 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/changeset/DiskStorageHistory.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/history/DiskStorageHistory.java @@ -1,12 +1,14 @@ -package com.fastasyncworldedit.core.object.changeset; +package com.fastasyncworldedit.core.history; import com.fastasyncworldedit.core.Fawe; import com.fastasyncworldedit.core.configuration.Settings; import com.fastasyncworldedit.core.database.DBHandler; import com.fastasyncworldedit.core.database.RollbackDatabase; -import com.fastasyncworldedit.core.object.FaweInputStream; -import com.fastasyncworldedit.core.object.FaweOutputStream; -import com.fastasyncworldedit.core.object.IntPair; +import com.fastasyncworldedit.core.history.changeset.FaweStreamChangeSet; +import com.fastasyncworldedit.core.history.changeset.SimpleChangeSetSummary; +import com.fastasyncworldedit.core.internal.io.FaweInputStream; +import com.fastasyncworldedit.core.internal.io.FaweOutputStream; +import com.fastasyncworldedit.core.math.IntPair; import com.fastasyncworldedit.core.util.MainUtil; import com.sk89q.jnbt.NBTInputStream; import com.sk89q.jnbt.NBTOutputStream; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/changeset/MemoryOptimizedHistory.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/history/MemoryOptimizedHistory.java similarity index 95% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/changeset/MemoryOptimizedHistory.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/history/MemoryOptimizedHistory.java index a270a1019..9aaa01636 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/changeset/MemoryOptimizedHistory.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/history/MemoryOptimizedHistory.java @@ -1,10 +1,11 @@ -package com.fastasyncworldedit.core.object.changeset; +package com.fastasyncworldedit.core.history; import com.fastasyncworldedit.core.configuration.Settings; -import com.fastasyncworldedit.core.object.FaweInputStream; -import com.fastasyncworldedit.core.object.FaweOutputStream; -import com.fastasyncworldedit.core.object.io.FastByteArrayOutputStream; -import com.fastasyncworldedit.core.object.io.FastByteArraysInputStream; +import com.fastasyncworldedit.core.history.changeset.FaweStreamChangeSet; +import com.fastasyncworldedit.core.internal.io.FaweInputStream; +import com.fastasyncworldedit.core.internal.io.FaweOutputStream; +import com.fastasyncworldedit.core.internal.io.FastByteArrayOutputStream; +import com.fastasyncworldedit.core.internal.io.FastByteArraysInputStream; import com.fastasyncworldedit.core.util.MainUtil; import com.sk89q.jnbt.NBTInputStream; import com.sk89q.jnbt.NBTOutputStream; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/logging/RollbackOptimizedHistory.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/history/RollbackOptimizedHistory.java similarity index 95% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/logging/RollbackOptimizedHistory.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/history/RollbackOptimizedHistory.java index fdb5b4656..80d5ab6f2 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/logging/RollbackOptimizedHistory.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/history/RollbackOptimizedHistory.java @@ -1,9 +1,8 @@ -package com.fastasyncworldedit.core.logging; +package com.fastasyncworldedit.core.history; import com.fastasyncworldedit.core.database.DBHandler; import com.fastasyncworldedit.core.database.RollbackDatabase; -import com.fastasyncworldedit.core.object.changeset.DiskStorageHistory; -import com.fastasyncworldedit.core.object.changeset.SimpleChangeSetSummary; +import com.fastasyncworldedit.core.history.changeset.SimpleChangeSetSummary; import com.sk89q.worldedit.internal.util.LogManagerCompat; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.regions.CuboidRegion; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/change/MutableBiomeChange.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/history/change/MutableBiomeChange.java similarity index 89% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/change/MutableBiomeChange.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/history/change/MutableBiomeChange.java index 8cb5e8041..88f1ac4d3 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/change/MutableBiomeChange.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/history/change/MutableBiomeChange.java @@ -1,9 +1,9 @@ -package com.fastasyncworldedit.core.object.change; +package com.fastasyncworldedit.core.history.change; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.history.UndoContext; import com.sk89q.worldedit.history.change.Change; -import com.sk89q.worldedit.math.MutableBlockVector3; +import com.fastasyncworldedit.core.math.MutableBlockVector3; import com.sk89q.worldedit.world.biome.BiomeTypes; public class MutableBiomeChange implements Change { diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/change/MutableBlockChange.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/history/change/MutableBlockChange.java similarity index 94% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/change/MutableBlockChange.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/history/change/MutableBlockChange.java index b4857b367..6264c2735 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/change/MutableBlockChange.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/history/change/MutableBlockChange.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.change; +package com.fastasyncworldedit.core.history.change; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.history.UndoContext; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/change/MutableEntityChange.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/history/change/MutableEntityChange.java similarity index 98% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/change/MutableEntityChange.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/history/change/MutableEntityChange.java index 72da7ba37..82aeb8c19 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/change/MutableEntityChange.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/history/change/MutableEntityChange.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.change; +package com.fastasyncworldedit.core.history.change; import com.fastasyncworldedit.core.util.MathMan; import com.sk89q.jnbt.CompoundTag; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/change/MutableFullBlockChange.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/history/change/MutableFullBlockChange.java similarity index 97% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/change/MutableFullBlockChange.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/history/change/MutableFullBlockChange.java index 9396829eb..1d2c3abfe 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/change/MutableFullBlockChange.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/history/change/MutableFullBlockChange.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.change; +package com.fastasyncworldedit.core.history.change; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extent.inventory.BlockBag; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/change/MutableTileChange.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/history/change/MutableTileChange.java similarity index 94% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/change/MutableTileChange.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/history/change/MutableTileChange.java index 6cc4a709e..16e64f75e 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/change/MutableTileChange.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/history/change/MutableTileChange.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.change; +package com.fastasyncworldedit.core.history.change; import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.WorldEditException; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/change/StreamChange.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/history/change/StreamChange.java similarity index 80% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/change/StreamChange.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/history/change/StreamChange.java index 753e8bb5f..066a4855b 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/change/StreamChange.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/history/change/StreamChange.java @@ -1,7 +1,7 @@ -package com.fastasyncworldedit.core.object.change; +package com.fastasyncworldedit.core.history.change; -import com.fastasyncworldedit.core.object.FaweInputStream; -import com.fastasyncworldedit.core.object.FaweOutputStream; +import com.fastasyncworldedit.core.internal.io.FaweInputStream; +import com.fastasyncworldedit.core.internal.io.FaweOutputStream; import net.jpountz.lz4.LZ4BlockInputStream; import net.jpountz.lz4.LZ4BlockOutputStream; @@ -13,11 +13,11 @@ import java.io.FileOutputStream; import java.io.IOException; public interface StreamChange { - public void flushChanges(FaweOutputStream out) throws IOException; + void flushChanges(FaweOutputStream out) throws IOException; - public void undoChanges(FaweInputStream in) throws IOException; + void undoChanges(FaweInputStream in) throws IOException; - public void redoChanges(FaweInputStream in) throws IOException; + void redoChanges(FaweInputStream in) throws IOException; default void flushChanges(File file) throws IOException { try (BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(file))) { diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/changeset/AbstractChangeSet.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/history/changeset/AbstractChangeSet.java similarity index 96% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/changeset/AbstractChangeSet.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/history/changeset/AbstractChangeSet.java index 93512b3f1..eb0ae7231 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/changeset/AbstractChangeSet.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/history/changeset/AbstractChangeSet.java @@ -1,13 +1,13 @@ -package com.fastasyncworldedit.core.object.changeset; +package com.fastasyncworldedit.core.history.changeset; import com.fastasyncworldedit.core.Fawe; import com.fastasyncworldedit.core.FaweCache; -import com.fastasyncworldedit.core.beta.IBatchProcessor; -import com.fastasyncworldedit.core.beta.IChunk; -import com.fastasyncworldedit.core.beta.IChunkGet; -import com.fastasyncworldedit.core.beta.IChunkSet; -import com.fastasyncworldedit.core.beta.implementation.processors.ProcessorScope; -import com.fastasyncworldedit.core.object.HistoryExtent; +import com.fastasyncworldedit.core.queue.IBatchProcessor; +import com.fastasyncworldedit.core.queue.IChunk; +import com.fastasyncworldedit.core.queue.IChunkGet; +import com.fastasyncworldedit.core.queue.IChunkSet; +import com.fastasyncworldedit.core.extent.processor.ProcessorScope; +import com.fastasyncworldedit.core.extent.HistoryExtent; import com.fastasyncworldedit.core.util.EditSessionBuilder; import com.fastasyncworldedit.core.util.MainUtil; import com.fastasyncworldedit.core.util.TaskManager; @@ -27,7 +27,7 @@ import com.sk89q.worldedit.regions.Region; import com.sk89q.worldedit.world.World; import com.sk89q.worldedit.world.biome.BiomeType; import com.sk89q.worldedit.world.block.BaseBlock; -import com.sk89q.worldedit.world.block.BlockID; +import com.fastasyncworldedit.core.world.block.BlockID; import com.sk89q.worldedit.world.block.BlockState; import java.io.IOException; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/changeset/AbstractDelegateChangeSet.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/history/changeset/AbstractDelegateChangeSet.java similarity index 97% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/changeset/AbstractDelegateChangeSet.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/history/changeset/AbstractDelegateChangeSet.java index 84504e949..1bbf040af 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/changeset/AbstractDelegateChangeSet.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/history/changeset/AbstractDelegateChangeSet.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.changeset; +package com.fastasyncworldedit.core.history.changeset; import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.EditSession; @@ -8,7 +8,6 @@ import com.sk89q.worldedit.history.change.BlockChange; import com.sk89q.worldedit.history.change.Change; import com.sk89q.worldedit.history.change.EntityCreate; import com.sk89q.worldedit.history.change.EntityRemove; -import com.sk89q.worldedit.history.changeset.ChangeSetSummary; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.regions.Region; import com.sk89q.worldedit.world.World; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/changeset/BlockBagChangeSet.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/history/changeset/BlockBagChangeSet.java similarity index 98% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/changeset/BlockBagChangeSet.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/history/changeset/BlockBagChangeSet.java index d27cb4dff..15d62a09c 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/changeset/BlockBagChangeSet.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/history/changeset/BlockBagChangeSet.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.changeset; +package com.fastasyncworldedit.core.history.changeset; import com.fastasyncworldedit.core.FaweCache; import com.sk89q.jnbt.CompoundTag; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/history/changeset/ChangeSetSummary.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/history/changeset/ChangeSetSummary.java similarity index 95% rename from worldedit-core/src/main/java/com/sk89q/worldedit/history/changeset/ChangeSetSummary.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/history/changeset/ChangeSetSummary.java index b8367ea3b..dc0532e60 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/history/changeset/ChangeSetSummary.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/history/changeset/ChangeSetSummary.java @@ -1,4 +1,4 @@ -package com.sk89q.worldedit.history.changeset; +package com.fastasyncworldedit.core.history.changeset; import com.sk89q.worldedit.util.Countable; import com.sk89q.worldedit.world.block.BlockState; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/changeset/FaweStreamChangeSet.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/history/changeset/FaweStreamChangeSet.java similarity index 97% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/changeset/FaweStreamChangeSet.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/history/changeset/FaweStreamChangeSet.java index b38cb7480..429e376ff 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/changeset/FaweStreamChangeSet.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/history/changeset/FaweStreamChangeSet.java @@ -1,13 +1,13 @@ -package com.fastasyncworldedit.core.object.changeset; +package com.fastasyncworldedit.core.history.changeset; import com.fastasyncworldedit.core.configuration.Settings; -import com.fastasyncworldedit.core.object.FaweInputStream; -import com.fastasyncworldedit.core.object.FaweOutputStream; -import com.fastasyncworldedit.core.object.change.MutableBiomeChange; -import com.fastasyncworldedit.core.object.change.MutableBlockChange; -import com.fastasyncworldedit.core.object.change.MutableEntityChange; -import com.fastasyncworldedit.core.object.change.MutableFullBlockChange; -import com.fastasyncworldedit.core.object.change.MutableTileChange; +import com.fastasyncworldedit.core.history.change.MutableBiomeChange; +import com.fastasyncworldedit.core.history.change.MutableBlockChange; +import com.fastasyncworldedit.core.history.change.MutableEntityChange; +import com.fastasyncworldedit.core.history.change.MutableFullBlockChange; +import com.fastasyncworldedit.core.history.change.MutableTileChange; +import com.fastasyncworldedit.core.internal.io.FaweInputStream; +import com.fastasyncworldedit.core.internal.io.FaweOutputStream; import com.fastasyncworldedit.core.util.MainUtil; import com.fastasyncworldedit.core.util.MathMan; import com.sk89q.jnbt.CompoundTag; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/NullChangeSet.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/history/changeset/NullChangeSet.java similarity index 93% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/NullChangeSet.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/history/changeset/NullChangeSet.java index adb22b731..6b4339adf 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/NullChangeSet.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/history/changeset/NullChangeSet.java @@ -1,6 +1,5 @@ -package com.fastasyncworldedit.core.object; +package com.fastasyncworldedit.core.history.changeset; -import com.fastasyncworldedit.core.object.changeset.AbstractChangeSet; import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.extent.inventory.BlockBag; import com.sk89q.worldedit.history.change.Change; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/changeset/SimpleChangeSetSummary.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/history/changeset/SimpleChangeSetSummary.java similarity index 92% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/changeset/SimpleChangeSetSummary.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/history/changeset/SimpleChangeSetSummary.java index 174007b4f..290e940a6 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/changeset/SimpleChangeSetSummary.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/history/changeset/SimpleChangeSetSummary.java @@ -1,6 +1,6 @@ -package com.fastasyncworldedit.core.object.changeset; +package com.fastasyncworldedit.core.history.changeset; -import com.sk89q.worldedit.history.changeset.ChangeSetSummary; +import com.fastasyncworldedit.core.history.changeset.ChangeSetSummary; import com.sk89q.worldedit.world.block.BlockState; import com.sk89q.worldedit.world.block.BlockTypesCache; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/command/MethodInjector.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/internal/command/MethodInjector.java similarity index 92% rename from worldedit-core/src/main/java/com/sk89q/worldedit/internal/command/MethodInjector.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/internal/command/MethodInjector.java index 0ca5e85b7..d900a3797 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/command/MethodInjector.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/internal/command/MethodInjector.java @@ -1,4 +1,4 @@ -package com.sk89q.worldedit.internal.command; +package com.fastasyncworldedit.core.internal.command; import org.enginehub.piston.CommandParameters; import org.enginehub.piston.gen.CommandCallListener; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/exception/FaweBlockBagException.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/internal/exception/FaweBlockBagException.java similarity index 80% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/exception/FaweBlockBagException.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/internal/exception/FaweBlockBagException.java index 698cad3b2..845628262 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/exception/FaweBlockBagException.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/internal/exception/FaweBlockBagException.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.exception; +package com.fastasyncworldedit.core.internal.exception; import com.fastasyncworldedit.core.configuration.Caption; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/exception/FaweChunkLoadException.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/internal/exception/FaweChunkLoadException.java similarity index 80% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/exception/FaweChunkLoadException.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/internal/exception/FaweChunkLoadException.java index 54c38aa0d..c00675580 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/exception/FaweChunkLoadException.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/internal/exception/FaweChunkLoadException.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.exception; +package com.fastasyncworldedit.core.internal.exception; import com.fastasyncworldedit.core.configuration.Caption; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/exception/FaweException.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/internal/exception/FaweException.java similarity index 96% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/exception/FaweException.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/internal/exception/FaweException.java index 9205e89bd..3d923e376 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/exception/FaweException.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/internal/exception/FaweException.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.exception; +package com.fastasyncworldedit.core.internal.exception; import com.sk89q.worldedit.util.formatting.WorldEditText; import com.sk89q.worldedit.util.formatting.text.Component; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/AbstractDelegateOutputStream.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/internal/io/AbstractDelegateOutputStream.java similarity index 93% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/AbstractDelegateOutputStream.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/internal/io/AbstractDelegateOutputStream.java index 39ce6f35b..8ddcc2a1a 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/AbstractDelegateOutputStream.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/internal/io/AbstractDelegateOutputStream.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.io; +package com.fastasyncworldedit.core.internal.io; import java.io.IOException; import java.io.OutputStream; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/FastByteArrayOutputStream.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/internal/io/FastByteArrayOutputStream.java similarity index 97% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/FastByteArrayOutputStream.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/internal/io/FastByteArrayOutputStream.java index 169c2f52e..8ffc036b4 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/FastByteArrayOutputStream.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/internal/io/FastByteArrayOutputStream.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.io; +package com.fastasyncworldedit.core.internal.io; import java.io.IOException; import java.io.OutputStream; @@ -7,7 +7,6 @@ import java.io.Writer; import java.util.ArrayDeque; import java.util.Arrays; - /** * A speedy implementation of ByteArrayOutputStream. It's not synchronized, and it * does not copy buffers when it's expanded. There's also no copying of the internal buffer @@ -22,10 +21,10 @@ public class FastByteArrayOutputStream extends OutputStream { private static final int DEFAULT_BLOCK_SIZE = 8192; - private ArrayDeque buffers = new ArrayDeque<>(); + private final ArrayDeque buffers = new ArrayDeque<>(); private byte[] buffer; - private int blockSize; + private final int blockSize; private int index; private int size; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/FastByteArraysInputStream.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/internal/io/FastByteArraysInputStream.java similarity index 98% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/FastByteArraysInputStream.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/internal/io/FastByteArraysInputStream.java index 8ef9f18b5..34434e691 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/FastByteArraysInputStream.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/internal/io/FastByteArraysInputStream.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.io; +package com.fastasyncworldedit.core.internal.io; import java.io.InputStream; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/FaweInputStream.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/internal/io/FaweInputStream.java similarity index 97% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/FaweInputStream.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/internal/io/FaweInputStream.java index b62525c5c..0a498ddc8 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/FaweInputStream.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/internal/io/FaweInputStream.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object; +package com.fastasyncworldedit.core.internal.io; import com.fastasyncworldedit.core.util.IOUtil; import com.sk89q.jnbt.NBTInputStream; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/FaweOutputStream.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/internal/io/FaweOutputStream.java similarity index 98% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/FaweOutputStream.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/internal/io/FaweOutputStream.java index 28768a07d..bf824c7c6 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/FaweOutputStream.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/internal/io/FaweOutputStream.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object; +package com.fastasyncworldedit.core.internal.io; import com.sk89q.jnbt.NBTOutputStream; import com.sk89q.jnbt.Tag; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/LittleEndianOutputStream.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/internal/io/LittleEndianOutputStream.java similarity index 99% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/LittleEndianOutputStream.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/internal/io/LittleEndianOutputStream.java index 22c317042..c6d028938 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/LittleEndianOutputStream.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/internal/io/LittleEndianOutputStream.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.io; +package com.fastasyncworldedit.core.internal.io; import org.jetbrains.annotations.NotNull; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/NonCloseableInputStream.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/internal/io/NonCloseableInputStream.java similarity index 95% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/NonCloseableInputStream.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/internal/io/NonCloseableInputStream.java index 652538bb9..9e9a74f25 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/NonCloseableInputStream.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/internal/io/NonCloseableInputStream.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.io; +package com.fastasyncworldedit.core.internal.io; import java.io.IOException; import java.io.InputStream; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/ResettableFileInputStream.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/internal/io/ResettableFileInputStream.java similarity index 90% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/ResettableFileInputStream.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/internal/io/ResettableFileInputStream.java index 688ddc3d9..4db2a2da3 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/ResettableFileInputStream.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/internal/io/ResettableFileInputStream.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.io; +package com.fastasyncworldedit.core.internal.io; import java.io.FileInputStream; import java.io.FilterInputStream; @@ -6,7 +6,7 @@ import java.io.IOException; import java.nio.channels.FileChannel; public class ResettableFileInputStream extends FilterInputStream { - private FileChannel myFileChannel; + private final FileChannel myFileChannel; private long mark = 0; public ResettableFileInputStream(FileInputStream fis) { diff --git a/worldedit-core/src/main/java/com/sk89q/jnbt/fawe/CompressedCompoundTag.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/jnbt/CompressedCompoundTag.java similarity index 88% rename from worldedit-core/src/main/java/com/sk89q/jnbt/fawe/CompressedCompoundTag.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/jnbt/CompressedCompoundTag.java index 39eca054c..bcb4d11ad 100644 --- a/worldedit-core/src/main/java/com/sk89q/jnbt/fawe/CompressedCompoundTag.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/jnbt/CompressedCompoundTag.java @@ -1,5 +1,8 @@ -package com.sk89q.jnbt; +package com.fastasyncworldedit.core.jnbt; +import com.sk89q.jnbt.CompoundTag; +import com.sk89q.jnbt.NBTInputStream; +import com.sk89q.jnbt.Tag; import net.jpountz.lz4.LZ4BlockInputStream; import java.io.IOException; diff --git a/worldedit-core/src/main/java/com/sk89q/jnbt/fawe/CompressedSchematicTag.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/jnbt/CompressedSchematicTag.java similarity index 77% rename from worldedit-core/src/main/java/com/sk89q/jnbt/fawe/CompressedSchematicTag.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/jnbt/CompressedSchematicTag.java index a45b86b17..d42768a87 100644 --- a/worldedit-core/src/main/java/com/sk89q/jnbt/fawe/CompressedSchematicTag.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/jnbt/CompressedSchematicTag.java @@ -1,11 +1,10 @@ -package com.sk89q.jnbt.fawe; +package com.fastasyncworldedit.core.jnbt; -import com.fastasyncworldedit.core.object.io.FastByteArrayOutputStream; -import com.fastasyncworldedit.core.object.io.FastByteArraysInputStream; -import com.sk89q.jnbt.CompressedCompoundTag; +import com.fastasyncworldedit.core.internal.io.FastByteArrayOutputStream; +import com.fastasyncworldedit.core.internal.io.FastByteArraysInputStream; import com.sk89q.jnbt.NBTOutputStream; import com.sk89q.worldedit.extent.clipboard.Clipboard; -import com.sk89q.worldedit.extent.clipboard.io.FastSchematicWriter; +import com.fastasyncworldedit.core.extent.clipboard.io.FastSchematicWriter; import net.jpountz.lz4.LZ4BlockInputStream; import net.jpountz.lz4.LZ4BlockOutputStream; diff --git a/worldedit-core/src/main/java/com/sk89q/jnbt/fawe/NumberTag.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/jnbt/NumberTag.java similarity index 79% rename from worldedit-core/src/main/java/com/sk89q/jnbt/fawe/NumberTag.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/jnbt/NumberTag.java index c90428e8d..db1984bb3 100644 --- a/worldedit-core/src/main/java/com/sk89q/jnbt/fawe/NumberTag.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/jnbt/NumberTag.java @@ -1,4 +1,4 @@ -package com.sk89q.jnbt.fawe; +package com.fastasyncworldedit.core.jnbt; import com.sk89q.jnbt.Tag; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/BitArray.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/math/BitArray.java similarity index 99% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/BitArray.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/math/BitArray.java index f3ebdcb18..bf492e3d1 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/BitArray.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/math/BitArray.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.collection; +package com.fastasyncworldedit.core.math; public final class BitArray { diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/BitArrayUnstretched.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/math/BitArrayUnstretched.java similarity index 98% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/BitArrayUnstretched.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/math/BitArrayUnstretched.java index 4f9434ad6..3b759c879 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/BitArrayUnstretched.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/math/BitArrayUnstretched.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.collection; +package com.fastasyncworldedit.core.math; import com.fastasyncworldedit.core.util.MathMan; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/BlockVector3ChunkMap.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/math/BlockVector3ChunkMap.java similarity index 93% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/BlockVector3ChunkMap.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/math/BlockVector3ChunkMap.java index bfb3af54c..d25f347dc 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/BlockVector3ChunkMap.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/math/BlockVector3ChunkMap.java @@ -1,8 +1,8 @@ -package com.fastasyncworldedit.core.object.collection; +package com.fastasyncworldedit.core.math; import com.fastasyncworldedit.core.util.MathMan; +import com.fastasyncworldedit.core.util.collection.IAdaptedMap; import com.sk89q.worldedit.math.BlockVector3; -import com.sk89q.worldedit.math.MutableBlockVector3; import it.unimi.dsi.fastutil.shorts.Short2ObjectArrayMap; import java.util.Map; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/BlockVectorSet.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/math/BlockVectorSet.java similarity index 97% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/BlockVectorSet.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/math/BlockVectorSet.java index 1d64c7476..29bad32ef 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/BlockVectorSet.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/math/BlockVectorSet.java @@ -1,8 +1,7 @@ -package com.fastasyncworldedit.core.object.collection; +package com.fastasyncworldedit.core.math; import com.fastasyncworldedit.core.util.MathMan; import com.sk89q.worldedit.math.BlockVector3; -import com.sk89q.worldedit.math.MutableBlockVector3; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; import it.unimi.dsi.fastutil.objects.ObjectIterator; @@ -25,7 +24,7 @@ import java.util.Set; *

*/ public class BlockVectorSet extends AbstractCollection implements Set { - private Int2ObjectMap localSets = new Int2ObjectOpenHashMap<>(); + private final Int2ObjectMap localSets = new Int2ObjectOpenHashMap<>(); @Override public int size() { diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/math/DelegateBlockVector3.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/math/DelegateBlockVector3.java similarity index 98% rename from worldedit-core/src/main/java/com/sk89q/worldedit/math/DelegateBlockVector3.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/math/DelegateBlockVector3.java index 538f38220..a4dd259e8 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/math/DelegateBlockVector3.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/math/DelegateBlockVector3.java @@ -1,7 +1,10 @@ -package com.sk89q.worldedit.math; +package com.fastasyncworldedit.core.math; import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.extent.Extent; +import com.sk89q.worldedit.math.BlockVector2; +import com.sk89q.worldedit.math.BlockVector3; +import com.sk89q.worldedit.math.Vector3; import com.sk89q.worldedit.world.block.BaseBlock; import com.sk89q.worldedit.world.block.BlockState; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/FastBitSet.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/math/FastBitSet.java similarity index 99% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/FastBitSet.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/math/FastBitSet.java index ab6a14356..97d539416 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/FastBitSet.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/math/FastBitSet.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.collection; +package com.fastasyncworldedit.core.math; import java.util.Arrays; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/IntPair.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/math/IntPair.java similarity index 93% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/IntPair.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/math/IntPair.java index 5cfdf135a..dbb92a118 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/IntPair.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/math/IntPair.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object; +package com.fastasyncworldedit.core.math; public final class IntPair { public int x; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/IntTriple.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/math/IntTriple.java similarity index 94% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/IntTriple.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/math/IntTriple.java index d41ab9502..9cbe86f6c 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/IntTriple.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/math/IntTriple.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object; +package com.fastasyncworldedit.core.math; public final class IntTriple { diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/LocalBlockVectorSet.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/math/LocalBlockVectorSet.java similarity index 98% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/LocalBlockVectorSet.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/math/LocalBlockVectorSet.java index ea8b0d6b0..6bc37ce38 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/LocalBlockVectorSet.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/math/LocalBlockVectorSet.java @@ -1,8 +1,8 @@ -package com.fastasyncworldedit.core.object.collection; +package com.fastasyncworldedit.core.math; import com.fastasyncworldedit.core.util.MathMan; import com.sk89q.worldedit.math.BlockVector3; -import com.sk89q.worldedit.math.MutableBlockVector3; +import com.zaxxer.sparsebits.SparseBitSet; import org.jetbrains.annotations.NotNull; import java.util.Collection; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/math/MutableBlockVector2.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/math/MutableBlockVector2.java similarity index 91% rename from worldedit-core/src/main/java/com/sk89q/worldedit/math/MutableBlockVector2.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/math/MutableBlockVector2.java index 1f9b71bc9..42a090682 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/math/MutableBlockVector2.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/math/MutableBlockVector2.java @@ -1,4 +1,6 @@ -package com.sk89q.worldedit.math; +package com.fastasyncworldedit.core.math; + +import com.sk89q.worldedit.math.BlockVector2; public class MutableBlockVector2 extends BlockVector2 { diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/math/MutableBlockVector3.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/math/MutableBlockVector3.java similarity index 95% rename from worldedit-core/src/main/java/com/sk89q/worldedit/math/MutableBlockVector3.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/math/MutableBlockVector3.java index c2f68f4fb..1b00fe38e 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/math/MutableBlockVector3.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/math/MutableBlockVector3.java @@ -1,6 +1,7 @@ -package com.sk89q.worldedit.math; +package com.fastasyncworldedit.core.math; import com.fastasyncworldedit.core.FaweCache; +import com.sk89q.worldedit.math.BlockVector3; public class MutableBlockVector3 extends BlockVector3 { diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/math/MutableVector3.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/math/MutableVector3.java similarity index 96% rename from worldedit-core/src/main/java/com/sk89q/worldedit/math/MutableVector3.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/math/MutableVector3.java index 878906258..4342150b9 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/math/MutableVector3.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/math/MutableVector3.java @@ -1,6 +1,7 @@ -package com.sk89q.worldedit.math; +package com.fastasyncworldedit.core.math; import com.fastasyncworldedit.core.FaweCache; +import com.sk89q.worldedit.math.Vector3; public class MutableVector3 extends Vector3 { diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/math/OffsetBlockVector3.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/math/OffsetBlockVector3.java similarity index 83% rename from worldedit-core/src/main/java/com/sk89q/worldedit/math/OffsetBlockVector3.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/math/OffsetBlockVector3.java index ea8253632..6c73273a4 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/math/OffsetBlockVector3.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/math/OffsetBlockVector3.java @@ -1,4 +1,6 @@ -package com.sk89q.worldedit.math; +package com.fastasyncworldedit.core.math; + +import com.sk89q.worldedit.math.BlockVector3; public class OffsetBlockVector3 extends DelegateBlockVector3 { private final BlockVector3 offset; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/math/Vector3Impl.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/math/Vector3Impl.java similarity index 87% rename from worldedit-core/src/main/java/com/sk89q/worldedit/math/Vector3Impl.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/math/Vector3Impl.java index 7c1068417..9a5cf7b2f 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/math/Vector3Impl.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/math/Vector3Impl.java @@ -1,4 +1,6 @@ -package com.sk89q.worldedit.math; +package com.fastasyncworldedit.core.math; + +import com.sk89q.worldedit.math.Vector3; public class Vector3Impl extends Vector3 { private final double x; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/random/NoiseRandom.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/math/random/NoiseRandom.java similarity index 94% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/random/NoiseRandom.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/math/random/NoiseRandom.java index 400ce1b77..0c5b86c2a 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/random/NoiseRandom.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/math/random/NoiseRandom.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.random; +package com.fastasyncworldedit.core.math.random; import com.sk89q.worldedit.math.Vector3; import com.sk89q.worldedit.math.noise.NoiseGenerator; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/random/SimpleRandom.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/math/random/SimpleRandom.java similarity index 94% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/random/SimpleRandom.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/math/random/SimpleRandom.java index 31e0c33fa..f8004eb41 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/random/SimpleRandom.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/math/random/SimpleRandom.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.random; +package com.fastasyncworldedit.core.math.random; public interface SimpleRandom { diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/random/SimplexNoise.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/math/random/SimplexNoise.java similarity index 99% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/random/SimplexNoise.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/math/random/SimplexNoise.java index ef917d673..fd14b036f 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/random/SimplexNoise.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/math/random/SimplexNoise.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.random; +package com.fastasyncworldedit.core.math.random; /* * A speed-improved simplex noise algorithm for 2D, 3D and 4D in Java. * diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/math/noise/SimplexNoiseGenerator.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/math/random/SimplexNoiseGenerator.java similarity index 85% rename from worldedit-core/src/main/java/com/sk89q/worldedit/math/noise/SimplexNoiseGenerator.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/math/random/SimplexNoiseGenerator.java index a5e19b6a3..8c937836e 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/math/noise/SimplexNoiseGenerator.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/math/random/SimplexNoiseGenerator.java @@ -1,8 +1,8 @@ -package com.sk89q.worldedit.math.noise; +package com.fastasyncworldedit.core.math.random; -import com.fastasyncworldedit.core.object.random.SimplexNoise; import com.sk89q.worldedit.math.Vector2; import com.sk89q.worldedit.math.Vector3; +import com.sk89q.worldedit.math.noise.NoiseGenerator; public class SimplexNoiseGenerator implements NoiseGenerator { diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/random/TrueRandom.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/math/random/TrueRandom.java similarity index 88% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/random/TrueRandom.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/math/random/TrueRandom.java index 99adaec28..f4d7d9df6 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/random/TrueRandom.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/math/random/TrueRandom.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.random; +package com.fastasyncworldedit.core.math.random; import java.util.SplittableRandom; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/math/transform/RoundedTransform.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/math/transform/RoundedTransform.java similarity index 88% rename from worldedit-core/src/main/java/com/sk89q/worldedit/math/transform/RoundedTransform.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/math/transform/RoundedTransform.java index 8bdca82e8..aefc2997a 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/math/transform/RoundedTransform.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/math/transform/RoundedTransform.java @@ -1,6 +1,7 @@ -package com.sk89q.worldedit.math.transform; +package com.fastasyncworldedit.core.math.transform; import com.sk89q.worldedit.math.Vector3; +import com.sk89q.worldedit.math.transform.Transform; public class RoundedTransform implements Transform { private final Transform transform; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/Metadatable.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/Metadatable.java deleted file mode 100644 index a38da1435..000000000 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/Metadatable.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.fastasyncworldedit.core.object; - -import com.sk89q.worldedit.entity.MapMetadatable; - -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentMap; - -public class Metadatable implements MapMetadatable { - private final ConcurrentMap meta = new ConcurrentHashMap<>(); - - @Override - public Map getRawMeta() { - return meta; - } -} diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/scroll/ScrollTool.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/scroll/ScrollTool.java deleted file mode 100644 index b9ea8de93..000000000 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/scroll/ScrollTool.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.fastasyncworldedit.core.object.brush.scroll; - -import com.sk89q.worldedit.entity.Player; - -public interface ScrollTool { - public boolean increment(Player player, int amount); -} diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/DifferentialArray.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/DifferentialArray.java deleted file mode 100644 index b9b227cb8..000000000 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/DifferentialArray.java +++ /dev/null @@ -1,312 +0,0 @@ -package com.fastasyncworldedit.core.object.collection; - -import com.fastasyncworldedit.core.object.FaweInputStream; -import com.fastasyncworldedit.core.object.FaweOutputStream; -import com.fastasyncworldedit.core.object.io.serialize.Serialize; -import com.fastasyncworldedit.core.util.MainUtil; - -import java.io.IOException; -import java.lang.reflect.Array; -import java.util.Arrays; - -import static com.google.common.base.Preconditions.checkArgument; -import static com.google.common.base.Preconditions.checkNotNull; - -/** - * Records changes made through the {@link #setByte(int, byte)} or {@link #setInt(int, int)} method
- * If you are editing the raw data, use {@link #record(Runnable)} - * @param - */ -public final class DifferentialArray implements DifferentialCollection { - private final byte[] dataBytes; - private byte[] changesBytes; - - private final int[] dataInts; - private int[] changesInts; - - private final char[] dataChars; - private char[] changesChars; - - @Serialize - private final T data; - - private T changes; - - private boolean changed; - private int length; - - public DifferentialArray(T array) { - checkNotNull(array); - Class clazz = array.getClass(); - checkArgument(clazz.isArray(), "Data must be an array"); - checkArgument(clazz.getComponentType().isPrimitive(), "Data must be a primitive array"); - this.data = array; - - if (array instanceof byte[]) { - dataBytes = (byte[]) array; - length = dataBytes.length; - } else { - dataBytes = null; - } - if (array instanceof int[]) { - dataInts = (int[]) array; - length = dataInts.length; - } else { - dataInts = null; - } - if (array instanceof char[]) { - dataChars = (char[]) array; - length = dataChars.length; - } else { - dataChars = null; - } - } - - public void record(Runnable task) { - if (changes == null) { - if (data instanceof byte[]) { - changes = (T) (changesBytes = new byte[length]); - } else if (data instanceof int[]) { - changes = (T) (changesInts = new int[length]); - } else if (data instanceof char[]) { - changes = (T) (changesChars = new char[length]); - } - } - T tmp; - boolean changed = this.changed; - if (changed) { - tmp = (T) MainUtil.copyNd(data); - } else { - tmp = changes; - System.arraycopy(data, 0, tmp, 0, Array.getLength(data)); - } - Throwable caught = null; - try { - task.run(); - } catch (Throwable e) { - caught = e; - task.run(); - } - if (tmp instanceof int[]) { - int[] tmpInts = (int[]) tmp; - for (int i = 0; i < tmpInts.length; i++) { - int tmpInt = tmpInts[i]; - int dataInt = dataInts[i]; - if (tmpInt != dataInt) { - this.changed = true; - tmpInts[i] -= dataInt; - } else { - tmpInts[i] = 0; - } - } - if (changed) { - for (int i = 0; i < tmpInts.length; i++) { - changesInts[i] += tmpInts[i]; - } - } - } else if (tmp instanceof char[]) { - char[] tmpChars = (char[]) tmp; - for (int i = 0; i < tmpChars.length; i++) { - char tmpChar = tmpChars[i]; - char dataChar = dataChars[i]; - if (tmpChar != dataChar) { - this.changed = true; - tmpChars[i] -= dataChar; - } else { - tmpChars[i] = 0; - } - } - if (changed) { - for (int i = 0; i < tmpChars.length; i++) { - changesChars[i] += tmpChars[i]; - } - } - } else if (tmp instanceof byte[]) { - byte[] tmpBytes = (byte[]) tmp; - for (int i = 0; i < tmpBytes.length; i++) { - byte tmpByte = tmpBytes[i]; - byte dataByte = dataBytes[i]; - if (tmpByte != dataByte) { - this.changed = true; - tmpBytes[i] -= dataByte; - } else { - tmpBytes[i] = 0; - } - } - if (changed) { - for (int i = 0; i < tmpBytes.length; i++) { - changesBytes[i] += tmpBytes[i]; - } - } - } - if (caught != null) { - if (caught instanceof RuntimeException) { - throw (RuntimeException) caught; - } else { - throw new RuntimeException(caught); - } - } - } - - @Override - public void flushChanges(FaweOutputStream out) throws IOException { - boolean modified = isModified(); - out.writeBoolean(modified); - if (modified) { - if (dataBytes != null) { - out.write(changesBytes); - } else if (dataInts != null) { - for (int c : changesInts) { - out.writeVarInt(c); - } - } else if (dataChars != null) { - for (char c : changesChars) { - out.writeChar(c); - } - } - } - clearChanges(); - } - - @Override - public void undoChanges(FaweInputStream in) throws IOException { - boolean modified = in.readBoolean(); - if (modified) { - if (dataBytes != null) { - if (changesBytes != null) { - for (int i = 0; i < dataBytes.length; i++) { - dataBytes[i] += changesBytes[i]; - } - } - for (int i = 0; i < dataBytes.length; i++) { - int read = in.read(); - dataBytes[i] += read; - } - } else if (dataInts != null) { - if (changesInts != null) { - for (int i = 0; i < dataInts.length; i++) { - dataInts[i] += changesInts[i]; - } - } - for (int i = 0; i < changesInts.length; i++) { - dataInts[i] += in.readVarInt(); - } - } else if (dataChars != null) { - if (changesChars != null) { - for (int i = 0; i < dataChars.length; i++) { - dataChars[i] += changesChars[i]; - } - } - for (int i = 0; i < dataChars.length; i++) { - dataChars[i] += in.readChar(); - } - } - } - clearChanges(); - } - - @Override - public void redoChanges(FaweInputStream in) throws IOException { - boolean modified = in.readBoolean(); - if (modified) { - if (dataBytes != null) { - for (int i = 0; i < dataBytes.length; i++) { - int read = in.read(); - dataBytes[i] -= read; - } - } else if (dataInts != null) { - for (int i = 0; i < dataChars.length; i++) { - dataInts[i] -= in.readVarInt(); - } - } else if (dataChars != null) { - for (int i = 0; i < dataChars.length; i++) { - dataChars[i] -= in.readChar(); - } - } - } - clearChanges(); - } - - public void clearChanges() { - if (changed) { - changed = false; - if (changes != null) { - if (changesBytes != null) { - Arrays.fill(changesBytes, (byte) 0); - } - if (changesChars != null) { - Arrays.fill(changesChars, (char) 0); - } - if (changesInts != null) { - Arrays.fill(changesInts, 0); - } - } - } - } - - public byte[] getByteArray() { - return dataBytes; - } - - public char[] getCharArray() { - return dataChars; - } - - public int[] getIntArray() { - return dataInts; - } - - public boolean isModified() { - return changed; - } - - @Override - public T get() { - return data; - } - - public byte getByte(int index) { - return dataBytes[index]; - } - - public char getChar(int index) { - return dataChars[index]; - } - - public int getInt(int index) { - return dataInts[index]; - } - - public void setByte(int index, byte value) { - changed = true; - try { - changesBytes[index] += (dataBytes[index] - value); - } catch (NullPointerException ignored) { - changes = (T) (changesBytes = new byte[dataBytes.length]); - changesBytes[index] += (dataBytes[index] - value); - } - dataBytes[index] = value; - } - - public void setInt(int index, int value) { - changed = true; - try { - changesInts[index] += dataInts[index] - value; - } catch (NullPointerException ignored) { - changes = (T) (changesInts = new int[dataInts.length]); - changesInts[index] += dataInts[index] - value; - } - dataInts[index] = value; - } - - public void setChar(int index, char value) { - changed = true; - try { - changesChars[index] += dataChars[index] - value; - } catch (NullPointerException ignored) { - changes = (T) (changesChars = new char[dataChars.length]); - changesChars[index] += dataChars[index] - value; - } - dataChars[index] = value; - } -} diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/DifferentialBlockBuffer.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/DifferentialBlockBuffer.java deleted file mode 100644 index 233962161..000000000 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/DifferentialBlockBuffer.java +++ /dev/null @@ -1,229 +0,0 @@ -package com.fastasyncworldedit.core.object.collection; - -import com.fastasyncworldedit.core.object.FaweInputStream; -import com.fastasyncworldedit.core.object.FaweOutputStream; - -import java.io.IOException; -import java.lang.reflect.Array; - -/** - * Records changes made through the {@link #set(int, int, int, char)} method
- * Changes are not recorded if you edit the raw data - */ -public final class DifferentialBlockBuffer implements DifferentialCollection { - - private final int width; - private final int length; - private final int t1; - private final int t2; - private char[][][][][] data; - private char[][][][][] changes; - - public DifferentialBlockBuffer(int width, int length) { - this.width = width; - this.length = length; - this.t1 = (length + 15) >> 4; - this.t2 = (width + 15) >> 4; - } - - @Override - public char[][][][][] get() { - return data; - } - - @Override - public void flushChanges(FaweOutputStream out) throws IOException { - boolean modified = isModified(); - out.writeBoolean(modified); - - if (modified) { - writeArray(changes, 0, 0, out); - } - clearChanges(); - } - - private void writeArray(Object arr, int level, int index, FaweOutputStream out) throws IOException { - if (level == 4) { - if (arr != null) { - int[] level4 = (int[]) arr; - out.writeVarInt(level4.length); - for (int c : level4) { - out.writeVarInt(c); - } - } else { - out.writeVarInt(0); - } - } else { - int len = arr == null ? 0 : Array.getLength(arr); - out.writeVarInt(len); - for (int i = 0; i < len; i++) { - Object elem = Array.get(arr, i); - writeArray(elem, level + 1, i, out); - } - } - } - - @Override - public void undoChanges(FaweInputStream in) throws IOException { - if (changes != null && changes.length != 0) { - throw new IllegalStateException("There are uncommitted changes, please flush first"); - } - boolean modified = in.readBoolean(); - if (modified) { - int len = in.readVarInt(); - if (len == 0) { - data = null; - } else { - for (int i = 0; i < len; i++) { - readArray(data, i, 1, in); - } - } - } - - clearChanges(); - } - - @Override - public void redoChanges(FaweInputStream in) throws IOException { - clearChanges(); - throw new UnsupportedOperationException("Not implemented"); - } - - private void readArray(Object dataElem, int index, int level, FaweInputStream in) throws IOException { - int len = in.readVarInt(); - if (level == 4) { - int[][] castedElem = (int[][]) dataElem; - if (len == 0) { - castedElem[index] = null; - } else { - int[] current = castedElem[index]; - for (int i = 0; i < len; i++) { - current[i] = in.readVarInt(); - } - } - } else { - if (len == 0) { - Array.set(dataElem, index, null); - } else { - Object nextElem = Array.get(dataElem, index); - for (int i = 0; i < len; i++) { - readArray(nextElem, i, level + 1, in); - } - } - } - } - - public boolean isModified() { - return changes != null; - } - - public void clearChanges() { - changes = null; - } - - public void set(int x, int y, int z, char combined) { - if (combined == 0) { - combined = 1; - } - int localX = x & 15; - int localZ = z & 15; - int chunkX = x >> 4; - int chunkZ = z >> 4; - if (data == null) { - data = new char[t1][][][][]; - changes = new char[0][][][][]; - } - - char[][][][] arr = data[chunkZ]; - if (arr == null) { - arr = data[chunkZ] = new char[t2][][][]; - } - char[][][] arr2 = arr[chunkX]; - if (arr2 == null) { - arr2 = arr[chunkX] = new char[256][][]; - } - - char[][] yMap = arr2[y]; - if (yMap == null) { - arr2[y] = yMap = new char[16][]; - } - boolean newSection; - int current; - char[] zMap = yMap[localZ]; - if (zMap == null) { - yMap[localZ] = zMap = new char[16]; - - if (changes == null) { - changes = new char[t1][][][][]; - } else if (changes != null && changes.length != 0) { - initialChange(changes, chunkX, chunkZ, localX, localZ, y, (char) -combined); - } - - } else { - if (changes == null || changes.length == 0) { - changes = new char[t1][][][][]; - } - appendChange(changes, chunkX, chunkZ, localX, localZ, y, (char) (zMap[localX] - combined)); - } - - zMap[localX] = combined; - } - - private void initialChange(char[][][][][] src, int chunkX, int chunkZ, int localX, int localZ, int y, char combined) { - char[][][][] arr = src[chunkZ]; - if (arr == null) { - src[chunkZ] = new char[0][][][]; - return; - } else if (arr.length == 0) { - return; - } - - char[][][] arr2 = arr[chunkX]; - if (arr2 == null) { - arr[chunkX] = new char[0][][]; - return; - } else if (arr2.length == 0) { - return; - } - - char[][] yMap = arr2[y]; - if (yMap == null) { - arr2[y] = new char[0][]; - return; - } else if (yMap.length == 0) { - return; - } - - char[] zMap = yMap[localZ]; - if (zMap == null) { - yMap[localZ] = new char[0]; - return; - } else if (zMap.length == 0) { - return; - } - - int current = zMap[localX]; - zMap[localX] = combined; - } - - private void appendChange(char[][][][][] src, int chunkX, int chunkZ, int localX, int localZ, int y, char combined) { - char[][][][] arr = src[chunkZ]; - if (arr == null || arr.length == 0) { - arr = src[chunkZ] = new char[t2][][][]; - } - char[][][] arr2 = arr[chunkX]; - if (arr2 == null || arr2.length == 0) { - arr2 = arr[chunkX] = new char[256][][]; - } - - char[][] yMap = arr2[y]; - if (yMap == null || yMap.length == 0) { - arr2[y] = yMap = new char[16][]; - } - char[] zMap = yMap[localZ]; - if (zMap == null || zMap.length == 0) { - yMap[localZ] = zMap = new char[16]; - } - zMap[localX] = combined; - } -} diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/DifferentialCharBlockBuffer.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/DifferentialCharBlockBuffer.java deleted file mode 100644 index 61ce7de46..000000000 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/DifferentialCharBlockBuffer.java +++ /dev/null @@ -1,229 +0,0 @@ -package com.fastasyncworldedit.core.object.collection; - -import com.fastasyncworldedit.core.object.FaweInputStream; -import com.fastasyncworldedit.core.object.FaweOutputStream; - -import java.io.IOException; -import java.lang.reflect.Array; - -/** - * Records changes made through the {@link #set(int, int, int, char)} method
- * Changes are not recorded if you edit the raw data - */ -public final class DifferentialCharBlockBuffer implements DifferentialCollection { - - private final int width; - private final int length; - private final int t1; - private final int t2; - private char[][][][][] data; - private char[][][][][] changes; - - public DifferentialCharBlockBuffer(int width, int length) { - this.width = width; - this.length = length; - this.t1 = (length + 15) >> 4; - this.t2 = (width + 15) >> 4; - } - - @Override - public char[][][][][] get() { - return data; - } - - @Override - public void flushChanges(FaweOutputStream out) throws IOException { - boolean modified = isModified(); - out.writeBoolean(modified); - - if (modified) { - writeArray(changes, 0, 0, out); - } - clearChanges(); - } - - private void writeArray(Object arr, int level, int index, FaweOutputStream out) throws IOException { - if (level == 4) { - if (arr != null) { - char[] level4 = (char[]) arr; - out.writeVarInt(level4.length); - for (char c : level4) { - out.writeChar(c); - } - } else { - out.writeVarInt(0); - } - } else { - int len = arr == null ? 0 : Array.getLength(arr); - out.writeVarInt(len); - for (int i = 0; i < len; i++) { - Object elem = Array.get(arr, i); - writeArray(elem, level + 1, i, out); - } - } - } - - @Override - public void undoChanges(FaweInputStream in) throws IOException { - if (changes != null && changes.length != 0) { - throw new IllegalStateException("There are uncommitted changes, please flush first"); - } - boolean modified = in.readBoolean(); - if (modified) { - int len = in.readVarInt(); - if (len == 0) { - data = null; - } else { - for (int i = 0; i < len; i++) { - readArray(data, i, 1, in); - } - } - } - - clearChanges(); - } - - @Override - public void redoChanges(FaweInputStream in) throws IOException { - clearChanges(); - throw new UnsupportedOperationException("Not implemented"); - } - - private void readArray(Object dataElem, int index, int level, FaweInputStream in) throws IOException { - int len = in.readVarInt(); - if (level == 4) { - char[][] castedElem = (char[][]) dataElem; - if (len == 0) { - castedElem[index] = null; - } else { - char[] current = castedElem[index]; - for (int i = 0; i < len; i++) { - current[i] = in.readChar(); - } - } - } else { - if (len == 0) { - Array.set(dataElem, index, null); - } else { - Object nextElem = Array.get(dataElem, index); - for (int i = 0; i < len; i++) { - readArray(nextElem, i, level + 1, in); - } - } - } - } - - public boolean isModified() { - return changes != null; - } - - public void clearChanges() { - changes = null; - } - - public void set(int x, int y, int z, char combined) { - if (combined == 0) { - combined = 1; - } - int localX = x & 15; - int localZ = z & 15; - int chunkX = x >> 4; - int chunkZ = z >> 4; - if (data == null) { - data = new char[t1][][][][]; - changes = new char[0][][][][]; - } - - char[][][][] arr = data[chunkZ]; - if (arr == null) { - arr = data[chunkZ] = new char[t2][][][]; - } - char[][][] arr2 = arr[chunkX]; - if (arr2 == null) { - arr2 = arr[chunkX] = new char[256][][]; - } - - char[][] yMap = arr2[y]; - if (yMap == null) { - arr2[y] = yMap = new char[16][]; - } - boolean newSection; - char current; - char[] zMap = yMap[localZ]; - if (zMap == null) { - yMap[localZ] = zMap = new char[16]; - - if (changes == null) { - changes = new char[t1][][][][]; - } else if (changes != null && changes.length != 0) { - initialChange(changes, chunkX, chunkZ, localX, localZ, y, (char) -combined); - } - - } else { - if (changes == null || changes.length == 0) { - changes = new char[t1][][][][]; - } - appendChange(changes, chunkX, chunkZ, localX, localZ, y, (char) (zMap[localX] - combined)); - } - - zMap[localX] = combined; - } - - private void initialChange(char[][][][][] src, int chunkX, int chunkZ, int localX, int localZ, int y, char combined) { - char[][][][] arr = src[chunkZ]; - if (arr == null) { - src[chunkZ] = new char[0][][][]; - return; - } else if (arr.length == 0) { - return; - } - - char[][][] arr2 = arr[chunkX]; - if (arr2 == null) { - arr[chunkX] = new char[0][][]; - return; - } else if (arr2.length == 0) { - return; - } - - char[][] yMap = arr2[y]; - if (yMap == null) { - arr2[y] = new char[0][]; - return; - } else if (yMap.length == 0) { - return; - } - - char[] zMap = yMap[localZ]; - if (zMap == null) { - yMap[localZ] = new char[0]; - return; - } else if (zMap.length == 0) { - return; - } - - char current = zMap[localX]; - zMap[localX] = combined; - } - - private void appendChange(char[][][][][] src, int chunkX, int chunkZ, int localX, int localZ, int y, char combined) { - char[][][][] arr = src[chunkZ]; - if (arr == null || arr.length == 0) { - arr = src[chunkZ] = new char[t2][][][]; - } - char[][][] arr2 = arr[chunkX]; - if (arr2 == null || arr2.length == 0) { - arr2 = arr[chunkX] = new char[256][][]; - } - - char[][] yMap = arr2[y]; - if (yMap == null || yMap.length == 0) { - arr2[y] = yMap = new char[16][]; - } - char[] zMap = yMap[localZ]; - if (zMap == null || zMap.length == 0) { - yMap[localZ] = zMap = new char[16]; - } - zMap[localX] = combined; - } -} diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/DifferentialCollection.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/DifferentialCollection.java deleted file mode 100644 index e3d192e2f..000000000 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/DifferentialCollection.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.fastasyncworldedit.core.object.collection; - -import com.fastasyncworldedit.core.object.change.StreamChange; - -public interface DifferentialCollection extends StreamChange { - public T get(); -} diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/LocalBlockVector2DSet.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/LocalBlockVector2DSet.java deleted file mode 100644 index 25dcb1e0c..000000000 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/LocalBlockVector2DSet.java +++ /dev/null @@ -1,250 +0,0 @@ -package com.fastasyncworldedit.core.object.collection; - -import com.fastasyncworldedit.core.util.MathMan; -import com.sk89q.worldedit.math.BlockVector2; -import com.sk89q.worldedit.math.MutableBlockVector2; -import org.jetbrains.annotations.NotNull; - -import java.util.Collection; -import java.util.Iterator; -import java.util.Set; - -/** - * The LocalPartitionedBlockVector2DSet is a Memory and CPU optimized Set for storing Vector2Ds which are all in a local region - * - All Vector2Ds must be within x[0,32768), y[0,32768) - * - This will use 8 bytes for every 64 Vector2Ds (about 800x less than a HashSet) - */ -public class LocalBlockVector2DSet implements Set { - private final SparseBitSet set; - private final MutableBlockVector2 mutable = new MutableBlockVector2(); - - public LocalBlockVector2DSet() { - this.set = new SparseBitSet(); - } - - public SparseBitSet getBitSet() { - return set; - } - - @Override - public int size() { - return set.cardinality(); - } - - @Override - public boolean isEmpty() { - return set.isEmpty(); - } - - public boolean contains(int x, int y) { - return set.get(MathMan.pairSearchCoords(x, y)); - } - - @Override - public boolean contains(Object o) { - if (o instanceof BlockVector2) { - BlockVector2 v = (BlockVector2) o; - return contains(v.getBlockX(), v.getBlockZ()); - } - return false; - } - - public boolean containsRadius(int x, int y, int radius) { - int size = size(); - if (size == 0) { - return false; - } - if (radius <= 0 || size == 1) { - return contains(x, y); - } -// int centerIndex = MathMan.pairSearchCoords(x, y); - int length = (radius << 1) + 1; - if (size() < length * length) { - int index = -1; - int count = 0; - while ((index = set.nextSetBit(index + 1)) != -1) { -// if (index == centerIndex) continue; - int curx = MathMan.unpairSearchCoordsX(index); - int cury = MathMan.unpairSearchCoordsY(index); - if (Math.abs(curx - x) <= radius && Math.abs(cury - y) <= radius) { - return true; - } - } - return false; - } - int bcx = Math.max(0, (x - radius) >> 4); - int bcy = Math.max(0, (y - radius) >> 4); - int tcx = Math.min(2047, (x + radius) >> 4); - int tcy = Math.min(2047, (y + radius) >> 4); - for (int cy = bcy; cy <= tcy; cy++) { - for (int cx = bcx; cx <= tcx; cx++) { - int index = MathMan.pairSearchCoords(cx << 4, cy << 4) - 1; - int endIndex = index + 256; - while ((index = set.nextSetBit(index + 1)) != -1 && index <= endIndex) { -// if (index == centerIndex) continue; - int curx = MathMan.unpairSearchCoordsX(index); - int cury = MathMan.unpairSearchCoordsY(index); - if (Math.abs(curx - x) <= radius && Math.abs(cury - y) <= radius) { - return true; - } - } - } - } - return false; - } - - public BlockVector2 getIndex(int getIndex) { - int size = size(); - if (getIndex > size) { - return null; - } - int index = -1; - for (int i = 0; i <= getIndex; i++) { - index = set.nextSetBit(index + 1); - } - if (index != -1) { - int x = MathMan.unpairSearchCoordsX(index); - int y = MathMan.unpairSearchCoordsY(index); - return mutable.setComponents(x, y); - } - return null; - } - - @Override - public Iterator iterator() { - return new Iterator() { - int index = set.nextSetBit(0); - int previous = -1; - - @Override - public void remove() { - set.clear(previous); - } - - @Override - public boolean hasNext() { - return index != -1; - } - - @Override - public BlockVector2 next() { - if (index != -1) { - int x = MathMan.unpairSearchCoordsX(index); - int y = MathMan.unpairSearchCoordsY(index); - mutable.setComponents(x, y); - previous = index; - index = set.nextSetBit(index + 1); - return mutable; - } - return null; - } - }; - } - - @Override - public Object[] toArray() { - return toArray((Object[]) null); - } - - @Override - public T[] toArray(T[] array) { - int size = size(); - if (array == null || array.length < size) { - array = (T[]) new BlockVector2[size]; - } - int index = 0; - for (int i = 0; i < size; i++) { - index = set.nextSetBit(index); - int x = MathMan.unpairSearchCoordsX(index); - int y = MathMan.unpairSearchCoordsY(index); - array[i] = (T) BlockVector2.at(x, y); - index++; - } - return array; - } - - public boolean add(int x, int y) { - if (x < 0 || x > 32766 || y < 0 || y > 32766) { - throw new UnsupportedOperationException("LocalVector2DSet can only contain Vector2Ds within 1024 blocks (cuboid) of the first entry. "); - } - int index = getIndex(x, y); - if (set.get(index)) { - return false; - } else { - set.set(index); - return true; - } - } - - @Override - public boolean add(BlockVector2 vector) { - return add(vector.getBlockX(), vector.getBlockZ()); - } - - private int getIndex(BlockVector2 vector) { - return MathMan.pairSearchCoords(vector.getBlockX(), vector.getBlockZ()); - } - - private int getIndex(int x, int y) { - return MathMan.pairSearchCoords(x, y); - } - - public boolean remove(int x, int y) { - if (x < 0 || x > 32766 || y < 0 || y > 32766) { - return false; - } - int index = MathMan.pairSearchCoords(x, y); - boolean value = set.get(index); - if (value) { - set.clear(index); - } - return value; - } - - @Override - public boolean remove(Object o) { - if (o instanceof BlockVector2) { - BlockVector2 v = (BlockVector2) o; - return remove(v.getBlockX(), v.getBlockZ()); - } - return false; - } - - @Override - public boolean containsAll(Collection c) { - return c.stream().allMatch(this::contains); - } - - @Override - public boolean addAll(Collection c) { - return c.stream().map(this::add).reduce(false, (a, b) -> a || b); - } - - @Override - public boolean retainAll(@NotNull Collection c) { - boolean result = false; - int size = size(); - int index = -1; - for (int i = 0; i < size; i++) { - index = set.nextSetBit(index + 1); - int x = MathMan.unpairSearchCoordsX(index); - int y = MathMan.unpairSearchCoordsY(index); - mutable.setComponents(x, y); - if (!c.contains(mutable)) { - result = true; - set.clear(index); - } - } - return result; - } - - @Override - public boolean removeAll(Collection c) { - return c.stream().map(this::remove).reduce(false, (a, b) -> a || b); - } - - @Override - public void clear() { - set.clear(); - } -} diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/ObjObjMap.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/ObjObjMap.java deleted file mode 100644 index cddb1b302..000000000 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/ObjObjMap.java +++ /dev/null @@ -1,233 +0,0 @@ -package com.fastasyncworldedit.core.object.collection; - -import java.util.Arrays; -import javax.annotation.Nonnull; - -import static it.unimi.dsi.fastutil.HashCommon.arraySize; - -public class ObjObjMap { - - private static final Object FREE_KEY = new Object(); - private static final Object REMOVED_KEY = new Object(); - - /** - * Keys and values - */ - private Object[] m_data; - - /** - * Value for the null key (if inserted into a map) - */ - private Object m_nullValue; - private boolean m_hasNull; - - /** - * Fill factor, must be between (0 and 1) - */ - private final float m_fillFactor; - /** - * We will resize a map once it reaches this size - */ - private int m_threshold; - /** - * Current map size - */ - private int m_size; - /** - * Mask to calculate the original position - */ - private int m_mask; - /** - * Mask to wrap the actual array pointer - */ - private int m_mask2; - - public ObjObjMap(int size, float fillFactor) { - if (fillFactor <= 0 || fillFactor >= 1) { - throw new IllegalArgumentException("FillFactor must be in (0, 1)"); - } - if (size <= 0) { - throw new IllegalArgumentException("Size must be positive!"); - } - final int capacity = arraySize(size, fillFactor); - m_mask = capacity - 1; - m_mask2 = capacity * 2 - 1; - m_fillFactor = fillFactor; - - m_data = new Object[capacity * 2]; - Arrays.fill(m_data, FREE_KEY); - - m_threshold = (int) (capacity * fillFactor); - } - - public V get(@Nonnull K key) { -// if ( key == null ) -// return (V) m_nullValue; //we null it on remove, so safe not to check a flag here - - int ptr = (key.hashCode() & m_mask) << 1; - Object k = m_data[ptr]; - -// if ( k == FREE_KEY ) -// return null; //end of chain already - if (k == key) {//we check FREE and REMOVED prior to this call - return (V) m_data[ptr + 1]; - } - while (true) { - ptr = ptr + 2 & m_mask2; //that's next index - k = m_data[ptr]; -// if ( k == FREE_KEY ) -// return null; - if (k == key) { - return (V) m_data[ptr + 1]; - } - } - } - - public V put(K key, V value) { - if (key == null) { - return insertNullKey(value); - } - - int ptr = getStartIndex(key) << 1; - Object k = m_data[ptr]; - - if (k == FREE_KEY) {//end of chain already - m_data[ptr] = key; - m_data[ptr + 1] = value; - if (m_size >= m_threshold) { - rehash(m_data.length * 2); //size is set inside - } else { - ++m_size; - } - return null; - } else if (k == key) { //we check FREE and REMOVED prior to this call - final Object ret = m_data[ptr + 1]; - m_data[ptr + 1] = value; - return (V) ret; - } - - int firstRemoved = -1; - if (k == REMOVED_KEY) { - firstRemoved = ptr; //we may find a key later - } - - while (true) { - ptr = ptr + 2 & m_mask2; //that's next index calculation - k = m_data[ptr]; - if (k == FREE_KEY) { - if (firstRemoved != -1) { - ptr = firstRemoved; - } - m_data[ptr] = key; - m_data[ptr + 1] = value; - if (m_size >= m_threshold) { - rehash(m_data.length * 2); //size is set inside - } else { - ++m_size; - } - return null; - } else if (k == key) { - final Object ret = m_data[ptr + 1]; - m_data[ptr + 1] = value; - return (V) ret; - } else if (k == REMOVED_KEY) { - if (firstRemoved == -1) { - firstRemoved = ptr; - } - } - } - } - - public V remove(K key) { - if (key == null) { - return removeNullKey(); - } - - int ptr = getStartIndex(key) << 1; - Object k = m_data[ptr]; - if (k == FREE_KEY) { - return null; //end of chain already - } else if (k == key) { //we check FREE and REMOVED prior to this call - --m_size; - if (m_data[ptr + 2 & m_mask2] == FREE_KEY) { - m_data[ptr] = FREE_KEY; - } else { - m_data[ptr] = REMOVED_KEY; - } - final V ret = (V) m_data[ptr + 1]; - m_data[ptr + 1] = null; - return ret; - } - while (true) { - ptr = ptr + 2 & m_mask2; //that's next index calculation - k = m_data[ptr]; - if (k == FREE_KEY) { - return null; - } else if (k == key) { - --m_size; - if (m_data[ptr + 2 & m_mask2] == FREE_KEY) { - m_data[ptr] = FREE_KEY; - } else { - m_data[ptr] = REMOVED_KEY; - } - final V ret = (V) m_data[ptr + 1]; - m_data[ptr + 1] = null; - return ret; - } - } - } - - private V insertNullKey(V value) { - if (m_hasNull) { - final Object ret = m_nullValue; - m_nullValue = value; - return (V) ret; - } else { - m_nullValue = value; - ++m_size; - return null; - } - } - - private V removeNullKey() { - if (m_hasNull) { - final Object ret = m_nullValue; - m_nullValue = null; - m_hasNull = false; - --m_size; - return (V) ret; - } else { - return null; - } - } - - public int size() { - return m_size; - } - - private void rehash(int newCapacity) { - m_threshold = (int) (newCapacity / 2 * m_fillFactor); - m_mask = newCapacity / 2 - 1; - m_mask2 = newCapacity - 1; - - final int oldCapacity = m_data.length; - final Object[] oldData = m_data; - - m_data = new Object[newCapacity]; - Arrays.fill(m_data, FREE_KEY); - - m_size = m_hasNull ? 1 : 0; - - for (int i = 0; i < oldCapacity; i += 2) { - final Object oldKey = oldData[i]; - if (oldKey != FREE_KEY && oldKey != REMOVED_KEY) { - put((K) oldKey, (V) oldData[i + 1]); - } - } - } - - public int getStartIndex(Object key) { - //key is not null here - return key.hashCode() & m_mask; - } -} diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/SoftHashMap.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/SoftHashMap.java deleted file mode 100644 index 2e2c0a0c5..000000000 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/SoftHashMap.java +++ /dev/null @@ -1,326 +0,0 @@ -package com.fastasyncworldedit.core.object.collection; - -import org.jetbrains.annotations.NotNull; - -import java.lang.ref.ReferenceQueue; -import java.lang.ref.SoftReference; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; -import java.util.Queue; -import java.util.Set; -import java.util.WeakHashMap; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentLinkedQueue; -import java.util.concurrent.locks.ReentrantLock; - - -/** - * A SoftHashMap is a memory-constrained map that stores its values in - * {@link SoftReference SoftReference}s. (Contrast this with the JDK's - * {@link WeakHashMap WeakHashMap}, which uses weak references for its keys, which is of little value if you - * want the cache to auto-resize itself based on memory constraints). - *

- * Having the values wrapped by soft references allows the cache to automatically reduce its size based on memory - * limitations and garbage collection. This ensures that the cache will not cause memory leaks by holding strong - * references to all of its values. - *

- * This class is a generics-enabled Map based on initial ideas from Heinz Kabutz's and Sydney Redelinghuys's - * publicly posted version (with their approval), with - * continued modifications. It was copied from the Apache Shiro framework. - *

- * This implementation is thread-safe and usable in concurrent environments. - * - * @see SoftReference - * @see Apache Shiro - * @since 0.8 - */ -public class SoftHashMap implements Map { - - /** - * The default value of the RETENTION_SIZE attribute, equal to 100. - */ - private static final int DEFAULT_RETENTION_SIZE = 100; - - /** - * The internal HashMap that will hold the SoftReference. - */ - private final Map> map; - - /** - * The number of strong references to hold internally, that is, the number of instances to prevent - * from being garbage collected automatically (unlike other soft references). - */ - private final int RETENTION_SIZE; - - /** - * The FIFO list of strong references (not to be garbage collected), order of last access. - */ - private final Queue strongReferences; //guarded by 'strongReferencesLock' - private final ReentrantLock strongReferencesLock; - - /** - * Reference queue for cleared SoftReference objects. - */ - private final ReferenceQueue queue; - - /** - * Creates a new SoftHashMap with a default retention size size of - * {@link #DEFAULT_RETENTION_SIZE DEFAULT_RETENTION_SIZE} (100 entries). - * - * @see #SoftHashMap(int) - */ - public SoftHashMap() { - this(DEFAULT_RETENTION_SIZE); - } - - /** - * Creates a new SoftHashMap with the specified retention size. - *

- * The retention size (n) is the total number of most recent entries in the map that will be strongly referenced - * (ie 'retained') to prevent them from being eagerly garbage collected. That is, the point of a SoftHashMap is to - * allow the garbage collector to remove as many entries from this map as it desires, but there will always be (n) - * elements retained after a GC due to the strong references. - *

- * Note that in a highly concurrent environments the exact total number of strong references may differ slightly - * than the actual {@code retentionSize} value. This number is intended to be a best-effort retention low - * water mark. - * - * @param retentionSize the total number of most recent entries in the map that will be strongly referenced - * (retained), preventing them from being eagerly garbage collected by the JVM. - */ - public SoftHashMap(int retentionSize) { - super(); - RETENTION_SIZE = Math.max(0, retentionSize); - queue = new ReferenceQueue<>(); - strongReferencesLock = new ReentrantLock(); - map = new ConcurrentHashMap<>(); - strongReferences = new ConcurrentLinkedQueue<>(); - } - - /** - * Creates a {@code SoftHashMap} backed by the specified {@code source}, with a default retention - * size of {@link #DEFAULT_RETENTION_SIZE DEFAULT_RETENTION_SIZE} (100 entries). - * - * @param source the backing map to populate this {@code SoftHashMap} - * @see #SoftHashMap(Map, int) - */ - public SoftHashMap(Map source) { - this(DEFAULT_RETENTION_SIZE); - putAll(source); - } - - /** - * Creates a {@code SoftHashMap} backed by the specified {@code source}, with the specified retention size. - *

- * The retention size (n) is the total number of most recent entries in the map that will be strongly referenced - * (ie 'retained') to prevent them from being eagerly garbage collected. That is, the point of a SoftHashMap is to - * allow the garbage collector to remove as many entries from this map as it desires, but there will always be (n) - * elements retained after a GC due to the strong references. - *

- * Note that in a highly concurrent environments the exact total number of strong references may differ slightly - * than the actual {@code retentionSize} value. This number is intended to be a best-effort retention low - * water mark. - * - * @param source the backing map to populate this {@code SoftHashMap} - * @param retentionSize the total number of most recent entries in the map that will be strongly referenced - * (retained), preventing them from being eagerly garbage collected by the JVM. - */ - public SoftHashMap(Map source, int retentionSize) { - this(retentionSize); - putAll(source); - } - - @Override - public V get(Object key) { - processQueue(); - - V result = null; - SoftValue value = map.get(key); - - if (value != null) { - //unwrap the 'real' value from the SoftReference - result = value.get(); - if (result == null) { - //The wrapped value was garbage collected, so remove this entry from the backing map: - //noinspection SuspiciousMethodCalls - map.remove(key); - } else { - //Add this value to the beginning of the strong reference queue (FIFO). - addToStrongReferences(result); - } - } - return result; - } - - private void addToStrongReferences(V result) { - strongReferencesLock.lock(); - try { - strongReferences.add(result); - trimStrongReferencesIfNecessary(); - } finally { - strongReferencesLock.unlock(); - } - - } - - //Guarded by the strongReferencesLock in the addToStrongReferences method - - private void trimStrongReferencesIfNecessary() { - //trim the strong ref queue if necessary: - while (strongReferences.size() > RETENTION_SIZE) { - strongReferences.poll(); - } - } - - /** - * Traverses the ReferenceQueue and removes garbage-collected SoftValue objects from the backing map - * by looking them up using the SoftValue.key data member. - */ - private void processQueue() { - SoftValue sv; - while ((sv = (SoftValue) queue.poll()) != null) { - //noinspection SuspiciousMethodCalls - map.remove(sv.key); // we can access private data! - } - } - - @Override - public boolean isEmpty() { - processQueue(); - return map.isEmpty(); - } - - @Override - public boolean containsKey(Object key) { - processQueue(); - return map.containsKey(key); - } - - @Override - public boolean containsValue(Object value) { - processQueue(); - Collection values = values(); - return values.contains(value); - } - - @Override - public void putAll(@NotNull Map m) { - if (m.isEmpty()) { - processQueue(); - return; - } - for (Map.Entry entry : m.entrySet()) { - put(entry.getKey(), entry.getValue()); - } - } - - @Override - @NotNull - public Set keySet() { - processQueue(); - return map.keySet(); - } - - @Override - @NotNull - public Collection values() { - processQueue(); - Collection keys = map.keySet(); - if (keys.isEmpty()) { - //noinspection unchecked - return Collections.emptySet(); - } - Collection values = new ArrayList<>(keys.size()); - for (K key : keys) { - V v = get(key); - if (v != null) { - values.add(v); - } - } - return values; - } - - /** - * Creates a new entry, but wraps the value in a SoftValue instance to enable auto garbage collection. - */ - @Override - public V put(K key, V value) { - processQueue(); // throw out garbage collected values first - SoftValue sv = new SoftValue<>(value, key, queue); - SoftValue previous = map.put(key, sv); - addToStrongReferences(value); - return previous != null ? previous.get() : null; - } - - @Override - public V remove(Object key) { - processQueue(); // throw out garbage collected values first - SoftValue raw = map.remove(key); - return raw != null ? raw.get() : null; - } - - @Override - public void clear() { - strongReferencesLock.lock(); - try { - strongReferences.clear(); - } finally { - strongReferencesLock.unlock(); - } - processQueue(); // throw out garbage collected values - map.clear(); - } - - @Override - public int size() { - processQueue(); // throw out garbage collected values first - return map.size(); - } - - @Override - @NotNull - public Set> entrySet() { - processQueue(); // throw out garbage collected values first - Collection keys = map.keySet(); - if (keys.isEmpty()) { - //noinspection unchecked - return Collections.emptySet(); - } - - Map kvPairs = new HashMap<>(keys.size()); - for (K key : keys) { - V v = get(key); - if (v != null) { - kvPairs.put(key, v); - } - } - return kvPairs.entrySet(); - } - - /** - * We define our own subclass of SoftReference which contains - * not only the value but also the key to make it easier to find - * the entry in the HashMap after it's been garbage collected. - */ - private static class SoftValue extends SoftReference { - - private final K key; - - /** - * Constructs a new instance, wrapping the value, key, and queue, as - * required by the superclass. - * - * @param value the map value - * @param key the map key - * @param queue the soft reference queue to poll to determine if the entry had been reaped by the GC. - */ - private SoftValue(V value, K key, ReferenceQueue queue) { - super(value, queue); - this.key = key; - } - - } -} diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/SparseBitSet.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/SparseBitSet.java deleted file mode 100644 index 43d43ba8f..000000000 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/SparseBitSet.java +++ /dev/null @@ -1,3097 +0,0 @@ -package com.fastasyncworldedit.core.object.collection; - -/*- This software is the work of Paladin Software International, Incorporated, - * based upon previous work done for and by Sun Microsystems, Inc. */ - -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.io.Serializable; - -/** - * This class implements a set of bits that grows as needed. Each bit of the - * bit set represents a boolean value. The values of a - * SparseBitSet are indexed by non-negative integers. - * Individual indexed values may be examined, set, cleared, or modified by - * logical operations. One SparseBitSet or logical value may be - * used to modify the contents of (another) SparseBitSet through - * logical AND, logical inclusive OR, logical exclusive - * OR, and And NOT operations over all or part of the bit sets. - *

- * All values in a bit set initially have the value false. - *

- * Every bit set has a current size, which is the number of bits of space - * nominally in use by the bit set from the first set bit to just after - * the last set bit. The length of the bit set effectively tells the position - * available after the last bit of the SparseBitSet. - *

- * The maximum cardinality of a SparseBitSet is - * Integer.MAX_VALUE, which means the bits of a - * SparseBitSet are labelled - * 0 .. Integer.MAX_VALUE − 1. - * After the last set bit of a SparseBitSet, any attempt to find - * a subsequent bit (nextSetBit()), will return an value of −1. - * If an attempt is made to use nextClearBit(), and all the bits are - * set from the starting position of the search to the bit labelled - * Integer.MAX_VALUE − 1, then similarly −1 - * will be returned. - *

- * Unless otherwise noted, passing a null parameter to any of the methods in - * a SparseBitSet will result in a - * NullPointerException. - *

- * A SparseBitSet is not safe for multi-threaded use without - * external synchronization. - * - * @author Bruce K. Haddon - * @author Arthur van Hoff - * @author Michael McCloskey - * @author Martin Buchholz - * @version 1.0, 2009-03-17 - * @since 1.6 - */ -@SuppressWarnings("ALL") -public class SparseBitSet implements Cloneable, Serializable -{ - /* My apologies for listing all the additional authors, but concepts, code, - and even comments have been re-used in this class definition from code in - the JDK that was written and/or maintained by these people. I owe a debt, - which I acknowledge. But they are in no way responsible for what ever - misuse I have made of their work. - Bruce K. Haddon - - The representation of a SparseBitSet is packed into "words", and the words - are stored in arrays which are here referred to as "blocks." Blocks are - accessed by two levels of indirection from the master "level 1" (whole) - set array through second level arrays called "areas" (making the blocks - "level3"). A "word" is a long, consisting of 64 bits, requiring six address - bits to select a bit within a word (and this is considered in places to be - a "level4"). This choice of a long for "word" is determined purely by - performance concerns, and is built into the implementation in a deep way, - because the references to blocks are always of the form "long[]." (This - does not mean that blocks could not be changed to arrays of ints, but it - would take some extensive work.) - - The fact that there are three levels is also deeply involved in the - scanning algorithms, meaning that the accesses are always nested three - deep. Again, the change this might be a large amount of work. On the - other hand, these three levels have proven, so far, to provide adequate - speed, and an storage efficient way to deal with sparseness. - - For simplicity, the level3 blocks and the level2 areas are always "full" - size, i.e., LENGTH3 and LENGTH2 respectively, and for consistency, the - fourth level is of length LENGTH4. The level1 structure is of variable - length (as this may save scanning several thousand null pointers, and - careful consideration must be taken of this at all times, in particular, - when choosing to increase the size (see resize()). The only place where - this array is reduced in size is when a clone is made, in which case it is - created with the smallest size, and allowed to grow as entries are copied - to it. That all the arrays are kept to power-of-2 sizes is a programming - convenience (permitting shifts and masks). - - Whenever possible, a level 3 block that contains no bits (all the words are - zero, is discarded, and its reference is replaced by a null value. - Similarly, level 2 areas that contain only null pointers (to level 3 - blocks) are discarded, and their references replaced by null values. This - is the "normalized" condition, but does not have to be nor is strictly - enforced. The operations still work if the representation is partially or - totally "denormalized." In particular, the methods that deal with single - bits (setting, flipping, clearing, etc.) do not attempt to normalize the - set, in the interests of speed. However, when a set is scanned as the - resultant set of some operation, then, in most cases, the set will be - normalized--the exception being level2 areas that are not completely scanned - in a particular pass. - - The sizes of the blocks and areas has been the result of some investigation - with varying sizes, and the sizes selected appear to represent a reasonable - "sweet" spot. There is, of course, no guarantee that these are the best - for all possible situations, but, given that not having these the same - for all bit sets would be hopelessly complex (bad enough as is), these - values appear to be a fair compromise. */ - - /** - * This value controls for format of the toString() output. - * @see #toStringCompaction(int) - */ - protected transient int compactionCount; - - /** - * The compaction count default. - */ - static int compactionCountDefault = 2; // Note: this is not final! - - /** - * The storage for this SparseBitSet. The ith bit is stored in a word - * represented by a long value, and is at bit position i % 64 - * within that word (where bit position 0 refers to the least significant bit - * and 63 refers to the most significant bit). - *

- * The words are organized into blocks, and the blocks are accessed by two - * additional levels of array indexing. - */ - protected transient long[][][] bits; - - /** - * For the current size of the bits array, this is the maximum possible - * length of the bit set, i.e., the index of the last possible bit, plus one. - * Note: this not the value returned by length(). - * @see #resize(int) - * @see #length() - */ - protected transient int bitsLength; - - //============================================================================== - // The critical parameters. These are set up so that the compiler may - // pre-compute all the values as compile-time constants. - //============================================================================== - - /** - * The number of bits in a long value. - */ - protected static final int LENGTH4 = Long.SIZE; - - /** - * The number of bits in a positive integer, and the size of permitted index - * of a bit in the bit set. - */ - protected static final int INDEX_SIZE = Integer.SIZE - 1; - - /** - * The label (index) of a bit in the bit set is essentially broken into - * 4 "levels". Respectively (from the least significant end), level4, the - * address within word, the address within a level3 block, the address within - * a level2 area, and the level1 address of that area within the set. - * - * LEVEL4 is the number of bits of the level4 address (number of bits need - * to address the bits in a long) - */ - protected static final int LEVEL4 = 6; - - /** - * LEVEL3 is the number of bits of the level3 address. - */ - protected static final int LEVEL3 = 5; // Do not change! - /** - * LEVEL2 is the number of bits of the level2 address. - */ - protected static final int LEVEL2 = 5; // Do not change! - /** - * LEVEL1 is the number of bits of the level1 address. - */ - protected static final int LEVEL1 = INDEX_SIZE - LEVEL2 - LEVEL3 - LEVEL4; - - /** - * MAX_LENGTH1 is the maximum number of entries in the level1 set array. - */ - protected static final int MAX_LENGTH1 = 1 << LEVEL1; - - /** - * LENGTH2 is the number of entries in the any level2 area. - */ - protected static final int LENGTH2 = 1 << LEVEL2; - - /** - * LENGTH3 is the number of entries in the any level3 block. - */ - protected static final int LENGTH3 = 1 << LEVEL3; - - /** - * The shift to create the word index. (I.e., move it to the right end) - */ - protected static final int SHIFT3 = LEVEL4; - - /** - * MASK3 is the mask to extract the LEVEL3 address from a word index - * (after shifting by SHIFT3). - */ - protected static final int MASK3 = LENGTH3 - 1; - - /** - * SHIFT2 is the shift to bring the level2 address (from the word index) to - * the right end (i.e., after shifting by SHIFT3). - */ - protected static final int SHIFT2 = LEVEL3; - - /** - * UNIT is the greatest number of bits that can be held in one level1 entry. - * That is, bits per word by words per level3 block by blocks per level2 area. - */ - protected static final int UNIT = LENGTH2 * LENGTH3 * LENGTH4; - - /** - * MASK2 is the mask to extract the LEVEL2 address from a word index - * (after shifting by SHIFT3 and SHIFT2). - */ - protected static final int MASK2 = LENGTH2 - 1; - - /** - * SHIFT1 is the shift to bring the level1 address (from the word index) to - * the right end (i.e., after shifting by SHIFT3). - */ - protected static final int SHIFT1 = LEVEL2 + LEVEL3; - - /** - * LENGTH2_SIZE is maximum index of a LEVEL2 page. - */ - protected static final int LENGTH2_SIZE = LENGTH2 - 1; - - /** - * LENGTH3_SIZE is maximum index of a LEVEL3 page. - */ - protected static final int LENGTH3_SIZE = LENGTH3 - 1; - - /** - * LENGTH4_SIZE is maximum index of a bit in a LEVEL4 word. - */ - protected static final int LENGTH4_SIZE = LENGTH4 - 1; - - /** - * Holds reference to the cache of statistics values computed by the - * UpdateStrategy - * @see SparseBitSet.Cache - * @see SparseBitSet.UpdateStrategy - */ - protected transient Cache cache; - - //============================================================================= - // Stack structures used for recycling blocks - //============================================================================= - - /** - * A spare level 3 block is kept for use when scanning. When a target block - * is needed, and there is not already one in the bit set, the spare is - * provided. If non-zero values are placed into this block, it is moved to the - * resulting set, and a new spare is acquired. Note: a new spare needs to - * be allocated when the set is cloned (so that the spare is not shared - * between two sets). - */ - protected transient long[] spare; - - /** An empty level 3 block is kept for use when scanning. When a source block - * is needed, and there is not already one in the corresponding bit set, the - * ZERO_BLOCK is used (as a read-only block). It is a source of zero values - * so that code does not have to test for a null level3 block. This is a - * static block shared everywhere. - */ - static final long[] ZERO_BLOCK = new long[LENGTH3]; - - /* Programming notes: - - i, j, and k are used to hold values that are actual bit indices (i.e., - the index (label) of the bit within the user's view of the bit set). - - u, v, and w, are used to hold values that refer to the indices of the - words in the set array that are used to hold the bits (with 64 bits per - word). These variable names, followed by 1, 2, or 3, refer to the component - "level" parts of the complete word index. - - word (where used) is a potential entry to or from a block, containing 64 - bits of the bit set. The prefixes a, b, result, etc., refer to the bit - sets from which these are coming or going. Without a prefix, or with the - prefix "a," the set in question is "this" set (see next paragraph). - - Operations are conceived to be in the form a.op(b), thus in the discussion - (not in the public Javadoc documentation) the two sets are referred to a - "a" and "b", where the set referred to by "this" is usually set a. - Hence, reference to set a is usually implicit, but set b will usually be - explicit. Variables beginning with these letters hold values relevant to - the corresponding set, and, in particular, these letters followed by - 1, 2, and 3 are used to refer to the corresponding (current) level1, - level3 area, and level3 block, arrays. - - The resizing of the table takes place as necessary. In this regard, it is - worth noting that the table is grown, but never shrunk (except in a new - object formed by cloning). - - Similarly, care it taken to ensure that any supplied reference to a bit - set (other than this) has an opportunity to fail for being null before - any other set (including this) has its state changed. For the most - part, this is allowed to happen "naturally," but the Strategies incorporate - an explicit check when necessary. - - There is a amount of (almost) repetitive scanning code in many of the - "singe bit" methods. The intent is that these methods for SparseBitSet be - as small and as fast as possible. - - For the scanning of complete sets, or for ranges within complete sets, - all of the scanning logic is built into one (somewhat enormous) method, - setScanner(). This contains all the considerations for matching up - corresponding level 3 blocks (if they exist), and then uses a Strategy - object to do the processing on those level3 blocks. This keeps all - the scanning and optimization logic in one place, and the Strategies are - reasonably simple (see the definition of AbstractStrategy for a discussion - of the tasks that must be defined therein). - - The test for index i (the first index in all cases) being in range is - rather perverse, but the idea was to keep the actual number of comparisons - to a minimum, hence the check is for "(i + 1) < 1". This is almost but not - quite equivalent to "i < 0", although it is for all values of i except - i=Integer.MAX_VALUE. In this latter case, (i + 1) "overflows" to - -(Integer.MAX_VALUE + 1), and thus appears to be less than 1, and thus the - check picks up the other disallowed case. Let us hope the compiler never - gets smart enough to try to do the apparent optimisation! */ - - /** - * Constructor for a new (sparse) bit set. All bits initially are effectively - * false. This is a internal constructor that collects all the - * needed actions to initialise the bit set. - *

- * The capacity is taken to be a suggestion for a size of the bit set, - * in bits. An appropriate table size (a power of two) is then determined and - * used. The size will be grown as needed to accommodate any bits addressed - * during the use of the bit set. - * - * @param capacity a size in terms of bits - * @param compactionCount the compactionCount to be inherited (for - * internal generation) - * @exception NegativeArraySizeException if the specified initial size - * is negative - * @since 1.6 - */ - protected SparseBitSet(int capacity, int compactionCount) - throws NegativeArraySizeException - { - /* Array size is computed based on this being a capacity given in bits. */ - if (capacity < 0) // capacity can't be negative -- could only come from - throw new NegativeArraySizeException( // an erroneous user given - "(requested capacity=" + capacity + ") < 0"); // nbits value - resize(capacity - 1); // Resize takes last usable index - this.compactionCount = compactionCount; - /* Ensure there is a spare level 3 block for the use of the set scanner.*/ - constructorHelper(); - statisticsUpdate(); - } - - /** - * Constructs an empty bit set with the default initial size. - * Initially all bits are effectively false. - * - * @since 1.6 - */ - public SparseBitSet() - { - /* By requesting 1 bit, will actually get UNIT number of bits. */ - this(1, compactionCountDefault); - } - - /** - * Creates a bit set whose initial size is large enough to efficiently - * represent bits with indices in the range 0 through - * at least nbits-1. Initially all bits are effectively - * false. - *

- * No guarantees are given for how large or small the actual object will be. - * The setting of bits above the given range is permitted (and will perhaps - * eventually cause resizing). - * - * @param nbits the initial provisional length of the SparseBitSet - * @throws java.lang.NegativeArraySizeException if the specified initial - * length is negative - * @see #SparseBitSet() - * @since 1.6 - */ - public SparseBitSet(int nbits) throws NegativeArraySizeException - { - this(nbits, compactionCountDefault); - } - - /** - * Performs a logical AND of the addressed target bit with the argument - * value. This bit set is modified so that the addressed bit has the value - * true if and only if it both initially had the value - * true and the argument value is also true. - * - * @param i a bit index - * @param value a boolean value to AND with that bit - * @exception IndexOutOfBoundsException if the specified index is negative - * or equal to Integer.MAX_VALUE - * @since 1.6 - */ - public void and(int i, boolean value) throws IndexOutOfBoundsException - { - if ((i + 1) < 1) - throw new IndexOutOfBoundsException("i=" + i); - if (!value) - clear(i); - } - - /** - * Performs a logical AND of this target bit set with the argument bit - * set within the given range of bits. Within the range, this bit set is - * modified so that each bit in it has the value true if and only - * if it both initially had the value true and the corresponding - * bit in the bit set argument also had the value true. Outside - * the range, this set is not changed. - * - * @param i index of the first bit to be included in the operation - * @param j index after the last bit to included in the operation - * @param b a SparseBitSet - * @exception IndexOutOfBoundsException if i is negative or - * equal to Integer.MAX_VALUE, or j is negative, - * or i is larger than j - * @since 1.6 - */ - public void and(int i, int j, SparseBitSet b) throws IndexOutOfBoundsException - { - setScanner(i, j, b, andStrategy); - } - - /** - * Performs a logical AND of this target bit set with the argument bit - * set. This bit set is modified so that each bit in it has the value - * true if and only if it both initially had the value - * true and the corresponding bit in the bit set argument also - * had the value true. - * - * @param b a SparseBitSet - * @since 1.6 - */ - public void and(SparseBitSet b) - { - nullify(Math.min(bits.length, b.bits.length)); // Optimisation - setScanner(0, Math.min(bitsLength, b.bitsLength), b, andStrategy); - } - - /** - * Performs a logical AND of the two given SparseBitSets. - * The returned SparseBitSet is created so that each bit in it - * has the value true if and only if both the given sets - * initially had the corresponding bits true, otherwise - * false. - * - * @param a a SparseBitSet - * @param b another SparseBitSet - * @return a new SparseBitSet representing the AND of the two sets - * @since 1.6 - */ - public static SparseBitSet and(SparseBitSet a, SparseBitSet b) - { - final SparseBitSet result = a.clone(); - result.and(b); - return result; - } - - /** - * Performs a logical AndNOT of the addressed target bit with the - * argument value. This bit set is modified so that the addressed bit has the - * value true if and only if it both initially had the value - * true and the argument value is false. - * - * @param i a bit index - * @param value a boolean value to AndNOT with that bit - * @exception IndexOutOfBoundsException if the specified index is negative - * or equal to Integer.MAX_VALUE - * @since 1.6 - */ - public void andNot(int i, boolean value) - { - if ((i + 1) < 1) - throw new IndexOutOfBoundsException("i=" + i); - if (value) - clear(i); - } - - /** - * Performs a logical AndNOT of this target bit set with the argument - * bit set within the given range of bits. Within the range, this bit set is - * modified so that each bit in it has the value true if and only - * if it both initially had the value true and the corresponding - * bit in the bit set argument has the value false. Outside - * the range, this set is not changed. - * - * @param i index of the first bit to be included in the operation - * @param j index after the last bit to included in the operation - * @param b the SparseBitSet with which to mask this SparseBitSet - * @exception IndexOutOfBoundsException if i is negative or - * equal to Integer.MAX_VALUE, or j is negative, - * or i is larger than j - * @since 1.6 - */ - public void andNot(int i, int j, SparseBitSet b) - throws IndexOutOfBoundsException - { - setScanner(i, j, b, andNotStrategy); - } - - /** - * Performs a logical AndNOT of this target bit set with the argument - * bit set. This bit set is modified so that each bit in it has the value - * true if and only if it both initially had the value - * true and the corresponding bit in the bit set argument has - * the value false. - * - * @param b the SparseBitSet with which to mask this SparseBitSet - * @since 1.6 - */ - public void andNot(SparseBitSet b) - { - setScanner(0, Math.min(bitsLength, b.bitsLength), b, andNotStrategy); - } - - /** - * Creates a bit set from the first SparseBitSet whose - * corresponding bits are cleared by the set bits of the second - * SparseBitSet. The resulting bit set is created so that a bit - * in it has the value true if and only if the corresponding bit - * in the SparseBitSet of the first is set, and that same - * corresponding bit is not set in the SparseBitSet of the second - * argument. - * - * @param a a SparseBitSet - * @param b another SparseBitSet - * @return a new SparseBitSet representing the AndNOT of the - * two sets - * @since 1.6 - */ - public static SparseBitSet andNot(SparseBitSet a, SparseBitSet b) - { - final SparseBitSet result = a.clone(); - result.andNot(b); - return result; - } - - /** - * Returns the number of bits set to true in this - * SparseBitSet. - * - * @return the number of bits set to true in this SparseBitSet - * @since 1.6 - */ - public int cardinality() - { - statisticsUpdate(); // Update size, cardinality and length values - return cache.cardinality; - } - - /** - * Sets the bit at the specified index to false. - * - * @param i a bit index. - * @exception IndexOutOfBoundsException if the specified index is negative - * or equal to Integer.MAX_VALUE. - * @since 1.6 - */ - public void clear(int i) - { - /* In the interests of speed, no check is made here on whether the - level3 block goes to all zero. This may be found and corrected - in some later operation. */ - if ((i + 1) < 1) - throw new IndexOutOfBoundsException("i=" + i); - if (i >= bitsLength) - return; - final int w = i >> SHIFT3; - long[][] a2; - if ((a2 = bits[w >> SHIFT1]) == null) - return; - long[] a3; - if ((a3 = a2[(w >> SHIFT2) & MASK2]) == null) - return; - a3[w & MASK3] &= ~(1L << i); // Clear the indicated bit - cache.hash = 0; // Invalidate size, etc., - } - - /** - * Sets the bits from the specified i (inclusive) to the - * specified j (exclusive) to false. - * - * @param i index of the first bit to be cleared - * @param j index after the last bit to be cleared - * @exception IndexOutOfBoundsException if i is negative or - * equal to Integer.MAX_VALUE, or j is negative, - * or i is larger than j - * @since 1.6 - */ - public void clear(int i, int j) throws IndexOutOfBoundsException - { - setScanner(i, j, null, clearStrategy); - } - - /** - * Sets all of the bits in this SparseBitSet to - * false. - * - * @since 1.6 - */ - public void clear() - { - /* This simply resets to null all the entries in the set. */ - nullify(0); - } - - /** - * Cloning this SparseBitSet produces a new - * SparseBitSet that is equal() to it. The clone of the - * bit set is another bit set that has exactly the same bits set to - * true as this bit set. - *

- * Note: the actual space allocated to the clone tries to minimise the actual - * amount of storage allocated to hold the bits, while still trying to - * keep access to the bits being a rapid as possible. Since the space - * allocated to a SparseBitSet is not normally decreased, - * replacing a bit set by its clone may be a way of both managing memory - * consumption and improving the rapidity of access. - * - * @return a clone of this SparseBitSet - * @since 1.6 - */ - @Override - public SparseBitSet clone() - { - try - { - final SparseBitSet result = (SparseBitSet) super.clone(); - /* Clear out the shallow copy of the set array (which contains just - copies of the references from this set), and then replace these - by a deep copy (created by a "copy" from the set being cloned . */ - result.bits = null; - result.resize(1); - /* Ensure the clone is not sharing a copy of a spare block with - the cloned set, nor the cache set, nor any of the visitors (which - are linked to their parent object) (Not all visitors actually use - this link to their containing object, but they are reset here just - in case of future changes). */ - result.constructorHelper(); - result.equalsStrategy = null; - result.setScanner(0, bitsLength, this, copyStrategy); - return result; - } - catch (CloneNotSupportedException ex) - { - /* This code has not been unit tested. Inspection offers hope - that is will work, but it likely never to be used. */ - throw new InternalError(ex.getMessage()); - } - } - - /** - * Compares this object against the specified object. The result is - * true if and only if the argument is not null - * and is a SparseBitSet object that has exactly the same bits - * set to true as this bit set. That is, for every nonnegative - * i indexing a bit in the set, - *

((SparseBitSet)obj).get(i) == this.get(i)
- * must be true. - * - * @param obj the Object with which to compare - * @return true if the objects are equivalent; - * false otherwise. - * @since 1.6 - */ - @Override - public boolean equals(Object obj) - { - /* Sanity and quick checks. */ - if (!(obj instanceof SparseBitSet)) - return false; - final SparseBitSet b = (SparseBitSet) obj; - if (this == b) - return true; // Identity - - /* Do the real work. */ - if (equalsStrategy == null) - equalsStrategy = new EqualsStrategy(); - - setScanner(0, Math.max(bitsLength, b.bitsLength), b, equalsStrategy); - return equalsStrategy.result; - } - - /** - * Sets the bit at the specified index to the complement of its current value. - * - * @param i the index of the bit to flip - * @exception IndexOutOfBoundsException if the specified index is negative - * or equal to Integer.MAX_VALUE - * @since 1.6 - */ - public void flip(int i) - { - if ((i + 1) < 1) - throw new IndexOutOfBoundsException("i=" + i); - final int w = i >> SHIFT3; - final int w1 = w >> SHIFT1; - final int w2 = (w >> SHIFT2) & MASK2; - - if (i >= bitsLength) - resize(i); - long[][] a2; - if ((a2 = bits[w1]) == null) - a2 = bits[w1] = new long[LENGTH2][]; - long[] a3; - if ((a3 = a2[w2]) == null) - a3 = a2[w2] = new long[LENGTH3]; - a3[w & MASK3] ^= 1L << i; //Flip the designated bit - cache.hash = 0; // Invalidate size, etc., values - } - - /** - * Sets each bit from the specified i (inclusive) to the - * specified j (exclusive) to the complement of its current - * value. - * - * @param i index of the first bit to flip - * @param j index after the last bit to flip - * @exception IndexOutOfBoundsException if i is negative or is - * equal to Integer.MAX_VALUE, or j is negative, or - * i is larger than j - * @since 1.6 - */ - public void flip(int i, int j) throws IndexOutOfBoundsException - { - setScanner(i, j, null, flipStrategy); - } - - /** - * Returns the value of the bit with the specified index. The value is - * true if the bit with the index i is currently set - * in this SparseBitSet; otherwise, the result is - * false. - * - * @param i the bit index - * @return the boolean value of the bit with the specified index. - * @exception IndexOutOfBoundsException if the specified index is negative - * or equal to Integer.MAX_VALUE - * @since 1.6 - */ - public boolean get(int i) - { - if ((i + 1) < 1) - throw new IndexOutOfBoundsException("i=" + i); - final int w = i >> SHIFT3; - - long[][] a2; - long[] a3; - return i < bitsLength && (a2 = bits[w >> SHIFT1]) != null - && (a3 = a2[(w >> SHIFT2) & MASK2]) != null - && ((a3[w & MASK3] & (1L << i)) != 0); - } - - /** - * Returns a new SparseBitSet composed of bits from this - * SparseBitSet from i (inclusive) to j - * (exclusive). - * - * @param i index of the first bit to include - * @param j index after the last bit to include - * @return a new SparseBitSet from a range of this SparseBitSet - * @exception IndexOutOfBoundsException if i is negative or is - * equal to Integer.MAX_VALUE, or j is negative, or - * i is larger than j - * @since 1.6 - */ - public SparseBitSet get(int i, int j) throws IndexOutOfBoundsException - { - final SparseBitSet result = new SparseBitSet(j, compactionCount); - result.setScanner(i, j, this, copyStrategy); - return result; - } - - /** - * Returns a hash code value for this bit set. The hash code depends only on - * which bits have been set within this SparseBitSet. The - * algorithm used to compute it may be described as follows. - *

- * Suppose the bits in the SparseBitSet were to be stored in an - * array of long integers called, say, bits, in such - * a manner that bit i is set in the SparseBitSet - * (for nonnegative values of i) if and only if the expression - *

-     *  ((i>>6) < bits.length) && ((bits[i>>6] & (1L << (bit & 0x3F))) != 0)
-     *  
- * is true. Then the following definition of the hashCode method - * would be a correct implementation of the actual algorithm: - *
-     *  public int hashCode()
-     *  {
-     *      long hash = 1234L;
-     *      for ( int i = bits.length; --i >= 0; )
-     *          hash ^= bits[i] * (i + 1);
-     *      return (int)((h >> 32) ^ h);
-     *  }
- * Note that the hash code values change if the set of bits is altered. - * - * @return a hash code value for this bit set - * @since 1.6 - * @see Object#equals(Object) - * @see java.util.Hashtable - */ - @Override - public int hashCode() - { - statisticsUpdate(); - return cache.hash; - } - - /** - * Returns true if the specified SparseBitSet has any bits - * within the given range i (inclusive) to j - * (exclusive) set to true that are also set to true - * in the same range of this SparseBitSet. - * - * @param i index of the first bit to include - * @param j index after the last bit to include - * @param b the SparseBitSet with which to intersect - * @return the boolean indicating whether this SparseBitSet intersects the - * specified SparseBitSet - * @exception IndexOutOfBoundsException if i is negative or - * equal to Integer.MAX_VALUE, or j is negative, - * or i is larger than j - * @since 1.6 - */ - public boolean intersects(int i, int j, SparseBitSet b) - throws IndexOutOfBoundsException - { - setScanner(i, j, b, intersectsStrategy); - return intersectsStrategy.result; - } - - /** - * Returns true if the specified SparseBitSet has any bits set to - * true that are also set to true in this - * SparseBitSet. - * - * @param b a SparseBitSet with which to intersect - * @return boolean indicating whether this SparseBitSet intersects the - * specified SparseBitSet - * @since 1.6 - */ - public boolean intersects(SparseBitSet b) - { - setScanner(0, Math.max(bitsLength, b.bitsLength), b, intersectsStrategy); - return intersectsStrategy.result; - } - - /** - * Returns true if this SparseBitSet contains no bits that are - * set to true. - * - * @return the boolean indicating whether this SparseBitSet is empty - * @since 1.6 - */ - public boolean isEmpty() - { - statisticsUpdate(); - return cache.cardinality == 0; - } - - /** - * Returns the "logical length" of this SparseBitSet: the index - * of the highest set bit in the SparseBitSet plus one. Returns - * zero if the SparseBitSet contains no set bits. - * - * @return the logical length of this SparseBitSet - * @since 1.6 - */ - public int length() - { - statisticsUpdate(); - return cache.length; - } - - /** - * Returns the index of the first bit that is set to false that - * occurs on or after the specified starting index. - * - * @param i the index to start checking from (inclusive) - * @return the index of the next clear bit, or -1 if there is no such bit - * @exception IndexOutOfBoundsException if the specified index is negative - * @since 1.6 - */ - public int nextClearBit(int i) - { - /* The index of this method is permitted to be Integer.MAX_VALUE, as this - is needed to make this method work together with the method - nextSetBit()--as might happen if a search for the next clear bit is - started after finding a set bit labelled Integer.MAX_VALUE-1. This - case is not optimised, the code will eventually return -1 (since - the Integer.MAX_VALUEth bit does "exist," and is 0. */ - - if (i < 0) - throw new IndexOutOfBoundsException("i=" + i); - /* This is the word from which the search begins. */ - int w = i >> SHIFT3; - int w3 = w & MASK3; - int w2 = (w >> SHIFT2) & MASK2; - int w1 = w >> SHIFT1; - - long nword = ~0L << i; - final int aLength = bits.length; - - long[][] a2; - long[] a3; - /* Is the next clear bit in the same word at the nominated beginning bit - (including the nominated beginning bit itself). The first check is - whether the starting bit is within the structure at all. */ - if (w1 < aLength && (a2 = bits[w1]) != null - && (a3 = a2[w2]) != null - && ((nword = ~a3[w3] & (~0L << i))) == 0L) - { - /* So now start a search though the rest of the entries for - a null area or block, or a clear bit (a set bit in the - complemented value). */ - ++w; - w3 = w & MASK3; - w2 = (w >> SHIFT2) & MASK2; - w1 = w >> SHIFT1; - nword = ~0L; - loop: for (; w1 != aLength; ++w1) - { - if ((a2 = bits[w1]) == null) - break; - for (; w2 != LENGTH2; ++w2) - { - if ((a3 = a2[w2]) == null) - break loop; - for (; w3 != LENGTH3; ++w3) - if ((nword = ~a3[w3]) != 0) - break loop; - w3 = 0; - } - w2 = w3 = 0; - } - } - final int result = (((w1 << SHIFT1) + (w2 << SHIFT2) + w3) << SHIFT3) - + Long.numberOfTrailingZeros(nword); - return (result == Integer.MAX_VALUE ? -1 : result); - } - - /** - * Returns the index of the first bit that is set to true that - * occurs on or after the specified starting index. If no such it exists then - * -1 is returned. - *

- * To iterate over the true bits in a SparseBitSet - * sbs, use the following loop: - * - *

-     *  for ( int i = sbbits.nextSetBit(0); i >= 0; i = sbbits.nextSetBit(i+1) )
-     *  {
-     *      // operate on index i here
-     *  }
- * - * @param i the index to start checking from (inclusive) - * @return the index of the next set bit - * @exception IndexOutOfBoundsException if the specified index is negative - * @since 1.6 - */ - public int nextSetBit(int i) - { - /* The index value (i) of this method is permitted to be Integer.MAX_VALUE, - as this is needed to make the loop defined above work: just in case the - bit labelled Integer.MAX_VALUE-1 is set. This case is not optimised: - but eventually -1 will be returned, as this will be included with - any search that goes off the end of the level1 array. */ - - if (i < 0) - throw new IndexOutOfBoundsException("i=" + i); - /* This is the word from which the search begins. */ - int w = i >> SHIFT3; - int w3 = w & MASK3; - int w2 = (w >> SHIFT2) & MASK2; - int w1 = w >> SHIFT1; - - long word = 0L; - final int aLength = bits.length; - - long[][] a2; - long[] a3; - /* Is the next set bit in the same word at the nominated beginning bit - (including the nominated beginning bit itself). The first check is - whether the starting bit is within the structure at all. */ - if (w1 < aLength && ((a2 = bits[w1]) == null - || (a3 = a2[w2]) == null - || ((word = a3[w3] & (~0L << i)) == 0L))) - { - /* So now start a search though the rest of the entries for a bit. */ - ++w; - w3 = w & MASK3; - w2 = (w >> SHIFT2) & MASK2; - w1 = w >> SHIFT1; - major: for (; w1 != aLength; ++w1) - { - if ((a2 = bits[w1]) != null) - for (; w2 != LENGTH2; ++w2) - { - if ((a3 = a2[w2]) != null) - for (; w3 != LENGTH3; ++w3) - if ((word = a3[w3]) != 0) - break major; - w3 = 0; - } - w2 = w3 = 0; - } - } - return (w1 >= aLength ? -1 - : (((w1 << SHIFT1) + (w2 << SHIFT2) + w3) << SHIFT3) - + Long.numberOfTrailingZeros(word)); - } - - /** - * Returns the index of the nearest bit that is set to {@code false} - * that occurs on or before the specified starting index. - * If no such bit exists, or if {@code -1} is given as the - * starting index, then {@code -1} is returned. - * - * @param i the index to start checking from (inclusive) - * @return the index of the previous clear bit, or {@code -1} if there - * is no such bit - * @throws IndexOutOfBoundsException if the specified index is less - * than {@code -1} - * @since 1.2 - * @see java.util.BitSet#previousClearBit - */ - public int previousClearBit(int i) - { - if (i < 0) - { - if (i == -1) - return -1; - throw new IndexOutOfBoundsException("i=" + i); - } - - final long[][][] bits = this.bits; - final int aSize = bits.length - 1; - - int w = i >> SHIFT3; - int w3 = w & MASK3; - int w2 = (w >> SHIFT2) & MASK2; - int w1 = w >> SHIFT1; - if (w1 > aSize) - return i; - w1 = Math.min(w1, aSize); - int w4 = i % LENGTH4; - - long word; - long[][] a2; - long[] a3; - - for (; w1 >= 0; --w1) - { - if ((a2 = bits[w1]) == null) - return (((w1 << SHIFT1) + (w2 << SHIFT2) + w3) << SHIFT3) + w4; - for (; w2 >= 0; --w2) - { - if ((a3 = a2[w2]) == null) - return (((w1 << SHIFT1) + (w2 << SHIFT2) + w3) << SHIFT3) + w4; - for (; w3 >= 0; --w3) - { - if ((word = a3[w3]) == 0) - return (((w1 << SHIFT1) + (w2 << SHIFT2) + w3) << SHIFT3) + w4; - for (int bitIdx = w4; bitIdx >= 0; --bitIdx) - { - if ((word & (1L << bitIdx)) == 0) - return (((w1 << SHIFT1) + (w2 << SHIFT2) + w3) << SHIFT3) + bitIdx; - } - w4 = LENGTH4_SIZE; - } - w3 = LENGTH3_SIZE; - } - w2 = LENGTH2_SIZE; - } - return -1; - } - - /** - * Returns the index of the nearest bit that is set to {@code true} - * that occurs on or before the specified starting index. - * If no such bit exists, or if {@code -1} is given as the - * starting index, then {@code -1} is returned. - * - * @param i the index to start checking from (inclusive) - * @return the index of the previous set bit, or {@code -1} if there - * is no such bit - * @throws IndexOutOfBoundsException if the specified index is less - * than {@code -1} - * @since 1.2 - * @see java.util.BitSet#previousSetBit - */ - public int previousSetBit(int i) - { - if (i < 0) - { - if (i == -1) - return -1; - throw new IndexOutOfBoundsException("i=" + i); - } - - final long[][][] bits = this.bits; - final int aSize = bits.length - 1; - - /* This is the word from which the search begins. */ - final int w = i >> SHIFT3; - int w1 = w >> SHIFT1; - int w2, w3, w4; - /* But if its off the end of the array, start from the very end. */ - if (w1 > aSize) - { - w1 = aSize; - w2 = LENGTH2_SIZE; - w3 = LENGTH3_SIZE; - w4 = LENGTH4_SIZE; - } - else - { - w2 = (w >> SHIFT2) & MASK2; - w3 = w & MASK3; - w4 = i % LENGTH4; - } - long word; - long[][] a2; - long[] a3; - for (; w1 >= 0; --w1) - { - if ((a2 = bits[w1]) != null) - for (; w2 >= 0; --w2) - { - if ((a3 = a2[w2]) != null) - for (; w3 >= 0; --w3) - { - if ((word = a3[w3]) != 0) - for (int bitIdx = w4; bitIdx >= 0; --bitIdx) - { - if ((word & (1L << bitIdx)) != 0) - return (((w1 << SHIFT1) + (w2 << SHIFT2) + w3) << SHIFT3) + bitIdx; - } - w4 = LENGTH4_SIZE; - } - w3 = LENGTH3_SIZE; - w4 = LENGTH4_SIZE; - } - w2 = LENGTH2_SIZE; - w3 = LENGTH3_SIZE; - w4 = LENGTH4_SIZE; - } - return -1; - } - - /** - * Performs a logical OR of the addressed target bit with the - * argument value. This bit set is modified so that the addressed bit has the - * value true if and only if it both initially had the value - * true or the argument value is true. - * - * @param i a bit index - * @param value a boolean value to OR with that bit - * @exception IndexOutOfBoundsException if the specified index is negative - * or equal to Integer.MAX_VALUE - * @since 1.6 - */ - public void or(int i, boolean value) - { - if ((i + 1) < 1) - throw new IndexOutOfBoundsException("i=" + i); - if (value) - set(i); - } - - /** - * Performs a logical OR of the addressed target bit with the - * argument value within the given range. This bit set is modified so that - * within the range a bit in it has the value true if and only if - * it either already had the value true or the corresponding bit - * in the bit set argument has the value true. Outside the range - * this set is not changed. - * - * @param i index of the first bit to be included in the operation - * @param j index after the last bit to included in the operation - * @param b the SparseBitSet with which to perform the OR - * operation with this SparseBitSet - * @exception IndexOutOfBoundsException if i is negative or - * equal to Integer.MAX_VALUE, or j is negative, - * or i is larger than j - * @since 1.6 - */ - public void or(int i, int j, SparseBitSet b) throws IndexOutOfBoundsException - { - setScanner(i, j, b, orStrategy); - } - - /** - * Performs a logical OR of this bit set with the bit set argument. - * This bit set is modified so that a bit in it has the value true - * if and only if it either already had the value true or the - * corresponding bit in the bit set argument has the value true. - * - * @param b the SparseBitSet with which to perform the OR - * operation with this SparseBitSet - * @since 1.6 - */ - public void or(SparseBitSet b) - { - setScanner(0, b.bitsLength, b, orStrategy); - } - - /** - * Performs a logical OR of the two given SparseBitSets. - * The returned SparseBitSet is created so that a bit in it has - * the value true if and only if it either had the value - * true in the set given by the first arguemetn or had the value - * true in the second argument, otherwise false. - * - * @param a a SparseBitSet - * @param b another SparseBitSet - * @return new SparseBitSet representing the OR of the two sets - * @since 1.6 - */ - public static SparseBitSet or(SparseBitSet a, SparseBitSet b) - { - final SparseBitSet result = a.clone(); - result.or(b); - return result; - } - - /** - * Sets the bit at the specified index. - * - * @param i a bit index - * @exception IndexOutOfBoundsException if the specified index is negative - * or equal to Integer.MAX_VALUE - * @since 1.6 - */ - public void set(int i) - { - if ((i + 1) < 1) - throw new IndexOutOfBoundsException("i=" + i); - final int w = i >> SHIFT3; - final int w1 = w >> SHIFT1; - final int w2 = (w >> SHIFT2) & MASK2; - - if (i >= bitsLength) - resize(i); - long[][] a2; - if ((a2 = bits[w1]) == null) - a2 = bits[w1] = new long[LENGTH2][]; - long[] a3; - if ((a3 = a2[w2]) == null) - a3 = a2[w2] = new long[LENGTH3]; - a3[w & MASK3] |= 1L << i; - cache.hash = 0; //Invalidate size, etc., scan - } - - /** - * Sets the bit at the specified index to the specified value. - * - * @param i a bit index - * @param value a boolean value to set - * @exception IndexOutOfBoundsException if the specified index is negative - * or equal to Integer.MAX_VALUE - * @since 1.6 - */ - public void set(int i, boolean value) - { - if (value) - set(i); - else - clear(i); - } - - /** - * Sets the bits from the specified i (inclusive) to the specified - * j (exclusive) to true. - * - * @param i index of the first bit to be set - * @param j index after the last bit to be se - * @exception IndexOutOfBoundsException if i is negative or is - * equal to Integer.MAX_INT, or j is negative, or - * i is larger than j. - * @since 1.6 - */ - public void set(int i, int j) throws IndexOutOfBoundsException - { - setScanner(i, j, null, setStrategy); - } - - /** - * Sets the bits from the specified i (inclusive) to the specified - * j (exclusive) to the specified value. - * - * @param i index of the first bit to be set - * @param j index after the last bit to be set - * @param value to which to set the selected bits - * @exception IndexOutOfBoundsException if i is negative or is - * equal to Integer.MAX_VALUE, or j is negative, or - * i is larger than j - * @since 1.6 - */ - public void set(int i, int j, boolean value) - { - if (value) - set(i, j); - else - clear(i, j); - } - - /** - * Returns the number of bits of space nominally in use by this - * SparseBitSet to represent bit values. The count of bits in - * the set is the (label of the last set bit) + 1 - (the label of the first - * set bit). - * - * @return the number of bits (true and false) nominally in this bit set - * at this moment - * @since 1.6 - */ - public int size() - { - statisticsUpdate(); - return cache.size; - } - - /** - * Convenience method for statistics if the individual results are not needed. - * - * @return a String detailing the statistics of the bit set - * @see #statistics(String[]) - * @since 1.6 - */ - public String statistics() - { - return statistics(null); - } - - /** - * Determine, and create a String with the bit set statistics. The statistics - * include: Size, Length, Cardinality, Total words (i.e., the total - * number of 64-bit "words"), Set array length (i.e., the number of - * references that can be held by the top level array, Level2 areas in use, - * Level3 blocks in use,, Level2 pool size, Level3 pool size, and the - * Compaction count. - *

- * This method is intended for diagnostic use (as it is relatively expensive - * in time), but can be useful in understanding an application's use of a - * SparseBitSet. - * - * @param values an array for the individual results (if not null) - * @return a String detailing the statistics of the bit set - * @since 1.6 - */ - public String statistics(String[] values) - { - statisticsUpdate(); // Ensure statistics are up-to-date - String[] v = new String[Statistics.values().length]; - - /* Assign the statistics values to the appropriate entry. The order - of the assignments does not matter--the ordinal serves to get the - values into the matching order with the labels from the enumeration. */ - v[Statistics.Size.ordinal()] = Integer.toString(size()); - v[Statistics.Length.ordinal()] = Integer.toString(length()); - v[Statistics.Cardinality.ordinal()] = Integer.toString(cardinality()); - v[Statistics.Total_words.ordinal()] = Integer.toString(cache.count); - v[Statistics.Set_array_length.ordinal()] = Integer.toString(bits.length); - v[Statistics.Set_array_max_length.ordinal()] = - Integer.toString(MAX_LENGTH1); - v[Statistics.Level2_areas.ordinal()] = Integer.toString(cache.a2Count); - v[Statistics.Level2_area_length.ordinal()] = Integer.toString(LENGTH2); - v[Statistics.Level3_blocks.ordinal()] = Integer.toString(cache.a3Count); - v[Statistics.Level3_block_length.ordinal()] = Integer.toString(LENGTH3); - v[Statistics.Compaction_count_value.ordinal()] = - Integer.toString(compactionCount); - - /* Determine the longest label, so that the equal signs may be lined-up. */ - int longestLabel = 0; - for (Statistics s : Statistics.values()) - longestLabel = - Math.max(longestLabel, s.name().length()); - - /* Build a String that has for each statistic, the name of the statistic, - padding, and equals sign, and the value. The "Load_factor_value", - "Average_length_value", and "Average_chain_length" are printed as - floating point values. */ - final StringBuilder result = new StringBuilder(); - for (Statistics s : Statistics.values()) - { - result.append(s.name()); // The name of the statistic - for (int i = 0; i != longestLabel - s.name().length(); ++i) - result.append(' '); // Fill out the field - result.append(" = "); // Show an equals sign - result.append(v[s.ordinal()]); // and a value - result.append('\n'); - } - /* Remove the underscores. */ - for (int i = 0; i != result.length(); ++i) - if (result.charAt(i) == '_') - result.setCharAt(i, ' '); - - if (values != null) - { - final int len = Math.min(values.length, v.length); - System.arraycopy(v, 0, values, 0, len); - } - return result.toString(); - } - - /** - * Returns a string representation of this bit set. For every index for which - * this SparseBitSet contains a bit in the set state, the decimal - * representation of that index is included in the result. Such indices are - * listed in order from lowest to highest. If there is a subsequence of set - * bits longer than the value given by toStringCompaction, the subsequence - * is represented by the value for the first and the last values, with ".." - * between them. The individual bits, or the representation of sub-sequences - * are separated by ", " (a comma and a space) and surrounded by braces, - * resulting in a compact string showing (a variant of) the usual mathematical - * notation for a set of integers. - *
- * Example (with the default value of 2 for subsequences): - *

-     *      SparseBitSet drPepper = new SparseBitSet();
-     *  
- * Now drPepper.toString() returns "{}". - *
- *
-     *      drPepper.set(2);
-     *  
- * Now drPepper.toString() returns "{2}". - *
- *
-     *      drPepper.set(3, 4);
-     *      drPepper.set(10);
-     *  
- * Now drPepper.toString() returns "{2..4, 10}". - *
- * This method is intended for diagnostic use (as it is relatively expensive - * in time), but can be useful in interpreting problems in an application's use - * of a SparseBitSet. - * - * @return a String representation of this SparseBitSet - * @see #toStringCompaction(int length) - * @since 1.6 - */ - @Override - public String toString() - { - final StringBuilder p = new StringBuilder(200); - p.append('{'); - int i = nextSetBit(0); - /* Loop so long as there is another bit to append to the String. */ - while (i >= 0) - { - /* Append that next bit */ - p.append(i); - /* Find the position of the next bit to show. */ - int j = nextSetBit(i + 1); - if (compactionCount > 0) - { - /* Give up if there is no next bit to show. */ - if (j < 0) - break; - /* Find the next clear bit is after the current bit, i.e., i */ - int last = nextClearBit(i); - /* Compute the position of the next clear bit after the current - subsequence of set bits. */ - last = (last < 0 ? Integer.MAX_VALUE : last); - /* If the subsequence is more than the specified bits long, then - collapse the subsequence into one entry in the String. */ - if (i + compactionCount < last) - { - p.append("..").append(last - 1); - /* Having accounted for a subsequence of bits that are all set, - recompute the label of the next bit to show. */ - j = nextSetBit(last); - } - } - /* If there is another set bit, put a comma and a space after the - last entry in the String. */ - if (j >= 0) - p.append(", "); - /* Transfer to i the index of the next set bit. */ - i = j; - } - /* Terminate the representational String, and return it. */ - p.append('}'); - return p.toString(); - } - - /** Sequences of set bits longer than this value are shown by - * {@link #toString()} as a "sub-sequence," in the form a..b. - * Setting this value to zero causes each set bit to be listed individually. - * The default default value is 2 (which means sequences of three or more - * bits set are shown as a subsequence, and all other set bits are listed - * individually). - *

- * Note: this value will be passed to SparseBitSets that - * may be created within or as a result of the operations on this bit set, - * or, for static methods, from the value belonging to the first parameter. - * - * @param count the maximum count of a run of bits that are shown as - * individual entries in a toString() conversion. - * If 0, all bits are shown individually. - * @since 1.6 - * @see #toString() - */ - public void toStringCompaction(int count) - { - compactionCount = count; - } - - /** - * If change is true, the current value of the - * toStringCompaction() value is made the default value for all - * SparseBitSets created from this point onward in this JVM. - * - * @param change if true, change the default value - * @since 1.6 - */ - public void toStringCompaction(boolean change) - { - /* This is an assignment to a static value: the integer value assignment - is atomic, so there will not be a partial store. If multiple - invocations are made from multiple threads, there is a race - condition that cannot be resolved by synchronization. */ - if (change) - compactionCountDefault = compactionCount; - } - - /** - * Performs a logical XOR of the addressed target bit with the - * argument value. This bit set is modified so that the addressed bit has the - * value true if and only one of the following statements holds: - *

    - *
  • The addressed bit initially had the value true, and the - * value of the argument is false. - *
  • The bit initially had the value false, and the - * value of the argument is true. - *
- * - * @param i a bit index - * @param value a boolean value to XOR with that bit - * @exception java.lang.IndexOutOfBoundsException if the specified index - * is negative - * or equal to Integer.MAX_VALUE - * @since 1.6 - */ - public void xor(int i, boolean value) - { - if ((i + 1) < 1) - throw new IndexOutOfBoundsException("i=" + i); - if (value) - flip(i); - } - - /** - * Performs a logical XOR of this bit set with the bit set argument - * within the given range. This resulting bit set is computed so that a bit - * within the range in it has the value true if and only if one - * of the following statements holds: - *
    - *
  • The bit initially had the value true, and the - * corresponding bit in the argument set has the value false. - *
  • The bit initially had the value false, and the - * corresponding bit in the argument set has the value true. - *
- * Outside the range this set is not changed. - * - * @param i index of the first bit to be included in the operation - * @param j index after the last bit to included in the operation - * @param b the SparseBitSet with which to perform the XOR - * operation with this SparseBitSet - * @exception IndexOutOfBoundsException if i is negative or - * equal to Integer.MAX_VALUE, or j is negative, - * or i is larger than j - * @since 1.6 - */ - public void xor(int i, int j, SparseBitSet b) throws IndexOutOfBoundsException - { - setScanner(i, j, b, xorStrategy); - } - - /** - * Performs a logical XOR of this bit set with the bit set argument. - * This resulting bit set is computed so that a bit in it has the value - * true if and only if one of the following statements holds: - *
    - *
  • The bit initially had the value true, and the - * corresponding bit in the argument set has the value false. - *
  • The bit initially had the value false, and the - * corresponding bit in the argument set has the value true. - *
- * - * @param b the SparseBitSet with which to perform the XOR - * operation with thisSparseBitSet - * @since 1.6 - */ - public void xor(SparseBitSet b) - { - setScanner(0, b.bitsLength, b, xorStrategy); - } - - /** - * Performs a logical XOR of the two given SparseBitSets. - * The resulting bit set is created so that a bit in it has the value - * true if and only if one of the following statements holds: - *
    - *
  • A bit in the first argument has the value true, and the - * corresponding bit in the second argument has the value - * false.
  • - *
  • A bit in the first argument has the value false, and the - * corresponding bit in the second argument has the value - * true.
- * - * @param a a SparseBitSet - * @param b another SparseBitSet - * @return a new SparseBitSet representing the XOR of the two sets - * @since 1.6 - */ - public static SparseBitSet xor(SparseBitSet a, SparseBitSet b) - { - final SparseBitSet result = a.clone(); - result.xor(b); - return result; - } - - //============================================================================== - // Internal methods - //============================================================================== - - /** - * Throw the exception to indicate a range error. The String - * constructed reports all the possible errors in one message. - * - * @param i lower bound for a operation - * @param j upper bound for a operation - * @exception IndexOutOfBoundsException indicating the range is not valid - * @since 1.6 - */ - protected static void throwIndexOutOfBoundsException(int i, int j) - throws IndexOutOfBoundsException - { - String s = ""; - if (i < 0) - s += "(i=" + i + ") < 0"; - if (i == Integer.MAX_VALUE) - s += "(i=" + i + ")"; - if (j < 0) - s += (s.isEmpty() ? "" : ", ") + "(j=" + j + ") < 0"; - if (i > j) - s += (s.isEmpty() ? "" : ", ") + "(i=" + i + ") > (j=" + j + ")"; - throw new IndexOutOfBoundsException(s); - } - - /** - * Initializes all the additional objects required for correct operation. - * - * @since 1.6 - */ - protected final void constructorHelper() - { - spare = new long[LENGTH3]; - cache = new Cache(); - updateStrategy = new UpdateStrategy(); - } - - /** - * Clear out a part of the set array with nulls, from the given start to the - * end of the array. If the given parameter is beyond the end of the bits - * array, nothing is changed. - * - * @param start word index at which to start (inclusive) - * @since 1.6 - */ - protected final void nullify(int start) - { - final int aLength = bits.length; - if (start < aLength) - { - for (int w = start; w != aLength; ++w) - bits[w] = null; - cache.hash = 0; // Invalidate size, etc., values - } - } - - /** - * Resize the bit array. Moves the entries in the the bits array of this - * SparseBitSet into an array whose size (which may be larger or smaller) is - * the given bit size (i.e., includes the bit whose index is one less - * that the given value). If the new array is smaller, the excess entries in - * the set array are discarded. If the new array is bigger, it is filled with - * nulls. - * - * @param index the desired address to be included in the set - * @since 1.6 - */ - protected final void resize(int index) - { - /* Find an array size that is a power of two that is as least as large - enough to contain the index requested. */ - final int w1 = (index >> SHIFT3) >> SHIFT1; - int newSize = Integer.highestOneBit(w1); - if (newSize == 0) - newSize = 1; - if (w1 >= newSize) - newSize <<= 1; - if (newSize > MAX_LENGTH1) - newSize = MAX_LENGTH1; - final int aLength1 = (bits != null ? bits.length : 0); - - if (newSize != aLength1 || bits == null) - { // only if the size needs to be changed - final long[][][] temp = new long[newSize][][]; // Get the new array - if (aLength1 != 0) - { - /* If it exists, copy old array to the new array. */ - System.arraycopy(bits, 0, temp, 0, Math.min(aLength1, newSize)); - nullify(0); // Don't leave unused pointers around. */ - } - bits = temp; // Set new array as the set array - bitsLength = // Index of last possible bit, plus one. - (newSize == MAX_LENGTH1 ? Integer.MAX_VALUE : newSize * UNIT); - } - } - - /** - * Scans over the bit set (and a second bit set if part of the operation) are - * all performed by this method. The properties and the operation executed - * are defined by a given strategy, which must be derived from the - * AbstractStrategy. The strategy defines how to operate on a - * single word, and on whole words that may or may not constitute a full - * block of words. - * - * @param i the bit (inclusive) at which to start the scan - * @param j the bit (exclusive) at which to stop the scan - * @param b a SparseBitSet, if needed, the second SparseBitSet in the - * operation - * @param op the AbstractStrategy class defining the operation to be - * executed - * @exception IndexOutOfBoundsException - * @since 1.6 - * @see AbstractStrategy - */ - protected final void setScanner(int i, int j, SparseBitSet b, - AbstractStrategy op) throws IndexOutOfBoundsException - { - /* This method has been assessed as having a McCabe cyclomatic - complexity of 47 (i.e., impossibly high). However, given that this - method incorporates all the set scanning logic for all methods - (with the exception of nextSetBit and nextClearBit, which themselves - have high cyclomatic complexities of 13), and is attempting to minimise - execution time (hence deals with processing shortcuts), it cannot be - expected to be simple. In fact, the work of lining up level3 blocks - proceeds step-wise, and each sub-section piece is reasonably - straight-forward. Nevertheless, the number of paths is high, and - caution is advised in attempting to correct anything. */ - - /* Do whatever the strategy needs to get started, and do whatever initial - checking is needed--fail here if needed before much else is done. */ - if (op.start(b)) - cache.hash = 0; - - if (j < i || (i + 1) < 1) - throwIndexOutOfBoundsException(i, j); - if (i == j) - return; - - /* Get the values of all the short-cut options. */ - final int properties = op.properties(); - final boolean f_op_f_eq_f = (properties & AbstractStrategy.F_OP_F_EQ_F) != 0; - final boolean f_op_x_eq_f = (properties & AbstractStrategy.F_OP_X_EQ_F) != 0; - final boolean x_op_f_eq_f = (properties & AbstractStrategy.X_OP_F_EQ_F) != 0; - final boolean x_op_f_eq_x = (properties & AbstractStrategy.X_OP_F_EQ_X) != 0; - - /* Index of the current word, and mask for the first word, - to be processed in the bit set. */ - int u = i >> SHIFT3; - final long um = ~0L << i; - - /* Index of the final word, and mask for the final word, - to be processed in the bit set. */ - final int v = (j - 1) >> SHIFT3; - final long vm = ~0L >>> -j; - - /* Set up the two bit arrays (if the second exists), and their - corresponding lengths (if any). */ - long[][][] a1 = bits; // Level1, i.e., the bit arrays - int aLength1 = bits.length; - final long[][][] b1 = (b != null ? b.bits : null); - final int bLength1 = (b1 != null ? b.bits.length : 0); - - /* Calculate the initial values of the parts of the words addresses, - as well as the location of the final block to be processed. */ - int u1 = u >> SHIFT1; - int u2 = (u >> SHIFT2) & MASK2; - int u3 = u & MASK3; - final int v1 = v >> SHIFT1; - final int v2 = (v >> SHIFT2) & MASK2; - final int v3 = v & MASK3; - final int lastA3Block = (v1 << LEVEL2) + v2; - - /* Initialize the local copies of the counts of blocks and areas; and - whether there is a partial first block. */ - int a2CountLocal = 0; - int a3CountLocal = 0; - boolean notFirstBlock = u == 0 && um == ~0L; - - /* The first level2 is cannot be judged empty if not being scanned from - the beginning. */ - boolean a2IsEmpty = u2 == 0; // Presumption - while (i < j) - { - /* Determine if there is a level2 area in both the a and the b set, - and if so, set the references to these areas. */ - long[][] a2 = null; - boolean haveA2 = u1 < aLength1 && (a2 = a1[u1]) != null; - long[][] b2 = null; - final boolean haveB2 = u1 < bLength1 - && b1 != null && (b2 = b1[u1]) != null; - /* Handling of level 2 empty areas: determined by the - properties of the strategy. It is necessary to actually visit - the first and last blocks of a scan, since not all of the block - might participate in the operation, hence making decision based - on just the references to the blocks could be wrong. */ - if ((!haveA2 && !haveB2 && f_op_f_eq_f - || !haveA2 && f_op_x_eq_f || !haveB2 && x_op_f_eq_f) - && notFirstBlock && u1 != v1) - {//nested if! - if (u1 < aLength1) - a1[u1] = null; - } - else - { - final int limit2 = (u1 == v1 ? v2 + 1 : LENGTH2); - while (u2 != limit2) - { - /* Similar logic applied here as for the level2 blocks. - The initial and final block must be examined. In other - cases, it may be possible to make a decision based on - the value of the references, as indicated by the - properties of the strategy. */ - long[] a3 = null; - final boolean haveA3 = haveA2 && (a3 = a2[u2]) != null; - long[] b3 = null; - final boolean haveB3 = haveB2 && (b3 = b2[u2]) != null; - final int a3Block = (u1 << LEVEL2) + u2; - final boolean notLastBlock = lastA3Block != a3Block; - /* Handling of level 3 empty areas: determined by the - properties of the strategy. */ - if ((!haveA3 && !haveB3 && f_op_f_eq_f - || !haveA3 && f_op_x_eq_f || !haveB3 && x_op_f_eq_f) - && notFirstBlock && notLastBlock) - { - /* Do not need level3 block, so remove it, and move on. */ - if (haveA2) - a2[u2] = null; - } - else - { - /* So what is needed is the level3 block. */ - final int base3 = a3Block << SHIFT2; - final int limit3 = (notLastBlock ? LENGTH3 : v3); - if (!haveA3) - a3 = spare; - if (!haveB3) - b3 = ZERO_BLOCK; - boolean isZero; - if (notFirstBlock && notLastBlock) - if (x_op_f_eq_x && !haveB3) - isZero = op.isZeroBlock(a3); - // b block is null, just check a block - else - isZero = op.block(base3, 0, LENGTH3, a3, b3); - // Do the operation on the whole block - else - { /* Partial block to process. */ - if (notFirstBlock) - { - /* By implication, this is the last block */ - isZero = op.block(base3, 0, limit3, a3, b3); - // Do the whole words - isZero &= op.word(base3, limit3, a3, b3, vm); - // And then the final word - } - else - { // u, v are correct if first block - if (u == v) // Scan starts and ends in one word - isZero = op.word(base3, u3, a3, b3, um & vm); - else - { // Scan starts in this a3 block - isZero = op.word(base3, u3, a3, b3, um); - // First word - isZero &= - op.block(base3, u3 + 1, limit3, a3, b3); - // Remainder of full words in block - if (limit3 != LENGTH3) - isZero &= op.word(base3, limit3, a3, b3, vm); - // If there is a partial word left - } - notFirstBlock = true; // Only one first block - } - if (isZero) - isZero = op.isZeroBlock(a3); - // If not known to have a non-zero - // value, be sure whether all zero. - } - if (isZero) // The resulting a3 block has no values - {// nested if! - /* If there is an level 2 area make the entry for this - level3 block be a null (i.e., remove any a3 block ). */ - if (haveA2) - a2[u2] = null; - } - else - { - /* If the a3 block used was the spare block, put it - into current level2 area; get a new spare block. */ - if (a3 == spare) - { - if (i >= bitsLength) //Check that the set is large - { // enough to take the new block - resize(i); // Make it large enough - a1 = bits; // Update reference and length - aLength1 = a1.length; - } - if (a2 == null) // Ensure a level 2 area - { - a1[u1] = a2 = new long[LENGTH2][]; - haveA2 = true; // Ensure know level2 not empty - } - a2[u2] = a3; // Insert the level3 block - spare = new long[LENGTH3]; // Replace the spare - } - ++a3CountLocal; // Count the level 3 block - } - a2IsEmpty &= !(haveA2 && a2[u2] != null); - } // Keep track of level 2 usage - ++u2; - u3 = 0; - } /* end while ( u2 != limit2 ) */ - /* If the loop finishes without completing the level 2, it may - be left with a reference but still be all null--this is OK. */ - if (u2 == LENGTH2 && a2IsEmpty && u1 < aLength1) - a1[u1] = null; - else - ++a2CountLocal; // Count level 2 areas - } - /* Advance the value of u based on what happened. */ - i = (u = (++u1 << SHIFT1)) << SHIFT3; - u2 = 0; // u3 = 0 - // Compute next word and bit index - if (i < 0) - i = Integer.MAX_VALUE; // Don't go over the end - } /* end while( i < j ) */ - - /* Do whatever the strategy needs in order to finish. */ - op.finish(a2CountLocal, a3CountLocal); - } - - /** - * The entirety of the bit set is examined, and the various statistics of - * the bit set (size, length, cardinality, hashCode, etc.) are computed. Level - * arrays that are empty (i.e., all zero at level 3, all null at level 2) are - * replaced by null references, ensuring a normalized representation. - * - * @since 1.6 - */ - protected final void statisticsUpdate() - { - if (cache.hash != 0) - return; - setScanner(0, bitsLength, null, updateStrategy); - } - - //============================================================================== - // Serialization/Deserialization methods - //============================================================================== - - /** - * Save the state of the SparseBitSet instance to a stream - * (i.e., serialize it). - * - * @param s the ObjectOutputStream to which to write the serialized object - * @exception java.io.IOException if an io error occurs - * @exception java.lang.InternalError if the SparseBitSet representation is - * inconsistent - * - * @serialData The default data is emitted, followed by the current - * compactionCount for the bit set, and then the - * length of the set (the position of the last bit), - * followed by the cache.count value (an int, - * the number of int->long pairs needed to describe - * the set), followed by the index (int) and word - * (long) for each int->long pair. - * The mappings need not be emitted in any particular order. This - * is followed by the hashCode for the set that can be used - * as an integrity check when the bit set is read back. - * - * @since 1.6 - */ - private void writeObject(ObjectOutputStream s) throws IOException, InternalError - { - statisticsUpdate(); // Update structure and stats if needed. - /* Write any hidden stuff. */ - s.defaultWriteObject(); - s.writeInt(compactionCount); // Needed to preserve value - s.writeInt(cache.length); // Needed to know where last bit is - - /* This is the number of index/value pairs to be written. */ - int count = cache.count; // Minimum number of words to be written - s.writeInt(count); - final long[][][] a1 = bits; - final int aLength1 = a1.length; - long[][] a2; - long[] a3; - long word; - for (int w1 = 0; w1 != aLength1; ++w1) - if ((a2 = a1[w1]) != null) - for (int w2 = 0; w2 != LENGTH2; ++w2) - if ((a3 = a2[w2]) != null) - { - final int base = (w1 << SHIFT1) + (w2 << SHIFT2); - for (int w3 = 0; w3 != LENGTH3; ++w3) - if ((word = a3[w3]) != 0) - { - s.writeInt(base + w3); - s.writeLong(word); - --count; - } - } - if (count != 0) - throw new InternalError("count of entries not consistent"); - /* As a consistency check, write the hash code of the set. */ - s.writeInt(cache.hash); - } - - /** - * serialVersionUID - */ - private static final long serialVersionUID = -6663013367427929992L; - - /** - * Reconstitute the SparseBitSet instance from a stream - * (i.e., deserialize it). - * - * @param s the ObjectInputStream to use - * @exception IOException if there is an io error - * @exception ClassNotFoundException if the stream contains an unidentified - * class - * @since 1.6 - */ - private void readObject(ObjectInputStream s) throws IOException, - ClassNotFoundException - { - /* Read in any hidden stuff that is part of the class overhead. */ - s.defaultReadObject(); - compactionCount = s.readInt(); - final int aLength = s.readInt(); - resize(aLength); // Make sure there is enough space - - /* Read in number of mappings. */ - final int count = s.readInt(); - /* Read the keys and values, them into the set array, areas, and blocks. */ - long[][] a2; - long[] a3; - for (int n = 0; n != count; ++n) - { - final int w = s.readInt(); - final int w3 = w & MASK3; - final int w2 = (w >> SHIFT2) & MASK2; - final int w1 = w >> SHIFT1; - - final long word = s.readLong(); - if ((a2 = bits[w1]) == null) - a2 = bits[w1] = new long[LENGTH2][]; - if ((a3 = a2[w2]) == null) - a3 = a2[w2] = new long[LENGTH3]; - a3[w3] = word; - } - /* Ensure all the pieces are set up for set scanning. */ - constructorHelper(); - statisticsUpdate(); - if (count != cache.count) - throw new InternalError("count of entries not consistent"); - final int hash = s.readInt(); // Get the hashcode that was stored - if (hash != cache.hash) // An error of some kind if not the same - throw new IOException("deserialized hashCode mis-match"); - } - - //============================================================================= - // Statistics enumeration - //============================================================================= - - /** - * These enumeration values are used as labels for the values in the String - * created by the statistics() method. The values of the corresponding - * statistics are ints, except for the loadFactor and - * Average_chain_length values, which are floats. - *

- * An array of Strings may be obtained containing a - * representation of each of these values. An element of such an array, say, - * values, may be accessed, for example, by: - *

-     *      values[SparseBitSet.statistics.Buckets_available.ordinal()]
- * - * @see #statistics(String[]) - */ - public enum Statistics - { - /** - * The size of the bit set, as give by the size() method. - */ - Size, // 0 - /** - * The length of the bit set, as give by the length() method. - */ - Length, // 1 - /** - * The cardinality of the bit set, as give by the cardinality() method. - */ - Cardinality, // 2 - /** - * The total number of non-zero 64-bits "words" being used to hold the - * representation of the bit set. - */ - Total_words, // 3 - /** - * The length of the bit set array. - */ - Set_array_length, // 4 - /** - * The maximum permitted length of the bit set array. - */ - Set_array_max_length, // 5 - /** - * The number of level2 areas. - */ - Level2_areas, // 6 - /** - * The length of the level2 areas. - */ - Level2_area_length, // 7 - /** - * The total number of level3 blocks in use. - */ - Level3_blocks, // 8 - /** - * The length of the level3 blocks. - */ - Level3_block_length, // 9 - /** - * Is the value that determines how the toString() conversion is - * performed. - * @see #toStringCompaction(int) - */ - Compaction_count_value // 10 - } - - //============================================================================= - // A set of cached statistics values, recomputed when necessary - //============================================================================= - - /** - * This class holds the values related to various statistics kept about the - * bit set. These values are not kept continuously up-to-date. Whenever the - * values become invalid, the field hash is set to zero, indicating - * that an update is required. - * - * @see #statisticsUpdate() - */ - protected class Cache - { - /** - * hash is updated by the statisticsUpdate() method. - * If the hash value is zero, it is assumed that all - * the cached values are stale, and must be updated. - */ - protected transient int hash; - - /** - * size is updated by the statisticsUpdate() method. - * If the hash value is zero, it is assumed the all the cached - * values are stale, and must be updated. - */ - protected transient int size; - - /** - * cardinality is updated by the statisticsUpdate() method. - * If the hash value is zero, it is assumed the all the cached - * values are stale, and must be updated. - */ - protected transient int cardinality; - - /** - * length is updated by the statisticsUpdate() method. - * If the hash value is zero, it is assumed the all the cached - * values are stale, and must be updated. - */ - protected transient int length; - - /** - * count is updated by the statisticsUpdate() method. - * If the hash value is zero, it is assumed the all the cached - * values are stale, and must be updated. - */ - protected transient int count; - - /** - * a2Count is updated by the statisticsUpdate() - * method, and will only be correct immediately after a full update. The - * hash value is must be zero for all values to be updated. - */ - protected transient int a2Count; - - /** - * a3Count is updated by the statisticsUpdate() method, - * and will only be correct immediately after a full update. The - * hash value is must be zero for all values to be updated. - */ - protected transient int a3Count; - } - - //============================================================================= - // Abstract Strategy super-class for Strategies describing logical operations - //============================================================================= - - /** - * This strategy class is used by the setScanner to carry out the a variety - * of operations on this set, and usually a second set. The - * setScanner() method of the main SparseBitSet class - * essentially finds matching level3 blocks, and then calls the strategy to - * do the appropriate operation on each of the elements of the block. - *

- * The symbolic constants control optimisation paths in the - * setScanner() method of the main SparseBitSet class. - * - * @see SparseBitSet#setScanner(int i, int j, - * SparseBitSet b, AbstractStrategy op) - */ - protected abstract static class AbstractStrategy - { - /** If the operation requires that when matching level2 areas or level3 - * blocks are null, that no action is required, then this property is - * required. Corresponds to the top-left entry in the logic diagram for the - * operation being 0. For all the defined actual logic operations ('and', - * 'andNot', 'or', and 'xor', this will be true, because for all these, - * "false" op "false" = "false". - */ - static final int F_OP_F_EQ_F = 0x1; - - /** If when level2 areas or level3 areas from the this set are null will - * require that area or block to remain null, irrespective of the value of - * the matching structure from the other set, then this property is required. - * Corresponds to the first row in the logic diagram being all zeros. For - * example, this is true for 'and' as well as 'andNot', and for 'clear', since - * false" & "x" = "false", and "false" &! "x" = "false". - */ - static final int F_OP_X_EQ_F = 0x2; - - /** If when level2 areas or level3 areas from the other set are null will - * require the matching area or block in this set to be set to null, - * irrespective of the current values in the matching structure from the - * this, then this property is required. Corresponds to the first column - * in the logic diagram being all zero. For example, this is true for - * 'and', since "x" & "false" = "false", as well as for 'clear'. - */ - static final int X_OP_F_EQ_F = 0x4; - - /** If when a level3 area from the other set is null will require the - * matching area or block in this set to be left as it is, then this property - * is required. Corresponds to the first column of the logic diagram being - * equal to the left hand operand column. For example, this is true for 'or', - * 'xor', and 'andNot', since for all of these "x" op "false" = "x". - */ - static final int X_OP_F_EQ_X = 0x8; - - /** - * Properties of this strategy. - * - * @return the int containing the bits representing the properties of - * this strategy - * @since 1.6 - */ - protected abstract int properties(); - - /** - * Instances of this class are to be serially reusable. To start a - * particular use, an instance is (re-)started by calling this method. It is - * passed the reference to the other bit set (usually to allow a check on - * whether it is null or not, so as to simplify the implementation of the - * block() method. - * - * @param b the "other" set, for whatever checking is needed. - * @since 1.6 - * @return true -> if the cache should be set to zero - */ - protected abstract boolean start(SparseBitSet b); - - /** - * Deal with a scan that include a partial word within a level3 block. All - * that is required is that the result be stored (if needed) into the - * given a set block at the correct position, and that the operation only - * affect those bits selected by 1 bits in the mask. - * - * @param base the base index of the block (to be used if needed) - * @param u3 the index of the word within block - * @param a3 the level3 block from the a set. - * @param b3 the (nominal) level3 block from the b set (not null). - * @param mask for the (partial) word - * @return true if the resulting word is zero - * @since 1.6 - */ - protected abstract boolean word(int base, int u3, long[] a3, long[] b3, long mask); - - /** - * Deals with a part of a block that consists of whole words, starting with - * the given first index, and ending with the word before the last index. - * For the words processed, the return value should indicate whether all those - * resulting words were zero, or not. - * - * @param base the base index of the block (to be used if needed) - * @param u3 the index of the first word within block to process - * @param v3 the index of the last word, which may be within block - * @param a3 the level3 block from the a set. - * @param b3 the (nominal) level3 block from the b set (not null). - * @return true if the words scanned within the level3 block were all zero - * @since 1.6 - */ - protected abstract boolean block(int base, int u3, int v3, long[] a3, long[] b3); - - /** - * This is called to finish the processing started by the strategy (if there - * needs to be anything done at all). - * - * @param a2Count possible count of level2 areas in use - * @param a3Count possible count of level3 blocks in use - * @since 1.6 - */ - protected void finish(int a2Count, int a3Count) - { - } - - /** - * Check whether a level3 block is all zero. - * - * @param a3 the block from the a set - * @return true if the values of the level3 block are all zero - * - * @since 1.6 - */ - protected final boolean isZeroBlock(long[] a3) - { - for (long word : a3) - if (word != 0L) - return false; - return true; - } - } - - //============================================================================= - // Strategies based on the Strategy super-class describing logical operations - //============================================================================= - - /** - * And of two sets. Where the a set is zero, it remains zero (i.e., - * without entries or with zero words). Similarly, where the b set is - * zero, the a becomes zero (i.e., without entries). - *

- * If level1 of the a set is longer than level1 of the bit set - * b, then the unmatched virtual "entries" of the b set (beyond - * the actual length of b) corresponding to these are all false, hence - * the result of the "and" operation will be to make all these entries in this - * set to become false--hence just remove them, and then scan only those - * entries that could match entries in the bit setb. This clearing of - * the remainder of the a set is accomplished by selecting both - * F_OP_X_EQ_F and X_OP_F_EQ_F. - * - *

-     *  and| 0 1
-     *    0| 0 0
-     *    1| 0 1 
-     */
-    protected static class AndStrategy extends AbstractStrategy
-    {
-        @Override
-        //  AndStrategy
-        protected int properties()
-        {
-            return F_OP_F_EQ_F + F_OP_X_EQ_F + X_OP_F_EQ_F;
-        }
-
-        @Override
-        //  AndStrategy
-        protected boolean start(SparseBitSet b)
-        {
-            if (b == null)
-                throw new NullPointerException();
-            return true;
-        }
-
-        @Override
-        //  AndStrategy
-        protected boolean word(int base, int u3, long[] a3, long[] b3, long mask)
-        {
-            return (a3[u3] &= b3[u3] | ~mask) == 0L;
-        }
-
-        @Override
-        //  AndStrategy
-        protected boolean block(int base, int u3, int v3, long[] a3, long[] b3)
-        {
-            boolean isZero = true; //  Presumption
-            for (int w3 = u3; w3 != v3; ++w3)
-                isZero &= ((a3[w3] &= b3[w3]) == 0L);
-            return isZero;
-        }
-    }
-
-    //-----------------------------------------------------------------------------
-    /**
-     *  AndNot of two sets. Where the a set is zero, it remains zero
-     *  (i.e., without entries or with zero words). On the other hand, where the
-     *  b set is zero, the a remains unchanged.
-     *  

- * If level1 of the a set is longer than level1 of the bit set - * b, then the unmatched virtual "entries" of the b set (beyond - * the actual length of b) corresponding to these are all false, hence - * the result of the "and" operation will be to make all these entries in this - * set to become false--hence just remove them, and then scan only those - * entries that could match entries in the bit setb. This clearing of - * the remainder of the a set is accomplished by selecting both - * F_OP_X_EQ_F and X_OP_F_EQ_F. - * - *

-     * andNot| 0 1
-     *      0| 0 0
-     *      1| 1 0 
-     */
-    protected static class AndNotStrategy extends AbstractStrategy
-    {
-        @Override
-        //  AndNotStrategy
-        protected int properties()
-        {
-            return F_OP_F_EQ_F + F_OP_X_EQ_F + X_OP_F_EQ_X;
-        }
-
-        @Override
-        //  AndNotStrategy
-        protected boolean start(SparseBitSet b)
-        {
-            if (b == null)
-                throw new NullPointerException();
-            return true;
-        }
-
-        @Override
-        //  AndNotStrategy
-        protected boolean word(int base, int u3, long[] a3, long[] b3, long mask)
-        {
-            return (a3[u3] &= ~(b3[u3] & mask)) == 0L;
-        }
-
-        @Override
-        //  AndNotStrategy
-        protected boolean block(int base, int u3, int v3, long[] a3, long[] b3)
-        {
-            boolean isZero = true; //  Presumption
-            for (int w3 = u3; w3 != v3; ++w3)
-                isZero &= (a3[w3] &= ~b3[w3]) == 0L;
-            return isZero;
-        }
-    }
-
-    //-----------------------------------------------------------------------------
-    /**
-     *  Clear clears bits in the a set.
-     *
-     * 
-     * clear| 0 1
-     *     0| 0 0
-     *     1| 0 0 
-     */
-    protected static class ClearStrategy extends AbstractStrategy
-    {
-        @Override
-        //  ClearStrategy
-        protected int properties()
-        {
-            return F_OP_F_EQ_F + F_OP_X_EQ_F;
-        }
-
-        @Override
-        //  ClearStrategy
-        protected boolean start(SparseBitSet b)
-        {
-            return true;
-        }
-
-        @Override
-        //  ClearStrategy
-        protected boolean word(int base, int u3, long[] a3, long[] b3, long mask)
-        {
-            return (a3[u3] &= ~mask) == 0L;
-        }
-
-        @Override
-        //  ClearStrategy
-        protected boolean block(int base, int u3, int v3, long[] a3, long[] b3)
-        {
-            if (u3 != 0 || v3 != LENGTH3) //  Optimisation
-                for (int w3 = u3; w3 != v3; ++w3)
-                    a3[w3] = 0L;
-            return true;
-        }
-    }
-
-    //-----------------------------------------------------------------------------
-    /**
-     *  Copies the needed parts of the b set to the a set.
-     *
-     * 
-     * get| 0 1
-     *   0| 0 1
-     *   1| 0 1 
-     */
-    protected static class CopyStrategy extends AbstractStrategy
-    {
-        @Override
-        //  CopyStrategy
-        protected int properties()
-        {
-            return F_OP_F_EQ_F + X_OP_F_EQ_F;
-        }
-
-        @Override
-        //  CopyStrategy
-        protected boolean start(SparseBitSet b)
-        {
-            return true;
-        }
-
-        @Override
-        //  CopyStrategy
-        protected boolean word(int base, int u3, long[] a3, long[] b3, long mask)
-        {
-            return (a3[u3] = b3[u3] & mask) == 0L;
-        }
-
-        @Override
-        //  CopyStrategy
-        protected boolean block(int base, int u3, int v3, long[] a3, long[] b3)
-        {
-            boolean isZero = true;
-            for (int w3 = u3; w3 != v3; ++w3)
-                isZero &= (a3[w3] = b3[w3]) == 0L;
-            return isZero;
-        }
-    }
-
-    //-----------------------------------------------------------------------------
-    /**
-     *  Equals compares bits in the a set with those in the b set.
-     *  None of the values in either set are changed, although the a set
-     *  may have all zero level 3 blocks replaced by null references (and
-     *  similarly at level 2).
-     *
-     * 
-     * equals| 0 1
-     *      0| 0 -
-     *      1| - - 
-     */
-    protected static class EqualsStrategy extends AbstractStrategy
-    {
-        boolean result; // Used to hold result of the comparison
-
-        @Override
-        //  EqualsStrategy
-        protected int properties()
-        {
-            return F_OP_F_EQ_F;
-        }
-
-        @Override
-        //  EqualsStrategy
-        protected boolean start(SparseBitSet b)
-        {
-            if (b == null)
-                throw new NullPointerException();
-            result = true;
-            return false;
-            /*  Equals does not change the content of the set, hence hash need
-                not be reset. */
-        }
-
-        @Override
-        //  EqualsStrategy
-        protected boolean word(int base, int u3, long[] a3, long[] b3, long mask)
-        {
-            final long word = a3[u3];
-            result &= (word & mask) == (b3[u3] & mask);
-            return word == 0L;
-        }
-
-        @Override
-        //  EqualsStrategy
-        protected boolean block(int base, int u3, int v3, long[] a3, long[] b3)
-        {
-
-            boolean isZero = true; //  Presumption
-            for (int w3 = u3; w3 != v3; ++w3)
-            {
-                final long word = a3[w3];
-                result &= word == b3[w3];
-                isZero &= word == 0L;
-            }
-            return isZero;
-        }
-    }
-
-    //-----------------------------------------------------------------------------
-    /**
-     *  Flip inverts the bits of the a set within the given range.
-     *
-     * 
-     * flip| 0 1
-     *    0| 1 1
-     *    1| 0 0 
-     */
-    protected static class FlipStrategy extends AbstractStrategy
-    {
-        @Override
-        // FlipStrategy
-        protected int properties()
-        {
-            return 0;
-        }
-
-        @Override
-        // FlipStrategy
-        protected boolean start(SparseBitSet b)
-        {
-            return true;
-        }
-
-        @Override
-        // FlipStrategy
-        protected boolean word(int base, int u3, long[] a3, long[] b3, long mask)
-        {
-            return (a3[u3] ^= mask) == 0L;
-        }
-
-        @Override
-        // FlipStrategy
-        protected boolean block(int base, int u3, int v3, long[] a3, long[] b3)
-        {
-            boolean isZero = true; //  Presumption
-            for (int w3 = u3; w3 != v3; ++w3)
-                isZero &= (a3[w3] ^= ~0L) == 0L;
-            return isZero;
-        }
-    }
-
-    //-----------------------------------------------------------------------------
-    /**
-     *  Intersect has a true result if any word in the a set has a bit
-     *  in common with the b set. During the scan of the a set
-     *  blocks (and areas) that are all zero may be replaced with empty blocks
-     *  and areas (null references), but the value of the set is not changed
-     *  (which is why X_OP_F_EQ_F is not selected, since this would cause
-     *  parts of the a set to be zero-ed out).
-     *
-     * 
-     * intersect| 0 1
-     *         0| 0 0
-     *         1| 1 1 
-     */
-    protected static class IntersectsStrategy extends AbstractStrategy
-    {
-        /**
-         *  The boolean result of the intersects scan Strategy is kept here.
-         */
-        protected boolean result;
-
-        @Override
-        //  IntersectsStrategy
-        protected int properties()
-        {
-            return F_OP_F_EQ_F + F_OP_X_EQ_F;
-        }
-
-        @Override
-        //  IntersectsStrategy
-        protected boolean start(SparseBitSet b)
-        {
-            if (b == null)
-                throw new NullPointerException();
-            result = false;
-            return false;
-            /*  Intersect does not change the content of the set, hence hash
-                need not be reset. */
-        }
-
-        @Override
-        //  IntersectsStrategy
-        protected boolean word(int base, int u3, long[] a3, long[] b3, long mask)
-        {
-            final long word = a3[u3];
-            result |= (word & b3[u3] & mask) != 0L;
-            return word == 0L;
-        }
-
-        @Override
-        //  IntersectsStrategy
-        protected boolean block(int base, int u3, int v3, long[] a3, long[] b3)
-        {
-            boolean isZero = true; //  Presumption
-            for (int w3 = u3; w3 != v3; ++w3)
-            {
-                final long word = a3[w3];
-                result |= (word & b3[w3]) != 0L;
-                isZero &= word == 0L;
-            }
-            return isZero;
-        }
-    }
-
-    /**
-     *  Or of two sets. Where the a set is one, it remains one. Similarly,
-     *  where the b set is one, the a becomes one. If both sets have
-     *  zeros in corresponding places, a zero results. Whole blocks or areas that
-     *  are or become zero are replaced by null arrays.
-     *  

- * If level1 of the a set is longer than level1 of the bit set - * b, then the unmatched entries of the a set (beyond - * the actual length of b) corresponding to these remain unchanged. * - *

-     *   or| 0 1
-     *    0| 0 1
-     *    1| 1 1 
-     */
-    protected static class OrStrategy extends AbstractStrategy
-    {
-        @Override
-        //  OrStrategy
-        protected int properties()
-        {
-            return F_OP_F_EQ_F + X_OP_F_EQ_X;
-        }
-
-        @Override
-        //  OrStrategy
-        protected boolean start(SparseBitSet b)
-        {
-            if (b == null)
-                throw new NullPointerException();
-            return true;
-        }
-
-        @Override
-        //  OrStrategy
-        protected boolean word(int base, int u3, long[] a3, long[] b3, long mask)
-        {
-            return (a3[u3] |= b3[u3] & mask) == 0L;
-        }
-
-        @Override
-        //  OrStrategy
-        protected boolean block(int base, int u3, int v3, long[] a3, long[] b3)
-        {
-            boolean isZero = true; //  Presumption
-            for (int w3 = u3; w3 != v3; ++w3)
-                isZero &= (a3[w3] |= b3[w3]) == 0L;
-            return isZero;
-        }
-    }
-
-    //-----------------------------------------------------------------------------
-    /**
-     *  Set creates entries everywhere within the range. Hence no empty level2
-     *  areas or level3 blocks are ignored, and no empty (all zero) blocks are
-     *  returned.
-     *
-     *  
-     * set| 0 1
-     *   0| 1 1
-     *   1| 1 1 
-     */
-    protected static class SetStrategy extends AbstractStrategy
-    {
-        @Override
-        //  SetStrategy
-        protected int properties()
-        {
-            return 0;
-        }
-
-        @Override
-        //  SetStrategy
-        protected boolean start(SparseBitSet b)
-        {
-            return true;
-        }
-
-        @Override
-        //  SetStrategy
-        protected boolean word(int base, int u3, long[] a3, long[] b3, long mask)
-        {
-            a3[u3] |= mask;
-            return false;
-        }
-
-        @Override
-        //  SetStrategy
-        protected boolean block(int base, int u3, int v3, long[] a3, long[] b3)
-        {
-            for (int w3 = u3; w3 != v3; ++w3)
-                a3[w3] = ~0L;
-            return false; // set always sets bits
-        }
-    }
-
-    //-----------------------------------------------------------------------------
-    /**
-     *  Update the seven statistics that are computed for each set. These are
-     *  updated by calling statisticsUpdate, which uses this strategy.
-     *
-     *  
-     *  update| 0 1
-     *       0| 0 0
-     *       1| 1 1 
-     *
-     * @see SparseBitSet#statisticsUpdate()
-     */
-    protected class UpdateStrategy extends AbstractStrategy
-    {
-        /**
-         *  Working space for find the size and length of the bit set. Holds the
-         *  index of the first non-empty word in the set.
-         */
-        protected transient int wMin;
-
-        /**
-         *  Working space for find the size and length of the bit set. Holds copy of
-         *  the first non-empty word in the set.
-         */
-        protected transient long wordMin;
-
-        /**
-         *  Working space for find the size and length of the bit set. Holds the
-         *  index of the last non-empty word in the set.
-         */
-        protected transient int wMax;
-
-        /**
-         *  Working space for find the size and length of the bit set. Holds a copy
-         *  of the last non-empty word in the set.
-         */
-        protected transient long wordMax;
-
-        /**
-         *  Working space for find the hash value of the bit set. Holds the
-         *  current state of the computation of the hash value. This value is
-         *  ultimately transferred to the Cache object.
-         *
-         * @see SparseBitSet.Cache
-         */
-        protected transient long hash;
-
-        /**
-         *  Working space for keeping count of the number of non-zero words in the
-         *  bit set. Holds the current state of the computation of the count. This
-         *  value is ultimately transferred to the Cache object.
-         *
-         * @see SparseBitSet.Cache
-         */
-        protected transient int count;
-
-        /**
-         *  Working space for counting the number of non-zero bits in the bit set.
-         *  Holds the current state of the computation of the cardinality.This
-         *  value is ultimately transferred to the Cache object.
-         *
-         * @see SparseBitSet.Cache
-         */
-        protected transient int cardinality;
-
-        @Override
-        //  UpdateStrategy
-        protected int properties()
-        {
-            return F_OP_F_EQ_F + F_OP_X_EQ_F;
-        }
-
-        /**
-         *  This method initializes the computations by suitably resetting cache
-         *  fields or working fields.
-         *
-         * @param       b the other SparseBitSet, for checking if needed.
-         *
-         * @since       1.6
-         */
-        @Override
-        protected boolean start(SparseBitSet b)
-        {
-            hash = 1234L; // Magic number
-            wMin = -1; // index of first non-zero word
-            wordMin = 0L; // word at that index
-            wMax = 0; // index of last non-zero word
-            wordMax = 0L; // word at that index
-            count = 0; // count of non-zero words in whole set
-            cardinality = 0; // count of non-zero bits in the whole set
-            return false;
-        }
-
-        @Override
-        protected boolean word(int base, int u3, long[] a3, long[] b3, long mask)
-        {
-            final long word = a3[u3];
-            final long word1 = word & mask;
-            if (word1 != 0L)
-                compute(base + u3, word1);
-            return word == 0L;
-        }
-
-        @Override
-        //  UpdateStrategy
-        protected boolean block(int base, int u3, int v3, long[] a3, long[] b3)
-        {
-            boolean isZero = true; //  Presumption
-            for (int w3 = 0; w3 != v3; ++w3)
-            {
-                final long word = a3[w3];
-                if (word != 0)
-                {
-                    isZero = false;
-                    compute(base + w3, word);
-                }
-            }
-            return isZero;
-        }
-
-        @Override
-        //  UpdateStrategy
-        protected void finish(int a2Count, int a3Count)
-        {
-            cache.a2Count = a2Count;
-            cache.a3Count = a3Count;
-            cache.count = count;
-            cache.cardinality = cardinality;
-            cache.length = (wMax + 1) * LENGTH4 - Long.numberOfLeadingZeros(wordMax);
-            cache.size = cache.length - wMin * LENGTH4
-                - Long.numberOfTrailingZeros(wordMin);
-            cache.hash = (int) ((hash >> Integer.SIZE) ^ hash);
-        }
-
-        /**
-         *  This method does the accumulation of the statistics. It must be called
-         *  in sequential order of the words in the set for which the statistics
-         *  are being accumulated, and only for non-null values of the second
-         *  parameter.
-         *
-         *  Two of the values (a2Count and a3Count) are not updated here,
-         *  but are done in the code near where this method is called.
-         *
-         * @param       index the word index of the word supplied
-         * @param       word the long non-zero word from the set
-         * @since       1.6
-         */
-        private void compute(final int index, final long word)
-        {
-            /*  Count the number of actual words being used. */
-            ++count;
-            /*  Continue to accumulate the hash value of the set. */
-            hash ^= word * (long) (index + 1);
-            /*  The first non-zero word contains the first actual bit of the
-                set. The location of this bit is used to compute the set size. */
-            if (wMin < 0)
-            {
-                wMin = index;
-                wordMin = word;
-            }
-            /*  The last non-zero word contains the last actual bit of the set.
-                The location of this bit is used to compute the set length. */
-            wMax = index;
-            wordMax = word;
-            /*  Count the actual bits, so as to get the cardinality of the set. */
-            cardinality += Long.bitCount(word);
-        }
-    }
-
-    //-----------------------------------------------------------------------------
-    /**
-     *  The XOR of level3 blocks is computed.
-     *
-     * 
-     * xor| 0 1
-     *   0| 0 1
-     *   1| 1 0 
-     */
-    protected static class XorStrategy extends AbstractStrategy
-    {
-        @Override
-        //  XorStrategy
-        protected int properties()
-        {
-            return F_OP_F_EQ_F + X_OP_F_EQ_X;
-        }
-
-        @Override
-        //  XorStrategy
-        protected boolean start(SparseBitSet b)
-        {
-            if (b == null)
-                throw new NullPointerException();
-            return true;
-        }
-
-        @Override
-        protected boolean word(int base, int u3, long[] a3, long[] b3, long mask)
-        {
-            return (a3[u3] ^= b3[u3] & mask) == 0;
-        }
-
-        @Override
-        //  XorStrategy
-        protected boolean block(int base, int u3, int v3, long[] a3, long[] b3)
-        {
-            boolean isZero = true; //  Presumption
-            for (int w3 = u3; w3 != v3; ++w3)
-                isZero &= (a3[w3] ^= b3[w3]) == 0;
-            return isZero;
-
-        }
-    }
-
-    //-----------------------------------------------------------------------------
-    /**
-     *  Word and block and strategy.
-     */
-    protected static final transient AndStrategy andStrategy = new AndStrategy();
-    /**
-     *  Word and block andNot strategy.
-     */
-    protected static final transient AndNotStrategy andNotStrategy = new AndNotStrategy();
-    /**
-     *  Word and block clear strategy.
-     */
-    protected static final transient ClearStrategy clearStrategy = new ClearStrategy();
-    /**
-     *  Word and block copy strategy.
-     */
-    protected static final transient CopyStrategy copyStrategy = new CopyStrategy();
-    /**
-     *  Word and block equals strategy.
-     */
-    protected transient EqualsStrategy equalsStrategy;
-    /**
-     *  Word and block flip strategy.
-     */
-    protected static final transient FlipStrategy flipStrategy = new FlipStrategy();
-    /**
-     *  Word and block intersects strategy.
-     */
-    protected static transient IntersectsStrategy intersectsStrategy = new IntersectsStrategy();
-    /**
-     *  Word and block or strategy.
-     */
-    protected static final transient OrStrategy orStrategy = new OrStrategy();
-    /**
-     *  Word and block set strategy.
-     */
-    protected static final transient SetStrategy setStrategy = new SetStrategy();
-    /**
-     *  Word and block update strategy.
-     */
-    protected transient UpdateStrategy updateStrategy;
-    /**
-     *  Word and block xor strategy.
-     */
-    protected static final transient XorStrategy xorStrategy = new XorStrategy();
-}
diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/SparseBlockSet.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/SparseBlockSet.java
deleted file mode 100644
index 72f86e51a..000000000
--- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/SparseBlockSet.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package com.fastasyncworldedit.core.object.collection;
-
-import java.io.Serializable;
-
-public class SparseBlockSet implements Serializable {
-    private SparseBitSet[] sets;
-
-    public SparseBlockSet(int depth) {
-        sets = new SparseBitSet[depth];
-        for (int i = 0; i < sets.length; i++) {
-            sets[i] = new SparseBitSet();
-        }
-    }
-
-    public void setBlock(int index, int id) {
-        for (int i = 0; i < sets.length; i++) {
-            SparseBitSet set = sets[i];
-            if (((id >> i) & 1) == 1) {
-                set.set(index);
-            } else {
-                set.clear(index);
-            }
-        }
-    }
-
-    public int getBlock(int index) {
-        int id = 0;
-        for (int i = 0; i < sets.length; i++) {
-            SparseBitSet set = sets[i];
-            if (set.get(index)) {
-                id += 1 << i;
-            }
-        }
-        return id;
-    }
-}
\ No newline at end of file
diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/SummedAreaTable.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/SummedAreaTable.java
deleted file mode 100644
index a58108228..000000000
--- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/SummedAreaTable.java
+++ /dev/null
@@ -1,99 +0,0 @@
-package com.fastasyncworldedit.core.object.collection;
-
-import com.fastasyncworldedit.core.util.MathMan;
-
-public class SummedAreaTable {
-
-    private final char[] source;
-    private final long[] summed;
-    private final int length;
-    private final int width;
-    private final int area;
-    private final int radius;
-    private final float areaInverse;
-    private final float[] areaInverses;
-
-    public SummedAreaTable(long[] buffer, char[] matrix, int width, int radius) {
-        this.source = matrix;
-        this.summed = buffer;
-        this.width = width;
-        this.length = buffer.length / width;
-        this.radius = radius;
-        this.area = MathMan.sqr(radius * 2 + 1);
-        this.areaInverse = 1f / area;
-        this.areaInverses = new float[area - 2];
-        for (int area = 2; area < this.area; area++) {
-            this.areaInverses[area - 2] = 1f / area;
-        }
-    }
-
-    public void processSummedAreaTable() {
-        int rowSize = source.length / width;
-        int index = 0;
-        for (int i = 0; i < rowSize; i++) {
-            for (int j = 0; j < width; j++, index++) {
-                long val = getVal(i, j, index, source[index]);
-                summed[index] = val;
-            }
-        }
-    }
-
-    private long getSum(int index) {
-        if (index < 0) {
-            return 0;
-        }
-        return summed[index];
-    }
-
-    public int average(int x, int z, int index) {
-        int minX = Math.max(0, x - radius) - x;
-        int minZ = Math.max(0, z - radius) - z;
-        int maxX = Math.min(width - 1, x + radius) - x;
-        int maxZ = Math.min(length - 1, z + radius) - z;
-        int maxzwi = maxZ * width;
-        int XZ = index + maxzwi + maxX;
-        int area = (maxX - minX + 1) * (maxZ - minZ + 1);
-
-        long total = getSum(XZ);
-
-        int minzw = minZ * width;
-        int Z = index + minzw + maxX;
-        if (x > radius) {
-            int X = index + minX + maxzwi;
-            int M = index + minzw + minX;
-            total -= summed[X - 1];
-            total += getSum(M - width - 1);
-        }
-        total -= getSum(Z - width);
-        if (area == this.area) {
-            return (int) (total * areaInverse);
-        } else {
-            return Math.round(total * areaInverses[area - 2]);
-        }
-    }
-
-    private long getVal(int row, int col, int index, long curr) {
-        long leftSum;                    // sub matrix sum of left matrix
-        long topSum;                        // sub matrix sum of top matrix
-        long topLeftSum;                    // sub matrix sum of top left matrix
-        /* top left value is itself */
-        if (index == 0) {
-            return curr;
-        }
-        /* top row */
-        else if (row == 0 && col != 0) {
-            leftSum = summed[index - 1];
-            return curr + leftSum;
-        }
-        /* left-most column */
-        else if (row != 0 && col == 0) {
-            topSum = summed[index - width];
-            return curr + topSum;
-        } else {
-            leftSum = summed[index - 1];
-            topSum = summed[index - width];
-            topLeftSum = summed[index - width - 1]; // overlap between leftSum and topSum
-            return curr + leftSum + topSum - topLeftSum;
-        }
-    }
-}
diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/AsyncBufferedOutputStream.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/AsyncBufferedOutputStream.java
deleted file mode 100644
index 598cc0447..000000000
--- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/AsyncBufferedOutputStream.java
+++ /dev/null
@@ -1,183 +0,0 @@
-package com.fastasyncworldedit.core.object.io;
-
-import java.io.FilterOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.util.concurrent.ConcurrentLinkedDeque;
-
-/**
- * BufferedOutputStream that asynchronously flushes to disk, so callers don't
- * have to wait until the flush happens. Buffers are put into a queue that is
- * written asynchronously to disk once it is really available.
- *
- * 

- * The error handling (as all stream ops are done asynchronously) is done during - * write and close. Exceptions on the asynchronous thread will be thrown to the - * caller either while writing or closing this stream. - *

- * - * @apiNote This class is thread-safe. - * @author thomas.jungblut - */ -public final class AsyncBufferedOutputStream extends FilterOutputStream { - - private final FlushThread flusher = new FlushThread(); - private final Thread flusherThread = new Thread(flusher, "FlushThread"); - private final ConcurrentLinkedDeque buffers; - - private final byte[] buf; - private int count = 0; - - /** - * Creates an asynchronous buffered output stream with 8K buffer and 5 maximal - * buffers. - */ - public AsyncBufferedOutputStream(OutputStream out) { - this(out, 8 * 1024, 5); - } - - /** - * Creates an asynchronous buffered output stream with defined bufferSize and - * 5 maximal buffers. - */ - public AsyncBufferedOutputStream(OutputStream out, int bufSize) { - this(out, bufSize, 5); - } - - /** - * Creates an asynchronous buffered output stream. - * - * @param out the outputStream to layer on. - * @param bufSize the buffer size. - * @param maxBuffers the number of buffers to keep in parallel. - */ - public AsyncBufferedOutputStream(OutputStream out, int bufSize, int maxBuffers) { - super(out); - buffers = new ConcurrentLinkedDeque<>(); - buf = new byte[bufSize]; - flusherThread.start(); - } - - /** - * Writes the specified byte to this buffered output stream. - * - * @param b the byte to be written. - * @throws IOException if an I/O error occurs. - */ - @Override - public synchronized void write(int b) throws IOException { - flushBufferIfSizeLimitReached(); - throwOnFlusherError(); - buf[count++] = (byte) b; - } - - @Override - public void write(byte[] b) throws IOException { - write(b, 0, b.length); - } - - /** - * Writes len bytes from the specified byte array starting at - * offset off to this buffered output stream. - * - * @param b the data. - * @param off the start offset in the data. - * @param len the number of bytes to write. - * @throws IOException if an I/O error occurs. - */ - @Override - public synchronized void write(byte[] b, int off, int len) throws IOException { - if ((off | len | (b.length - (len + off)) | (off + len)) < 0) { - throw new IndexOutOfBoundsException(); - } - - int bytesWritten = 0; - while (bytesWritten < len) { - throwOnFlusherError(); - flushBufferIfSizeLimitReached(); - - int bytesToWrite = Math.min(len - bytesWritten, buf.length - count); - System.arraycopy(b, off + bytesWritten, buf, count, bytesToWrite); - count += bytesToWrite; - bytesWritten += bytesToWrite; - } - } - - /** - * Flushes this buffered output stream. It will enforce that the current - * buffer will be queue for asynchronous flushing no matter what size it has. - * - * @throws IOException if an I/O error occurs. - */ - @Override - public synchronized void flush() throws IOException { - forceFlush(); - } - - private void flushBufferIfSizeLimitReached() throws IOException { - if (count >= buf.length) { - forceFlush(); - } - } - - private void forceFlush() throws IOException { - if (count > 0) { - final byte[] copy = new byte[count]; - System.arraycopy(buf, 0, copy, 0, copy.length); - buffers.add(copy); - count = 0; - } - } - - @Override - public synchronized void close() throws IOException { - throwOnFlusherError(); - - forceFlush(); - flusher.closed = true; - - try { - flusherThread.interrupt(); - flusherThread.join(); - - throwOnFlusherError(); - } catch (InterruptedException e) { - // this is expected to happen - } finally { - out.close(); - } - } - - private void throwOnFlusherError() throws IOException { - if (flusher != null && flusher.errorHappened) { - throw new IOException("caught flusher to fail writing asynchronously!", - flusher.caughtException); - } - } - - class FlushThread implements Runnable { - - volatile boolean closed = false; - volatile boolean errorHappened = false; - volatile Exception caughtException; - - @Override - public void run() { - // run the real flushing action to the underlying stream - try { - while (!closed) { - byte[] take = buffers.poll(); - if (take != null) { - out.write(take); - } - } - } catch (Exception e) { - caughtException = e; - errorHappened = true; - // yield this thread, an error happened - return; - } - } - } - -} diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/BufferedRandomAccessFile.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/BufferedRandomAccessFile.java deleted file mode 100644 index 7d6ea9690..000000000 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/BufferedRandomAccessFile.java +++ /dev/null @@ -1,424 +0,0 @@ -package com.fastasyncworldedit.core.object.io; - -import java.io.File; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.RandomAccessFile; -import java.util.Arrays; - - -/** - * A {@code BufferedRandomAccessFile} is like a - * {@code RandomAccessFile}, but it uses a private buffer so that most - * operations do not require a disk access. - * - * @author Avinash Lakshman ( alakshman@facebook.com) & Prashant Malik ( pmalik@facebook.com ) - * @apiNote The operations on this class are unmonitored. Also, the correct - * functioning of the {@code RandomAccessFile} methods that are not - * overridden here relies on the implementation of those methods in the superclass. - */ - -public class BufferedRandomAccessFile extends RandomAccessFile { - static final int LogBuffSz_ = 16; // 64K buffer - public static final int BuffSz_ = (1 << LogBuffSz_); - static final long BuffMask_ = ~(((long) BuffSz_) - 1L); - - /* - * This implementation is based on the buffer implementation in Modula-3's - * "Rd", "Wr", "RdClass", and "WrClass" interfaces. - */ - private boolean dirty_; // true iff unflushed bytes exist - private boolean closed_; // true iff the file is closed - private long curr_; // current position in file - private long lo_; // bounds on characters in "buff" - private long hi_; // bounds on characters in "buff" - private byte[] buff_; // local buffer - private long maxHi_; // this.lo + this.buff.length - private boolean hitEOF_; // buffer contains last file block? - private long diskPos_; // disk position - - /* - * To describe the above fields, we introduce the following abstractions for - * the file "f": - * - * len(f) the length of the file curr(f) the current position in the file - * c(f) the abstract contents of the file disk(f) the contents of f's - * backing disk file closed(f) true iff the file is closed - * - * "curr(f)" is an index in the closed interval [0, len(f)]. "c(f)" is a - * character sequence of length "len(f)". "c(f)" and "disk(f)" may differ if - * "c(f)" contains unflushed writes not reflected in "disk(f)". The flush - * operation has the effect of making "disk(f)" identical to "c(f)". - * - * A file is said to be *valid* if the following conditions hold: - * - * V1. The "closed" and "curr" fields are correct: - * - * f.closed == closed(f) f.curr == curr(f) - * - * V2. The current position is either contained in the buffer, or just past - * the buffer: - * - * f.lo <= f.curr <= f.hi - * - * V3. Any (possibly) unflushed characters are stored in "f.buff": - * - * (forall i in [f.lo, f.curr): c(f)[i] == f.buff[i - f.lo]) - * - * V4. For all characters not covered by V3, c(f) and disk(f) agree: - * - * (forall i in [f.lo, len(f)): i not in [f.lo, f.curr) => c(f)[i] == - * disk(f)[i]) - * - * V5. "f.dirty" is true iff the buffer contains bytes that should be - * flushed to the file; by V3 and V4, only part of the buffer can be dirty. - * - * f.dirty == (exists i in [f.lo, f.curr): c(f)[i] != f.buff[i - f.lo]) - * - * V6. this.maxHi == this.lo + this.buff.length - * - * Note that "f.buff" can be "null" in a valid file, since the range of - * characters in V3 is empty when "f.lo == f.curr". - * - * A file is said to be *ready* if the buffer contains the current position, - * i.e., when: - * - * R1. !f.closed && f.buff != null && f.lo <= f.curr && f.curr < f.hi - * - * When a file is ready, reading or writing a single byte can be performed - * by reading or writing the in-memory buffer without performing a disk - * operation. - */ - - /** - * Open a new {@code BufferedRandomAccessFile} on {@code file} - * in mode {@code mode}, which should be "r" for reading only, or - * "rw" for reading and writing. - */ - public BufferedRandomAccessFile(File file, String mode) throws IOException { - super(file, mode); - this.init(0); - } - - public BufferedRandomAccessFile(File file, String mode, int size) throws IOException { - super(file, mode); - this.init(size); - } - - /** - * Open a new {@code BufferedRandomAccessFile} on the file named - * {@code name} in mode {@code mode}, which should be "r" for - * reading only, or "rw" for reading and writing. - */ - public BufferedRandomAccessFile(String name, String mode) throws IOException { - super(name, mode); - this.init(0); - } - - public BufferedRandomAccessFile(String name, String mode, int size) throws FileNotFoundException { - super(name, mode); - this.init(size); - } - - public BufferedRandomAccessFile(File file, String mode, byte[] buf) throws FileNotFoundException { - super(file, mode); - this.dirty_ = this.closed_ = false; - this.lo_ = this.curr_ = this.hi_ = 0; - this.buff_ = buf; - this.maxHi_ = (long) BuffSz_; - this.hitEOF_ = false; - this.diskPos_ = 0L; - } - - private void init(int size) { - this.dirty_ = this.closed_ = false; - this.lo_ = this.curr_ = this.hi_ = 0; - this.buff_ = (size > BuffSz_) ? new byte[size] : new byte[BuffSz_]; - this.maxHi_ = (long) BuffSz_; - this.hitEOF_ = false; - this.diskPos_ = 0L; - } - - @Override - public void close() throws IOException { - this.flush(); - this.closed_ = true; - super.close(); - } - - /** - * Flush any bytes in the file's buffer that have not yet been written to - * disk. If the file was created read-only, this method is a no-op. - */ - public void flush() throws IOException { - this.flushBuffer(); - } - - /* Flush any dirty bytes in the buffer to disk. */ - private void flushBuffer() throws IOException { - if (this.dirty_) { - if (this.diskPos_ != this.lo_) { - super.seek(this.lo_); - } - int len = (int) (this.curr_ - this.lo_); - super.write(this.buff_, 0, len); - this.diskPos_ = this.curr_; - this.dirty_ = false; - } - } - - /* - * Read at most "this.buff.length" bytes into "this.buff", returning the - * number of bytes read. If the return result is less than - * "this.buff.length", then EOF was read. - */ - private int fillBuffer() throws IOException { - int cnt = 0; - int rem = this.buff_.length; - while (rem > 0) { - int n = super.read(this.buff_, cnt, rem); - if (n < 0) { - break; - } - cnt += n; - rem -= n; - } - if ((cnt < 0) && (this.hitEOF_ = (cnt < this.buff_.length))) { - // make sure buffer that wasn't read is initialized with -1 - Arrays.fill(this.buff_, cnt, this.buff_.length, (byte) 0xff); - } - this.diskPos_ += cnt; - return cnt; - } - - /* - * This method positions this.curr at position pos. - * If pos does not fall in the current buffer, it flushes the - * current buffer and loads the correct one.

- * - * On exit from this routine this.curr == this.hi iff pos - * is at or past the end-of-file, which can only happen if the file was - * opened in read-only mode. - */ - @Override - public void seek(long pos) throws IOException { - if (pos >= this.hi_ || pos < this.lo_) { - // seeking outside of current buffer -- flush and read - this.flushBuffer(); - this.lo_ = pos & BuffMask_; // start at BuffSz boundary - this.maxHi_ = this.lo_ + (long) this.buff_.length; - if (this.diskPos_ != this.lo_) { - super.seek(this.lo_); - this.diskPos_ = this.lo_; - } - int n = this.fillBuffer(); - this.hi_ = this.lo_ + (long) n; - } else { - // seeking inside current buffer -- no read required - if (pos < this.curr_) { - // if seeking backwards, we must flush to maintain V4 - this.flushBuffer(); - } - } - this.curr_ = pos; - } - - /* - * Does not maintain V4 (i.e. buffer differs from disk contents if previously written to) - * - Assumes no writes were made - * @param pos - * @throws IOException - */ - public void seekUnsafe(long pos) throws IOException { - if (pos >= this.hi_ || pos < this.lo_) { - // seeking outside of current buffer -- flush and read - this.flushBuffer(); - this.lo_ = pos & BuffMask_; // start at BuffSz boundary - this.maxHi_ = this.lo_ + (long) this.buff_.length; - if (this.diskPos_ != this.lo_) { - super.seek(this.lo_); - this.diskPos_ = this.lo_; - } - int n = this.fillBuffer(); - this.hi_ = this.lo_ + (long) n; - } - this.curr_ = pos; - } - - @Override - public long getFilePointer() { - return this.curr_; - } - - @Override - public long length() throws IOException { - return Math.max(this.curr_, super.length()); - } - - @Override - public int read() throws IOException { - if (this.curr_ >= this.hi_) { - // test for EOF - // if (this.hi < this.maxHi) return -1; - if (this.hitEOF_) { - return -1; - } - - // slow path -- read another buffer - this.seek(this.curr_); - if (this.curr_ == this.hi_) { - return -1; - } - } - byte res = this.buff_[(int) (this.curr_ - this.lo_)]; - this.curr_++; - return ((int) res) & 0xFF; // convert byte -> int - } - - public byte read1() throws IOException { - if (this.curr_ >= this.hi_) { - // test for EOF - // if (this.hi < this.maxHi) return -1; - if (this.hitEOF_) { - return -1; - } - - // slow path -- read another buffer - this.seek(this.curr_); - if (this.curr_ == this.hi_) { - return -1; - } - } - byte res = this.buff_[(int) (this.curr_ - this.lo_)]; - this.curr_++; - return res; - } - - @Override - public int read(byte[] b) throws IOException { - return this.read(b, 0, b.length); - } - - @Override - public int read(byte[] b, int off, int len) throws IOException { - if (this.curr_ >= this.hi_) { - // test for EOF - // if (this.hi < this.maxHi) return -1; - if (this.hitEOF_) { - return -1; - } - - // slow path -- read another buffer - this.seek(this.curr_); - if (this.curr_ == this.hi_) { - return -1; - } - } - len = Math.min(len, (int) (this.hi_ - this.curr_)); - int buffOff = (int) (this.curr_ - this.lo_); - System.arraycopy(this.buff_, buffOff, b, off, len); - this.curr_ += len; - return len; - } - - public byte readCurrent() throws IOException { - if (this.curr_ >= this.hi_) { - // test for EOF - // if (this.hi < this.maxHi) return -1; - if (this.hitEOF_) { - return -1; - } - - // slow path -- read another buffer - this.seek(this.curr_); - if (this.curr_ == this.hi_) { - return -1; - } - } - return this.buff_[(int) (this.curr_ - this.lo_)]; - } - - public void writeCurrent(byte b) throws IOException { - if (this.curr_ >= this.hi_) { - if (this.hitEOF_ && this.hi_ < this.maxHi_) { - // at EOF -- bump "hi" - this.hi_++; - } else { - // slow path -- write current buffer; read next one - this.seek(this.curr_); - if (this.curr_ == this.hi_) { - // appending to EOF -- bump "hi" - this.hi_++; - } - } - } - this.buff_[(int) (this.curr_ - this.lo_)] = (byte) b; - this.dirty_ = true; - } - - public void writeUnsafe(int b) throws IOException { - this.buff_[(int) (this.curr_ - this.lo_)] = (byte) b; - this.curr_++; - this.dirty_ = true; - } - - @Override - public void write(int b) throws IOException { - if (this.curr_ >= this.hi_) { - if (this.hitEOF_ && this.hi_ < this.maxHi_) { - // at EOF -- bump "hi" - this.hi_++; - } else { - // slow path -- write current buffer; read next one - this.seek(this.curr_); - if (this.curr_ == this.hi_) { - // appending to EOF -- bump "hi" - this.hi_++; - } - } - } - this.buff_[(int) (this.curr_ - this.lo_)] = (byte) b; - this.curr_++; - this.dirty_ = true; - } - - @Override - public void write(byte[] b) throws IOException { - this.write(b, 0, b.length); - } - - @Override - public void write(byte[] b, int off, int len) throws IOException { - while (len > 0) { - int n = this.writeAtMost(b, off, len); - off += n; - len -= n; - this.dirty_ = true; - } - } - - /* - * Write at most "len" bytes to "b" starting at position "off", and return - * the number of bytes written. - */ - private int writeAtMost(byte[] b, int off, int len) throws IOException { - if (this.curr_ >= this.hi_) { - if (this.hitEOF_ && this.hi_ < this.maxHi_) { - // at EOF -- bump "hi" - this.hi_ = this.maxHi_; - } else { - // slow path -- write current buffer; read next one - this.seek(this.curr_); - if (this.curr_ == this.hi_) { - // appending to EOF -- bump "hi" - this.hi_ = this.maxHi_; - } - } - } - len = Math.min(len, (int) (this.hi_ - this.curr_)); - int buffOff = (int) (this.curr_ - this.lo_); - System.arraycopy(b, off, this.buff_, buffOff, len); - this.curr_ += len; - return len; - } -} diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/FastByteArrayInputStream.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/FastByteArrayInputStream.java deleted file mode 100644 index 65b5bdfb2..000000000 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/FastByteArrayInputStream.java +++ /dev/null @@ -1,79 +0,0 @@ -package com.fastasyncworldedit.core.object.io; - -import java.io.InputStream; - -public class FastByteArrayInputStream extends InputStream { - public byte[] array; - public int offset; - public int length; - private int position; - private int mark; - - public FastByteArrayInputStream(byte[] array, int offset, int length) { - this.array = array; - this.offset = offset; - this.length = length; - } - - public FastByteArrayInputStream(byte[] array) { - this(array, 0, array.length); - } - - public boolean markSupported() { - return true; - } - - public void reset() { - this.position = this.mark; - } - - public void close() { - } - - public void mark(int dummy) { - this.mark = this.position; - } - - public int available() { - return this.length - this.position; - } - - public long skip(long n) { - if (n <= this.length - this.position) { - this.position += (int) n; - return n; - } - n = this.length - this.position; - this.position = this.length; - return n; - } - - public int read() { - if (this.length == this.position) { - return -1; - } - return this.array[(this.offset + this.position++)] & 0xFF; - } - - public int read(byte[] b, int offset, int length) { - if (this.length == this.position) { - return length == 0 ? 0 : -1; - } - int n = Math.min(length, this.length - this.position); - System.arraycopy(this.array, this.offset + this.position, b, offset, n); - this.position += n; - return n; - } - - public long position() { - return this.position; - } - - public void position(long newPosition) { - this.position = ((int) Math.min(newPosition, this.length)); - } - - public long length() { - return this.length; - } -} diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/NonClosableOutputStream.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/NonClosableOutputStream.java deleted file mode 100644 index 5cd937088..000000000 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/NonClosableOutputStream.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.fastasyncworldedit.core.object.io; - -import java.io.IOException; -import java.io.OutputStream; - -public class NonClosableOutputStream extends AbstractDelegateOutputStream { - - public NonClosableOutputStream(OutputStream os) { - super(os); - } - - @Override - public void close() throws IOException { - // Do nothing - } -} diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/PGZIPBlock.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/PGZIPBlock.java deleted file mode 100644 index 87cb915a5..000000000 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/PGZIPBlock.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.fastasyncworldedit.core.object.io; - -import java.util.concurrent.Callable; - -public class PGZIPBlock implements Callable { - public PGZIPBlock(final PGZIPOutputStream parent) { - STATE = new PGZIPThreadLocal(parent); - } - - /** - * This ThreadLocal avoids the recycling of a lot of memory, causing lumpy performance. - */ - protected final ThreadLocal STATE; - public static final int SIZE = 64 * 1024; - // private final int index; - protected final byte[] in = new byte[SIZE]; - protected int in_length = 0; - - /* - public Block(@Nonnegative int index) { - this.index = index; - } - */ - // Only on worker thread - @Override - public byte[] call() throws Exception { - // LOG.info("Processing " + this + " on " + Thread.currentThread()); - - PGZIPState state = STATE.get(); - // ByteArrayOutputStream buf = new ByteArrayOutputStream(in.length); // Overestimate output size required. - // DeflaterOutputStream def = newDeflaterOutputStream(buf); - state.def.reset(); - state.buf.reset(); - state.str.write(in, 0, in_length); - state.str.flush(); - - // return Arrays.copyOf(in, in_length); - return state.buf.toByteArray(); - } - - @Override - public String toString() { - return "Block" /* + index */ + "(" + in_length + "/" + in.length + " bytes)"; - } -} \ No newline at end of file diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/PGZIPOutputStream.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/PGZIPOutputStream.java deleted file mode 100644 index 0bb398e97..000000000 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/PGZIPOutputStream.java +++ /dev/null @@ -1,252 +0,0 @@ -package com.fastasyncworldedit.core.object.io; - -import java.io.FilterOutputStream; -import java.io.IOException; -import java.io.InterruptedIOException; -import java.io.OutputStream; -import java.nio.ByteBuffer; -import java.nio.ByteOrder; -import java.util.ArrayList; -import java.util.concurrent.ArrayBlockingQueue; -import java.util.concurrent.BlockingQueue; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.Future; -import java.util.zip.CRC32; -import java.util.zip.Deflater; -import java.util.zip.DeflaterOutputStream; -import java.util.zip.GZIPOutputStream; -import javax.annotation.Nonnegative; -import javax.annotation.Nonnull; - -/** - * A multi-threaded version of {@link GZIPOutputStream}. - * - * @author shevek - */ -public class PGZIPOutputStream extends FilterOutputStream { - - private static final ExecutorService EXECUTOR = Executors.newCachedThreadPool(); - - public static ExecutorService getSharedThreadPool() { - return EXECUTOR; - } - - - // private static final Logger LOG = LoggerFactory.getLogger(PGZIPOutputStream.class); - private static final int GZIP_MAGIC = 0x8b1f; - - // todo: remove after block guessing is implemented - // array list that contains the block sizes - ArrayList blockSizes = new ArrayList<>(); - - private int level = Deflater.DEFAULT_COMPRESSION; - private int strategy = Deflater.DEFAULT_STRATEGY; - - @Nonnull - protected Deflater newDeflater() { - Deflater def = new Deflater(level, true); - def.setStrategy(strategy); - return def; - } - - public void setStrategy(int strategy) { - this.strategy = strategy; - } - - public void setLevel(int level) { - this.level = level; - } - - @Nonnull - protected static DeflaterOutputStream newDeflaterOutputStream(@Nonnull OutputStream out, @Nonnull Deflater deflater) { - return new DeflaterOutputStream(out, deflater, 512, true); - } - - // TODO: Share, daemonize. - private final ExecutorService executor; - private final int nthreads; - private final CRC32 crc = new CRC32(); - private final BlockingQueue> emitQueue; - private PGZIPBlock block = new PGZIPBlock(this/* 0 */); - /** - * Used as a sentinel for 'closed'. - */ - private int bytesWritten = 0; - - // Master thread only - public PGZIPOutputStream(@Nonnull OutputStream out, @Nonnull ExecutorService executor, @Nonnegative int nthreads) throws IOException { - super(out); - this.executor = executor; - this.nthreads = nthreads; - this.emitQueue = new ArrayBlockingQueue<>(nthreads); - writeHeader(); - } - - /** - * Creates a PGZIPOutputStream - * using {@link PGZIPOutputStream#getSharedThreadPool()}. - * - * @param out the eventual output stream for the compressed data. - * @throws IOException if it all goes wrong. - */ - public PGZIPOutputStream(@Nonnull OutputStream out, @Nonnegative int nthreads) throws IOException { - this(out, PGZIPOutputStream.getSharedThreadPool(), nthreads); - } - - /** - * Creates a PGZIPOutputStream - * using {@link PGZIPOutputStream#getSharedThreadPool()} - * and {@link Runtime#availableProcessors()}. - * - * @param out the eventual output stream for the compressed data. - * @throws IOException if it all goes wrong. - */ - public PGZIPOutputStream(@Nonnull OutputStream out) throws IOException { - this(out, Runtime.getRuntime().availableProcessors()); - } - - /* - * @see http://www.gzip.org/zlib/rfc-gzip.html#file-format - */ - private void writeHeader() throws IOException { - out.write(new byte[]{ - (byte) GZIP_MAGIC, // ID1: Magic number (little-endian short) - (byte) (GZIP_MAGIC >> 8), // ID2: Magic number (little-endian short) - Deflater.DEFLATED, // CM: Compression method - 0, // FLG: Flags (byte) - 0, 0, 0, 0, // MTIME: Modification time (int) - 0, // XFL: Extra flags - 3 // OS: Operating system (3 = Linux) - }); - } - - // Master thread only - @Override - public void write(int b) throws IOException { - byte[] single = new byte[1]; - single[0] = (byte) (b & 0xFF); - write(single); - } - - // Master thread only - @Override - public void write(@Nonnull byte[] b) throws IOException { - write(b, 0, b.length); - } - - // Master thread only - @Override - public void write(@Nonnull byte[] b, int off, int len) throws IOException { - crc.update(b, off, len); - bytesWritten += len; - while (len > 0) { - // assert block.in_length < block.in.length - int capacity = block.in.length - block.in_length; - if (len >= capacity) { - System.arraycopy(b, off, block.in, block.in_length, capacity); - block.in_length += capacity; // == block.in.length - off += capacity; - len -= capacity; - submit(); - } else { - System.arraycopy(b, off, block.in, block.in_length, len); - block.in_length += len; - // off += len; - // len = 0; - break; - } - } - } - - // Master thread only - private void submit() throws IOException { - emitUntil(nthreads - 1); - emitQueue.add(executor.submit(block)); - block = new PGZIPBlock(this/* block.index + 1 */); - } - - // Emit If Available - submit always - // Emit At Least one - submit when executor is full - // Emit All Remaining - flush(), close() - // Master thread only - private void tryEmit() throws IOException, InterruptedException, ExecutionException { - for (; ; ) { - Future future = emitQueue.peek(); - // LOG.info("Peeked future " + future); - if (future == null) { - return; - } - if (!future.isDone()) { - return; - } - // It's an ordered queue. This MUST be the same element as above. - emitQueue.remove(); - byte[] toWrite = future.get(); - blockSizes.add(toWrite.length); // todo: remove after block guessing is implemented - out.write(toWrite); - } - } - - // Master thread only - - /** - * Emits any opportunistically available blocks. Furthermore, emits blocks until the number of executing tasks is less than taskCountAllowed. - */ - private void emitUntil(@Nonnegative int taskCountAllowed) throws IOException { - try { - while (emitQueue.size() > taskCountAllowed) { - // LOG.info("Waiting for taskCount=" + emitQueue.size() + " -> " + taskCountAllowed); - Future future = emitQueue.remove(); // Valid because emitQueue.size() > 0 - byte[] toWrite = future.get(); // Blocks until this task is done. - blockSizes.add(toWrite.length); // todo: remove after block guessing is implemented - out.write(toWrite); - } - // We may have achieved more opportunistically available blocks - // while waiting for a block above. Let's emit them here. - tryEmit(); - } catch (ExecutionException e) { - throw new IOException(e); - } catch (InterruptedException e) { - throw new InterruptedIOException(); - } - } - - // Master thread only - @Override - public void flush() throws IOException { - // LOG.info("Flush: " + block); - if (block.in_length > 0) { - submit(); - } - emitUntil(0); - super.flush(); - } - - // Master thread only - @Override - public void close() throws IOException { - // LOG.info("Closing: bytesWritten=" + bytesWritten); - if (bytesWritten >= 0) { - flush(); - - newDeflaterOutputStream(out, newDeflater()).finish(); - - ByteBuffer buf = ByteBuffer.allocate(8); - buf.order(ByteOrder.LITTLE_ENDIAN); - // LOG.info("CRC is " + crc.getValue()); - buf.putInt((int) crc.getValue()); - buf.putInt(bytesWritten); - out.write(buf.array()); // allocate() guarantees a backing array. - // LOG.info("trailer is " + Arrays.toString(buf.array())); - - out.flush(); - out.close(); - - bytesWritten = Integer.MIN_VALUE; - // } else { - // LOG.warn("Already closed."); - } - } -} diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/PGZIPState.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/PGZIPState.java deleted file mode 100644 index eef34628d..000000000 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/PGZIPState.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.fastasyncworldedit.core.object.io; - -import java.io.ByteArrayOutputStream; -import java.util.zip.Deflater; -import java.util.zip.DeflaterOutputStream; - -public class PGZIPState { - protected final DeflaterOutputStream str; - protected final ByteArrayOutputStream buf; - protected final Deflater def; - - public PGZIPState(PGZIPOutputStream parent) { - this.def = parent.newDeflater(); - this.buf = new ByteArrayOutputStream(PGZIPBlock.SIZE); - this.str = parent.newDeflaterOutputStream(buf, def); - } - - -} diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/PGZIPThreadLocal.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/PGZIPThreadLocal.java deleted file mode 100644 index 20937cdb3..000000000 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/PGZIPThreadLocal.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.fastasyncworldedit.core.object.io; - -public class PGZIPThreadLocal extends ThreadLocal { - - private final PGZIPOutputStream parent; - - public PGZIPThreadLocal(PGZIPOutputStream parent) { - this.parent = parent; - } - - @Override - protected PGZIPState initialValue() { - return new PGZIPState(parent); - } -} diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/RandomAccessInputStream.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/RandomAccessInputStream.java deleted file mode 100644 index 8dd7586a4..000000000 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/RandomAccessInputStream.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.fastasyncworldedit.core.object.io; - -import java.io.IOException; -import java.io.InputStream; -import java.io.RandomAccessFile; - -public class RandomAccessInputStream extends InputStream { - private final RandomAccessFile raf; - - public RandomAccessInputStream(RandomAccessFile raf) { - this.raf = raf; - } - - @Override - public int read() throws IOException { - return raf.read(); - } - - @Override - public int read(byte[] b, int off, int len) throws IOException { - return raf.read(b, off, len); - } - - @Override - public int read(byte[] b) throws IOException { - return raf.read(b); - } - - @Override - public int available() throws IOException { - return (int) (raf.length() - raf.getFilePointer()); - } - - @Override - public void close() throws IOException { - raf.close(); - } -} diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/RandomFileOutputStream.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/RandomFileOutputStream.java deleted file mode 100644 index db7d24369..000000000 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/RandomFileOutputStream.java +++ /dev/null @@ -1,128 +0,0 @@ -package com.fastasyncworldedit.core.object.io; - -import java.io.File; -import java.io.FileDescriptor; -import java.io.IOException; -import java.io.OutputStream; -import java.io.RandomAccessFile; - -/** - * A positionable file output stream. - *

- * Threading Design : [x] Single Threaded [ ] Threadsafe [ ] Immutable [ ] Isolated - */ - -public class RandomFileOutputStream extends OutputStream { - -// ***************************************************************************** -// INSTANCE PROPERTIES -// ***************************************************************************** - - protected RandomAccessFile randomFile; // the random file to write to - protected boolean sync; // whether to synchronize every write - protected boolean closeParent; - -// ***************************************************************************** -// INSTANCE CONSTRUCTION/INITIALIZATION/FINALIZATION, OPEN/CLOSE -// ***************************************************************************** - - public RandomFileOutputStream(String fnm) throws IOException { - this(fnm, false); - } - - public RandomFileOutputStream(String fnm, boolean syn) throws IOException { - this(new File(fnm), syn); - } - - public RandomFileOutputStream(File fil) throws IOException { - this(fil, false); - } - - public RandomFileOutputStream(File fil, boolean syn) throws IOException { - super(); - - File par; // parent file - - fil = fil.getAbsoluteFile(); - if ((par = fil.getParentFile()) != null) { - par.mkdirs(); - } - randomFile = new RandomAccessFile(fil, "rw"); - sync = syn; - this.closeParent = true; - } - - public RandomFileOutputStream(RandomAccessFile randomFile, boolean syn, boolean closeParent) { - super(); - this.randomFile = randomFile; - sync = syn; - this.closeParent = closeParent; - } - -// ***************************************************************************** -// INSTANCE METHODS - OUTPUT STREAM IMPLEMENTATION -// ***************************************************************************** - - @Override - public void write(int val) throws IOException { - randomFile.write(val); - if (sync) { - randomFile.getFD().sync(); - } - } - - @Override - public void write(byte[] val) throws IOException { - randomFile.write(val); - if (sync) { - randomFile.getFD().sync(); - } - } - - @Override - public void write(byte[] val, int off, int len) throws IOException { - randomFile.write(val, off, len); - if (sync) { - randomFile.getFD().sync(); - } - } - - @Override - public void flush() throws IOException { - if (sync) { - randomFile.getFD().sync(); - } - } - - @Override - public void close() throws IOException { - if (closeParent) { - randomFile.close(); - } - } - -// ***************************************************************************** -// INSTANCE METHODS - RANDOM ACCESS EXTENSIONS -// ***************************************************************************** - - public long getFilePointer() throws IOException { - return randomFile.getFilePointer(); - } - - public void setFilePointer(long pos) throws IOException { - randomFile.seek(pos); - } - - public long getFileSize() throws IOException { - return randomFile.length(); - } - - public void setFileSize(long len) throws IOException { - randomFile.setLength(len); - } - - public FileDescriptor getFD() throws IOException { - return randomFile.getFD(); - } - -} // END PUBLIC CLASS diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/serialize/Serialize.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/serialize/Serialize.java deleted file mode 100644 index 23098f8d6..000000000 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/serialize/Serialize.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.fastasyncworldedit.core.object.io.serialize; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -@Retention(RetentionPolicy.RUNTIME) -@Target({ElementType.FIELD}) -public @interface Serialize { - -} diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/zstd/ZstdInputStream.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/zstd/ZstdInputStream.java deleted file mode 100644 index e3b06b6ab..000000000 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/zstd/ZstdInputStream.java +++ /dev/null @@ -1,183 +0,0 @@ -package com.fastasyncworldedit.core.object.io.zstd; - -import com.github.luben.zstd.Zstd; -import com.github.luben.zstd.util.Native; - -import java.io.FilterInputStream; -import java.io.IOException; -import java.io.InputStream; - -/** - * InputStream filter that decompresses the data provided - * by the underlying InputStream using Zstd compression. - * - *

- * It does not support mark/reset methods - *

- */ - -public class ZstdInputStream extends FilterInputStream { - - static { - Native.load(); - } - - // Opaque pointer to Zstd context object - private long stream; - private long dstPos = 0; - private long srcPos = 0; - private long srcSize = 0; - private byte[] src = null; - private static final int srcBuffSize = (int) recommendedDInSize(); - - private boolean isContinuous = false; - private boolean frameFinished = false; - private boolean isClosed = false; - - /* JNI methods */ - private static native long recommendedDInSize(); - - private static native long recommendedDOutSize(); - - private static native long createDStream(); - - private static native int freeDStream(long stream); - - private native int initDStream(long stream); - - private native int decompressStream(long stream, byte[] dst, int dst_size, byte[] src, int src_size); - - // The main constructor / legacy version dispatcher - public ZstdInputStream(InputStream inStream) throws IOException { - // FilterInputStream constructor - super(inStream); - - // allocate input buffer with max frame header size - src = new byte[srcBuffSize]; - stream = createDStream(); - int size = initDStream(stream); - if (Zstd.isError(size)) { - throw new IOException("Decompression error: " + Zstd.getErrorName(size)); - } - } - - /** - * Don't break on unfinished frames. - * - *

- * Use case: decompressing files that are not yet finished writing and compressing. - *

- */ - public ZstdInputStream setContinuous(boolean b) { - isContinuous = b; - return this; - } - - public boolean getContinuous() { - return this.isContinuous; - } - - public int read(byte[] dst, int offset, int len) throws IOException { - - if (isClosed) { - throw new IOException("Stream closed"); - } - - // guard against buffer overflows - if (offset < 0 || len > dst.length - offset) { - throw new IndexOutOfBoundsException( - "Requested length " + len + " from offset " + offset + " in buffer of size " - + dst.length); - } - int dstSize = offset + len; - dstPos = offset; - - while (dstPos < dstSize) { - if (srcSize - srcPos == 0) { - srcSize = in.read(src, 0, srcBuffSize); - srcPos = 0; - if (srcSize < 0) { - srcSize = 0; - if (frameFinished) { - return -1; - } else if (isContinuous) { - return (int) (dstPos - offset); - } else { - throw new IOException("Read error or truncated source"); - } - } - frameFinished = false; - } - - int size = decompressStream(stream, dst, dstSize, src, (int) srcSize); - - if (Zstd.isError(size)) { - throw new IOException("Decompression error: " + Zstd.getErrorName(size)); - } - - // we have completed a frame - if (size == 0) { - frameFinished = true; - // re-init the codec so it can start decoding next frame - size = initDStream(stream); - if (Zstd.isError(size)) { - throw new IOException("Decompression error: " + Zstd.getErrorName(size)); - } - return (int) (dstPos - offset); - } - } - return len; - } - - public int read() throws IOException { - byte[] oneByte = new byte[1]; - int result = read(oneByte, 0, 1); - if (result > 0) { - return oneByte[0] & 0xff; - } else { - return result; - } - } - - public int available() throws IOException { - if (isClosed) { - throw new IOException("Stream closed"); - } - if (srcSize - srcPos > 0) { - return 1; - } else { - return 0; - } - } - - /* we don't support mark/reset */ - public boolean markSupported() { - return false; - } - - /* we can skip forward */ - public long skip(long toSkip) throws IOException { - if (isClosed) { - throw new IOException("Stream closed"); - } - long skipped = 0; - int dstSize = (int) recommendedDOutSize(); - byte[] dst = new byte[dstSize]; - while (toSkip > dstSize) { - long size = read(dst, 0, dstSize); - toSkip -= size; - skipped += size; - } - skipped += read(dst, 0, (int) toSkip); - return skipped; - } - - public void close() throws IOException { - if (isClosed) { - return; - } - freeDStream(stream); - in.close(); - isClosed = true; - } -} diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/Filter.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/Filter.java similarity index 92% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/Filter.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/Filter.java index f09d512ca..b004b0dbb 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/Filter.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/Filter.java @@ -1,6 +1,6 @@ -package com.fastasyncworldedit.core.beta; +package com.fastasyncworldedit.core.queue; -import com.fastasyncworldedit.core.beta.implementation.filter.block.FilterBlock; +import com.fastasyncworldedit.core.extent.filter.block.FilterBlock; import com.sk89q.worldedit.regions.Region; import org.jetbrains.annotations.Range; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/FilterBlockMask.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/FilterBlockMask.java new file mode 100644 index 000000000..e368772b1 --- /dev/null +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/FilterBlockMask.java @@ -0,0 +1,8 @@ +package com.fastasyncworldedit.core.queue; + +import com.fastasyncworldedit.core.extent.filter.block.FilterBlock; + +public interface FilterBlockMask { + + boolean applyBlock(FilterBlock block); +} diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/IBatchProcessor.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/IBatchProcessor.java similarity index 93% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/IBatchProcessor.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/IBatchProcessor.java index 2c594aa53..47f49bc15 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/IBatchProcessor.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/IBatchProcessor.java @@ -1,9 +1,9 @@ -package com.fastasyncworldedit.core.beta; +package com.fastasyncworldedit.core.queue; import com.fastasyncworldedit.core.FaweCache; -import com.fastasyncworldedit.core.beta.implementation.processors.EmptyBatchProcessor; -import com.fastasyncworldedit.core.beta.implementation.processors.MultiBatchProcessor; -import com.fastasyncworldedit.core.beta.implementation.processors.ProcessorScope; +import com.fastasyncworldedit.core.extent.processor.EmptyBatchProcessor; +import com.fastasyncworldedit.core.extent.processor.MultiBatchProcessor; +import com.fastasyncworldedit.core.extent.processor.ProcessorScope; import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.math.BlockVector3; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/IBlocks.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/IBlocks.java similarity index 95% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/IBlocks.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/IBlocks.java index c7b4cab42..c4be33f94 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/IBlocks.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/IBlocks.java @@ -1,14 +1,14 @@ -package com.fastasyncworldedit.core.beta; +package com.fastasyncworldedit.core.queue; import com.fastasyncworldedit.core.FaweCache; -import com.fastasyncworldedit.core.object.FaweOutputStream; -import com.fastasyncworldedit.core.object.io.FastByteArrayOutputStream; +import com.fastasyncworldedit.core.internal.io.FaweOutputStream; +import com.fastasyncworldedit.core.internal.io.FastByteArrayOutputStream; import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.extension.platform.Capability; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.world.biome.BiomeType; -import com.sk89q.worldedit.world.block.BlockID; +import com.fastasyncworldedit.core.world.block.BlockID; import com.sk89q.worldedit.world.block.BlockState; import com.sk89q.worldedit.world.registry.BlockRegistry; import org.jetbrains.annotations.Range; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/IChunk.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/IChunk.java similarity index 92% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/IChunk.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/IChunk.java index 68327fe8d..b3cf77d28 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/IChunk.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/IChunk.java @@ -1,6 +1,6 @@ -package com.fastasyncworldedit.core.beta; +package com.fastasyncworldedit.core.queue; -import com.fastasyncworldedit.core.beta.implementation.filter.block.ChunkFilterBlock; +import com.fastasyncworldedit.core.extent.filter.block.ChunkFilterBlock; import com.sk89q.worldedit.regions.Region; import org.jetbrains.annotations.Range; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/IChunkCache.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/IChunkCache.java similarity index 91% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/IChunkCache.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/IChunkCache.java index 853b38a99..0deaf065e 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/IChunkCache.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/IChunkCache.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.beta; +package com.fastasyncworldedit.core.queue; import org.jetbrains.annotations.Range; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/IChunkExtent.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/IChunkExtent.java similarity index 96% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/IChunkExtent.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/IChunkExtent.java index cb59f2687..6e6b8afb0 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/IChunkExtent.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/IChunkExtent.java @@ -1,6 +1,6 @@ -package com.fastasyncworldedit.core.beta.implementation; +package com.fastasyncworldedit.core.queue; -import com.fastasyncworldedit.core.beta.IChunk; +import com.fastasyncworldedit.core.queue.IChunk; import com.sk89q.jnbt.CompoundTag; import com.sk89q.jnbt.DoubleTag; import com.sk89q.jnbt.IntArrayTag; @@ -102,9 +102,9 @@ public interface IChunkExtent extends Extent { } @Override - default int getEmmittedLight(int x, int y, int z) { + default int getEmittedLight(int x, int y, int z) { final IChunk chunk = getOrCreateChunk(x >> 4, z >> 4); - return chunk.getEmmittedLight(x & 15, y, z & 15); + return chunk.getEmittedLight(x & 15, y, z & 15); } @Override diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/IChunkGet.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/IChunkGet.java similarity index 89% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/IChunkGet.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/IChunkGet.java index 7bab053a5..5e63f0e66 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/IChunkGet.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/IChunkGet.java @@ -1,6 +1,6 @@ -package com.fastasyncworldedit.core.beta; +package com.fastasyncworldedit.core.queue; -import com.fastasyncworldedit.core.beta.implementation.lighting.HeightMapType; +import com.fastasyncworldedit.core.extent.processor.heightmap.HeightMapType; import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.extent.InputExtent; import com.sk89q.worldedit.math.BlockVector3; @@ -35,7 +35,7 @@ public interface IChunkGet extends IBlocks, Trimable, InputExtent, ITileInput { int getSkyLight(int x, int y, int z); @Override - int getEmmittedLight(int x, int y, int z); + int getEmittedLight(int x, int y, int z); @Override int[] getHeightMap(HeightMapType type); diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/IChunkSet.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/IChunkSet.java similarity index 95% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/IChunkSet.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/IChunkSet.java index 9f3daa079..486402167 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/IChunkSet.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/IChunkSet.java @@ -1,6 +1,6 @@ -package com.fastasyncworldedit.core.beta; +package com.fastasyncworldedit.core.queue; -import com.fastasyncworldedit.core.beta.implementation.lighting.HeightMapType; +import com.fastasyncworldedit.core.extent.processor.heightmap.HeightMapType; import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.extent.OutputExtent; import com.sk89q.worldedit.function.operation.Operation; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/IDelegateFilter.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/IDelegateFilter.java similarity index 90% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/IDelegateFilter.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/IDelegateFilter.java index 5cc29e1cc..378c9eae8 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/IDelegateFilter.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/IDelegateFilter.java @@ -1,6 +1,6 @@ -package com.fastasyncworldedit.core.beta; +package com.fastasyncworldedit.core.queue; -import com.fastasyncworldedit.core.beta.implementation.filter.block.FilterBlock; +import com.fastasyncworldedit.core.extent.filter.block.FilterBlock; import com.sk89q.worldedit.regions.Region; import javax.annotation.Nullable; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/IQueueChunk.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/IQueueChunk.java similarity index 95% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/IQueueChunk.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/IQueueChunk.java index 69530c3ff..d1cec6d25 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/IQueueChunk.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/IQueueChunk.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.beta; +package com.fastasyncworldedit.core.queue; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/IQueueExtent.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/IQueueExtent.java similarity index 94% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/IQueueExtent.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/IQueueExtent.java index cc6d5b75d..9f13a97a6 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/IQueueExtent.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/IQueueExtent.java @@ -1,8 +1,7 @@ -package com.fastasyncworldedit.core.beta; +package com.fastasyncworldedit.core.queue; -import com.fastasyncworldedit.core.beta.implementation.IChunkExtent; -import com.fastasyncworldedit.core.beta.implementation.filter.block.ChunkFilterBlock; -import com.fastasyncworldedit.core.beta.implementation.processors.IBatchProcessorHolder; +import com.fastasyncworldedit.core.extent.filter.block.ChunkFilterBlock; +import com.fastasyncworldedit.core.extent.processor.IBatchProcessorHolder; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.function.operation.Operation; import com.sk89q.worldedit.math.BlockVector2; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/IQueueWrapper.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/IQueueWrapper.java similarity index 77% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/IQueueWrapper.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/IQueueWrapper.java index c3c5b3afa..4c378d1c9 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/IQueueWrapper.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/IQueueWrapper.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.beta; +package com.fastasyncworldedit.core.queue; public interface IQueueWrapper { default IQueueExtent wrapQueue(IQueueExtent queue) { diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/ITileInput.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/ITileInput.java similarity index 72% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/ITileInput.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/ITileInput.java index 072f3b26c..f0f176cd0 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/ITileInput.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/ITileInput.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.beta; +package com.fastasyncworldedit.core.queue; import com.sk89q.jnbt.CompoundTag; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/queue/Pool.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/Pool.java similarity index 71% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/queue/Pool.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/Pool.java index 54ac41e1b..d51065607 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/queue/Pool.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/Pool.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.beta.implementation.queue; +package com.fastasyncworldedit.core.queue; @FunctionalInterface public interface Pool { diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/Trimable.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/Trimable.java similarity index 92% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/Trimable.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/Trimable.java index 3ec305325..c29206c8c 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/Trimable.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/Trimable.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.beta; +package com.fastasyncworldedit.core.queue; /** * Interface for objects that can be trimmed (memory related). Trimming will reduce its memory diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/Flood.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/Flood.java similarity index 96% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/Flood.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/Flood.java index 1665c310b..3d84dfa32 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/Flood.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/Flood.java @@ -1,7 +1,9 @@ -package com.fastasyncworldedit.core.beta; +package com.fastasyncworldedit.core.queue.implementation; import com.fastasyncworldedit.core.Fawe; -import com.fastasyncworldedit.core.beta.implementation.queue.QueueHandler; +import com.fastasyncworldedit.core.queue.IQueueChunk; +import com.fastasyncworldedit.core.queue.IQueueExtent; +import com.fastasyncworldedit.core.queue.implementation.QueueHandler; import com.fastasyncworldedit.core.util.MathMan; import com.sk89q.worldedit.util.Direction; import com.sk89q.worldedit.world.World; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/queue/ParallelQueueExtent.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/ParallelQueueExtent.java similarity index 91% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/queue/ParallelQueueExtent.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/ParallelQueueExtent.java index eacb72f81..49bc8279b 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/queue/ParallelQueueExtent.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/ParallelQueueExtent.java @@ -1,23 +1,23 @@ -package com.fastasyncworldedit.core.beta.implementation.queue; +package com.fastasyncworldedit.core.queue.implementation; import com.fastasyncworldedit.core.FaweCache; -import com.fastasyncworldedit.core.beta.Filter; -import com.fastasyncworldedit.core.beta.IQueueChunk; -import com.fastasyncworldedit.core.beta.IQueueExtent; -import com.fastasyncworldedit.core.beta.IQueueWrapper; -import com.fastasyncworldedit.core.beta.implementation.filter.CountFilter; -import com.fastasyncworldedit.core.beta.implementation.filter.DistrFilter; -import com.fastasyncworldedit.core.beta.implementation.filter.LinkedFilter; -import com.fastasyncworldedit.core.beta.implementation.filter.block.ChunkFilterBlock; -import com.fastasyncworldedit.core.beta.implementation.processors.BatchProcessorHolder; +import com.fastasyncworldedit.core.queue.Filter; +import com.fastasyncworldedit.core.queue.IQueueChunk; +import com.fastasyncworldedit.core.queue.IQueueExtent; +import com.fastasyncworldedit.core.queue.IQueueWrapper; +import com.fastasyncworldedit.core.extent.filter.CountFilter; +import com.fastasyncworldedit.core.extent.filter.DistrFilter; +import com.fastasyncworldedit.core.extent.filter.LinkedFilter; +import com.fastasyncworldedit.core.extent.filter.block.ChunkFilterBlock; +import com.fastasyncworldedit.core.extent.processor.BatchProcessorHolder; import com.fastasyncworldedit.core.configuration.Settings; -import com.fastasyncworldedit.core.object.clipboard.WorldCopyClipboard; -import com.fastasyncworldedit.core.object.extent.NullExtent; +import com.fastasyncworldedit.core.extent.clipboard.WorldCopyClipboard; +import com.fastasyncworldedit.core.extent.NullExtent; import com.sk89q.worldedit.MaxChangedBlocksException; -import com.sk89q.worldedit.extent.PassthroughExtent; +import com.fastasyncworldedit.core.extent.PassthroughExtent; import com.sk89q.worldedit.extent.clipboard.Clipboard; import com.sk89q.worldedit.function.mask.BlockMask; -import com.sk89q.worldedit.function.mask.BlockMaskBuilder; +import com.fastasyncworldedit.core.function.mask.BlockMaskBuilder; import com.sk89q.worldedit.function.mask.ExistingBlockMask; import com.sk89q.worldedit.function.mask.Mask; import com.sk89q.worldedit.function.pattern.BlockPattern; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/queue/QueueHandler.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/QueueHandler.java similarity index 92% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/queue/QueueHandler.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/QueueHandler.java index 883c192f4..a78fff960 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/queue/QueueHandler.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/QueueHandler.java @@ -1,17 +1,17 @@ -package com.fastasyncworldedit.core.beta.implementation.queue; +package com.fastasyncworldedit.core.queue.implementation; import com.fastasyncworldedit.core.Fawe; import com.fastasyncworldedit.core.FaweCache; -import com.fastasyncworldedit.core.beta.IBatchProcessor; -import com.fastasyncworldedit.core.beta.IChunkCache; -import com.fastasyncworldedit.core.beta.IChunkGet; -import com.fastasyncworldedit.core.beta.IChunkSet; -import com.fastasyncworldedit.core.beta.IQueueChunk; -import com.fastasyncworldedit.core.beta.IQueueExtent; -import com.fastasyncworldedit.core.beta.Trimable; -import com.fastasyncworldedit.core.beta.implementation.chunk.ChunkCache; +import com.fastasyncworldedit.core.queue.IBatchProcessor; +import com.fastasyncworldedit.core.queue.IChunkCache; +import com.fastasyncworldedit.core.queue.IChunkGet; +import com.fastasyncworldedit.core.queue.IChunkSet; +import com.fastasyncworldedit.core.queue.IQueueChunk; +import com.fastasyncworldedit.core.queue.IQueueExtent; +import com.fastasyncworldedit.core.queue.Trimable; +import com.fastasyncworldedit.core.queue.implementation.chunk.ChunkCache; import com.fastasyncworldedit.core.configuration.Settings; -import com.fastasyncworldedit.core.object.collection.CleanableThreadLocal; +import com.fastasyncworldedit.core.util.collection.CleanableThreadLocal; import com.fastasyncworldedit.core.util.MemUtil; import com.fastasyncworldedit.core.util.TaskManager; import com.fastasyncworldedit.core.wrappers.WorldWrapper; @@ -39,9 +39,9 @@ import java.util.function.Supplier; @SuppressWarnings("UnstableApiUsage") public abstract class QueueHandler implements Trimable, Runnable { - private ForkJoinPool forkJoinPoolPrimary = new ForkJoinPool(); - private ForkJoinPool forkJoinPoolSecondary = new ForkJoinPool(); - private ThreadPoolExecutor blockingExecutor = FaweCache.IMP.newBlockingExecutor(); + private final ForkJoinPool forkJoinPoolPrimary = new ForkJoinPool(); + private final ForkJoinPool forkJoinPoolSecondary = new ForkJoinPool(); + private final ThreadPoolExecutor blockingExecutor = FaweCache.IMP.newBlockingExecutor(); private final ConcurrentLinkedQueue syncTasks = new ConcurrentLinkedQueue<>(); private final ConcurrentLinkedQueue syncWhenFree = new ConcurrentLinkedQueue<>(); diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/queue/QueuePool.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/QueuePool.java similarity index 84% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/queue/QueuePool.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/QueuePool.java index dc8a8e137..58b522d84 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/queue/QueuePool.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/QueuePool.java @@ -1,4 +1,6 @@ -package com.fastasyncworldedit.core.beta.implementation.queue; +package com.fastasyncworldedit.core.queue.implementation; + +import com.fastasyncworldedit.core.queue.Pool; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.function.Supplier; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/queue/SingleThreadQueueExtent.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/SingleThreadQueueExtent.java similarity index 92% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/queue/SingleThreadQueueExtent.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/SingleThreadQueueExtent.java index e29804433..ae4cff434 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/queue/SingleThreadQueueExtent.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/SingleThreadQueueExtent.java @@ -1,22 +1,22 @@ -package com.fastasyncworldedit.core.beta.implementation.queue; +package com.fastasyncworldedit.core.queue.implementation; import com.fastasyncworldedit.core.Fawe; -import com.fastasyncworldedit.core.beta.IChunk; -import com.fastasyncworldedit.core.beta.IChunkCache; -import com.fastasyncworldedit.core.beta.IChunkGet; -import com.fastasyncworldedit.core.beta.IChunkSet; -import com.fastasyncworldedit.core.beta.IQueueChunk; -import com.fastasyncworldedit.core.beta.IQueueExtent; -import com.fastasyncworldedit.core.beta.implementation.blocks.CharSetBlocks; -import com.fastasyncworldedit.core.beta.implementation.chunk.ChunkHolder; -import com.fastasyncworldedit.core.beta.implementation.chunk.NullChunk; -import com.fastasyncworldedit.core.beta.implementation.filter.block.CharFilterBlock; -import com.fastasyncworldedit.core.beta.implementation.filter.block.ChunkFilterBlock; -import com.fastasyncworldedit.core.beta.implementation.processors.EmptyBatchProcessor; -import com.fastasyncworldedit.core.beta.implementation.processors.ExtentBatchProcessorHolder; -import com.fastasyncworldedit.core.beta.implementation.processors.ProcessorScope; +import com.fastasyncworldedit.core.queue.IChunk; +import com.fastasyncworldedit.core.queue.IChunkCache; +import com.fastasyncworldedit.core.queue.IChunkGet; +import com.fastasyncworldedit.core.queue.IChunkSet; +import com.fastasyncworldedit.core.queue.IQueueChunk; +import com.fastasyncworldedit.core.queue.IQueueExtent; +import com.fastasyncworldedit.core.queue.implementation.blocks.CharSetBlocks; +import com.fastasyncworldedit.core.queue.implementation.chunk.ChunkHolder; +import com.fastasyncworldedit.core.queue.implementation.chunk.NullChunk; +import com.fastasyncworldedit.core.extent.filter.block.CharFilterBlock; +import com.fastasyncworldedit.core.extent.filter.block.ChunkFilterBlock; +import com.fastasyncworldedit.core.extent.processor.EmptyBatchProcessor; +import com.fastasyncworldedit.core.extent.processor.ExtentBatchProcessorHolder; +import com.fastasyncworldedit.core.extent.processor.ProcessorScope; import com.fastasyncworldedit.core.configuration.Settings; -import com.fastasyncworldedit.core.object.exception.FaweException; +import com.fastasyncworldedit.core.internal.exception.FaweException; import com.fastasyncworldedit.core.util.MathMan; import com.fastasyncworldedit.core.util.MemUtil; import com.google.common.util.concurrent.Futures; @@ -50,7 +50,7 @@ public class SingleThreadQueueExtent extends ExtentBatchProcessorHolder implemen private boolean initialized; private Thread currentThread; - private ConcurrentLinkedQueue submissions = new ConcurrentLinkedQueue<>(); + private final ConcurrentLinkedQueue submissions = new ConcurrentLinkedQueue<>(); // Last access pointers private IQueueChunk lastChunk; private long lastPair = Long.MAX_VALUE; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/blocks/BitSetBlocks.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/blocks/BitSetBlocks.java similarity index 95% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/blocks/BitSetBlocks.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/blocks/BitSetBlocks.java index 3fe78b462..cde827222 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/blocks/BitSetBlocks.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/blocks/BitSetBlocks.java @@ -1,9 +1,9 @@ -package com.fastasyncworldedit.core.beta.implementation.blocks; +package com.fastasyncworldedit.core.queue.implementation.blocks; import com.fastasyncworldedit.core.FaweCache; -import com.fastasyncworldedit.core.beta.IChunkSet; -import com.fastasyncworldedit.core.beta.implementation.lighting.HeightMapType; -import com.fastasyncworldedit.core.object.collection.MemBlockSet; +import com.fastasyncworldedit.core.queue.IChunkSet; +import com.fastasyncworldedit.core.extent.processor.heightmap.HeightMapType; +import com.fastasyncworldedit.core.util.collection.MemBlockSet; import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.world.biome.BiomeType; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/blocks/CharBlocks.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/blocks/CharBlocks.java similarity index 97% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/blocks/CharBlocks.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/blocks/CharBlocks.java index 8793a6e89..45adbe2d8 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/blocks/CharBlocks.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/blocks/CharBlocks.java @@ -1,8 +1,8 @@ -package com.fastasyncworldedit.core.beta.implementation.blocks; +package com.fastasyncworldedit.core.queue.implementation.blocks; import com.fastasyncworldedit.core.Fawe; -import com.fastasyncworldedit.core.beta.IBlocks; -import com.fastasyncworldedit.core.beta.IChunkSet; +import com.fastasyncworldedit.core.queue.IBlocks; +import com.fastasyncworldedit.core.queue.IChunkSet; import com.sk89q.worldedit.internal.util.LogManagerCompat; import com.sk89q.worldedit.world.block.BlockState; import com.sk89q.worldedit.world.block.BlockTypesCache; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/blocks/CharGetBlocks.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/blocks/CharGetBlocks.java similarity index 87% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/blocks/CharGetBlocks.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/blocks/CharGetBlocks.java index 6647e6f3c..10fb2039a 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/blocks/CharGetBlocks.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/blocks/CharGetBlocks.java @@ -1,7 +1,7 @@ -package com.fastasyncworldedit.core.beta.implementation.blocks; +package com.fastasyncworldedit.core.queue.implementation.blocks; -import com.fastasyncworldedit.core.beta.IChunkGet; -import com.fastasyncworldedit.core.beta.IChunkSet; +import com.fastasyncworldedit.core.queue.IChunkGet; +import com.fastasyncworldedit.core.queue.IChunkSet; import com.sk89q.worldedit.world.block.BaseBlock; import com.sk89q.worldedit.world.block.BlockState; import com.sk89q.worldedit.world.block.BlockTypesCache; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/blocks/CharSetBlocks.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/blocks/CharSetBlocks.java similarity index 95% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/blocks/CharSetBlocks.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/blocks/CharSetBlocks.java index ed2d29776..00fa1c3f7 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/blocks/CharSetBlocks.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/blocks/CharSetBlocks.java @@ -1,11 +1,11 @@ -package com.fastasyncworldedit.core.beta.implementation.blocks; +package com.fastasyncworldedit.core.queue.implementation.blocks; import com.fastasyncworldedit.core.FaweCache; -import com.fastasyncworldedit.core.beta.IChunkSet; -import com.fastasyncworldedit.core.beta.implementation.lighting.HeightMapType; -import com.fastasyncworldedit.core.beta.implementation.queue.Pool; +import com.fastasyncworldedit.core.queue.IChunkSet; +import com.fastasyncworldedit.core.extent.processor.heightmap.HeightMapType; +import com.fastasyncworldedit.core.queue.Pool; import com.fastasyncworldedit.core.configuration.Settings; -import com.fastasyncworldedit.core.object.collection.BlockVector3ChunkMap; +import com.fastasyncworldedit.core.math.BlockVector3ChunkMap; import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.math.BlockVector3; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/blocks/NullChunkGet.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/blocks/NullChunkGet.java similarity index 88% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/blocks/NullChunkGet.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/blocks/NullChunkGet.java index 887cc0b50..f140c973e 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/blocks/NullChunkGet.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/blocks/NullChunkGet.java @@ -1,10 +1,10 @@ -package com.fastasyncworldedit.core.beta.implementation.blocks; +package com.fastasyncworldedit.core.queue.implementation.blocks; import com.fastasyncworldedit.core.FaweCache; -import com.fastasyncworldedit.core.beta.IBlocks; -import com.fastasyncworldedit.core.beta.IChunkGet; -import com.fastasyncworldedit.core.beta.IChunkSet; -import com.fastasyncworldedit.core.beta.implementation.lighting.HeightMapType; +import com.fastasyncworldedit.core.queue.IBlocks; +import com.fastasyncworldedit.core.queue.IChunkGet; +import com.fastasyncworldedit.core.queue.IChunkSet; +import com.fastasyncworldedit.core.extent.processor.heightmap.HeightMapType; import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.world.biome.BiomeType; @@ -103,7 +103,7 @@ public final class NullChunkGet implements IChunkGet { return false; } - public int getEmmittedLight(int x, int y, int z) { + public int getEmittedLight(int x, int y, int z) { return 15; } diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/chunk/ChunkCache.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/chunk/ChunkCache.java similarity index 92% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/chunk/ChunkCache.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/chunk/ChunkCache.java index 77278e482..7ab7d7a7f 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/chunk/ChunkCache.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/chunk/ChunkCache.java @@ -1,7 +1,7 @@ -package com.fastasyncworldedit.core.beta.implementation.chunk; +package com.fastasyncworldedit.core.queue.implementation.chunk; -import com.fastasyncworldedit.core.beta.IChunkCache; -import com.fastasyncworldedit.core.beta.Trimable; +import com.fastasyncworldedit.core.queue.IChunkCache; +import com.fastasyncworldedit.core.queue.Trimable; import com.fastasyncworldedit.core.util.MathMan; import it.unimi.dsi.fastutil.longs.Long2ObjectLinkedOpenHashMap; import it.unimi.dsi.fastutil.longs.Long2ObjectMap; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/chunk/ChunkHolder.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/chunk/ChunkHolder.java similarity index 95% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/chunk/ChunkHolder.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/chunk/ChunkHolder.java index f1d231266..cd88e40db 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/chunk/ChunkHolder.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/chunk/ChunkHolder.java @@ -1,16 +1,16 @@ -package com.fastasyncworldedit.core.beta.implementation.chunk; +package com.fastasyncworldedit.core.queue.implementation.chunk; import com.fastasyncworldedit.core.FaweCache; -import com.fastasyncworldedit.core.beta.Filter; -import com.fastasyncworldedit.core.beta.IChunk; -import com.fastasyncworldedit.core.beta.IChunkGet; -import com.fastasyncworldedit.core.beta.IChunkSet; -import com.fastasyncworldedit.core.beta.IQueueChunk; -import com.fastasyncworldedit.core.beta.IQueueExtent; -import com.fastasyncworldedit.core.beta.implementation.filter.block.ChunkFilterBlock; -import com.fastasyncworldedit.core.beta.implementation.lighting.HeightMapType; -import com.fastasyncworldedit.core.beta.implementation.processors.EmptyBatchProcessor; -import com.fastasyncworldedit.core.beta.implementation.queue.Pool; +import com.fastasyncworldedit.core.queue.Filter; +import com.fastasyncworldedit.core.queue.IChunk; +import com.fastasyncworldedit.core.queue.IChunkGet; +import com.fastasyncworldedit.core.queue.IChunkSet; +import com.fastasyncworldedit.core.queue.IQueueChunk; +import com.fastasyncworldedit.core.queue.IQueueExtent; +import com.fastasyncworldedit.core.extent.filter.block.ChunkFilterBlock; +import com.fastasyncworldedit.core.extent.processor.heightmap.HeightMapType; +import com.fastasyncworldedit.core.extent.processor.EmptyBatchProcessor; +import com.fastasyncworldedit.core.queue.Pool; import com.fastasyncworldedit.core.configuration.Settings; import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.math.BlockVector3; @@ -262,7 +262,7 @@ public class ChunkHolder> implements IQueueChunk { } @Override - public int getEmmittedLight(ChunkHolder chunk, int x, int y, int z) { + public int getEmittedLight(ChunkHolder chunk, int x, int y, int z) { if (chunk.chunkSet.getLight() != null) { int layer = y >> 4; if (chunk.chunkSet.getLight()[layer] != null) { @@ -272,7 +272,7 @@ public class ChunkHolder> implements IQueueChunk { } } } - return chunk.chunkExisting.getEmmittedLight(x, y, z); + return chunk.chunkExisting.getEmittedLight(x, y, z); } @Override @@ -410,8 +410,8 @@ public class ChunkHolder> implements IQueueChunk { } @Override - public int getEmmittedLight(ChunkHolder chunk, int x, int y, int z) { - return chunk.chunkExisting.getEmmittedLight(x, y, z); + public int getEmittedLight(ChunkHolder chunk, int x, int y, int z) { + return chunk.chunkExisting.getEmittedLight(x, y, z); } @Override @@ -553,7 +553,7 @@ public class ChunkHolder> implements IQueueChunk { } @Override - public int getEmmittedLight(ChunkHolder chunk, int x, int y, int z) { + public int getEmittedLight(ChunkHolder chunk, int x, int y, int z) { if (chunk.chunkSet.getLight() != null) { int layer = y >> 4; if (chunk.chunkSet.getLight()[layer] != null) { @@ -566,7 +566,7 @@ public class ChunkHolder> implements IQueueChunk { chunk.getOrCreateGet(); chunk.delegate = BOTH; chunk.chunkExisting.trim(false); - return chunk.getEmmittedLight(x, y, z); + return chunk.getEmittedLight(x, y, z); } @Override @@ -739,11 +739,11 @@ public class ChunkHolder> implements IQueueChunk { } @Override - public int getEmmittedLight(ChunkHolder chunk, int x, int y, int z) { + public int getEmittedLight(ChunkHolder chunk, int x, int y, int z) { chunk.getOrCreateGet(); chunk.delegate = GET; chunk.chunkExisting.trim(false); - return chunk.getEmmittedLight(x, y, z); + return chunk.getEmittedLight(x, y, z); } @Override @@ -1024,8 +1024,8 @@ public class ChunkHolder> implements IQueueChunk { } @Override - public int getEmmittedLight(int x, int y, int z) { - return delegate.getEmmittedLight(this, x, y, z); + public int getEmittedLight(int x, int y, int z) { + return delegate.getEmittedLight(this, x, y, z); } @Override @@ -1073,7 +1073,7 @@ public class ChunkHolder> implements IQueueChunk { int getSkyLight(ChunkHolder chunk, int x, int y, int z); - int getEmmittedLight(ChunkHolder chunk, int x, int y, int z); + int getEmittedLight(ChunkHolder chunk, int x, int y, int z); int getBrightness(ChunkHolder chunk, int x, int y, int z); diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/chunk/NullChunk.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/chunk/NullChunk.java similarity index 91% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/chunk/NullChunk.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/chunk/NullChunk.java index 0b33ed4bc..f340c7e3b 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/chunk/NullChunk.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/chunk/NullChunk.java @@ -1,10 +1,10 @@ -package com.fastasyncworldedit.core.beta.implementation.chunk; +package com.fastasyncworldedit.core.queue.implementation.chunk; -import com.fastasyncworldedit.core.beta.Filter; -import com.fastasyncworldedit.core.beta.IChunkSet; -import com.fastasyncworldedit.core.beta.IQueueChunk; -import com.fastasyncworldedit.core.beta.implementation.filter.block.ChunkFilterBlock; -import com.fastasyncworldedit.core.beta.implementation.lighting.HeightMapType; +import com.fastasyncworldedit.core.queue.Filter; +import com.fastasyncworldedit.core.queue.IChunkSet; +import com.fastasyncworldedit.core.queue.IQueueChunk; +import com.fastasyncworldedit.core.extent.filter.block.ChunkFilterBlock; +import com.fastasyncworldedit.core.extent.processor.heightmap.HeightMapType; import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.regions.Region; @@ -86,7 +86,7 @@ public final class NullChunk implements IQueueChunk { return new int[256]; } - public int getEmmittedLight(int x, int y, int z) { + public int getEmittedLight(int x, int y, int z) { return 15; } diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/packet/ChunkPacket.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/packet/ChunkPacket.java similarity index 91% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/packet/ChunkPacket.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/packet/ChunkPacket.java index a93c43d6b..240209771 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/packet/ChunkPacket.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/packet/ChunkPacket.java @@ -1,10 +1,10 @@ -package com.fastasyncworldedit.core.beta.implementation.packet; +package com.fastasyncworldedit.core.queue.implementation.packet; import com.fastasyncworldedit.core.Fawe; import com.fastasyncworldedit.core.FaweCache; -import com.fastasyncworldedit.core.beta.IBlocks; -import com.fastasyncworldedit.core.object.FaweOutputStream; -import com.fastasyncworldedit.core.object.io.FastByteArrayOutputStream; +import com.fastasyncworldedit.core.queue.IBlocks; +import com.fastasyncworldedit.core.internal.io.FaweOutputStream; +import com.fastasyncworldedit.core.internal.io.FastByteArrayOutputStream; import com.sk89q.jnbt.CompoundTag; import java.util.HashMap; @@ -91,9 +91,8 @@ public class ChunkPacket implements Function, Supplier { public CompoundTag getHeightMap() { HashMap map = new HashMap<>(); map.put("MOTION_BLOCKING", new long[36]); - CompoundTag tag = FaweCache.IMP.asTag(map); // TODO - return tag; + return FaweCache.IMP.asTag(map); } @Override diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/preloader/AsyncPreloader.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/preloader/AsyncPreloader.java similarity index 96% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/preloader/AsyncPreloader.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/preloader/AsyncPreloader.java index 24a1a4007..1aff92e46 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/preloader/AsyncPreloader.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/preloader/AsyncPreloader.java @@ -1,7 +1,7 @@ -package com.fastasyncworldedit.core.beta.implementation.preloader; +package com.fastasyncworldedit.core.queue.implementation.preloader; import com.fastasyncworldedit.core.Fawe; -import com.fastasyncworldedit.core.object.collection.MutablePair; +import com.fastasyncworldedit.core.util.collection.MutablePair; import com.fastasyncworldedit.core.util.FaweTimer; import com.sk89q.worldedit.IncompleteRegionException; import com.sk89q.worldedit.LocalSession; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/preloader/Preloader.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/preloader/Preloader.java similarity index 67% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/preloader/Preloader.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/preloader/Preloader.java index 7fbc4ab65..da6846c41 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/preloader/Preloader.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/preloader/Preloader.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.beta.implementation.preloader; +package com.fastasyncworldedit.core.queue.implementation.preloader; import com.sk89q.worldedit.entity.Player; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/regions/FaweMask.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/regions/FaweMask.java index 98d2b67db..23ef9399c 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/regions/FaweMask.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/regions/FaweMask.java @@ -1,8 +1,7 @@ package com.fastasyncworldedit.core.regions; -import com.fastasyncworldedit.core.beta.implementation.processors.ProcessorScope; +import com.fastasyncworldedit.core.extent.processor.ProcessorScope; import com.sk89q.worldedit.entity.Player; -import com.sk89q.worldedit.regions.IDelegateRegion; import com.sk89q.worldedit.regions.Region; public class FaweMask implements IDelegateRegion { diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/regions/FaweMaskManager.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/regions/FaweMaskManager.java index 64e0d3ed6..782dbe1ec 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/regions/FaweMaskManager.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/regions/FaweMaskManager.java @@ -1,7 +1,7 @@ package com.fastasyncworldedit.core.regions; import com.fastasyncworldedit.core.configuration.Settings; -import com.fastasyncworldedit.core.regions.general.RegionFilter; +import com.fastasyncworldedit.core.regions.filter.RegionFilter; import com.sk89q.worldedit.entity.Player; import java.util.Locale; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/regions/FuzzyRegion.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/regions/FuzzyRegion.java similarity index 96% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/regions/FuzzyRegion.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/regions/FuzzyRegion.java index 3f9b197ba..2120c12e6 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/regions/FuzzyRegion.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/regions/FuzzyRegion.java @@ -1,7 +1,7 @@ -package com.fastasyncworldedit.core.object.regions; +package com.fastasyncworldedit.core.regions; import com.fastasyncworldedit.core.configuration.Caption; -import com.fastasyncworldedit.core.object.collection.BlockVectorSet; +import com.fastasyncworldedit.core.math.BlockVectorSet; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.function.mask.Mask; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/regions/IDelegateRegion.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/regions/IDelegateRegion.java similarity index 94% rename from worldedit-core/src/main/java/com/sk89q/worldedit/regions/IDelegateRegion.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/regions/IDelegateRegion.java index 4f8e90ed1..d4a81ee97 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/regions/IDelegateRegion.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/regions/IDelegateRegion.java @@ -1,8 +1,10 @@ -package com.sk89q.worldedit.regions; +package com.fastasyncworldedit.core.regions; import com.sk89q.worldedit.math.BlockVector2; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.math.Vector3; +import com.sk89q.worldedit.regions.Region; +import com.sk89q.worldedit.regions.RegionOperationException; import com.sk89q.worldedit.world.World; import org.jetbrains.annotations.NotNull; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/regions/PolyhedralRegion.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/regions/PolyhedralRegion.java similarity index 91% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/regions/PolyhedralRegion.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/regions/PolyhedralRegion.java index feb270a18..56adf797a 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/regions/PolyhedralRegion.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/regions/PolyhedralRegion.java @@ -1,23 +1,4 @@ -/* - * WorldEdit, a Minecraft world manipulation toolkit - * Copyright (C) sk89q - * Copyright (C) WorldEdit team and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.fastasyncworldedit.core.object.regions; +package com.fastasyncworldedit.core.regions; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.math.Vector3; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/RegionWrapper.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/regions/RegionWrapper.java similarity index 99% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/RegionWrapper.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/regions/RegionWrapper.java index 5f17a8418..b3da7e73b 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/RegionWrapper.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/regions/RegionWrapper.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object; +package com.fastasyncworldedit.core.regions; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.regions.CuboidRegion; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/regions/Triangle.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/regions/Triangle.java similarity index 99% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/regions/Triangle.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/regions/Triangle.java index 49096b219..59f1fc8d8 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/regions/Triangle.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/regions/Triangle.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.regions; +package com.fastasyncworldedit.core.regions; import com.fastasyncworldedit.core.util.MathMan; import com.fastasyncworldedit.core.util.StringMan; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/regions/general/CuboidRegionFilter.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/regions/filter/CuboidRegionFilter.java similarity index 94% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/regions/general/CuboidRegionFilter.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/regions/filter/CuboidRegionFilter.java index c9d7d1443..2ad9b3c4c 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/regions/general/CuboidRegionFilter.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/regions/filter/CuboidRegionFilter.java @@ -1,6 +1,6 @@ -package com.fastasyncworldedit.core.regions.general; +package com.fastasyncworldedit.core.regions.filter; -import com.fastasyncworldedit.core.object.collection.LongHashSet; +import com.fastasyncworldedit.core.util.collection.LongHashSet; import com.sk89q.worldedit.math.BlockVector2; public abstract class CuboidRegionFilter implements RegionFilter { diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/regions/general/RegionFilter.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/regions/filter/RegionFilter.java similarity index 71% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/regions/general/RegionFilter.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/regions/filter/RegionFilter.java index f3a32ba88..86147eda6 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/regions/general/RegionFilter.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/regions/filter/RegionFilter.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.regions.general; +package com.fastasyncworldedit.core.regions.filter; public interface RegionFilter { diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/regions/selector/FuzzyRegionSelector.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/regions/selector/FuzzyRegionSelector.java similarity index 96% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/regions/selector/FuzzyRegionSelector.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/regions/selector/FuzzyRegionSelector.java index 5bd49be57..81f7e0f91 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/regions/selector/FuzzyRegionSelector.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/regions/selector/FuzzyRegionSelector.java @@ -1,7 +1,7 @@ -package com.fastasyncworldedit.core.object.regions.selector; +package com.fastasyncworldedit.core.regions.selector; import com.fastasyncworldedit.core.configuration.Caption; -import com.fastasyncworldedit.core.object.regions.FuzzyRegion; +import com.fastasyncworldedit.core.regions.FuzzyRegion; import com.fastasyncworldedit.core.util.EditSessionBuilder; import com.fastasyncworldedit.core.util.ExtentTraverser; import com.fastasyncworldedit.core.util.MaskTraverser; @@ -10,7 +10,7 @@ import com.sk89q.worldedit.IncompleteRegionException; import com.sk89q.worldedit.LocalSession; import com.sk89q.worldedit.entity.Player; import com.sk89q.worldedit.extension.platform.Actor; -import com.sk89q.worldedit.extent.PassthroughExtent; +import com.fastasyncworldedit.core.extent.PassthroughExtent; import com.sk89q.worldedit.function.mask.Mask; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.regions.Region; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/regions/selector/PolyhedralRegionSelector.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/regions/selector/PolyhedralRegionSelector.java similarity index 85% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/regions/selector/PolyhedralRegionSelector.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/regions/selector/PolyhedralRegionSelector.java index 6c3bd8b9c..d0ba0c0a6 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/regions/selector/PolyhedralRegionSelector.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/regions/selector/PolyhedralRegionSelector.java @@ -1,26 +1,7 @@ -/* - * WorldEdit, a Minecraft world manipulation toolkit - * Copyright (C) sk89q - * Copyright (C) WorldEdit team and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ +package com.fastasyncworldedit.core.regions.selector; -package com.fastasyncworldedit.core.object.regions.selector; - -import com.fastasyncworldedit.core.object.regions.PolyhedralRegion; -import com.fastasyncworldedit.core.object.regions.Triangle; +import com.fastasyncworldedit.core.regions.PolyhedralRegion; +import com.fastasyncworldedit.core.regions.Triangle; import com.sk89q.worldedit.IncompleteRegionException; import com.sk89q.worldedit.LocalSession; import com.sk89q.worldedit.extension.platform.Actor; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/registry/RegistryItem.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/registry/RegistryItem.java similarity index 68% rename from worldedit-core/src/main/java/com/sk89q/worldedit/registry/RegistryItem.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/registry/RegistryItem.java index 98b3251d7..9f56c1e10 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/registry/RegistryItem.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/registry/RegistryItem.java @@ -1,5 +1,4 @@ - -package com.sk89q.worldedit.registry; +package com.fastasyncworldedit.core.registry; public interface RegistryItem { void setInternalId(int internalId); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/registry/state/PropertyGroup.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/registry/state/PropertyGroup.java similarity index 97% rename from worldedit-core/src/main/java/com/sk89q/worldedit/registry/state/PropertyGroup.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/registry/state/PropertyGroup.java index 0105909cb..f4784fa06 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/registry/state/PropertyGroup.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/registry/state/PropertyGroup.java @@ -1,5 +1,6 @@ -package com.sk89q.worldedit.registry.state; +package com.fastasyncworldedit.core.registry.state; +import com.sk89q.worldedit.registry.state.Property; import com.sk89q.worldedit.world.block.BlockStateHolder; import com.sk89q.worldedit.world.block.BlockType; import com.sk89q.worldedit.world.block.BlockTypes; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/registry/state/PropertyKey.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/registry/state/PropertyKey.java similarity index 99% rename from worldedit-core/src/main/java/com/sk89q/worldedit/registry/state/PropertyKey.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/registry/state/PropertyKey.java index 4a25ddc8a..759559862 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/registry/state/PropertyKey.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/registry/state/PropertyKey.java @@ -1,4 +1,4 @@ -package com.sk89q.worldedit.registry.state; +package com.fastasyncworldedit.core.registry.state; import org.jetbrains.annotations.NotNull; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/registry/state/PropertyKeySet.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/registry/state/PropertyKeySet.java similarity index 99% rename from worldedit-core/src/main/java/com/sk89q/worldedit/registry/state/PropertyKeySet.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/registry/state/PropertyKeySet.java index 7787ec2aa..c936212c0 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/registry/state/PropertyKeySet.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/registry/state/PropertyKeySet.java @@ -1,4 +1,4 @@ -package com.sk89q.worldedit.registry.state; +package com.fastasyncworldedit.core.registry.state; import org.jetbrains.annotations.NotNull; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/BrushCache.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/BrushCache.java index 33537e40e..3aec24a73 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/BrushCache.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/BrushCache.java @@ -75,7 +75,7 @@ public final class BrushCache { return null; } - public static final BrushTool setTool(BaseItem item, BrushTool tool) { + public static BrushTool setTool(BaseItem item, BrushTool tool) { if (item.getNativeItem() == null) { return null; } diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/CachedMathMan.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/CachedMathMan.java index 3c0f41224..46ffe9914 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/CachedMathMan.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/CachedMathMan.java @@ -20,7 +20,7 @@ public class CachedMathMan { } } - private static float[] ANGLES = new float[65536]; + private static final float[] ANGLES = new float[65536]; static { for (int i = 0; i < 65536; ++i) { @@ -28,7 +28,7 @@ public class CachedMathMan { } } - private static char[] SQRT = new char[65536]; + private static final char[] SQRT = new char[65536]; static { for (int i = 0; i < SQRT.length; i++) { diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/EditSessionBuilder.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/EditSessionBuilder.java index 3dbc32aa5..cebccab68 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/EditSessionBuilder.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/EditSessionBuilder.java @@ -2,32 +2,32 @@ package com.fastasyncworldedit.core.util; import com.fastasyncworldedit.core.Fawe; import com.fastasyncworldedit.core.FaweCache; -import com.fastasyncworldedit.core.beta.IQueueChunk; -import com.fastasyncworldedit.core.beta.IQueueExtent; -import com.fastasyncworldedit.core.beta.implementation.lighting.NullRelighter; -import com.fastasyncworldedit.core.beta.implementation.lighting.RelightProcessor; -import com.fastasyncworldedit.core.beta.implementation.lighting.Relighter; -import com.fastasyncworldedit.core.beta.implementation.processors.HeightmapProcessor; -import com.fastasyncworldedit.core.beta.implementation.processors.LimitExtent; -import com.fastasyncworldedit.core.beta.implementation.queue.ParallelQueueExtent; +import com.fastasyncworldedit.core.queue.IQueueChunk; +import com.fastasyncworldedit.core.queue.IQueueExtent; +import com.fastasyncworldedit.core.extent.processor.lighting.NullRelighter; +import com.fastasyncworldedit.core.extent.processor.lighting.RelightProcessor; +import com.fastasyncworldedit.core.extent.processor.lighting.Relighter; +import com.fastasyncworldedit.core.extent.processor.HeightmapProcessor; +import com.fastasyncworldedit.core.extent.processor.LimitExtent; +import com.fastasyncworldedit.core.queue.implementation.ParallelQueueExtent; import com.fastasyncworldedit.core.configuration.Caption; import com.fastasyncworldedit.core.configuration.Settings; -import com.fastasyncworldedit.core.logging.RollbackOptimizedHistory; +import com.fastasyncworldedit.core.history.RollbackOptimizedHistory; import com.fastasyncworldedit.core.object.FaweLimit; -import com.fastasyncworldedit.core.object.HistoryExtent; -import com.fastasyncworldedit.core.object.NullChangeSet; -import com.fastasyncworldedit.core.object.RegionWrapper; -import com.fastasyncworldedit.core.object.RelightMode; -import com.fastasyncworldedit.core.object.changeset.AbstractChangeSet; -import com.fastasyncworldedit.core.object.changeset.BlockBagChangeSet; -import com.fastasyncworldedit.core.object.changeset.DiskStorageHistory; -import com.fastasyncworldedit.core.object.changeset.MemoryOptimizedHistory; -import com.fastasyncworldedit.core.object.extent.FaweRegionExtent; -import com.fastasyncworldedit.core.object.extent.MultiRegionExtent; -import com.fastasyncworldedit.core.object.extent.NullExtent; -import com.fastasyncworldedit.core.object.extent.SingleRegionExtent; -import com.fastasyncworldedit.core.object.extent.SlowExtent; -import com.fastasyncworldedit.core.object.extent.StripNBTExtent; +import com.fastasyncworldedit.core.extent.HistoryExtent; +import com.fastasyncworldedit.core.history.changeset.NullChangeSet; +import com.fastasyncworldedit.core.regions.RegionWrapper; +import com.fastasyncworldedit.core.extent.processor.lighting.RelightMode; +import com.fastasyncworldedit.core.history.changeset.AbstractChangeSet; +import com.fastasyncworldedit.core.history.changeset.BlockBagChangeSet; +import com.fastasyncworldedit.core.history.DiskStorageHistory; +import com.fastasyncworldedit.core.history.MemoryOptimizedHistory; +import com.fastasyncworldedit.core.extent.FaweRegionExtent; +import com.fastasyncworldedit.core.extent.MultiRegionExtent; +import com.fastasyncworldedit.core.extent.NullExtent; +import com.fastasyncworldedit.core.extent.SingleRegionExtent; +import com.fastasyncworldedit.core.extent.SlowExtent; +import com.fastasyncworldedit.core.extent.StripNBTExtent; import com.fastasyncworldedit.core.wrappers.WorldWrapper; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.WorldEdit; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/ImgurUtility.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/ImgurUtility.java index 886ca871f..368201b91 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/ImgurUtility.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/ImgurUtility.java @@ -1,6 +1,6 @@ package com.fastasyncworldedit.core.util; -import com.fastasyncworldedit.core.object.io.FastByteArrayOutputStream; +import com.fastasyncworldedit.core.internal.io.FastByteArrayOutputStream; import com.google.gson.Gson; import com.google.gson.JsonObject; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/string/JoinedCharSequence.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/JoinedCharSequence.java similarity index 97% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/string/JoinedCharSequence.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/util/JoinedCharSequence.java index 84eb925e1..3e197fab8 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/string/JoinedCharSequence.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/JoinedCharSequence.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.string; +package com.fastasyncworldedit.core.util; public class JoinedCharSequence implements CharSequence { private char join; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/MainUtil.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/MainUtil.java index f943b463b..2fb869a29 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/MainUtil.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/MainUtil.java @@ -3,14 +3,14 @@ package com.fastasyncworldedit.core.util; import com.fastasyncworldedit.core.Fawe; import com.fastasyncworldedit.core.configuration.Caption; import com.fastasyncworldedit.core.configuration.Settings; -import com.fastasyncworldedit.core.object.FaweInputStream; -import com.fastasyncworldedit.core.object.FaweOutputStream; -import com.fastasyncworldedit.core.object.RegionWrapper; -import com.fastasyncworldedit.core.object.RunnableVal; -import com.fastasyncworldedit.core.object.RunnableVal2; -import com.fastasyncworldedit.core.object.changeset.FaweStreamChangeSet; -import com.fastasyncworldedit.core.object.io.AbstractDelegateOutputStream; -import com.fastasyncworldedit.core.object.io.zstd.ZstdInputStream; +import com.fastasyncworldedit.core.internal.io.FaweInputStream; +import com.fastasyncworldedit.core.internal.io.FaweOutputStream; +import com.fastasyncworldedit.core.regions.RegionWrapper; +import com.fastasyncworldedit.core.util.task.RunnableVal; +import com.fastasyncworldedit.core.util.task.RunnableVal2; +import com.fastasyncworldedit.core.history.changeset.FaweStreamChangeSet; +import com.fastasyncworldedit.core.internal.io.AbstractDelegateOutputStream; +import com.github.luben.zstd.ZstdInputStream; import com.github.luben.zstd.ZstdOutputStream; import com.sk89q.jnbt.CompoundTag; import com.sk89q.jnbt.DoubleTag; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/MaskTraverser.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/MaskTraverser.java index 023ad3b05..e775daf1a 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/MaskTraverser.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/MaskTraverser.java @@ -1,6 +1,6 @@ package com.fastasyncworldedit.core.util; -import com.fastasyncworldedit.core.object.mask.ResettableMask; +import com.fastasyncworldedit.core.function.mask.ResettableMask; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.function.mask.AbstractExtentMask; import com.sk89q.worldedit.function.mask.Mask; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/MemUtil.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/MemUtil.java index fbdf2295f..a093999ca 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/MemUtil.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/MemUtil.java @@ -8,7 +8,7 @@ import java.util.concurrent.atomic.AtomicBoolean; public class MemUtil { - private static AtomicBoolean memory = new AtomicBoolean(false); + private static final AtomicBoolean memory = new AtomicBoolean(false); public static boolean isMemoryFree() { return !memory.get(); diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/string/MutableCharSequence.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/MutableCharSequence.java similarity index 97% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/string/MutableCharSequence.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/util/MutableCharSequence.java index a017e3e38..8af0587aa 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/string/MutableCharSequence.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/MutableCharSequence.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.string; +package com.fastasyncworldedit.core.util; public class MutableCharSequence implements CharSequence { private String str; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/util/nbt/NbtUtils.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/NbtUtils.java similarity index 55% rename from worldedit-core/src/main/java/com/sk89q/worldedit/util/nbt/NbtUtils.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/util/NbtUtils.java index 2c032e8bc..bbcdb0af5 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/util/nbt/NbtUtils.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/NbtUtils.java @@ -1,24 +1,8 @@ -/* - * WorldEdit, a Minecraft world manipulation toolkit - * Copyright (C) sk89q - * Copyright (C) WorldEdit team and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.sk89q.worldedit.util.nbt; +package com.fastasyncworldedit.core.util; +import com.sk89q.worldedit.util.nbt.BinaryTag; +import com.sk89q.worldedit.util.nbt.BinaryTagType; +import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; import com.sk89q.worldedit.world.storage.InvalidFormatException; public class NbtUtils { diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/TaskManager.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/TaskManager.java index ee4198d96..cb91d6631 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/TaskManager.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/TaskManager.java @@ -1,9 +1,9 @@ package com.fastasyncworldedit.core.util; import com.fastasyncworldedit.core.Fawe; -import com.fastasyncworldedit.core.beta.implementation.queue.QueueHandler; +import com.fastasyncworldedit.core.queue.implementation.QueueHandler; import com.fastasyncworldedit.core.configuration.Settings; -import com.fastasyncworldedit.core.object.RunnableVal; +import com.fastasyncworldedit.core.util.task.RunnableVal; import com.sk89q.worldedit.internal.util.LogManagerCompat; import org.apache.logging.log4j.Logger; import org.jetbrains.annotations.NotNull; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/TextureUtil.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/TextureUtil.java index 0926695ac..e8a433b75 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/TextureUtil.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/TextureUtil.java @@ -1,7 +1,7 @@ package com.fastasyncworldedit.core.util; import com.fastasyncworldedit.core.Fawe; -import com.fastasyncworldedit.core.beta.implementation.filter.block.SingleFilterBlock; +import com.fastasyncworldedit.core.extent.filter.block.SingleFilterBlock; import com.fastasyncworldedit.core.configuration.Settings; import com.fastasyncworldedit.core.util.image.ImageUtil; import com.google.gson.Gson; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/WEManager.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/WEManager.java index a6b321d52..b70402042 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/WEManager.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/WEManager.java @@ -2,9 +2,9 @@ package com.fastasyncworldedit.core.util; import com.fastasyncworldedit.core.configuration.Caption; import com.fastasyncworldedit.core.configuration.Settings; -import com.fastasyncworldedit.core.object.RegionWrapper; -import com.fastasyncworldedit.core.object.exception.FaweException; -import com.fastasyncworldedit.core.object.extent.NullExtent; +import com.fastasyncworldedit.core.regions.RegionWrapper; +import com.fastasyncworldedit.core.internal.exception.FaweException; +import com.fastasyncworldedit.core.extent.NullExtent; import com.fastasyncworldedit.core.regions.FaweMask; import com.fastasyncworldedit.core.regions.FaweMaskManager; import com.sk89q.worldedit.WorldEditException; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/AdaptedMap.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/collection/AdaptedMap.java similarity index 96% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/AdaptedMap.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/util/collection/AdaptedMap.java index b8664657d..1f6047f5f 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/AdaptedMap.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/collection/AdaptedMap.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.collection; +package com.fastasyncworldedit.core.util.collection; import org.jetbrains.annotations.NotNull; @@ -71,7 +71,7 @@ public class AdaptedMap implements IAdaptedMap { return Collections.emptySet(); } return new AdaptedSetCollection<>(getParent().entrySet(), new com.google.common.base.Function, Entry>() { - private AdaptedPair entry = new AdaptedPair(); + private final AdaptedPair entry = new AdaptedPair(); @Override public Entry apply(@javax.annotation.Nullable Entry input) { entry.input = input; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/AdaptedSetCollection.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/collection/AdaptedSetCollection.java similarity index 98% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/AdaptedSetCollection.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/util/collection/AdaptedSetCollection.java index 6cb191daa..bc82386de 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/AdaptedSetCollection.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/collection/AdaptedSetCollection.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.collection; +package com.fastasyncworldedit.core.util.collection; import com.google.common.base.Function; import com.google.common.collect.Collections2; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/BlockSet.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/collection/BlockSet.java similarity index 98% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/BlockSet.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/util/collection/BlockSet.java index 15dd2b01c..aadf1c6ad 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/BlockSet.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/collection/BlockSet.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.collection; +package com.fastasyncworldedit.core.util.collection; import com.sk89q.worldedit.math.BlockVector2; import com.sk89q.worldedit.math.BlockVector3; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/CleanableThreadLocal.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/collection/CleanableThreadLocal.java similarity index 95% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/CleanableThreadLocal.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/util/collection/CleanableThreadLocal.java index eb25ccab1..0c433ba13 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/CleanableThreadLocal.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/collection/CleanableThreadLocal.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.collection; +package com.fastasyncworldedit.core.util.collection; import java.io.IOException; import java.util.concurrent.atomic.LongAdder; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/CpuBlockSet.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/collection/CpuBlockSet.java similarity index 98% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/CpuBlockSet.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/util/collection/CpuBlockSet.java index 974e16e53..ca3911ae5 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/CpuBlockSet.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/collection/CpuBlockSet.java @@ -1,4 +1,4 @@ -//package com.boydti.fawe.object.collection; +//package com.fastasyncworldedit.core.util.collection; // //import com.sk89q.worldedit.math.BlockVector2; //import com.sk89q.worldedit.math.BlockVector3; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/FastRandomCollection.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/collection/FastRandomCollection.java similarity index 95% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/FastRandomCollection.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/util/collection/FastRandomCollection.java index 39fdd1321..be82c08c2 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/FastRandomCollection.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/collection/FastRandomCollection.java @@ -1,6 +1,6 @@ -package com.fastasyncworldedit.core.object.collection; +package com.fastasyncworldedit.core.util.collection; -import com.fastasyncworldedit.core.object.random.SimpleRandom; +import com.fastasyncworldedit.core.math.random.SimpleRandom; import com.fastasyncworldedit.core.util.MathMan; import java.util.ArrayList; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/IAdaptedMap.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/collection/IAdaptedMap.java similarity index 97% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/IAdaptedMap.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/util/collection/IAdaptedMap.java index 5b1074424..da61adf66 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/IAdaptedMap.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/collection/IAdaptedMap.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.collection; +package com.fastasyncworldedit.core.util.collection; import com.google.common.base.Function; import org.jetbrains.annotations.NotNull; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/LongHashSet.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/collection/LongHashSet.java similarity index 81% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/LongHashSet.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/util/collection/LongHashSet.java index b3f3e7d4b..b10b04689 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/LongHashSet.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/collection/LongHashSet.java @@ -1,23 +1,4 @@ -/* - * WorldGuard, a suite of tools for Minecraft - * Copyright (C) sk89q - * Copyright (C) WorldGuard team and contributors - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as published by the - * Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License - * for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package com.fastasyncworldedit.core.object.collection; +package com.fastasyncworldedit.core.util.collection; import java.util.Arrays; @@ -60,13 +41,13 @@ public class LongHashSet { public void add(long key) { int mainIdx = (int) (key & 255); - long outer[][] = this.values[mainIdx]; + long[][] outer = this.values[mainIdx]; if (outer == null) { this.values[mainIdx] = outer = new long[256][]; } int outerIdx = (int) ((key >> 32) & 255); - long inner[] = outer[outerIdx]; + long[] inner = outer[outerIdx]; if (inner == null) { synchronized (this) { diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/MemBlockSet.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/collection/MemBlockSet.java similarity index 99% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/MemBlockSet.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/util/collection/MemBlockSet.java index 0092adb2e..4c6133134 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/MemBlockSet.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/collection/MemBlockSet.java @@ -1,10 +1,10 @@ -package com.fastasyncworldedit.core.object.collection; +package com.fastasyncworldedit.core.util.collection; import com.fastasyncworldedit.core.FaweCache; import com.sk89q.worldedit.math.BlockVector2; import com.sk89q.worldedit.math.BlockVector3; -import com.sk89q.worldedit.math.MutableBlockVector2; -import com.sk89q.worldedit.math.MutableBlockVector3; +import com.fastasyncworldedit.core.math.MutableBlockVector2; +import com.fastasyncworldedit.core.math.MutableBlockVector3; import org.jetbrains.annotations.NotNull; import java.util.AbstractSet; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/MutablePair.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/collection/MutablePair.java similarity index 88% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/MutablePair.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/util/collection/MutablePair.java index 7d6da9366..d1c2b35f8 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/MutablePair.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/collection/MutablePair.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.collection; +package com.fastasyncworldedit.core.util.collection; import java.util.Map; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/RandomCollection.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/collection/RandomCollection.java similarity index 92% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/RandomCollection.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/util/collection/RandomCollection.java index bc4de19f1..5b486b770 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/RandomCollection.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/collection/RandomCollection.java @@ -1,6 +1,6 @@ -package com.fastasyncworldedit.core.object.collection; +package com.fastasyncworldedit.core.util.collection; -import com.fastasyncworldedit.core.object.random.SimpleRandom; +import com.fastasyncworldedit.core.math.random.SimpleRandom; import java.util.Map; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/SimpleRandomCollection.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/collection/SimpleRandomCollection.java similarity index 90% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/SimpleRandomCollection.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/util/collection/SimpleRandomCollection.java index 4d6b9fa71..d4db3cba6 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/SimpleRandomCollection.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/collection/SimpleRandomCollection.java @@ -1,6 +1,6 @@ -package com.fastasyncworldedit.core.object.collection; +package com.fastasyncworldedit.core.util.collection; -import com.fastasyncworldedit.core.object.random.SimpleRandom; +import com.fastasyncworldedit.core.math.random.SimpleRandom; import java.util.Map; import java.util.NavigableMap; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/SummedColorTable.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/collection/SummedColorTable.java similarity index 99% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/SummedColorTable.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/util/collection/SummedColorTable.java index 3c87b6989..f52e4619a 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/SummedColorTable.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/collection/SummedColorTable.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.collection; +package com.fastasyncworldedit.core.util.collection; import com.fastasyncworldedit.core.util.MathMan; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/YieldIterable.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/collection/YieldIterable.java similarity index 97% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/YieldIterable.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/util/collection/YieldIterable.java index e5998fcef..9c43415d4 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/YieldIterable.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/collection/YieldIterable.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.collection; +package com.fastasyncworldedit.core.util.collection; import org.jetbrains.annotations.Nullable; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/image/ImageUtil.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/image/ImageUtil.java index 5558a608d..914845f52 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/image/ImageUtil.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/image/ImageUtil.java @@ -6,7 +6,7 @@ import com.fastasyncworldedit.core.configuration.Settings; import com.fastasyncworldedit.core.util.MainUtil; import com.fastasyncworldedit.core.util.MathMan; import com.sk89q.worldedit.extension.input.InputParseException; -import com.sk89q.worldedit.extension.platform.binding.ProvideBindings; +import com.fastasyncworldedit.core.extension.platform.binding.ProvideBindings; import com.sk89q.worldedit.util.formatting.text.TextComponent; import java.awt.Graphics2D; @@ -136,7 +136,6 @@ public class ImageUtil { default: alpha = MathMan.clamp((int) (alpha * alphaScale), 0, 255); raw[i] = (color & 0x00FFFFFF) + (alpha << 24); - continue; } } } diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/progress/ChatProgressTracker.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/progress/ChatProgressTracker.java similarity index 90% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/progress/ChatProgressTracker.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/util/progress/ChatProgressTracker.java index 9cfc2367d..bb8b4c112 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/progress/ChatProgressTracker.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/progress/ChatProgressTracker.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.progress; +package com.fastasyncworldedit.core.util.progress; import com.sk89q.worldedit.entity.Player; import com.sk89q.worldedit.util.formatting.text.Component; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/progress/DefaultProgressTracker.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/progress/DefaultProgressTracker.java similarity index 96% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/progress/DefaultProgressTracker.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/util/progress/DefaultProgressTracker.java index db9e9d722..d85cdf91c 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/progress/DefaultProgressTracker.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/progress/DefaultProgressTracker.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.progress; +package com.fastasyncworldedit.core.util.progress; import com.fastasyncworldedit.core.configuration.Caption; import com.fastasyncworldedit.core.configuration.Settings; @@ -91,13 +91,13 @@ public class DefaultProgressTracker implements BiConsumer implements Runnable, BiConsumer { public void accept(T t, U u) { run(t, u); } -} \ No newline at end of file +} diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/RunnableVal3.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/task/RunnableVal3.java similarity index 90% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/RunnableVal3.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/util/task/RunnableVal3.java index 555df2f04..daa0a1227 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/RunnableVal3.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/task/RunnableVal3.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object; +package com.fastasyncworldedit.core.util.task; public abstract class RunnableVal3 implements Runnable { public T value1; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/RunnableVal4.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/task/RunnableVal4.java similarity index 92% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/RunnableVal4.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/util/task/RunnableVal4.java index b734efba7..1df45d5b9 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/RunnableVal4.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/task/RunnableVal4.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object; +package com.fastasyncworldedit.core.util.task; public abstract class RunnableVal4 implements Runnable { public T value1; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/task/SingleThreadIntervalQueue.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/task/SingleThreadIntervalQueue.java similarity index 97% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/task/SingleThreadIntervalQueue.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/util/task/SingleThreadIntervalQueue.java index 9008cfa4c..a8fbbd404 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/task/SingleThreadIntervalQueue.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/task/SingleThreadIntervalQueue.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.task; +package com.fastasyncworldedit.core.util.task; import com.fastasyncworldedit.core.Fawe; import com.fastasyncworldedit.core.util.TaskManager; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/task/ThrowableSupplier.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/task/ThrowableSupplier.java similarity index 64% rename from worldedit-core/src/main/java/com/fastasyncworldedit/core/object/task/ThrowableSupplier.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/util/task/ThrowableSupplier.java index d53e65147..d1bf3cc8e 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/task/ThrowableSupplier.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/task/ThrowableSupplier.java @@ -1,4 +1,4 @@ -package com.fastasyncworldedit.core.object.task; +package com.fastasyncworldedit.core.util.task; public interface ThrowableSupplier { Object get() throws T; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/SimpleWorld.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/world/SimpleWorld.java similarity index 81% rename from worldedit-core/src/main/java/com/sk89q/worldedit/world/SimpleWorld.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/world/SimpleWorld.java index d17d0a31a..e57c07766 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/SimpleWorld.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/world/SimpleWorld.java @@ -1,23 +1,4 @@ -/* - * WorldEdit, a Minecraft world manipulation toolkit - * Copyright (C) sk89q - * Copyright (C) WorldEdit team and contributors - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU Lesser General default License as published by the - * Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General default License - * for more details. - * - * You should have received a copy of the GNU Lesser General default License - * along with this program. If not, see . - */ - -package com.sk89q.worldedit.world; +package com.fastasyncworldedit.core.world; import com.fastasyncworldedit.core.Fawe; import com.sk89q.worldedit.EditSession; @@ -33,6 +14,7 @@ import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.math.Vector3; import com.sk89q.worldedit.util.Direction; import com.sk89q.worldedit.util.TreeGenerator; +import com.sk89q.worldedit.world.World; import com.sk89q.worldedit.world.block.BaseBlock; import com.sk89q.worldedit.world.block.BlockStateHolder; import com.sk89q.worldedit.world.block.BlockType; @@ -46,7 +28,6 @@ import javax.annotation.Nullable; /** * An abstract implementation of {@link World}. - * Added by FAWE. */ public interface SimpleWorld extends World { @Override diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlanketBaseBlock.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/world/block/BlanketBaseBlock.java similarity index 82% rename from worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlanketBaseBlock.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/world/block/BlanketBaseBlock.java index 5d1ee427c..3c19faa94 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlanketBaseBlock.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/world/block/BlanketBaseBlock.java @@ -1,6 +1,8 @@ -package com.sk89q.worldedit.world.block; +package com.fastasyncworldedit.core.world.block; import com.sk89q.jnbt.CompoundTag; +import com.sk89q.worldedit.world.block.BaseBlock; +import com.sk89q.worldedit.world.block.BlockState; import org.jetbrains.annotations.NotNull; /** diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockID.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/world/block/BlockID.java similarity index 99% rename from worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockID.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/world/block/BlockID.java index 47d74fe97..ffef82386 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockID.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/world/block/BlockID.java @@ -1,7 +1,12 @@ -package com.sk89q.worldedit.world.block; +package com.fastasyncworldedit.core.world.block; +/** + * An internal FAWE class used for switch statements on blocks. + * Using IDs to register items is pre 1.13 days. This class is + * deprecated for removal with replacement of namespaced IDs. + */ +@Deprecated(forRemoval = true) public class BlockID { - // Used for switch statements on blocks public static final int __RESERVED__ = 0; public static final int AIR = 1; public static final int CAVE_AIR = 2; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockTypeSwitch.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/world/block/BlockTypeSwitch.java similarity index 76% rename from worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockTypeSwitch.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/world/block/BlockTypeSwitch.java index 13a75ddb8..5f50c9f17 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockTypeSwitch.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/world/block/BlockTypeSwitch.java @@ -1,4 +1,6 @@ -package com.sk89q.worldedit.world.block; +package com.fastasyncworldedit.core.world.block; + +import com.sk89q.worldedit.world.block.BlockType; import java.util.function.Function; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockTypeSwitchBuilder.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/world/block/BlockTypeSwitchBuilder.java similarity index 84% rename from worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockTypeSwitchBuilder.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/world/block/BlockTypeSwitchBuilder.java index 11b1c3d4b..5739304c7 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockTypeSwitchBuilder.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/world/block/BlockTypeSwitchBuilder.java @@ -1,4 +1,8 @@ -package com.sk89q.worldedit.world.block; +package com.fastasyncworldedit.core.world.block; + +import com.sk89q.worldedit.world.block.BlockType; +import com.sk89q.worldedit.world.block.BlockTypes; +import com.sk89q.worldedit.world.block.BlockTypesCache; import java.util.function.Predicate; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/CompoundInput.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/world/block/CompoundInput.java similarity index 64% rename from worldedit-core/src/main/java/com/sk89q/worldedit/world/block/CompoundInput.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/world/block/CompoundInput.java index 9ec410eec..4310d6523 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/CompoundInput.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/world/block/CompoundInput.java @@ -1,6 +1,8 @@ -package com.sk89q.worldedit.world.block; +package com.fastasyncworldedit.core.world.block; -import com.fastasyncworldedit.core.beta.ITileInput; +import com.fastasyncworldedit.core.queue.ITileInput; +import com.sk89q.worldedit.world.block.BaseBlock; +import com.sk89q.worldedit.world.block.BlockState; public enum CompoundInput { NULL, diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/ItemTypesCache.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/world/block/ItemTypesCache.java similarity index 94% rename from worldedit-core/src/main/java/com/sk89q/worldedit/world/block/ItemTypesCache.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/world/block/ItemTypesCache.java index 9c376a761..be8909e2d 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/ItemTypesCache.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/world/block/ItemTypesCache.java @@ -1,4 +1,4 @@ -package com.sk89q.worldedit.world.block; +package com.fastasyncworldedit.core.world.block; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.extension.platform.Capability; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/wrappers/AsyncPlayer.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/wrappers/AsyncPlayer.java index 2e2f0aabf..f95b33581 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/wrappers/AsyncPlayer.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/wrappers/AsyncPlayer.java @@ -1,7 +1,7 @@ package com.fastasyncworldedit.core.wrappers; import com.fastasyncworldedit.core.Fawe; -import com.fastasyncworldedit.core.object.RunnableVal; +import com.fastasyncworldedit.core.util.task.RunnableVal; import com.fastasyncworldedit.core.util.EditSessionBuilder; import com.fastasyncworldedit.core.util.TaskManager; import com.sk89q.worldedit.EditSession; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/wrappers/WorldWrapper.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/wrappers/WorldWrapper.java index 1e9c52859..90198424b 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/wrappers/WorldWrapper.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/wrappers/WorldWrapper.java @@ -1,8 +1,8 @@ package com.fastasyncworldedit.core.wrappers; -import com.fastasyncworldedit.core.beta.IChunkGet; -import com.fastasyncworldedit.core.beta.implementation.packet.ChunkPacket; -import com.fastasyncworldedit.core.object.RunnableVal; +import com.fastasyncworldedit.core.queue.IChunkGet; +import com.fastasyncworldedit.core.queue.implementation.packet.ChunkPacket; +import com.fastasyncworldedit.core.util.task.RunnableVal; import com.fastasyncworldedit.core.util.ExtentTraverser; import com.fastasyncworldedit.core.util.TaskManager; import com.sk89q.jnbt.CompoundTag; diff --git a/worldedit-core/src/main/java/com/sk89q/jnbt/ByteArrayTag.java b/worldedit-core/src/main/java/com/sk89q/jnbt/ByteArrayTag.java index a1065cced..094a7c9bb 100644 --- a/worldedit-core/src/main/java/com/sk89q/jnbt/ByteArrayTag.java +++ b/worldedit-core/src/main/java/com/sk89q/jnbt/ByteArrayTag.java @@ -56,11 +56,11 @@ public final class ByteArrayTag extends Tag { return innerTag; } - // FAWE Start + //FAWE start @Override public int getTypeCode() { return NBTConstants.TYPE_BYTE_ARRAY; } - // FAWE End + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/jnbt/ByteTag.java b/worldedit-core/src/main/java/com/sk89q/jnbt/ByteTag.java index ce90b9a60..6068b2af0 100644 --- a/worldedit-core/src/main/java/com/sk89q/jnbt/ByteTag.java +++ b/worldedit-core/src/main/java/com/sk89q/jnbt/ByteTag.java @@ -56,11 +56,11 @@ public final class ByteTag extends Tag { return innerTag; } - // FAWE Start + //FAWE start @Override public int getTypeCode() { return NBTConstants.TYPE_BYTE; } - // FAWE End + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/jnbt/CompoundTag.java b/worldedit-core/src/main/java/com/sk89q/jnbt/CompoundTag.java index eddf565b0..8ce0a00ec 100644 --- a/worldedit-core/src/main/java/com/sk89q/jnbt/CompoundTag.java +++ b/worldedit-core/src/main/java/com/sk89q/jnbt/CompoundTag.java @@ -19,7 +19,7 @@ package com.sk89q.jnbt; -import com.sk89q.jnbt.fawe.NumberTag; +import com.fastasyncworldedit.core.jnbt.NumberTag; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.math.Vector3; import com.sk89q.worldedit.util.Location; @@ -338,7 +338,7 @@ public class CompoundTag extends Tag { } - // FAWE Start + //FAWE start public UUID getUUID() { long most = getLong("UUIDMost"); long least = getLong("UUIDLeast"); @@ -376,6 +376,6 @@ public class CompoundTag extends Tag { } return raw; } - // FAWE End + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/jnbt/DoubleTag.java b/worldedit-core/src/main/java/com/sk89q/jnbt/DoubleTag.java index 1ad649d91..da0890ea6 100644 --- a/worldedit-core/src/main/java/com/sk89q/jnbt/DoubleTag.java +++ b/worldedit-core/src/main/java/com/sk89q/jnbt/DoubleTag.java @@ -19,7 +19,7 @@ package com.sk89q.jnbt; -import com.sk89q.jnbt.fawe.NumberTag; +import com.fastasyncworldedit.core.jnbt.NumberTag; import com.sk89q.worldedit.util.nbt.DoubleBinaryTag; /** @@ -57,11 +57,11 @@ public final class DoubleTag extends NumberTag { return innerTag.value(); } - // FAWE Start + //FAWE start @Override public int getTypeCode() { return NBTConstants.TYPE_DOUBLE; } - // FAWE End + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/jnbt/EndTag.java b/worldedit-core/src/main/java/com/sk89q/jnbt/EndTag.java index f2f34f2da..18347d928 100644 --- a/worldedit-core/src/main/java/com/sk89q/jnbt/EndTag.java +++ b/worldedit-core/src/main/java/com/sk89q/jnbt/EndTag.java @@ -39,11 +39,11 @@ public final class EndTag extends Tag { return EndBinaryTag.get(); } - // FAWE Start + //FAWE start @Override public int getTypeCode() { return NBTConstants.TYPE_END; } - // FAWE End + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/jnbt/FloatTag.java b/worldedit-core/src/main/java/com/sk89q/jnbt/FloatTag.java index b750728f6..2e1533827 100644 --- a/worldedit-core/src/main/java/com/sk89q/jnbt/FloatTag.java +++ b/worldedit-core/src/main/java/com/sk89q/jnbt/FloatTag.java @@ -19,7 +19,7 @@ package com.sk89q.jnbt; -import com.sk89q.jnbt.fawe.NumberTag; +import com.fastasyncworldedit.core.jnbt.NumberTag; import com.sk89q.worldedit.util.nbt.FloatBinaryTag; /** @@ -57,11 +57,11 @@ public final class FloatTag extends NumberTag { return innerTag.value(); } - // FAWE Start + //FAWE start @Override public int getTypeCode() { return NBTConstants.TYPE_FLOAT; } - // FAWE End + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/jnbt/IntArrayTag.java b/worldedit-core/src/main/java/com/sk89q/jnbt/IntArrayTag.java index 990e4454c..76d8fac74 100644 --- a/worldedit-core/src/main/java/com/sk89q/jnbt/IntArrayTag.java +++ b/worldedit-core/src/main/java/com/sk89q/jnbt/IntArrayTag.java @@ -59,11 +59,11 @@ public final class IntArrayTag extends Tag { return innerTag.value(); } - // FAWE Start + //FAWE start @Override public int getTypeCode() { return NBTConstants.TYPE_INT_ARRAY; } - // FAWE End + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/jnbt/IntTag.java b/worldedit-core/src/main/java/com/sk89q/jnbt/IntTag.java index 4da079385..c6ff80252 100644 --- a/worldedit-core/src/main/java/com/sk89q/jnbt/IntTag.java +++ b/worldedit-core/src/main/java/com/sk89q/jnbt/IntTag.java @@ -56,11 +56,11 @@ public final class IntTag extends Tag { return innerTag.value(); } - // FAWE Start + //FAWE start @Override public int getTypeCode() { return NBTConstants.TYPE_INT; } - // FAWE End + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/jnbt/ListTag.java b/worldedit-core/src/main/java/com/sk89q/jnbt/ListTag.java index c6a0b7376..615e13fbf 100644 --- a/worldedit-core/src/main/java/com/sk89q/jnbt/ListTag.java +++ b/worldedit-core/src/main/java/com/sk89q/jnbt/ListTag.java @@ -389,7 +389,7 @@ public final class ListTag extends Tag { ); } - // FAWE Start + //FAWE start @Override public int getTypeCode() { return NBTConstants.TYPE_LIST; diff --git a/worldedit-core/src/main/java/com/sk89q/jnbt/LongArrayTag.java b/worldedit-core/src/main/java/com/sk89q/jnbt/LongArrayTag.java index 417e9e3af..81c6e3376 100644 --- a/worldedit-core/src/main/java/com/sk89q/jnbt/LongArrayTag.java +++ b/worldedit-core/src/main/java/com/sk89q/jnbt/LongArrayTag.java @@ -59,11 +59,11 @@ public class LongArrayTag extends Tag { return innerTag.value(); } - // FAWE Start + //FAWE start @Override public int getTypeCode() { return NBTConstants.TYPE_LONG_ARRAY; } - // FAWE End + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/jnbt/LongTag.java b/worldedit-core/src/main/java/com/sk89q/jnbt/LongTag.java index 526751bd8..84a443746 100644 --- a/worldedit-core/src/main/java/com/sk89q/jnbt/LongTag.java +++ b/worldedit-core/src/main/java/com/sk89q/jnbt/LongTag.java @@ -56,11 +56,11 @@ public final class LongTag extends Tag { return innerTag.value(); } - // FAWE Start + //FAWE start @Override public int getTypeCode() { return NBTConstants.TYPE_LONG; } - // FAWE End + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/jnbt/NBTOutputStream.java b/worldedit-core/src/main/java/com/sk89q/jnbt/NBTOutputStream.java index 19c957d2c..fe3327ebd 100644 --- a/worldedit-core/src/main/java/com/sk89q/jnbt/NBTOutputStream.java +++ b/worldedit-core/src/main/java/com/sk89q/jnbt/NBTOutputStream.java @@ -19,7 +19,7 @@ package com.sk89q.jnbt; -import com.fastasyncworldedit.core.object.io.LittleEndianOutputStream; +import com.fastasyncworldedit.core.internal.io.LittleEndianOutputStream; import java.io.Closeable; import java.io.DataOutput; diff --git a/worldedit-core/src/main/java/com/sk89q/jnbt/ShortTag.java b/worldedit-core/src/main/java/com/sk89q/jnbt/ShortTag.java index c0849a583..abbd06b3f 100644 --- a/worldedit-core/src/main/java/com/sk89q/jnbt/ShortTag.java +++ b/worldedit-core/src/main/java/com/sk89q/jnbt/ShortTag.java @@ -56,11 +56,11 @@ public final class ShortTag extends Tag { return innerTag.value(); } - // FAWE Start + //FAWE start @Override public int getTypeCode() { return NBTConstants.TYPE_SHORT; } - // FAWE End + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/jnbt/StringTag.java b/worldedit-core/src/main/java/com/sk89q/jnbt/StringTag.java index ef5ff44c1..483263752 100644 --- a/worldedit-core/src/main/java/com/sk89q/jnbt/StringTag.java +++ b/worldedit-core/src/main/java/com/sk89q/jnbt/StringTag.java @@ -59,11 +59,11 @@ public final class StringTag extends Tag { return innerTag.value(); } - // FAWE Start + //FAWE start @Override public int getTypeCode() { return NBTConstants.TYPE_STRING; } - // FAWE End + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/jnbt/Tag.java b/worldedit-core/src/main/java/com/sk89q/jnbt/Tag.java index 2bad9d965..900b87121 100644 --- a/worldedit-core/src/main/java/com/sk89q/jnbt/Tag.java +++ b/worldedit-core/src/main/java/com/sk89q/jnbt/Tag.java @@ -41,12 +41,12 @@ public abstract class Tag implements BinaryTagLike { return asBinaryTag().toString(); } - // FAWE Start + //FAWE start public Object toRaw() { return getValue(); } public abstract int getTypeCode(); - // FAWE End + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/jnbt/fawe/package-info.java b/worldedit-core/src/main/java/com/sk89q/jnbt/fawe/package-info.java deleted file mode 100644 index e86928e02..000000000 --- a/worldedit-core/src/main/java/com/sk89q/jnbt/fawe/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * These are classes added by FAWE. They do not exist in WorldEdit - */ -package com.sk89q.jnbt.fawe; diff --git a/worldedit-core/src/main/java/com/sk89q/minecraft/util/commands/Command.java b/worldedit-core/src/main/java/com/sk89q/minecraft/util/commands/Command.java index 9fe5603c9..017d6563e 100644 --- a/worldedit-core/src/main/java/com/sk89q/minecraft/util/commands/Command.java +++ b/worldedit-core/src/main/java/com/sk89q/minecraft/util/commands/Command.java @@ -90,10 +90,12 @@ public @interface Command { */ boolean anyFlags() default false; + //FAWE start /** * Should the command be queued * @return true if so */ boolean queued() default true; + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/util/ReflectionUtil.java b/worldedit-core/src/main/java/com/sk89q/util/ReflectionUtil.java index 15a7c6cb9..0cd8418a5 100644 --- a/worldedit-core/src/main/java/com/sk89q/util/ReflectionUtil.java +++ b/worldedit-core/src/main/java/com/sk89q/util/ReflectionUtil.java @@ -26,6 +26,7 @@ public final class ReflectionUtil { private ReflectionUtil() { } + //FAWE start @SuppressWarnings("unchecked") public static T getField(Object from, String name) { if (from instanceof Class) { @@ -34,6 +35,7 @@ public final class ReflectionUtil { return getField(from.getClass(), from, name); } } + //FAWE end @SuppressWarnings("unchecked") public static T getField(Class checkClass, Object from, String name) { diff --git a/worldedit-core/src/main/java/com/sk89q/util/StringUtil.java b/worldedit-core/src/main/java/com/sk89q/util/StringUtil.java index f7b4bedaf..81edd363c 100644 --- a/worldedit-core/src/main/java/com/sk89q/util/StringUtil.java +++ b/worldedit-core/src/main/java/com/sk89q/util/StringUtil.java @@ -333,6 +333,7 @@ public final class StringUtil { return parsableBlocks; } + //FAWE start /** * Splits a string respecting enclosing quotes. * @@ -365,4 +366,5 @@ public final class StringUtil { } return split; } + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/EditSession.java b/worldedit-core/src/main/java/com/sk89q/worldedit/EditSession.java index 8cac29d14..61f6179c7 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/EditSession.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/EditSession.java @@ -20,25 +20,25 @@ package com.sk89q.worldedit; import com.fastasyncworldedit.core.FaweCache; -import com.fastasyncworldedit.core.beta.implementation.lighting.NullRelighter; -import com.fastasyncworldedit.core.beta.implementation.lighting.Relighter; +import com.fastasyncworldedit.core.extent.processor.lighting.NullRelighter; +import com.fastasyncworldedit.core.extent.processor.lighting.Relighter; import com.fastasyncworldedit.core.configuration.Caption; import com.fastasyncworldedit.core.configuration.Settings; import com.fastasyncworldedit.core.object.FaweLimit; -import com.fastasyncworldedit.core.object.RegionWrapper; -import com.fastasyncworldedit.core.object.RunnableVal; -import com.fastasyncworldedit.core.object.changeset.AbstractChangeSet; -import com.fastasyncworldedit.core.object.changeset.BlockBagChangeSet; -import com.fastasyncworldedit.core.object.clipboard.WorldCopyClipboard; -import com.fastasyncworldedit.core.object.collection.LocalBlockVectorSet; -import com.fastasyncworldedit.core.object.extent.FaweRegionExtent; -import com.fastasyncworldedit.core.object.extent.ProcessedWEExtent; -import com.fastasyncworldedit.core.object.extent.ResettableExtent; -import com.fastasyncworldedit.core.object.extent.SingleRegionExtent; -import com.fastasyncworldedit.core.object.extent.SourceMaskExtent; -import com.fastasyncworldedit.core.object.function.SurfaceRegionFunction; -import com.fastasyncworldedit.core.object.mask.ResettableMask; -import com.fastasyncworldedit.core.object.pattern.ExistingPattern; +import com.fastasyncworldedit.core.regions.RegionWrapper; +import com.fastasyncworldedit.core.util.task.RunnableVal; +import com.fastasyncworldedit.core.history.changeset.AbstractChangeSet; +import com.fastasyncworldedit.core.history.changeset.BlockBagChangeSet; +import com.fastasyncworldedit.core.extent.clipboard.WorldCopyClipboard; +import com.fastasyncworldedit.core.math.LocalBlockVectorSet; +import com.fastasyncworldedit.core.extent.FaweRegionExtent; +import com.fastasyncworldedit.core.extent.ProcessedWEExtent; +import com.fastasyncworldedit.core.extent.ResettableExtent; +import com.fastasyncworldedit.core.extent.SingleRegionExtent; +import com.fastasyncworldedit.core.extent.SourceMaskExtent; +import com.fastasyncworldedit.core.function.SurfaceRegionFunction; +import com.fastasyncworldedit.core.function.mask.ResettableMask; +import com.fastasyncworldedit.core.function.pattern.ExistingPattern; import com.fastasyncworldedit.core.util.EditSessionBuilder; import com.fastasyncworldedit.core.util.ExtentTraverser; import com.fastasyncworldedit.core.util.MaskTraverser; @@ -52,42 +52,41 @@ import com.sk89q.worldedit.extent.AbstractDelegateExtent; import com.sk89q.worldedit.extent.ChangeSetExtent; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.extent.MaskingExtent; -import com.sk89q.worldedit.extent.PassthroughExtent; +import com.fastasyncworldedit.core.extent.PassthroughExtent; import com.sk89q.worldedit.extent.clipboard.Clipboard; import com.sk89q.worldedit.extent.inventory.BlockBag; import com.sk89q.worldedit.extent.inventory.BlockBagExtent; import com.sk89q.worldedit.extent.world.SurvivalModeExtent; import com.sk89q.worldedit.extent.world.WatchdogTickingExtent; import com.sk89q.worldedit.function.GroundFunction; -import com.sk89q.worldedit.function.RegionFunction; import com.sk89q.worldedit.function.block.BlockReplace; import com.sk89q.worldedit.function.block.Naturalizer; import com.sk89q.worldedit.function.block.SnowSimulator; import com.sk89q.worldedit.function.generator.ForestGenerator; import com.sk89q.worldedit.function.generator.GardenPatchGenerator; -import com.sk89q.worldedit.function.generator.GenBase; -import com.sk89q.worldedit.function.generator.OreGen; -import com.sk89q.worldedit.function.generator.SchemGen; +import com.fastasyncworldedit.core.function.mask.BlockMaskBuilder; +import com.fastasyncworldedit.core.function.generator.GenBase; +import com.fastasyncworldedit.core.function.generator.OreGen; +import com.fastasyncworldedit.core.function.generator.SchemGen; import com.sk89q.worldedit.function.mask.BlockStateMask; import com.sk89q.worldedit.function.mask.BlockTypeMask; import com.sk89q.worldedit.function.mask.BoundedHeightMask; import com.sk89q.worldedit.function.mask.ExistingBlockMask; import com.sk89q.worldedit.function.mask.Mask; import com.sk89q.worldedit.function.mask.MaskIntersection; -import com.sk89q.worldedit.function.mask.MaskUnion; +import com.fastasyncworldedit.core.function.mask.MaskUnion; import com.sk89q.worldedit.function.mask.Masks; import com.sk89q.worldedit.function.mask.NoiseFilter2D; import com.sk89q.worldedit.function.mask.RegionMask; -import com.sk89q.worldedit.function.mask.SingleBlockTypeMask; -import com.sk89q.worldedit.function.mask.SolidBlockMask; -import com.sk89q.worldedit.function.mask.WallMakeMask; +import com.fastasyncworldedit.core.function.mask.SingleBlockTypeMask; +import com.fastasyncworldedit.core.function.mask.WallMakeMask; import com.sk89q.worldedit.function.operation.ChangeSetExecutor; import com.sk89q.worldedit.function.operation.ForwardExtentCopy; import com.sk89q.worldedit.function.operation.Operations; import com.sk89q.worldedit.function.pattern.Pattern; import com.sk89q.worldedit.function.pattern.WaterloggedRemover; import com.sk89q.worldedit.function.util.RegionOffset; -import com.sk89q.worldedit.function.visitor.DirectionalVisitor; +import com.fastasyncworldedit.core.function.visitor.DirectionalVisitor; import com.sk89q.worldedit.function.visitor.DownwardVisitor; import com.sk89q.worldedit.function.visitor.FlatRegionVisitor; import com.sk89q.worldedit.function.visitor.LayerVisitor; @@ -105,8 +104,8 @@ import com.sk89q.worldedit.internal.util.LogManagerCompat; import com.sk89q.worldedit.math.BlockVector2; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.math.MathUtils; -import com.sk89q.worldedit.math.MutableBlockVector2; -import com.sk89q.worldedit.math.MutableBlockVector3; +import com.fastasyncworldedit.core.math.MutableBlockVector2; +import com.fastasyncworldedit.core.math.MutableBlockVector3; import com.sk89q.worldedit.math.Vector2; import com.sk89q.worldedit.math.Vector3; import com.sk89q.worldedit.math.interpolation.Interpolation; @@ -174,7 +173,12 @@ import static com.sk89q.worldedit.regions.Regions.minimumBlockY; * using the {@link ChangeSetExtent}.

*/ @SuppressWarnings({"FieldCanBeLocal"}) +/* FAWE start - extends PassthroughExtent > implements Extent +Make sure, that all edits go thru it, else history etc. can have issues. +PassthroughExtent has some for loops that then delegate to methods editsession overrides. + */ public class EditSession extends PassthroughExtent implements AutoCloseable { +//FAWE end private static final Logger LOGGER = LogManagerCompat.getLogger(); @@ -215,24 +219,27 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { @SuppressWarnings("ProtectedField") protected final World world; + //FAWE start private final FaweLimit originalLimit; private final FaweLimit limit; private final Player player; private AbstractChangeSet changeSet; private boolean history; - private final MutableBlockVector3 mutablebv = new MutableBlockVector3(); + private final MutableBlockVector3 mutableBlockVector3 = new MutableBlockVector3(); private int changes = 0; private final BlockBag blockBag; private final Extent bypassHistory; - private Extent bypassAll; + private final Extent bypassAll; private final int minY; private final int maxY; + //FAWE end private final List watchdogExtents = new ArrayList<>(2); + //FAWE start private final Relighter relighter; private final boolean wnaMode; @@ -247,6 +254,7 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { @Nullable BlockBag blockBag, @Nullable EditSessionEvent event) { this(new EditSessionBuilder(world).player(player).limit(limit).changeSet(changeSet).allowedRegions(allowedRegions).autoQueue(autoQueue).fastmode(fastmode).checkMemory(checkMemory).combineStages(combineStages).blockBag(blockBag).eventBus(bus).event(event)); } + //FAWE end /** * Construct the object with a maximum number of blocks and a block bag. @@ -257,6 +265,7 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { * @param blockBag an optional {@link BlockBag} to use, otherwise null * @param event the event to call with the extent */ + //FAWE start - EditSessionEvent public EditSession(@NotNull EventBus eventBus, World world, int maxBlocks, @Nullable BlockBag blockBag, EditSessionEvent event) { this(eventBus, world, null, null, null, null, true, null, null, null, blockBag, event); } @@ -359,6 +368,7 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { boolean commitRequired() { return false; } + //FAWE end /** * Turns on specific features for a normal WorldEdit session, such as @@ -375,6 +385,7 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { * @param reorderMode The reorder mode */ public void setReorderMode(ReorderMode reorderMode) { + //FAWE start - we don't do physics so we don't need this switch (reorderMode) { case MULTI_STAGE: enableQueue(); @@ -386,6 +397,7 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { default: throw new UnsupportedOperationException("Not implemented: " + reorderMode); } + //FAWE end } /** @@ -457,7 +469,9 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { */ @Deprecated public boolean isQueueEnabled() { + //FAWE start - see reorder comment, we don't need this return true; + //FAWE end } /** @@ -468,7 +482,9 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { */ @Deprecated public void enableQueue() { + //FAWE start - see reorder comment, we don't need this super.enableQueue(); + //FAWE end } /** @@ -476,7 +492,9 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { */ @Deprecated public void disableQueue() { + //FAWE start - see reorder comment, we don't need this super.disableQueue(); + //FAWE end } /** @@ -485,14 +503,17 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { * @return mask, may be null */ public Mask getMask() { + //FAWE start - ExtendTraverser & MaskingExtents ExtentTraverser maskingExtent = new ExtentTraverser<>(getExtent()).find(MaskingExtent.class); return maskingExtent != null ? maskingExtent.get().getMask() : null; + //FAWE end } + //FAWE start /** - * Get the mask. + * Get the source mask. * - * @return mask, may be null + * @return source mask, may be null */ public Mask getSourceMask() { ExtentTraverser maskingExtent = new ExtentTraverser<>(getExtent()).find(SourceMaskExtent.class); @@ -518,7 +539,9 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { } return null; } + //FAWE end + //FAWE start - use source mast > mask /** * Set a mask. * @@ -558,7 +581,9 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { } setSourceMask(mask); } + //FAWE end + //FAWE start - use MaskingExtent & ExtentTraverser /** * Set a mask. * @@ -581,7 +606,9 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { addProcessor(new MaskingExtent(getExtent(), mask)); } } + //FAWE end + //FAWE start - ExtentTraverser /** * Get the {@link SurvivalModeExtent}. * @@ -597,7 +624,9 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { return survival; } } + //FAWE end + //FAWE start - our fastmode works different to upstream /** * Set whether fast mode is enabled. * @@ -610,7 +639,9 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { public void setFastMode(boolean enabled) { disableHistory(enabled); } + //FAWE end + //FAWE start - we don't use this (yet) /** * Set which block updates should occur. * @@ -624,7 +655,9 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { //Do nothing; TODO: SideEffects currently not fully implemented in FAWE. return SideEffectSet.defaults(); } + //FAWE end + //FAWE start /** * Disable history (or re-enable) * @@ -646,7 +679,9 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { } } } + //FAWE end + //FAWE start - See comment on setFastMode /** * Return fast mode status. * @@ -659,7 +694,9 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { public boolean hasFastMode() { return getChangeSet() == null; } + //FAWE end + //FAWE start - Don't use blockBagExtent /** * Get the {@link BlockBag} is used. * @@ -668,7 +705,9 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { public BlockBag getBlockBag() { return this.blockBag; } + //FAWE end + //FAWE start /** * Set a {@link BlockBag} to use. * @@ -678,7 +717,9 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { //Not Supported in FAWE throw new UnsupportedOperationException("TODO - this is never called anyway"); } + //FAWE end + //FAWE start @Override public String toString() { return super.toString() + ":" + getExtent(); @@ -730,7 +771,9 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { } return Collections.emptyMap(); } + //FAWE end + //FAWE start - We don't use this method /** * Returns chunk batching status. * @@ -739,6 +782,7 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { public boolean isBatchingChunks() { return false; } + //FAWE end /** * Enable or disable chunk batching. Disabling will flush the session. @@ -746,11 +790,13 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { * @param batchingChunks {@code true} to enable, {@code false} to disable */ public void setBatchingChunks(boolean batchingChunks) { + //FAWE start - altered by our lifecycle if (batchingChunks) { enableQueue(); } else { disableQueue(); } + //FAWE end } /** @@ -760,7 +806,9 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { * @see #setBatchingChunks(boolean) */ public void disableBuffering() { + //FAWE start - see comment on reorder mode disableQueue(); + //FAWE end } /** @@ -804,20 +852,24 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { @Override public boolean setBiome(BlockVector3 position, BiomeType biome) { + //FAWE start - use extent if (position.getY() < this.minY || position.getY() > this.maxY) { return false; } this.changes++; return this.getExtent().setBiome(position, biome); + //FAWE end } @Override public boolean setBiome(int x, int y, int z, BiomeType biome) { + //FAWE start - use extent if (y < this.minY || y > this.maxY) { return false; } this.changes++; return this.getExtent().setBiome(x, y, z, biome); + //FAWE end } /** @@ -830,10 +882,12 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { * @return height of highest block found or 'minY' */ public int getHighestTerrainBlock(int x, int z, int minY, int maxY) { + //FAWE start - check movement blocker for (int y = maxY; y >= minY; --y) { if (getBlock(x, y, z).getBlockType().getMaterial().isMovementBlocker()) { return y; } + //FAWE end } return minY; } @@ -850,7 +904,9 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { */ public int getHighestTerrainBlock(int x, int z, int minY, int maxY, Mask filter) { for (int y = maxY; y >= minY; --y) { - if (filter.test(mutablebv.setComponents(x, y, z))) { + //FAWE start - get position from mutable vector + if (filter.test(mutableBlockVector3.setComponents(x, y, z))) { + //FAWE end return y; } } @@ -858,9 +914,11 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { return minY; } + //FAWE start public BlockType getBlockType(int x, int y, int z) { return getBlock(x, y, z).getBlockType(); } + //FAWE end /** * Set a block, bypassing both history and block re-ordering. @@ -873,6 +931,7 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { */ @Deprecated public > boolean setBlock(BlockVector3 position, B block, Stage stage) throws WorldEditException { + //FAWE start - accumulate changes if (position.getBlockY() < this.minY || position.getBlockY() > this.maxY) { return false; } @@ -886,10 +945,12 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { case BEFORE_REORDER: return bypassAll.setBlock(position, block); } + //FAWE end throw new RuntimeException("New enum entry added that is unhandled here"); } + //FAWE start - see former comment /** * Set a block, bypassing both history and block re-ordering. * @@ -910,7 +971,9 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { throw new RuntimeException("Unexpected exception", e); } } + //FAWE end + //FAWE start - we use this /** * Set a block, bypassing history but still utilizing block re-ordering. * @@ -980,7 +1043,7 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { this.changes++; try { - BlockVector3 bv = mutablebv.setComponents(x, y, z); + BlockVector3 bv = mutableBlockVector3.setComponents(x, y, z); return pattern.apply(getExtent(), bv, bv); } catch (WorldEditException e) { throw new RuntimeException("Unexpected exception", e); @@ -1017,7 +1080,9 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { public int setBlocks(Region region, Pattern pattern) throws MaxChangedBlocksException { return this.changes = super.setBlocks(region, pattern); } + //FAWE end + //FAWE start /** * Restores all blocks to their initial state. * @@ -1025,6 +1090,7 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { */ public void undo(EditSession editSession) { UndoContext context = new UndoContext(); + //FAWE start - listen for inventory, flush & prepare changeset context.setExtent(editSession.bypassAll); ChangeSet changeSet = getChangeSet(); setChangeSet(null); @@ -1033,6 +1099,7 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { editSession.changes = 1; } + //FAWE start public void setBlocks(ChangeSet changeSet, ChangeSetExecutor.Type type) { final UndoContext context = new UndoContext(); context.setExtent(bypassAll); @@ -1040,6 +1107,7 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { flushQueue(); changes = 1; } + //FAWE end /** * Sets to new state. @@ -1048,6 +1116,7 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { */ public void redo(EditSession editSession) { UndoContext context = new UndoContext(); + //FAWE start - listen for inventory, flush & prepare changeset context.setExtent(editSession.bypassAll); ChangeSet changeSet = getChangeSet(); setChangeSet(null); @@ -1055,6 +1124,7 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { flushQueue(); editSession.changes = 1; } + //FAWE end /** * Get the number of changed blocks. @@ -1065,9 +1135,11 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { return getBlockChangeCount(); } + //FAWE start public void setSize(int size) { this.changes = size; } + //FAWE end /** * Closing an EditSession flushes its buffers to the world, and performs other @@ -1089,6 +1161,7 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { flushQueue(); } + //FAWE start /** * Finish off the queue. */ @@ -1222,6 +1295,7 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { Operations.completeBlindly(visitor); return this.changes = visitor.getAffected(); } + //FAWE end /** * Fills an area recursively in the X/Z directions. @@ -1279,7 +1353,9 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { // Execute Operations.completeLegacy(visitor); + //FAWE start return this.changes = visitor.getAffected(); + //FAWE end } /** @@ -1449,13 +1525,16 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { checkNotNull(region); checkNotNull(pattern); + //FAWE start int blocksChanged = 0; for (Region wall : CuboidRegion.makeCuboid(region).getWalls().getRegions()) { blocksChanged += setBlocks(wall, pattern); } return blocksChanged; + //FAWE end } + //FAWE start /** * Make the walls of the given region. The method by which the walls are found * may be inefficient, because there may not be an efficient implementation supported @@ -1477,6 +1556,7 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { } return changes; } + //FAWE end /** * Places a layer of blocks on top of ground blocks in the given region @@ -1510,10 +1590,12 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { BlockReplace replace = new BlockReplace(this, pattern); RegionOffset offset = new RegionOffset(BlockVector3.UNIT_Y, replace); + //FAWE start int minY = region.getMinimumPoint().getBlockY(); int maxY = Math.min(getMaximumPoint().getBlockY(), region.getMaximumPoint().getBlockY() + 1); SurfaceRegionFunction surface = new SurfaceRegionFunction(this, offset, minY, maxY); FlatRegionVisitor visitor = new FlatRegionVisitor(asFlatRegion(region), surface); + //FAWE end Operations.completeBlindly(visitor); return this.changes = visitor.getAffected(); } @@ -1551,6 +1633,7 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { return stackCuboidRegion(region, dir, count, true, false, copyAir ? null : new ExistingBlockMask(this)); } + //FAWE start /** * Stack a cuboid region. * @@ -1590,6 +1673,7 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { Operations.completeLegacy(copy); return this.changes = copy.getAffected(); } + //FAWE end /** * Move the blocks in a region a certain direction. @@ -1605,11 +1689,13 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { * @throws MaxChangedBlocksException thrown if too many blocks are changed */ public int moveRegion(Region region, BlockVector3 dir, int distance, boolean copyAir, boolean moveEntities, boolean copyBiomes, Pattern replacement) throws MaxChangedBlocksException { + //FAWE start Mask mask = null; if (!copyAir) { mask = new ExistingBlockMask(this); } return moveRegion(region, dir, distance, moveEntities, copyBiomes, mask, replacement); + //FAWE end } /** @@ -1633,6 +1719,7 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { checkArgument(distance >= 1, "distance >= 1 required"); checkArgument(!copyBiomes || region instanceof FlatRegion, "can't copy biomes from non-flat region"); + //FAWE start - add up distance BlockVector3 to = region.getMinimumPoint().add(dir.multiply(distance)); final BlockVector3 displace = dir.multiply(distance); @@ -1673,6 +1760,7 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { } Operations.completeBlindly(copy); return this.changes = copy.getAffected(); + //FAWE end } /** @@ -1729,22 +1817,30 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { checkNotNull(origin); checkArgument(radius >= 0, "radius >= 0 required"); + //FAWE start - liquidmask Mask liquidMask; if (plants) { liquidMask = new BlockTypeMask(this, BlockTypes.LAVA, BlockTypes.WATER, - BlockTypes.KELP_PLANT, BlockTypes.KELP, BlockTypes.SEAGRASS, BlockTypes.TALL_SEAGRASS); + BlockTypes.KELP_PLANT, BlockTypes.KELP, BlockTypes.SEAGRASS, BlockTypes.TALL_SEAGRASS); } else { - liquidMask = new BlockTypeMask(this, BlockTypes.LAVA, BlockTypes.WATER); + liquidMask = new BlockMaskBuilder() + .addTypes(BlockTypes.WATER, BlockTypes.LAVA) + .build(this); } + //FAWE end if (waterlogged) { Map stateMap = new HashMap<>(); stateMap.put("waterlogged", "true"); + //FAWE start liquidMask = new MaskUnion(liquidMask, new BlockStateMask(this, stateMap, true)); + //FAWE end } Mask mask = new MaskIntersection( - new BoundedHeightMask(0, getWorld().getMaxY()), + new BoundedHeightMask(getWorld().getMinY(), getWorld().getMaxY()), new RegionMask(new EllipsoidRegion(null, origin, Vector3.at(radius, radius, radius))), + //FAWE start liquidMask); + //FAWE end BlockReplace replace; if (waterlogged) { replace = new BlockReplace(this, new WaterloggedRemover(this)); @@ -1762,7 +1858,9 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { Operations.completeLegacy(visitor); + //FAWE start return this.changes = visitor.getAffected(); + //FAWE end } /** @@ -1786,7 +1884,7 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { // There are boundaries that the routine needs to stay in Mask mask = new MaskIntersection( - new BoundedHeightMask(0, Math.min(origin.getBlockY(), getWorld().getMaxY())), + new BoundedHeightMask(getWorld().getMinY(), Math.min(origin.getBlockY(), getWorld().getMaxY())), new RegionMask(new EllipsoidRegion(null, origin, Vector3.at(radius, radius, radius))), blockMask ); @@ -1837,34 +1935,43 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { return makeCylinder(pos, block, radiusX, radiusZ, height, 0, filled); } + //FAWE start public int makeHollowCylinder(BlockVector3 pos, final Pattern block, double radiusX, double radiusZ, int height, double thickness) throws MaxChangedBlocksException { return makeCylinder(pos, block, radiusX, radiusZ, height, thickness, false); } + //FAWE end - private int makeCylinder(BlockVector3 pos, Pattern block, double radiusX, double radiusZ, int height, double thickness, boolean filled) throws MaxChangedBlocksException { + public int makeCylinder(BlockVector3 pos, Pattern block, double radiusX, double radiusZ, int height, double thickness, boolean filled) throws MaxChangedBlocksException { radiusX += 0.5; radiusZ += 0.5; - MutableBlockVector3 posv = new MutableBlockVector3(pos); + //FAWE start + MutableBlockVector3 mutableBlockVector3 = new MutableBlockVector3(pos); + //FAWE end if (height == 0) { return 0; } else if (height < 0) { height = -height; - posv.mutY(posv.getY() - height); + //FAWE start + mutableBlockVector3.mutY(mutableBlockVector3.getY() - height); + //FAWE end } - if (posv.getBlockY() < 0) { - posv.mutY(0); - } else if (posv.getBlockY() + height - 1 > maxY) { - height = maxY - posv.getBlockY() + 1; + //FAWE start + if (mutableBlockVector3.getBlockY() < getWorld().getMinY()) { + mutableBlockVector3.mutY(world.getMinY()); + } else if (mutableBlockVector3.getBlockY() + height - 1 > maxY) { + height = maxY - mutableBlockVector3.getBlockY() + 1; } + //FAWE end final double invRadiusX = 1 / radiusX; final double invRadiusZ = 1 / radiusZ; - int px = posv.getBlockX(); - int py = posv.getBlockY(); - int pz = posv.getBlockZ(); + //FAWE start + int px = mutableBlockVector3.getBlockX(); + int py = mutableBlockVector3.getBlockY(); + int pz = mutableBlockVector3.getBlockZ(); MutableBlockVector3 mutable = new MutableBlockVector3(); final int ceilRadiusX = (int) Math.ceil(radiusX); @@ -1914,6 +2021,7 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { } } } else { + //FAWE end forX: for (int x = 0; x <= ceilRadiusX; ++x) { final double xn = nextXn; nextXn = (x + 1) * invRadiusX; @@ -1938,16 +2046,20 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { } for (int y = 0; y < height; ++y) { + //FAWE start - mutable this.setBlock(mutable.setComponents(px + x, py + y, pz + z), block); this.setBlock(mutable.setComponents(px - x, py + y, pz + z), block); this.setBlock(mutable.setComponents(px + x, py + y, pz - z), block); this.setBlock(mutable.setComponents(px - x, py + y, pz - z), block); + //FAWE end } } } } + //FAWE start return this.changes; + //FAWE end } /** @@ -1965,6 +2077,7 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { return moveRegion(region, dir, distance, true, false, copyAir ? new ExistingBlockMask(this) : null, replacement); } + //FAWE start public int makeCircle(BlockVector3 pos, final Pattern block, double radiusX, double radiusY, double radiusZ, boolean filled, Vector3 normal) throws MaxChangedBlocksException { radiusX += 0.5; radiusY += 0.5; @@ -2061,6 +2174,7 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { return changes; } + //FAWE end /** * Makes a sphere. @@ -2105,7 +2219,9 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { final int ceilRadiusY = (int) Math.ceil(radiusY); final int ceilRadiusZ = (int) Math.ceil(radiusZ); + //FAWE start int yy; + //FAWE end double nextXn = 0; forX: for (int x = 0; x <= ceilRadiusX; ++x) { @@ -2141,6 +2257,7 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { continue; } } + //FAWE start yy = py + y; if (yy <= maxY) { this.setBlock(px + x, py + y, pz + z, block); @@ -2171,6 +2288,7 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { } return changes; + //FAWE end } /** @@ -2184,6 +2302,7 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { * @throws MaxChangedBlocksException thrown if too many blocks are changed */ public int makePyramid(BlockVector3 position, Pattern block, int size, boolean filled) throws MaxChangedBlocksException { + //FAWE start - abbreviated logic int bx = position.getX(); int by = position.getY(); int bz = position.getZ(); @@ -2206,6 +2325,7 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { } return changes; + //FAWE end } /** @@ -2266,6 +2386,7 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { ++affected; } } else if (id == BlockTypes.SNOW) { + //FAWE start if (setBlock(pt, air)) { if (y > 0 ) { BlockState block = getBlock(below); @@ -2275,6 +2396,7 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { } } } + //FAWE end ++affected; } } else if (id.getMaterial().isAir()) { @@ -2419,6 +2541,7 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { return makePumpkinPatches(position, apothem, 0.02); } + //FAWE start - support density public int makePumpkinPatches(BlockVector3 position, int apothem, double density) throws MaxChangedBlocksException { // We want to generate pumpkins GardenPatchGenerator generator = new GardenPatchGenerator(this); @@ -2436,6 +2559,7 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { Operations.completeLegacy(visitor); return this.changes = ground.getAffected(); } + //FAWE end /** * Makes a forest. @@ -2476,6 +2600,7 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { * @return the results */ public List> getBlockDistribution(Region region, boolean separateStates) { + //FAWE start - get distr if (separateStates) { return getBlockDistributionWithData(region); } @@ -2484,6 +2609,7 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { for (Countable count : normalDistr) { distribution.add(new Countable<>(count.getID().getDefaultState(), count.getAmount())); } + //FAWE end return distribution; } @@ -2631,41 +2757,40 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { final WorldEditExpressionEnvironment environment = new WorldEditExpressionEnvironment(this, unit, zero); expression.setEnvironment(environment); + //FAWE start final Vector3 zero2 = zero.add(0.5, 0.5, 0.5); - RegionVisitor visitor = new RegionVisitor(region, new RegionFunction() { + RegionVisitor visitor = new RegionVisitor(region, position -> { + try { + // offset, scale + final Vector3 scaled = position.toVector3().subtract(zero).divide(unit); - @Override - public boolean apply(BlockVector3 position) throws WorldEditException { - try { - // offset, scale - final Vector3 scaled = position.toVector3().subtract(zero).divide(unit); + // transform + expression.evaluate(new double[]{scaled.getX(), scaled.getY(), scaled.getZ()}, timeout); + int xv = (int) (x.getValue() * unit.getX() + zero2.getX()); + int yv = (int) (y.getValue() * unit.getY() + zero2.getY()); + int zv = (int) (z.getValue() * unit.getZ() + zero2.getZ()); - // transform - expression.evaluate(new double[]{scaled.getX(), scaled.getY(), scaled.getZ()}, timeout); - int xv = (int) (x.getValue() * unit.getX() + zero2.getX()); - int yv = (int) (y.getValue() * unit.getY() + zero2.getY()); - int zv = (int) (z.getValue() * unit.getZ() + zero2.getZ()); - - BlockState get; - if (yv >= 0 && yv < 256) { - get = getBlock(xv, yv, zv); - } else { - get = BlockTypes.AIR.getDefaultState(); - } - - // read block from world - return setBlock(position, get); - } catch (EvaluationException e) { - throw new RuntimeException(e); + BlockState get; + if (yv >= 0 && yv < 256) { + get = getBlock(xv, yv, zv); + } else { + get = BlockTypes.AIR.getDefaultState(); } + + // read block from world + return setBlock(position, get); + } catch (EvaluationException e) { + throw new RuntimeException(e); } }); Operations.completeBlindly(visitor); changes += visitor.getAffected(); return changes; + //FAWE end } + //FAWE start - respect Mask /** * Hollows out the region (Semi-well-defined for non-cuboid selections). * @@ -2676,10 +2801,6 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { * @return number of blocks affected * @throws MaxChangedBlocksException thrown if too many blocks are changed */ - public int hollowOutRegion(Region region, int thickness, Pattern pattern) throws MaxChangedBlocksException { - return hollowOutRegion(region, thickness, pattern, new SolidBlockMask(this)); - } - public int hollowOutRegion(Region region, int thickness, Pattern pattern, Mask mask) { try { final Set outside = new LocalBlockVectorSet(); @@ -2747,6 +2868,7 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { } return changes; } + //FAWE end public int drawLine(Pattern pattern, BlockVector3 pos1, BlockVector3 pos2, double radius, boolean filled) throws MaxChangedBlocksException { return drawLine(pattern, pos1, pos2, radius, filled, false); @@ -2770,7 +2892,9 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { throws MaxChangedBlocksException { LocalBlockVectorSet vset = new LocalBlockVectorSet(); + //FAWE start boolean notdrawn = true; + //FAWE end int x1 = pos1.getBlockX(); int y1 = pos1.getBlockY(); @@ -2787,11 +2911,15 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { if (dx + dy + dz == 0) { vset.add(BlockVector3.at(tipx, tipy, tipz)); + //FAWE start notdrawn = false; + //FAWE end } int dMax = Math.max(Math.max(dx, dy), dz); + //FAWE start - notdrawn if (dMax == dx && notdrawn) { + //FAWE end for (int domstep = 0; domstep <= dx; domstep++) { tipx = x1 + domstep * (x2 - x1 > 0 ? 1 : -1); tipy = (int) Math.round(y1 + domstep * (double) dy / (double) dx * (y2 - y1 > 0 ? 1 : -1)); @@ -2799,7 +2927,9 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { vset.add(BlockVector3.at(tipx, tipy, tipz)); } + //FAWE start - notdrawn } else if (dMax == dy && notdrawn) { + //FAWE end for (int domstep = 0; domstep <= dy; domstep++) { tipy = y1 + domstep * (y2 - y1 > 0 ? 1 : -1); tipx = (int) Math.round(x1 + domstep * (double) dx / (double) dy * (x2 - x1 > 0 ? 1 : -1)); @@ -2807,7 +2937,9 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { vset.add(BlockVector3.at(tipx, tipy, tipz)); } + //FAWE start - notdrawn } else if (dMax == dz && notdrawn) { + //FAWE end for (int domstep = 0; domstep <= dz; domstep++) { tipz = z1 + domstep * (z2 - z1 > 0 ? 1 : -1); tipy = (int) Math.round(y1 + domstep * (double) dy / (double) dz * (y2 - y1 > 0 ? 1 : -1)); @@ -2816,6 +2948,7 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { vset.add(BlockVector3.at(tipx, tipy, tipz)); } } + //FAWE start - set BV3 Set newVset; if (flat) { newVset = getStretched(vset, radius); @@ -2829,6 +2962,7 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { } } return this.changes += setBlocks(newVset, pattern); + //FAWE end } /** @@ -2983,6 +3117,7 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { return returnset; } + //FAWE start public static Set getStretched(Set vset, double radius) { if (radius < 1) { return vset; @@ -3021,6 +3156,7 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { } return returnset; } + //FAWE end public Set getHollowed(Set vset) { final Set returnset = new LocalBlockVectorSet(); @@ -3126,6 +3262,7 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { Direction.DOWN.toBlockVector(), }; + //FAWE start public boolean regenerate(Region region) { return regenerate(region, this); } @@ -3298,4 +3435,5 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { faweClipboard.setOrigin(region.getMinimumPoint()); return faweClipboard; } + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/LocalConfiguration.java b/worldedit-core/src/main/java/com/sk89q/worldedit/LocalConfiguration.java index fdc54a887..41b96be64 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/LocalConfiguration.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/LocalConfiguration.java @@ -23,7 +23,7 @@ import com.google.common.collect.Lists; import com.sk89q.worldedit.extension.input.InputParseException; import com.sk89q.worldedit.extent.NullExtent; import com.sk89q.worldedit.function.mask.BlockMask; -import com.sk89q.worldedit.function.mask.BlockMaskBuilder; +import com.fastasyncworldedit.core.function.mask.BlockMaskBuilder; import com.sk89q.worldedit.internal.util.LogManagerCompat; import com.sk89q.worldedit.util.formatting.component.TextUtils; import com.sk89q.worldedit.util.io.file.ArchiveNioSupports; @@ -101,7 +101,7 @@ public abstract class LocalConfiguration { protected String[] getDefaultDisallowedBlocks() { List blockTypes = Lists.newArrayList( - /* + /* FAWE start BlockTypes.OAK_SAPLING, BlockTypes.JUNGLE_SAPLING, BlockTypes.DARK_OAK_SAPLING, @@ -163,7 +163,7 @@ public abstract class LocalConfiguration { BlockTypes.SUGAR_CANE, // ores and stuff BlockTypes.BEDROCK - */ + FAWE end*/ ); return blockTypes.stream().filter(Objects::nonNull).map(BlockType::getId).toArray(String[]::new); } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/LocalSession.java b/worldedit-core/src/main/java/com/sk89q/worldedit/LocalSession.java index 7e791fab8..8cc0bc0a7 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/LocalSession.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/LocalSession.java @@ -20,14 +20,14 @@ package com.sk89q.worldedit; import com.fastasyncworldedit.core.Fawe; +import com.fastasyncworldedit.core.configuration.Caption; import com.fastasyncworldedit.core.configuration.Settings; -import com.fastasyncworldedit.core.object.FaweInputStream; +import com.fastasyncworldedit.core.internal.io.FaweInputStream; import com.fastasyncworldedit.core.object.FaweLimit; -import com.fastasyncworldedit.core.object.FaweOutputStream; -import com.fastasyncworldedit.core.object.changeset.DiskStorageHistory; -import com.fastasyncworldedit.core.object.clipboard.MultiClipboardHolder; -import com.fastasyncworldedit.core.object.collection.SparseBitSet; -import com.fastasyncworldedit.core.object.extent.ResettableExtent; +import com.fastasyncworldedit.core.internal.io.FaweOutputStream; +import com.fastasyncworldedit.core.history.DiskStorageHistory; +import com.fastasyncworldedit.core.extent.clipboard.MultiClipboardHolder; +import com.fastasyncworldedit.core.extent.ResettableExtent; import com.fastasyncworldedit.core.util.BrushCache; import com.fastasyncworldedit.core.util.EditSessionBuilder; import com.fastasyncworldedit.core.util.MainUtil; @@ -76,6 +76,7 @@ import com.sk89q.worldedit.world.block.BlockState; import com.sk89q.worldedit.world.item.ItemType; import com.sk89q.worldedit.world.item.ItemTypes; import com.sk89q.worldedit.world.snapshot.experimental.Snapshot; +import com.zaxxer.sparsebits.SparseBitSet; import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; import java.io.File; @@ -85,11 +86,9 @@ import java.io.IOException; import java.time.ZoneId; import java.util.Calendar; import java.util.Collections; -import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.ListIterator; -import java.util.Map; import java.util.Objects; import java.util.TimeZone; import java.util.UUID; @@ -122,6 +121,7 @@ public class LocalSession implements TextureHolder { // Session related private transient RegionSelector selector = new CuboidRegionSelector(); private transient boolean placeAtPos1 = false; + //FAWE start private final transient List history = Collections.synchronizedList(new LinkedList<>() { @Override public Object get(int index) { @@ -139,12 +139,17 @@ public class LocalSession implements TextureHolder { } }); private transient volatile Integer historyNegativeIndex; + private transient final Lock historyWriteLock = new ReentrantLock(true); + private final transient Int2ObjectOpenHashMap tools = new Int2ObjectOpenHashMap<>(0); + private transient Mask sourceMask; + private transient TextureUtil texture; + private transient ResettableExtent transform = null; + private transient World currentWorld; + //FAWE end private transient ClipboardHolder clipboard; private transient final Object clipboardLock = new Object(); - private transient final Lock historyWriteLock = new ReentrantLock(true); private transient boolean superPickaxe = false; private transient BlockTool pickaxeMode = new SinglePickaxe(); - private final transient Int2ObjectOpenHashMap tools = new Int2ObjectOpenHashMap<>(0); private transient int maxBlocksChanged = -1; private transient int maxTimeoutTime; private transient boolean useInventory; @@ -152,11 +157,7 @@ public class LocalSession implements TextureHolder { private transient Snapshot snapshotExperimental; private transient SideEffectSet sideEffectSet = SideEffectSet.defaults(); private transient Mask mask; - private transient Mask sourceMask; - private transient TextureUtil texture; - private transient ResettableExtent transform = null; private transient ZoneId timezone = ZoneId.systemDefault(); - private transient World currentWorld; private transient UUID uuid; private transient volatile long historySize = 0; @@ -174,7 +175,6 @@ public class LocalSession implements TextureHolder { private boolean useServerCUI = false; // Save this to not annoy players. private ItemType wandItem; private ItemType navWandItem; - private Map macros = new HashMap<>(); /** * Construct the object. @@ -213,6 +213,7 @@ public class LocalSession implements TextureHolder { } } + //FAWE start public boolean loadSessionHistoryFromDisk(UUID uuid, World world) { if (world == null || uuid == null) { return false; @@ -307,19 +308,7 @@ public class LocalSession implements TextureHolder { file.delete(); } } - - public Map getMacros() { - return Collections.unmodifiableMap(this.macros); - } - - public void setMacro(String key, String value) { - this.macros.put(key, value); - setDirty(); - } - - public String getMacro(String key) { - return this.macros.get(key); - } + //FAWE end /** * Get whether this session is "dirty" and has changes that needs to @@ -338,6 +327,7 @@ public class LocalSession implements TextureHolder { dirty.set(true); } + //FAWE start public int getHistoryIndex() { return history.size() - 1 - (historyNegativeIndex == null ? 0 : historyNegativeIndex); } @@ -360,6 +350,7 @@ public class LocalSession implements TextureHolder { } return false; } + //FAWE end /** * Get whether this session is "dirty" and has changes that needs to @@ -395,9 +386,11 @@ public class LocalSession implements TextureHolder { */ public void clearHistory() { history.clear(); + //FAWE start historyNegativeIndex = 0; historySize = 0; currentWorld = null; + //FAWE end } /** @@ -414,6 +407,7 @@ public class LocalSession implements TextureHolder { return; } + //FAWE start Player player = editSession.getPlayer(); int limit = player == null ? Integer.MAX_VALUE : player.getLimit().MAX_HISTORY; remember(editSession, true, limit); @@ -552,6 +546,7 @@ public class LocalSession implements TextureHolder { historyWriteLock.unlock(); } } + //FAWE end /** * Performs an undo. @@ -562,6 +557,7 @@ public class LocalSession implements TextureHolder { */ public EditSession undo(@Nullable BlockBag newBlockBag, Actor actor) { checkNotNull(actor); + //FAWE start - use our logic World world = ((Player) actor).getWorldForEditing(); loadSessionHistoryFromDisk(actor.getUniqueId(), world); if (getHistoryNegativeIndex() < history.size()) { @@ -590,6 +586,7 @@ public class LocalSession implements TextureHolder { } return null; } + //FAWE end } /** @@ -599,6 +596,7 @@ public class LocalSession implements TextureHolder { * @param actor the actor * @return whether anything was redone */ + //FAWE start - use our logic public EditSession redo(@Nullable BlockBag newBlockBag, Actor actor) { checkNotNull(actor); World world = ((Player) actor).getWorldForEditing(); @@ -620,6 +618,7 @@ public class LocalSession implements TextureHolder { return newEditSession; } } + //FAWE end return null; } @@ -775,14 +774,17 @@ public class LocalSession implements TextureHolder { * @throws EmptyClipboardException thrown if no clipboard is set */ public ClipboardHolder getClipboard() throws EmptyClipboardException { + //FAWE start synchronized (clipboardLock) { if (clipboard == null) { throw new EmptyClipboardException(); } + //FAWE end return clipboard; } } + //FAWE start @Nullable public ClipboardHolder getExistingClipboard() { synchronized (clipboardLock) { @@ -810,6 +812,7 @@ public class LocalSession implements TextureHolder { } setClipboard(multi); } + //FAWE end /** * Sets the clipboard. @@ -819,6 +822,7 @@ public class LocalSession implements TextureHolder { * @param clipboard the clipboard, or null if the clipboard is to be cleared */ public void setClipboard(@Nullable ClipboardHolder clipboard) { + //FAWE start synchronized (clipboardLock) { if (this.clipboard == clipboard) { return; @@ -829,6 +833,7 @@ public class LocalSession implements TextureHolder { this.clipboard.close(); } } + //FAWE end this.clipboard = clipboard; } } @@ -967,7 +972,9 @@ public class LocalSession implements TextureHolder { @Nullable public BlockBag getBlockBag(Player player) { checkNotNull(player); + //FAWE start - inventory mode if (!useInventory && player.getLimit().INVENTORY_MODE == 0) { + //FAWE end return null; } return player.getInventoryBlockBag(); @@ -1044,6 +1051,7 @@ public class LocalSession implements TextureHolder { } } + //FAWE start @Nullable public Tool getTool(Player player) { loadDefaults(player, false); @@ -1087,7 +1095,9 @@ public class LocalSession implements TextureHolder { } } } + //FAWE end + //FAWE start - see deprecation note /** * Get the brush tool assigned to the item. If there is no tool assigned * or the tool is not assigned, the slot will be replaced with the @@ -1114,7 +1124,7 @@ public class LocalSession implements TextureHolder { public BrushTool getBrushTool(BaseItem item, Player player, boolean create) throws InvalidToolBindException { if (item.getType().hasBlockType()) { - throw new InvalidToolBindException(item.getType(), "Blocks can't be used"); + throw new InvalidToolBindException(item.getType(), Caption.of("worldedit.error.blocks-cant-be-used")); } Tool tool = getTool(item, player); if (!(tool instanceof BrushTool)) { @@ -1128,7 +1138,9 @@ public class LocalSession implements TextureHolder { return (BrushTool) tool; } + //FAWE end + //FAWE start - see note of getBrushTool /** * Set the tool. * @@ -1138,7 +1150,7 @@ public class LocalSession implements TextureHolder { */ public void setTool(ItemType item, @Nullable Tool tool) throws InvalidToolBindException { if (item.hasBlockType()) { - throw new InvalidToolBindException(item, "Blocks can't be used"); + throw new InvalidToolBindException(item, Caption.of("worldedit.error.blocks-cant-be-used")); } if (tool instanceof SelectionWand) { changeTool(this.wandItem, this.wandItem = item, tool); @@ -1175,7 +1187,7 @@ public class LocalSession implements TextureHolder { public void setTool(BaseItem item, @Nullable Tool tool, Player player) throws InvalidToolBindException { ItemType type = item.getType(); if (type.hasBlockType() && type.getBlockType().getMaterial().isAir()) { - throw new InvalidToolBindException(type, "Blocks can't be used"); + throw new InvalidToolBindException(type, Caption.of("worldedit.error.blocks-cant-be-used")); } else if (tool instanceof SelectionWand) { changeTool(this.wandItem, this.wandItem = item.getType(), tool); setDirty(); @@ -1208,6 +1220,7 @@ public class LocalSession implements TextureHolder { } } } + //FAWE end /** * Returns whether inventory usage is enabled for this session. @@ -1380,7 +1393,9 @@ public class LocalSession implements TextureHolder { public void describeCUI(Actor actor) { checkNotNull(actor); + //FAWE start // TODO preload + //FAWE end if (!hasCUISupport) { return; @@ -1518,6 +1533,7 @@ public class LocalSession implements TextureHolder { } // Create an edit session + //FAWE start - we don't use the edit session builder yet EditSession editSession; EditSessionBuilder builder = new EditSessionBuilder(world); if (actor.isPlayer() && actor instanceof Player) { @@ -1543,6 +1559,7 @@ public class LocalSession implements TextureHolder { return editSession; } + //FAWE end private void prepareEditingExtents(EditSession editSession, Actor actor) { editSession.setSideEffectApplier(sideEffectSet); @@ -1617,6 +1634,7 @@ public class LocalSession implements TextureHolder { return mask; } + //FAWE start /** * Get the mask. * @@ -1625,6 +1643,7 @@ public class LocalSession implements TextureHolder { public Mask getSourceMask() { return sourceMask; } + //FAWE end /** * Set a mask. @@ -1635,6 +1654,7 @@ public class LocalSession implements TextureHolder { this.mask = mask; } + //FAWE start /** * Set a mask. * @@ -1662,6 +1682,7 @@ public class LocalSession implements TextureHolder { } return tmp; } + //FAWE end /** * Get the preferred wand item for this user, or {@code null} to use the default diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/TracedEditSession.java b/worldedit-core/src/main/java/com/sk89q/worldedit/TracedEditSession.java index 7127e6d76..256504cd3 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/TracedEditSession.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/TracedEditSession.java @@ -24,7 +24,10 @@ import com.sk89q.worldedit.extent.inventory.BlockBag; import com.sk89q.worldedit.util.eventbus.EventBus; import com.sk89q.worldedit.world.World; -public class TracedEditSession extends EditSession { +/** + * Internal use only. + */ +class TracedEditSession extends EditSession { TracedEditSession(EventBus eventBus, World world, int maxBlocks, BlockBag blockBag, EditSessionEvent event) { super(eventBus, world, maxBlocks, blockBag, event); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/WorldEdit.java b/worldedit-core/src/main/java/com/sk89q/worldedit/WorldEdit.java index e4cbe67af..c87d35a15 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/WorldEdit.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/WorldEdit.java @@ -59,7 +59,6 @@ import com.sk89q.worldedit.util.concurrency.EvenMoreExecutors; import com.sk89q.worldedit.util.concurrency.LazyReference; import com.sk89q.worldedit.util.eventbus.EventBus; import com.sk89q.worldedit.util.formatting.text.TextComponent; -import com.sk89q.worldedit.util.formatting.text.format.TextColor; import com.sk89q.worldedit.util.io.file.FileSelectionAbortedException; import com.sk89q.worldedit.util.io.file.FilenameException; import com.sk89q.worldedit.util.io.file.FilenameResolutionException; @@ -123,10 +122,12 @@ public final class WorldEdit { private final SessionManager sessions = new SessionManager(this); private final ListeningExecutorService executorService = MoreExecutors.listeningDecorator(EvenMoreExecutors.newBoundedCachedThreadPool(0, 1, 20, "WorldEdit Task Executor - %s")); private final Supervisor supervisor = new SimpleSupervisor(); + //FAWE start private final LazyReference translationManager = LazyReference.from(() -> new TranslationManager( WorldEdit.getInstance().getPlatformManager().queryCapability(Capability.CONFIGURATION).getResourceLoader() )); + //FAWE end private final BlockFactory blockFactory = new BlockFactory(this); private final ItemFactory itemFactory = new ItemFactory(this); @@ -423,6 +424,7 @@ public final class WorldEdit { } } + //FAWE start public void checkMaxBrushRadius(Expression radius) throws MaxBrushRadiusException { double val = radius.evaluate(); checkArgument(val >= 0, "Radius must be a positive number."); @@ -432,6 +434,7 @@ public final class WorldEdit { } } } + //FAWE end /** * Get a file relative to the defined working directory. If the specified @@ -462,7 +465,7 @@ public final class WorldEdit { return getConfiguration().getWorkingDirectoryPath().resolve(path); } - //FAWE + //FAWE start /** * Gets the path to the folder in which schematics are saved by default * @@ -471,6 +474,7 @@ public final class WorldEdit { public Path getSchematicsFolderPath() { return getWorkingDirectoryPath(getConfiguration().saveDir); } + //FAWE end /** * Get the direction vector for a player's direction. @@ -782,7 +786,7 @@ public final class WorldEdit { logger.warn("Failed to execute script", e); } finally { for (EditSession editSession : scriptContext.getEditSessions()) { - editSession.flushSession(); + editSession.close(); session.remember(editSession); } } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/WorldEditException.java b/worldedit-core/src/main/java/com/sk89q/worldedit/WorldEditException.java index 503d40e43..e21b72515 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/WorldEditException.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/WorldEditException.java @@ -28,7 +28,9 @@ import java.util.Locale; /** * Parent for all WorldEdit exceptions. */ +//FAWE start - RuntimeException > Exception public abstract class WorldEditException extends RuntimeException { +//FAWE end private final Component message; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/blocks/BaseItem.java b/worldedit-core/src/main/java/com/sk89q/worldedit/blocks/BaseItem.java index 8c1a01e54..dfaa5a117 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/blocks/BaseItem.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/blocks/BaseItem.java @@ -42,7 +42,9 @@ public class BaseItem implements NbtValued { private ItemType itemType; @Nullable + //FAWE start - Use LR & CBT over CompoundTag private LazyReference nbtData; + //FAWE end /** * Construct the object. @@ -54,6 +56,25 @@ public class BaseItem implements NbtValued { this.itemType = itemType; } + /** + * Get the type of item. + * + * @return the type + */ + public ItemType getType() { + return this.itemType; + } + + /** + * Set the type of the item. + * + * @param itemType The type to set + */ + public void setType(ItemType itemType) { + this.itemType = itemType; + } + + //FAWE start /** * Construct the object. * @@ -83,24 +104,6 @@ public class BaseItem implements NbtValued { return null; } - /** - * Get the type of item. - * - * @return the type - */ - public ItemType getType() { - return this.itemType; - } - - /** - * Set the type of the item. - * - * @param itemType The type to set - */ - public void setType(ItemType itemType) { - this.itemType = itemType; - } - @Nullable @Override public LazyReference getNbtReference() { @@ -126,4 +129,5 @@ public class BaseItem implements NbtValued { return getType().getId() + nbtString; } + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/blocks/BaseItemStack.java b/worldedit-core/src/main/java/com/sk89q/worldedit/blocks/BaseItemStack.java index 8d9e4ab07..fd835d6a9 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/blocks/BaseItemStack.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/blocks/BaseItemStack.java @@ -70,18 +70,6 @@ public class BaseItemStack extends BaseItem { this.amount = amount; } - /** - * Construct the object. - * - * @param id The item type - * @param tag Tag value - * @param amount amount in the stack - */ - public BaseItemStack(ItemType id, LazyReference tag, int amount) { - super(id, tag); - this.amount = amount; - } - /** * Get the number of items in the stack. * @@ -104,4 +92,18 @@ public class BaseItemStack extends BaseItem { return WorldEdit.getInstance().getPlatformManager().queryCapability(Capability.GAME_HOOKS) .getRegistries().getItemRegistry().getRichName(this); } + + //FAWE start + /** + * Construct the object. + * + * @param id The item type + * @param tag Tag value + * @param amount amount in the stack + */ + public BaseItemStack(ItemType id, LazyReference tag, int amount) { + super(id, tag); + this.amount = amount; + } + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/blocks/TileEntityBlock.java b/worldedit-core/src/main/java/com/sk89q/worldedit/blocks/TileEntityBlock.java index ec2608876..8abaacee2 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/blocks/TileEntityBlock.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/blocks/TileEntityBlock.java @@ -37,6 +37,7 @@ public interface TileEntityBlock extends NbtValued { * * @return tile entity ID, non-null string */ + //FAWE start - Handle method here default String getNbtId() { CompoundTag nbtData = getNbtData(); if (nbtData == null) { @@ -48,6 +49,7 @@ public interface TileEntityBlock extends NbtValued { } else { return ""; } + //FAWE end } } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/ApplyBrushCommands.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/ApplyBrushCommands.java index c9c6cedc5..a7a329ef2 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/ApplyBrushCommands.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/ApplyBrushCommands.java @@ -34,7 +34,7 @@ import com.sk89q.worldedit.command.util.PermissionCondition; import com.sk89q.worldedit.entity.Player; import com.sk89q.worldedit.function.Contextual; import com.sk89q.worldedit.function.RegionFunction; -import com.sk89q.worldedit.function.factory.Apply; +import com.sk89q.worldedit.function.factory.ApplyRegion; import com.sk89q.worldedit.function.pattern.Pattern; import com.sk89q.worldedit.internal.annotation.Direction; import com.sk89q.worldedit.internal.command.CommandRegistrationHandler; @@ -97,7 +97,7 @@ public class ApplyBrushCommands { double radius = requireNonNull(RADIUS.value(parameters).asSingle(double.class)); RegionFactory regionFactory = REGION_FACTORY.value(parameters).asSingle(RegionFactory.class); BrushCommands.setOperationBasedBrush(player, localSession, Expression.compile(Double.toString(radius)), - new Apply(generatorFactory), regionFactory, "worldedit.brush.apply"); + new ApplyRegion(generatorFactory), regionFactory, "worldedit.brush.apply"); } @Command( diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/BrushCommands.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/BrushCommands.java index 9fbea73d9..47bfbe237 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/BrushCommands.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/BrushCommands.java @@ -23,43 +23,42 @@ import com.fastasyncworldedit.core.Fawe; import com.fastasyncworldedit.core.configuration.Caption; import com.fastasyncworldedit.core.configuration.Settings; import com.fastasyncworldedit.core.object.FaweLimit; -import com.fastasyncworldedit.core.object.brush.BlendBall; -import com.fastasyncworldedit.core.object.brush.BlobBrush; -import com.fastasyncworldedit.core.object.brush.BrushSettings; -import com.fastasyncworldedit.core.object.brush.CatenaryBrush; -import com.fastasyncworldedit.core.object.brush.CircleBrush; -import com.fastasyncworldedit.core.object.brush.CommandBrush; -import com.fastasyncworldedit.core.object.brush.CopyPastaBrush; -import com.fastasyncworldedit.core.object.brush.ErodeBrush; -import com.fastasyncworldedit.core.object.brush.FallingSphere; -import com.fastasyncworldedit.core.object.brush.FlattenBrush; -import com.fastasyncworldedit.core.object.brush.HeightBrush; -import com.fastasyncworldedit.core.object.brush.ImageBrush; -import com.fastasyncworldedit.core.object.brush.LayerBrush; -import com.fastasyncworldedit.core.object.brush.LineBrush; -import com.fastasyncworldedit.core.object.brush.PopulateSchem; -import com.fastasyncworldedit.core.object.brush.RaiseBrush; -import com.fastasyncworldedit.core.object.brush.RecurseBrush; -import com.fastasyncworldedit.core.object.brush.ScatterBrush; -import com.fastasyncworldedit.core.object.brush.ScatterCommand; -import com.fastasyncworldedit.core.object.brush.ScatterOverlayBrush; -import com.fastasyncworldedit.core.object.brush.ShatterBrush; -import com.fastasyncworldedit.core.object.brush.SplatterBrush; -import com.fastasyncworldedit.core.object.brush.SplineBrush; -import com.fastasyncworldedit.core.object.brush.StencilBrush; -import com.fastasyncworldedit.core.object.brush.SurfaceSphereBrush; -import com.fastasyncworldedit.core.object.brush.SurfaceSpline; -import com.fastasyncworldedit.core.object.brush.heightmap.ScalableHeightMap; -import com.fastasyncworldedit.core.object.brush.heightmap.ScalableHeightMap.Shape; -import com.fastasyncworldedit.core.object.brush.sweep.SweepBrush; -import com.fastasyncworldedit.core.object.clipboard.MultiClipboardHolder; -import com.fastasyncworldedit.core.object.io.PGZIPOutputStream; -import com.fastasyncworldedit.core.object.mask.IdMask; +import com.fastasyncworldedit.core.command.tool.brush.BlendBall; +import com.fastasyncworldedit.core.command.tool.brush.BlobBrush; +import com.fastasyncworldedit.core.command.tool.brush.BrushSettings; +import com.fastasyncworldedit.core.command.tool.brush.CatenaryBrush; +import com.fastasyncworldedit.core.command.tool.brush.CircleBrush; +import com.fastasyncworldedit.core.command.tool.brush.CommandBrush; +import com.fastasyncworldedit.core.command.tool.brush.CopyPastaBrush; +import com.fastasyncworldedit.core.command.tool.brush.ErodeBrush; +import com.fastasyncworldedit.core.command.tool.brush.FallingSphere; +import com.fastasyncworldedit.core.command.tool.brush.FlattenBrush; +import com.fastasyncworldedit.core.command.tool.brush.HeightBrush; +import com.fastasyncworldedit.core.command.tool.brush.ImageBrush; +import com.fastasyncworldedit.core.command.tool.brush.LayerBrush; +import com.fastasyncworldedit.core.command.tool.brush.LineBrush; +import com.fastasyncworldedit.core.command.tool.brush.PopulateSchem; +import com.fastasyncworldedit.core.command.tool.brush.RaiseBrush; +import com.fastasyncworldedit.core.command.tool.brush.RecurseBrush; +import com.fastasyncworldedit.core.command.tool.brush.ScatterBrush; +import com.fastasyncworldedit.core.command.tool.brush.ScatterCommand; +import com.fastasyncworldedit.core.command.tool.brush.ScatterOverlayBrush; +import com.fastasyncworldedit.core.command.tool.brush.ShatterBrush; +import com.fastasyncworldedit.core.command.tool.brush.SplatterBrush; +import com.fastasyncworldedit.core.command.tool.brush.SplineBrush; +import com.fastasyncworldedit.core.command.tool.brush.StencilBrush; +import com.fastasyncworldedit.core.command.tool.brush.SurfaceSphereBrush; +import com.fastasyncworldedit.core.command.tool.brush.SurfaceSpline; +import com.fastasyncworldedit.core.extent.processor.heightmap.ScalableHeightMap; +import com.fastasyncworldedit.core.extent.processor.heightmap.ScalableHeightMap.Shape; +import com.fastasyncworldedit.core.command.tool.sweep.SweepBrush; +import com.fastasyncworldedit.core.extent.clipboard.MultiClipboardHolder; +import com.fastasyncworldedit.core.function.mask.IdMask; import com.fastasyncworldedit.core.util.MainUtil; import com.fastasyncworldedit.core.util.MathMan; import com.fastasyncworldedit.core.util.StringMan; import com.fastasyncworldedit.core.util.image.ImageUtil; -import com.sk89q.minecraft.util.commands.Step; +import com.sk89q.worldedit.command.util.annotation.Step; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.EmptyClipboardException; import com.sk89q.worldedit.LocalSession; @@ -93,10 +92,10 @@ import com.sk89q.worldedit.function.factory.Deform; import com.sk89q.worldedit.function.factory.Paint; import com.sk89q.worldedit.function.mask.ExistingBlockMask; import com.sk89q.worldedit.function.mask.Mask; -import com.sk89q.worldedit.function.mask.SingleBlockTypeMask; +import com.fastasyncworldedit.core.function.mask.SingleBlockTypeMask; import com.sk89q.worldedit.function.operation.Operation; import com.sk89q.worldedit.function.pattern.Pattern; -import com.sk89q.worldedit.internal.annotation.PatternList; +import com.sk89q.worldedit.command.util.annotation.PatternList; import com.sk89q.worldedit.internal.annotation.ClipboardMask; import com.sk89q.worldedit.internal.expression.Expression; import com.sk89q.worldedit.math.BlockVector3; @@ -108,10 +107,11 @@ import com.sk89q.worldedit.util.TreeGenerator; import com.sk89q.worldedit.util.formatting.text.Component; import com.sk89q.worldedit.util.formatting.text.TextComponent; import com.sk89q.worldedit.util.formatting.text.event.ClickEvent; -import com.sk89q.worldedit.world.block.BlockID; +import com.fastasyncworldedit.core.world.block.BlockID; import com.sk89q.worldedit.world.block.BlockStateHolder; import com.sk89q.worldedit.world.block.BlockType; import com.sk89q.worldedit.world.block.BlockTypes; +import org.anarres.parallelgzip.ParallelGZIPOutputStream; import org.enginehub.piston.annotation.Command; import org.enginehub.piston.annotation.CommandContainer; import org.enginehub.piston.annotation.param.Arg; @@ -158,6 +158,7 @@ public class BrushCommands { this.worldEdit = worldEdit; } + //FAWE start @Command(name = "blendball", aliases = { "bb", @@ -403,6 +404,622 @@ public class BrushCommands { set(context, brush).setSize(max).setFill(fill); } + @Command( + name = "shatter", + aliases = { "partition", "split"}, + desc = "Creates random lines to break the terrain into pieces", + descFooter = "Creates uneven lines separating terrain into multiple pieces\n" + + "Pic: https://i.imgur.com/2xKsZf2.png" + ) + @CommandPermissions("worldedit.brush.shatter") + public void shatterBrush(EditSession editSession, InjectedValueAccess context, + @Arg(desc = "Pattern") + Pattern fill, + @Arg(desc = "The radius to sample for blending", def = "10") + Expression radius, + @Arg(desc = "Lines", def = "10") + int count) throws WorldEditException { + worldEdit.checkMaxBrushRadius(radius); + set(context, new ShatterBrush(count)).setSize(radius).setFill(fill) + .setMask(new ExistingBlockMask(editSession)); + } + + @Command( + name = "stencil", + desc = "Use a height map to paint a surface", + descFooter = "Use a height map to paint any surface." + ) + @CommandPermissions("worldedit.brush.stencil") + public void stencilBrush(LocalSession session, InjectedValueAccess context, + @Arg(desc = "Pattern") + Pattern fill, + @Arg(desc = "Expression", def = "5") + Expression radius, + @Arg(desc = "String", def = "") + String image, + @Arg(def = "0", desc = "rotation") + @Range(from = 0, to = 360) + int rotation, + @Arg(desc = "double", def = "1") + double yscale, + @Switch(name = 'w', desc = "Apply at maximum saturation") + boolean onlyWhite, + @Switch(name = 'r', desc = "Apply random rotation") + boolean randomRotate) + throws WorldEditException, FileNotFoundException { + worldEdit.checkMaxBrushRadius(radius); + InputStream stream = getHeightmapStream(image); + HeightBrush brush; + try { + brush = new StencilBrush(stream, rotation, yscale, onlyWhite, + "#clipboard".equalsIgnoreCase(image) + ? session.getClipboard().getClipboard() : null); + } catch (EmptyClipboardException ignored) { + brush = new StencilBrush(stream, rotation, yscale, onlyWhite, null); + } + if (randomRotate) { + brush.setRandomRotate(true); + } + set(context, brush).setSize(radius).setFill(fill); + } + + @Command(name = "image", + desc = "Use a height map to paint a surface", + descFooter = "Use a height map to paint any surface.\n") + @CommandPermissions("worldedit.brush.image") + public void imageBrush(LocalSession session, + InjectedValueAccess context, + @Arg(desc = "Image URL (imgur only)") String imageURL, + @Arg(desc = "The size of the brush", def = "5") Expression radius, + @Arg(def = "1", desc = "scale height") double yscale, + @Switch(name = 'a', desc = "Use image Alpha") boolean alpha, + @Switch(name = 'f', desc = "Blend the image with existing terrain") boolean fadeOut) + throws WorldEditException, IOException { + URL url = new URL(imageURL); + if (!url.getHost().equalsIgnoreCase("i.imgur.com")) { + throw new IOException("Only i.imgur.com links are allowed!"); + } + BufferedImage image = MainUtil.readImage(url); + worldEdit.checkMaxBrushRadius(radius); + if (yscale != 1) { + ImageUtil.scaleAlpha(image, yscale); + alpha = true; + } + if (fadeOut) { + ImageUtil.fadeAlpha(image); + alpha = true; + } + ImageBrush brush = new ImageBrush(image, session, alpha); + set(context, brush).setSize(radius); + } + + @Command( + name = "surface", + aliases = { "surf" }, + desc = "Use a height map to paint a surface", + descFooter = "Use a height map to paint any surface." + ) + @CommandPermissions("worldedit.brush.surface") + public void surfaceBrush(InjectedValueAccess context, + @Arg(desc = "Pattern") + Pattern fill, + @Arg(desc = "Expression", def = "5") + Expression radius) throws WorldEditException { + worldEdit.checkMaxBrushRadius(radius); + set(context, new SurfaceSphereBrush()).setFill(fill).setSize(radius); + } + + @Command( + name = "scatter", + desc = "Scatter a pattern on a surface", + descFooter = + "Set a number of blocks randomly on a surface each a certain distance apart.\n" + + "Video: https://youtu.be/RPZIaTbqoZw?t=34s" + ) + @CommandPermissions("worldedit.brush.scatter") + public void scatterBrush(InjectedValueAccess context, + @Arg(desc = "Pattern") + Pattern fill, + @Arg(desc = "radius", def = "5") + Expression radius, + @Arg(desc = "points", def = "5") + double points, + @Arg(desc = "distance", def = "1") + double distance, + @Switch(name = 'o', desc = "Overlay the block") + boolean overlay) throws WorldEditException { + worldEdit.checkMaxBrushRadius(radius); + Brush brush; + if (overlay) { + brush = new ScatterOverlayBrush((int) points, (int) distance); + } else { + brush = new ScatterBrush((int) points, (int) distance); + } + set(context, brush).setSize(radius).setFill(fill); + } + + @Command( + name = "populateschematic", + aliases = { + "populateschem", + "popschem", + "pschem", + "ps" + }, + desc = "Scatter a schematic on a surface" + ) + @CommandPermissions("worldedit.brush.populateschematic") + public void scatterSchemBrush(Player player, InjectedValueAccess context, + @Arg(desc = "Mask") + Mask mask, + @Arg(name = "clipboard", desc = "Clipboard uri") + String clipboardStr, + @Arg(desc = "Expression", def = "30") + Expression radius, + @Arg(desc = "double", def = "50") + double density, + @Switch(name = 'r', desc = "Apply random rotation") + boolean rotate) throws WorldEditException { + worldEdit.checkMaxBrushRadius(radius); + try { + MultiClipboardHolder clipboards = + ClipboardFormats.loadAllFromInput(player, clipboardStr, null, true); + if (clipboards == null) { + player.print(Caption.of("fawe.error.schematic.not.found", clipboardStr)); + return; + } + List holders = clipboards.getHolders(); + if (holders == null) { + player.print(Caption.of("fawe.error.schematic.not.found", clipboardStr)); + return; + } + + set(context, new PopulateSchem(mask, holders, (int) density, rotate)).setSize(radius); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + @Command( + name = "layer", + desc = "Replaces terrain with a layer.", + descFooter = "Replaces terrain with a layer.\n" + + "Example: /br layer oak_planks orange_stained_glass magenta_stained_glass black_wool - Places several layers on a surface\n" + + "Pic: https://i.imgur.com/XV0vYoX.png" + ) + @CommandPermissions("worldedit.brush.layer") + public void surfaceLayer(InjectedValueAccess context, + @Arg(desc = "Expression") + Expression radius, + @Arg(desc = "List of comma-separated patterns") + @PatternList() + List patternLayers) + throws WorldEditException { + worldEdit.checkMaxBrushRadius(radius); + set(context, new LayerBrush(patternLayers.toArray(new Pattern[0]))).setSize(radius); + } + + @Command( + name = "splatter", + desc = "Splatter a pattern on a surface", + descFooter = "Sets a bunch of blocks randomly on a surface.\n" + + "Pic: https://i.imgur.com/hMD29oO.png\n" + + "Example: /br splatter stone,dirt 30 15\n" + + "Note: The seeds define how many splotches there are, recursion defines how large, " + + "solid defines whether the pattern is applied per seed, else per block." + ) + @CommandPermissions("worldedit.brush.splatter") + public void splatterBrush(InjectedValueAccess context, + @Arg(desc = "Pattern") + Pattern fill, + @Arg(desc = "Expression", def = "5") + Expression radius, + @Arg(desc = "double", def = "1") + double points, + @Arg(desc = "double", def = "5") + double recursion, + @Arg(desc = "boolean", def = "true") + boolean solid) throws WorldEditException { + worldEdit.checkMaxBrushRadius(radius); + set(context, new SplatterBrush((int) points, (int) recursion, solid)).setSize(radius) + .setFill(fill); + } + + @Command( + name = "scattercommand", + aliases = { + "scattercmd", + "scmd", + "scommand" + }, + desc = "Run commands at random points on a surface", + descFooter = "Run commands at random points on a surface\n" + + " - Your selection will be expanded to the specified size around each point\n" + + " - Placeholders: {x}, {y}, {z}, {world}, {size}" + ) + @CommandPermissions("worldedit.brush.scattercommand") + public void scatterCommandBrush(Player player, InjectedValueAccess context, + @Arg(desc = "The minimum distance between each point") + Expression radius, + @Arg(desc = "double", def = "1") + double points, + @Arg(desc = "double", def = "1") + double distance, + @Arg(desc = "List of comma-separated commands") + List commandStr) + throws WorldEditException { + worldEdit.checkMaxBrushRadius(radius); + set(context, + new ScatterCommand((int) points, (int) distance, StringMan.join(commandStr, " "))) + .setSize(radius); + } + + @Command( + name = "height", + aliases = { "heightmap" }, + desc = "Raise or lower terrain using a heightmap", + descFooter = "This brush raises and lowers land.\n" + + "Note: Use a negative yscale to reduce height\n" + + "Snow Pic: https://i.imgur.com/Hrzn0I4.png" + ) + @CommandPermissions("worldedit.brush.height") + public void heightBrush(LocalSession session, + @Arg(desc = "Expression", def = "5") + Expression radius, + @Arg(desc = "String", def = "") + String image, + @Arg(def = "0", desc = "rotation") + @Range(from = 0, to = 360) + int rotation, + @Arg(desc = "double", def = "1") + double yscale, + @Switch(name = 'r', desc = "Random off-axis rotation") + boolean randomRotate, + @Switch(name = 'l', desc = "Work on snow layers") + boolean layers, + @Switch(name = 's', desc = "Disable smoothing") + boolean dontSmooth, InjectedValueAccess context) + throws WorldEditException, FileNotFoundException { + terrainBrush(session, radius, image, rotation, yscale, false, randomRotate, layers, + !dontSmooth, ScalableHeightMap.Shape.CONE, context); + } + + @Command( + name = "cliff", + aliases = { "flatcylinder" }, + desc = "Cliff brush", + descFooter = "This brush flattens terrain and creates cliffs." + ) + @CommandPermissions("worldedit.brush.height") + public void cliffBrush(LocalSession session, + @Arg(desc = "Expression", def = "5") + Expression radius, + @Arg(desc = "String", def = "") + String image, + @Arg(def = "0", desc = "rotation") + @Step(90) + @Range(from = 0, to = 360) + int rotation, + @Arg(desc = "double", def = "1") + double yscale, + @Switch(name = 'r', desc = "Enables random off-axis rotation") + boolean randomRotate, + @Switch(name = 'l', desc = "Will work on snow layers") + boolean layers, + @Switch(name = 's', desc = "Disables smoothing") + boolean dontSmooth, InjectedValueAccess context) + throws WorldEditException, FileNotFoundException { + terrainBrush(session, radius, image, rotation, yscale, true, randomRotate, layers, + !dontSmooth, ScalableHeightMap.Shape.CYLINDER, context); + } + + @Command( + name = "flatten", + aliases = { + "flatmap", + "flat" + }, + desc = "This brush raises or lowers land towards the clicked point" + ) + @CommandPermissions("worldedit.brush.height") + public void flattenBrush(LocalSession session, + @Arg(desc = "Expression", def = "5") + Expression radius, + @Arg(desc = "String", def = "") + String image, + @Arg(def = "0", desc = "rotation") + @Step(90) + @Range(from = 0, to = 360) + int rotation, + @Arg(desc = "double", def = "1") + double yscale, + @Switch(name = 'r', desc = "Enables random off-axis rotation") + boolean randomRotate, + @Switch(name = 'l', desc = "Will work on snow layers") + boolean layers, + @Switch(name = 's', desc = "Disables smoothing") + boolean dontSmooth, InjectedValueAccess context) + throws WorldEditException, FileNotFoundException { + terrainBrush(session, radius, image, rotation, yscale, true, randomRotate, layers, + !dontSmooth, ScalableHeightMap.Shape.CONE, context); + } + + private void terrainBrush(LocalSession session, Expression radius, String image, int rotation, double yscale, boolean flat, boolean randomRotate, boolean layers, boolean smooth, Shape shape, InjectedValueAccess context) + throws WorldEditException, FileNotFoundException { + worldEdit.checkMaxBrushRadius(radius); + InputStream stream = getHeightmapStream(image); + HeightBrush brush; + if (flat) { + try { + brush = new FlattenBrush(stream, rotation, yscale, layers, smooth, + "#clipboard".equalsIgnoreCase(image) + ? session.getClipboard().getClipboard() : null, shape); + } catch (EmptyClipboardException ignored) { + brush = new FlattenBrush(stream, rotation, yscale, layers, smooth, null, shape); + } + } else { + try { + brush = new HeightBrush(stream, rotation, yscale, layers, smooth, + "#clipboard".equalsIgnoreCase(image) + ? session.getClipboard().getClipboard() : null); + } catch (EmptyClipboardException ignored) { + brush = new HeightBrush(stream, rotation, yscale, layers, smooth, null); + } + } + if (randomRotate) { + brush.setRandomRotate(true); + } + set(context, brush).setSize(radius); + } + + private InputStream getHeightmapStream(String filename) throws FileNotFoundException { + if (filename == null || "none".equalsIgnoreCase(filename)) { + return null; + } + String filenamePng = filename.endsWith(".png") ? filename : filename + ".png"; + File file = new File(Fawe.imp().getDirectory(), + Settings.IMP.PATHS.HEIGHTMAP + File.separator + filenamePng); + if (file.exists()) { + return new FileInputStream(file); + } + URI uri = ImageUtil.getImageURI(filename); + return ImageUtil.getInputStream(uri); + } + + + @Command( + name = "copypaste", + aliases = { + "cp", + "copypasta" + }, + desc = "Copy Paste brush", + descFooter = "Left click the base of an object to copy.\n" + "Right click to paste\n" + + "Note: Works well with the clipboard scroll action\n" + + "Video: https://www.youtube.com/watch?v=RPZIaTbqoZw" + ) + @CommandPermissions("worldedit.brush.copy") + public void copy(Player player, LocalSession session, InjectedValueAccess context, + @Arg(desc = "Expression", def = "5") + Expression radius, + @Switch(name = 'r', desc = "Apply random rotation on paste") + boolean randomRotate, + @Switch(name = 'a', desc = "Apply auto view based rotation on paste") + boolean autoRotate) throws WorldEditException { + worldEdit.checkMaxBrushRadius(radius); + player.print(Caption.of("fawe.worldedit.brush.brush.copy", (radius))); + + set(context, new CopyPastaBrush(player, session, randomRotate, autoRotate)).setSize(radius); + } + + @Command( + name = "command", + aliases = { "cmd" }, + desc = "Command brush", + descFooter = "Run the commands at the clicked position.\n" + + " - Your selection will be expanded to the specified size around each point\n" + + " - Placeholders: {x}, {y}, {z}, {world}, {size}" + ) + @CommandPermissions("worldedit.brush.command") + public void command(InjectedValueAccess context, + @Arg(desc = "Expression") + Expression radius, + @Arg(desc = "Command to run") + List input) throws WorldEditException { + worldEdit.checkMaxBrushRadius(radius); + String cmd = StringMan.join(input, " "); + set(context, new CommandBrush(cmd)).setSize(radius); + } + + @Command( + name = "savebrush", + aliases = { "save" }, + desc = "Save your current brush" + ) + @CommandPermissions("worldedit.brush.save") + public void saveBrush(Player player, LocalSession session, + @Arg(desc = "String name") + String name, + @Switch(name = 'g', desc = "Save the brush globally") + boolean root) throws WorldEditException, IOException { + BrushTool tool = session.getBrushTool(player); + if (tool != null) { + root |= name.startsWith("../"); + name = FileSystems.getDefault().getPath(name).getFileName().toString(); + File folder = MainUtil.getFile(Fawe.imp().getDirectory(), "brushes"); + name = name.endsWith(".jsgz") ? name : name + ".jsgz"; + File file; + if (root && player.hasPermission("worldedit.brush.save.other")) { + file = new File(folder, name); + } else { + file = new File(folder, player.getUniqueId() + File.separator + name); + } + File parent = file.getParentFile(); + if (!parent.exists()) { + parent.mkdirs(); + } + file.createNewFile(); + try (DataOutputStream out = new DataOutputStream( + new ParallelGZIPOutputStream(new FileOutputStream(file)))) { + out.writeUTF(tool.toString()); + } catch (Throwable e) { + e.printStackTrace(); + } + player.print(Caption.of("fawe.worldedit.schematic.schematic.saved", name)); + } else { + player.print(Caption.of("fawe.worldedit.brush.brush.none")); + } + } + + // TODO: Write a Brush standard format. + /* @Command( + name = "loadbrush", + aliases = {"load"}, + desc = "Load a brush" + ) + @CommandPermissions("worldedit.brush.load") + public void loadBrush(Player player, LocalSession session, @Arg(desc = "String name") String name) + throws WorldEditException, IOException { + name = FileSystems.getDefault().getPath(name).getFileName().toString(); + File folder = MainUtil.getFile(Fawe.imp().getDirectory(), "brushes"); + name = name.endsWith(".jsgz") ? name : name + ".jsgz"; + File file = new File(folder, player.getUniqueId() + File.separator + name); + if (!file.exists()) { + file = new File(folder, name); + } + if (!file.exists()) { + File[] files = folder.listFiles(pathname -> false); + player.print(Caption.of("fawe.error.brush.not.found", name)); + return; + } + try (DataInputStream in = new DataInputStream( + new GZIPInputStream(new FileInputStream(file)))) { + String json = in.readUTF(); + BrushTool tool = BrushTool.fromString(player, session, json); + BaseItem item = player.getItemInHand(HandSide.MAIN_HAND); + session.setTool(item, tool, player); + player.print(Caption.of("fawe.worldedit.brush.brush.equipped", name)); + } catch (Throwable e) { + e.printStackTrace(); + player.print(Caption.of("fawe.error.brush.incompatible")); + } + } */ + + @Command( + name = "/listbrush", + desc = "List saved brushes", + descFooter = "List all brushes in the brush directory") + @CommandPermissions("worldedit.brush.list") + public void list(Actor actor, InjectedValueAccess args, + @ArgFlag(name = 'p', desc = "Prints the requested page", def = "0") + int page) throws WorldEditException { + String baseCmd = "/brush loadbrush"; + File dir = MainUtil.getFile(Fawe.imp().getDirectory(), "brushes"); + // TODO NOT IMPLEMENTED + // UtilityCommands.list(dir, actor, args, page, null, true, baseCmd); + } + + static void setOperationBasedBrush(Player player, LocalSession session, Expression radius, Contextual factory, RegionFactory shape, String permission) + throws WorldEditException { + WorldEdit.getInstance().checkMaxBrushRadius(radius); + BrushTool tool = session.getBrushTool(player.getItemInHand(HandSide.MAIN_HAND).getType()); + tool.setSize(radius); + tool.setFill(null); + tool.setBrush(new OperationFactoryBrush(factory, shape, session), permission); + + player.print(TextComponent.of("Set brush to " + factory)); + } + + @Command( + name = "deform", + desc = "Deform brush, applies an expression to an area" + ) + @CommandPermissions("worldedit.brush.deform") + public void deform(Player player, LocalSession localSession, + @Arg(desc = "The shape of the region") + RegionFactory shape, + @Arg(desc = "The size of the brush", def = "5") + double radius, + @Arg(desc = "Expression to apply", def = "y-=0.2") + String expression, + @Switch(name = 'r', desc = "Use the game's coordinate origin") + boolean useRawCoords, + @Switch(name = 'o', desc = "Use the placement position as the origin") + boolean usePlacement) throws WorldEditException { + Deform deform = new Deform(expression); + if (useRawCoords) { + deform.setMode(Deform.Mode.RAW_COORD); + } else if (usePlacement) { + deform.setMode(Deform.Mode.OFFSET); + deform.setOffset(localSession.getPlacementPosition(player).toVector3()); + } + setOperationBasedBrush(player, localSession, radius, + deform, shape, "worldedit.brush.deform"); + } + + @Command( + name = "set", + desc = "Set brush, sets all blocks in the area" + ) + @CommandPermissions("worldedit.brush.set") + public void set(Player player, LocalSession localSession, + @Arg(desc = "The shape of the region") + RegionFactory shape, + @Arg(desc = "The size of the brush", def = "5") + Expression radius, + @Arg(desc = "The pattern of blocks to set") + Pattern pattern) throws WorldEditException { + setOperationBasedBrush(player, localSession, radius, + new Apply(new ReplaceFactory(pattern)), shape, "worldedit.brush.set"); + } + + @Command( + name = "forest", + desc = "Forest brush, creates a forest in the area" + ) + @CommandPermissions("worldedit.brush.forest") + public void forest(Player player, LocalSession localSession, + @Arg(desc = "The shape of the region") + RegionFactory shape, + @Arg(desc = "The size of the brush", def = "5") + Expression radius, + @Arg(desc = "The density of the brush", def = "20") + double density, + @Arg(desc = "The type of tree to use") + TreeGenerator.TreeType type) throws WorldEditException { + setOperationBasedBrush(player, localSession, radius, + new Paint(new TreeGeneratorFactory(type), density / 100), shape, "worldedit.brush.forest"); + } + + @Command( + name = "raise", + desc = "Raise brush, raise all blocks by one" + ) + @CommandPermissions("worldedit.brush.raise") + public void raise(Player player, LocalSession localSession, + @Arg(desc = "The shape of the region") + RegionFactory shape, + @Arg(desc = "The size of the brush", def = "5") + Expression radius) throws WorldEditException { + setOperationBasedBrush(player, localSession, radius, + new Deform("y-=1"), shape, "worldedit.brush.raise"); + } + + @Command( + name = "lower", + desc = "Lower brush, lower all blocks by one" + ) + @CommandPermissions("worldedit.brush.lower") + public void lower(Player player, LocalSession localSession, + @Arg(desc = "The shape of the region") + RegionFactory shape, + @Arg(desc = "The size of the brush", def = "5") + Expression radius) throws WorldEditException { + setOperationBasedBrush(player, localSession, radius, + new Deform("y+=1"), shape, "worldedit.brush.lower"); + } + //FAWE end + @Command( name = "sphere", aliases = { "s" }, @@ -423,6 +1040,7 @@ public class BrushCommands { if (hollow) { brush = new HollowSphereBrush(); } else { + //FAWE start - Suggest different brush material if sand or gravel is used if (pattern instanceof BlockStateHolder) { BlockType type = ((BlockStateHolder) pattern).getBlockType(); switch (type.getInternalId()) { @@ -443,259 +1061,10 @@ public class BrushCommands { } } + //FAWE end set(context, brush).setSize(radius).setFill(pattern); } - @Command( - name = "shatter", - aliases = { "partition", "split"}, - desc = "Creates random lines to break the terrain into pieces", - descFooter = "Creates uneven lines separating terrain into multiple pieces\n" - + "Pic: https://i.imgur.com/2xKsZf2.png" - ) - @CommandPermissions("worldedit.brush.shatter") - public void shatterBrush(EditSession editSession, InjectedValueAccess context, - @Arg(desc = "Pattern") - Pattern fill, - @Arg(desc = "The radius to sample for blending", def = "10") - Expression radius, - @Arg(desc = "Lines", def = "10") - int count) throws WorldEditException { - worldEdit.checkMaxBrushRadius(radius); - set(context, new ShatterBrush(count)).setSize(radius).setFill(fill) - .setMask(new ExistingBlockMask(editSession)); - } - - @Command( - name = "stencil", - desc = "Use a height map to paint a surface", - descFooter = "Use a height map to paint any surface." - ) - @CommandPermissions("worldedit.brush.stencil") - public void stencilBrush(LocalSession session, InjectedValueAccess context, - @Arg(desc = "Pattern") - Pattern fill, - @Arg(desc = "Expression", def = "5") - Expression radius, - @Arg(desc = "String", def = "") - String image, - @Arg(def = "0", desc = "rotation") - @Range(from = 0, to = 360) - int rotation, - @Arg(desc = "double", def = "1") - double yscale, - @Switch(name = 'w', desc = "Apply at maximum saturation") - boolean onlyWhite, - @Switch(name = 'r', desc = "Apply random rotation") - boolean randomRotate) - throws WorldEditException, FileNotFoundException { - worldEdit.checkMaxBrushRadius(radius); - InputStream stream = getHeightmapStream(image); - HeightBrush brush; - try { - brush = new StencilBrush(stream, rotation, yscale, onlyWhite, - "#clipboard".equalsIgnoreCase(image) - ? session.getClipboard().getClipboard() : null); - } catch (EmptyClipboardException ignored) { - brush = new StencilBrush(stream, rotation, yscale, onlyWhite, null); - } - if (randomRotate) { - brush.setRandomRotate(true); - } - set(context, brush).setSize(radius).setFill(fill); - } - - @Command(name = "image", - desc = "Use a height map to paint a surface", - descFooter = "Use a height map to paint any surface.\n") - @CommandPermissions("worldedit.brush.image") - public void imageBrush(LocalSession session, - InjectedValueAccess context, - @Arg(desc = "Image URL (imgur only)") String imageURL, - @Arg(desc = "The size of the brush", def = "5") Expression radius, - @Arg(def = "1", desc = "scale height") double yscale, - @Switch(name = 'a', desc = "Use image Alpha") boolean alpha, - @Switch(name = 'f', desc = "Blend the image with existing terrain") boolean fadeOut) - throws WorldEditException, IOException { - URL url = new URL(imageURL); - if (!url.getHost().equalsIgnoreCase("i.imgur.com")) { - throw new IOException("Only i.imgur.com links are allowed!"); - } - BufferedImage image = MainUtil.readImage(url); - worldEdit.checkMaxBrushRadius(radius); - if (yscale != 1) { - ImageUtil.scaleAlpha(image, yscale); - alpha = true; - } - if (fadeOut) { - ImageUtil.fadeAlpha(image); - alpha = true; - } - ImageBrush brush = new ImageBrush(image, session, alpha); - set(context, brush).setSize(radius); - } - - @Command( - name = "surface", - aliases = { "surf" }, - desc = "Use a height map to paint a surface", - descFooter = "Use a height map to paint any surface." - ) - @CommandPermissions("worldedit.brush.surface") - public void surfaceBrush(InjectedValueAccess context, - @Arg(desc = "Pattern") - Pattern fill, - @Arg(desc = "Expression", def = "5") - Expression radius) throws WorldEditException { - worldEdit.checkMaxBrushRadius(radius); - set(context, new SurfaceSphereBrush()).setFill(fill).setSize(radius); - } - - @Command( - name = "scatter", - desc = "Scatter a pattern on a surface", - descFooter = - "Set a number of blocks randomly on a surface each a certain distance apart.\n" - + "Video: https://youtu.be/RPZIaTbqoZw?t=34s" - ) - @CommandPermissions("worldedit.brush.scatter") - public void scatterBrush(InjectedValueAccess context, - @Arg(desc = "Pattern") - Pattern fill, - @Arg(desc = "radius", def = "5") - Expression radius, - @Arg(desc = "points", def = "5") - double points, - @Arg(desc = "distance", def = "1") - double distance, - @Switch(name = 'o', desc = "Overlay the block") - boolean overlay) throws WorldEditException { - worldEdit.checkMaxBrushRadius(radius); - Brush brush; - if (overlay) { - brush = new ScatterOverlayBrush((int) points, (int) distance); - } else { - brush = new ScatterBrush((int) points, (int) distance); - } - set(context, brush).setSize(radius).setFill(fill); - } - - @Command( - name = "populateschematic", - aliases = { - "populateschem", - "popschem", - "pschem", - "ps" - }, - desc = "Scatter a schematic on a surface" - ) - @CommandPermissions("worldedit.brush.populateschematic") - public void scatterSchemBrush(Player player, InjectedValueAccess context, - @Arg(desc = "Mask") - Mask mask, - @Arg(name = "clipboard", desc = "Clipboard uri") - String clipboardStr, - @Arg(desc = "Expression", def = "30") - Expression radius, - @Arg(desc = "double", def = "50") - double density, - @Switch(name = 'r', desc = "Apply random rotation") - boolean rotate) throws WorldEditException { - worldEdit.checkMaxBrushRadius(radius); - try { - MultiClipboardHolder clipboards = - ClipboardFormats.loadAllFromInput(player, clipboardStr, null, true); - if (clipboards == null) { - player.print(Caption.of("fawe.error.schematic.not.found", clipboardStr)); - return; - } - List holders = clipboards.getHolders(); - if (holders == null) { - player.print(Caption.of("fawe.error.schematic.not.found", clipboardStr)); - return; - } - - set(context, new PopulateSchem(mask, holders, (int) density, rotate)).setSize(radius); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - @Command( - name = "layer", - desc = "Replaces terrain with a layer.", - descFooter = "Replaces terrain with a layer.\n" - + "Example: /br layer oak_planks orange_stained_glass magenta_stained_glass black_wool - Places several layers on a surface\n" - + "Pic: https://i.imgur.com/XV0vYoX.png" - ) - @CommandPermissions("worldedit.brush.layer") - public void surfaceLayer(InjectedValueAccess context, - @Arg(desc = "Expression") - Expression radius, - @Arg(desc = "List of comma-separated patterns") - @PatternList() - List patternLayers) - throws WorldEditException { - worldEdit.checkMaxBrushRadius(radius); - set(context, new LayerBrush(patternLayers.toArray(new Pattern[0]))).setSize(radius); - } - - @Command( - name = "splatter", - desc = "Splatter a pattern on a surface", - descFooter = "Sets a bunch of blocks randomly on a surface.\n" - + "Pic: https://i.imgur.com/hMD29oO.png\n" - + "Example: /br splatter stone,dirt 30 15\n" - + "Note: The seeds define how many splotches there are, recursion defines how large, " - + "solid defines whether the pattern is applied per seed, else per block." - ) - @CommandPermissions("worldedit.brush.splatter") - public void splatterBrush(InjectedValueAccess context, - @Arg(desc = "Pattern") - Pattern fill, - @Arg(desc = "Expression", def = "5") - Expression radius, - @Arg(desc = "double", def = "1") - double points, - @Arg(desc = "double", def = "5") - double recursion, - @Arg(desc = "boolean", def = "true") - boolean solid) throws WorldEditException { - worldEdit.checkMaxBrushRadius(radius); - set(context, new SplatterBrush((int) points, (int) recursion, solid)).setSize(radius) - .setFill(fill); - } - - @Command( - name = "scattercommand", - aliases = { - "scattercmd", - "scmd", - "scommand" - }, - desc = "Run commands at random points on a surface", - descFooter = "Run commands at random points on a surface\n" - + " - Your selection will be expanded to the specified size around each point\n" - + " - Placeholders: {x}, {y}, {z}, {world}, {size}" - ) - @CommandPermissions("worldedit.brush.scattercommand") - public void scatterCommandBrush(Player player, InjectedValueAccess context, - @Arg(desc = "The minimum distance between each point") - Expression radius, - @Arg(desc = "double", def = "1") - double points, - @Arg(desc = "double", def = "1") - double distance, - @Arg(desc = "List of comma-separated commands") - List commandStr) - throws WorldEditException { - worldEdit.checkMaxBrushRadius(radius); - set(context, - new ScatterCommand((int) points, (int) distance, StringMan.join(commandStr, " "))) - .setSize(radius); - } - @Command( name = "cylinder", aliases = { "cyl", "c" }, @@ -815,183 +1184,6 @@ public class BrushCommands { set(context, new GravityBrush(fromMaxY)).setSize(radius); } - @Command( - name = "height", - aliases = { "heightmap" }, - desc = "Raise or lower terrain using a heightmap", - descFooter = "This brush raises and lowers land.\n" - + "Note: Use a negative yscale to reduce height\n" - + "Snow Pic: https://i.imgur.com/Hrzn0I4.png" - ) - @CommandPermissions("worldedit.brush.height") - public void heightBrush(LocalSession session, - @Arg(desc = "Expression", def = "5") - Expression radius, - @Arg(desc = "String", def = "") - String image, - @Arg(def = "0", desc = "rotation") - @Range(from = 0, to = 360) - int rotation, - @Arg(desc = "double", def = "1") - double yscale, - @Switch(name = 'r', desc = "Random off-axis rotation") - boolean randomRotate, - @Switch(name = 'l', desc = "Work on snow layers") - boolean layers, - @Switch(name = 's', desc = "Disable smoothing") - boolean dontSmooth, InjectedValueAccess context) - throws WorldEditException, FileNotFoundException { - terrainBrush(session, radius, image, rotation, yscale, false, randomRotate, layers, - !dontSmooth, ScalableHeightMap.Shape.CONE, context); - } - - @Command( - name = "cliff", - aliases = { "flatcylinder" }, - desc = "Cliff brush", - descFooter = "This brush flattens terrain and creates cliffs." - ) - @CommandPermissions("worldedit.brush.height") - public void cliffBrush(LocalSession session, - @Arg(desc = "Expression", def = "5") - Expression radius, - @Arg(desc = "String", def = "") - String image, - @Arg(def = "0", desc = "rotation") - @Step(90) - @Range(from = 0, to = 360) - int rotation, - @Arg(desc = "double", def = "1") - double yscale, - @Switch(name = 'r', desc = "Enables random off-axis rotation") - boolean randomRotate, - @Switch(name = 'l', desc = "Will work on snow layers") - boolean layers, - @Switch(name = 's', desc = "Disables smoothing") - boolean dontSmooth, InjectedValueAccess context) - throws WorldEditException, FileNotFoundException { - terrainBrush(session, radius, image, rotation, yscale, true, randomRotate, layers, - !dontSmooth, ScalableHeightMap.Shape.CYLINDER, context); - } - - @Command( - name = "flatten", - aliases = { - "flatmap", - "flat" - }, - desc = "This brush raises or lowers land towards the clicked point" - ) - @CommandPermissions("worldedit.brush.height") - public void flattenBrush(LocalSession session, - @Arg(desc = "Expression", def = "5") - Expression radius, - @Arg(desc = "String", def = "") - String image, - @Arg(def = "0", desc = "rotation") - @Step(90) - @Range(from = 0, to = 360) - int rotation, - @Arg(desc = "double", def = "1") - double yscale, - @Switch(name = 'r', desc = "Enables random off-axis rotation") - boolean randomRotate, - @Switch(name = 'l', desc = "Will work on snow layers") - boolean layers, - @Switch(name = 's', desc = "Disables smoothing") - boolean dontSmooth, InjectedValueAccess context) - throws WorldEditException, FileNotFoundException { - terrainBrush(session, radius, image, rotation, yscale, true, randomRotate, layers, - !dontSmooth, ScalableHeightMap.Shape.CONE, context); - } - - private void terrainBrush(LocalSession session, Expression radius, String image, int rotation, double yscale, boolean flat, boolean randomRotate, boolean layers, boolean smooth, Shape shape, InjectedValueAccess context) - throws WorldEditException, FileNotFoundException { - worldEdit.checkMaxBrushRadius(radius); - InputStream stream = getHeightmapStream(image); - HeightBrush brush; - if (flat) { - try { - brush = new FlattenBrush(stream, rotation, yscale, layers, smooth, - "#clipboard".equalsIgnoreCase(image) - ? session.getClipboard().getClipboard() : null, shape); - } catch (EmptyClipboardException ignored) { - brush = new FlattenBrush(stream, rotation, yscale, layers, smooth, null, shape); - } - } else { - try { - brush = new HeightBrush(stream, rotation, yscale, layers, smooth, - "#clipboard".equalsIgnoreCase(image) - ? session.getClipboard().getClipboard() : null); - } catch (EmptyClipboardException ignored) { - brush = new HeightBrush(stream, rotation, yscale, layers, smooth, null); - } - } - if (randomRotate) { - brush.setRandomRotate(true); - } - set(context, brush).setSize(radius); - } - - private InputStream getHeightmapStream(String filename) throws FileNotFoundException { - if (filename == null || "none".equalsIgnoreCase(filename)) { - return null; - } - String filenamePng = filename.endsWith(".png") ? filename : filename + ".png"; - File file = new File(Fawe.imp().getDirectory(), - Settings.IMP.PATHS.HEIGHTMAP + File.separator + filenamePng); - if (file.exists()) { - return new FileInputStream(file); - } - URI uri = ImageUtil.getImageURI(filename); - return ImageUtil.getInputStream(uri); - } - - - @Command( - name = "copypaste", - aliases = { - "cp", - "copypasta" - }, - desc = "Copy Paste brush", - descFooter = "Left click the base of an object to copy.\n" + "Right click to paste\n" - + "Note: Works well with the clipboard scroll action\n" - + "Video: https://www.youtube.com/watch?v=RPZIaTbqoZw" - ) - @CommandPermissions("worldedit.brush.copy") - public void copy(Player player, LocalSession session, InjectedValueAccess context, - @Arg(desc = "Expression", def = "5") - Expression radius, - @Switch(name = 'r', desc = "Apply random rotation on paste") - boolean randomRotate, - @Switch(name = 'a', desc = "Apply auto view based rotation on paste") - boolean autoRotate) throws WorldEditException { - worldEdit.checkMaxBrushRadius(radius); - player.print(Caption.of("fawe.worldedit.brush.brush.copy", (radius))); - - set(context, new CopyPastaBrush(player, session, randomRotate, autoRotate)).setSize(radius); - } - - @Command( - name = "command", - aliases = { "cmd" }, - desc = "Command brush", - descFooter = "Run the commands at the clicked position.\n" - + " - Your selection will be expanded to the specified size around each point\n" - + " - Placeholders: {x}, {y}, {z}, {world}, {size}" - ) - @CommandPermissions("worldedit.brush.command") - public void command(InjectedValueAccess context, - @Arg(desc = "Expression") - Expression radius, - @Arg(desc = "Command to run") - List input) throws WorldEditException { - worldEdit.checkMaxBrushRadius(radius); - String cmd = StringMan.join(input, " "); - set(context, new CommandBrush(cmd)).setSize(radius); - } - @Command( name = "butcher", aliases = { "kill" }, @@ -1035,6 +1227,7 @@ public class BrushCommands { set(context, new ButcherBrush(flags)).setSize(radius); } + //FAWE start public BrushSettings process(Player player, Arguments arguments, BrushSettings settings) throws WorldEditException { LocalSession session = worldEdit.getSessionManager().get(player); @@ -1081,194 +1274,6 @@ public class BrushCommands { return process(player, arguments, bs); } - @Command( - name = "savebrush", - aliases = { "save" }, - desc = "Save your current brush" - ) - @CommandPermissions("worldedit.brush.save") - public void saveBrush(Player player, LocalSession session, - @Arg(desc = "String name") - String name, - @Switch(name = 'g', desc = "Save the brush globally") - boolean root) throws WorldEditException, IOException { - BrushTool tool = session.getBrushTool(player); - if (tool != null) { - root |= name.startsWith("../"); - name = FileSystems.getDefault().getPath(name).getFileName().toString(); - File folder = MainUtil.getFile(Fawe.imp().getDirectory(), "brushes"); - name = name.endsWith(".jsgz") ? name : name + ".jsgz"; - File file; - if (root && player.hasPermission("worldedit.brush.save.other")) { - file = new File(folder, name); - } else { - file = new File(folder, player.getUniqueId() + File.separator + name); - } - File parent = file.getParentFile(); - if (!parent.exists()) { - parent.mkdirs(); - } - file.createNewFile(); - try (DataOutputStream out = new DataOutputStream( - new PGZIPOutputStream(new FileOutputStream(file)))) { - out.writeUTF(tool.toString()); - } catch (Throwable e) { - e.printStackTrace(); - } - player.print(Caption.of("fawe.worldedit.schematic.schematic.saved", name)); - } else { - player.print(Caption.of("fawe.worldedit.brush.brush.none")); - } - } - - // TODO: Write a Brush standard format. - /* @Command( - name = "loadbrush", - aliases = {"load"}, - desc = "Load a brush" - ) - @CommandPermissions("worldedit.brush.load") - public void loadBrush(Player player, LocalSession session, @Arg(desc = "String name") String name) - throws WorldEditException, IOException { - name = FileSystems.getDefault().getPath(name).getFileName().toString(); - File folder = MainUtil.getFile(Fawe.imp().getDirectory(), "brushes"); - name = name.endsWith(".jsgz") ? name : name + ".jsgz"; - File file = new File(folder, player.getUniqueId() + File.separator + name); - if (!file.exists()) { - file = new File(folder, name); - } - if (!file.exists()) { - File[] files = folder.listFiles(pathname -> false); - player.print(Caption.of("fawe.error.brush.not.found", name)); - return; - } - try (DataInputStream in = new DataInputStream( - new GZIPInputStream(new FileInputStream(file)))) { - String json = in.readUTF(); - BrushTool tool = BrushTool.fromString(player, session, json); - BaseItem item = player.getItemInHand(HandSide.MAIN_HAND); - session.setTool(item, tool, player); - player.print(Caption.of("fawe.worldedit.brush.brush.equipped", name)); - } catch (Throwable e) { - e.printStackTrace(); - player.print(Caption.of("fawe.error.brush.incompatible")); - } - } */ - - @Command( - name = "/listbrush", - desc = "List saved brushes", - descFooter = "List all brushes in the brush directory") - @CommandPermissions("worldedit.brush.list") - public void list(Actor actor, InjectedValueAccess args, - @ArgFlag(name = 'p', desc = "Prints the requested page", def = "0") - int page) throws WorldEditException { - String baseCmd = "/brush loadbrush"; - File dir = MainUtil.getFile(Fawe.imp().getDirectory(), "brushes"); - // TODO NOT IMPLEMENTED - // UtilityCommands.list(dir, actor, args, page, null, true, baseCmd); - } - - static void setOperationBasedBrush(Player player, LocalSession session, Expression radius, Contextual factory, RegionFactory shape, String permission) - throws WorldEditException { - WorldEdit.getInstance().checkMaxBrushRadius(radius); - BrushTool tool = session.getBrushTool(player.getItemInHand(HandSide.MAIN_HAND).getType()); - tool.setSize(radius); - tool.setFill(null); - tool.setBrush(new OperationFactoryBrush(factory, shape, session), permission); - - player.print(TextComponent.of("Set brush to " + factory)); - } - - @Command( - name = "deform", - desc = "Deform brush, applies an expression to an area" - ) - @CommandPermissions("worldedit.brush.deform") - public void deform(Player player, LocalSession localSession, - @Arg(desc = "The shape of the region") - RegionFactory shape, - @Arg(desc = "The size of the brush", def = "5") - double radius, - @Arg(desc = "Expression to apply", def = "y-=0.2") - String expression, - @Switch(name = 'r', desc = "Use the game's coordinate origin") - boolean useRawCoords, - @Switch(name = 'o', desc = "Use the placement position as the origin") - boolean usePlacement) throws WorldEditException { - Deform deform = new Deform(expression); - if (useRawCoords) { - deform.setMode(Deform.Mode.RAW_COORD); - } else if (usePlacement) { - deform.setMode(Deform.Mode.OFFSET); - deform.setOffset(localSession.getPlacementPosition(player).toVector3()); - } - setOperationBasedBrush(player, localSession, radius, - deform, shape, "worldedit.brush.deform"); - } - - @Command( - name = "set", - desc = "Set brush, sets all blocks in the area" - ) - @CommandPermissions("worldedit.brush.set") - public void set(Player player, LocalSession localSession, - @Arg(desc = "The shape of the region") - RegionFactory shape, - @Arg(desc = "The size of the brush", def = "5") - Expression radius, - @Arg(desc = "The pattern of blocks to set") - Pattern pattern) throws WorldEditException { - setOperationBasedBrush(player, localSession, radius, - new Apply(new ReplaceFactory(pattern)), shape, "worldedit.brush.set"); - } - - @Command( - name = "forest", - desc = "Forest brush, creates a forest in the area" - ) - @CommandPermissions("worldedit.brush.forest") - public void forest(Player player, LocalSession localSession, - @Arg(desc = "The shape of the region") - RegionFactory shape, - @Arg(desc = "The size of the brush", def = "5") - Expression radius, - @Arg(desc = "The density of the brush", def = "20") - double density, - @Arg(desc = "The type of tree to use") - TreeGenerator.TreeType type) throws WorldEditException { - setOperationBasedBrush(player, localSession, radius, - new Paint(new TreeGeneratorFactory(type), density / 100), shape, "worldedit.brush.forest"); - } - - @Command( - name = "raise", - desc = "Raise brush, raise all blocks by one" - ) - @CommandPermissions("worldedit.brush.raise") - public void raise(Player player, LocalSession localSession, - @Arg(desc = "The shape of the region") - RegionFactory shape, - @Arg(desc = "The size of the brush", def = "5") - Expression radius) throws WorldEditException { - setOperationBasedBrush(player, localSession, radius, - new Deform("y-=1"), shape, "worldedit.brush.raise"); - } - - @Command( - name = "lower", - desc = "Lower brush, lower all blocks by one" - ) - @CommandPermissions("worldedit.brush.lower") - public void lower(Player player, LocalSession localSession, - @Arg(desc = "The shape of the region") - RegionFactory shape, - @Arg(desc = "The size of the brush", def = "5") - Expression radius) throws WorldEditException { - setOperationBasedBrush(player, localSession, radius, - new Deform("y+=1"), shape, "worldedit.brush.lower"); - } - static void setOperationBasedBrush(Player player, LocalSession session, double radius, Contextual factory, RegionFactory shape, @@ -1282,4 +1287,5 @@ public class BrushCommands { player.print(Caption.of("worldedit.brush.operation.equip", TextComponent.of(factory.toString()))); ToolCommands.sendUnbindInstruction(player, UNBIND_COMMAND_COMPONENT); } + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/ChunkCommands.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/ChunkCommands.java index 2119bdfd5..0a3365c93 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/ChunkCommands.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/ChunkCommands.java @@ -27,6 +27,7 @@ import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.command.util.CommandPermissions; import com.sk89q.worldedit.command.util.CommandPermissionsConditionGenerator; import com.sk89q.worldedit.command.util.Logging; +import com.sk89q.worldedit.command.util.WorldEditAsyncCommandBuilder; import com.sk89q.worldedit.entity.Player; import com.sk89q.worldedit.extension.platform.Actor; import com.sk89q.worldedit.internal.anvil.ChunkDeleter; @@ -38,6 +39,7 @@ import com.sk89q.worldedit.util.Location; import com.sk89q.worldedit.util.formatting.component.PaginationBox; import com.sk89q.worldedit.util.formatting.text.Component; import com.sk89q.worldedit.util.formatting.text.TextComponent; +import com.sk89q.worldedit.util.formatting.text.TranslatableComponent; import com.sk89q.worldedit.util.formatting.text.event.ClickEvent; import com.sk89q.worldedit.util.formatting.text.format.TextColor; import com.sk89q.worldedit.world.World; @@ -100,6 +102,12 @@ public class ChunkCommands { @ArgFlag(name = 'p', desc = "Page number.", def = "1") int page) throws WorldEditException { final Region region = session.getSelection(world); + WorldEditAsyncCommandBuilder.createAndSendMessage(actor, + () -> new ChunkListPaginationBox(region).create(page), + TranslatableComponent.of( + "worldedit.listchunks.listfor", + TextComponent.of(actor.getName()) + )); actor.print(new ChunkListPaginationBox(region).create(page)); actor.print(Caption.of("worldedit.listchunks.listfor", TextComponent.of(actor.getName()))); } @@ -178,6 +186,10 @@ public class ChunkCommands { ChunkListPaginationBox(Region region) { super("Selected Chunks", "/listchunks -p %page%"); + // TODO make efficient/streamable/calculable implementations of this + // for most region types, so we can just store the region and random-access get one page of chunks + // (this is non-trivial for some types of selections...) + //this.region = region.clone(); this.chunks = new ArrayList<>(region.getChunks()); } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/ClipboardCommands.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/ClipboardCommands.java index 30543ab64..295cc6a5e 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/ClipboardCommands.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/ClipboardCommands.java @@ -24,13 +24,13 @@ import com.fastasyncworldedit.core.FaweCache; import com.fastasyncworldedit.core.configuration.Caption; import com.fastasyncworldedit.core.configuration.Settings; import com.fastasyncworldedit.core.object.FaweLimit; -import com.fastasyncworldedit.core.object.RunnableVal; -import com.fastasyncworldedit.core.object.clipboard.DiskOptimizedClipboard; -import com.fastasyncworldedit.core.object.clipboard.MultiClipboardHolder; -import com.fastasyncworldedit.core.object.clipboard.ReadOnlyClipboard; -import com.fastasyncworldedit.core.object.clipboard.URIClipboardHolder; -import com.fastasyncworldedit.core.object.exception.FaweException; -import com.fastasyncworldedit.core.object.io.FastByteArrayOutputStream; +import com.fastasyncworldedit.core.util.task.RunnableVal; +import com.fastasyncworldedit.core.extent.clipboard.DiskOptimizedClipboard; +import com.fastasyncworldedit.core.extent.clipboard.MultiClipboardHolder; +import com.fastasyncworldedit.core.extent.clipboard.ReadOnlyClipboard; +import com.fastasyncworldedit.core.extent.clipboard.URIClipboardHolder; +import com.fastasyncworldedit.core.internal.exception.FaweException; +import com.fastasyncworldedit.core.internal.io.FastByteArrayOutputStream; import com.fastasyncworldedit.core.util.ImgurUtility; import com.fastasyncworldedit.core.util.MainUtil; import com.fastasyncworldedit.core.util.MaskTraverser; @@ -45,7 +45,7 @@ import com.sk89q.worldedit.command.util.CommandPermissionsConditionGenerator; import com.sk89q.worldedit.command.util.Logging; import com.sk89q.worldedit.command.util.annotation.Confirm; import com.sk89q.worldedit.entity.Player; -import com.sk89q.worldedit.event.extent.PasteEvent; +import com.fastasyncworldedit.core.event.extent.PasteEvent; import com.sk89q.worldedit.extension.platform.Actor; import com.sk89q.worldedit.extent.clipboard.BlockArrayClipboard; import com.sk89q.worldedit.extent.clipboard.Clipboard; @@ -119,6 +119,7 @@ public class ClipboardCommands { boolean copyEntities, @Switch(name = 'b', desc = "Also copy biomes") boolean copyBiomes, + //FAWE start @Switch(name = 'c', desc = "Set the origin of the clipboard to the center of the copied region") boolean centerClipboard, @ArgFlag(name = 'm', desc = "Set the include mask, non-matching blocks become air", def = "") @@ -165,8 +166,10 @@ public class ClipboardCommands { session.setClipboard(new ClipboardHolder(clipboard)); copy.getStatusMessages().forEach(actor::print); + //FAWE end } + //FAWE start @Command( name = "/lazycopy", desc = "Lazily copy the selection to the clipboard" @@ -223,6 +226,7 @@ public class ClipboardCommands { session.setClipboard(new ClipboardHolder(lazyClipboard)); actor.print(Caption.of("fawe.worldedit.cut.command.cut.lazy", region.getArea())); }*/ + //FAWE end @Command( name = "/cut", @@ -243,6 +247,7 @@ public class ClipboardCommands { boolean copyBiomes, @ArgFlag(name = 'm', desc = "Set the exclude mask, non-matching blocks become air") Mask mask) throws WorldEditException { + //FAWE start - Inject limits & respect source mask BlockVector3 min = region.getMinimumPoint(); BlockVector3 max = region.getMaximumPoint(); @@ -289,8 +294,10 @@ public class ClipboardCommands { actor.print(Caption.of("fawe.tips.tip.lazycut")); } copy.getStatusMessages().forEach(actor::print); + //FAWE end } + //FAWE start @Command( name = "download", aliases = { "/download" }, @@ -329,7 +336,7 @@ public class ClipboardCommands { final LocalConfiguration config = WorldEdit.getInstance().getConfiguration(); final File working = WorldEdit.getInstance().getWorkingDirectoryFile(config.saveDir).getAbsoluteFile(); - url = MainUtil.upload(null, null, "zip", new RunnableVal() { + url = MainUtil.upload(null, null, "zip", new RunnableVal<>() { @Override public void run(OutputStream out) { try (ZipOutputStream zos = new ZipOutputStream(out)) { @@ -388,6 +395,61 @@ public class ClipboardCommands { } } + @Command( + name = "/place", + desc = "Place the clipboard's contents without applying transformations (e.g. rotate)" + ) + @CommandPermissions("worldedit.clipboard.place") + @Logging(PLACEMENT) + public void place(Actor actor, World world, LocalSession session, final EditSession editSession, + @Switch(name = 'a', desc = "Skip air blocks") + boolean ignoreAirBlocks, + @Switch(name = 'o', desc = "Paste at the original position") + boolean atOrigin, + @Switch(name = 's', desc = "Select the region after pasting") + boolean selectPasted, + @Switch(name = 'e', desc = "Paste entities if available") + boolean pasteEntities, + @Switch(name = 'b', desc = "Paste biomes if available") + boolean pasteBiomes) throws WorldEditException { + ClipboardHolder holder = session.getClipboard(); + final Clipboard clipboard = holder.getClipboard(); + final BlockVector3 origin = clipboard.getOrigin(); + final BlockVector3 to = atOrigin ? origin : session.getPlacementPosition(actor); + checkPaste(actor, editSession, to, holder, clipboard); + + clipboard.paste(editSession, to, !ignoreAirBlocks, pasteEntities, pasteBiomes); + + Region region = clipboard.getRegion().clone(); + if (selectPasted) { + BlockVector3 clipboardOffset = clipboard.getRegion().getMinimumPoint().subtract(clipboard.getOrigin()); + BlockVector3 realTo = to.add(holder.getTransform().apply(clipboardOffset.toVector3()).toBlockPoint()); + BlockVector3 max = realTo.add(holder.getTransform().apply(region.getMaximumPoint().subtract(region.getMinimumPoint()).toVector3()).toBlockPoint()); + RegionSelector selector = new CuboidRegionSelector(world, realTo, max); + session.setRegionSelector(world, selector); + selector.learnChanges(); + selector.explainRegionAdjust(actor, session); + } + actor.print(Caption.of("fawe.worldedit.paste.command.paste", to)); + + if (!actor.hasPermission("fawe.tips")) { + actor.print(Caption.of("fawe.tips.tip.copypaste")); + } + } + + private void saveDiskClipboard(Clipboard clipboard) { + DiskOptimizedClipboard c; + if (clipboard instanceof DiskOptimizedClipboard) + c = (DiskOptimizedClipboard) clipboard; + else if (clipboard instanceof BlockArrayClipboard + && ((BlockArrayClipboard) clipboard).getParent() instanceof DiskOptimizedClipboard) + c = (DiskOptimizedClipboard) ((BlockArrayClipboard) clipboard).getParent(); + else + return; + c.flush(); + } + //FAWE end + @Command( name = "/paste", aliases = {"/p", "/pa"}, @@ -414,8 +476,10 @@ public class ClipboardCommands { ClipboardHolder holder = session.getClipboard(); if (holder.getTransform().isIdentity() && editSession.getSourceMask() == null) { + //FAWE start - use place place(actor, world, session, editSession, ignoreAirBlocks, atOrigin, selectPasted, pasteEntities, pasteBiomes); + //FAWE end return; } Clipboard clipboard = holder.getClipboard(); @@ -423,7 +487,9 @@ public class ClipboardCommands { List messages = Lists.newArrayList(); BlockVector3 to = atOrigin ? clipboard.getOrigin() : session.getPlacementPosition(actor); + //FAWE start checkPaste(actor, editSession, to, holder, clipboard); + //FAWE end if (!onlySelect) { Operation operation = holder @@ -456,6 +522,7 @@ public class ClipboardCommands { messages.forEach(actor::print); } + //FAWE start private void checkPaste(Actor player, EditSession editSession, BlockVector3 to, ClipboardHolder holder, Clipboard clipboard) { URI uri = null; if (holder instanceof URIClipboardHolder) { @@ -467,48 +534,7 @@ public class ClipboardCommands { throw new FaweException(Caption.of("fawe.cancel.worldedit.cancel.reason.manual")); } } - - @Command( - name = "/place", - desc = "Place the clipboard's contents without applying transformations (e.g. rotate)" - ) - @CommandPermissions("worldedit.clipboard.place") - @Logging(PLACEMENT) - public void place(Actor actor, World world, LocalSession session, final EditSession editSession, - @Switch(name = 'a', desc = "Skip air blocks") - boolean ignoreAirBlocks, - @Switch(name = 'o', desc = "Paste at the original position") - boolean atOrigin, - @Switch(name = 's', desc = "Select the region after pasting") - boolean selectPasted, - @Switch(name = 'e', desc = "Paste entities if available") - boolean pasteEntities, - @Switch(name = 'b', desc = "Paste biomes if available") - boolean pasteBiomes) throws WorldEditException { - ClipboardHolder holder = session.getClipboard(); - final Clipboard clipboard = holder.getClipboard(); - final BlockVector3 origin = clipboard.getOrigin(); - final BlockVector3 to = atOrigin ? origin : session.getPlacementPosition(actor); - checkPaste(actor, editSession, to, holder, clipboard); - - clipboard.paste(editSession, to, !ignoreAirBlocks, pasteEntities, pasteBiomes); - - Region region = clipboard.getRegion().clone(); - if (selectPasted) { - BlockVector3 clipboardOffset = clipboard.getRegion().getMinimumPoint().subtract(clipboard.getOrigin()); - BlockVector3 realTo = to.add(holder.getTransform().apply(clipboardOffset.toVector3()).toBlockPoint()); - BlockVector3 max = realTo.add(holder.getTransform().apply(region.getMaximumPoint().subtract(region.getMinimumPoint()).toVector3()).toBlockPoint()); - RegionSelector selector = new CuboidRegionSelector(world, realTo, max); - session.setRegionSelector(world, selector); - selector.learnChanges(); - selector.explainRegionAdjust(actor, session); - } - actor.print(Caption.of("fawe.worldedit.paste.command.paste", to)); - - if (!actor.hasPermission("fawe.tips")) { - actor.print(Caption.of("fawe.tips.tip.copypaste")); - } - } + //FAWE end @Command( name = "/rotate", @@ -559,16 +585,4 @@ public class ClipboardCommands { session.setClipboard(null); actor.print(Caption.of("worldedit.clearclipboard.cleared")); } - - private void saveDiskClipboard(Clipboard clipboard) { - DiskOptimizedClipboard c; - if (clipboard instanceof DiskOptimizedClipboard) - c = (DiskOptimizedClipboard) clipboard; - else if (clipboard instanceof BlockArrayClipboard - && ((BlockArrayClipboard) clipboard).getParent() instanceof DiskOptimizedClipboard) - c = (DiskOptimizedClipboard) ((BlockArrayClipboard) clipboard).getParent(); - else - return; - c.flush(); - } } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/FlattenedClipboardTransform.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/FlattenedClipboardTransform.java index 50eebbce4..eb43a4000 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/FlattenedClipboardTransform.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/FlattenedClipboardTransform.java @@ -83,7 +83,8 @@ public class FlattenedClipboardTransform { minimum.withZ(maximum.getZ()), maximum.withX(minimum.getX()), maximum.withY(minimum.getY()), - maximum.withZ(minimum.getZ()) }; + maximum.withZ(minimum.getZ()) + }; for (int i = 0; i < corners.length; i++) { corners[i] = transformAround.apply(corners[i]); @@ -112,10 +113,12 @@ public class FlattenedClipboardTransform { * @return the operation */ public Operation copyTo(Extent target) { + //FAWE start Extent extent = original; if (transform != null && !transform.isIdentity()) { extent = new BlockTransformExtent(original, transform); } + //FAWE end ForwardExtentCopy copy = new ForwardExtentCopy(extent, original.getRegion(), original.getOrigin(), target, original.getOrigin()); copy.setTransform(transform); if (original.hasBiomes()) { diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/GeneralCommands.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/GeneralCommands.java index 9652fe1cf..39c962548 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/GeneralCommands.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/GeneralCommands.java @@ -21,7 +21,7 @@ package com.sk89q.worldedit.command; import com.fastasyncworldedit.core.Fawe; import com.fastasyncworldedit.core.configuration.Caption; -import com.fastasyncworldedit.core.object.extent.ResettableExtent; +import com.fastasyncworldedit.core.extent.ResettableExtent; import com.fastasyncworldedit.core.util.CachedTextureUtil; import com.fastasyncworldedit.core.util.CleanTextureUtil; import com.fastasyncworldedit.core.util.MathMan; @@ -48,6 +48,7 @@ import com.sk89q.worldedit.extent.clipboard.Clipboard; import com.sk89q.worldedit.function.mask.Mask; import com.sk89q.worldedit.internal.command.CommandRegistrationHandler; import com.sk89q.worldedit.internal.command.CommandUtil; +import com.sk89q.worldedit.internal.cui.ServerCUIHandler; import com.sk89q.worldedit.util.SideEffect; import com.sk89q.worldedit.util.SideEffectSet; import com.sk89q.worldedit.util.auth.AuthorizationException; @@ -102,7 +103,7 @@ public class GeneralCommands { Set commands = collect.getAllCommands() .collect(Collectors.toSet()); for (org.enginehub.piston.Command command : commands) { - /*if in FAWE, //fast will remain for now + /*FAWE start - if in FAWE, //fast will remain for now (command.getName().equals("/fast")) { // deprecate to `//perf` @@ -211,30 +212,6 @@ public class GeneralCommands { actor.print(component); } - @Command( - name = "/fast", - desc = "Toggle fast mode" - ) - @CommandPermissions("worldedit.fast") - @Deprecated - void fast(Actor actor, LocalSession session, - @Arg(desc = "The new fast mode state", def = "") - Boolean fastMode) { - boolean hasFastMode = session.hasFastMode(); - if (fastMode != null && fastMode == hasFastMode) { - actor.print(Caption.of(fastMode ? "worldedit.fast.enabled.already" : "worldedit.fast.disabled.already")); - return; - } - - if (hasFastMode) { - session.setFastMode(false); - actor.print(Caption.of("worldedit.fast.disabled")); - } else { - session.setFastMode(true); - actor.print(Caption.of("worldedit.fast.enabled")); - } - } - @Command( name = "/perf", desc = "Toggle side effects for performance", @@ -338,7 +315,8 @@ public class GeneralCommands { } else { session.setUseServerCUI(true); session.updateServerCUI(player); - player.print(Caption.of("worldedit.drawsel.enabled")); + int maxSize = ServerCUIHandler.getMaxServerCuiSize(); + player.print(Caption.of("worldedit.drawsel.enabled", TextComponent.of(maxSize), TextComponent.of(maxSize), TextComponent.of(maxSize))); } } @@ -487,6 +465,7 @@ public class GeneralCommands { } } + //FAWE start @Command( name = "/gtexture", aliases = {"gtexture"}, @@ -601,4 +580,29 @@ public class GeneralCommands { player.print(Caption.of("fawe.info.worldedit.toggle.tips.off")); } } + + @Command( + name = "/fast", + desc = "Toggle fast mode" + ) + @CommandPermissions("worldedit.fast") + @Deprecated + void fast(Actor actor, LocalSession session, + @Arg(desc = "The new fast mode state", def = "") + Boolean fastMode) { + boolean hasFastMode = session.hasFastMode(); + if (fastMode != null && fastMode == hasFastMode) { + actor.print(Caption.of(fastMode ? "worldedit.fast.enabled.already" : "worldedit.fast.disabled.already")); + return; + } + + if (hasFastMode) { + session.setFastMode(false); + actor.print(Caption.of("worldedit.fast.disabled")); + } else { + session.setFastMode(true); + actor.print(Caption.of("worldedit.fast.enabled")); + } + } + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/GenerationCommands.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/GenerationCommands.java index 9cf12b3ac..1360c7cd6 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/GenerationCommands.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/GenerationCommands.java @@ -34,7 +34,7 @@ import com.sk89q.worldedit.command.util.Logging; import com.sk89q.worldedit.command.util.annotation.Confirm; import com.sk89q.worldedit.entity.Player; import com.sk89q.worldedit.extension.platform.Actor; -import com.sk89q.worldedit.function.generator.CavesGen; +import com.fastasyncworldedit.core.function.generator.CavesGen; import com.sk89q.worldedit.function.mask.Mask; import com.sk89q.worldedit.function.operation.Operations; import com.sk89q.worldedit.function.pattern.Pattern; @@ -87,111 +87,6 @@ public class GenerationCommands { this.worldEdit = worldEdit; } - @Command( - name = "/caves", - desc = "Generates a cave network" - ) - @CommandPermissions("worldedit.generation.caves") - @Logging(PLACEMENT) - @Confirm(Confirm.Processor.REGION) - public void caves(Actor actor, LocalSession session, EditSession editSession, @Selection Region region, - @Arg(name = "size", desc = "TODO", def = "8") int sizeOpt, - @Arg(name = "frequency", desc = "TODO", def = "40") int frequencyOpt, - @Arg(name = "rarity", desc = "TODO", def = "7") int rarityOpt, - @Arg(name = "minY", desc = "TODO", def = "8") int minYOpt, - @Arg(name = "maxY", desc = "TODO", def = "127") int maxYOpt, - @Arg(name = "systemFrequency", desc = "TODO", def = "1") int systemFrequencyOpt, - @Arg(name = "individualRarity", desc = "TODO", def = "25") int individualRarityOpt, - @Arg(name = "pocketChance", desc = "TODO", def = "0") int pocketChanceOpt, - @Arg(name = "pocketMin", desc = "TODO", def = "0") int pocketMinOpt, - @Arg(name = "pocketMax", desc = "TODO", def = "3") int pocketMaxOpt) throws WorldEditException { - CavesGen gen = new CavesGen(sizeOpt, frequencyOpt, rarityOpt, minYOpt, maxYOpt, systemFrequencyOpt, individualRarityOpt, pocketChanceOpt, pocketMinOpt, pocketMaxOpt); - editSession.generate(region, gen); - actor.print(Caption.of("fawe.worldedit.visitor.visitor.block", editSession.getBlockChangeCount())); - } - - - @Command( - name = "/ores", - desc = "Generates ores" - ) - @CommandPermissions("worldedit.generation.ore") - @Logging(PLACEMENT) - @Confirm(Confirm.Processor.REGION) - public void ores(Actor actor, LocalSession session, EditSession editSession, @Selection Region region, @Arg(desc = "Mask") Mask mask) throws WorldEditException { - editSession.addOres(region, mask); - actor.print(Caption.of("fawe.worldedit.visitor.visitor.block", editSession.getBlockChangeCount())); - } - - @Command( - name = "/img", - aliases = { "/image", "image" }, - desc = "Generate an image" - ) - @CommandPermissions("worldedit.generation.image") - @Logging(PLACEMENT) - public void image(Actor actor, - LocalSession session, - EditSession editSession, - @Arg(desc = "Image URL (imgur only)") String imageURL, - @Arg(desc = "boolean", def = "true") boolean randomize, - @Arg(desc = "TODO", def = "100") int threshold, - @Arg(desc = "BlockVector2", def = "") BlockVector2 dimensions) throws WorldEditException, IOException { - TextureUtil tu = Fawe.get().getCachedTextureUtil(randomize, 0, threshold); - URL url = new URL(imageURL); - if (!url.getHost().equalsIgnoreCase("i.imgur.com")) { - throw new IOException("Only i.imgur.com links are allowed!"); - } - BufferedImage image = MainUtil.readImage(url); - if (dimensions != null) { - image = ImageUtil.getScaledInstance(image, dimensions.getBlockX(), dimensions.getBlockZ(), - RenderingHints.VALUE_INTERPOLATION_BILINEAR, false); - } - - BlockVector3 pos1 = session.getPlacementPosition(actor); - BlockVector3 pos2 = pos1.add(image.getWidth() - 1, 0, image.getHeight() - 1); - CuboidRegion region = new CuboidRegion(pos1, pos2); - int[] count = new int[1]; - final BufferedImage finalImage = image; - RegionVisitor visitor = new RegionVisitor(region, pos -> { - try { - int x = pos.getBlockX() - pos1.getBlockX(); - int z = pos.getBlockZ() - pos1.getBlockZ(); - int color = finalImage.getRGB(x, z); - BlockType block = tu.getNearestBlock(color); - count[0]++; - if (block != null) { - return editSession.setBlock(pos, block.getDefaultState()); - } - return false; - } catch (Throwable e) { - e.printStackTrace(); - } - return false; - }); - Operations.completeBlindly(visitor); - actor.print(Caption.of("fawe.worldedit.visitor.visitor.block", editSession.getBlockChangeCount())); - } - - @Command(name = "/ore", desc = "Generates ores") - @CommandPermissions("worldedit.generation.ore") - @Logging(PLACEMENT) - @Confirm(Confirm.Processor.REGION) - public void ore(Actor actor, - LocalSession session, - EditSession editSession, - @Selection Region region, - @Arg(desc = "Mask") Mask mask, - @Arg(desc = "Pattern") Pattern material, - @Arg(desc = "Ore vein size") @Range(from = 0, to = Integer.MAX_VALUE) int size, - @Arg(desc = "Ore vein frequency (number of times to attempt to place ore)", def = "10") @Range(from = 0, to = Integer.MAX_VALUE) int freq, - @Arg(desc = "Ore vein rarity (% chance each attempt is placed)", def = "100") @Range(from = 0, to = 100) int rarity, - @Arg(desc = "Ore vein min y", def = "0") @Range(from = 0, to = 255) int minY, - @Arg(desc = "Ore vein max y", def = "63") @Range(from = 0, to = 255) int maxY) throws WorldEditException { - editSession.addOre(region, mask, material, size, freq, rarity, minY, maxY); - actor.print(Caption.of("fawe.worldedit.visitor.visitor.block", editSession.getBlockChangeCount())); - } - @Command( name = "/hcyl", desc = "Generates a hollow cylinder." @@ -539,4 +434,111 @@ public class GenerationCommands { } } + //FAWE start + @Command( + name = "/caves", + desc = "Generates a cave network" + ) + @CommandPermissions("worldedit.generation.caves") + @Logging(PLACEMENT) + @Confirm(Confirm.Processor.REGION) + public void caves(Actor actor, LocalSession session, EditSession editSession, @Selection Region region, + @Arg(name = "size", desc = "TODO", def = "8") int sizeOpt, + @Arg(name = "frequency", desc = "TODO", def = "40") int frequencyOpt, + @Arg(name = "rarity", desc = "TODO", def = "7") int rarityOpt, + @Arg(name = "minY", desc = "TODO", def = "8") int minYOpt, + @Arg(name = "maxY", desc = "TODO", def = "127") int maxYOpt, + @Arg(name = "systemFrequency", desc = "TODO", def = "1") int systemFrequencyOpt, + @Arg(name = "individualRarity", desc = "TODO", def = "25") int individualRarityOpt, + @Arg(name = "pocketChance", desc = "TODO", def = "0") int pocketChanceOpt, + @Arg(name = "pocketMin", desc = "TODO", def = "0") int pocketMinOpt, + @Arg(name = "pocketMax", desc = "TODO", def = "3") int pocketMaxOpt) throws WorldEditException { + CavesGen gen = new CavesGen(sizeOpt, frequencyOpt, rarityOpt, minYOpt, maxYOpt, systemFrequencyOpt, individualRarityOpt, pocketChanceOpt, pocketMinOpt, pocketMaxOpt); + editSession.generate(region, gen); + actor.print(Caption.of("fawe.worldedit.visitor.visitor.block", editSession.getBlockChangeCount())); + } + + + @Command( + name = "/ores", + desc = "Generates ores" + ) + @CommandPermissions("worldedit.generation.ore") + @Logging(PLACEMENT) + @Confirm(Confirm.Processor.REGION) + public void ores(Actor actor, LocalSession session, EditSession editSession, @Selection Region region, @Arg(desc = "Mask") Mask mask) throws WorldEditException { + editSession.addOres(region, mask); + actor.print(Caption.of("fawe.worldedit.visitor.visitor.block", editSession.getBlockChangeCount())); + } + + @Command( + name = "/img", + aliases = { "/image", "image" }, + desc = "Generate an image" + ) + @CommandPermissions("worldedit.generation.image") + @Logging(PLACEMENT) + public void image(Actor actor, + LocalSession session, + EditSession editSession, + @Arg(desc = "Image URL (imgur only)") String imageURL, + @Arg(desc = "boolean", def = "true") boolean randomize, + @Arg(desc = "TODO", def = "100") int threshold, + @Arg(desc = "BlockVector2", def = "") BlockVector2 dimensions) throws WorldEditException, IOException { + TextureUtil tu = Fawe.get().getCachedTextureUtil(randomize, 0, threshold); + URL url = new URL(imageURL); + if (!url.getHost().equalsIgnoreCase("i.imgur.com")) { + throw new IOException("Only i.imgur.com links are allowed!"); + } + BufferedImage image = MainUtil.readImage(url); + if (dimensions != null) { + image = ImageUtil.getScaledInstance(image, dimensions.getBlockX(), dimensions.getBlockZ(), + RenderingHints.VALUE_INTERPOLATION_BILINEAR, false); + } + + BlockVector3 pos1 = session.getPlacementPosition(actor); + BlockVector3 pos2 = pos1.add(image.getWidth() - 1, 0, image.getHeight() - 1); + CuboidRegion region = new CuboidRegion(pos1, pos2); + int[] count = new int[1]; + final BufferedImage finalImage = image; + RegionVisitor visitor = new RegionVisitor(region, pos -> { + try { + int x = pos.getBlockX() - pos1.getBlockX(); + int z = pos.getBlockZ() - pos1.getBlockZ(); + int color = finalImage.getRGB(x, z); + BlockType block = tu.getNearestBlock(color); + count[0]++; + if (block != null) { + return editSession.setBlock(pos, block.getDefaultState()); + } + return false; + } catch (Throwable e) { + e.printStackTrace(); + } + return false; + }); + Operations.completeBlindly(visitor); + actor.print(Caption.of("fawe.worldedit.visitor.visitor.block", editSession.getBlockChangeCount())); + } + + @Command(name = "/ore", desc = "Generates ores") + @CommandPermissions("worldedit.generation.ore") + @Logging(PLACEMENT) + @Confirm(Confirm.Processor.REGION) + public void ore(Actor actor, + LocalSession session, + EditSession editSession, + @Selection Region region, + @Arg(desc = "Mask") Mask mask, + @Arg(desc = "Pattern") Pattern material, + @Arg(desc = "Ore vein size") @Range(from = 0, to = Integer.MAX_VALUE) int size, + @Arg(desc = "Ore vein frequency (number of times to attempt to place ore)", def = "10") @Range(from = 0, to = Integer.MAX_VALUE) int freq, + @Arg(desc = "Ore vein rarity (% chance each attempt is placed)", def = "100") @Range(from = 0, to = 100) int rarity, + @Arg(desc = "Ore vein min y", def = "0") @Range(from = 0, to = 255) int minY, + @Arg(desc = "Ore vein max y", def = "63") @Range(from = 0, to = 255) int maxY) throws WorldEditException { + editSession.addOre(region, mask, material, size, freq, rarity, minY, maxY); + actor.print(Caption.of("fawe.worldedit.visitor.visitor.block", editSession.getBlockChangeCount())); + } + //FAWE end + } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/HistoryCommands.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/HistoryCommands.java index a5b601bb6..9138b00b5 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/HistoryCommands.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/HistoryCommands.java @@ -68,10 +68,12 @@ public class HistoryCommands { String playerName) throws WorldEditException { times = Math.max(1, times); LocalSession undoSession = session; + //FAWE start - Add fastmode check if (session.hasFastMode()) { actor.print(Caption.of("fawe.worldedit.history.command.undo.disabled")); return; } + //FAWE end if (playerName != null) { actor.checkPermission("worldedit.history.undo.other"); undoSession = worldEdit.getSessionManager().findByName(playerName); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/HistorySubCommands.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/HistorySubCommands.java index b7809ee5f..e4f1f4b83 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/HistorySubCommands.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/HistorySubCommands.java @@ -6,9 +6,9 @@ import com.fastasyncworldedit.core.configuration.Caption; import com.fastasyncworldedit.core.configuration.Settings; import com.fastasyncworldedit.core.database.DBHandler; import com.fastasyncworldedit.core.database.RollbackDatabase; -import com.fastasyncworldedit.core.logging.RollbackOptimizedHistory; -import com.fastasyncworldedit.core.object.RegionWrapper; -import com.fastasyncworldedit.core.object.changeset.SimpleChangeSetSummary; +import com.fastasyncworldedit.core.history.RollbackOptimizedHistory; +import com.fastasyncworldedit.core.regions.RegionWrapper; +import com.fastasyncworldedit.core.history.changeset.SimpleChangeSetSummary; import com.fastasyncworldedit.core.util.MainUtil; import com.fastasyncworldedit.core.util.StringMan; import com.google.common.base.Function; @@ -22,8 +22,8 @@ import com.sk89q.worldedit.command.util.annotation.Confirm; import com.sk89q.worldedit.entity.Player; import com.sk89q.worldedit.extension.platform.Actor; import com.sk89q.worldedit.history.changeset.ChangeSet; -import com.sk89q.worldedit.internal.annotation.AllowedRegion; -import com.sk89q.worldedit.internal.annotation.Time; +import com.sk89q.worldedit.command.util.annotation.AllowedRegion; +import com.sk89q.worldedit.command.util.annotation.Time; import com.sk89q.worldedit.math.BlockVector2; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.regions.Region; @@ -76,7 +76,7 @@ public class HistorySubCommands { + " - The time uses s, m, h, d, y.\n" + " - Import from disk: /history import" ) - @CommandPermissions("worldedit.history.redo") + @CommandPermissions("worldedit.history.restore") @Confirm public synchronized void rerun(Player player, World world, RollbackDatabase database, @AllowedRegion Region[] allowedRegions, @@ -96,7 +96,7 @@ public class HistorySubCommands { desc = "Undo a specific edit. " + " - The time uses s, m, h, d, y." ) - @CommandPermissions("worldedit.history.undo") + @CommandPermissions("worldedit.history.rollback") @Confirm public synchronized void rollback(Player player, World world, RollbackDatabase database, @AllowedRegion Region[] allowedRegions, diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/NavigationCommands.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/NavigationCommands.java index f87759fbb..baf55ac29 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/NavigationCommands.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/NavigationCommands.java @@ -151,20 +151,22 @@ public class NavigationCommands { } @Command( - name = "jumpto", - aliases = { "j", "/jumpto", "/j" }, - desc = "Teleport to a location" + name = "jumpto", + aliases = { "j", "/jumpto", "/j" }, + desc = "Teleport to a location" ) @CommandPermissions("worldedit.navigation.jumpto.command") public void jumpTo(Player player, - @Arg(desc = "Location to jump to", def = "") - Location pos, - @Switch(name = 'f', desc = "force teleport") - boolean force) throws WorldEditException { + @Arg(desc = "Location to jump to", def = "") + Location pos, + //FAWE start + @Switch(name = 'f', desc = "force teleport") + boolean force) throws WorldEditException { if (pos == null) { pos = player.getSolidBlockTrace(300); } + //FAWE end if (pos != null) { player.findFreePosition(pos); player.print(Caption.of("worldedit.jumpto.moved")); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/RegionCommands.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/RegionCommands.java index f04d4b6ab..29ca4ce88 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/RegionCommands.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/RegionCommands.java @@ -23,7 +23,7 @@ import com.fastasyncworldedit.core.FaweAPI; import com.fastasyncworldedit.core.FaweCache; import com.fastasyncworldedit.core.configuration.Caption; import com.fastasyncworldedit.core.object.FaweLimit; -import com.fastasyncworldedit.core.object.RelightMode; +import com.fastasyncworldedit.core.extent.processor.lighting.RelightMode; import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.LocalSession; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/SchematicCommands.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/SchematicCommands.java index 4aae1afe7..c48a8552d 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/SchematicCommands.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/SchematicCommands.java @@ -21,9 +21,9 @@ package com.sk89q.worldedit.command; import com.fastasyncworldedit.core.configuration.Caption; import com.fastasyncworldedit.core.configuration.Settings; -import com.fastasyncworldedit.core.object.clipboard.MultiClipboardHolder; -import com.fastasyncworldedit.core.object.clipboard.URIClipboardHolder; -import com.fastasyncworldedit.core.object.schematic.MinecraftStructure; +import com.fastasyncworldedit.core.extent.clipboard.MultiClipboardHolder; +import com.fastasyncworldedit.core.extent.clipboard.URIClipboardHolder; +import com.fastasyncworldedit.core.extent.clipboard.io.schematic.MinecraftStructure; import com.fastasyncworldedit.core.util.MainUtil; import com.google.common.base.Function; import com.google.common.collect.Multimap; @@ -36,7 +36,7 @@ import com.sk89q.worldedit.command.util.AsyncCommandBuilder; import com.sk89q.worldedit.command.util.CommandPermissions; import com.sk89q.worldedit.command.util.CommandPermissionsConditionGenerator; import com.sk89q.worldedit.entity.Player; -import com.sk89q.worldedit.event.extent.ActorSaveClipboardEvent; +import com.fastasyncworldedit.core.event.extent.ActorSaveClipboardEvent; import com.sk89q.worldedit.extension.platform.Actor; import com.sk89q.worldedit.extension.platform.Capability; import com.sk89q.worldedit.extent.clipboard.BlockArrayClipboard; @@ -115,6 +115,7 @@ public class SchematicCommands { this.worldEdit = worldEdit; } + //FAWE start //TODO filtering for directories, global, and private scheamtics needs to be reimplemented here private static List getFiles(File root, String filter, ClipboardFormat format) { File[] files = root.listFiles(); @@ -215,6 +216,76 @@ public class SchematicCommands { player.print(Caption.of("fawe.worldedit.clipboard.clipboard.uri.not.found", fileName)); } + //FAWE start + @Command( + name = "move", + aliases = {"m"}, + desc = "Move your loaded schematic" + ) + @CommandPermissions({"worldedit.schematic.move", "worldedit.schematic.move.other"}) + public void move(Player player, LocalSession session, String directory) throws WorldEditException, IOException { + LocalConfiguration config = worldEdit.getConfiguration(); + File working = worldEdit.getWorkingDirectoryPath(config.saveDir).toFile(); + File dir = Settings.IMP.PATHS.PER_PLAYER_SCHEMATICS ? new File(working, player.getUniqueId().toString()) : working; + File destDir = new File(dir, directory); + if (!MainUtil.isInSubDirectory(working, destDir)) { + player.print(Caption.of("worldedit.schematic.directory-does-not-exist", TextComponent.of(String.valueOf(destDir)))); + return; + } + if (Settings.IMP.PATHS.PER_PLAYER_SCHEMATICS && !MainUtil.isInSubDirectory(dir, destDir) && !player.hasPermission("worldedit.schematic.move.other")) { + player.print(Caption.of("fawe.error.no-perm", "worldedit.schematic.move.other")); + return; + } + ClipboardHolder clipboard = session.getClipboard(); + List sources = getFiles(clipboard); + if (sources.isEmpty()) { + player.print(Caption.of("fawe.worldedit.schematic.schematic.none")); + return; + } + if (!destDir.exists() && !destDir.mkdirs()) { + player.print(Caption.of("worldedit.schematic.file-perm-fail", TextComponent.of(String.valueOf(destDir)))); + return; + } + for (File source : sources) { + File destFile = new File(destDir, source.getName()); + if (destFile.exists()) { + player.print(Caption.of("fawe.worldedit.schematic.schematic.move.exists", destFile)); + continue; + } + if (Settings.IMP.PATHS.PER_PLAYER_SCHEMATICS && (!MainUtil.isInSubDirectory(dir, destFile) || !MainUtil.isInSubDirectory(dir, source)) && !player.hasPermission("worldedit.schematic.delete.other")) { + player.print(Caption.of("fawe.worldedit.schematic.schematic.move.failed", destFile, + Caption.of("fawe.error.no-perm", ("worldedit.schematic.move.other")))); + continue; + } + try { + File cached = new File(source.getParentFile(), "." + source.getName() + ".cached"); + Files.move(source.toPath(), destFile.toPath()); + if (cached.exists()) { + Files.move(cached.toPath(), destFile.toPath()); + } + player.print(Caption.of("fawe.worldedit.schematic.schematic.move.success", source, destFile)); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + } + + private List getFiles(ClipboardHolder clipboard) { + Collection uris = Collections.emptyList(); + if (clipboard instanceof URIClipboardHolder) { + uris = ((URIClipboardHolder) clipboard).getURIs(); + } + List files = new ArrayList<>(); + for (URI uri : uris) { + File file = new File(uri); + if (file.exists()) { + files.add(file); + } + } + return files; + } + //FAWE end + @Command( name = "load", desc = "Load a schematic into your clipboard" @@ -227,6 +298,7 @@ public class SchematicCommands { String formatName) throws FilenameException { LocalConfiguration config = worldEdit.getConfiguration(); + //FAWE start ClipboardFormat format = null; InputStream in = null; try { @@ -313,6 +385,7 @@ public class SchematicCommands { } } } + //FAWE end } @Command( @@ -327,8 +400,10 @@ public class SchematicCommands { String formatName, @Switch(name = 'f', desc = "Overwrite an existing file.") boolean allowOverwrite, + //FAWE start @Switch(name = 'g', desc = "Bypasses per-player-schematic folders") boolean global) throws WorldEditException { + //FAWE end if (worldEdit.getPlatformManager().queryCapability(Capability.GAME_HOOKS).getDataVersion() == -1) { actor.printError(TranslatableComponent.of("worldedit.schematic.unsupported-minecraft-version")); return; @@ -338,6 +413,7 @@ public class SchematicCommands { File dir = worldEdit.getWorkingDirectoryPath(config.saveDir).toFile(); + //FAWE start if (!global && Settings.IMP.PATHS.PER_PLAYER_SCHEMATICS) { dir = new File(dir, actor.getUniqueId().toString()); } @@ -361,6 +437,7 @@ public class SchematicCommands { } } + //FAWE end File f = worldEdit.getSafeSaveFile(actor, dir, filename, format.getPrimaryFileExtension()); boolean overwrite = f.exists(); @@ -394,80 +471,12 @@ public class SchematicCommands { SchematicSaveTask task = new SchematicSaveTask(actor, f, dir, format, holder, overwrite); AsyncCommandBuilder.wrap(task, actor) .registerWithSupervisor(worldEdit.getSupervisor(), "Saving schematic " + filename) - .sendMessageAfterDelay(Caption.of("worldedit.schematic.save.saving")) + .setDelayMessage(Caption.of("worldedit.schematic.save.saving")) .onSuccess(filename + " saved" + (overwrite ? " (overwriting previous file)." : "."), null) .onFailure(Caption.of("worldedit.schematic.failed-to-save"), worldEdit.getPlatformManager().getPlatformCommandManager().getExceptionConverter()) .buildAndExec(worldEdit.getExecutorService()); } - @Command( - name = "move", - aliases = {"m"}, - desc = "Move your loaded schematic" - ) - @CommandPermissions({"worldedit.schematic.move", "worldedit.schematic.move.other"}) - public void move(Player player, LocalSession session, String directory) throws WorldEditException, IOException { - LocalConfiguration config = worldEdit.getConfiguration(); - File working = worldEdit.getWorkingDirectoryPath(config.saveDir).toFile(); - File dir = Settings.IMP.PATHS.PER_PLAYER_SCHEMATICS ? new File(working, player.getUniqueId().toString()) : working; - File destDir = new File(dir, directory); - if (!MainUtil.isInSubDirectory(working, destDir)) { - player.print(Caption.of("worldedit.schematic.directory-does-not-exist", TextComponent.of(String.valueOf(destDir)))); - return; - } - if (Settings.IMP.PATHS.PER_PLAYER_SCHEMATICS && !MainUtil.isInSubDirectory(dir, destDir) && !player.hasPermission("worldedit.schematic.move.other")) { - player.print(Caption.of("fawe.error.no-perm", "worldedit.schematic.move.other")); - return; - } - ClipboardHolder clipboard = session.getClipboard(); - List sources = getFiles(clipboard); - if (sources.isEmpty()) { - player.print(Caption.of("fawe.worldedit.schematic.schematic.none")); - return; - } - if (!destDir.exists() && !destDir.mkdirs()) { - player.print(Caption.of("worldedit.schematic.file-perm-fail", TextComponent.of(String.valueOf(destDir)))); - return; - } - for (File source : sources) { - File destFile = new File(destDir, source.getName()); - if (destFile.exists()) { - player.print(Caption.of("fawe.worldedit.schematic.schematic.move.exists", destFile)); - continue; - } - if (Settings.IMP.PATHS.PER_PLAYER_SCHEMATICS && (!MainUtil.isInSubDirectory(dir, destFile) || !MainUtil.isInSubDirectory(dir, source)) && !player.hasPermission("worldedit.schematic.delete.other")) { - player.print(Caption.of("fawe.worldedit.schematic.schematic.move.failed", destFile, - Caption.of("fawe.error.no-perm", ("worldedit.schematic.move.other")))); - continue; - } - try { - File cached = new File(source.getParentFile(), "." + source.getName() + ".cached"); - Files.move(source.toPath(), destFile.toPath()); - if (cached.exists()) { - Files.move(cached.toPath(), destFile.toPath()); - } - player.print(Caption.of("fawe.worldedit.schematic.schematic.move.success", source, destFile)); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - } - - private List getFiles(ClipboardHolder clipboard) { - Collection uris = Collections.emptyList(); - if (clipboard instanceof URIClipboardHolder) { - uris = ((URIClipboardHolder) clipboard).getURIs(); - } - List files = new ArrayList<>(); - for (URI uri : uris) { - File file = new File(uri); - if (file.exists()) { - files.add(file); - } - } - return files; - } - @Command( name = "formats", aliases = {"listformats", "f"}, @@ -514,6 +523,7 @@ public class SchematicCommands { if (oldFirst && newFirst) { throw new StopExecutionException(Caption.of("worldedit.schematic.sorting-old-new")); } + //FAWE start String pageCommand = "/" + arguments.get(); LocalConfiguration config = worldEdit.getConfiguration(); File dir = worldEdit.getWorkingDirectoryPath(config.saveDir).toFile(); @@ -621,6 +631,7 @@ public class SchematicCommands { PaginationBox paginationBox = PaginationBox.fromComponents(fullHeader, pageCommand, components); actor.print(paginationBox.create(page)); } + //FAWE end } @@ -635,6 +646,7 @@ public class SchematicCommands { String filename) throws WorldEditException, IOException { LocalConfiguration config = worldEdit.getConfiguration(); File working = worldEdit.getWorkingDirectoryPath(config.saveDir).toFile(); + //FAWE start File dir = Settings.IMP.PATHS.PER_PLAYER_SCHEMATICS ? new File(working, actor.getUniqueId().toString()) : working; List files = new ArrayList<>(); @@ -664,8 +676,10 @@ public class SchematicCommands { } actor.print(Caption.of("worldedit.schematic.delete.deleted", filename)); } + //FAWE end } + //FAWE start private boolean deleteFile(File file) { if (file.delete()) { new File(file.getParentFile(), "." + file.getName() + ".cached").delete(); @@ -673,6 +687,7 @@ public class SchematicCommands { } return false; } + //FAWE end private static class SchematicLoadTask implements Callable { private final Actor actor; @@ -722,6 +737,7 @@ public class SchematicCommands { Transform transform = holder.getTransform(); Clipboard target; + //FAWE start boolean checkFilesize = false; if (Settings.IMP.PATHS.PER_PLAYER_SCHEMATICS @@ -782,6 +798,7 @@ public class SchematicCommands { }; } } + //FAWE end // If we have a transform, bake it into the copy if (transform.isIdentity()) { @@ -797,6 +814,7 @@ public class SchematicCommands { FileOutputStream fos = closer.register(new FileOutputStream(file)); BufferedOutputStream bos = closer.register(new BufferedOutputStream(fos)); ClipboardWriter writer = closer.register(format.getWriter(bos)); + //FAWE start URI uri = null; if (holder instanceof URIClipboardHolder) { uri = ((URIClipboardHolder) holder).getURI(clipboard); @@ -857,6 +875,7 @@ public class SchematicCommands { actor.print(Caption.of("fawe.cancel.worldedit.cancel.reason.manual")); } } + //FAWE end return null; } } @@ -890,6 +909,7 @@ public class SchematicCommands { return ErrorFormat.wrap("No schematics found."); } + //FAWE start File[] files = new File[fileList.size()]; fileList.toArray(files); // cleanup file list @@ -912,12 +932,14 @@ public class SchematicCommands { return res; }); + //FAWE end PaginationBox paginationBox = new SchematicPaginationBox(prefix, files, pageCommand); return paginationBox.create(page); } } private static class SchematicPaginationBox extends PaginationBox { + //FAWE start - Expand to per player schematics private final String prefix; private final File[] files; @@ -925,11 +947,13 @@ public class SchematicCommands { super("worldedit.schematic.available", pageCommand); this.prefix = rootDir == null ? "" : rootDir; this.files = files; + //FAWE end } @Override public Component getComponent(int number) { checkArgument(number < files.length && number >= 0); + //FAWE start - Per player schematic support & translatable things File file = files[number]; Multimap exts = ClipboardFormats.getFileExtensionMap(); String format = exts.get(com.google.common.io.Files.getFileExtension(file.getName())) @@ -948,6 +972,7 @@ public class SchematicCommands { .append(TextComponent.of(path) .hoverEvent(HoverEvent.of(HoverEvent.Action.SHOW_TEXT, TextComponent.of(format)))) .build(); + //FAWE end } @Override diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/SelectionCommands.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/SelectionCommands.java index 58f5a887f..07f7b092e 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/SelectionCommands.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/SelectionCommands.java @@ -20,10 +20,10 @@ package com.sk89q.worldedit.command; import com.fastasyncworldedit.core.configuration.Caption; -import com.fastasyncworldedit.core.object.clipboard.URIClipboardHolder; -import com.fastasyncworldedit.core.object.mask.IdMask; -import com.fastasyncworldedit.core.object.regions.selector.FuzzyRegionSelector; -import com.fastasyncworldedit.core.object.regions.selector.PolyhedralRegionSelector; +import com.fastasyncworldedit.core.extent.clipboard.URIClipboardHolder; +import com.fastasyncworldedit.core.function.mask.IdMask; +import com.fastasyncworldedit.core.regions.selector.FuzzyRegionSelector; +import com.fastasyncworldedit.core.regions.selector.PolyhedralRegionSelector; import com.google.common.base.Strings; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.LocalSession; @@ -47,7 +47,6 @@ import com.sk89q.worldedit.function.operation.Operations; import com.sk89q.worldedit.function.visitor.RegionVisitor; import com.sk89q.worldedit.internal.annotation.Direction; import com.sk89q.worldedit.internal.annotation.MultiDirection; -import com.sk89q.worldedit.math.BlockVector2; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.regions.Region; import com.sk89q.worldedit.regions.RegionOperationException; @@ -94,6 +93,8 @@ import java.util.stream.Stream; import static com.sk89q.worldedit.command.util.Logging.LogMode.POSITION; import static com.sk89q.worldedit.command.util.Logging.LogMode.REGION; +import static com.sk89q.worldedit.world.storage.ChunkStore.CHUNK_SHIFTS; +import static com.sk89q.worldedit.world.storage.ChunkStore.CHUNK_SHIFTS_Y; /** * Selection commands. @@ -118,10 +119,12 @@ public class SelectionCommands { @Arg(desc = "Coordinates to set position 1 to", def = "") BlockVector3 coordinates) throws WorldEditException { Location pos; + //FAWE start - clamp if (coordinates != null) { pos = new Location(world, coordinates.toVector3().clampY(0, world.getMaxY())); } else if (actor instanceof Locatable) { pos = ((Locatable) actor).getBlockLocation().clampY(0, world.getMaxY()); + //FAWE end } else { actor.print(Caption.of("worldedit.pos.console-require-coords")); return; @@ -148,9 +151,11 @@ public class SelectionCommands { BlockVector3 coordinates) throws WorldEditException { Location pos; if (coordinates != null) { + //FAWE start - clamp pos = new Location(world, coordinates.toVector3().clampY(0, world.getMaxY())); } else if (actor instanceof Locatable) { pos = ((Locatable) actor).getBlockLocation().clampY(0, world.getMaxY()); + //Fawe end } else { actor.print(Caption.of("worldedit.pos.console-require-coords")); return; @@ -218,7 +223,7 @@ public class SelectionCommands { @CommandPermissions("worldedit.selection.chunk") public void chunk(Actor actor, World world, LocalSession session, @Arg(desc = "The chunk to select", def = "") - BlockVector2 coordinates, + BlockVector3 coordinates, @Switch(name = 's', desc = "Expand your selection to encompass all chunks that are part of it") boolean expandSelection, @Switch(name = 'c', desc = "Use chunk coordinates instead of block coordinates") @@ -228,40 +233,49 @@ public class SelectionCommands { if (expandSelection) { Region region = session.getSelection(world); - final BlockVector2 min2D = ChunkStore.toChunk(region.getMinimumPoint()); - final BlockVector2 max2D = ChunkStore.toChunk(region.getMaximumPoint()); + int minChunkY = world.getMinY() >> CHUNK_SHIFTS_Y; + int maxChunkY = world.getMaxY() >> CHUNK_SHIFTS_Y; - min = BlockVector3.at(min2D.getBlockX() * 16, 0, min2D.getBlockZ() * 16); - max = BlockVector3.at(max2D.getBlockX() * 16 + 15, world.getMaxY(), max2D.getBlockZ() * 16 + 15); + BlockVector3 minChunk = ChunkStore.toChunk3d(region.getMinimumPoint()) + .clampY(minChunkY, maxChunkY); + BlockVector3 maxChunk = ChunkStore.toChunk3d(region.getMaximumPoint()) + .clampY(minChunkY, maxChunkY); + + min = minChunk.shl(CHUNK_SHIFTS, CHUNK_SHIFTS_Y, CHUNK_SHIFTS); + max = maxChunk.shl(CHUNK_SHIFTS, CHUNK_SHIFTS_Y, CHUNK_SHIFTS).add(15, world.getMaxY(), 15); actor.print(Caption.of( "worldedit.chunk.selected-multiple", - TextComponent.of(min2D.getBlockX()), - TextComponent.of(min2D.getBlockZ()), - TextComponent.of(max2D.getBlockX()), - TextComponent.of(max2D.getBlockZ()) + TextComponent.of(minChunk.getBlockX()), + TextComponent.of(minChunk.getBlockY()), + TextComponent.of(minChunk.getBlockZ()), + TextComponent.of(maxChunk.getBlockX()), + TextComponent.of(maxChunk.getBlockY()), + TextComponent.of(maxChunk.getBlockZ()) )); } else { - final BlockVector2 min2D; + BlockVector3 minChunk; if (coordinates != null) { // coords specified - min2D = useChunkCoordinates + minChunk = useChunkCoordinates ? coordinates - : ChunkStore.toChunk(coordinates.toBlockVector3()); + : ChunkStore.toChunk3d(coordinates); } else { // use player loc if (actor instanceof Locatable) { - min2D = ChunkStore.toChunk(((Locatable) actor).getBlockLocation().toVector().toBlockPoint()); + minChunk = ChunkStore.toChunk3d(((Locatable) actor).getBlockLocation().toVector().toBlockPoint()); } else { throw new StopExecutionException(TextComponent.of("A player or coordinates are required.")); } } - min = BlockVector3.at(min2D.getBlockX() * 16, 0, min2D.getBlockZ() * 16); + min = minChunk.shl(CHUNK_SHIFTS, CHUNK_SHIFTS_Y, CHUNK_SHIFTS); max = min.add(15, world.getMaxY(), 15); - actor.print(Caption.of("worldedit.chunk.selected", TextComponent.of(min2D.getBlockX()), - TextComponent.of(min2D.getBlockZ()))); + actor.print(Caption.of("worldedit.chunk.selected", + TextComponent.of(minChunk.getBlockX()), + TextComponent.of(minChunk.getBlockY()), + TextComponent.of(minChunk.getBlockZ()))); } final CuboidRegionSelector selector; @@ -285,7 +299,9 @@ public class SelectionCommands { @CommandPermissions("worldedit.wand") public void wand(Player player, LocalSession session, @Switch(name = 'n', desc = "Get a navigation wand") boolean navWand) throws WorldEditException { + //FAWE start session.loadDefaults(player, true); + //FAWE end String wandId = navWand ? session.getNavWandItem() : session.getWandItem(); if (wandId == null) { wandId = navWand ? we.getConfiguration().navigationWand : we.getConfiguration().wandItem; @@ -296,12 +312,14 @@ public class SelectionCommands { return; } player.giveItem(new BaseItemStack(itemType, 1)); + //FAWE start - instance-iate session if (navWand) { session.setTool(itemType, NavigationWand.INSTANCE); player.print(Caption.of("worldedit.wand.navwand.info")); } else { session.setTool(itemType, SelectionWand.INSTANCE); player.print(Caption.of("worldedit.wand.selwand.info")); + //FAWE end } } @@ -459,6 +477,7 @@ public class SelectionCommands { boolean clipboardInfo) throws WorldEditException { Region region; if (clipboardInfo) { + //FAWE start - Modify for cross server clipboards ClipboardHolder root = session.getClipboard(); int index = 0; for (ClipboardHolder holder : root.getHolders()) { @@ -488,6 +507,7 @@ public class SelectionCommands { index++; } return; + //FAWE end } else { region = session.getSelection(world); @@ -572,7 +592,9 @@ public class SelectionCommands { aliases = { ";", "/desel", "/deselect" }, desc = "Choose a region selector" ) + //FAWE start @CommandPermissions("worldedit.analysis.sel") + //FAWE end public void select(Actor actor, World world, LocalSession session, @Arg(desc = "Selector to switch to", def = "") SelectorChoice selector, @@ -625,6 +647,7 @@ public class SelectionCommands { limit.ifPresent(integer -> actor.print(Caption.of("worldedit.select.convex.limit-message", TextComponent.of(integer)))); break; } + //FAWE start case POLYHEDRAL: newSelector = new PolyhedralRegionSelector(world); actor.print(Caption.of("fawe.selection.sel.convex.polyhedral")); @@ -640,6 +663,7 @@ public class SelectionCommands { actor.print(Caption.of("fawe.selection.sel.fuzzy")); actor.print(Caption.of("fawe.selection.sel.list")); break; + //FAWE end case LIST: default: CommandListBox box = new CommandListBox("Selection modes", null, null); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/ToolCommands.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/ToolCommands.java index 782ceac3c..fa14f4372 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/ToolCommands.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/ToolCommands.java @@ -20,7 +20,7 @@ package com.sk89q.worldedit.command; import com.fastasyncworldedit.core.configuration.Caption; -import com.fastasyncworldedit.core.object.brush.InspectBrush; +import com.fastasyncworldedit.core.command.tool.brush.InspectBrush; import com.google.common.collect.Collections2; import com.sk89q.worldedit.LocalConfiguration; import com.sk89q.worldedit.LocalSession; @@ -143,8 +143,10 @@ public class ToolCommands { static void setToolNone(Player player, LocalSession session, boolean isBrush) throws InvalidToolBindException { + //FAWE start isBrush = session.getTool(player) instanceof BrushTool; session.setTool(player.getItemInHand(HandSide.MAIN_HAND).getType(), null); + //FAWE end player.print(Caption.of(isBrush ? "worldedit.brush.none.equip" : "worldedit.tool.none.equip")); } @@ -183,7 +185,9 @@ public class ToolCommands { ) @CommandPermissions("worldedit.setwand") public void selwand(Player player, LocalSession session) throws WorldEditException { + //FAWE start - instance-inized setTool(player, session, SelectionWand.INSTANCE, "worldedit.tool.selwand.equip"); + //FAWE end } @Command( @@ -193,7 +197,9 @@ public class ToolCommands { ) @CommandPermissions("worldedit.setwand") public void navwand(Player player, LocalSession session) throws WorldEditException { + //FAWE start - instance-inized setTool(player, session, NavigationWand.INSTANCE, "worldedit.tool.navwand.equip"); + //FAWE end } @Command( @@ -206,6 +212,7 @@ public class ToolCommands { setTool(player, session, new QueryTool(), "worldedit.tool.info.equip"); } + //FAWE start @Command( name = "inspect", aliases = { "/inspect" }, @@ -215,6 +222,7 @@ public class ToolCommands { public void inspectBrush(Player player, LocalSession session) throws WorldEditException { setTool(player, session, new InspectBrush(), "worldedit.tool.info.equip"); } + //FAWE end @Command( name = "tree", diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/ToolUtilCommands.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/ToolUtilCommands.java index 73ee19c07..14826e9cd 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/ToolUtilCommands.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/ToolUtilCommands.java @@ -20,9 +20,9 @@ package com.sk89q.worldedit.command; import com.fastasyncworldedit.core.configuration.Caption; -import com.fastasyncworldedit.core.object.brush.BrushSettings; -import com.fastasyncworldedit.core.object.brush.TargetMode; -import com.fastasyncworldedit.core.object.brush.scroll.Scroll; +import com.fastasyncworldedit.core.command.tool.brush.BrushSettings; +import com.fastasyncworldedit.core.command.tool.TargetMode; +import com.fastasyncworldedit.core.command.tool.scroll.Scroll; import com.fastasyncworldedit.core.util.MathMan; import com.fastasyncworldedit.core.util.StringMan; import com.google.common.collect.Iterables; @@ -61,6 +61,7 @@ public class ToolUtilCommands { this.we = we; } + //FAWE start - destination mask > mask @Command( name = "mask", aliases = "/mask", @@ -90,6 +91,7 @@ public class ToolUtilCommands { player.print(Caption.of("worldedit.tool.mask.set")); } } + //FAWE end @Command( name = "material", @@ -100,6 +102,7 @@ public class ToolUtilCommands { public void material(Player player, LocalSession session, @Arg(desc = "The pattern of blocks to use") Pattern pattern, + //FAWE start - add offhand @Switch(name = 'h', desc = "Whether the offhand should be considered or not") boolean offHand, Arguments arguments) throws WorldEditException { BrushTool tool = session.getBrushTool(player, false); @@ -116,6 +119,7 @@ public class ToolUtilCommands { settings.addSetting(BrushSettings.SettingType.FILL, lastArg); tool.update(); } + //FAWE end player.print(Caption.of("worldedit.tool.material.set")); } @@ -128,7 +132,7 @@ public class ToolUtilCommands { public void range(Player player, LocalSession session, @Arg(desc = "The range of the brush") int range) throws WorldEditException { - session.getBrushTool(player, false).setRange(range); + session.getBrushTool(player.getItemInHand(HandSide.MAIN_HAND).getType()).setRange(range); player.print(Caption.of("worldedit.tool.range.set")); } @@ -186,6 +190,7 @@ public class ToolUtilCommands { } } + //FAWE start @Command( name = "primary", aliases = { "/primary" }, @@ -358,4 +363,5 @@ public class ToolUtilCommands { // tool.update(); // player.print(TranslatableComponent.of("fawe.worldedit.brush.brush.transform")); // } + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/UtilityCommands.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/UtilityCommands.java index fe96fda10..beb60eeaf 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/UtilityCommands.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/UtilityCommands.java @@ -22,8 +22,8 @@ package com.sk89q.worldedit.command; import com.fastasyncworldedit.core.Fawe; import com.fastasyncworldedit.core.configuration.Caption; import com.fastasyncworldedit.core.configuration.Settings; -import com.fastasyncworldedit.core.object.DelegateConsumer; -import com.fastasyncworldedit.core.object.function.QuadFunction; +import com.fastasyncworldedit.core.util.task.DelegateConsumer; +import com.fastasyncworldedit.core.function.QuadFunction; import com.fastasyncworldedit.core.util.MainUtil; import com.fastasyncworldedit.core.util.TaskManager; import com.fastasyncworldedit.core.util.image.ImageUtil; @@ -204,13 +204,17 @@ public class UtilityCommands { public int fill(Actor actor, LocalSession session, EditSession editSession, @Arg(desc = "The blocks to fill with") Pattern pattern, + //FAWE start - we take an expression over a double @Arg(desc = "The radius to fill in") Expression radiusExp, + //FAWE end @Arg(desc = "The depth to fill", def = "1") int depth, @Arg(desc = "The direction to move", def = "down") @Direction BlockVector3 direction) throws WorldEditException, EvaluationException { + //FAWE start double radius = radiusExp.evaluate(); + //FAWE end radius = Math.max(1, radius); we.checkMaxRadius(radius); depth = Math.max(1, depth); @@ -222,22 +226,6 @@ public class UtilityCommands { } /* - @Command( - name = "/fillr", - desc = "Fill a hole recursively" - name = "patterns", - desc = "View help about patterns", - descFooter = "Patterns determine what blocks are placed\n" + - " - Use [brackets] for arguments\n" + - " - Use , to OR multiple\n" + - "e.g., #surfacespread[10][#existing],andesite\n" + - "More Info: https://git.io/vSPmA" - ) - @CommandQueued(false) - @CommandPermissions("worldedit.patterns") - public void patterns(Player player, LocalSession session, InjectedValueAccess args) throws WorldEditException { - displayModifierHelp(player, DefaultPatternParser.class, args); - } @Command( name = "masks", @@ -303,11 +291,15 @@ public class UtilityCommands { public int fillr(Actor actor, LocalSession session, EditSession editSession, @Arg(desc = "The blocks to fill with") Pattern pattern, + //FAWE start - we take an expression over a double @Arg(desc = "The radius to fill in") Expression radiusExp, + //FAWE end @Arg(desc = "The depth to fill", def = "") Integer depth) throws WorldEditException { + //FAWE start double radius = radiusExp.evaluate(); + //FAWE end radius = Math.max(1, radius); we.checkMaxRadius(radius); depth = depth == null ? Integer.MAX_VALUE : Math.max(1, depth); @@ -326,12 +318,16 @@ public class UtilityCommands { @CommandPermissions("worldedit.drain") @Logging(PLACEMENT) public int drain(Actor actor, LocalSession session, EditSession editSession, + //FAWE start - we take an expression over a double @Arg(desc = "The radius to drain") Expression radiusExp, + //FAWE end @Switch(name = 'w', desc = "Also un-waterlog blocks") boolean waterlogged, + //FAWE start @Switch(name = 'p', desc = "Also remove water plants") boolean plants) throws WorldEditException { + //FAWE end double radius = radiusExp.evaluate(); radius = Math.max(0, radius); we.checkMaxRadius(radius); @@ -637,8 +633,10 @@ public class UtilityCommands { flags.or(CreatureButcher.Flags.ARMOR_STAND, killArmorStands, "worldedit.butcher.armorstands"); flags.or(CreatureButcher.Flags.WATER, killWater, "worldedit.butcher.water"); + //FAWE start - run this sync int finalRadius = radius; int killed = TaskManager.IMP.sync(() -> killMatchingEntities(finalRadius, actor, flags::createFunction)); + //FAWE end actor.print(Caption.of( "worldedit.butcher.killed", @@ -666,7 +664,9 @@ public class UtilityCommands { return 0; } + //FAWE start - run this sync int removed = TaskManager.IMP.sync(() -> killMatchingEntities(radius, actor, remover::createFunction)); + //FAWE end actor.print(Caption.of("worldedit.remove.removed", TextComponent.of(removed))); return removed; } @@ -694,7 +694,7 @@ public class UtilityCommands { } session.remember(editSession); - editSession.flushSession(); + editSession.close(); return killed; } @@ -749,6 +749,7 @@ public class UtilityCommands { } + //FAWE start @Command( name = "/confirm", desc = "Confirm a command" @@ -1064,5 +1065,6 @@ public class UtilityCommands { name.append(relative.getPath()); return name.toString(); } + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/WorldEditCommands.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/WorldEditCommands.java index 7e615ba2c..f7f6c4dda 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/WorldEditCommands.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/WorldEditCommands.java @@ -77,6 +77,7 @@ public class WorldEditCommands { ) @CommandPermissions(queued = false) public void version(Actor actor) { + //FAWE start - get own version format FaweVersion fVer = Fawe.get().getVersion(); String fVerStr = fVer == null ? "unknown" : "-" + fVer.build; actor.print(TextComponent.of("FastAsyncWorldEdit" + fVerStr + " created by Empire92, MattBDev, IronApollo, dordsor21 and NotMyFault")); @@ -95,6 +96,7 @@ public class WorldEditCommands { } actor.printInfo(TextComponent.of("Wiki: https://github.com/IntellectualSites/FastAsyncWorldEdit-Documentation/wiki")); + //FAWE end PlatformManager pm = we.getPlatformManager(); @@ -130,10 +132,13 @@ public class WorldEditCommands { public void reload(Actor actor) { we.getPlatformManager().queryCapability(Capability.CONFIGURATION).reload(); we.getEventBus().post(new ConfigurationLoadEvent(we.getPlatformManager().queryCapability(Capability.CONFIGURATION).getConfiguration())); + //FAWE start Fawe.get().setupConfigs(); + //FAWE end actor.print(Caption.of("worldedit.reload.config")); } + //FAWE start @Command( name = "debugpaste", desc = "Writes a report of latest.log, config.yml, config-legacy.yml, strings.json to https://athion.net/ISPaster/paste" @@ -171,6 +176,7 @@ public class WorldEditCommands { } } } + //FAWE end @Command( name = "cui", diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/argument/AbstractDirectionConverter.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/argument/AbstractDirectionConverter.java index 4ecbe2879..f817db266 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/argument/AbstractDirectionConverter.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/argument/AbstractDirectionConverter.java @@ -28,7 +28,6 @@ import com.sk89q.worldedit.entity.Player; import com.sk89q.worldedit.extension.platform.Actor; import com.sk89q.worldedit.internal.annotation.Direction; import com.sk89q.worldedit.internal.annotation.MultiDirection; -import com.sk89q.worldedit.internal.annotation.OptionalArg; import com.sk89q.worldedit.util.formatting.text.Component; import com.sk89q.worldedit.util.formatting.text.TextComponent; import org.enginehub.piston.CommandManager; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/argument/EnumConverter.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/argument/EnumConverter.java index 712080460..96bf20b68 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/argument/EnumConverter.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/argument/EnumConverter.java @@ -19,10 +19,11 @@ package com.sk89q.worldedit.command.argument; -import com.fastasyncworldedit.core.object.brush.scroll.Scroll; +import com.fastasyncworldedit.core.command.tool.scroll.Scroll; import com.google.common.collect.ImmutableSet; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.command.util.HookMode; +import com.sk89q.worldedit.extent.TracingExtent; import com.sk89q.worldedit.util.SideEffect; import com.sk89q.worldedit.util.TreeGenerator; import org.enginehub.piston.CommandManager; @@ -58,6 +59,8 @@ public final class EnumConverter { basic(HookMode.class)); commandManager.registerConverter(Key.of(Scroll.Action.class), basic(Scroll.Action.class)); + commandManager.registerConverter(Key.of(TracingExtent.Action.class), + basic(TracingExtent.Action.class)); } private static > ArgumentConverter basic(Class enumClass) { diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/argument/FactoryConverter.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/argument/FactoryConverter.java index baeee8df9..ee2fe801d 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/argument/FactoryConverter.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/argument/FactoryConverter.java @@ -19,7 +19,7 @@ package com.sk89q.worldedit.command.argument; -import com.fastasyncworldedit.core.object.extent.SupplyingExtent; +import com.fastasyncworldedit.core.extent.SupplyingExtent; import com.sk89q.worldedit.EmptyClipboardException; import com.sk89q.worldedit.LocalSession; import com.sk89q.worldedit.WorldEdit; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/argument/LocationConverter.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/argument/LocationConverter.java index 5cf84a152..c1580f6a5 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/argument/LocationConverter.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/argument/LocationConverter.java @@ -1,22 +1,3 @@ -/* - * WorldEdit, a Minecraft world manipulation toolkit - * Copyright (C) sk89q - * Copyright (C) WorldEdit team and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - package com.sk89q.worldedit.command.argument; import com.sk89q.worldedit.math.BlockVector3; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/argument/SelectorChoice.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/argument/SelectorChoice.java index bb292de7a..2b1dfec72 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/argument/SelectorChoice.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/argument/SelectorChoice.java @@ -30,7 +30,9 @@ public enum SelectorChoice { HULL, POLYHEDRON, LIST, + //FAWE start FUZZY, MAGIC, POLYHEDRAL + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/argument/WorldConverter.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/argument/WorldConverter.java index d9243cba4..9fb9d586d 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/argument/WorldConverter.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/argument/WorldConverter.java @@ -42,7 +42,9 @@ public class WorldConverter implements ArgumentConverter { commandManager.registerConverter(Key.of(World.class), WORLD_CONVERTER); } + //FAWE start - Accessed by LocationConverter public static final WorldConverter WORLD_CONVERTER = new WorldConverter(); + //FAWE end private final TextComponent choices; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/argument/package-info.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/argument/package-info.java index 423e6d21e..270468aa1 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/argument/package-info.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/argument/package-info.java @@ -17,5 +17,11 @@ * along with this program. If not, see . */ +/** + * The following classes are FAWE additions: + * + * @see com.sk89q.worldedit.command.argument.ExpressionConverter + * @see com.sk89q.worldedit.command.argument.LocationConverter + */ @org.enginehub.piston.util.NonnullByDefault package com.sk89q.worldedit.command.argument; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/package-info.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/package-info.java new file mode 100644 index 000000000..61d4ea41d --- /dev/null +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/package-info.java @@ -0,0 +1,6 @@ +/** + * The following classes are FAWE additions: + * + * @see com.sk89q.worldedit.command.HistorySubCommands + */ +package com.sk89q.worldedit.command; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/AreaPickaxe.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/AreaPickaxe.java index 572e2d6b6..3aa99e678 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/AreaPickaxe.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/AreaPickaxe.java @@ -36,7 +36,7 @@ import com.sk89q.worldedit.world.block.BlockTypes; */ public class AreaPickaxe implements BlockTool { - private int range; + private final int range; public AreaPickaxe(int range) { this.range = range; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/BlockReplacer.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/BlockReplacer.java index dc8df8f89..7c74b0749 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/BlockReplacer.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/BlockReplacer.java @@ -30,9 +30,12 @@ import com.sk89q.worldedit.extension.platform.Platform; import com.sk89q.worldedit.extent.inventory.BlockBag; import com.sk89q.worldedit.function.pattern.Pattern; import com.sk89q.worldedit.math.BlockVector3; +import com.sk89q.worldedit.util.Direction; import com.sk89q.worldedit.util.Location; import com.sk89q.worldedit.world.block.BaseBlock; +import javax.annotation.Nullable; + /** * A mode that replaces one block. */ @@ -50,11 +53,12 @@ public class BlockReplacer implements DoubleActionBlockTool { } @Override - public boolean actPrimary(Platform server, LocalConfiguration config, Player player, LocalSession session, Location clicked) { + public boolean actPrimary(Platform server, LocalConfiguration config, Player player, LocalSession session, Location clicked, @Nullable Direction face) { BlockBag bag = session.getBlockBag(player); - try (EditSession editSession = session.createEditSession(player, "BlockReplacer")) { + try (EditSession editSession = session.createEditSession(player)) { try { + editSession.disableBuffering(); BlockVector3 position = clicked.toVector().toBlockPoint(); editSession.setBlock(position, pattern); } catch (MaxChangedBlocksException ignored) { @@ -72,7 +76,7 @@ public class BlockReplacer implements DoubleActionBlockTool { @Override - public boolean actSecondary(Platform server, LocalConfiguration config, Player player, LocalSession session, Location clicked) { + public boolean actSecondary(Platform server, LocalConfiguration config, Player player, LocalSession session, Location clicked, @Nullable Direction face) { BaseBlock targetBlock = player.getWorld().getFullBlock(clicked.toVector().toBlockPoint()); if (targetBlock != null) { diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/BrushTool.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/BrushTool.java index ac66d0ed0..272a0aed8 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/BrushTool.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/BrushTool.java @@ -20,15 +20,15 @@ package com.sk89q.worldedit.command.tool; import com.fastasyncworldedit.core.configuration.Caption; -import com.fastasyncworldedit.core.object.brush.BrushSettings; -import com.fastasyncworldedit.core.object.brush.MovableTool; -import com.fastasyncworldedit.core.object.brush.ResettableTool; -import com.fastasyncworldedit.core.object.brush.TargetMode; -import com.fastasyncworldedit.core.object.brush.scroll.Scroll; -import com.fastasyncworldedit.core.object.brush.scroll.ScrollTool; -import com.fastasyncworldedit.core.object.extent.ResettableExtent; -import com.fastasyncworldedit.core.object.mask.MaskedTargetBlock; -import com.fastasyncworldedit.core.object.pattern.PatternTraverser; +import com.fastasyncworldedit.core.command.tool.brush.BrushSettings; +import com.fastasyncworldedit.core.command.tool.MovableTool; +import com.fastasyncworldedit.core.command.tool.ResettableTool; +import com.fastasyncworldedit.core.command.tool.TargetMode; +import com.fastasyncworldedit.core.command.tool.scroll.Scroll; +import com.fastasyncworldedit.core.command.tool.scroll.ScrollTool; +import com.fastasyncworldedit.core.extent.ResettableExtent; +import com.fastasyncworldedit.core.function.mask.MaskedTargetBlock; +import com.fastasyncworldedit.core.function.pattern.PatternTraverser; import com.fastasyncworldedit.core.util.BrushCache; import com.fastasyncworldedit.core.util.MaskTraverser; import com.fastasyncworldedit.core.util.StringMan; @@ -65,23 +65,25 @@ import static com.google.common.base.Preconditions.checkNotNull; * Builds a shape at the place being looked at. */ public class BrushTool - implements DoubleActionTraceTool, ScrollTool, MovableTool, ResettableTool, Serializable { + //FAWE start - All implements but TraceTool + implements DoubleActionTraceTool, ScrollTool, MovableTool, ResettableTool, Serializable, TraceTool { // TODO: // Serialize methods // serialize BrushSettings (primary and secondary only if different) // set transient values e.g., context - public enum BrushAction { + enum BrushAction { PRIMARY, SECONDARY } - + //FAWE end protected static int MAX_RANGE = 500; - protected static int DEFAULT_RANGE = 240; // 500 is laggy as the default protected int range = -1; - private TargetMode targetMode = TargetMode.TARGET_BLOCK_RANGE; private Mask traceMask = null; + //FAWE start + protected static int DEFAULT_RANGE = 240; // 500 is laggy as the default + private TargetMode targetMode = TargetMode.TARGET_BLOCK_RANGE; private int targetOffset; private transient BrushSettings primary = new BrushSettings(); @@ -89,6 +91,7 @@ public class BrushTool private transient BrushSettings context = primary; private transient BaseItem holder; + //FAWE end /** * Construct the tool. @@ -100,6 +103,7 @@ public class BrushTool getContext().addPermission(permission); } + //FAWE start public BrushTool() { } @@ -192,15 +196,6 @@ public class BrushTool update(); } - /** - * Get the filter. - * - * @return the filter - */ - public Mask getMask() { - return getContext().getMask(); - } - /** * Get the filter. * @@ -229,6 +224,16 @@ public class BrushTool this.getContext().setMask(filter); update(); } + //FAWE end + + /** + * Get the filter. + * + * @return the filter + */ + public Mask getMask() { + return getContext().getMask(); + } /** * Get the mask used for identifying where to stop traces. @@ -250,6 +255,7 @@ public class BrushTool update(); } + //FAWE start /** * Set the block filter used for identifying blocks to replace. * @@ -259,6 +265,7 @@ public class BrushTool this.getContext().setSourceMask(filter); update(); } + //FAWE end /** * Set the brush. @@ -267,11 +274,13 @@ public class BrushTool * @param permission the permission */ public void setBrush(Brush brush, String permission) { + //FAWE start - We use our own logic BrushSettings current = getContext(); current.clearPerms(); current.setBrush(brush); current.addPermission(permission); update(); + //FAWE end } /** @@ -350,9 +359,12 @@ public class BrushTool @Override public boolean actPrimary(Platform server, LocalConfiguration config, Player player, LocalSession session) { + //FAWE start - Use logic previously declared as FAWE-like return act(BrushAction.PRIMARY, player, session); + //FAWE end } + //FAWE start public BlockVector3 getPosition(EditSession editSession, Player player) { Location loc = player.getLocation(); switch (targetMode) { @@ -524,4 +536,5 @@ public class BrushTool public boolean move(Player player) { return false; } + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/FloatingTreeRemover.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/FloatingTreeRemover.java index e9190d51f..35a35b698 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/FloatingTreeRemover.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/FloatingTreeRemover.java @@ -20,7 +20,7 @@ package com.sk89q.worldedit.command.tool; import com.fastasyncworldedit.core.configuration.Caption; -import com.fastasyncworldedit.core.object.collection.LocalBlockVectorSet; +import com.fastasyncworldedit.core.math.LocalBlockVectorSet; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.LocalConfiguration; import com.sk89q.worldedit.LocalSession; @@ -120,8 +120,10 @@ public class FloatingTreeRemover implements BlockTool { * @return a set containing all blocks in the tree/shroom or null if this is not a floating tree/shroom. */ private Set bfs(World world, BlockVector3 origin) { + //FAWE start - Use a LBVS over a HashMap & LinkedList final LocalBlockVectorSet visited = new LocalBlockVectorSet(); final LocalBlockVectorSet queue = new LocalBlockVectorSet(); + //FAWE end queue.add(origin); visited.add(origin); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/FloodFillTool.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/FloodFillTool.java index 8697e28f8..c39a2aa9f 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/FloodFillTool.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/FloodFillTool.java @@ -77,11 +77,13 @@ public class FloodFillTool implements BlockTool { try (EditSession editSession = session.createEditSession(player, "FloodFillTool")) { try { + //FAWE start - Respect masks Mask mask = initialType.toMask(editSession); BlockReplace function = new BlockReplace(editSession, pattern); RecursiveVisitor visitor = new RecursiveVisitor(mask, function, range); visitor.visit(origin); Operations.completeLegacy(visitor); + //FAWE end } catch (MaxChangedBlocksException e) { player.print(Caption.of("worldedit.tool.max-block-changes")); } finally { diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/InvalidToolBindException.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/InvalidToolBindException.java index f3396026b..a11e5c840 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/InvalidToolBindException.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/InvalidToolBindException.java @@ -21,11 +21,18 @@ package com.sk89q.worldedit.command.tool; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.world.item.ItemType; +import com.sk89q.worldedit.util.formatting.text.Component; public class InvalidToolBindException extends WorldEditException { - private ItemType item; + private final ItemType item; + public InvalidToolBindException(ItemType item, Component msg) { + super(msg); + this.item = item; + } + + @Deprecated public InvalidToolBindException(ItemType item, String msg) { super(msg); this.item = item; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/NavigationWand.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/NavigationWand.java index f95e31f6c..1dce4bb87 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/NavigationWand.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/NavigationWand.java @@ -27,12 +27,17 @@ import com.sk89q.worldedit.extension.platform.Actor; import com.sk89q.worldedit.extension.platform.Platform; import com.sk89q.worldedit.util.Location; +//FAWE start - enum-ized public enum NavigationWand implements DoubleActionTraceTool { INSTANCE; +//FAWE end + + private static final String PRIMARY_PERMISSION = "worldedit.navigation.thru.tool"; + private static final String SECONDARY_PERMISSION = "worldedit.navigation.jumpto.tool"; @Override public boolean actSecondary(Platform server, LocalConfiguration config, Player player, LocalSession session) { - if (!player.hasPermission("worldedit.navigation.jumpto.tool")) { + if (!player.hasPermission(SECONDARY_PERMISSION)) { return false; } final int maxDist = config.navigationWandMaxDistance; @@ -50,7 +55,7 @@ public enum NavigationWand implements DoubleActionTraceTool { @Override public boolean actPrimary(Platform server, LocalConfiguration config, Player player, LocalSession session) { - if (!player.hasPermission("worldedit.navigation.thru.tool")) { + if (!player.hasPermission(PRIMARY_PERMISSION)) { return false; } final int maxDist = config.navigationWandMaxDistance; @@ -66,6 +71,6 @@ public enum NavigationWand implements DoubleActionTraceTool { @Override public boolean canUse(Actor actor) { - return actor.hasPermission("worldedit.navigation.jumpto.tool"); // check should be here + return actor.hasPermission(PRIMARY_PERMISSION) || actor.hasPermission(SECONDARY_PERMISSION); } } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/RecursivePickaxe.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/RecursivePickaxe.java index 5e5f1ffe9..2e857e481 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/RecursivePickaxe.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/RecursivePickaxe.java @@ -19,7 +19,7 @@ package com.sk89q.worldedit.command.tool; -import com.fastasyncworldedit.core.object.mask.IdMask; +import com.fastasyncworldedit.core.function.mask.IdMask; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.LocalConfiguration; import com.sk89q.worldedit.LocalSession; @@ -75,6 +75,7 @@ public class RecursivePickaxe implements BlockTool { try (EditSession editSession = session.createEditSession(player, "RecursivePickaxe")) { editSession.getSurvivalExtent().setToolUse(config.superPickaxeManyDrop); + //FAWE start final int radius = (int) range; final BlockReplace replace = new BlockReplace(editSession, (BlockTypes.AIR.getDefaultState())); editSession.setMask(null); @@ -83,6 +84,7 @@ public class RecursivePickaxe implements BlockTool { //visitor.visit(pos); //Operations.completeBlindly(visitor); recurse(server, editSession, world, pos, origin, radius, initialType, visitor.getVisited()); + //FAWE end editSession.flushQueue(); session.remember(editSession); } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/SelectionWand.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/SelectionWand.java index 309507940..0e4af72bd 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/SelectionWand.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/SelectionWand.java @@ -29,36 +29,46 @@ import com.sk89q.worldedit.extension.platform.permission.ActorSelectorLimits; import com.sk89q.worldedit.internal.util.LogManagerCompat; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.regions.RegionSelector; +import com.sk89q.worldedit.util.Direction; import com.sk89q.worldedit.util.Location; import org.apache.logging.log4j.Logger; +import javax.annotation.Nullable; + +//FAWE start - enum-ized public enum SelectionWand implements DoubleActionBlockTool { INSTANCE; +//FAWE end private static final Logger LOGGER = LogManagerCompat.getLogger(); @Override - public boolean actSecondary(Platform server, LocalConfiguration config, Player player, LocalSession session, Location clicked) { + public boolean actSecondary(Platform server, LocalConfiguration config, Player player, LocalSession session, Location clicked, @Nullable Direction face) { RegionSelector selector = session.getRegionSelector(player.getWorld()); BlockVector3 blockPoint = clicked.toVector().toBlockPoint(); + if (selector.selectPrimary(blockPoint, ActorSelectorLimits.forActor(player))) { + //FAWE start if (Settings.IMP.EXPERIMENTAL.OTHER) { LOGGER.info("actSecondary Hit and about to explain with explainPrimarySelection"); } + //FAWE end selector.explainPrimarySelection(player, session, blockPoint); } return true; } @Override - public boolean actPrimary(Platform server, LocalConfiguration config, Player player, LocalSession session, Location clicked) { + public boolean actPrimary(Platform server, LocalConfiguration config, Player player, LocalSession session, Location clicked, @Nullable Direction face) { RegionSelector selector = session.getRegionSelector(player.getWorld()); BlockVector3 blockPoint = clicked.toVector().toBlockPoint(); if (selector.selectSecondary(blockPoint, ActorSelectorLimits.forActor(player))) { + //FAWE start if (Settings.IMP.EXPERIMENTAL.OTHER) { LOGGER.info("actPrimary Hit and about to explain with explainSecondarySelection"); } + //FAWE end selector.explainSecondarySelection(player, session, blockPoint); } return true; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/SinglePickaxe.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/SinglePickaxe.java index c96fbff2c..0f77e54f0 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/SinglePickaxe.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/SinglePickaxe.java @@ -28,11 +28,14 @@ import com.sk89q.worldedit.entity.Player; import com.sk89q.worldedit.extension.platform.Actor; import com.sk89q.worldedit.extension.platform.Platform; import com.sk89q.worldedit.math.BlockVector3; +import com.sk89q.worldedit.util.Direction; import com.sk89q.worldedit.util.Location; import com.sk89q.worldedit.world.World; import com.sk89q.worldedit.world.block.BlockType; import com.sk89q.worldedit.world.block.BlockTypes; +import javax.annotation.Nullable; + /** * A super pickaxe mode that removes one block. */ @@ -44,7 +47,7 @@ public class SinglePickaxe implements BlockTool { } @Override - public boolean actPrimary(Platform server, LocalConfiguration config, Player player, LocalSession session, Location clicked) { + public boolean actPrimary(Platform server, LocalConfiguration config, Player player, LocalSession session, Location clicked, @Nullable Direction face) { World world = (World) clicked.getExtent(); BlockVector3 blockPoint = clicked.toBlockPoint(); final BlockType blockType = world.getBlock(blockPoint).getBlockType(); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/TreePlanter.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/TreePlanter.java index 62f907511..3d1da4d04 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/TreePlanter.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/TreePlanter.java @@ -28,15 +28,18 @@ import com.sk89q.worldedit.entity.Player; import com.sk89q.worldedit.extension.platform.Actor; import com.sk89q.worldedit.extension.platform.Platform; import com.sk89q.worldedit.math.BlockVector3; +import com.sk89q.worldedit.util.Direction; import com.sk89q.worldedit.util.Location; import com.sk89q.worldedit.util.TreeGenerator; +import javax.annotation.Nullable; + /** * Plants a tree. */ public class TreePlanter implements BlockTool { - private TreeGenerator.TreeType treeType; + private final TreeGenerator.TreeType treeType; public TreePlanter(TreeGenerator.TreeType treeType) { this.treeType = treeType; @@ -48,7 +51,7 @@ public class TreePlanter implements BlockTool { } @Override - public boolean actPrimary(Platform server, LocalConfiguration config, Player player, LocalSession session, Location clicked) { + public boolean actPrimary(Platform server, LocalConfiguration config, Player player, LocalSession session, Location clicked, @Nullable Direction face) { try (EditSession editSession = session.createEditSession(player)) { try { diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/brush/ButcherBrush.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/brush/ButcherBrush.java index 8599355cf..32b2b9f9f 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/brush/ButcherBrush.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/brush/ButcherBrush.java @@ -33,7 +33,7 @@ import java.util.List; public class ButcherBrush implements Brush { - private CreatureButcher flags; + private final CreatureButcher flags; public ButcherBrush(CreatureButcher flags) { this.flags = flags; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/brush/CylinderBrush.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/brush/CylinderBrush.java index 59919a1c5..9217066f6 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/brush/CylinderBrush.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/brush/CylinderBrush.java @@ -27,7 +27,7 @@ import com.sk89q.worldedit.world.block.BlockTypes; public class CylinderBrush implements Brush { - private int height; + private final int height; public CylinderBrush(int height) { this.height = height; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/brush/GravityBrush.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/brush/GravityBrush.java index ff5f04a76..e85ce80a9 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/brush/GravityBrush.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/brush/GravityBrush.java @@ -36,6 +36,7 @@ public class GravityBrush implements Brush { @Override public void build(EditSession editSession, BlockVector3 position, Pattern pattern, double size) throws MaxChangedBlocksException { + //FAWE start - Ours operates differently to upstream, but does the same double endY = position.getY() + size; double startPerformY = Math.max(0, position.getY() - size); double startCheckY = fullHeight ? 0 : startPerformY; @@ -54,5 +55,6 @@ public class GravityBrush implements Brush { } } } + //FAWE end } } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/brush/HollowCylinderBrush.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/brush/HollowCylinderBrush.java index 162d1a587..c39050166 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/brush/HollowCylinderBrush.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/brush/HollowCylinderBrush.java @@ -27,7 +27,7 @@ import com.sk89q.worldedit.world.block.BlockTypes; public class HollowCylinderBrush implements Brush { - private int height; + private final int height; public HollowCylinderBrush(int height) { this.height = height; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/brush/SmoothBrush.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/brush/SmoothBrush.java index 13a1ff6f1..e92b9290e 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/brush/SmoothBrush.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/brush/SmoothBrush.java @@ -37,7 +37,7 @@ import javax.annotation.Nullable; public class SmoothBrush implements Brush { private final Mask mask; - private int iterations; + private final int iterations; public SmoothBrush(int iterations) { this(iterations, null); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/util/AsyncCommandBuilder.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/util/AsyncCommandBuilder.java index 3eeb11786..7360028b6 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/util/AsyncCommandBuilder.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/util/AsyncCommandBuilder.java @@ -36,10 +36,10 @@ import com.sk89q.worldedit.util.task.Supervisor; import org.apache.logging.log4j.Logger; import org.enginehub.piston.exception.CommandException; import org.enginehub.piston.exception.CommandExecutionException; -import org.jetbrains.annotations.Nullable; import java.util.concurrent.Callable; import java.util.function.Consumer; +import javax.annotation.Nullable; import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkNotNull; @@ -57,6 +57,8 @@ public final class AsyncCommandBuilder { private String description; @Nullable private Component delayMessage; + @Nullable + private Component workingMessage; @Nullable private Component successMessage; @@ -90,11 +92,22 @@ public final class AsyncCommandBuilder { return sendMessageAfterDelay(TextComponent.of(checkNotNull(message))); } + @Deprecated public AsyncCommandBuilder sendMessageAfterDelay(Component message) { + return setDelayMessage(message); + } + + public AsyncCommandBuilder setDelayMessage(Component message) { this.delayMessage = checkNotNull(message); return this; } + public AsyncCommandBuilder setWorkingMessage(Component message) { + checkNotNull(this.delayMessage, "Must have a delay message if using a working message"); + this.workingMessage = checkNotNull(message); + return this; + } + public AsyncCommandBuilder onSuccess(@Nullable Component message, @Nullable Consumer consumer) { checkArgument(message != null || consumer != null, "Can't have null message AND consumer"); this.successMessage = message; @@ -145,7 +158,7 @@ public final class AsyncCommandBuilder { if (successMessage != null) { sender.print(successMessage); } - } catch (Exception orig) { + } catch (Throwable orig) { Component failure = failureMessage != null ? failureMessage : TextComponent.of("An error occurred"); try { if (exceptionConverter != null) { diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/util/EntityRemover.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/util/EntityRemover.java index 851e337fd..f444e7709 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/util/EntityRemover.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/util/EntityRemover.java @@ -146,7 +146,9 @@ public class EntityRemover { EntityProperties registryType = entity.getFacet(EntityProperties.class); if (registryType != null) { if (type.matches(registryType)) { + //FAWE start - Calling this async violates thread safety TaskManager.IMP.sync(entity::remove); + //FAWE end return true; } } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/util/FutureProgressListener.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/util/FutureProgressListener.java index fbcce486c..2d283a4db 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/util/FutureProgressListener.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/util/FutureProgressListener.java @@ -25,6 +25,7 @@ import com.sk89q.worldedit.extension.platform.Actor; import com.sk89q.worldedit.util.formatting.text.Component; import com.sk89q.worldedit.util.formatting.text.TextComponent; +import javax.annotation.Nullable; import java.util.Timer; import static com.google.common.base.Preconditions.checkNotNull; @@ -32,7 +33,8 @@ import static com.google.common.base.Preconditions.checkNotNull; public class FutureProgressListener implements Runnable { private static final Timer timer = new Timer(); - private static final int MESSAGE_DELAY = 1000; + private static final int MESSAGE_DELAY = 1000; // 1 second + private static final int MESSAGE_PERIOD = 10000; // 10 seconds private final MessageTimerTask task; @@ -42,11 +44,15 @@ public class FutureProgressListener implements Runnable { } public FutureProgressListener(Actor sender, Component message) { + this(sender, message, null); + } + + public FutureProgressListener(Actor sender, Component message, @Nullable Component workingMessage) { checkNotNull(sender); checkNotNull(message); - task = new MessageTimerTask(sender, message); - timer.schedule(task, MESSAGE_DELAY); + task = new MessageTimerTask(sender, message, workingMessage); + timer.scheduleAtFixedRate(task, MESSAGE_DELAY, MESSAGE_PERIOD); } @Override @@ -56,11 +62,15 @@ public class FutureProgressListener implements Runnable { @Deprecated public static void addProgressListener(ListenableFuture future, Actor sender, String message) { - future.addListener(new FutureProgressListener(sender, message), MoreExecutors.directExecutor()); + addProgressListener(future, sender, TextComponent.of(message)); } public static void addProgressListener(ListenableFuture future, Actor sender, Component message) { future.addListener(new FutureProgressListener(sender, message), MoreExecutors.directExecutor()); } + public static void addProgressListener(ListenableFuture future, Actor sender, Component message, Component workingMessage) { + future.addListener(new FutureProgressListener(sender, message, workingMessage), MoreExecutors.directExecutor()); + } + } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/util/MessageTimerTask.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/util/MessageTimerTask.java index 460c759b8..ca1c3548b 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/util/MessageTimerTask.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/util/MessageTimerTask.java @@ -23,6 +23,7 @@ import com.sk89q.worldedit.extension.platform.Actor; import com.sk89q.worldedit.util.formatting.text.Component; import com.sk89q.worldedit.util.formatting.text.TextComponent; +import javax.annotation.Nullable; import java.util.TimerTask; import static com.google.common.base.Preconditions.checkNotNull; @@ -31,23 +32,35 @@ public class MessageTimerTask extends TimerTask { private final Actor sender; private final Component message; + @Nullable + private final Component workingMessage; + + private boolean hasRunBefore = false; @Deprecated MessageTimerTask(Actor sender, String message) { - this(sender, TextComponent.of(message)); + this(sender, TextComponent.of(message), null); } - MessageTimerTask(Actor sender, Component message) { + MessageTimerTask(Actor sender, Component message, @Nullable Component workingMessage) { checkNotNull(sender); checkNotNull(message); this.sender = sender; this.message = message; + this.workingMessage = workingMessage; } @Override public void run() { - sender.printDebug(message); + if (!hasRunBefore) { + sender.printDebug(message); + hasRunBefore = true; + } else if (workingMessage != null) { + sender.printDebug(workingMessage); + } else { + cancel(); + } } } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/util/PermissionCondition.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/util/PermissionCondition.java index e18324ea7..00e9071b3 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/util/PermissionCondition.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/util/PermissionCondition.java @@ -31,7 +31,9 @@ public class PermissionCondition implements Command.Condition { private static final Key ACTOR_KEY = Key.of(Actor.class); private final Set permissions; + //FAWE start private final boolean queued; + //FAWE end public PermissionCondition(Set permissions) { this(permissions, true); @@ -54,7 +56,9 @@ public class PermissionCondition implements Command.Condition { .orElse(false); } + //FAWE start public boolean isQueued() { return queued; } + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/util/SuggestionHelper.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/util/SuggestionHelper.java index 8ecafa602..576204743 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/util/SuggestionHelper.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/util/SuggestionHelper.java @@ -179,6 +179,7 @@ public final class SuggestionHelper { return registry.keySet().stream().filter(search); } + //FAWE start /** * Returns a stream of suggestions for positive doubles. * @@ -231,4 +232,5 @@ public final class SuggestionHelper { } return true; } + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/util/WorldEditAsyncCommandBuilder.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/util/WorldEditAsyncCommandBuilder.java index 52951cdaa..9f89216de 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/util/WorldEditAsyncCommandBuilder.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/util/WorldEditAsyncCommandBuilder.java @@ -42,7 +42,7 @@ public final class WorldEditAsyncCommandBuilder { public static void createAndSendMessage(Actor actor, Callable task, @Nullable Component desc) { final AsyncCommandBuilder builder = AsyncCommandBuilder.wrap(task, actor); if (desc != null) { - builder.sendMessageAfterDelay(desc); + builder.setDelayMessage(desc); } builder .onSuccess((String) null, actor::printInfo) diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/annotation/AllowedRegion.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/util/annotation/AllowedRegion.java similarity index 90% rename from worldedit-core/src/main/java/com/sk89q/worldedit/internal/annotation/AllowedRegion.java rename to worldedit-core/src/main/java/com/sk89q/worldedit/command/util/annotation/AllowedRegion.java index 8fd544b2d..e71ddab91 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/annotation/AllowedRegion.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/util/annotation/AllowedRegion.java @@ -1,4 +1,4 @@ -package com.sk89q.worldedit.internal.annotation; +package com.sk89q.worldedit.command.util.annotation; import com.fastasyncworldedit.core.regions.FaweMaskManager; import org.enginehub.piston.inject.InjectAnnotation; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/command/ConfirmHandler.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/util/annotation/ConfirmHandler.java similarity index 61% rename from worldedit-core/src/main/java/com/sk89q/worldedit/internal/command/ConfirmHandler.java rename to worldedit-core/src/main/java/com/sk89q/worldedit/command/util/annotation/ConfirmHandler.java index e5dbe3fbd..b29b3c87b 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/command/ConfirmHandler.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/util/annotation/ConfirmHandler.java @@ -1,23 +1,4 @@ -/* - * WorldEdit, a Minecraft world manipulation toolkit - * Copyright (C) sk89q - * Copyright (C) WorldEdit team and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.sk89q.worldedit.internal.command; +package com.sk89q.worldedit.command.util.annotation; import com.fastasyncworldedit.core.configuration.Settings; import com.sk89q.worldedit.command.util.annotation.Confirm; diff --git a/worldedit-core/src/main/java/com/sk89q/minecraft/util/commands/Link.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/util/annotation/Link.java similarity index 79% rename from worldedit-core/src/main/java/com/sk89q/minecraft/util/commands/Link.java rename to worldedit-core/src/main/java/com/sk89q/worldedit/command/util/annotation/Link.java index 297af2be1..9ad8f67ef 100644 --- a/worldedit-core/src/main/java/com/sk89q/minecraft/util/commands/Link.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/util/annotation/Link.java @@ -1,4 +1,4 @@ -package com.sk89q.minecraft.util.commands; +package com.sk89q.worldedit.command.util.annotation; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/util/annotation/PatternList.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/util/annotation/PatternList.java new file mode 100644 index 000000000..549cc5822 --- /dev/null +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/util/annotation/PatternList.java @@ -0,0 +1,17 @@ +package com.sk89q.worldedit.command.util.annotation; + +import org.enginehub.piston.inject.InjectAnnotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Annotates a {@code List} parameter to inject a list of BlockStates. + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.PARAMETER) +@InjectAnnotation +public @interface PatternList { +} diff --git a/worldedit-core/src/main/java/com/sk89q/minecraft/util/commands/Step.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/util/annotation/Step.java similarity index 80% rename from worldedit-core/src/main/java/com/sk89q/minecraft/util/commands/Step.java rename to worldedit-core/src/main/java/com/sk89q/worldedit/command/util/annotation/Step.java index 9a5243a1f..d4e83a9f1 100644 --- a/worldedit-core/src/main/java/com/sk89q/minecraft/util/commands/Step.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/util/annotation/Step.java @@ -1,4 +1,4 @@ -package com.sk89q.minecraft.util.commands; +package com.sk89q.worldedit.command.util.annotation; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/annotation/Time.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/util/annotation/Time.java similarity index 86% rename from worldedit-core/src/main/java/com/sk89q/worldedit/internal/annotation/Time.java rename to worldedit-core/src/main/java/com/sk89q/worldedit/command/util/annotation/Time.java index cfcc43139..67b31bc43 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/annotation/Time.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/util/annotation/Time.java @@ -1,4 +1,4 @@ -package com.sk89q.worldedit.internal.annotation; +package com.sk89q.worldedit.command.util.annotation; import org.enginehub.piston.inject.InjectAnnotation; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/util/annotation/package-info.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/util/annotation/package-info.java new file mode 100644 index 000000000..4052a3c03 --- /dev/null +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/util/annotation/package-info.java @@ -0,0 +1,12 @@ +/** + * The following classes are FAWE additions: + * + * @see com.sk89q.worldedit.command.util.annotation.AllowedRegion + * @see com.sk89q.worldedit.command.util.annotation.Confirm + * @see com.sk89q.worldedit.command.util.annotation.ConfirmHandler + * @see com.sk89q.worldedit.command.util.annotation.Link + * @see com.sk89q.worldedit.command.util.annotation.PatternList + * @see com.sk89q.worldedit.command.util.annotation.Step + * @see com.sk89q.worldedit.command.util.annotation.Time + */ +package com.sk89q.worldedit.command.util.annotation; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/entity/BaseEntity.java b/worldedit-core/src/main/java/com/sk89q/worldedit/entity/BaseEntity.java index 3a829adc3..b01c732ad 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/entity/BaseEntity.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/entity/BaseEntity.java @@ -47,7 +47,9 @@ public class BaseEntity implements NbtValued { private final EntityType type; @Nullable + //FAWE start - use LZ over CompoundTag private LazyReference nbtData; + //FAWE end /** * Create a new base entity. @@ -93,12 +95,6 @@ public class BaseEntity implements NbtValued { setNbtReference(other.getNbtReference()); } - @Nullable - @Override - public LazyReference getNbtReference() { - return nbtData; - } - @Override public void setNbtReference(@Nullable LazyReference nbtData) { this.nbtData = nbtData; @@ -113,11 +109,16 @@ public class BaseEntity implements NbtValued { return this.type; } - // FAWE start + //FAWE start public BaseEntity(CompoundTag tag) { this(EntityTypes.parse(tag.getString("Id")), tag); } - // FAWE end + @Nullable + @Override + public LazyReference getNbtReference() { + return nbtData; + } + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/entity/Entity.java b/worldedit-core/src/main/java/com/sk89q/worldedit/entity/Entity.java index 1aea441d0..2becf045f 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/entity/Entity.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/entity/Entity.java @@ -48,10 +48,12 @@ public interface Entity extends Faceted, Locatable { @Nullable BaseEntity getState(); + //FAWE start default EntityType getType() { BaseEntity state = getState(); return state != null ? state.getType() : null; } + //FAWE end /** * Remove this entity from it container. diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/entity/Player.java b/worldedit-core/src/main/java/com/sk89q/worldedit/entity/Player.java index 32bb2dc3a..16dd39273 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/entity/Player.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/entity/Player.java @@ -22,7 +22,7 @@ package com.sk89q.worldedit.entity; import com.fastasyncworldedit.core.Fawe; import com.fastasyncworldedit.core.configuration.Caption; import com.fastasyncworldedit.core.configuration.Settings; -import com.fastasyncworldedit.core.object.clipboard.DiskOptimizedClipboard; +import com.fastasyncworldedit.core.extent.clipboard.DiskOptimizedClipboard; import com.fastasyncworldedit.core.regions.FaweMaskManager; import com.fastasyncworldedit.core.util.MainUtil; import com.sk89q.worldedit.EmptyClipboardException; @@ -348,6 +348,7 @@ public interface Player extends Entity, Actor { */ > void sendFakeBlock(BlockVector3 pos, @Nullable B block); + //FAWE start public Region[] getCurrentRegions(); Region[] getCurrentRegions(FaweMaskManager.MaskType type); @@ -429,4 +430,5 @@ public interface Player extends Entity, Actor { print(Caption.of("fawe.error.stacktrace")); } } + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/event/Event.java b/worldedit-core/src/main/java/com/sk89q/worldedit/event/Event.java index 6e7ab1fa6..641f7772f 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/event/Event.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/event/Event.java @@ -25,6 +25,7 @@ import com.sk89q.worldedit.WorldEdit; * An abstract base class for all WorldEdit events. */ public abstract class Event { + //FAWE start /** * Returns true if this event was called and not cancelled. @@ -37,4 +38,5 @@ public abstract class Event { } return true; } + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/event/extent/EditSessionEvent.java b/worldedit-core/src/main/java/com/sk89q/worldedit/event/extent/EditSessionEvent.java index de0db9c29..0c6abbf73 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/event/extent/EditSessionEvent.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/event/extent/EditSessionEvent.java @@ -24,12 +24,16 @@ import com.sk89q.worldedit.event.Cancellable; import com.sk89q.worldedit.event.Event; import com.sk89q.worldedit.extension.platform.Actor; import com.sk89q.worldedit.extent.Extent; +import com.sk89q.worldedit.extent.TracingExtent; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.world.World; import com.sk89q.worldedit.world.block.BlockStateHolder; import javax.annotation.Nullable; +import java.util.ArrayList; +import java.util.List; + import static com.google.common.base.Preconditions.checkNotNull; import static com.sk89q.worldedit.EditSession.Stage; @@ -67,7 +71,11 @@ public class EditSessionEvent extends Event implements Cancellable { private final int maxBlocks; private final Stage stage; private Extent extent; + private final List tracingExtents = new ArrayList<>(); + private boolean tracing; + //FAWE start private boolean cancelled; + //FAWE end /** * Create a new event. @@ -139,17 +147,31 @@ public class EditSessionEvent extends Event implements Cancellable { */ public void setExtent(Extent extent) { checkNotNull(extent); + if (tracing && extent != this.extent) { + TracingExtent tracingExtent = new TracingExtent(extent); + extent = tracingExtent; + tracingExtents.add(tracingExtent); + } this.extent = extent; } - @Override - public boolean isCancelled() { - return cancelled; + /** + * Set tracing enabled, with the current extent as the "base". + * + * Internal use only. + * @param tracing if tracing is enabled + */ + public void setTracing(boolean tracing) { + this.tracing = tracing; } - @Override - public void setCancelled(boolean cancelled) { - this.cancelled = cancelled; + /** + * Get the current list of tracing extents. + * + * Internal use only. + */ + public List getTracingExtents() { + return tracingExtents; } /** @@ -162,4 +184,16 @@ public class EditSessionEvent extends Event implements Cancellable { return new EditSessionEvent(world, actor, maxBlocks, stage); } + //FAWE start + @Override + public boolean isCancelled() { + return cancelled; + } + + @Override + public void setCancelled(boolean cancelled) { + this.cancelled = cancelled; + } + //FAWE end + } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/event/platform/CommandEvent.java b/worldedit-core/src/main/java/com/sk89q/worldedit/event/platform/CommandEvent.java index b239ad93f..e2146d4cf 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/event/platform/CommandEvent.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/event/platform/CommandEvent.java @@ -65,9 +65,11 @@ public class CommandEvent extends AbstractCancellable { return arguments; } + //FAWE start @Override public boolean call() { PlatformCommandManager.getInstance().handleCommandOnCurrentThread(this); return true; } + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/BlockFactory.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/BlockFactory.java index 3de32944e..6322ce199 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/BlockFactory.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/BlockFactory.java @@ -58,8 +58,10 @@ public class BlockFactory extends AbstractFactory { */ public Set parseFromListInput(String input, ParserContext context) throws InputParseException { Set blocks = new HashSet<>(); + //FAWE start // String[] splits = input.split(","); for (String token : StringUtil.split(input, ',', '[', ']')) { + //FAWE end blocks.add(parseFromInput(token, context)); } return blocks; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/MaskFactory.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/MaskFactory.java index 12b8bd1de..0a47ff31d 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/MaskFactory.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/MaskFactory.java @@ -21,33 +21,33 @@ package com.sk89q.worldedit.extension.factory; import com.fastasyncworldedit.core.configuration.Caption; import com.sk89q.worldedit.WorldEdit; -import com.sk89q.worldedit.extension.factory.parser.mask.AdjacentMaskParser; +import com.fastasyncworldedit.core.extension.factory.parser.mask.AdjacentMaskParser; import com.sk89q.worldedit.extension.factory.parser.mask.AirMaskParser; -import com.sk89q.worldedit.extension.factory.parser.mask.AngleMaskParser; +import com.fastasyncworldedit.core.extension.factory.parser.mask.AngleMaskParser; import com.sk89q.worldedit.extension.factory.parser.mask.BiomeMaskParser; import com.sk89q.worldedit.extension.factory.parser.mask.BlockCategoryMaskParser; import com.sk89q.worldedit.extension.factory.parser.mask.BlockStateMaskParser; import com.sk89q.worldedit.extension.factory.parser.mask.BlocksMaskParser; import com.sk89q.worldedit.extension.factory.parser.mask.ExistingMaskParser; import com.sk89q.worldedit.extension.factory.parser.mask.ExpressionMaskParser; -import com.sk89q.worldedit.extension.factory.parser.mask.ExtremaMaskParser; -import com.sk89q.worldedit.extension.factory.parser.mask.FalseMaskParser; +import com.fastasyncworldedit.core.extension.factory.parser.mask.ExtremaMaskParser; +import com.fastasyncworldedit.core.extension.factory.parser.mask.FalseMaskParser; import com.sk89q.worldedit.extension.factory.parser.mask.LazyRegionMaskParser; -import com.sk89q.worldedit.extension.factory.parser.mask.LiquidMaskParser; +import com.fastasyncworldedit.core.extension.factory.parser.mask.LiquidMaskParser; import com.sk89q.worldedit.extension.factory.parser.mask.NegateMaskParser; import com.sk89q.worldedit.extension.factory.parser.mask.NoiseMaskParser; import com.sk89q.worldedit.extension.factory.parser.mask.OffsetMaskParser; -import com.sk89q.worldedit.extension.factory.parser.mask.ROCAngleMaskParser; +import com.fastasyncworldedit.core.extension.factory.parser.mask.ROCAngleMaskParser; import com.sk89q.worldedit.extension.factory.parser.mask.RegionMaskParser; -import com.sk89q.worldedit.extension.factory.parser.mask.RichOffsetMaskParser; -import com.sk89q.worldedit.extension.factory.parser.mask.SimplexMaskParser; +import com.fastasyncworldedit.core.extension.factory.parser.mask.RichOffsetMaskParser; +import com.fastasyncworldedit.core.extension.factory.parser.mask.SimplexMaskParser; import com.sk89q.worldedit.extension.factory.parser.mask.SolidMaskParser; -import com.sk89q.worldedit.extension.factory.parser.mask.SurfaceMaskParser; -import com.sk89q.worldedit.extension.factory.parser.mask.TrueMaskParser; -import com.sk89q.worldedit.extension.factory.parser.mask.WallMaskParser; -import com.sk89q.worldedit.extension.factory.parser.mask.XAxisMaskParser; -import com.sk89q.worldedit.extension.factory.parser.mask.YAxisMaskParser; -import com.sk89q.worldedit.extension.factory.parser.mask.ZAxisMaskParser; +import com.fastasyncworldedit.core.extension.factory.parser.mask.SurfaceMaskParser; +import com.fastasyncworldedit.core.extension.factory.parser.mask.TrueMaskParser; +import com.fastasyncworldedit.core.extension.factory.parser.mask.WallMaskParser; +import com.fastasyncworldedit.core.extension.factory.parser.mask.XAxisMaskParser; +import com.fastasyncworldedit.core.extension.factory.parser.mask.YAxisMaskParser; +import com.fastasyncworldedit.core.extension.factory.parser.mask.ZAxisMaskParser; import com.sk89q.worldedit.extension.input.InputParseException; import com.sk89q.worldedit.extension.input.NoMatchException; import com.sk89q.worldedit.extension.input.ParserContext; @@ -91,6 +91,7 @@ public final class MaskFactory extends AbstractFactory { register(new BlockCategoryMaskParser(worldEdit)); register(new BiomeMaskParser(worldEdit)); + //FAWE start // Mask Parsers from FAWE register(new AdjacentMaskParser(worldEdit)); register(new AngleMaskParser(worldEdit)); @@ -107,6 +108,7 @@ public final class MaskFactory extends AbstractFactory { register(new XAxisMaskParser(worldEdit)); register(new YAxisMaskParser(worldEdit)); register(new ZAxisMaskParser(worldEdit)); + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/PatternFactory.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/PatternFactory.java index 3a392b8d8..30c24f921 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/PatternFactory.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/PatternFactory.java @@ -20,21 +20,21 @@ package com.sk89q.worldedit.extension.factory; import com.sk89q.worldedit.WorldEdit; -import com.sk89q.worldedit.extension.factory.parser.pattern.BiomePatternParser; +import com.fastasyncworldedit.core.extension.factory.parser.pattern.BiomePatternParser; import com.sk89q.worldedit.extension.factory.parser.pattern.BlockCategoryPatternParser; -import com.sk89q.worldedit.extension.factory.parser.pattern.BufferedPatternParser; +import com.fastasyncworldedit.core.extension.factory.parser.pattern.BufferedPatternParser; import com.sk89q.worldedit.extension.factory.parser.pattern.ClipboardPatternParser; -import com.sk89q.worldedit.extension.factory.parser.pattern.ExistingPatternParser; -import com.sk89q.worldedit.extension.factory.parser.pattern.Linear2DPatternParser; -import com.sk89q.worldedit.extension.factory.parser.pattern.Linear3DPatternParser; -import com.sk89q.worldedit.extension.factory.parser.pattern.PerlinPatternParser; -import com.sk89q.worldedit.extension.factory.parser.pattern.RandomPatternParser; +import com.fastasyncworldedit.core.extension.factory.parser.pattern.ExistingPatternParser; +import com.fastasyncworldedit.core.extension.factory.parser.pattern.Linear2DPatternParser; +import com.fastasyncworldedit.core.extension.factory.parser.pattern.Linear3DPatternParser; +import com.fastasyncworldedit.core.extension.factory.parser.pattern.PerlinPatternParser; +import com.fastasyncworldedit.core.extension.factory.parser.pattern.RandomPatternParser; import com.sk89q.worldedit.extension.factory.parser.pattern.RandomStatePatternParser; -import com.sk89q.worldedit.extension.factory.parser.pattern.RidgedMultiFractalPatternParser; -import com.sk89q.worldedit.extension.factory.parser.pattern.SimplexPatternParser; +import com.fastasyncworldedit.core.extension.factory.parser.pattern.RidgedMultiFractalPatternParser; +import com.fastasyncworldedit.core.extension.factory.parser.pattern.SimplexPatternParser; import com.sk89q.worldedit.extension.factory.parser.pattern.SingleBlockPatternParser; import com.sk89q.worldedit.extension.factory.parser.pattern.TypeOrStateApplyingPatternParser; -import com.sk89q.worldedit.extension.factory.parser.pattern.VoronoiPatternParser; +import com.fastasyncworldedit.core.extension.factory.parser.pattern.VoronoiPatternParser; import com.sk89q.worldedit.function.pattern.Pattern; import com.sk89q.worldedit.internal.registry.AbstractFactory; @@ -64,7 +64,7 @@ public final class PatternFactory extends AbstractFactory { register(new RandomStatePatternParser(worldEdit)); register(new BlockCategoryPatternParser(worldEdit)); - // FAWE + //FAWE start register(new SimplexPatternParser(worldEdit)); register(new VoronoiPatternParser(worldEdit)); register(new PerlinPatternParser(worldEdit)); @@ -74,6 +74,7 @@ public final class PatternFactory extends AbstractFactory { register(new Linear3DPatternParser(worldEdit)); register(new BufferedPatternParser(worldEdit)); register(new ExistingPatternParser(worldEdit)); + //FAWE end } } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/DefaultBlockParser.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/DefaultBlockParser.java index 12a633ccc..0734af6fb 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/DefaultBlockParser.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/DefaultBlockParser.java @@ -43,7 +43,7 @@ import com.sk89q.worldedit.extension.input.ParserContext; import com.sk89q.worldedit.extension.platform.Actor; import com.sk89q.worldedit.extension.platform.Capability; import com.sk89q.worldedit.extent.inventory.BlockBag; -import com.sk89q.worldedit.extent.inventory.SlottableBlockBag; +import com.fastasyncworldedit.core.extent.inventory.SlottableBlockBag; import com.sk89q.worldedit.internal.registry.InputParser; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.registry.state.Property; @@ -57,7 +57,7 @@ import com.sk89q.worldedit.world.block.BlockStateHolder; import com.sk89q.worldedit.world.block.BlockType; import com.sk89q.worldedit.world.block.BlockTypes; import com.sk89q.worldedit.world.block.FuzzyBlockState; -import com.sk89q.worldedit.world.block.BlanketBaseBlock; +import com.fastasyncworldedit.core.world.block.BlanketBaseBlock; import com.sk89q.worldedit.world.entity.EntityType; import com.sk89q.worldedit.world.entity.EntityTypes; import com.sk89q.worldedit.world.registry.LegacyMapper; @@ -118,7 +118,7 @@ public class DefaultBlockParser extends InputParser { } } - private static String[] EMPTY_STRING_ARRAY = {}; + private static final String[] EMPTY_STRING_ARRAY = {}; /** * Backwards compatibility for wool colours in block syntax. @@ -253,9 +253,11 @@ public class DefaultBlockParser extends InputParser { } private BaseBlock parseLogic(String input, ParserContext context) throws InputParseException { + //FAWE start String[] blockAndExtraData = input.trim().split("\\|", 2); blockAndExtraData[0] = woolMapper(blockAndExtraData[0]); Map, Object> blockStates = new HashMap<>(); + //FAWE end BlockState state = null; @@ -270,6 +272,7 @@ public class DefaultBlockParser extends InputParser { } else if (MathMan.isInteger(split[0])) { int id = Integer.parseInt(split[0]); int data = Integer.parseInt(split[1]); + //FAWE start if (data < 0 || data >= 16) { throw new InputParseException(Caption.of("fawe.error.parser.invalid-data", TextComponent.of(data))); } @@ -289,6 +292,7 @@ public class DefaultBlockParser extends InputParser { } CompoundTag nbt = null; + //FAWE end if (state == null) { String typeString; String stateString = null; @@ -319,13 +323,17 @@ public class DefaultBlockParser extends InputParser { if ("hand".equalsIgnoreCase(typeString)) { // Get the block type from the item in the user's hand. final BaseBlock blockInHand = getBlockInHand(context.requireActor(), HandSide.MAIN_HAND); + //FAWE start state = blockInHand.toBlockState(); nbt = blockInHand.getNbtData(); + //FAWE end } else if ("offhand".equalsIgnoreCase(typeString)) { // Get the block type from the item in the user's off hand. final BaseBlock blockInHand = getBlockInHand(context.requireActor(), HandSide.OFF_HAND); + //FAWE start state = blockInHand.toBlockState(); nbt = blockInHand.getNbtData(); + //FAWE end } else if (typeString.matches("pos[0-9]+")) { int index = Integer.parseInt(typeString.replaceAll("[a-z]+", "")); // Get the block type from the "primary position" @@ -337,6 +345,7 @@ public class DefaultBlockParser extends InputParser { throw new InputParseException(Caption.of("worldedit.error.incomplete-region")); } state = world.getBlock(primaryPosition); + //FAWE start } else if (typeString.matches("slot[0-9]+")) { int slot = Integer.parseInt(typeString.substring(4)) - 1; Actor actor = context.requireActor(); @@ -369,6 +378,7 @@ public class DefaultBlockParser extends InputParser { if (nbt == null) { nbt = state.getNbtData(); } + //FAWE end blockStates.putAll(parseProperties(state.getBlockType(), stateProperties, context)); if (context.isPreferringWildcard()) { @@ -394,7 +404,7 @@ public class DefaultBlockParser extends InputParser { } // this should be impossible but IntelliJ isn't that smart if (state == null) { - throw new NoMatchException(Caption.of("fawe.error.invalid-block-type", TextComponent.of(input))); + throw new NoMatchException(Caption.of("worldedit.error.unknown-block", TextComponent.of(input))); } if (blockAndExtraData.length > 1 && blockAndExtraData[1].startsWith("{")) { @@ -413,7 +423,7 @@ public class DefaultBlockParser extends InputParser { Actor actor = context.requireActor(); if (actor != null && !actor.hasPermission("worldedit.anyblock") && worldEdit.getConfiguration().disallowedBlocks.contains(blockType.getId())) { - throw new DisallowedUsageException(Caption.of("fawe.error.block.not.allowed", TextComponent.of(input))); + throw new DisallowedUsageException(Caption.of("worldedit.error.disallowed-block", TextComponent.of(input))); } } @@ -462,11 +472,12 @@ public class DefaultBlockParser extends InputParser { } } + //FAWE Start private T validate(ParserContext context, T holder) { if (context.isRestricted()) { Actor actor = context.requireActor(); if (!actor.hasPermission("worldedit.anyblock") && worldEdit.getConfiguration().checkDisallowedBlocks(holder)) { - throw new DisallowedUsageException(Caption.of("fawe.error.block.not.allowed", TextComponent.of(String.valueOf(holder)))); + throw new DisallowedUsageException(Caption.of("worldedit.error.disallowed-block", TextComponent.of(String.valueOf(holder)))); } CompoundTag nbt = holder.getNbtData(); if (nbt != null) { @@ -477,4 +488,5 @@ public class DefaultBlockParser extends InputParser { } return holder; } + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/DefaultItemParser.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/DefaultItemParser.java index d1be80300..72cd69067 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/DefaultItemParser.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/DefaultItemParser.java @@ -101,16 +101,21 @@ public class DefaultItemParser extends InputParser { if ("hand".equalsIgnoreCase(typeString)) { BaseItemStack heldItem = getItemInHand(context.requireActor(), HandSide.MAIN_HAND); + //FAWE start itemType = heldItem.getType(); itemNbtData = heldItem.getNbt(); + //FAWE end } else if ("offhand".equalsIgnoreCase(typeString)) { BaseItemStack heldItem = getItemInHand(context.requireActor(), HandSide.OFF_HAND); + //FAWE start itemType = heldItem.getType(); itemNbtData = heldItem.getNbt(); + //FAWE end } else { itemType = ItemTypes.get(typeString.toLowerCase(Locale.ROOT)); } + //FAWE start if (itemType == null) { throw new NoMatchException(TranslatableComponent.of("worldedit.error.unknown-item", TextComponent.of(input))); } @@ -139,6 +144,7 @@ public class DefaultItemParser extends InputParser { return item; } + //FAWE end private BaseItemStack getItemInHand(Actor actor, HandSide handSide) throws InputParseException { if (actor instanceof Player) { diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/BlockStateMaskParser.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/BlockStateMaskParser.java index 4597e2372..08f6ffc26 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/BlockStateMaskParser.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/BlockStateMaskParser.java @@ -58,7 +58,7 @@ public class BlockStateMaskParser extends InputParser { Splitter.on(',').omitEmptyStrings().trimResults().withKeyValueSeparator('=').split(states), strict); } catch (Exception e) { - throw new InputParseException(Caption.of("fawe.error.invalid-states", TextComponent.of(String.valueOf(e)))); + throw new InputParseException(Caption.of("worldedit.error.parser.bad-state-format", TextComponent.of(String.valueOf(e)))); } } } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/XAxisMaskParser.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/XAxisMaskParser.java deleted file mode 100644 index 8432a3fe3..000000000 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/XAxisMaskParser.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * WorldEdit, a Minecraft world manipulation toolkit - * Copyright (C) sk89q - * Copyright (C) WorldEdit team and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.sk89q.worldedit.extension.factory.parser.mask; - -import com.fastasyncworldedit.core.object.mask.XAxisMask; -import com.google.common.collect.ImmutableList; -import com.sk89q.worldedit.WorldEdit; -import com.sk89q.worldedit.extension.input.ParserContext; -import com.sk89q.worldedit.function.mask.Mask; -import com.sk89q.worldedit.internal.registry.SimpleInputParser; - -import java.util.List; - -public class XAxisMaskParser extends SimpleInputParser { - - private final List aliases = ImmutableList.of("#xaxis"); - - public XAxisMaskParser(WorldEdit worldEdit) { - super(worldEdit); - } - - @Override - public List getMatchedAliases() { - return aliases; - } - - @Override - public Mask parseFromSimpleInput(String input, ParserContext context) { - return new XAxisMask(context.getExtent()); - } -} diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/YAxisMaskParser.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/YAxisMaskParser.java deleted file mode 100644 index 7dd27ffdf..000000000 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/YAxisMaskParser.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * WorldEdit, a Minecraft world manipulation toolkit - * Copyright (C) sk89q - * Copyright (C) WorldEdit team and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.sk89q.worldedit.extension.factory.parser.mask; - -import com.fastasyncworldedit.core.object.mask.YAxisMask; -import com.google.common.collect.ImmutableList; -import com.sk89q.worldedit.WorldEdit; -import com.sk89q.worldedit.extension.input.ParserContext; -import com.sk89q.worldedit.function.mask.Mask; -import com.sk89q.worldedit.internal.registry.SimpleInputParser; - -import java.util.List; - -public class YAxisMaskParser extends SimpleInputParser { - - private final List aliases = ImmutableList.of("#yaxis"); - - public YAxisMaskParser(WorldEdit worldEdit) { - super(worldEdit); - } - - @Override - public List getMatchedAliases() { - return aliases; - } - - @Override - public Mask parseFromSimpleInput(String input, ParserContext context) { - return new YAxisMask(context.getExtent()); - } -} diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/ZAxisMaskParser.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/ZAxisMaskParser.java deleted file mode 100644 index 2bbef3ea6..000000000 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/ZAxisMaskParser.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * WorldEdit, a Minecraft world manipulation toolkit - * Copyright (C) sk89q - * Copyright (C) WorldEdit team and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.sk89q.worldedit.extension.factory.parser.mask; - -import com.fastasyncworldedit.core.object.mask.ZAxisMask; -import com.google.common.collect.ImmutableList; -import com.sk89q.worldedit.WorldEdit; -import com.sk89q.worldedit.extension.input.ParserContext; -import com.sk89q.worldedit.function.mask.Mask; -import com.sk89q.worldedit.internal.registry.SimpleInputParser; - -import java.util.List; - -public class ZAxisMaskParser extends SimpleInputParser { - - private final List aliases = ImmutableList.of("#zaxis"); - - public ZAxisMaskParser(WorldEdit worldEdit) { - super(worldEdit); - } - - @Override - public List getMatchedAliases() { - return aliases; - } - - @Override - public Mask parseFromSimpleInput(String input, ParserContext context) { - return new ZAxisMask(); - } -} diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/BlockCategoryPatternParser.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/BlockCategoryPatternParser.java index 5d9a5b241..7c47ba188 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/BlockCategoryPatternParser.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/BlockCategoryPatternParser.java @@ -60,13 +60,13 @@ public class BlockCategoryPatternParser extends InputParser { BlockCategory category = BlockCategory.REGISTRY.get(tag); if (category == null) { - throw new InputParseException(Caption.of("fawe.error.unknown-block-tag", TextComponent.of(tag))); + throw new InputParseException(Caption.of("worldedit.error.unknown-tag", TextComponent.of(tag))); } RandomPattern randomPattern = new RandomPattern(); Set blocks = category.getAll(); if (blocks.isEmpty()) { - throw new InputParseException(Caption.of("fawe.error.block-tag-no-blocks", TextComponent.of(category.getId()))); + throw new InputParseException(Caption.of("worldedit.error.empty-tag", TextComponent.of(category.getId()))); } if (anyState) { diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/ClipboardPatternParser.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/ClipboardPatternParser.java index 6d9db2fa4..1e928a4db 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/ClipboardPatternParser.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/ClipboardPatternParser.java @@ -99,10 +99,10 @@ public class ClipboardPatternParser extends InputParser { Clipboard clipboard = holder.getClipboard(); return new ClipboardPattern(clipboard, offset); } catch (EmptyClipboardException e) { - throw new InputParseException(Caption.of("fawe.error.empty-clipboard", TextComponent.of("#clipboard"))); + throw new InputParseException(Caption.of("worldedit.error.empty-clipboard")); } } else { - throw new InputParseException(Caption.of("fawe.error.no-session")); + throw new InputParseException(Caption.of("worldedit.error.missing-session")); } } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/input/ParserContext.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/input/ParserContext.java index b9f73aee2..4bbb20354 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/input/ParserContext.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/input/ParserContext.java @@ -48,7 +48,9 @@ public class ParserContext { private boolean restricted = true; private boolean tryLegacy = true; private boolean preferringWildcard; + //Fawe start private InjectedValueAccess injected; + //FAWE end /** * Create a new instance. @@ -260,6 +262,7 @@ public class ParserContext { return tryLegacy; } + //FAWE start public void setInjected(InjectedValueAccess injected) { this.injected = injected; } @@ -267,4 +270,5 @@ public class ParserContext { public InjectedValueAccess getInjected() { return injected; } + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/AbstractNonPlayerActor.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/AbstractNonPlayerActor.java index 345d3a61e..0daf50a76 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/AbstractNonPlayerActor.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/AbstractNonPlayerActor.java @@ -20,8 +20,8 @@ package com.sk89q.worldedit.extension.platform; import com.fastasyncworldedit.core.configuration.Caption; -import com.fastasyncworldedit.core.object.exception.FaweException; -import com.fastasyncworldedit.core.object.task.AsyncNotifyQueue; +import com.fastasyncworldedit.core.internal.exception.FaweException; +import com.fastasyncworldedit.core.util.task.AsyncNotifyQueue; import com.fastasyncworldedit.core.util.TaskManager; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.internal.cui.CUIEvent; @@ -57,6 +57,7 @@ public abstract class AbstractNonPlayerActor implements Actor { public void dispatchCUIEvent(CUIEvent event) { } + //FAWE start private final ConcurrentHashMap meta = new ConcurrentHashMap<>(); @Override @@ -112,4 +113,5 @@ public abstract class AbstractNonPlayerActor implements Actor { } return true; } + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/AbstractPlayerActor.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/AbstractPlayerActor.java index 751af2270..d58e878df 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/AbstractPlayerActor.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/AbstractPlayerActor.java @@ -20,8 +20,8 @@ package com.sk89q.worldedit.extension.platform; import com.fastasyncworldedit.core.configuration.Caption; -import com.fastasyncworldedit.core.object.exception.FaweException; -import com.fastasyncworldedit.core.object.task.AsyncNotifyQueue; +import com.fastasyncworldedit.core.internal.exception.FaweException; +import com.fastasyncworldedit.core.util.task.AsyncNotifyQueue; import com.fastasyncworldedit.core.regions.FaweMaskManager; import com.fastasyncworldedit.core.util.TaskManager; import com.fastasyncworldedit.core.util.WEManager; @@ -34,7 +34,7 @@ import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.function.mask.Mask; import com.sk89q.worldedit.internal.cui.CUIEvent; import com.sk89q.worldedit.math.BlockVector3; -import com.sk89q.worldedit.math.MutableBlockVector3; +import com.fastasyncworldedit.core.math.MutableBlockVector3; import com.sk89q.worldedit.math.Vector3; import com.sk89q.worldedit.regions.ConvexPolyhedralRegion; import com.sk89q.worldedit.regions.CylinderRegion; @@ -56,13 +56,11 @@ import com.sk89q.worldedit.world.block.BlockCategories; import com.sk89q.worldedit.world.block.BlockState; import com.sk89q.worldedit.world.block.BlockStateHolder; import com.sk89q.worldedit.world.block.BlockType; -import com.sk89q.worldedit.world.block.BlockTypeUtil; import com.sk89q.worldedit.world.block.BlockTypes; import com.sk89q.worldedit.world.gamemode.GameMode; import com.sk89q.worldedit.world.gamemode.GameModes; import com.sk89q.worldedit.world.item.ItemType; import com.sk89q.worldedit.world.item.ItemTypes; -import com.sk89q.worldedit.world.registry.BlockMaterial; import java.io.File; import java.util.Map; @@ -76,6 +74,7 @@ import javax.annotation.Nullable; * players that make use of WorldEdit. */ public abstract class AbstractPlayerActor implements Actor, Player, Cloneable { + //FAWE start private final Map meta; // Queue for async tasks @@ -104,6 +103,7 @@ public abstract class AbstractPlayerActor implements Actor, Player, Cloneable { public AbstractPlayerActor() { this(new ConcurrentHashMap<>()); } + //FAWE end @Override public final Extent getExtent() { @@ -254,57 +254,21 @@ public abstract class AbstractPlayerActor implements Actor, Player, Cloneable { @Override public boolean ascendLevel() { + final World world = getWorld(); final Location pos = getBlockLocation(); final int x = pos.getBlockX(); - int y = Math.max(0, pos.getBlockY()); + int y = Math.max(world.getMinY(), pos.getBlockY() + 1); final int z = pos.getBlockZ(); - final Extent world = pos.getExtent(); + int yPlusSearchHeight = y + WorldEdit.getInstance().getConfiguration().defaultVerticalHeight; + int maxY = Math.min(world.getMaxY(), yPlusSearchHeight) + 2; - int maxY = world.getMaxY(); - if (y >= maxY) { - return false; - } - - BlockMaterial initialMaterial = world.getBlock(BlockVector3.at(x, y, z)).getMaterial(); - - boolean lastState = initialMaterial.isMovementBlocker() && initialMaterial.isFullCube(); - - double height = 1.85; - double freeStart = -1; - - for (int level = y + 1; level <= maxY + 2; level++) { - BlockState state; - if (level >= maxY) { - state = BlockTypes.VOID_AIR.getDefaultState(); - } else { - state = world.getBlock(BlockVector3.at(x, level, z)); + while (y <= maxY) { + if (isLocationGoodForStanding(BlockVector3.at(x, y, z)) + && trySetPosition(Vector3.at(x + 0.5, y, z + 0.5))) { + return true; } - BlockType type = state.getBlockType(); - BlockMaterial material = type.getMaterial(); - if (!material.isFullCube() || !material.isMovementBlocker()) { - if (!lastState) { - lastState = BlockTypeUtil.centralBottomLimit(state) != 1; - continue; - } - if (freeStart == -1) { - freeStart = level + BlockTypeUtil.centralTopLimit(state); - } else { - double bottomLimit = BlockTypeUtil.centralBottomLimit(state); - double space = level + bottomLimit - freeStart; - if (space >= height) { - trySetPosition(Vector3.at(x + 0.5, freeStart, z + 0.5)); - return true; - } - // Not enough room, reset the free position - if (bottomLimit != 1) { - freeStart = -1; - } - } - } else { - freeStart = -1; - lastState = true; - } + ++y; } return false; @@ -312,57 +276,21 @@ public abstract class AbstractPlayerActor implements Actor, Player, Cloneable { @Override public boolean descendLevel() { + final World world = getWorld(); final Location pos = getBlockLocation(); final int x = pos.getBlockX(); - int y = Math.max(0, pos.getBlockY() - 1); + int y = Math.max(world.getMinY(), pos.getBlockY() - 1); final int z = pos.getBlockZ(); - final Extent world = pos.getExtent(); + int yLessSearchHeight = y - WorldEdit.getInstance().getConfiguration().defaultVerticalHeight; + int minY = Math.min(world.getMinY() + 1, yLessSearchHeight); - BlockMaterial initialMaterial = world.getBlock(BlockVector3.at(x, y, z)).getMaterial(); - - boolean lastState = initialMaterial.isMovementBlocker() && initialMaterial.isFullCube(); - - int maxY = world.getMaxY(); - if (y <= 2) { - return false; - } - - double freeEnd = -1; - double height = 1.85; - for (int level = y + 1; level > 0; level--) { - BlockState state; - if (level >= maxY) { - state = BlockTypes.VOID_AIR.getDefaultState(); - } else { - state = world.getBlock(BlockVector3.at(x, level, z)); + while (y >= minY) { + if (isLocationGoodForStanding(BlockVector3.at(x, y, z)) + && trySetPosition(Vector3.at(x + 0.5, y, z + 0.5))) { + return true; } - BlockType type = state.getBlockType(); - BlockMaterial material = type.getMaterial(); - if (!material.isFullCube() || !material.isMovementBlocker()) { - if (!lastState) { - lastState = BlockTypeUtil.centralTopLimit(state) != 0; - continue; - } - if (freeEnd == -1) { - freeEnd = level + BlockTypeUtil.centralBottomLimit(state); - } else { - double topLimit = BlockTypeUtil.centralTopLimit(state); - double freeStart = level + topLimit; - double space = freeEnd - freeStart; - if (space >= height) { - trySetPosition(Vector3.at(x + 0.5, freeStart, z + 0.5)); - return true; - } - // Not enough room, reset the free position - if (topLimit != 0) { - freeEnd = -1; - } - } - } else { - lastState = true; - freeEnd = -1; - } + --y; } return false; @@ -375,19 +303,22 @@ public abstract class AbstractPlayerActor implements Actor, Player, Cloneable { @Override public boolean ascendToCeiling(int clearance, boolean alwaysGlass) { + World world = getWorld(); Location pos = getBlockLocation(); int x = pos.getBlockX(); - int initialY = Math.max(0, pos.getBlockY()); - int y = Math.max(0, pos.getBlockY() + 2); + int initialY = Math.max(world.getMinY(), pos.getBlockY()); + int y = Math.max(world.getMinY(), pos.getBlockY() + 2); int z = pos.getBlockZ(); - Extent world = getLocation().getExtent(); // No free space above if (!world.getBlock(BlockVector3.at(x, y, z)).getBlockType().getMaterial().isAir()) { return false; } - while (y <= world.getMaximumPoint().getY()) { + int yPlusSearchHeight = y + WorldEdit.getInstance().getConfiguration().defaultVerticalHeight; + int maxY = Math.min(world.getMaxY(), yPlusSearchHeight); + + while (y <= maxY) { // Found a ceiling! if (world.getBlock(BlockVector3.at(x, y, z)).getBlockType().getMaterial().isMovementBlocker()) { int platformY = Math.max(initialY, y - 3 - clearance); @@ -416,8 +347,8 @@ public abstract class AbstractPlayerActor implements Actor, Player, Cloneable { final World world = getWorld(); final Location pos = getBlockLocation(); final int x = pos.getBlockX(); - final int initialY = Math.max(0, pos.getBlockY()); - int y = Math.max(0, pos.getBlockY() + 1); + final int initialY = Math.max(world.getMinY(), pos.getBlockY()); + int y = Math.max(world.getMinY(), pos.getBlockY() + 1); final int z = pos.getBlockZ(); final int maxY = Math.min(world.getMaxY() + 1, initialY + distance); @@ -521,6 +452,7 @@ public abstract class AbstractPlayerActor implements Actor, Player, Cloneable { return getCardinalDirection(0); } + //FAWE start /** * Get the player's current allowed WorldEdit regions. * @@ -566,6 +498,7 @@ public abstract class AbstractPlayerActor implements Actor, Player, Cloneable { getSession().setRegionSelector(getWorld(), selector); } + //FAWE end @Override public Direction getCardinalDirection(int yawOffset) { @@ -591,7 +524,9 @@ public abstract class AbstractPlayerActor implements Actor, Player, Cloneable { if (typeId.hasBlockType()) { return typeId.getBlockType().getDefaultState().toBaseBlock(); } else { + //FAWE start return BlockTypes.AIR.getDefaultState().toBaseBlock(); // FAWE returns air here + //FAWE end } } @@ -676,6 +611,7 @@ public abstract class AbstractPlayerActor implements Actor, Player, Cloneable { return null; } + //FAWE start /** * Run a task either async, or on the current thread. * @@ -706,6 +642,7 @@ public abstract class AbstractPlayerActor implements Actor, Player, Cloneable { } return true; } + //FAWE end @Override public boolean canDestroyBedrock() { diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/Actor.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/Actor.java index 7eb80baaf..86376adee 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/Actor.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/Actor.java @@ -24,7 +24,7 @@ import com.fastasyncworldedit.core.configuration.Settings; import com.fastasyncworldedit.core.object.FaweLimit; import com.fastasyncworldedit.core.util.task.InterruptableCondition; import com.sk89q.worldedit.EditSession; -import com.sk89q.worldedit.entity.MapMetadatable; +import com.fastasyncworldedit.core.entity.MapMetadatable; import com.sk89q.worldedit.entity.Player; import com.sk89q.worldedit.internal.cui.CUIEvent; import com.sk89q.worldedit.session.SessionOwner; @@ -166,6 +166,20 @@ public interface Actor extends Identifiable, SessionOwner, Subject, MapMetadatab */ void dispatchCUIEvent(CUIEvent event); + /** + * Get the locale of this actor. + * + * @return The locale + */ + Locale getLocale(); + + /** + * Sends any relevant notices to the user when they first use WorldEdit in a session. + */ + default void sendAnnouncements() { + } + + //FAWE start boolean runAction(Runnable ifFree, boolean checkFree, boolean async); /** @@ -242,17 +256,5 @@ public interface Actor extends Identifiable, SessionOwner, Subject, MapMetadatab } return cancelled; } - - /** - * Get the locale of this actor. - * - * @return The locale - */ - Locale getLocale(); - - /** - * Sends any relevant notices to the user when they first use WorldEdit in a session. - */ - default void sendAnnouncements() { - } + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/Annotations.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/Annotations.java index 0a5b74d9e..0f1cae782 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/Annotations.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/Annotations.java @@ -20,7 +20,7 @@ package com.sk89q.worldedit.extension.platform; import com.google.auto.value.AutoAnnotation; -import com.sk89q.worldedit.internal.annotation.PatternList; +import com.sk89q.worldedit.command.util.annotation.PatternList; import com.sk89q.worldedit.internal.annotation.Radii; /** @@ -33,10 +33,12 @@ class Annotations { return new AutoAnnotation_Annotations_radii(value); } + //FAWE start @AutoAnnotation static PatternList patternList() { return new AutoAnnotation_Annotations_patternList(); } + //FAWE end private Annotations() { } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/Capability.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/Capability.java index f74018324..02bcdeb38 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/Capability.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/Capability.java @@ -19,8 +19,6 @@ package com.sk89q.worldedit.extension.platform; -import com.sk89q.worldedit.WorldEdit; - /** * A collection of capabilities that a {@link Platform} may support. */ @@ -45,7 +43,9 @@ public enum Capability { /** * The capability of providing configuration. */ + //FAWE start CONFIGURATION, + //FAWE end /** * The capability of handling user commands entered in chat or console. @@ -62,6 +62,7 @@ public enum Capability { } }, + //FAWE start /** * The capability of a platform to assess whether a given * {@link Actor} has sufficient authorization to perform a task. @@ -94,6 +95,7 @@ public enum Capability { } */ }; + //FAWE end /** * Initialize platform-wide state. diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/Platform.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/Platform.java index 69fcd0095..1f51dfb57 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/Platform.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/Platform.java @@ -19,8 +19,8 @@ package com.sk89q.worldedit.extension.platform; -import com.fastasyncworldedit.core.beta.implementation.lighting.Relighter; -import com.fastasyncworldedit.core.beta.implementation.lighting.RelighterFactory; +import com.fastasyncworldedit.core.extent.processor.lighting.Relighter; +import com.fastasyncworldedit.core.extent.processor.lighting.RelighterFactory; import com.sk89q.worldedit.LocalConfiguration; import com.sk89q.worldedit.entity.Player; import com.sk89q.worldedit.internal.util.NonAbstractForCompatibility; @@ -196,18 +196,6 @@ public interface Platform extends Keyed { */ String getPlatformVersion(); - /** - * {@inheritDoc} - * @return an id - * @apiNote This must be overridden by new subclasses. See {@link NonAbstractForCompatibility} - * for details - */ - @NonAbstractForCompatibility(delegateName = "getPlatformName", delegateParams = {}) - @Override - default String getId() { - return "legacy:" + getPlatformName().toLowerCase(Locale.ROOT).replaceAll("[^a-z_.-]", "_"); - } - /** * Get a map of advertised capabilities of this platform, where each key * in the given map is a supported capability and the respective value @@ -224,6 +212,19 @@ public interface Platform extends Keyed { */ Set getSupportedSideEffects(); + //FAWE start + /** + * {@inheritDoc} + * @return an id + * @apiNote This must be overridden by new subclasses. See {@link NonAbstractForCompatibility} + * for details + */ + @NonAbstractForCompatibility(delegateName = "getPlatformName", delegateParams = {}) + @Override + default String getId() { + return "legacy:" + getPlatformName().toLowerCase(Locale.ROOT).replaceAll("[^a-z_.-]", "_"); + } + /** * Get the {@link RelighterFactory} that can be used to obtain * {@link Relighter}s. @@ -232,4 +233,5 @@ public interface Platform extends Keyed { */ @NotNull RelighterFactory getRelighterFactory(); + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/PlatformCommandManager.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/PlatformCommandManager.java index 82f7b0e85..6f6363ce7 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/PlatformCommandManager.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/PlatformCommandManager.java @@ -22,8 +22,8 @@ package com.sk89q.worldedit.extension.platform; import com.fastasyncworldedit.core.Fawe; import com.fastasyncworldedit.core.configuration.Caption; import com.fastasyncworldedit.core.configuration.Settings; -import com.fastasyncworldedit.core.object.exception.FaweException; -import com.fastasyncworldedit.core.object.task.ThrowableSupplier; +import com.fastasyncworldedit.core.internal.exception.FaweException; +import com.fastasyncworldedit.core.util.task.ThrowableSupplier; import com.fastasyncworldedit.core.util.StringMan; import com.fastasyncworldedit.core.util.TaskManager; import com.google.common.collect.ImmutableList; @@ -105,17 +105,17 @@ import com.sk89q.worldedit.entity.Player; import com.sk89q.worldedit.event.Event; import com.sk89q.worldedit.event.platform.CommandEvent; import com.sk89q.worldedit.event.platform.CommandSuggestionEvent; -import com.sk89q.worldedit.extension.platform.binding.Bindings; -import com.sk89q.worldedit.extension.platform.binding.ConsumeBindings; -import com.sk89q.worldedit.extension.platform.binding.PrimitiveBindings; -import com.sk89q.worldedit.extension.platform.binding.ProvideBindings; +import com.fastasyncworldedit.core.extension.platform.binding.Bindings; +import com.fastasyncworldedit.core.extension.platform.binding.ConsumeBindings; +import com.fastasyncworldedit.core.extension.platform.binding.PrimitiveBindings; +import com.fastasyncworldedit.core.extension.platform.binding.ProvideBindings; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.internal.annotation.Selection; import com.sk89q.worldedit.internal.command.CommandArgParser; import com.sk89q.worldedit.internal.command.CommandLoggingHandler; import com.sk89q.worldedit.internal.command.CommandRegistrationHandler; -import com.sk89q.worldedit.internal.command.ConfirmHandler; -import com.sk89q.worldedit.internal.command.MethodInjector; +import com.sk89q.worldedit.command.util.annotation.ConfirmHandler; +import com.fastasyncworldedit.core.internal.command.MethodInjector; import com.sk89q.worldedit.internal.command.exception.ExceptionConverter; import com.sk89q.worldedit.internal.command.exception.WorldEditExceptionConverter; import com.sk89q.worldedit.internal.util.LogManagerCompat; @@ -193,7 +193,9 @@ public final class PlatformCommandManager { private final WorldEditExceptionConverter exceptionConverter; public final CommandRegistrationHandler registration; + //FAWE start private static PlatformCommandManager INSTANCE; + //FAWE end /** * Create a new instance. @@ -203,7 +205,9 @@ public final class PlatformCommandManager { public PlatformCommandManager(final WorldEdit worldEdit, PlatformManager platformManager) { checkNotNull(worldEdit); checkNotNull(platformManager); + //FAWE start INSTANCE = this; + //FAWE end this.worldEdit = worldEdit; this.platformManager = platformManager; @@ -261,6 +265,7 @@ public final class PlatformCommandManager { SideEffectConverter.register(commandManager); HeightConverter.register(commandManager); OffsetConverter.register(worldEdit, commandManager); + //FAWE start commandManager.registerConverter(Key.of(com.sk89q.worldedit.function.pattern.Pattern.class, Annotations.patternList()), CommaSeparatedValuesConverter.wrap(commandManager.getConverter(Key.of( com.sk89q.worldedit.function.pattern.Pattern.class)).get())); @@ -268,11 +273,14 @@ public final class PlatformCommandManager { registerBindings(new ConsumeBindings(worldEdit, this)); registerBindings(new PrimitiveBindings(worldEdit)); registerBindings(new ProvideBindings(worldEdit)); + //FAWE end } + //FAWE start private void registerBindings(Bindings bindings) { bindings.register(globalInjectedValues, commandManager); } + //FAWE end private void registerAlwaysInjectedValues() { globalInjectedValues.injectValue(Key.of(Region.class, Selection.class), @@ -289,6 +297,7 @@ public final class PlatformCommandManager { } }); }); + //FAWE start /* globalInjectedValues.injectValue(Key.of(EditSession.class), context -> { @@ -307,6 +316,7 @@ public final class PlatformCommandManager { // globalInjectedValues.injectValue(Key.of(CFICommands.CFISettings.class), // context -> context.injectedValue(Key.of(Actor.class)) // .orElseThrow(() -> new IllegalStateException("No CFI Settings")).getMeta("CFISettings")); + //FAWE end globalInjectedValues.injectValue(Key.of(World.class), context -> { LocalSession localSession = context.injectedValue(Key.of(LocalSession.class)) @@ -327,7 +337,9 @@ public final class PlatformCommandManager { } }); }); + //FAWE start globalInjectedValues.injectValue(Key.of(InjectedValueAccess.class), Optional::of); + //FAWE end } /** @@ -376,13 +388,14 @@ public final class PlatformCommandManager { CommandManager manager = commandManagerService.newCommandManager(); - handlerInstance.accept((handler, instance) -> { - this.registration.register( - manager, - handler, - instance - ); - }); + //FAWE start + handlerInstance.accept((handler, instance) -> + this.registration.register( + manager, + handler, + instance + )); + //FAWE end additionalConfig.accept(manager); final List subCommands = manager.getAllCommands().collect(Collectors.toList()); @@ -397,6 +410,7 @@ public final class PlatformCommandManager { } public void registerAllCommands() { + //FAWE start if (Settings.IMP.ENABLED_COMPONENTS.COMMANDS) { // TODO: Ping @MattBDev to reimplement (or remove) 2020-02-04 // registerSubCommands( @@ -420,6 +434,7 @@ public final class PlatformCommandManager { // TransformCommandsRegistration.builder(), // new TransformCommands() // ); + //FAWE end registerSubCommands( "schematic", ImmutableList.of("schem", "/schematic", "/schem"), @@ -443,6 +458,7 @@ public final class PlatformCommandManager { ); registerSubCommands( "brush", + //FAWE start - register tools as brushes (?) Lists.newArrayList("br", "/brush", "/br", "/tool", "tool"), "Brushing commands", c -> { @@ -450,6 +466,7 @@ public final class PlatformCommandManager { c.accept(ToolCommandsRegistration.builder(), new ToolCommands(worldEdit)); c.accept(ToolUtilCommandsRegistration.builder(), new ToolUtilCommands(worldEdit)); }, + //FAWE end manager -> { PaintBrushCommands.register(commandManagerService, manager, registration); ApplyBrushCommands.register(commandManagerService, manager, registration); @@ -457,28 +474,13 @@ public final class PlatformCommandManager { ); registerSubCommands( "worldedit", + //FAWE start - register fawe ImmutableList.of("we", "fawe", "fastasyncworldedit"), + //FAWE end "WorldEdit commands", WorldEditCommandsRegistration.builder(), new WorldEditCommands(worldEdit) ); - /* - TODO: Ping @MattBDev to reimplement 2020-02-04 - registerSubCommands( - "cfi", - ImmutableList.of("/cfi"), - "CFI commands", - CFICommandsRegistration.builder(), - new CFICommands(worldEdit) - ); - registerSubCommands( - "/anvil", - ImmutableList.of(), - "Manipulate billions of blocks", - AnvilCommandsRegistration.builder(), - new AnvilCommands(worldEdit) - ); - */ this.registration.register( commandManager, BiomeCommandsRegistration.builder(), @@ -505,6 +507,7 @@ public final class PlatformCommandManager { GenerationCommandsRegistration.builder(), new GenerationCommands(worldEdit) ); + //FAWE start HistoryCommands history = new HistoryCommands(worldEdit); this.registration.register( commandManager, @@ -518,6 +521,7 @@ public final class PlatformCommandManager { HistorySubCommandsRegistration.builder(), new HistorySubCommands(history) ); + //FAWE end this.registration.register( commandManager, NavigationCommandsRegistration.builder(), @@ -583,7 +587,7 @@ public final class PlatformCommandManager { dynamicHandler.setHandler(null); COMMAND_LOG.setLevel(Level.OFF); } else { - File file = new File(config.getWorkingDirectory(), path); + File file = new File(config.getWorkingDirectoryPath().toFile(), path); COMMAND_LOG.setLevel(Level.ALL); LOGGER.info("Logging WorldEdit commands to " + file.getAbsolutePath()); @@ -608,6 +612,7 @@ public final class PlatformCommandManager { return CommandArgParser.forArgString(input).parseArgs(); } + //FAWE start public int parseCommand(String args, Actor actor) { InjectedValueAccess context; if (actor == null) { @@ -643,6 +648,7 @@ public final class PlatformCommandManager { @Subscribe public void handleCommand(CommandEvent event) { Request.reset(); + Actor actor = event.getActor(); String args = event.getArguments(); TaskManager.IMP.taskNow(() -> { @@ -802,8 +808,11 @@ public final class PlatformCommandManager { PrintCommandHelp.help(arguments, 0, false, getCommandManager(), actor, "//help"); } + //FAWE end + //FAWE start - Event & suggestions private MemoizingValueAccess initializeInjectedValues(Arguments arguments, Actor actor, Event event, boolean isSuggestions) { + //FAWE end InjectedValueStore store = MapBackedValueStore.create(); store.injectValue(Key.of(Actor.class), ValueProvider.constant(actor)); if (actor instanceof Player) { @@ -838,14 +847,18 @@ public final class PlatformCommandManager { public void handleCommandSuggestion(CommandSuggestionEvent event) { try { String rawArgs = event.getArguments(); + //FAWE start // Increase the resulting positions by 1 if we remove a leading `/` final int posOffset = rawArgs.startsWith("/") ? 1 : 0; String arguments = rawArgs.startsWith("/") ? rawArgs.substring(1) : rawArgs; + //FAWE end List split = parseArgs(arguments).collect(Collectors.toList()); List argStrings = split.stream() .map(Substring::getSubstring) .collect(Collectors.toList()); + //FAWE start - event & suggestion MemoizingValueAccess access = initializeInjectedValues(() -> arguments, event.getActor(), event, true); + //FAWE end ImmutableSet suggestions; try { suggestions = commandManager.getSuggestions(access, argStrings); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/PlatformManager.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/PlatformManager.java index 72cddf9ae..967dc046d 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/PlatformManager.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/PlatformManager.java @@ -20,8 +20,8 @@ package com.sk89q.worldedit.extension.platform; import com.fastasyncworldedit.core.configuration.Caption; -import com.fastasyncworldedit.core.object.exception.FaweException; -import com.fastasyncworldedit.core.object.pattern.PatternTraverser; +import com.fastasyncworldedit.core.internal.exception.FaweException; +import com.fastasyncworldedit.core.function.pattern.PatternTraverser; import com.fastasyncworldedit.core.wrappers.LocationMaskedPlayerWrapper; import com.fastasyncworldedit.core.wrappers.WorldWrapper; import com.sk89q.worldedit.LocalConfiguration; @@ -43,7 +43,6 @@ import com.sk89q.worldedit.event.platform.PlatformUnreadyEvent; import com.sk89q.worldedit.event.platform.PlatformsRegisteredEvent; import com.sk89q.worldedit.event.platform.PlayerInputEvent; import com.sk89q.worldedit.internal.util.LogManagerCompat; -import com.sk89q.worldedit.math.Vector3; import com.sk89q.worldedit.session.request.Request; import com.sk89q.worldedit.util.Location; import com.sk89q.worldedit.util.SideEffect; @@ -174,10 +173,12 @@ public class PlatformManager { } else { if (preferences.isEmpty()) { // Not all platforms registered, this is being called too early! + //FAWE start - exchange WE -> FAWE throw new NoCapablePlatformException( "Not all platforms have been registered yet!" + " Please wait until FastAsyncWorldEdit is initialized." ); + //FAWE end } throw new NoCapablePlatformException("No platform was found supporting " + capability.name()); } @@ -288,9 +289,11 @@ public class PlatformManager { } } + //FAWE start private T proxyFawe(T player) { return (T) new LocationMaskedPlayerWrapper(player, player.getLocation(), true); } + //FAWE end /** * Get the command manager. @@ -378,17 +381,17 @@ public class PlatformManager { Request.request().setWorld(player.getWorld()); try { - Vector3 vector = location.toVector(); - if (event.getType() == Interaction.HIT) { // superpickaxe is special because its primary interaction is a left click, not a right click // in addition, it is implicitly bound to all pickaxe items, not just a single tool item if (session.hasSuperPickAxe() && player.isHoldingPickAxe()) { final BlockTool superPickaxe = session.getSuperPickaxe(); if (superPickaxe != null && superPickaxe.canUse(player)) { + //FAWE start - run async player.runAction(() -> reset(superPickaxe) .actPrimary(queryCapability(Capability.WORLD_EDITING), - getConfiguration(), player, session, location), false, true); + getConfiguration(), player, session, location, event.getFace()), false, true); + //FAWE end event.setCancelled(true); return; } @@ -396,24 +399,29 @@ public class PlatformManager { Tool tool = session.getTool(player); if (tool instanceof DoubleActionBlockTool && tool.canUse(player)) { + //FAWE start - run async player.runAction(() -> reset((DoubleActionBlockTool) tool) .actSecondary(queryCapability(Capability.WORLD_EDITING), - getConfiguration(), player, session, location), false, true); + getConfiguration(), player, session, location, event.getFace()), false, true); + //FAWE end event.setCancelled(true); } } else if (event.getType() == Interaction.OPEN) { + //FAWE start - get general tool over item in main hand & run async Tool tool = session.getTool(player); if (tool instanceof BlockTool && tool.canUse(player)) { if (player.checkAction()) { + // FAWE run async player.runAction(() -> { BlockTool blockTool = (BlockTool) tool; if (!(tool instanceof BrushTool)) { blockTool = reset(blockTool); } blockTool.actPrimary(queryCapability(Capability.WORLD_EDITING), - getConfiguration(), player, session, location); + getConfiguration(), player, session, location, event.getFace()); }, false, true); + //FAWE end event.setCancelled(true); } } @@ -425,6 +433,7 @@ public class PlatformManager { } } + //FAWE start public void handleThrowable(Throwable e, Actor actor) { FaweException faweException = FaweException.get(e); if (faweException != null) { @@ -435,6 +444,7 @@ public class PlatformManager { e.printStackTrace(); } } + //FAWE end @Subscribe public void handlePlayerInput(PlayerInputEvent event) { @@ -448,8 +458,10 @@ public class PlatformManager { case PRIMARY: { Tool tool = session.getTool(player); if (tool instanceof DoubleActionTraceTool && tool.canUse(player)) { + //FAWE start - run async player.runAsyncIfFree(() -> reset((DoubleActionTraceTool) tool).actSecondary(queryCapability(Capability.WORLD_EDITING), getConfiguration(), player, session)); + //FAWE end event.setCancelled(true); return; } @@ -460,9 +472,11 @@ public class PlatformManager { case SECONDARY: { Tool tool = session.getTool(player); if (tool instanceof TraceTool && tool.canUse(player)) { + //FAWE start - run async //todo this needs to be fixed so the event is canceled after actPrimary is used and returns true player.runAction(() -> reset((TraceTool) tool).actPrimary(queryCapability(Capability.WORLD_EDITING), getConfiguration(), player, session), false, true); + //FAWE end event.setCancelled(true); return; } @@ -470,6 +484,7 @@ public class PlatformManager { break; } } + //FAWE start - add own message } catch (Throwable e) { FaweException faweException = FaweException.get(e); if (faweException != null) { @@ -479,6 +494,7 @@ public class PlatformManager { player.print(Caption.of(e.getClass().getName() + ": " + e.getMessage())); e.printStackTrace(); } + //FAWE end } finally { Request.reset(); } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/PlayerProxy.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/PlayerProxy.java index 3a8732255..78191b332 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/PlayerProxy.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/PlayerProxy.java @@ -49,7 +49,9 @@ public class PlayerProxy extends AbstractPlayerActor { private final Actor permActor; private final Actor cuiActor; private final World world; + //FAWE start private Vector3 offset = Vector3.ZERO; + //FAWE end public PlayerProxy(Player player) { this(player, player, player, player.getWorld()); @@ -67,27 +69,6 @@ public class PlayerProxy extends AbstractPlayerActor { this.world = world; } - public static Player unwrap(Player player) { - if (player instanceof PlayerProxy) { - return unwrap(((PlayerProxy) player).getBasePlayer()); - } - return player; - } - - public void setOffset(Vector3 position) { - this.offset = position; - } - - @Override - public BaseBlock getBlockInHand(HandSide handSide) throws WorldEditException { - return basePlayer.getBlockInHand(handSide); - } - - @Override - public boolean runAction(Runnable ifFree, boolean checkFree, boolean async) { - return basePlayer.runAction(ifFree, checkFree, async); - } - @Override public UUID getUniqueId() { return basePlayer.getUniqueId(); @@ -225,15 +206,6 @@ public class PlayerProxy extends AbstractPlayerActor { basePlayer.sendFakeBlock(pos, block); } - @Override - public void sendTitle(Component title, Component sub) { - basePlayer.sendTitle(title, sub); - } - - public Player getBasePlayer() { - return basePlayer; - } - @Override public void floatAt(int x, int y, int z, boolean alwaysGlass) { basePlayer.floatAt(x, y, z, alwaysGlass); @@ -243,4 +215,36 @@ public class PlayerProxy extends AbstractPlayerActor { public Locale getLocale() { return basePlayer.getLocale(); } + + //FAWE start + public static Player unwrap(Player player) { + if (player instanceof PlayerProxy) { + return unwrap(((PlayerProxy) player).getBasePlayer()); + } + return player; + } + + public void setOffset(Vector3 position) { + this.offset = position; + } + + @Override + public BaseBlock getBlockInHand(HandSide handSide) throws WorldEditException { + return basePlayer.getBlockInHand(handSide); + } + + @Override + public boolean runAction(Runnable ifFree, boolean checkFree, boolean async) { + return basePlayer.runAction(ifFree, checkFree, async); + } + + @Override + public void sendTitle(Component title, Component sub) { + basePlayer.sendTitle(title, sub); + } + + public Player getBasePlayer() { + return basePlayer; + } + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/AbstractDelegateExtent.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/AbstractDelegateExtent.java index f0efe75be..2c751fb86 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/AbstractDelegateExtent.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/AbstractDelegateExtent.java @@ -19,11 +19,11 @@ package com.sk89q.worldedit.extent; -import com.fastasyncworldedit.core.beta.IBatchProcessor; +import com.fastasyncworldedit.core.queue.IBatchProcessor; import com.fastasyncworldedit.core.configuration.Settings; -import com.fastasyncworldedit.core.object.HistoryExtent; -import com.fastasyncworldedit.core.object.changeset.AbstractChangeSet; -import com.fastasyncworldedit.core.object.exception.FaweException; +import com.fastasyncworldedit.core.extent.HistoryExtent; +import com.fastasyncworldedit.core.history.changeset.AbstractChangeSet; +import com.fastasyncworldedit.core.internal.exception.FaweException; import com.fastasyncworldedit.core.util.ExtentTraverser; import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.WorldEditException; @@ -53,12 +53,15 @@ import static org.apache.logging.log4j.LogManager.getLogger; /** * A base class for {@link Extent}s that merely passes extents onto another. */ +//FAWE start - made none abstract public class AbstractDelegateExtent implements Extent { +//FAWE end private static final Logger LOGGER = LogManagerCompat.getLogger(); - //Not safe for public usage + //FAWE start - made public: Not safe for public usage public Extent extent; + //FAWE end /** * Create a new instance. @@ -81,7 +84,9 @@ public class AbstractDelegateExtent implements Extent { @Override public BlockState getBlock(BlockVector3 position) { + //FAWE start - return coordinates return extent.getBlock(position.getX(), position.getY(), position.getZ()); + //FAWE end } @Override @@ -91,107 +96,23 @@ public class AbstractDelegateExtent implements Extent { @Override public BaseBlock getFullBlock(BlockVector3 position) { + //FAWE start - return coordinates return extent.getFullBlock(position.getX(), position.getY(), position.getZ()); + //FAWE end } + //FAWE start /* Queue based methods TODO NOT IMPLEMENTED: IQueueExtent and such need to implement these - */ + */ + //FAWE end @Override public BaseBlock getFullBlock(int x, int y, int z) { + //FAWE start - return coordinates return extent.getFullBlock(x, y, z); - } - - @Override - public BiomeType getBiomeType(int x, int y, int z) { - return extent.getBiomeType(x, y, z); - } - - @Override - public BiomeType getBiome(BlockVector3 position) { - return extent.getBiome(position); - } - /* - History - */ - - @Override - public int getEmmittedLight(int x, int y, int z) { - return extent.getEmmittedLight(x, y, z); - } - - @Override - public int getSkyLight(int x, int y, int z) { - return extent.getSkyLight(x, y, z); - } - - @Override - public int getBrightness(int x, int y, int z) { - return extent.getBrightness(x, y, z); - } - - public void setChangeSet(AbstractChangeSet changeSet) { - if (extent instanceof HistoryExtent) { - HistoryExtent history = ((HistoryExtent) extent); - if (changeSet == null) { - new ExtentTraverser(this).setNext(history.getExtent()); - } else { - history.setChangeSet(changeSet); - } - } else if (extent instanceof AbstractDelegateExtent) { - ((AbstractDelegateExtent) extent).setChangeSet(changeSet); - } else if (changeSet != null) { - new ExtentTraverser<>(this).setNext(new HistoryExtent(extent, changeSet)); - } - } - - @Override - public > boolean setBlock(BlockVector3 position, T block) - throws WorldEditException { - return extent.setBlock(position.getX(), position.getY(), position.getZ(), block); - } - - @Override - public > boolean setBlock(int x, @Range(from = 0, to = 255) int y, - int z, T block) throws WorldEditException { - return extent.setBlock(x, y, z, block); - } - - @Override - public boolean setTile(int x, int y, int z, CompoundTag tile) throws WorldEditException { - return setBlock(x, y, z, getBlock(x, y, z).toBaseBlock(tile)); - } - - @Override - public boolean fullySupports3DBiomes() { - return extent.fullySupports3DBiomes(); - } - - @Override - public boolean setBiome(int x, int y, int z, BiomeType biome) { - return extent.setBiome(x, y, z, biome); - } - - @Override - public boolean setBiome(BlockVector3 position, BiomeType biome) { - return extent.setBiome(position.getX(), position.getY(), position.getZ(), biome); - } - - @Override - public void setBlockLight(int x, int y, int z, int value) { - extent.setSkyLight(x, y, z, value); - } - - @Override - public void setSkyLight(int x, int y, int z, int value) { - extent.setSkyLight(x, y, z, value); - } - - @Override - public String toString() { - return super.toString() + ":" + (extent == this ? "" : extent.toString()); + //FAWE end } @Override @@ -220,6 +141,28 @@ public class AbstractDelegateExtent implements Extent { return extent.createEntity(location, entity); } + @Override + @Nullable + public Operation commit() { + Operation ours = commitBefore(); + Operation other = null; + //FAWE start - implement extent + if (extent != this) { + other = extent.commit(); + } + //FAWE end + if (ours != null && other != null) { + return new OperationQueue(ours, other); + } else if (ours != null) { + return ours; + } else if (other != null) { + return other; + } else { + return null; + } + } + + //FAWE start @Override public void removeEntity(int x, int y, int z, UUID uuid) { extent.removeEntity(x, y, z, uuid); @@ -256,25 +199,6 @@ public class AbstractDelegateExtent implements Extent { } } - @Override - @Nullable - public Operation commit() { - Operation ours = commitBefore(); - Operation other = null; - if (extent != this) { - other = extent.commit(); - } - if (ours != null && other != null) { - return new OperationQueue(ours, other); - } else if (ours != null) { - return ours; - } else if (other != null) { - return other; - } else { - return null; - } - } - @Override public int getMaxY() { return extent.getMaxY(); @@ -343,4 +267,95 @@ public class AbstractDelegateExtent implements Extent { protected Operation commitBefore() { return null; } + + @Override + public BiomeType getBiomeType(int x, int y, int z) { + return extent.getBiomeType(x, y, z); + } + + @Override + public BiomeType getBiome(BlockVector3 position) { + return extent.getBiome(position); + } + /* + History + */ + + @Override + public int getEmittedLight(int x, int y, int z) { + return extent.getEmittedLight(x, y, z); + } + + @Override + public int getSkyLight(int x, int y, int z) { + return extent.getSkyLight(x, y, z); + } + + @Override + public int getBrightness(int x, int y, int z) { + return extent.getBrightness(x, y, z); + } + + public void setChangeSet(AbstractChangeSet changeSet) { + if (extent instanceof HistoryExtent) { + HistoryExtent history = ((HistoryExtent) extent); + if (changeSet == null) { + new ExtentTraverser(this).setNext(history.getExtent()); + } else { + history.setChangeSet(changeSet); + } + } else if (extent instanceof AbstractDelegateExtent) { + ((AbstractDelegateExtent) extent).setChangeSet(changeSet); + } else if (changeSet != null) { + new ExtentTraverser<>(this).setNext(new HistoryExtent(extent, changeSet)); + } + } + + @Override + public > boolean setBlock(BlockVector3 position, T block) + throws WorldEditException { + return extent.setBlock(position.getX(), position.getY(), position.getZ(), block); + } + + @Override + public > boolean setBlock(int x, @Range(from = 0, to = 255) int y, + int z, T block) throws WorldEditException { + return extent.setBlock(x, y, z, block); + } + + @Override + public boolean setTile(int x, int y, int z, CompoundTag tile) throws WorldEditException { + return setBlock(x, y, z, getBlock(x, y, z).toBaseBlock(tile)); + } + + @Override + public boolean fullySupports3DBiomes() { + return extent.fullySupports3DBiomes(); + } + + @Override + public boolean setBiome(int x, int y, int z, BiomeType biome) { + return extent.setBiome(x, y, z, biome); + } + + @Override + public boolean setBiome(BlockVector3 position, BiomeType biome) { + return extent.setBiome(position.getX(), position.getY(), position.getZ(), biome); + } + + @Override + public void setBlockLight(int x, int y, int z, int value) { + extent.setSkyLight(x, y, z, value); + } + + @Override + public void setSkyLight(int x, int y, int z, int value) { + extent.setSkyLight(x, y, z, value); + } + + @Override + public String toString() { + return super.toString() + ":" + (extent == this ? "" : extent.toString()); + } + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/Extent.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/Extent.java index a909c1ba8..638d1ec98 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/Extent.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/Extent.java @@ -20,15 +20,15 @@ package com.sk89q.worldedit.extent; import com.fastasyncworldedit.core.FaweCache; -import com.fastasyncworldedit.core.beta.Filter; -import com.fastasyncworldedit.core.beta.IBatchProcessor; -import com.fastasyncworldedit.core.beta.implementation.filter.block.ExtentFilterBlock; -import com.fastasyncworldedit.core.beta.implementation.processors.ProcessorScope; +import com.fastasyncworldedit.core.queue.Filter; +import com.fastasyncworldedit.core.queue.IBatchProcessor; +import com.fastasyncworldedit.core.extent.filter.block.ExtentFilterBlock; +import com.fastasyncworldedit.core.extent.processor.ProcessorScope; import com.fastasyncworldedit.core.configuration.Settings; -import com.fastasyncworldedit.core.object.changeset.AbstractChangeSet; -import com.fastasyncworldedit.core.object.clipboard.WorldCopyClipboard; -import com.fastasyncworldedit.core.object.exception.FaweException; -import com.fastasyncworldedit.core.object.extent.NullExtent; +import com.fastasyncworldedit.core.history.changeset.AbstractChangeSet; +import com.fastasyncworldedit.core.extent.clipboard.WorldCopyClipboard; +import com.fastasyncworldedit.core.internal.exception.FaweException; +import com.fastasyncworldedit.core.extent.NullExtent; import com.fastasyncworldedit.core.util.ExtentTraverser; import com.sk89q.worldedit.MaxChangedBlocksException; import com.sk89q.worldedit.WorldEditException; @@ -37,11 +37,11 @@ import com.sk89q.worldedit.entity.Entity; import com.sk89q.worldedit.extent.clipboard.Clipboard; import com.sk89q.worldedit.function.RegionMaskingFilter; import com.sk89q.worldedit.function.block.BlockReplace; -import com.sk89q.worldedit.function.generator.CavesGen; -import com.sk89q.worldedit.function.generator.GenBase; -import com.sk89q.worldedit.function.generator.OreGen; -import com.sk89q.worldedit.function.generator.Resource; -import com.sk89q.worldedit.function.generator.SchemGen; +import com.fastasyncworldedit.core.function.generator.CavesGen; +import com.fastasyncworldedit.core.function.generator.GenBase; +import com.fastasyncworldedit.core.function.generator.OreGen; +import com.fastasyncworldedit.core.function.generator.Resource; +import com.fastasyncworldedit.core.function.generator.SchemGen; import com.sk89q.worldedit.function.mask.BlockMask; import com.sk89q.worldedit.function.mask.ExistingBlockMask; import com.sk89q.worldedit.function.mask.Mask; @@ -53,11 +53,11 @@ import com.sk89q.worldedit.function.visitor.RegionVisitor; import com.sk89q.worldedit.math.BlockVector2; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.math.MathUtils; -import com.sk89q.worldedit.math.MutableBlockVector3; +import com.fastasyncworldedit.core.math.MutableBlockVector3; import com.sk89q.worldedit.math.Vector3; import com.sk89q.worldedit.regions.CuboidRegion; import com.sk89q.worldedit.regions.Region; -import com.sk89q.worldedit.registry.state.PropertyGroup; +import com.fastasyncworldedit.core.registry.state.PropertyGroup; import com.sk89q.worldedit.session.ClipboardHolder; import com.sk89q.worldedit.util.Countable; import com.sk89q.worldedit.util.Location; @@ -147,6 +147,7 @@ public interface Extent extends InputExtent, OutputExtent { return null; } + //FAWE start /** * Create an entity at the given location. * @@ -741,4 +742,5 @@ public interface Extent extends InputExtent, OutputExtent { } return filter; } + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/InputExtent.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/InputExtent.java index 868e4aefa..67d8c92b0 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/InputExtent.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/InputExtent.java @@ -19,13 +19,13 @@ package com.sk89q.worldedit.extent; -import com.fastasyncworldedit.core.beta.implementation.lighting.HeightMapType; +import com.fastasyncworldedit.core.extent.processor.heightmap.HeightMapType; import com.sk89q.worldedit.function.pattern.Pattern; import com.sk89q.worldedit.internal.util.DeprecationUtil; import com.sk89q.worldedit.internal.util.NonAbstractForCompatibility; import com.sk89q.worldedit.math.BlockVector2; import com.sk89q.worldedit.math.BlockVector3; -import com.sk89q.worldedit.math.MutableBlockVector3; +import com.fastasyncworldedit.core.math.MutableBlockVector3; import com.sk89q.worldedit.world.biome.BiomeType; import com.sk89q.worldedit.world.block.BaseBlock; import com.sk89q.worldedit.world.block.BlockState; @@ -53,6 +53,7 @@ public interface InputExtent { return getBlock(position.getX(), position.getY(), position.getZ()); } + //FAWE start default BlockState getBlock(int x, int y, int z) { return getBlock(MutableBlockVector3.get(x, y, z)); } @@ -70,6 +71,7 @@ public interface InputExtent { default BaseBlock getFullBlock(int x, int y, int z) { return getFullBlock(MutableBlockVector3.get(x, y, z)); } + //FAWE end /** * Get the biome at the given location. @@ -114,17 +116,18 @@ public interface InputExtent { return getBiome(position.toBlockVector2()); } + //FAWE start /** * Get the light level at the given location. * * @param position location * @return the light level at the location */ - default int getEmmittedLight(BlockVector3 position) { - return getEmmittedLight(position.getX(), position.getY(), position.getZ()); + default int getEmittedLight(BlockVector3 position) { + return getEmittedLight(position.getX(), position.getY(), position.getZ()); } - default int getEmmittedLight(int x, int y, int z) { + default int getEmittedLight(int x, int y, int z) { return 0; } @@ -161,4 +164,5 @@ public interface InputExtent { default int[] getHeightMap(HeightMapType type) { return new int[256]; } + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/MaskingExtent.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/MaskingExtent.java index 5b7576c8c..bc7c1cdc3 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/MaskingExtent.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/MaskingExtent.java @@ -20,15 +20,15 @@ package com.sk89q.worldedit.extent; import com.fastasyncworldedit.core.FaweCache; -import com.fastasyncworldedit.core.beta.Filter; -import com.fastasyncworldedit.core.beta.IBatchProcessor; -import com.fastasyncworldedit.core.beta.IChunk; -import com.fastasyncworldedit.core.beta.IChunkGet; -import com.fastasyncworldedit.core.beta.IChunkSet; -import com.fastasyncworldedit.core.beta.implementation.filter.block.CharFilterBlock; -import com.fastasyncworldedit.core.beta.implementation.filter.block.ChunkFilterBlock; -import com.fastasyncworldedit.core.beta.implementation.filter.block.FilterBlock; -import com.fastasyncworldedit.core.beta.implementation.processors.ProcessorScope; +import com.fastasyncworldedit.core.queue.Filter; +import com.fastasyncworldedit.core.queue.IBatchProcessor; +import com.fastasyncworldedit.core.queue.IChunk; +import com.fastasyncworldedit.core.queue.IChunkGet; +import com.fastasyncworldedit.core.queue.IChunkSet; +import com.fastasyncworldedit.core.extent.filter.block.CharFilterBlock; +import com.fastasyncworldedit.core.extent.filter.block.ChunkFilterBlock; +import com.fastasyncworldedit.core.extent.filter.block.FilterBlock; +import com.fastasyncworldedit.core.extent.processor.ProcessorScope; import com.google.common.cache.LoadingCache; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.function.mask.Mask; @@ -47,7 +47,9 @@ import static com.google.common.base.Preconditions.checkNotNull; public class MaskingExtent extends AbstractDelegateExtent implements IBatchProcessor, Filter { private Mask mask; + //FAWE start private final LoadingCache threadIdToFilter; + //FAWE end /** * Create a new instance. @@ -59,15 +61,19 @@ public class MaskingExtent extends AbstractDelegateExtent implements IBatchProce super(extent); checkNotNull(mask); this.mask = mask; + //FAWE start this.threadIdToFilter = FaweCache.IMP.createCache(() -> new CharFilterBlock(getExtent())); + //FAWE end } + //FAWE start private MaskingExtent(Extent extent, Mask mask, LoadingCache threadIdToFilter) { super(extent); checkNotNull(mask); this.mask = mask; this.threadIdToFilter = threadIdToFilter; } + //FAWE end /** * Get the mask. @@ -88,6 +94,7 @@ public class MaskingExtent extends AbstractDelegateExtent implements IBatchProce this.mask = mask; } + //FAWE start @Override public > boolean setBlock(BlockVector3 location, B block) throws WorldEditException { return this.mask.test(location) && super.setBlock(location, block); @@ -134,4 +141,5 @@ public class MaskingExtent extends AbstractDelegateExtent implements IBatchProce public ProcessorScope getScope() { return ProcessorScope.REMOVING_BLOCKS; } + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/NullExtent.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/NullExtent.java index ecb946fee..0cbbba151 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/NullExtent.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/NullExtent.java @@ -91,12 +91,6 @@ public class NullExtent implements Extent { return false; } - @Override - public > boolean setBlock(int x, int y, int z, T block) - throws WorldEditException { - return false; - } - @Override public boolean fullySupports3DBiomes() { return false; @@ -112,11 +106,19 @@ public class NullExtent implements Extent { return false; } + //FAWE start @Override public boolean setBiome(int x, int y, int z, BiomeType biome) { return false; } + @Override + public > boolean setBlock(int x, int y, int z, T block) + throws WorldEditException { + return false; + } + //FAWE end + @Nullable @Override public Operation commit() { diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/OutputExtent.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/OutputExtent.java index 45b1d0713..d7b3954e4 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/OutputExtent.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/OutputExtent.java @@ -19,7 +19,7 @@ package com.sk89q.worldedit.extent; -import com.fastasyncworldedit.core.beta.implementation.lighting.HeightMapType; +import com.fastasyncworldedit.core.extent.processor.heightmap.HeightMapType; import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.function.operation.Operation; @@ -27,7 +27,7 @@ import com.sk89q.worldedit.internal.util.DeprecationUtil; import com.sk89q.worldedit.internal.util.NonAbstractForCompatibility; import com.sk89q.worldedit.math.BlockVector2; import com.sk89q.worldedit.math.BlockVector3; -import com.sk89q.worldedit.math.MutableBlockVector3; +import com.fastasyncworldedit.core.math.MutableBlockVector3; import com.sk89q.worldedit.world.biome.BiomeType; import com.sk89q.worldedit.world.block.BlockStateHolder; @@ -112,6 +112,7 @@ public interface OutputExtent { return setBiome(MutableBlockVector3.get(x, y, z), biome); } + //FAWE start /** * Set the biome. * @@ -159,6 +160,7 @@ public interface OutputExtent { default void setSkyLight(BlockVector3 position, int value) { setSkyLight(position.getX(), position.getY(), position.getZ(), value); } + //FAWE end default void setSkyLight(int x, int y, int z, int value) { } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/buffer/ForgetfulExtentBuffer.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/buffer/ForgetfulExtentBuffer.java index f3b5e3850..9a515bb06 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/buffer/ForgetfulExtentBuffer.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/buffer/ForgetfulExtentBuffer.java @@ -68,10 +68,12 @@ public class ForgetfulExtentBuffer extends AbstractDelegateExtent implements Pat this(delegate, Masks.alwaysTrue()); } + //FAWE start @Override public boolean isQueueEnabled() { return true; } + //FAWE end /** * Create a new extent buffer that will buffer changes that meet the criteria @@ -102,16 +104,19 @@ public class ForgetfulExtentBuffer extends AbstractDelegateExtent implements Pat max = max.getMaximum(location); } + //FAWE start if (mask.test(location)) { buffer.put(location, block.toBaseBlock()); return true; } else { return getExtent().setBlock(location, block); } + //FAWE end } @Override public boolean setBiome(BlockVector3 position, BiomeType biome) { + //FAWE start // Update minimum if (min == null) { min = position; @@ -132,10 +137,12 @@ public class ForgetfulExtentBuffer extends AbstractDelegateExtent implements Pat } else { return getExtent().setBiome(position, biome); } + //FAWE end } @Override public boolean setBiome(int x, int y, int z, BiomeType biome) { + //FAWE start // Update minimum if (min == null) { min = BlockVector3.at(x, y, z); @@ -156,6 +163,7 @@ public class ForgetfulExtentBuffer extends AbstractDelegateExtent implements Pat } else { return getExtent().setBiome(x, y, z, biome); } + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/BlockArrayClipboard.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/BlockArrayClipboard.java index d87ea7c2a..7850a00be 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/BlockArrayClipboard.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/BlockArrayClipboard.java @@ -25,11 +25,11 @@ import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.entity.BaseEntity; import com.sk89q.worldedit.entity.Entity; import com.sk89q.worldedit.extent.Extent; -import com.sk89q.worldedit.function.visitor.Order; +import com.fastasyncworldedit.core.function.visitor.Order; import com.sk89q.worldedit.math.BlockVector2; import com.sk89q.worldedit.math.BlockVector3; -import com.sk89q.worldedit.math.MutableBlockVector2; -import com.sk89q.worldedit.math.OffsetBlockVector3; +import com.fastasyncworldedit.core.math.MutableBlockVector2; +import com.fastasyncworldedit.core.math.OffsetBlockVector3; import com.sk89q.worldedit.regions.Region; import com.sk89q.worldedit.util.Location; import com.sk89q.worldedit.world.biome.BiomeType; @@ -53,6 +53,7 @@ import static com.google.common.base.Preconditions.checkNotNull; */ public class BlockArrayClipboard implements Clipboard { + //FAWE start private final Region region; private final BlockVector3 origin; private final Clipboard parent; @@ -87,6 +88,7 @@ public class BlockArrayClipboard implements Clipboard { this.region = region.clone(); this.origin = region.getMinimumPoint(); } + //FAWE end @Override public Region getRegion() { @@ -139,14 +141,17 @@ public class BlockArrayClipboard implements Clipboard { @Override public > boolean setBlock(BlockVector3 position, B block) throws WorldEditException { if (region.contains(position)) { + //FAWE - get points final int x = position.getBlockX(); final int y = position.getBlockY(); final int z = position.getBlockZ(); return setBlock(x, y, z, block); + //FAWE end } return false; } + //FAWE start @Override public boolean setTile(int x, int y, int z, CompoundTag tag) { x -= origin.getX(); @@ -155,6 +160,7 @@ public class BlockArrayClipboard implements Clipboard { return getParent().setTile(x, y, z, tag); } + public boolean setTile(BlockVector3 position, CompoundTag tag) { return setTile(position.getX(), position.getY(), position.getZ(), tag); } @@ -293,6 +299,7 @@ public class BlockArrayClipboard implements Clipboard { OffsetBlockVector3 mutable = new OffsetBlockVector3(origin); return Iterators.transform(getParent().iterator(order), mutable::init); } + //FAWE end @Override public BlockVector3 getDimensions() { @@ -313,6 +320,7 @@ public class BlockArrayClipboard implements Clipboard { this.parent.close(); } + //FAWE start /** * Stores entity data. */ @@ -384,4 +392,5 @@ public class BlockArrayClipboard implements Clipboard { return result != null; } } + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/Clipboard.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/Clipboard.java index 406b60de9..2270fd3f8 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/Clipboard.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/Clipboard.java @@ -19,12 +19,12 @@ package com.sk89q.worldedit.extent.clipboard; -import com.fastasyncworldedit.core.beta.Filter; +import com.fastasyncworldedit.core.queue.Filter; import com.fastasyncworldedit.core.configuration.Settings; -import com.fastasyncworldedit.core.object.clipboard.CPUOptimizedClipboard; -import com.fastasyncworldedit.core.object.clipboard.DiskOptimizedClipboard; -import com.fastasyncworldedit.core.object.clipboard.MemoryOptimizedClipboard; -import com.fastasyncworldedit.core.object.clipboard.ReadOnlyClipboard; +import com.fastasyncworldedit.core.extent.clipboard.CPUOptimizedClipboard; +import com.fastasyncworldedit.core.extent.clipboard.DiskOptimizedClipboard; +import com.fastasyncworldedit.core.extent.clipboard.MemoryOptimizedClipboard; +import com.fastasyncworldedit.core.extent.clipboard.ReadOnlyClipboard; import com.fastasyncworldedit.core.util.EditSessionBuilder; import com.fastasyncworldedit.core.util.MaskTraverser; import com.sk89q.worldedit.EditSession; @@ -38,7 +38,7 @@ import com.sk89q.worldedit.function.mask.ExistingBlockMask; import com.sk89q.worldedit.function.mask.Mask; import com.sk89q.worldedit.function.operation.ForwardExtentCopy; import com.sk89q.worldedit.function.operation.Operations; -import com.sk89q.worldedit.function.visitor.Order; +import com.fastasyncworldedit.core.function.visitor.Order; import com.sk89q.worldedit.math.BlockVector2; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.math.transform.Transform; @@ -66,6 +66,7 @@ import static com.google.common.base.Preconditions.checkNotNull; */ public interface Clipboard extends Extent, Iterable, Closeable { + //FAWE start static Clipboard create(Region region) { checkNotNull(region); checkNotNull(region.getWorld(), @@ -84,6 +85,7 @@ public interface Clipboard extends Extent, Iterable, Closeable { return new MemoryOptimizedClipboard(region); } } + //FAWE end /** * Get the bounding region of this extent. @@ -127,6 +129,7 @@ public interface Clipboard extends Extent, Iterable, Closeable { return false; } + //FAWE start /** * Remove entity from clipboard. */ @@ -358,4 +361,5 @@ public interface Clipboard extends Extent, Iterable, Closeable { } } } + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/BuiltInClipboardFormat.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/BuiltInClipboardFormat.java index c0c97a55c..3fe63f2c4 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/BuiltInClipboardFormat.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/BuiltInClipboardFormat.java @@ -19,16 +19,18 @@ package com.sk89q.worldedit.extent.clipboard.io; -import com.fastasyncworldedit.core.object.io.PGZIPOutputStream; -import com.fastasyncworldedit.core.object.io.ResettableFileInputStream; -import com.fastasyncworldedit.core.object.schematic.MinecraftStructure; -import com.fastasyncworldedit.core.object.schematic.PNGWriter; +import com.fastasyncworldedit.core.extent.clipboard.io.FastSchematicReader; +import com.fastasyncworldedit.core.extent.clipboard.io.FastSchematicWriter; +import com.fastasyncworldedit.core.internal.io.ResettableFileInputStream; +import com.fastasyncworldedit.core.extent.clipboard.io.schematic.MinecraftStructure; +import com.fastasyncworldedit.core.extent.clipboard.io.schematic.PNGWriter; import com.google.common.collect.ImmutableSet; import com.sk89q.jnbt.CompoundTag; import com.sk89q.jnbt.NBTInputStream; import com.sk89q.jnbt.NBTOutputStream; import com.sk89q.jnbt.NamedTag; import com.sk89q.jnbt.Tag; +import org.anarres.parallelgzip.ParallelGZIPOutputStream; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; @@ -48,6 +50,7 @@ import java.util.zip.GZIPOutputStream; */ public enum BuiltInClipboardFormat implements ClipboardFormat { + //FAWE start - register fast clipboard io FAST("fast", "fawe") { @Override @@ -68,11 +71,11 @@ public enum BuiltInClipboardFormat implements ClipboardFormat { @Override public ClipboardWriter getWriter(OutputStream outputStream) throws IOException { OutputStream gzip; - if (outputStream instanceof PGZIPOutputStream || outputStream instanceof GZIPOutputStream) { + if (outputStream instanceof ParallelGZIPOutputStream || outputStream instanceof GZIPOutputStream) { gzip = outputStream; } else { outputStream = new BufferedOutputStream(outputStream); - gzip = new PGZIPOutputStream(outputStream); + gzip = new ParallelGZIPOutputStream(outputStream); } NBTOutputStream nbtStream = new NBTOutputStream(new BufferedOutputStream(gzip)); return new FastSchematicWriter(nbtStream); @@ -85,6 +88,7 @@ public enum BuiltInClipboardFormat implements ClipboardFormat { } }, + //FAWE end /** * The Schematic format used by MCEdit. @@ -104,7 +108,10 @@ public enum BuiltInClipboardFormat implements ClipboardFormat { @Override public ClipboardWriter getWriter(OutputStream outputStream) throws IOException { - throw new IOException("The formats `.schematic`, `.mcedit` and `.mce` are discontinued on versions newer than 1.12 and superseded by the sponge schematic implementation known for `.schem` files."); + //FAWE start - be a more helpful exception + throw new IOException("The formats `.schematic`, `.mcedit` and `.mce` are discontinued on versions newer than" + + "1.12 and superseded by the sponge schematic implementation known for `.schem` files."); + //FAWE end } @Override @@ -154,6 +161,7 @@ public enum BuiltInClipboardFormat implements ClipboardFormat { } }, + //FAWE start - recover schematics with bad entity data & register other clipboard formats BROKENENTITY("brokenentity", "legacyentity", "le", "be", "brokenentities", "legacyentities") { @Override @@ -176,11 +184,11 @@ public enum BuiltInClipboardFormat implements ClipboardFormat { @Override public ClipboardWriter getWriter(OutputStream outputStream) throws IOException { OutputStream gzip; - if (outputStream instanceof PGZIPOutputStream || outputStream instanceof GZIPOutputStream) { + if (outputStream instanceof ParallelGZIPOutputStream || outputStream instanceof GZIPOutputStream) { gzip = outputStream; } else { outputStream = new BufferedOutputStream(outputStream); - gzip = new PGZIPOutputStream(outputStream); + gzip = new ParallelGZIPOutputStream(outputStream); } NBTOutputStream nbtStream = new NBTOutputStream(new BufferedOutputStream(gzip)); FastSchematicWriter writer = new FastSchematicWriter(nbtStream); @@ -215,7 +223,7 @@ public enum BuiltInClipboardFormat implements ClipboardFormat { @Override public ClipboardWriter getWriter(OutputStream outputStream) throws IOException { outputStream = new BufferedOutputStream(outputStream); - OutputStream gzip = new PGZIPOutputStream(outputStream); + OutputStream gzip = new ParallelGZIPOutputStream(outputStream); NBTOutputStream nbtStream = new NBTOutputStream(new BufferedOutputStream(gzip)); return new MinecraftStructure(nbtStream); } @@ -252,6 +260,7 @@ public enum BuiltInClipboardFormat implements ClipboardFormat { return "png"; } }; + //FAWE end private final ImmutableSet aliases; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/ClipboardFormat.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/ClipboardFormat.java index 07292f388..55ba6499c 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/ClipboardFormat.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/ClipboardFormat.java @@ -19,14 +19,14 @@ package com.sk89q.worldedit.extent.clipboard.io; -import com.fastasyncworldedit.core.object.RunnableVal; -import com.fastasyncworldedit.core.object.clipboard.URIClipboardHolder; -import com.fastasyncworldedit.core.object.io.PGZIPOutputStream; +import com.fastasyncworldedit.core.util.task.RunnableVal; +import com.fastasyncworldedit.core.extent.clipboard.URIClipboardHolder; import com.fastasyncworldedit.core.util.MainUtil; import com.sk89q.worldedit.LocalSession; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.extension.platform.Actor; import com.sk89q.worldedit.extent.clipboard.Clipboard; +import org.anarres.parallelgzip.ParallelGZIPOutputStream; import java.io.File; import java.io.FileInputStream; @@ -99,6 +99,7 @@ public interface ClipboardFormat { */ Set getFileExtensions(); + //FAWE start /** * Sets the actor's clipboard. * @param actor the actor @@ -131,9 +132,8 @@ public interface ClipboardFormat { return getReader(stream).read(); } - default URL upload(final Clipboard clipboard) { - return MainUtil.upload(null, null, getPrimaryFileExtension(), new RunnableVal() { + return MainUtil.upload(null, null, getPrimaryFileExtension(), new RunnableVal<>() { @Override public void run(OutputStream value) { write(value, clipboard); @@ -143,7 +143,7 @@ public interface ClipboardFormat { default void write(OutputStream value, Clipboard clipboard) { try { - try (PGZIPOutputStream gzip = new PGZIPOutputStream(value)) { + try (ParallelGZIPOutputStream gzip = new ParallelGZIPOutputStream(value)) { try (ClipboardWriter writer = getWriter(gzip)) { writer.write(clipboard); } @@ -152,4 +152,5 @@ public interface ClipboardFormat { throw new RuntimeException(e); } } + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/ClipboardFormats.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/ClipboardFormats.java index 2bd5ee01b..f1312984e 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/ClipboardFormats.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/ClipboardFormats.java @@ -21,10 +21,10 @@ package com.sk89q.worldedit.extent.clipboard.io; import com.fastasyncworldedit.core.configuration.Caption; import com.fastasyncworldedit.core.configuration.Settings; -import com.fastasyncworldedit.core.object.clipboard.LazyClipboardHolder; -import com.fastasyncworldedit.core.object.clipboard.MultiClipboardHolder; -import com.fastasyncworldedit.core.object.clipboard.URIClipboardHolder; -import com.fastasyncworldedit.core.object.io.FastByteArrayOutputStream; +import com.fastasyncworldedit.core.extent.clipboard.LazyClipboardHolder; +import com.fastasyncworldedit.core.extent.clipboard.MultiClipboardHolder; +import com.fastasyncworldedit.core.extent.clipboard.URIClipboardHolder; +import com.fastasyncworldedit.core.internal.io.FastByteArrayOutputStream; import com.fastasyncworldedit.core.util.MainUtil; import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; @@ -126,26 +126,6 @@ public class ClipboardFormats { return null; } - /** - * Detect the format using the given extension. - * - * @param extension the extension - * @return the format, otherwise null if one cannot be detected - */ - @Nullable - public static ClipboardFormat findByExtension(String extension) { - checkNotNull(extension); - - Collection> entries = getFileExtensionMap().entries(); - for (Map.Entry entry : entries) { - if (entry.getKey().equalsIgnoreCase(extension)) { - return entry.getValue(); - } - } - return null; - - } - /** * A mapping from extensions to formats. * @@ -170,6 +150,27 @@ public class ClipboardFormats { private ClipboardFormats() { } + //FAWE start + /** + * Detect the format using the given extension. + * + * @param extension the extension + * @return the format, otherwise null if one cannot be detected + */ + @Nullable + public static ClipboardFormat findByExtension(String extension) { + checkNotNull(extension); + + Collection> entries = getFileExtensionMap().entries(); + for (Map.Entry entry : entries) { + if (entry.getKey().equalsIgnoreCase(extension)) { + return entry.getValue(); + } + } + return null; + + } + public static MultiClipboardHolder loadAllFromInput(Actor player, String input, ClipboardFormat format, boolean message) throws IOException { checkNotNull(player); checkNotNull(input); @@ -325,4 +326,5 @@ public class ClipboardFormats { throw new RuntimeException(e); } } + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/ClipboardReader.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/ClipboardReader.java index 09271b0c2..abc5095a8 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/ClipboardReader.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/ClipboardReader.java @@ -19,7 +19,7 @@ package com.sk89q.worldedit.extent.clipboard.io; -import com.fastasyncworldedit.core.object.clipboard.DiskOptimizedClipboard; +import com.fastasyncworldedit.core.extent.clipboard.DiskOptimizedClipboard; import com.sk89q.worldedit.extent.clipboard.Clipboard; import com.sk89q.worldedit.math.BlockVector3; @@ -43,7 +43,9 @@ public interface ClipboardReader extends Closeable { * @throws IOException thrown on I/O error */ default Clipboard read() throws IOException { + //FAWE start return read(UUID.randomUUID()); + //FAWe end } /** @@ -55,6 +57,7 @@ public interface ClipboardReader extends Closeable { return OptionalInt.empty(); } + //FAWE start default Clipboard read(UUID uuid) throws IOException { return read(uuid, DiskOptimizedClipboard::new); } @@ -62,4 +65,5 @@ public interface ClipboardReader extends Closeable { default Clipboard read(UUID uuid, Function createOutput) throws IOException { return read(); } + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/ClipboardWriter.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/ClipboardWriter.java index 030a22d2f..b7cf7a050 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/ClipboardWriter.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/ClipboardWriter.java @@ -47,6 +47,7 @@ public interface ClipboardWriter extends Closeable { */ void write(Clipboard clipboard) throws IOException; + //FAWE start default Tag writeVector(Vector3 vector) { List list = new ArrayList<>(); list.add(new DoubleTag(vector.getX())); @@ -61,4 +62,5 @@ public interface ClipboardWriter extends Closeable { list.add(new FloatTag(location.getPitch())); return new ListTag(FloatTag.class, list); } + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/MCEditSchematicReader.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/MCEditSchematicReader.java index b52e483ce..4f536fc35 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/MCEditSchematicReader.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/MCEditSchematicReader.java @@ -222,7 +222,9 @@ public class MCEditSchematicReader extends NBTSchematicReader { } if (fixer != null && t != null) { + //FAWE start t = (CompoundTag) AdventureNBTConverter.fromAdventure(fixer.fixUp(DataFixer.FixTypes.BLOCK_ENTITY, t.asBinaryTag(), -1)); + //FAWE end } BlockVector3 vec = BlockVector3.at(x, y, z); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/NBTSchematicReader.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/NBTSchematicReader.java index af2b85a2f..44a133cfd 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/NBTSchematicReader.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/NBTSchematicReader.java @@ -26,7 +26,7 @@ import java.util.Map; import javax.annotation.Nullable; /** - * Base class for NBT schematic readers + * Base class for NBT schematic readers. */ public abstract class NBTSchematicReader implements ClipboardReader { diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/SpongeSchematicReader.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/SpongeSchematicReader.java index 099efa100..6a8708404 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/SpongeSchematicReader.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/SpongeSchematicReader.java @@ -125,7 +125,9 @@ public class SpongeSchematicReader extends NBTSchematicReader { BlockArrayClipboard clip = readVersion1(schematicTag); return readVersion2(clip, schematicTag); } - throw new IOException("This schematic version is not supported; Version: " + schematicVersion + ", DataVersion: " + dataVersion + ". It's very likely your schematic has an invalid file extension, if the schematic has been created on a version lower than 1.13.2, the extension MUST be `.schematic`, elsewise the schematic can't be read properly."); + throw new IOException("This schematic version is not supported; Version: " + schematicVersion + ", DataVersion: " + dataVersion + "." + + "It's very likely your schematic has an invalid file extension, if the schematic has been created on a version lower than" + + "1.13.2, the extension MUST be `.schematic`, elsewise the schematic can't be read properly."); } @Override @@ -248,7 +250,10 @@ public class SpongeSchematicReader extends NBTSchematicReader { values.remove("Id"); values.remove("Pos"); if (fixer != null) { - tileEntity = ((CompoundTag) AdventureNBTConverter.fromAdventure(fixer.fixUp(DataFixer.FixTypes.BLOCK_ENTITY, new CompoundTag(values).asBinaryTag(), dataVersion))).getValue(); + //FAWE start + tileEntity = ((CompoundTag) AdventureNBTConverter.fromAdventure(fixer.fixUp(DataFixer.FixTypes.BLOCK_ENTITY, + new CompoundTag(values).asBinaryTag(), dataVersion))).getValue(); + //FAWE end } else { tileEntity = values; } @@ -386,7 +391,9 @@ public class SpongeSchematicReader extends NBTSchematicReader { entityTag = entityTag.createBuilder().putString("id", id).remove("Id").build(); if (fixer != null) { + //FAWE start entityTag = (CompoundTag) AdventureNBTConverter.fromAdventure(fixer.fixUp(DataFixer.FixTypes.ENTITY, entityTag.asBinaryTag(), dataVersion)); + //FAWE end } EntityType entityType = EntityTypes.get(id); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/inventory/BlockBagExtent.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/inventory/BlockBagExtent.java index c56b50b9d..e6b9f1085 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/inventory/BlockBagExtent.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/inventory/BlockBagExtent.java @@ -39,8 +39,10 @@ import javax.annotation.Nullable; */ public class BlockBagExtent extends AbstractDelegateExtent { + //FAWE start private final boolean mine; private int[] missingBlocks = new int[BlockTypes.size()]; + //FAWE end private BlockBag blockBag; /** @@ -49,6 +51,7 @@ public class BlockBagExtent extends AbstractDelegateExtent { * @param extent the extent * @param blockBag the block bag */ + //FAWE start public BlockBagExtent(Extent extent, @Nullable BlockBag blockBag) { this(extent, blockBag, false); } @@ -58,6 +61,7 @@ public class BlockBagExtent extends AbstractDelegateExtent { this.blockBag = blockBag; this.mine = mine; } + //FAWe end /** * Get the block bag. @@ -85,6 +89,7 @@ public class BlockBagExtent extends AbstractDelegateExtent { * @return a map of missing blocks */ public Map popMissing() { + //FAWE start - Use an Array HashMap map = new HashMap<>(); for (int i = 0; i < missingBlocks.length; i++) { int count = missingBlocks[i]; @@ -94,6 +99,7 @@ public class BlockBagExtent extends AbstractDelegateExtent { } Arrays.fill(missingBlocks, 0); return map; + //FAWE end } @Override @@ -111,10 +117,13 @@ public class BlockBagExtent extends AbstractDelegateExtent { } catch (UnplaceableBlockException e) { throw FaweCache.BLOCK_BAG; } catch (BlockBagException e) { + //FAWE start - listen for internal ids missingBlocks[block.getBlockType().getInternalId()]++; throw FaweCache.BLOCK_BAG; + //FAWE end } } + //FAWE start if (mine) { if (!existing.getBlockType().getMaterial().isAir()) { try { @@ -123,6 +132,7 @@ public class BlockBagExtent extends AbstractDelegateExtent { } } } + //FAWE end } return super.setBlock(x, y, z, block); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/inventory/OutOfSpaceException.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/inventory/OutOfSpaceException.java index 5a1b8a33b..70c0c5f29 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/inventory/OutOfSpaceException.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/inventory/OutOfSpaceException.java @@ -26,7 +26,7 @@ import com.sk89q.worldedit.world.block.BlockType; */ public class OutOfSpaceException extends BlockBagException { - private BlockType type; + private final BlockType type; /** * Construct the object. diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/reorder/MultiStageReorder.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/reorder/MultiStageReorder.java index 79dee1503..17c1b8dc6 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/reorder/MultiStageReorder.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/reorder/MultiStageReorder.java @@ -132,15 +132,19 @@ public class MultiStageReorder extends AbstractBufferingExtent implements Reorde BlockCategories.DOORS.getAll().forEach(type -> priorityMap.put(type, PlacementPriority.FINAL)); BlockCategories.BANNERS.getAll().forEach(type -> priorityMap.put(type, PlacementPriority.FINAL)); BlockCategories.SIGNS.getAll().forEach(type -> priorityMap.put(type, PlacementPriority.FINAL)); - priorityMap.put(BlockTypes.SIGN, PlacementPriority.FINAL); - priorityMap.put(BlockTypes.WALL_SIGN, PlacementPriority.FINAL); + @SuppressWarnings("deprecation") + BlockType sign = BlockTypes.SIGN; + priorityMap.put(sign, PlacementPriority.FINAL); + @SuppressWarnings("deprecation") + BlockType wallSign = BlockTypes.WALL_SIGN; + priorityMap.put(wallSign, PlacementPriority.FINAL); priorityMap.put(BlockTypes.CACTUS, PlacementPriority.FINAL); priorityMap.put(BlockTypes.SUGAR_CANE, PlacementPriority.FINAL); priorityMap.put(BlockTypes.PISTON_HEAD, PlacementPriority.FINAL); priorityMap.put(BlockTypes.MOVING_PISTON, PlacementPriority.FINAL); } - private Map> stages = new HashMap<>(); + private final Map> stages = new HashMap<>(); private boolean enabled; @@ -233,6 +237,8 @@ public class MultiStageReorder extends AbstractBufferingExtent implements Reorde case LAST: stages.get(PlacementPriority.CLEAR_LAST).put(location, replacement); break; + default: + break; } if (block.getBlockType().getMaterial().isAir()) { diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/transform/BlockTransformExtent.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/transform/BlockTransformExtent.java index 6b50876fc..2c5c24612 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/transform/BlockTransformExtent.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/transform/BlockTransformExtent.java @@ -20,7 +20,7 @@ package com.sk89q.worldedit.extent.transform; import com.fastasyncworldedit.core.configuration.Settings; -import com.fastasyncworldedit.core.object.extent.ResettableExtent; +import com.fastasyncworldedit.core.extent.ResettableExtent; import com.google.common.collect.ImmutableMap; import com.sk89q.jnbt.ByteTag; import com.sk89q.jnbt.CompoundTag; @@ -36,8 +36,8 @@ import com.sk89q.worldedit.math.transform.Transform; import com.sk89q.worldedit.registry.state.AbstractProperty; import com.sk89q.worldedit.registry.state.DirectionalProperty; import com.sk89q.worldedit.registry.state.Property; -import com.sk89q.worldedit.registry.state.PropertyKey; -import com.sk89q.worldedit.registry.state.PropertyKeySet; +import com.fastasyncworldedit.core.registry.state.PropertyKey; +import com.fastasyncworldedit.core.registry.state.PropertyKeySet; import com.sk89q.worldedit.util.Direction; import com.sk89q.worldedit.world.block.BaseBlock; import com.sk89q.worldedit.world.block.BlockState; @@ -83,6 +83,7 @@ import static com.sk89q.worldedit.util.Direction.values; */ public class BlockTransformExtent extends ResettableExtent { + //FAWE start private static final Logger LOGGER = LogManagerCompat.getLogger(); private static final Set directional = PropertyKeySet.of( @@ -115,6 +116,7 @@ public class BlockTransformExtent extends ResettableExtent { public BlockTransformExtent(Extent parent) { this(parent, new AffineTransform()); } + //FAWE end /** * Create a new instance. @@ -125,11 +127,14 @@ public class BlockTransformExtent extends ResettableExtent { super(extent); checkNotNull(transform); this.transform = transform; + //FAWE start - cache this this.transformInverse = this.transform.inverse(); cache(); + //FAWE end } + //FAWE start private static long combine(Direction... directions) { long mask = 0; for (Direction dir : directions) { @@ -444,6 +449,7 @@ public class BlockTransformExtent extends ResettableExtent { } } } + //FAWE end /** * Get the transform. @@ -497,8 +503,10 @@ public class BlockTransformExtent extends ResettableExtent { public void setTransform(Transform affine) { this.transform = affine; + //FAWE start - cache this this.transformInverse = this.transform.inverse(); cache(); + //FAWE end } /** @@ -511,6 +519,7 @@ public class BlockTransformExtent extends ResettableExtent { * @return the same block */ public static > B transform(@NotNull B block, @NotNull Transform transform) { + //FAWE start - use own logic // performance critical BlockState state = block.toImmutableState(); @@ -520,8 +529,10 @@ public class BlockTransformExtent extends ResettableExtent { return (B) transformBaseBlockNBT(transformed, block.getNbtData(), transform); } return (B) (block instanceof BaseBlock ? transformed.toBaseBlock() : transformed); + //FAWE end } + //FAWE start - use own logic private BlockState transform(BlockState state, int[][] transformArray, Transform transform) { int typeId = state.getInternalBlockTypeId(); int[] arr = transformArray[typeId]; @@ -570,4 +581,5 @@ public class BlockTransformExtent extends ResettableExtent { private BlockState transformInverse(BlockState block) { return transform(block, BLOCK_TRANSFORM_INVERSE, transformInverse); } + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/validation/DataValidatorExtent.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/validation/DataValidatorExtent.java index e50455ea7..74617a66c 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/validation/DataValidatorExtent.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/validation/DataValidatorExtent.java @@ -52,7 +52,7 @@ public class DataValidatorExtent extends AbstractDelegateExtent { public > boolean setBlock(BlockVector3 location, B block) throws WorldEditException { final int y = location.getBlockY(); final BlockType type = block.getBlockType(); - if (y < 0 || y > world.getMaxY()) { + if (y < world.getMinY() || y > world.getMaxY()) { return false; } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/world/BiomeQuirkExtent.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/world/BiomeQuirkExtent.java index b18ab0bb5..1abdccfa7 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/world/BiomeQuirkExtent.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/world/BiomeQuirkExtent.java @@ -3,18 +3,18 @@ * Copyright (C) sk89q * Copyright (C) WorldEdit team and contributors * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as published by the - * Free Software Foundation, either version 3 of the License, or + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License - * for more details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . */ package com.sk89q.worldedit.extent.world; @@ -45,6 +45,6 @@ public class BiomeQuirkExtent extends AbstractDelegateExtent { // Also place at Y = 0 for proper handling success = super.setBiome(position.withY(0), biome); } - return success || super.setBiome(position, biome); + return super.setBiome(position, biome) || success; } } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/world/BlockQuirkExtent.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/world/BlockQuirkExtent.java index 8624f19af..d4a2e1b5c 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/world/BlockQuirkExtent.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/world/BlockQuirkExtent.java @@ -33,7 +33,10 @@ import static com.google.common.base.Preconditions.checkNotNull; /** * Handles various quirks when setting blocks, such as ice turning * into water or containers dropping their contents. + * + * @deprecated Handled by the world entirely now */ +@Deprecated public class BlockQuirkExtent extends AbstractDelegateExtent { private final World world; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/world/ChunkLoadingExtent.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/world/ChunkLoadingExtent.java index 83413bf40..78a29bc61 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/world/ChunkLoadingExtent.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/world/ChunkLoadingExtent.java @@ -35,7 +35,7 @@ import static com.google.common.base.Preconditions.checkNotNull; public class ChunkLoadingExtent extends AbstractDelegateExtent { private final World world; - private boolean enabled; + private final boolean enabled; /** * Create a new instance. diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/world/SurvivalModeExtent.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/world/SurvivalModeExtent.java index 21c287cd7..91ab5bee5 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/world/SurvivalModeExtent.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/world/SurvivalModeExtent.java @@ -96,7 +96,9 @@ public class SurvivalModeExtent extends AbstractDelegateExtent { } else { // Can't be an inlined check due to inconsistent generic return type if (stripNbt) { + //FAWE start - Use CompoundBinaryTag return super.setBlock(location, block.toBaseBlock((CompoundBinaryTag) null)); + //FAWE end } else { return super.setBlock(location, block); } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/CombinedRegionFunction.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/CombinedRegionFunction.java index 40a8796aa..1b6f69a6a 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/CombinedRegionFunction.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/CombinedRegionFunction.java @@ -33,7 +33,9 @@ import static com.google.common.base.Preconditions.checkNotNull; */ public class CombinedRegionFunction implements RegionFunction { + //FAWE start - don't use a List here private RegionFunction[] functions; + //FAWE end /** * Create a combined region function. @@ -60,6 +62,7 @@ public class CombinedRegionFunction implements RegionFunction { this.functions = function; } + //FAWE start public static CombinedRegionFunction combine(RegionFunction function, RegionFunction add) { CombinedRegionFunction combined; if (function instanceof CombinedRegionFunction) { @@ -73,6 +76,7 @@ public class CombinedRegionFunction implements RegionFunction { } return combined; } + //FAWE end /** * Add the given functions to the list of functions to call. @@ -81,9 +85,11 @@ public class CombinedRegionFunction implements RegionFunction { */ public void add(Collection functions) { checkNotNull(functions); + //FAWE start - use our logic ArrayList functionsList = new ArrayList<>(Arrays.asList(this.functions)); functionsList.addAll(functions); this.functions = functionsList.toArray(new RegionFunction[0]); + //FAWE end } /** diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/FlatRegionMaskingFilter.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/FlatRegionMaskingFilter.java index c1e2299d6..d98bf233b 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/FlatRegionMaskingFilter.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/FlatRegionMaskingFilter.java @@ -33,7 +33,7 @@ import static com.google.common.base.Preconditions.checkNotNull; public class FlatRegionMaskingFilter implements FlatRegionFunction { private final FlatRegionFunction function; - private Mask2D mask; + private final Mask2D mask; /** * Create a new masking filter. diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/RegionFunction.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/RegionFunction.java index 18ee659a8..62833b96f 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/RegionFunction.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/RegionFunction.java @@ -19,15 +19,17 @@ package com.sk89q.worldedit.function; -import com.fastasyncworldedit.core.beta.Filter; -import com.fastasyncworldedit.core.beta.implementation.filter.block.FilterBlock; +import com.fastasyncworldedit.core.queue.Filter; +import com.fastasyncworldedit.core.extent.filter.block.FilterBlock; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.math.BlockVector3; /** * Performs a function on points in a region. */ +//FAWE start - extends Filter public interface RegionFunction extends Filter { +//FAWE end /** * Apply the function to the given position. @@ -39,8 +41,10 @@ public interface RegionFunction extends Filter { boolean apply(BlockVector3 position) throws WorldEditException; + //FAWE start @Override default void applyBlock(FilterBlock block) { apply(block); } + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/RegionMaskingFilter.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/RegionMaskingFilter.java index 8246115f6..b4046ee9d 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/RegionMaskingFilter.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/RegionMaskingFilter.java @@ -34,8 +34,10 @@ import static com.google.common.base.Preconditions.checkNotNull; public class RegionMaskingFilter implements RegionFunction { private final RegionFunction function; - private final Extent extent; private final Mask mask; + //FAWE start + private final Extent extent; + //FAWE end /** * Create a new masking filter. @@ -43,11 +45,14 @@ public class RegionMaskingFilter implements RegionFunction { * @param mask the mask * @param function the function */ + //FAWE start - Extent public RegionMaskingFilter(Extent extent, Mask mask, RegionFunction function) { checkNotNull(function); checkNotNull(mask); + //FAWE start checkNotNull(extent); this.extent = extent; + //FAWE end this.mask = mask; this.function = function; } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/block/BlockDistributionCounter.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/block/BlockDistributionCounter.java index 9f474c934..fd080fd51 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/block/BlockDistributionCounter.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/block/BlockDistributionCounter.java @@ -34,11 +34,11 @@ import java.util.Map; public class BlockDistributionCounter implements RegionFunction { - private Extent extent; - private boolean separateStates; + private final Extent extent; + private final boolean separateStates; - private List> distribution = new ArrayList<>(); - private Map> map = new HashMap<>(); + private final List> distribution = new ArrayList<>(); + private final Map> map = new HashMap<>(); public BlockDistributionCounter(Extent extent, boolean separateStates) { this.extent = extent; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/block/BlockReplace.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/block/BlockReplace.java index a08d6fa2c..55432053e 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/block/BlockReplace.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/block/BlockReplace.java @@ -33,7 +33,7 @@ import static com.google.common.base.Preconditions.checkNotNull; public class BlockReplace implements RegionFunction { private final Extent extent; - private Pattern pattern; + private final Pattern pattern; /** * Create a new instance. diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/block/ExtentBlockCopy.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/block/ExtentBlockCopy.java index cfa244544..1b3efa404 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/block/ExtentBlockCopy.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/block/ExtentBlockCopy.java @@ -88,6 +88,7 @@ public class ExtentBlockCopy implements RegionFunction { * @return a new state or the existing one */ private BaseBlock transformNbtData(BaseBlock state) { + //FAWE start - Replace CompoundTag with CompoundBinaryTag CompoundBinaryTag tag = state.getNbt(); if (tag != null) { @@ -105,6 +106,7 @@ public class ExtentBlockCopy implements RegionFunction { if (newDirection != null) { return state.toBaseBlock( tag.putByte("Rot", (byte) MCDirections.toRotation(newDirection)) + //FAWE end ); } } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/block/Naturalizer.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/block/Naturalizer.java index 1c2d73884..dbab12632 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/block/Naturalizer.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/block/Naturalizer.java @@ -81,6 +81,7 @@ public class Naturalizer implements LayerFunction { private boolean naturalize(BlockVector3 position, int depth) throws WorldEditException { return editSession.setBlock(position, getTargetBlock(depth)); + //FAWE start /* BlockState block = editSession.getBlock(position); BlockState targetBlock = getTargetBlock(depth); @@ -91,6 +92,7 @@ public class Naturalizer implements LayerFunction { return editSession.setBlock(position, targetBlock); */ + //FAWE end } @Override diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/block/SnowSimulator.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/block/SnowSimulator.java index 5fa40ca69..37ac7d2d8 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/block/SnowSimulator.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/block/SnowSimulator.java @@ -34,11 +34,13 @@ import java.util.Map; public class SnowSimulator implements LayerFunction { + //FAWE start public static final BooleanProperty snowy = (BooleanProperty) (Property) BlockTypes.GRASS_BLOCK.getProperty("snowy"); private static final EnumProperty slab = (EnumProperty) (Property) BlockTypes.SANDSTONE_SLAB.getProperty("type"); private static final EnumProperty stair = (EnumProperty) (Property) BlockTypes.SANDSTONE_STAIRS.getProperty("half"); private static final EnumProperty trapdoor = (EnumProperty) (Property) BlockTypes.ACACIA_TRAPDOOR.getProperty("half"); private static final BooleanProperty trapdoorOpen = (BooleanProperty) (Property) BlockTypes.ACACIA_TRAPDOOR.getProperty("open"); + //FAWE end private final BlockState ice = BlockTypes.ICE.getDefaultState(); private final BlockState snow = BlockTypes.SNOW.getDefaultState(); @@ -112,7 +114,8 @@ public class SnowSimulator implements LayerFunction { // Can only replace air (or snow in stack mode) if (!above.getBlockType().getMaterial().isAir() && (!stack || above.getBlockType() != BlockTypes.SNOW)) { return false; - } else if (!block.getBlockType().getId().toLowerCase(Locale.ROOT).contains("ice") && this.extent.getEmmittedLight(abovePosition) > 10) { + //FAWE start + } else if (!block.getBlockType().getId().toLowerCase(Locale.ROOT).contains("ice") && this.extent.getEmittedLight(abovePosition) > 10) { return false; } else if (!block.getBlockType().getMaterial().isFullCube()) { Map, Object> states = block.getStates(); @@ -126,6 +129,7 @@ public class SnowSimulator implements LayerFunction { } else { return false; } + //FAWE end } else if (!block.getBlockType().getId().toLowerCase(Locale.ROOT).contains("ice") && block.getBlockType().getMaterial().isTranslucent()) { return false; } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/entity/ExtentEntityCopy.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/entity/ExtentEntityCopy.java index 544e87ac2..b9bdc9445 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/entity/ExtentEntityCopy.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/entity/ExtentEntityCopy.java @@ -56,6 +56,7 @@ public class ExtentEntityCopy implements EntityFunction { private final Transform transform; private boolean removing; + //FAWE start /** * Create a new instance. * @@ -63,6 +64,7 @@ public class ExtentEntityCopy implements EntityFunction { * @param destination the destination {@code Extent} * @param to the destination position * @param transform the transformation to apply to both position and orientation + * @deprecated FAWE Deprecation - Use method with Extent */ @Deprecated public ExtentEntityCopy(Vector3 from, Extent destination, Vector3 to, Transform transform) { @@ -76,6 +78,7 @@ public class ExtentEntityCopy implements EntityFunction { this.to = to; this.transform = transform; } + //FAWE end /** * Create a new instance. @@ -120,7 +123,9 @@ public class ExtentEntityCopy implements EntityFunction { @Override public boolean apply(Entity entity) throws WorldEditException { BaseEntity state = entity.getState(); + //FAWE start - Don't copy players if (state != null && state.getType() != EntityTypes.PLAYER) { + //FAWE end Location newLocation; Location location = entity.getLocation(); // If the entity has stored the location in the NBT data, we use that location @@ -149,6 +154,7 @@ public class ExtentEntityCopy implements EntityFunction { // Remove if (isRemoving() && success) { + //FAWE start UUID uuid = null; if (tag.containsKey("UUID")) { int[] arr = tag.getIntArray("UUID"); @@ -162,6 +168,7 @@ public class ExtentEntityCopy implements EntityFunction { if (source != null) { source.removeEntity(entity.getLocation().getBlockX(), entity.getLocation().getBlockY(), entity.getLocation().getBlockZ(), uuid); } else { + //FAWE end entity.remove(); } } @@ -204,7 +211,9 @@ public class ExtentEntityCopy implements EntityFunction { // Handle hanging entities (paintings, item frames, etc.) boolean hasTilePosition = tag.containsKey("TileX") && tag.containsKey("TileY") && tag.containsKey("TileZ"); boolean hasFacing = tag.containsKey("Facing"); + //FAWE Start boolean hasRotation = tag.containsKey("Rotation"); + //FAWE end if (hasTilePosition) { Vector3 tilePosition = Vector3.at(tag.asInt("TileX"), tag.asInt("TileY"), tag.asInt("TileZ")); @@ -229,6 +238,7 @@ public class ExtentEntityCopy implements EntityFunction { } } + //FAWE start if (hasRotation) { ListTag orgrot = state.getNbtData().getListTag("Rotation"); Vector3 orgDirection = new Location(source, 0, 0, 0, orgrot.getFloat(0), orgrot.getFloat(1)).getDirection(); @@ -246,6 +256,7 @@ public class ExtentEntityCopy implements EntityFunction { builder.put("Rotation", new ListTag(FloatTag.class, Arrays.asList(new FloatTag((float) newDirection.toYaw()), new FloatTag((float) newDirection.toPitch())))); return new BaseEntity(state.getType(), builder.build()); + //FAWE end } } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/factory/Apply.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/factory/Apply.java index 2ac903741..baee7794a 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/factory/Apply.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/factory/Apply.java @@ -30,6 +30,13 @@ import com.sk89q.worldedit.regions.Region; import static com.google.common.base.Preconditions.checkNotNull; import static com.sk89q.worldedit.util.GuavaUtil.firstNonNull; +/** + * Creates an operation from a region context. + * + * @deprecated Use {@link ApplyRegion} or {@link ApplyLayer} + * depending on function type. + */ +@Deprecated public class Apply implements Contextual { private final Region region; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/factory/Deform.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/factory/Deform.java index f9d6181c8..95367bc26 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/factory/Deform.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/factory/Deform.java @@ -45,7 +45,9 @@ public class Deform implements Contextual { private Extent destination; private Region region; + //FAWE Start - String private String expression; + //FAWE end private Mode mode; private Vector3 offset = Vector3.ZERO; @@ -119,7 +121,9 @@ public class Deform implements Contextual { @Override public String toString() { + //FAWE start - We string-ify elsewhere return "deformation of " + expression; + //FAWE end } @Override diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/generator/FloraGenerator.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/generator/FloraGenerator.java index 97e7ae5f8..d199fcb61 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/generator/FloraGenerator.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/generator/FloraGenerator.java @@ -37,7 +37,7 @@ import com.sk89q.worldedit.world.block.BlockTypes; public class FloraGenerator implements RegionFunction { private final EditSession editSession; - private boolean biomeAware = false; + private final boolean biomeAware = false; private final Pattern desertPattern = getDesertPattern(); private final Pattern temperatePattern = getTemperatePattern(); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/generator/GardenPatchGenerator.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/generator/GardenPatchGenerator.java index 35de53d18..a9c07030f 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/generator/GardenPatchGenerator.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/generator/GardenPatchGenerator.java @@ -38,7 +38,7 @@ public class GardenPatchGenerator implements RegionFunction { private final Random random = new Random(); private final EditSession editSession; private Pattern plant = getPumpkinPattern(); - private Pattern leafPattern = BlockTypes.OAK_LEAVES.getDefaultState().with(BlockTypes.OAK_LEAVES.getProperty("persistent"), true); + private final Pattern leafPattern = BlockTypes.OAK_LEAVES.getDefaultState().with(BlockTypes.OAK_LEAVES.getProperty("persistent"), true); private int affected; /** @@ -157,6 +157,8 @@ public class GardenPatchGenerator implements RegionFunction { setBlockIfAir(editSession, p = pos.add(-1, 0, -1), plant.applyBlock(p)); affected++; break; + default: + break; } } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/AbstractMask.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/AbstractMask.java index d22257c16..adb9f38bd 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/AbstractMask.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/AbstractMask.java @@ -22,4 +22,5 @@ package com.sk89q.worldedit.function.mask; /** * A base class of {@link Mask} that all masks should inherit from. */ -public abstract class AbstractMask implements Mask {} +public abstract class AbstractMask implements Mask { +} diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/BiomeMask.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/BiomeMask.java index 202efefec..762dd104d 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/BiomeMask.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/BiomeMask.java @@ -34,7 +34,9 @@ import static com.google.common.base.Preconditions.checkNotNull; /** * Tests true if the biome at applied points is the same as the one given. */ +//FAWE start - AbstractExtentMask public class BiomeMask extends AbstractExtentMask { +//FAWE end private final Set biomes = new HashSet<>(); @@ -45,7 +47,9 @@ public class BiomeMask extends AbstractExtentMask { * @param biomes a list of biomes to match */ public BiomeMask(Extent extent, Collection biomes) { + //FAWE start super(extent); + //FAWE end checkNotNull(biomes); this.biomes.addAll(biomes); } @@ -100,10 +104,12 @@ public class BiomeMask extends AbstractExtentMask { return null; } + //FAWE start @Override public Mask copy() { return new BiomeMask(getExtent(), new HashSet<>(biomes)); } + //FAWE end @Override public boolean test(Extent extent, BlockVector3 position) { diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/BlockCategoryMask.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/BlockCategoryMask.java index a38a77e04..bad9781ea 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/BlockCategoryMask.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/BlockCategoryMask.java @@ -39,7 +39,9 @@ public class BlockCategoryMask extends AbstractExtentMask { super(extent); checkNotNull(category); this.category = category; + //FAWE start this.category.getAll(); // load category so BlockCategory#contains actually works + //FAWE end } @Override @@ -47,10 +49,12 @@ public class BlockCategoryMask extends AbstractExtentMask { return category.contains(getExtent().getBlock(vector)); } + //FAWE start @Override public boolean test(Extent extent, BlockVector3 vector) { return category.contains(extent.getBlock(vector)); } + //FAWE end @Nullable @Override @@ -58,6 +62,7 @@ public class BlockCategoryMask extends AbstractExtentMask { return null; } + //FAWE start @Override public Mask copy() { return new BlockCategoryMask(getExtent(), category); @@ -67,4 +72,5 @@ public class BlockCategoryMask extends AbstractExtentMask { public boolean replacesAir() { return category.contains(BlockTypes.AIR); } + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/BlockMask.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/BlockMask.java index 26e6e8da0..2b54b7d85 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/BlockMask.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/BlockMask.java @@ -19,6 +19,9 @@ package com.sk89q.worldedit.function.mask; +import com.fastasyncworldedit.core.function.mask.ABlockMask; +import com.fastasyncworldedit.core.function.mask.SingleBlockStateMask; +import com.fastasyncworldedit.core.function.mask.SingleBlockTypeMask; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.extent.NullExtent; import com.sk89q.worldedit.math.BlockVector3; @@ -27,7 +30,7 @@ import com.sk89q.worldedit.world.block.BlockState; import com.sk89q.worldedit.world.block.BlockType; import com.sk89q.worldedit.world.block.BlockTypes; import com.sk89q.worldedit.world.block.BlockTypesCache; -import com.sk89q.worldedit.world.block.BlanketBaseBlock; +import com.fastasyncworldedit.core.world.block.BlanketBaseBlock; import javax.annotation.Nullable; import java.util.Arrays; @@ -45,8 +48,11 @@ import static com.google.common.base.Preconditions.checkNotNull; *

This mask checks for both an exact block type and state value match, * respecting fuzzy status of the BlockState.

*/ +//FAWE start - ABlockMask > AbstractExtentMask public class BlockMask extends ABlockMask { +//FAWE end + //FAWE start private final boolean[] ordinals; public BlockMask() { @@ -61,6 +67,7 @@ public class BlockMask extends ABlockMask { super(extent == null ? new NullExtent() : extent); this.ordinals = ordinals; } + //FAWE end /** * Create a new block mask. @@ -86,6 +93,7 @@ public class BlockMask extends ABlockMask { this(extent, Arrays.asList(checkNotNull(block))); } + //FAWE start public BlockMask add(Predicate predicate) { for (int i = 0; i < ordinals.length; i++) { if (!ordinals[i]) { @@ -144,6 +152,7 @@ public class BlockMask extends ABlockMask { } return this; } + //FAWE end /** * Add the given blocks to the list of criteria. @@ -154,6 +163,7 @@ public class BlockMask extends ABlockMask { @Deprecated public void add(Collection blocks) { checkNotNull(blocks); + //FAWE start - get ordinals for (BaseBlock block : blocks) { if (block instanceof BlanketBaseBlock) { for (BlockState state : block.getBlockType().getAllStates()) { @@ -163,6 +173,7 @@ public class BlockMask extends ABlockMask { add(block.toBlockState()); } } + //FAWE end } /** @@ -180,9 +191,12 @@ public class BlockMask extends ABlockMask { * @return a list of blocks */ public Collection getBlocks() { + //FAWE start return Collections.emptyList(); //TODO Not supported in FAWE yet + //FAWE end } + //FAWE start @Override public boolean test(BlockState state) { return ordinals[state.getOrdinal()] || replacesAir() && state.getOrdinal() == 0; @@ -332,4 +346,5 @@ public class BlockMask extends ABlockMask { public Mask copy() { return new BlockMask(getExtent(), ordinals.clone()); } + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/BlockStateMask.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/BlockStateMask.java index dd0b774fc..52950e022 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/BlockStateMask.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/BlockStateMask.java @@ -53,6 +53,7 @@ public class BlockStateMask extends AbstractExtentMask { this.strict = strict; } + //FAWE start @Override public boolean test(BlockVector3 vector) { return test(getExtent().getBlock(vector)); @@ -90,4 +91,5 @@ public class BlockStateMask extends AbstractExtentMask { states.forEach(statesClone::put); return new BlockStateMask(getExtent(), statesClone, strict); } + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/BlockTypeMask.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/BlockTypeMask.java index f11e54efa..17b6e29c6 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/BlockTypeMask.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/BlockTypeMask.java @@ -38,9 +38,7 @@ import static com.google.common.base.Preconditions.checkNotNull; * *

This mask checks for ONLY the block type. If state should also be checked, * use {@link BlockMask}.

- * @deprecated use BlockMaskBuilder */ -@Deprecated public class BlockTypeMask extends AbstractExtentMask { private final boolean[] types; @@ -70,11 +68,13 @@ public class BlockTypeMask extends AbstractExtentMask { } } + //FAWE start private BlockTypeMask(Extent extent, boolean[] types, boolean hasAir) { super(extent); this.types = types; this.hasAir = hasAir; } + //FAWE end /** * Add the given blocks to the list of criteria. @@ -83,9 +83,11 @@ public class BlockTypeMask extends AbstractExtentMask { */ public void add(@NotNull Collection blocks) { checkNotNull(blocks); + //FAWE start for (BlockType type : blocks) { add(type); } + //FAWE end } /** @@ -94,12 +96,14 @@ public class BlockTypeMask extends AbstractExtentMask { * @param block an array of blocks */ public void add(@NotNull BlockType... block) { + //FAWE start - get internal id for (BlockType type : block) { if (!hasAir && (type == BlockTypes.AIR || type == BlockTypes.CAVE_AIR || type == BlockTypes.VOID_AIR)) { hasAir = true; } this.types[type.getInternalId()] = true; } + //FAWE end } /** @@ -117,6 +121,7 @@ public class BlockTypeMask extends AbstractExtentMask { return blocks; } + //FAWE start @Override public boolean test(BlockVector3 vector) { return test(getExtent().getBlock(vector).getBlockType()); @@ -135,6 +140,7 @@ public class BlockTypeMask extends AbstractExtentMask { public boolean test(BlockType block) { return types[block.getInternalId()]; } + //FAWE end @Nullable @Override diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/BoundedHeightMask.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/BoundedHeightMask.java index ccbf44fc7..301f2104c 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/BoundedHeightMask.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/BoundedHeightMask.java @@ -57,10 +57,12 @@ public class BoundedHeightMask extends AbstractMask { return null; } + //FAWE start @Override public Mask copy() { // The mask is not mutable. There is no need to clone it. return this; } + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/ExistingBlockMask.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/ExistingBlockMask.java index b37527e53..b75a4cd1e 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/ExistingBlockMask.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/ExistingBlockMask.java @@ -55,10 +55,12 @@ public class ExistingBlockMask extends AbstractExtentMask { return null; } + //FAWE start @Override public Mask copy() { // The mask is not mutable. There is no need to clone it. return this; } + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/ExpressionMask.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/ExpressionMask.java index 0df7ca6c9..5f46676ee 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/ExpressionMask.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/ExpressionMask.java @@ -89,9 +89,11 @@ public class ExpressionMask extends AbstractMask { return new ExpressionMask2D(expression, timeout); } + //FAWE start @Override public Mask copy() { return new ExpressionMask(expression.clone(), timeout); } + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/ExpressionMask2D.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/ExpressionMask2D.java index 98a5aa2d3..bc31f84f6 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/ExpressionMask2D.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/ExpressionMask2D.java @@ -72,9 +72,11 @@ public class ExpressionMask2D extends AbstractMask2D { } } + //FAWE start @Override public Mask2D copy2D() { return new ExpressionMask2D(expression.clone(), timeout); } + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/InverseSingleBlockStateMask.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/InverseSingleBlockStateMask.java index e94f1dd11..249d94d31 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/InverseSingleBlockStateMask.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/InverseSingleBlockStateMask.java @@ -1,5 +1,7 @@ package com.sk89q.worldedit.function.mask; +import com.fastasyncworldedit.core.function.mask.ABlockMask; +import com.fastasyncworldedit.core.function.mask.SingleBlockStateMask; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.world.block.BlockState; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/InverseSingleBlockTypeMask.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/InverseSingleBlockTypeMask.java index a8dcd3c18..9a3ab9a88 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/InverseSingleBlockTypeMask.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/InverseSingleBlockTypeMask.java @@ -1,5 +1,7 @@ package com.sk89q.worldedit.function.mask; +import com.fastasyncworldedit.core.function.mask.ABlockMask; +import com.fastasyncworldedit.core.function.mask.SingleBlockTypeMask; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.world.block.BlockState; import com.sk89q.worldedit.world.block.BlockType; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/Mask.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/Mask.java index ebbcefbca..42a2a8b75 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/Mask.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/Mask.java @@ -19,9 +19,10 @@ package com.sk89q.worldedit.function.mask; -import com.fastasyncworldedit.core.beta.Filter; -import com.fastasyncworldedit.core.beta.implementation.filter.MaskFilter; -import com.fastasyncworldedit.core.beta.implementation.filter.block.FilterBlock; +import com.fastasyncworldedit.core.queue.Filter; +import com.fastasyncworldedit.core.extent.filter.MaskFilter; +import com.fastasyncworldedit.core.extent.filter.block.FilterBlock; +import com.fastasyncworldedit.core.function.mask.InverseMask; import com.sk89q.worldedit.math.BlockVector3; import org.jetbrains.annotations.Nullable; @@ -40,10 +41,6 @@ public interface Mask { */ boolean test(BlockVector3 vector); - default MaskFilter toFilter(T filter) { - return new MaskFilter<>(filter, this); - } - /** * Get the 2D version of this mask if one exists. * @@ -54,6 +51,7 @@ public interface Mask { return null; } + //FAWE start /** * Returns null if no optimization took place * otherwise a new/same mask @@ -64,6 +62,10 @@ public interface Mask { return null; } + default MaskFilter toFilter(T filter) { + return new MaskFilter<>(filter, this); + } + default Mask tryCombine(Mask other) { return null; } @@ -106,4 +108,5 @@ public interface Mask { * @return a clone of the mask */ Mask copy(); + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/Mask2D.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/Mask2D.java index 4a493557d..0915546c0 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/Mask2D.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/Mask2D.java @@ -34,6 +34,8 @@ public interface Mask2D { */ boolean test(BlockVector2 vector); + //FAWE start Mask2D copy2D(); + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/MaskIntersection.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/MaskIntersection.java index 1c78d7e30..9c4a8625a 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/MaskIntersection.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/MaskIntersection.java @@ -50,8 +50,10 @@ public class MaskIntersection extends AbstractMask { private static final Logger LOGGER = LogManagerCompat.getLogger(); protected final Set masks; + //FAWE start protected Mask[] masksArray; protected boolean defaultReturn; + //FAWE end /** * Create a new intersection. @@ -61,9 +63,12 @@ public class MaskIntersection extends AbstractMask { public MaskIntersection(Collection masks) { checkNotNull(masks); this.masks = new LinkedHashSet<>(masks); + //FAWE start formArray(); + //FAWE end } + //FAWE start public static Mask of(Mask... masks) { Set set = new LinkedHashSet<>(); for (Mask mask : masks) { @@ -87,6 +92,7 @@ public class MaskIntersection extends AbstractMask { return new MaskIntersection(set).optimize(); } } + //FAWE end /** * Create a new intersection. @@ -97,6 +103,7 @@ public class MaskIntersection extends AbstractMask { this(Arrays.asList(checkNotNull(mask))); } + //FAWE start private void formArray() { if (masks.isEmpty()) { masksArray = new Mask[]{Masks.alwaysFalse()}; @@ -212,6 +219,7 @@ public class MaskIntersection extends AbstractMask { } return hasOptimized; } + //FAWE end /** * Add some masks to the list. @@ -221,7 +229,9 @@ public class MaskIntersection extends AbstractMask { public void add(Collection masks) { checkNotNull(masks); this.masks.addAll(masks); + //FAWE start formArray(); + //FAWE end } /** @@ -242,6 +252,7 @@ public class MaskIntersection extends AbstractMask { return masks; } + //FAWE start public final Mask[] getMasksArray() { return masksArray; } @@ -256,6 +267,7 @@ public class MaskIntersection extends AbstractMask { return defaultReturn; } + //FAWE end @Nullable @Override @@ -272,6 +284,7 @@ public class MaskIntersection extends AbstractMask { return new MaskIntersection2D(mask2dList); } + //FAWE start @Override public Mask copy(){ Set masks = this.masks.stream().map(Mask::copy).collect(Collectors.toSet()); @@ -287,5 +300,6 @@ public class MaskIntersection extends AbstractMask { } return false; } + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/MaskIntersection2D.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/MaskIntersection2D.java index 64dc3e26f..46d7c6d06 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/MaskIntersection2D.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/MaskIntersection2D.java @@ -98,10 +98,12 @@ public class MaskIntersection2D implements Mask2D { return true; } + //FAWE start @Override public Mask2D copy2D() { Set masksCopy = this.masks.stream().map(Mask2D::copy2D).collect(Collectors.toSet()); return new MaskIntersection2D(masksCopy); } + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/Masks.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/Masks.java index 9a0923983..7c135acdf 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/Masks.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/Masks.java @@ -37,10 +37,6 @@ public final class Masks { private Masks() { } - public static boolean isNull(Mask mask) { - return mask == null || mask == ALWAYS_TRUE; - } - /** * Return a 3D mask that always returns true. * @@ -50,9 +46,11 @@ public final class Masks { return ALWAYS_TRUE; } + //FAWE start public static Mask alwaysFalse() { return ALWAYS_FALSE; } + //FAWE end /** * Return a 2D mask that always returns true. @@ -126,7 +124,9 @@ public final class Masks { }; } + //FAWE start - protected > private protected static class AlwaysTrue implements Mask, Mask2D { + //FAWE end @Override public boolean test(BlockVector3 vector) { return true; @@ -143,6 +143,7 @@ public final class Masks { return this; } + //FAWE start @Override public Mask tryCombine(Mask other) { return other; @@ -164,10 +165,13 @@ public final class Masks { public Mask2D copy2D() { return new AlwaysTrue(); } + //FAWE end } + //FAWE start - protected > private protected static class AlwaysFalse implements Mask, Mask2D { + //FAWE end @Override public boolean test(BlockVector3 vector) { return false; @@ -184,6 +188,7 @@ public final class Masks { return this; } + //FAWE start @Override public Mask tryCombine(Mask other) { return this; @@ -205,6 +210,7 @@ public final class Masks { public Mask2D copy2D() { return new AlwaysFalse(); } + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/NoiseFilter.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/NoiseFilter.java index 39c29107d..88efb649a 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/NoiseFilter.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/NoiseFilter.java @@ -20,7 +20,7 @@ package com.sk89q.worldedit.function.mask; import com.sk89q.worldedit.math.BlockVector3; -import com.sk89q.worldedit.math.MutableVector3; +import com.fastasyncworldedit.core.math.MutableVector3; import com.sk89q.worldedit.math.noise.NoiseGenerator; import javax.annotation.Nullable; @@ -96,9 +96,11 @@ public class NoiseFilter extends AbstractMask { return new NoiseFilter2D(getNoiseGenerator(), getDensity()); } + //FAWE start @Override public Mask copy() { return new NoiseFilter(noiseGenerator, density); } + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/NoiseFilter2D.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/NoiseFilter2D.java index f192e1eb0..1d792e540 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/NoiseFilter2D.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/NoiseFilter2D.java @@ -87,9 +87,11 @@ public class NoiseFilter2D extends AbstractMask2D { return noiseGenerator.noise(pos.toVector2()) <= density; } + //FAWE start @Override public Mask2D copy2D() { return new NoiseFilter2D(noiseGenerator, density); } + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/OffsetMask.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/OffsetMask.java index 99865fc2f..2bc9b13a9 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/OffsetMask.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/OffsetMask.java @@ -105,9 +105,11 @@ public class OffsetMask extends AbstractMask { } } + //FAWE start @Override public Mask copy() { return new OffsetMask(mask.copy(), offset.toImmutable()); } + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/OffsetMask2D.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/OffsetMask2D.java index e3d5786cd..afafc66c4 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/OffsetMask2D.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/OffsetMask2D.java @@ -20,7 +20,7 @@ package com.sk89q.worldedit.function.mask; import com.sk89q.worldedit.math.BlockVector2; -import com.sk89q.worldedit.math.MutableBlockVector2; +import com.fastasyncworldedit.core.math.MutableBlockVector2; import static com.google.common.base.Preconditions.checkNotNull; @@ -32,7 +32,7 @@ public class OffsetMask2D extends AbstractMask2D { private Mask2D mask; private BlockVector2 offset; - private MutableBlockVector2 mutable; + private final MutableBlockVector2 mutableBlockVector2; /** * Create a new instance. @@ -45,7 +45,7 @@ public class OffsetMask2D extends AbstractMask2D { checkNotNull(offset); this.mask = mask; this.offset = offset; - this.mutable = new MutableBlockVector2(); + this.mutableBlockVector2 = new MutableBlockVector2(); } /** @@ -86,15 +86,17 @@ public class OffsetMask2D extends AbstractMask2D { this.offset = offset; } + //FAWE start @Override public boolean test(BlockVector2 vector) { - mutable.setComponents(vector.getX() + offset.getX(), vector.getZ() + offset.getZ()); - return getMask().test(mutable); + mutableBlockVector2.setComponents(vector.getX() + offset.getX(), vector.getZ() + offset.getZ()); + return getMask().test(mutableBlockVector2); } @Override public Mask2D copy2D() { return new OffsetMask2D(mask.copy2D(), BlockVector2.at(offset.getX(), offset.getZ())); } + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/RegionMask.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/RegionMask.java index ab7641a1d..05a6d1c59 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/RegionMask.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/RegionMask.java @@ -72,6 +72,7 @@ public class RegionMask extends AbstractMask { return null; } + //FAWE start @Override public Mask copy() { return new RegionMask(region.clone()); @@ -84,5 +85,6 @@ public class RegionMask extends AbstractMask { } return this; } + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/SolidBlockMask.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/SolidBlockMask.java index 441d95e18..d327ff97a 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/SolidBlockMask.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/SolidBlockMask.java @@ -35,9 +35,11 @@ public class SolidBlockMask extends BlockMask { return null; } + //FAWE start @Override public Mask copy() { return new SolidBlockMask(getExtent()); } + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/operation/BackwardsExtentBlockCopy.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/operation/BackwardsExtentBlockCopy.java index 7d6ba5697..ba3e7a809 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/operation/BackwardsExtentBlockCopy.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/operation/BackwardsExtentBlockCopy.java @@ -2,10 +2,12 @@ package com.sk89q.worldedit.function.operation; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.function.RegionFunction; +import com.sk89q.worldedit.function.operation.Operation; +import com.sk89q.worldedit.function.operation.RunContext; import com.sk89q.worldedit.function.visitor.RegionVisitor; import com.sk89q.worldedit.math.BlockVector3; -import com.sk89q.worldedit.math.MutableBlockVector3; -import com.sk89q.worldedit.math.MutableVector3; +import com.fastasyncworldedit.core.math.MutableBlockVector3; +import com.fastasyncworldedit.core.math.MutableVector3; import com.sk89q.worldedit.math.Vector3; import com.sk89q.worldedit.math.transform.Transform; import com.sk89q.worldedit.regions.CuboidRegion; @@ -20,8 +22,8 @@ public class BackwardsExtentBlockCopy extends RegionVisitor implements Operation private final BlockVector3 origin; private int affected = 0; - private MutableBlockVector3 mutBV3 = new MutableBlockVector3(); - private MutableVector3 mutV3 = new MutableVector3(); + private final MutableBlockVector3 mutBV3 = new MutableBlockVector3(); + private final MutableVector3 mutV3 = new MutableVector3(); BackwardsExtentBlockCopy(Region region, BlockVector3 origin, Transform transform, RegionFunction function) { super(region, function); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/operation/ChangeSetExecutor.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/operation/ChangeSetExecutor.java index 2436fcfbd..5011bf230 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/operation/ChangeSetExecutor.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/operation/ChangeSetExecutor.java @@ -19,7 +19,7 @@ package com.sk89q.worldedit.function.operation; -import com.fastasyncworldedit.core.object.changeset.AbstractChangeSet; +import com.fastasyncworldedit.core.history.changeset.AbstractChangeSet; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extent.inventory.BlockBag; import com.sk89q.worldedit.history.UndoContext; @@ -35,6 +35,7 @@ import static com.google.common.base.Preconditions.checkNotNull; */ public class ChangeSetExecutor implements Operation { + //FAWE start - Override public enum Type { UNDO { @Override @@ -52,6 +53,7 @@ public class ChangeSetExecutor implements Operation { public void perform(Change change, UndoContext context) { } } + //FAWE end private final Iterator iterator; private final Type type; @@ -64,6 +66,7 @@ public class ChangeSetExecutor implements Operation { * @param type type of change * @param context the undo context */ + //FAWE start - BlockBag & inventory private ChangeSetExecutor(ChangeSet changeSet, Type type, UndoContext context, BlockBag blockBag, int inventory) { checkNotNull(changeSet); checkNotNull(type); @@ -79,12 +82,15 @@ public class ChangeSetExecutor implements Operation { iterator = changeSet.forwardIterator(); } } + //FAWE end @Override public Operation resume(RunContext run) throws WorldEditException { while (iterator.hasNext()) { Change change = iterator.next(); + //FAWE start - types > individual history step type.perform(change, context); + //FAWE end } return null; } @@ -93,9 +99,11 @@ public class ChangeSetExecutor implements Operation { public void cancel() { } + //FAWE start public static ChangeSetExecutor create(ChangeSet changeSet, UndoContext context, Type type, BlockBag blockBag, int inventory) { return new ChangeSetExecutor(changeSet, type, context, blockBag, inventory); } + //FAWE end /** * Create a new undo operation. diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/operation/DelegateOperation.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/operation/DelegateOperation.java index 160dcd60c..2446c9d6d 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/operation/DelegateOperation.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/operation/DelegateOperation.java @@ -26,7 +26,7 @@ import com.sk89q.worldedit.util.formatting.text.Component; import static com.google.common.base.Preconditions.checkNotNull; /** - * Executes a delegete operation, but returns to another operation upon + * Executes a delegate operation, but returns to another operation upon * completing the delegate. */ public class DelegateOperation implements Operation { diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/operation/ForwardExtentCopy.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/operation/ForwardExtentCopy.java index 83b259e1c..1164a53ed 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/operation/ForwardExtentCopy.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/operation/ForwardExtentCopy.java @@ -20,11 +20,11 @@ package com.sk89q.worldedit.function.operation; import com.fastasyncworldedit.core.configuration.Caption; -import com.fastasyncworldedit.core.object.extent.BlockTranslateExtent; -import com.fastasyncworldedit.core.object.extent.PositionTransformExtent; -import com.fastasyncworldedit.core.object.function.block.BiomeCopy; -import com.fastasyncworldedit.core.object.function.block.CombinedBlockCopy; -import com.fastasyncworldedit.core.object.function.block.SimpleBlockCopy; +import com.fastasyncworldedit.core.extent.BlockTranslateExtent; +import com.fastasyncworldedit.core.extent.PositionTransformExtent; +import com.fastasyncworldedit.core.function.block.BiomeCopy; +import com.fastasyncworldedit.core.function.block.CombinedBlockCopy; +import com.fastasyncworldedit.core.function.block.SimpleBlockCopy; import com.fastasyncworldedit.core.util.MaskTraverser; import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; @@ -34,13 +34,13 @@ import com.sk89q.worldedit.entity.metadata.EntityProperties; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.function.CombinedRegionFunction; import com.sk89q.worldedit.function.RegionFunction; -import com.sk89q.worldedit.function.RegionMaskTestFunction; +import com.fastasyncworldedit.core.function.RegionMaskTestFunction; import com.sk89q.worldedit.function.RegionMaskingFilter; import com.sk89q.worldedit.function.entity.ExtentEntityCopy; import com.sk89q.worldedit.function.mask.Mask; import com.sk89q.worldedit.function.mask.Masks; import com.sk89q.worldedit.function.visitor.EntityVisitor; -import com.sk89q.worldedit.function.visitor.IntersectRegionFunction; +import com.fastasyncworldedit.core.function.visitor.IntersectRegionFunction; import com.sk89q.worldedit.function.visitor.RegionVisitor; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.math.transform.AffineTransform; @@ -79,10 +79,12 @@ public class ForwardExtentCopy implements Operation { private RegionFunction sourceFunction = null; private Transform transform = new Identity(); private Transform currentTransform = null; - private int affectedBlocks; + private RegionFunction filterFunction; private RegionVisitor lastBiomeVisitor; private EntityVisitor lastEntityVisitor; + + private int affectedBlocks; private int affectedBiomeCols; private int affectedEntities; @@ -166,9 +168,11 @@ public class ForwardExtentCopy implements Operation { this.sourceMask = sourceMask; } + //FAWE start public void setFilterFunction(RegionFunction filterFunction) { this.filterFunction = filterFunction; } + //FAWE end /** * Get the function that gets applied to all source blocks after @@ -260,9 +264,11 @@ public class ForwardExtentCopy implements Operation { * @param copyingBiomes true if copying */ public void setCopyingBiomes(boolean copyingBiomes) { + //FAWE start - FlatRegion if (copyingBiomes && !(region instanceof FlatRegion)) { throw new UnsupportedOperationException("Can't copy biomes from region that doesn't implement FlatRegion"); } + //FAWE end this.copyingBiomes = copyingBiomes; } @@ -277,9 +283,11 @@ public class ForwardExtentCopy implements Operation { @Override public Operation resume(RunContext run) throws WorldEditException { + //FAWE start if (currentTransform == null) { currentTransform = transform; } + //FAWE end if (lastBiomeVisitor != null) { affectedBiomeCols += lastBiomeVisitor.getAffected(); lastBiomeVisitor = null; @@ -289,13 +297,16 @@ public class ForwardExtentCopy implements Operation { lastEntityVisitor = null; } + //FAWE start Extent finalDest = destination; BlockVector3 translation = to.subtract(from); if (!translation.equals(BlockVector3.ZERO)) { finalDest = new BlockTranslateExtent(finalDest, translation.getBlockX(), translation.getBlockY(), translation.getBlockZ()); } + //FAWE end + //FAWE start - RegionVisitor > ExtentBlockCopy RegionFunction copy; RegionVisitor blockCopy = null; PositionTransformExtent transExt = null; @@ -388,7 +399,6 @@ public class ForwardExtentCopy implements Operation { entities = Collections.emptyList(); } - for (int i = 0; i < repetitions; i++) { Operations.completeBlindly(blockCopy); @@ -412,6 +422,7 @@ public class ForwardExtentCopy implements Operation { } affectedBlocks += blockCopy.getAffected(); + //FAWE end return null; } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/operation/Operations.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/operation/Operations.java index 539f5da2d..550d77490 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/operation/Operations.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/operation/Operations.java @@ -27,8 +27,6 @@ import com.sk89q.worldedit.WorldEditException; */ public final class Operations { - private static final RunContext context = new RunContext(); - private Operations() { } @@ -40,7 +38,7 @@ public final class Operations { */ public static void complete(Operation op) throws WorldEditException { while (op != null) { - op = op.resume(context); + op = op.resume(new RunContext()); } } @@ -54,7 +52,7 @@ public final class Operations { public static void completeLegacy(Operation op) throws MaxChangedBlocksException { while (op != null) { try { - op = op.resume(context); + op = op.resume(new RunContext()); } catch (MaxChangedBlocksException e) { throw e; } catch (WorldEditException e) { @@ -73,7 +71,7 @@ public final class Operations { public static void completeBlindly(Operation op) { while (op != null) { try { - op = op.resume(context); + op = op.resume(new RunContext()); } catch (WorldEditException e) { throw new RuntimeException(e); } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/operation/SetBlockMap.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/operation/SetBlockMap.java index eb7699ed5..1175a430d 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/operation/SetBlockMap.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/operation/SetBlockMap.java @@ -52,8 +52,10 @@ public class SetBlockMap implements Operation { public void cancel() { } + //FAWE start @Override public void addStatusMessages(List messages) { } + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/operation/SetLocatedBlocks.java~HEAD b/worldedit-core/src/main/java/com/sk89q/worldedit/function/operation/SetLocatedBlocks.java~HEAD deleted file mode 100644 index 4f5e6fe07..000000000 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/operation/SetLocatedBlocks.java~HEAD +++ /dev/null @@ -1,56 +0,0 @@ -/* - * WorldEdit, a Minecraft world manipulation toolkit - * Copyright (C) sk89q - * Copyright (C) WorldEdit team and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.sk89q.worldedit.function.operation; - -import static com.google.common.base.Preconditions.checkNotNull; - -import com.sk89q.worldedit.WorldEditException; -import com.sk89q.worldedit.extent.Extent; -import com.sk89q.worldedit.util.LocatedBlock; - -import java.util.List; - -public class SetLocatedBlocks implements Operation { - - private final Extent extent; - private final Iterable blocks; - - public SetLocatedBlocks(Extent extent, Iterable blocks) { - this.extent = checkNotNull(extent); - this.blocks = checkNotNull(blocks); - } - - @Override - public Operation resume(RunContext run) throws WorldEditException { - for (LocatedBlock block : blocks) { - extent.setBlock(block.getLocation(), block.getBlock()); - } - return null; - } - - @Override - public void cancel() { - } - - @Override - public void addStatusMessages(List messages) { - } - -} diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/operation/package-info.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/operation/package-info.java new file mode 100644 index 000000000..5b9eb7485 --- /dev/null +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/operation/package-info.java @@ -0,0 +1,6 @@ +/** + * The following classes are FAWE additions: + * + * @see com.sk89q.worldedit.function.operation.BackwardsExtentBlockCopy + */ +package com.sk89q.worldedit.function.operation; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/pattern/Pattern.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/pattern/Pattern.java index cdddc1ce1..e0e88bb07 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/pattern/Pattern.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/pattern/Pattern.java @@ -19,11 +19,10 @@ package com.sk89q.worldedit.function.pattern; -import com.fastasyncworldedit.core.beta.Filter; -import com.fastasyncworldedit.core.beta.implementation.filter.block.FilterBlock; +import com.fastasyncworldedit.core.queue.Filter; +import com.fastasyncworldedit.core.extent.filter.block.FilterBlock; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extent.Extent; -import com.sk89q.worldedit.internal.util.DeprecationUtil; import com.sk89q.worldedit.internal.util.NonAbstractForCompatibility; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.world.block.BaseBlock; @@ -31,7 +30,7 @@ import com.sk89q.worldedit.world.block.BaseBlock; /** * Returns a {@link BaseBlock} for a given position. */ -// FAWE Start +//FAWE start - extends Filter public interface Pattern extends Filter { /** @@ -59,7 +58,7 @@ public interface Pattern extends Filter { apply(block, block, block); } - // FAWE End + //FAWE end /** * Return a {@link BaseBlock} for the given position. diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/pattern/RandomPattern.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/pattern/RandomPattern.java index e88f87174..e1049d304 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/pattern/RandomPattern.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/pattern/RandomPattern.java @@ -19,9 +19,9 @@ package com.sk89q.worldedit.function.pattern; -import com.fastasyncworldedit.core.object.collection.RandomCollection; -import com.fastasyncworldedit.core.object.random.SimpleRandom; -import com.fastasyncworldedit.core.object.random.TrueRandom; +import com.fastasyncworldedit.core.util.collection.RandomCollection; +import com.fastasyncworldedit.core.math.random.SimpleRandom; +import com.fastasyncworldedit.core.math.random.TrueRandom; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.math.BlockVector3; @@ -39,11 +39,14 @@ import static com.google.common.base.Preconditions.checkNotNull; */ public class RandomPattern extends AbstractPattern { + //FAWE start - SimpleRandom > Random, LHS

> List private final SimpleRandom random; private Map weights = new HashMap<>(); private RandomCollection collection; private LinkedHashSet patterns = new LinkedHashSet<>(); + //FAWE end + //FAWE start public RandomPattern() { this(new TrueRandom()); } @@ -64,6 +67,7 @@ public class RandomPattern extends AbstractPattern { this.collection = RandomCollection.of(weights, random); this.patterns = parent.patterns; } + //FAWE end /** * Add a pattern to the weight list of patterns. @@ -76,6 +80,7 @@ public class RandomPattern extends AbstractPattern { */ public void add(Pattern pattern, double chance) { checkNotNull(pattern); + //FAWE start - Double, weights, patterns and collection Double existingWeight = weights.get(pattern); if (existingWeight != null) { chance += existingWeight; @@ -102,7 +107,6 @@ public class RandomPattern extends AbstractPattern { public boolean apply(Extent extent, BlockVector3 get, BlockVector3 set) throws WorldEditException { return collection.next(get.getBlockX(), get.getBlockY(), get.getBlockZ()).apply(extent, get, set); } - - + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/pattern/RepeatingExtentPattern.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/pattern/RepeatingExtentPattern.java index 6d6b94e66..490c47cf2 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/pattern/RepeatingExtentPattern.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/pattern/RepeatingExtentPattern.java @@ -87,9 +87,11 @@ public class RepeatingExtentPattern extends AbstractExtentPattern { @Override public BaseBlock applyBlock(BlockVector3 position) { + //FAWE start - calculate offset int x = Math.floorMod(position.getBlockX() + offset.getBlockX(), size.getBlockX()) + origin.getBlockX(); int y = Math.floorMod(position.getBlockY() + offset.getBlockY(), size.getBlockY()) + origin.getBlockY(); int z = Math.floorMod(position.getBlockZ() + offset.getBlockZ(), size.getBlockZ()) + origin.getBlockZ(); + //FAWE end return getExtent().getFullBlock(x, y, z); } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/pattern/StateApplyingPattern.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/pattern/StateApplyingPattern.java index 0c0158b2f..39fc0cf77 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/pattern/StateApplyingPattern.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/pattern/StateApplyingPattern.java @@ -23,7 +23,6 @@ import com.google.common.collect.Maps; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.registry.state.Property; -import com.sk89q.worldedit.registry.state.PropertyKey; import com.sk89q.worldedit.world.block.BaseBlock; import com.sk89q.worldedit.world.block.BlockState; import com.sk89q.worldedit.world.block.BlockType; @@ -36,7 +35,7 @@ import static com.sk89q.worldedit.blocks.Blocks.resolveProperties; public class StateApplyingPattern extends AbstractExtentPattern { private final Map states; - private Map, Object>> cache = Maps.newHashMap(); + private final Map, Object>> cache = Maps.newHashMap(); public StateApplyingPattern(Extent extent, Map statesToSet) { super(extent); @@ -48,9 +47,11 @@ public class StateApplyingPattern extends AbstractExtentPattern { BlockState block = getExtent().getBlock(position); for (Entry, Object> entry : cache .computeIfAbsent(block.getBlockType(), (b -> resolveProperties(states, b))).entrySet()) { + //FAWE start if (block.getBlockType().hasProperty(entry.getKey().getKey())) { block = block.with(entry.getKey(), entry.getValue()); } + //FAWE end } return block.toBaseBlock(); } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/pattern/WaterloggedRemover.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/pattern/WaterloggedRemover.java index 92b2a5994..64ad58e93 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/pattern/WaterloggedRemover.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/pattern/WaterloggedRemover.java @@ -21,7 +21,7 @@ package com.sk89q.worldedit.function.pattern; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.math.BlockVector3; -import com.sk89q.worldedit.registry.state.PropertyKey; +import com.fastasyncworldedit.core.registry.state.PropertyKey; import com.sk89q.worldedit.world.block.BaseBlock; import com.sk89q.worldedit.world.block.BlockState; import com.sk89q.worldedit.world.block.BlockType; @@ -35,6 +35,7 @@ import java.lang.ref.SoftReference; */ public class WaterloggedRemover extends AbstractExtentPattern { + //FAWE start private static SoftReference cache = new SoftReference<>(null); private synchronized BlockState[] getRemap() { @@ -59,6 +60,7 @@ public class WaterloggedRemover extends AbstractExtentPattern { } private final BlockState[] remap; + //FAWE end public WaterloggedRemover(Extent extent) { super(extent); @@ -68,10 +70,12 @@ public class WaterloggedRemover extends AbstractExtentPattern { @Override public BaseBlock applyBlock(BlockVector3 position) { BaseBlock block = getExtent().getFullBlock(position); + //FAWE start - remap BlockState newState = remap[block.getOrdinal()]; if (newState != null) { return newState.toBaseBlock(block.getNbtData()); } + //FAWE end return BlockTypes.AIR.getDefaultState().toBaseBlock(); } } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/BreadthFirstSearch.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/BreadthFirstSearch.java index 6484aa182..c670b20ff 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/BreadthFirstSearch.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/BreadthFirstSearch.java @@ -20,7 +20,7 @@ package com.sk89q.worldedit.function.visitor; import com.fastasyncworldedit.core.configuration.Caption; -import com.fastasyncworldedit.core.object.collection.BlockVectorSet; +import com.fastasyncworldedit.core.math.BlockVectorSet; import com.google.common.collect.ImmutableList; import com.google.common.collect.Sets; import com.sk89q.worldedit.WorldEditException; @@ -28,7 +28,7 @@ import com.sk89q.worldedit.function.RegionFunction; import com.sk89q.worldedit.function.operation.Operation; import com.sk89q.worldedit.function.operation.RunContext; import com.sk89q.worldedit.math.BlockVector3; -import com.sk89q.worldedit.math.MutableBlockVector3; +import com.fastasyncworldedit.core.math.MutableBlockVector3; import com.sk89q.worldedit.util.Direction; import com.sk89q.worldedit.util.formatting.text.Component; import com.sk89q.worldedit.util.formatting.text.TextComponent; @@ -54,6 +54,7 @@ import static com.google.common.base.Preconditions.checkNotNull; */ public abstract class BreadthFirstSearch implements Operation { + //FAWE start public static final BlockVector3[] DEFAULT_DIRECTIONS = new BlockVector3[6]; public static final BlockVector3[] DIAGONAL_DIRECTIONS; @@ -80,12 +81,16 @@ public abstract class BreadthFirstSearch implements Operation { list.sort((o1, o2) -> (int) Math.signum(o1.lengthSq() - o2.lengthSq())); DIAGONAL_DIRECTIONS = list.toArray(new BlockVector3[0]); } + //FAWE end private final RegionFunction function; + //FAWE Start - BVS > Queue, Set, List private BlockVectorSet queue = new BlockVectorSet(); private BlockVectorSet visited = new BlockVectorSet(); private BlockVector3[] directions; + //FAWE end private int affected = 0; + //FAWE start private int currentDepth = 0; private final int maxDepth; private int maxBranch = Integer.MAX_VALUE; @@ -96,10 +101,13 @@ public abstract class BreadthFirstSearch implements Operation { * @param function the function to apply to visited blocks */ public BreadthFirstSearch(RegionFunction function) { + //FAWE start this(function, Integer.MAX_VALUE); + //FAWE end checkNotNull(function); } + //FAWE start public BreadthFirstSearch(RegionFunction function, int maxDepth) { checkNotNull(function); this.function = function; @@ -114,6 +122,7 @@ public abstract class BreadthFirstSearch implements Operation { public void setDirections(Collection directions) { setDirections(directions.toArray(new BlockVector3[0])); } + //FAWE end /** * Get the list of directions will be visited. @@ -135,6 +144,7 @@ public abstract class BreadthFirstSearch implements Operation { * Add the directions along the axes as directions to visit. */ public void addAxes() { + //FAWE start - HS HashSet set = Sets.newHashSet(directions); set.add(BlockVector3.UNIT_MINUS_Y); set.add(BlockVector3.UNIT_Y); @@ -143,18 +153,21 @@ public abstract class BreadthFirstSearch implements Operation { set.add(BlockVector3.UNIT_MINUS_Z); set.add(BlockVector3.UNIT_Z); setDirections(set); + //FAWE end } /** * Add the diagonal directions as directions to visit. */ public void addDiagonal() { + //FAWE start - HS HashSet set = Sets.newHashSet(directions); set.add(Direction.NORTHEAST.toBlockVector()); set.add(Direction.SOUTHEAST.toBlockVector()); set.add(Direction.SOUTHWEST.toBlockVector()); set.add(Direction.NORTHWEST.toBlockVector()); setDirections(set); + //FAWE end } /** @@ -193,6 +206,7 @@ public abstract class BreadthFirstSearch implements Operation { } } + //FAWE start public void setVisited(BlockVectorSet set) { this.visited = set; } @@ -208,6 +222,7 @@ public abstract class BreadthFirstSearch implements Operation { public void setMaxBranch(int maxBranch) { this.maxBranch = maxBranch; } + //FAWE end /** * Return whether the given 'to' block should be visited, starting from the @@ -230,6 +245,7 @@ public abstract class BreadthFirstSearch implements Operation { @Override public Operation resume(RunContext run) throws WorldEditException { + //FAWE start - directions & visited MutableBlockVector3 mutable = new MutableBlockVector3(); BlockVector3[] dirs = directions; BlockVectorSet tempQueue = new BlockVectorSet(); @@ -263,19 +279,24 @@ public abstract class BreadthFirstSearch implements Operation { tmp.clear(); tempQueue = tmp; } + //FAWE end return null; } + //FAWE start public int getDepth() { return currentDepth; } + //FAWE end @Override public void cancel() { + //FAWE start queue.clear(); visited.clear(); affected = 0; + //FAWE emd } @Override diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/DownwardVisitor.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/DownwardVisitor.java index 6bc7198d6..e7570e963 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/DownwardVisitor.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/DownwardVisitor.java @@ -34,8 +34,9 @@ import static com.google.common.base.Preconditions.checkNotNull; */ public class DownwardVisitor extends RecursiveVisitor { - private int baseY; + private final int baseY; + //FAWE start /** * Create a new visitor. * @@ -46,6 +47,7 @@ public class DownwardVisitor extends RecursiveVisitor { public DownwardVisitor(Mask mask, RegionFunction function, int baseY) { this(mask, function, baseY, Integer.MAX_VALUE); } + //FAWE end public DownwardVisitor(Mask mask, RegionFunction function, int baseY, int depth) { super(mask, function, depth); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/LayerVisitor.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/LayerVisitor.java index f9c0aacd7..c5acd33bd 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/LayerVisitor.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/LayerVisitor.java @@ -45,8 +45,8 @@ public class LayerVisitor implements Operation { private final FlatRegion flatRegion; private final LayerFunction function; private Mask2D mask = Masks.alwaysTrue2D(); - private int minY; - private int maxY; + private final int minY; + private final int maxY; /** * Create a new visitor. diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/NonRisingVisitor.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/NonRisingVisitor.java index 80f76049f..828865ceb 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/NonRisingVisitor.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/NonRisingVisitor.java @@ -28,6 +28,7 @@ import com.sk89q.worldedit.math.BlockVector3; */ public class NonRisingVisitor extends RecursiveVisitor { + //FAWE start - max int /** * Create a new recursive visitor. * @@ -37,7 +38,9 @@ public class NonRisingVisitor extends RecursiveVisitor { public NonRisingVisitor(Mask mask, RegionFunction function) { this(mask, function, Integer.MAX_VALUE); } + //FAWE end + //FAWE start - int depth public NonRisingVisitor(Mask mask, RegionFunction function, int depth) { super(mask, function, depth); setDirections( @@ -48,5 +51,6 @@ public class NonRisingVisitor extends RecursiveVisitor { BlockVector3.UNIT_MINUS_Y ); } + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/RecursiveVisitor.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/RecursiveVisitor.java index e95440254..51cc3bc60 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/RecursiveVisitor.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/RecursiveVisitor.java @@ -33,9 +33,11 @@ public class RecursiveVisitor extends BreadthFirstSearch { private final Mask mask; + //FAWE start public RecursiveVisitor(Mask mask, RegionFunction function) { this(mask, function, Integer.MAX_VALUE); } + //FAWE end /** * Create a new recursive visitor. diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/RegionVisitor.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/RegionVisitor.java index cabb517af..4b819b8bf 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/RegionVisitor.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/RegionVisitor.java @@ -32,7 +32,7 @@ import com.sk89q.worldedit.util.formatting.text.TextComponent; /** * Utility class to apply region functions to {@link com.sk89q.worldedit.regions.Region}. - * @deprecated Let the queue iterate, not the region function which lacks any kind of optimizations / parallelism + * @deprecated - FAWE deprecation: Let the queue iterate, not the region function which lacks any kind of optimizations / parallelism */ @Deprecated public class RegionVisitor implements Operation { diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/ScanChunk.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/ScanChunk.java deleted file mode 100644 index 2c73101fa..000000000 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/ScanChunk.java +++ /dev/null @@ -1,344 +0,0 @@ -package com.sk89q.worldedit.function.visitor; - -import com.sk89q.worldedit.function.RegionFunction; -import com.sk89q.worldedit.math.BlockVector3; -import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap; -import it.unimi.dsi.fastutil.longs.LongArraySet; - -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.ConcurrentLinkedQueue; - -/** - * A chunk based search algorithm - */ -public class ScanChunk { - public static final BlockVector3[] DEFAULT_DIRECTIONS = new BlockVector3[6]; - public static final BlockVector3[] DIAGONAL_DIRECTIONS; - private static final int MAX_QUEUE = 34816; - - static { - DEFAULT_DIRECTIONS[0] = BlockVector3.at(0, -1, 0); - DEFAULT_DIRECTIONS[1] = BlockVector3.at(0, 1, 0); - DEFAULT_DIRECTIONS[2] = BlockVector3.at(-1, 0, 0); - DEFAULT_DIRECTIONS[3] = BlockVector3.at(1, 0, 0); - DEFAULT_DIRECTIONS[4] = BlockVector3.at(0, 0, -1); - DEFAULT_DIRECTIONS[5] = BlockVector3.at(0, 0, 1); - List list = new ArrayList<>(); - for (int x = -1; x <= 1; x++) { - for (int y = -1; y <= 1; y++) { - for (int z = -1; z <= 1; z++) { - if (x != 0 || y != 0 || z != 0) { - BlockVector3 pos = BlockVector3.at(x, y, z); - if (!list.contains(pos)) { - list.add(pos); - } - } - } - } - } - list.sort((o1, o2) -> (int) Math.signum(o1.lengthSq() - o2.lengthSq())); - DIAGONAL_DIRECTIONS = list.toArray(new BlockVector3[0]); - } - - private final RegionFunction function; - private final BlockVector3[] directions; - private final Long2ObjectOpenHashMap visits; - private final Long2ObjectOpenHashMap queues; - private ConcurrentLinkedQueue queuePool = new ConcurrentLinkedQueue<>(); - - public ScanChunk(RegionFunction function) { - this.function = function; - this.directions = DEFAULT_DIRECTIONS; - - this.queues = new Long2ObjectOpenHashMap<>(); - this.visits = new Long2ObjectOpenHashMap<>(); - } - - public static long pairInt(int x, int y) { - return (long) x << 32 | y & 0xffffffffL; - } - - public boolean isVisited(int x, int y, int z) { - int X = x >> 4; - int Z = z >> 4; - long pair = pairInt(X, Z); - long[][] chunk = visits.get(pair); - if (chunk == null) { - return false; - } - int layer = y >> 4; - long[] section = chunk[layer]; - if (section == null) { - return false; - } - return get(section, getLocalIndex(x & 15, y & 15, z & 15)); - } - - public void start(int x, int y, int z) { - if (!isVisited(x, y, z)) { - push(x, y, z); - visit(x, y, z); - } - } - - public void visit(int x, int y, int z) { - int X = x >> 4; - int Z = z >> 4; - long pair = pairInt(X, Z); - long[][] arrs = visits.get(pair); - if (arrs == null) { - visits.put(pair, arrs = new long[16][]); - } - int layer = y >> 4; - long[] section = arrs[layer]; - if (section == null) { - arrs[layer] = section = new long[64]; - } - set(section, getLocalIndex(x & 15, y & 15, z & 15)); - } - - private char[] getOrCreateQueue(long pair, int layer) { - char[][] arrs = queues.get(pair); - if (arrs == null) { - queues.put(pair, arrs = new char[16][]); - } - - char[] section = arrs[layer]; - if (section == null) { - arrs[layer] = section = newQueue(); - } - return section; - } - - private void push(int x, int y, int z) { - int X = x >> 4; - int Z = z >> 4; - long pair = pairInt(X, Z); - int layer = y >> 4; - char[] section = getOrCreateQueue(pair, layer); - push(section, x & 15, y & 15, z & 15); - } - - private void push(char[] queue, int x, int y, int z) { - char indexStart = queue[0]; - char indexEnd = queue[1]; - push(indexStart, indexEnd, queue, x, y, z); - } - - private void push(char indexStart, char indexEnd, char[] queue, int x, int y, int z) { - char index = getLocalIndex(x, y, z); - if (indexStart > 2) { - queue[0] = --indexStart; - queue[indexStart] = index; - } else { - queue[indexEnd] = index; - queue[0] = ++indexEnd; - } - } - - public void process() { - LongArraySet set = new LongArraySet(); - /* - while (!queues.isEmpty()) { - ObjectIterator> iter = queues.long2ObjectEntrySet().fastIterator(); - Long2ObjectMap.Entry entry = iter.next(); - long index = entry.getLongKey(); - int X = MathMan.unpairIntX(index); - int Z = MathMan.unpairIntY(index); - // check that adjacent chunks aren;t being processed - - char[] queue = entry.getValue(); - long[][] visit = visits.get(index); - if (visit == null) { - visits.put(index, visit = new long[16][]); - } - */ - } - - private char[] newQueue() { - char[] arr = queuePool.poll(); - if (arr != null) { - arr[0] = 2; - arr[1] = 2; - return arr; - } - return new char[4096]; - } - - public void process4(int xx, int yy, int zz, char[] queue, long[] visit) { - char index; - while ((index = queue[0]) != queue[1]) { - queue[0]++; - - char triple = queue[index]; - int x = index & 15; - int z = index >> 4 & 15; - int y = index >> 8; - - int absX = xx + x; - int absY = yy + y; - int absZ = zz + z; - - apply(xx + x, yy + y, zz + z); - - int x1 = x; - - // find start of scan-line - int i1 = index; - while (true) { - if (x1 < 0) { - // queue in west chunk - break; - } - if (get(visit, i1)) { - break; - } - // visit - set(visit, i1); - - i1--; - x1--; - } - i1++; - x1++; - - // find end of scan-line - int i2 = index; - int x2 = x; - while (true) { - if (x2 > 15) { - // queue in east chunk - break; - } - if (get(visit, i2)) { - break; - } - set(visit, i2); - i2++; - x2++; - } - i2--; - x2--; - - // find start - } - } - - public void apply(int x, int y, int z) { - - } - - public void process4(int chunkX, int chunkZ, char[][] queues, long[][] visit) { - int xx = chunkX << 4; - int zz = chunkZ << 4; - - // TODO fetch instead of create - final BlockVector3[] dirs = directions; - char[][] dirQueues = new char[directions.length][]; - while (true) { - boolean empty = true; - for (int layer = 0; layer < 16; layer++) { - char[] queue = queues[layer]; - if (queue == null) { - continue; - } - char index; - while ((index = queue[0]) != queue[1]) { - queue[0]++; - - char triple = queue[index]; - int x = index & 15; - int z = index >> 4 & 15; - int y = index >> 8; - } - queuePool.add(queue); - queues[layer] = null; - continue; - } - - if (empty) { - break; - } - } - // empty queues - - /* while (indexStart != indexEnd) { - char index = queue[indexStart++]; - byte dirs = 0xF; - int x = index & 15; - int z = (index >> 4) & 15; - int y = index >> 8; - - int layer = y >> 4; - long[] visitBits = visit[layer]; - - int x1 = x; - int x2 = x; - - // find start of scan-line - int i1 = index; - while (true) { - if (x1 < 0) { - // queue in adjacent chunk - break; - } - if (get(visitBits, i1--)) break; - x1--; - } - i1++; - x1++; - - // find end of scan-line - int i2 = index; - while (true) { - if (x2 > 15) { - // queue in adjacent chunk - break; - } - if (get(visitBits, i2++)) break; - x2++; - } - i2--; - x2--; - - boolean scanUp = false; - boolean scanDown = false; - boolean scanLeft = false; - boolean scanRight = false; - - for (int i = i1; i <= i2; i++) { - if (!scanDown && y > 0 && ) - } - - for (int i=x1; i<=x2; i++) { // find scan-lines above this one - if (!inScanLine && y>0 && ip.getPixel(i,y-1)==color) - {push(i, y-1); inScanLine = true;} - else if (inScanLine && y>0 && ip.getPixel(i,y-1)!=color) - inScanLine = false; - } - - inScanLine = false; - for (int i=x1; i<=x2; i++) { // find scan-lines below this one - if (!inScanLine && y> 6] |= 1L << (i & 0x3F); - } - - public boolean get(long[] bits, int i) { - return (bits[i >> 6] & 1L << (i & 0x3F)) != 0; - } - - public char getLocalIndex(int x, int y, int z) { - return (char) (x + (z << 4) + (y << 8)); - } - - -} diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/history/change/EntityCreate.java b/worldedit-core/src/main/java/com/sk89q/worldedit/history/change/EntityCreate.java index 1d682f3ce..8930f4c97 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/history/change/EntityCreate.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/history/change/EntityCreate.java @@ -33,7 +33,9 @@ import static com.google.common.base.Preconditions.checkNotNull; public class EntityCreate implements Change { private final Location location; + //FAWE start - made public public final BaseEntity state; + //FAWE end private Entity entity; /** @@ -60,9 +62,11 @@ public class EntityCreate implements Change { } } + //FAWE start public Entity getEntity() { return entity; } + //FAWE end @Override public void redo(UndoContext context) throws WorldEditException { diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/history/change/EntityRemove.java b/worldedit-core/src/main/java/com/sk89q/worldedit/history/change/EntityRemove.java index 82426225c..51b8757d5 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/history/change/EntityRemove.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/history/change/EntityRemove.java @@ -33,7 +33,9 @@ import static com.google.common.base.Preconditions.checkNotNull; public class EntityRemove implements Change { private final Location location; + //FAWE start - make public public final BaseEntity state; + //FAWE end private Entity entity; /** @@ -49,9 +51,11 @@ public class EntityRemove implements Change { this.state = state; } + //FAWE start public Entity getEntity() { return entity; } + //FAWE end @Override public void undo(UndoContext context) throws WorldEditException { diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/history/changeset/ArrayListHistory.java b/worldedit-core/src/main/java/com/sk89q/worldedit/history/changeset/ArrayListHistory.java index f185c969a..ff624e81e 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/history/changeset/ArrayListHistory.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/history/changeset/ArrayListHistory.java @@ -19,7 +19,8 @@ package com.sk89q.worldedit.history.changeset; -import com.fastasyncworldedit.core.object.changeset.SimpleChangeSetSummary; +import com.fastasyncworldedit.core.history.changeset.ChangeSetSummary; +import com.fastasyncworldedit.core.history.changeset.SimpleChangeSetSummary; import com.google.common.collect.Lists; import com.sk89q.worldedit.history.change.BlockChange; import com.sk89q.worldedit.history.change.Change; @@ -74,6 +75,7 @@ public class ArrayListHistory implements ChangeSet { return changes.size(); } + //FAWE start @Override public ChangeSetSummary summarize(Region region, boolean shallow) { SimpleChangeSetSummary summary = new SimpleChangeSetSummary(); @@ -86,4 +88,5 @@ public class ArrayListHistory implements ChangeSet { } return summary; } + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/history/changeset/ChangeSet.java b/worldedit-core/src/main/java/com/sk89q/worldedit/history/changeset/ChangeSet.java index b9177733d..3bbfea529 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/history/changeset/ChangeSet.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/history/changeset/ChangeSet.java @@ -19,6 +19,7 @@ package com.sk89q.worldedit.history.changeset; +import com.fastasyncworldedit.core.history.changeset.ChangeSetSummary; import com.sk89q.worldedit.history.change.Change; import com.sk89q.worldedit.regions.Region; import org.jetbrains.annotations.Nullable; @@ -31,7 +32,9 @@ import java.util.Iterator; * Tracks a set of undoable operations and allows their undo and redo. The * entirety of a change set should be undone and redone at once. */ +//FAWE start - extends Closable public interface ChangeSet extends Closeable { +//FAWE end /** * Add the given change to the history. @@ -81,6 +84,7 @@ public interface ChangeSet extends Closeable { */ int size(); + //FAWE start /** * Close the changeset. */ @@ -109,4 +113,5 @@ public interface ChangeSet extends Closeable { default boolean isEmpty() { return size() == 0; } + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/annotation/PatternList.java b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/annotation/PatternList.java deleted file mode 100644 index 30bef0e8c..000000000 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/annotation/PatternList.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * WorldEdit, a Minecraft world manipulation toolkit - * Copyright (C) sk89q - * Copyright (C) WorldEdit team and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.sk89q.worldedit.internal.annotation; - -import org.enginehub.piston.inject.InjectAnnotation; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * Annotates a {@code List} parameter to inject a list of BlockStates. - */ -@Retention(RetentionPolicy.RUNTIME) -@Target(ElementType.PARAMETER) -@InjectAnnotation -public @interface PatternList { -} diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/anvil/ChunkDeleter.java b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/anvil/ChunkDeleter.java index dbfdd8008..f009ff055 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/anvil/ChunkDeleter.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/anvil/ChunkDeleter.java @@ -52,7 +52,7 @@ import java.util.stream.Stream; public final class ChunkDeleter { public static final String DELCHUNKS_FILE_NAME = "delete_chunks.json"; - private static final Logger LOGGER = LogManagerCompat.getLogger();; + private static final Logger LOGGER = LogManagerCompat.getLogger(); private static final Comparator chunkSorter = Comparator.comparing( pos -> (pos.getBlockX() & 31) + (pos.getBlockZ() & 31) * 32 @@ -64,7 +64,7 @@ public final class ChunkDeleter { .create(); public static ChunkDeletionInfo readInfo(Path chunkFile) throws IOException, JsonSyntaxException { - String json = new String(Files.readAllBytes(chunkFile), StandardCharsets.UTF_8); + String json = Files.readString(chunkFile); return chunkDeleterGson.fromJson(json, ChunkDeletionInfo.class); } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/anvil/RegionAccess.java b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/anvil/RegionAccess.java index 96ef62e81..4a7e7d944 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/anvil/RegionAccess.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/anvil/RegionAccess.java @@ -30,7 +30,7 @@ import java.nio.file.Path; */ class RegionAccess implements AutoCloseable { - private RandomAccessFile raf; + private final RandomAccessFile raf; private int[] offsets; private int[] timestamps; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/block/BlockStateIdAccess.java b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/block/BlockStateIdAccess.java index 69bdad383..0233529bf 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/block/BlockStateIdAccess.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/block/BlockStateIdAccess.java @@ -25,6 +25,7 @@ import javax.annotation.Nullable; public final class BlockStateIdAccess { + //FAWE start - Register via ordinal ID private static final int INVALID_ID = -1; /** @@ -50,5 +51,6 @@ public final class BlockStateIdAccess { private BlockStateIdAccess() { } + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/command/exception/WorldEditExceptionConverter.java b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/command/exception/WorldEditExceptionConverter.java index dc91aa5e1..e36a7791d 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/command/exception/WorldEditExceptionConverter.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/command/exception/WorldEditExceptionConverter.java @@ -97,6 +97,7 @@ public class WorldEditExceptionConverter extends ExceptionConverterHelper { throw newCommandException(Caption.of("worldedit.error.unknown-block", TextComponent.of(e.getID())), e); } + @Deprecated @ExceptionMatch public void convert(InvalidItemException e) throws CommandException { throw newCommandException(e.getMessage(), e); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/cui/SelectionCylinderEvent.java b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/cui/SelectionCylinderEvent.java index d6943752c..a2bb4631c 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/cui/SelectionCylinderEvent.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/cui/SelectionCylinderEvent.java @@ -42,11 +42,11 @@ public class SelectionCylinderEvent implements CUIEvent { @Override public String[] getParameters() { return new String[] { - String.valueOf(pos.getBlockX()), - String.valueOf(pos.getBlockY()), - String.valueOf(pos.getBlockZ()), - String.valueOf(radius.getX()), - String.valueOf(radius.getZ()) - }; + String.valueOf(pos.getBlockX()), + String.valueOf(pos.getBlockY()), + String.valueOf(pos.getBlockZ()), + String.valueOf(radius.getX()), + String.valueOf(radius.getZ()) + }; } } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/cui/SelectionEllipsoidPointEvent.java b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/cui/SelectionEllipsoidPointEvent.java index 2c671f2f3..477c2f0f6 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/cui/SelectionEllipsoidPointEvent.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/cui/SelectionEllipsoidPointEvent.java @@ -39,11 +39,11 @@ public class SelectionEllipsoidPointEvent implements CUIEvent { @Override public String[] getParameters() { return new String[] { - String.valueOf(id), - String.valueOf(pos.getBlockX()), - String.valueOf(pos.getBlockY()), - String.valueOf(pos.getBlockZ()) - }; + String.valueOf(id), + String.valueOf(pos.getBlockX()), + String.valueOf(pos.getBlockY()), + String.valueOf(pos.getBlockZ()) + }; } } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/cui/SelectionMinMaxEvent.java b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/cui/SelectionMinMaxEvent.java index ceb9fa322..8077e1d4e 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/cui/SelectionMinMaxEvent.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/cui/SelectionMinMaxEvent.java @@ -37,9 +37,9 @@ public class SelectionMinMaxEvent implements CUIEvent { @Override public String[] getParameters() { return new String[] { - String.valueOf(min), - String.valueOf(max), - }; + String.valueOf(min), + String.valueOf(max), + }; } } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/cui/SelectionPoint2DEvent.java b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/cui/SelectionPoint2DEvent.java index 646eadb50..a0d0ce4a9 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/cui/SelectionPoint2DEvent.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/cui/SelectionPoint2DEvent.java @@ -67,11 +67,11 @@ public class SelectionPoint2DEvent implements CUIEvent { @Override public String[] getParameters() { return new String[] { - String.valueOf(id), - String.valueOf(blockX), - String.valueOf(blockZ), - String.valueOf(area) - }; + String.valueOf(id), + String.valueOf(blockX), + String.valueOf(blockZ), + String.valueOf(area) + }; } } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/cui/SelectionPointEvent.java b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/cui/SelectionPointEvent.java index a140791bb..a2c5d19b2 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/cui/SelectionPointEvent.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/cui/SelectionPointEvent.java @@ -48,12 +48,12 @@ public class SelectionPointEvent implements CUIEvent { @Override public String[] getParameters() { return new String[] { - String.valueOf(id), - String.valueOf(pos.getBlockX()), - String.valueOf(pos.getBlockY()), - String.valueOf(pos.getBlockZ()), - String.valueOf(area) - }; + String.valueOf(id), + String.valueOf(pos.getBlockX()), + String.valueOf(pos.getBlockY()), + String.valueOf(pos.getBlockZ()), + String.valueOf(area) + }; } } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/cui/ServerCUIHandler.java b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/cui/ServerCUIHandler.java index 85f869e2d..3051e8d7e 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/cui/ServerCUIHandler.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/cui/ServerCUIHandler.java @@ -40,9 +40,18 @@ import javax.annotation.Nullable; */ public class ServerCUIHandler { + private static final int MAX_DISTANCE = 32; + private ServerCUIHandler() { } + public static int getMaxServerCuiSize() { + int dataVersion = WorldEdit.getInstance().getPlatformManager().queryCapability(Capability.GAME_HOOKS).getDataVersion(); + + // 1.16 increased maxSize to 48. + return dataVersion >= 2566 ? 48 : 32; + } + /** * Creates a structure block that shows the region. * @@ -58,8 +67,6 @@ public class ServerCUIHandler { LocalSession session = WorldEdit.getInstance().getSessionManager().get(player); RegionSelector regionSelector = session.getRegionSelector(player.getWorld()); - int dataVersion = WorldEdit.getInstance().getPlatformManager().queryCapability(Capability.WORLD_EDITING).getDataVersion(); - int posX; int posY; int posZ; @@ -109,16 +116,11 @@ public class ServerCUIHandler { return null; } - if (dataVersion >= 2526) { - if (width > 48 || length > 48 || height > 48) { - // 20w16a+ allows structure blocks up to 48 per axis - return null; - } else { - if (width > 32 || length > 32 || height > 32) { - // Structure blocks on versions <= 20w16a have a limit of 32x32x32 - return null; - } - } + int maxSize = getMaxServerCuiSize(); + + if (width > maxSize || length > maxSize || height > maxSize) { + // Structure blocks have a limit of maxSize^3 + return null; } // Borrowed this math from FAWE @@ -128,26 +130,24 @@ public class ServerCUIHandler { double xz = Math.cos(Math.toRadians(rotY)); int x = (int) (location.getX() - (-xz * Math.sin(Math.toRadians(rotX))) * 12); int z = (int) (location.getZ() - (xz * Math.cos(Math.toRadians(rotX))) * 12); - int y = Math.max(0, Math.min(Math.min(255, posY + 32), posY + 3)); + int y = Math.max( + player.getWorld().getMinY(), + Math.min(Math.min(player.getWorld().getMaxY(), posY + MAX_DISTANCE), posY + 3) + ); + //FAWE start - CBT > Map CompoundBinaryTag.Builder structureTag = CompoundBinaryTag.builder(); posX -= x; posY -= y; posZ -= z; - if (dataVersion >= 2526) { - if (Math.abs(posX) > 48 || Math.abs(posY) > 48 || Math.abs(posZ) > 48) { - // 20w16a+ allows structure blocks up to 48 per axis - return null; - } else { - if (Math.abs(posX) > 32 || Math.abs(posY) > 32 || Math.abs(posZ) > 32) { - // Structure blocks on versions <= 20w16a have a limit of 32x32x32 - return null; - } - } + if (Math.abs(posX) > MAX_DISTANCE || Math.abs(posY) > MAX_DISTANCE || Math.abs(posZ) > MAX_DISTANCE) { + // Structure blocks have a limit + return null; } + //FAWE start - see comment of CBT structureTag.putString("name", "worldedit:" + player.getName()); structureTag.putString("author", player.getName()); structureTag.putString("metadata", ""); @@ -168,5 +168,6 @@ public class ServerCUIHandler { structureTag.putString("id", BlockTypes.STRUCTURE_BLOCK.getId()); return BlockTypes.STRUCTURE_BLOCK.getDefaultState().toBaseBlock(structureTag.build()); + //FAWE end } } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/expression/Expression.java b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/expression/Expression.java index d1009dbbe..b8c765d4d 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/expression/Expression.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/expression/Expression.java @@ -62,21 +62,27 @@ import java.util.Set; * pass values for all slots specified while compiling. * To query slots after evaluation, you can use the {@linkplain #getSlots() slot table}. */ +//FAWE start - implements Cloneable public class Expression implements Cloneable { +//FAWE end private final SlotTable slots = new SlotTable(); private final List providedSlots; private final ExpressionParser.AllStatementsContext root; private final Functions functions = Functions.create(); private final CompiledExpression compiledExpression; + //FAWE start private final String initialExpression; + //FAWE end public static Expression compile(String expression, String... variableNames) throws ExpressionException { return new Expression(expression, variableNames); } private Expression(String expression, String... variableNames) throws ExpressionException { + //FAWE start this.initialExpression = expression; + //FAWE end slots.putSlot("e", new LocalSlot.Constant(Math.E)); slots.putSlot("pi", new LocalSlot.Constant(Math.PI)); @@ -185,8 +191,10 @@ public class Expression implements Cloneable { functions.setEnvironment(environment); } + //FAWE start public Expression clone() { return new Expression(initialExpression, new HashSet<>(providedSlots)); } + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/registry/SimpleInputParser.java b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/registry/SimpleInputParser.java index d94312249..faf9b3452 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/registry/SimpleInputParser.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/registry/SimpleInputParser.java @@ -39,7 +39,7 @@ public abstract class SimpleInputParser extends InputParser { } /** - * The strings this parser matches + * The strings this parser matches. * * @return the matching aliases */ @@ -57,7 +57,7 @@ public abstract class SimpleInputParser extends InputParser { public abstract E parseFromSimpleInput(String input, ParserContext context) throws InputParseException; /** - * Gets the primary name of this matcher + * Gets the primary name of this matcher. * * @return the primary match */ diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/util/BiomeMath.java b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/util/BiomeMath.java index 6fac9b714..a95bbf1a5 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/util/BiomeMath.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/util/BiomeMath.java @@ -33,7 +33,7 @@ public class BiomeMath { } /** - * Compute the index into the MC biome array. + * Compute the index into the MC biome array, for non-extended-height worlds. * * @param x the block x coordinate * @param y the block y coordinate @@ -45,7 +45,26 @@ public class BiomeMath { int m = MathHelper.clamp(y >> 2, 0, VERTICAL_BIT_MASK); int n = (z >> 2) & HORIZONTAL_BIT_MASK; return m << HORIZONTAL_SECTION_COUNT + HORIZONTAL_SECTION_COUNT - | n << HORIZONTAL_SECTION_COUNT - | l; + | n << HORIZONTAL_SECTION_COUNT + | l; + } + + /** + * Compute the index into the MC biome array, for extended-height worlds. + * + * @param x the block x coordinate + * @param y the block y coordinate + * @param z the block z coordinate + * @param minY minimum y of the world + * @param maxY maximum y of the world + * @return the index into the standard MC biome array + */ + public static int computeBiomeIndex(int x, int y, int z, int minY, int maxY) { + int l = (x >> 2) & HORIZONTAL_BIT_MASK; + int m = MathHelper.clamp((y >> 2) - minY, 0, maxY); + int n = (z >> 2) & HORIZONTAL_BIT_MASK; + return m << HORIZONTAL_SECTION_COUNT + HORIZONTAL_SECTION_COUNT + | n << HORIZONTAL_SECTION_COUNT + | l; } } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/wna/WorldNativeAccess.java b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/wna/WorldNativeAccess.java index 59461963f..1ef64be43 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/wna/WorldNativeAccess.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/wna/WorldNativeAccess.java @@ -69,6 +69,7 @@ public interface WorldNativeAccess { if (successful || old == newState) { if (block instanceof BaseBlock) { BaseBlock baseBlock = (BaseBlock) block; + //FAWE start - use CompoundBinaryTag over CompoundTag CompoundBinaryTag tag = baseBlock.getNbt(); if (tag != null) { tag = tag.put(ImmutableMap.of( @@ -81,6 +82,7 @@ public interface WorldNativeAccess { // update if TE changed as well successful = updateTileEntity(pos, tag); } + //FAWE end } } @@ -190,6 +192,8 @@ public interface WorldNativeAccess { onBlockStateChange(pos, oldState, newState); } + //FAWE start void flush(); + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/math/BlockVector2.java b/worldedit-core/src/main/java/com/sk89q/worldedit/math/BlockVector2.java index 48c579ac8..0d5ba2648 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/math/BlockVector2.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/math/BlockVector2.java @@ -19,6 +19,7 @@ package com.sk89q.worldedit.math; +import com.fastasyncworldedit.core.math.MutableBlockVector2; import com.sk89q.worldedit.math.transform.AffineTransform; import java.util.Comparator; @@ -26,7 +27,9 @@ import java.util.Comparator; /** * An immutable 2-dimensional vector. */ +//FAWE start - un-finalize public class BlockVector2 { +//FAWE end public static final BlockVector2 ZERO = new BlockVector2(0, 0); public static final BlockVector2 UNIT_X = new BlockVector2(1, 0); @@ -57,6 +60,7 @@ public class BlockVector2 { } public static BlockVector2 at(int x, int z) { + //FAWE start /* unnecessary switch (x) { case 0: @@ -112,6 +116,7 @@ public class BlockVector2 { public MutableBlockVector2 mutZ(int z) { return new MutableBlockVector2(x, z); } + //FAWE end /** * Get the X coordinate. @@ -169,6 +174,7 @@ public class BlockVector2 { return BlockVector2.at(x, z); } + //FAWE start public MutableBlockVector2 nextPosition() { int absX = Math.abs(x); int absY = Math.abs(z); @@ -197,6 +203,7 @@ public class BlockVector2 { return setComponents(x + 1, z); } } + //FAWE end /** * Add another vector to this vector and return the result as a new vector. diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/math/BlockVector3.java b/worldedit-core/src/main/java/com/sk89q/worldedit/math/BlockVector3.java index 801cdece1..8d75feccd 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/math/BlockVector3.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/math/BlockVector3.java @@ -19,6 +19,7 @@ package com.sk89q.worldedit.math; +import com.fastasyncworldedit.core.math.MutableBlockVector3; import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.math.transform.AffineTransform; @@ -52,7 +53,7 @@ public abstract class BlockVector3 { } public static BlockVector3 at(int x, int y, int z) { - /* unnecessary + /*FAWE start unnecessary // switch for efficiency on typical cases // in MC y is rarely 0/1 on selections switch (y) { @@ -70,11 +71,13 @@ public abstract class BlockVector3 { break; } */ + //FAWE end return new BlockVector3Imp(x, y, z); } private static final int WORLD_XZ_MINMAX = 30_000_000; - private static final int WORLD_Y_MAX = 4095; + private static final int WORLD_Y_MIN = -2048; + private static final int WORLD_Y_MAX = 2047; private static boolean isHorizontallyInBounds(int h) { return -WORLD_XZ_MINMAX <= h && h <= WORLD_XZ_MINMAX; @@ -83,7 +86,7 @@ public abstract class BlockVector3 { public static boolean isLongPackable(BlockVector3 location) { return isHorizontallyInBounds(location.getX()) && isHorizontallyInBounds(location.getZ()) - && 0 <= location.getY() && location.getY() <= WORLD_Y_MAX; + && WORLD_Y_MIN <= location.getY() && location.getY() <= WORLD_Y_MAX; } public static void checkLongPackable(BlockVector3 location) { @@ -117,6 +120,7 @@ public abstract class BlockVector3 { return YzxOrderComparator.YZX_ORDER; } + //FAWE start public MutableBlockVector3 setComponents(double x, double y, double z) { return new MutableBlockVector3((int) x, (int) y, (int) z); } @@ -157,22 +161,27 @@ public abstract class BlockVector3 { public BlockVector3 toImmutable() { return BlockVector3.at(getX(), getY(), getZ()); } + //FAWE end /** * Get the X coordinate. * * @return the x coordinate */ + //FAWE start - Made abstract public abstract int getX(); + //FAWE end /** * Get the X coordinate. * * @return the x coordinate */ + //FAWE start - getter public int getBlockX() { return getX(); } + //FAWE end /** * Set the X coordinate. @@ -180,25 +189,31 @@ public abstract class BlockVector3 { * @param x the new X * @return a new vector */ + //FAWE start - getter public BlockVector3 withX(int x) { return BlockVector3.at(x, getY(), getZ()); } + //FAWE end /** * Get the Y coordinate. * * @return the y coordinate */ + //FAWE start - Made abstract public abstract int getY(); + //FAWE end /** * Get the Y coordinate. * * @return the y coordinate */ + //FAWE start - getter public int getBlockY() { return getY(); } + //FAWE end /** * Set the Y coordinate. @@ -206,25 +221,31 @@ public abstract class BlockVector3 { * @param y the new Y * @return a new vector */ + //FAWE start - getter public BlockVector3 withY(int y) { return BlockVector3.at(getX(), y, getZ()); } + //FAWE end /** * Get the Z coordinate. * * @return the z coordinate */ + //FAWE start - Made abstract public abstract int getZ(); + //FAWE end /** * Get the Z coordinate. * * @return the z coordinate */ + //FAWE start - getter public int getBlockZ() { return getZ(); } + //FAWE end /** * Set the Z coordinate. @@ -232,9 +253,11 @@ public abstract class BlockVector3 { * @param z the new Z * @return a new vector */ + //FAWE start - getter public BlockVector3 withZ(int z) { return BlockVector3.at(getX(), getY(), z); } + //FAWE end /** * Add another vector to this vector and return the result as a new vector. @@ -242,9 +265,11 @@ public abstract class BlockVector3 { * @param other the other vector * @return a new vector */ + //FAWE start - getter public BlockVector3 add(BlockVector3 other) { return add(other.getX(), other.getY(), other.getZ()); } + //FAWE end /** * Add another vector to this vector and return the result as a new vector. @@ -254,9 +279,11 @@ public abstract class BlockVector3 { * @param z the value to add * @return a new vector */ + //FAWE start - getter public BlockVector3 add(int x, int y, int z) { return BlockVector3.at(this.getX() + x, this.getY() + y, this.getZ() + z); } + //FAWE end /** * Add a list of vectors to this vector and return the @@ -265,6 +292,7 @@ public abstract class BlockVector3 { * @param others an array of vectors * @return a new vector */ + //FAWE start - getter public BlockVector3 add(BlockVector3... others) { int newX = getX(); int newY = getY(); @@ -278,6 +306,7 @@ public abstract class BlockVector3 { return BlockVector3.at(newX, newY, newZ); } + //FAWE end /** * Subtract another vector from this vector and return the result @@ -286,9 +315,11 @@ public abstract class BlockVector3 { * @param other the other vector * @return a new vector */ + //FAWE start - getter public BlockVector3 subtract(BlockVector3 other) { return subtract(other.getX(), other.getY(), other.getZ()); } + //FAWE end /** * Subtract another vector from this vector and return the result @@ -299,9 +330,11 @@ public abstract class BlockVector3 { * @param z the value to subtract * @return a new vector */ + //FAWE start - getter public BlockVector3 subtract(int x, int y, int z) { return BlockVector3.at(this.getX() - x, this.getY() - y, this.getZ() - z); } + //FAWE end /** * Subtract a list of vectors from this vector and return the result @@ -310,6 +343,7 @@ public abstract class BlockVector3 { * @param others an array of vectors * @return a new vector */ + //FAWE start - getter public BlockVector3 subtract(BlockVector3... others) { int newX = getX(); int newY = getY(); @@ -323,6 +357,7 @@ public abstract class BlockVector3 { return BlockVector3.at(newX, newY, newZ); } + //FAWE end /** * Multiply this vector by another vector on each component. @@ -330,9 +365,11 @@ public abstract class BlockVector3 { * @param other the other vector * @return a new vector */ + //FAWE start - getter public BlockVector3 multiply(BlockVector3 other) { return multiply(other.getX(), other.getY(), other.getZ()); } + //FAWE end /** * Multiply this vector by another vector on each component. @@ -342,9 +379,11 @@ public abstract class BlockVector3 { * @param z the value to multiply * @return a new vector */ + //FAWE start - getter public BlockVector3 multiply(int x, int y, int z) { return BlockVector3.at(this.getX() * x, this.getY() * y, this.getZ() * z); } + //FAWE end /** * Multiply this vector by zero or more vectors on each component. @@ -352,6 +391,7 @@ public abstract class BlockVector3 { * @param others an array of vectors * @return a new vector */ + //FAWE start - getter public BlockVector3 multiply(BlockVector3... others) { int newX = getX(); int newY = getY(); @@ -365,6 +405,7 @@ public abstract class BlockVector3 { return BlockVector3.at(newX, newY, newZ); } + //FAWE end /** * Perform scalar multiplication and return a new vector. @@ -382,9 +423,11 @@ public abstract class BlockVector3 { * @param other the other vector * @return a new vector */ + //FAWE start - getter public BlockVector3 divide(BlockVector3 other) { return divide(other.getX(), other.getY(), other.getZ()); } + //FAWE end /** * Divide this vector by another vector on each component. @@ -394,9 +437,11 @@ public abstract class BlockVector3 { * @param z the value to divide by * @return a new vector */ + //FAWE start - getter public BlockVector3 divide(int x, int y, int z) { return BlockVector3.at(this.getX() / x, this.getY() / y, this.getZ() / z); } + //FAWE end /** * Perform scalar division and return a new vector. @@ -416,9 +461,11 @@ public abstract class BlockVector3 { * @param z the value to shift z by * @return a new vector */ + //FAWE start - getter public BlockVector3 shr(int x, int y, int z) { return at(this.getX() >> x, this.getY() >> y, this.getZ() >> z); } + //FAWE end /** * Shift all components right by {@code n}. @@ -438,9 +485,11 @@ public abstract class BlockVector3 { * @param z the value to shift z by * @return a new vector */ + //FAWE start - getter public BlockVector3 shl(int x, int y, int z) { return at(this.getX() << x, this.getY() << y, this.getZ() << z); } + //FAWE end /** * Shift all components left by {@code n}. @@ -466,9 +515,11 @@ public abstract class BlockVector3 { * * @return length, squared */ + //FAWE start - getter public int lengthSq() { return getX() * getX() + getY() * getY() + getZ() * getZ(); } + //FAWE end /** * Get the distance between this vector and another vector. @@ -486,12 +537,14 @@ public abstract class BlockVector3 { * @param other the other vector * @return distance */ + //FAWE start - getter public int distanceSq(BlockVector3 other) { int dx = other.getX() - getX(); int dy = other.getY() - getY(); int dz = other.getZ() - getZ(); return dx * dx + dy * dy + dz * dz; } + //FAWE end /** * Get the normalized vector, which is the vector divided by its @@ -499,6 +552,7 @@ public abstract class BlockVector3 { * * @return a new vector */ + //FAWE start - getter public BlockVector3 normalize() { double len = length(); double x = this.getX() / len; @@ -506,6 +560,7 @@ public abstract class BlockVector3 { double z = this.getZ() / len; return BlockVector3.at(x, y, z); } + //FAWE end /** * Gets the dot product of this and another vector. @@ -513,9 +568,11 @@ public abstract class BlockVector3 { * @param other the other vector * @return the dot product of this and the other vector */ + //FAWE start - getter public double dot(BlockVector3 other) { return getX() * other.getX() + getY() * other.getY() + getZ() * other.getZ(); } + //FAWE end /** * Gets the cross product of this and another vector. @@ -523,6 +580,7 @@ public abstract class BlockVector3 { * @param other the other vector * @return the cross product of this and the other vector */ + //FAWE start - getter public BlockVector3 cross(BlockVector3 other) { return new BlockVector3Imp( getY() * other.getZ() - getZ() * other.getY(), @@ -530,6 +588,7 @@ public abstract class BlockVector3 { getX() * other.getY() - getY() * other.getX() ); } + //FAWE end /** * Checks to see if a vector is contained with another. @@ -538,10 +597,12 @@ public abstract class BlockVector3 { * @param max the maximum point (X, Y, and Z are the lowest) * @return true if the vector is contained */ + //FAWE start - getter public boolean containedWithin(BlockVector3 min, BlockVector3 max) { return getX() >= min.getX() && getX() <= max.getX() && getY() >= min.getY() && getY() <= max .getY() && getZ() >= min.getZ() && getZ() <= max.getZ(); } + //FAWE end /** * Clamp the Y component. @@ -550,6 +611,7 @@ public abstract class BlockVector3 { * @param max the maximum value * @return a new vector */ + //FAWE start - getter public BlockVector3 clampY(int min, int max) { checkArgument(min <= max, "minimum cannot be greater than maximum"); if (getY() < min) { @@ -560,6 +622,7 @@ public abstract class BlockVector3 { } return this; } + //FAWE end /** * Floors the values of all components. @@ -599,9 +662,11 @@ public abstract class BlockVector3 { * * @return a new vector */ + //FAWE start - getter public BlockVector3 abs() { return BlockVector3.at(Math.abs(getX()), Math.abs(getY()), Math.abs(getZ())); } + //FAWE end /** * Perform a 2D transformation on this vector and return a new one. @@ -614,6 +679,7 @@ public abstract class BlockVector3 { * @return a new vector * @see AffineTransform another method to transform vectors */ + //FAWE start - getter public BlockVector3 transform2D(double angle, double aboutX, double aboutZ, double translateX, double translateZ) { angle = Math.toRadians(angle); double x = this.getX() - aboutX; @@ -629,6 +695,7 @@ public abstract class BlockVector3 { z2 + aboutZ + translateZ ); } + //FAWE end /** * Get this vector's pitch as used within the game. @@ -670,6 +737,7 @@ public abstract class BlockVector3 { * @param v2 the second vector * @return minimum */ + //FAWE start - getter public BlockVector3 getMinimum(BlockVector3 v2) { return new BlockVector3Imp( Math.min(getX(), v2.getX()), @@ -677,6 +745,7 @@ public abstract class BlockVector3 { Math.min(getZ(), v2.getZ()) ); } + //FAWE end /** * Gets the maximum components of two vectors. @@ -684,6 +753,7 @@ public abstract class BlockVector3 { * @param v2 the second vector * @return maximum */ + //FAWE start - getter public BlockVector3 getMaximum(BlockVector3 v2) { return new BlockVector3Imp( Math.max(getX(), v2.getX()), @@ -691,7 +761,9 @@ public abstract class BlockVector3 { Math.max(getZ(), v2.getZ()) ); } + //FAWE end + //FAWE start /* Methods for getting/setting blocks @@ -799,5 +871,6 @@ public abstract class BlockVector3 { public BlockVector3 plus(BlockVector3 other) { return add(other); } + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/math/Vector2.java b/worldedit-core/src/main/java/com/sk89q/worldedit/math/Vector2.java index f2e418b4d..fa2703a9e 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/math/Vector2.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/math/Vector2.java @@ -470,7 +470,9 @@ public final class Vector2 { @Override public int hashCode() { + //FAWE start - XOR over x z calc return (int) x << 16 ^ (int) z; + //FAWE end } @Override diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/math/Vector3.java b/worldedit-core/src/main/java/com/sk89q/worldedit/math/Vector3.java index c2d752e44..b6a7559a3 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/math/Vector3.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/math/Vector3.java @@ -19,6 +19,8 @@ package com.sk89q.worldedit.math; +import com.fastasyncworldedit.core.math.MutableVector3; +import com.fastasyncworldedit.core.math.Vector3Impl; import com.fastasyncworldedit.core.util.MathMan; import com.google.common.collect.ComparisonChain; import com.sk89q.worldedit.math.transform.AffineTransform; @@ -39,7 +41,7 @@ public abstract class Vector3 { public static final Vector3 ONE = Vector3.at(1, 1, 1); public static Vector3 at(double x, double y, double z) { - /* Unnecessary + /*FAWE start - Unnecessary // switch for efficiency on typical cases // in MC y is rarely 0/1 on selections int yTrunc = (int) y; @@ -57,6 +59,7 @@ public abstract class Vector3 { default: break; } + Fawe end */ return new Vector3Impl(x, y, z); } @@ -83,6 +86,7 @@ public abstract class Vector3 { return YzxOrderComparator.YZX_ORDER; } + //FAWE start /** * Gets the x coordinate rounded, accounting for negative coordinates * @@ -145,13 +149,16 @@ public abstract class Vector3 { public MutableVector3 mutZ(double z) { return new MutableVector3(getX(), getY(), z); } + //FAWE end /** * Get the X coordinate. * * @return the x coordinate */ + //FAWE start - made abstract public abstract double getX(); + //FAWE end /** * Set the X coordinate. @@ -159,16 +166,20 @@ public abstract class Vector3 { * @param x the new X * @return a new vector */ + //FAWE start - getter public Vector3 withX(double x) { return Vector3.at(x, getY(), getZ()); } + //FAWE end /** * Get the Y coordinate. * * @return the y coordinate */ + //FAWE start - made abstract public abstract double getY(); + //FAWE end /** * Set the Y coordinate. @@ -176,16 +187,20 @@ public abstract class Vector3 { * @param y the new Y * @return a new vector */ + //FAWE start - getter public Vector3 withY(double y) { return Vector3.at(getX(), y, getZ()); } + //FAWE end /** * Get the Z coordinate. * * @return the z coordinate */ + //FAWE start - made abstract public abstract double getZ(); + //FAWE end /** * Set the Z coordinate. @@ -193,9 +208,11 @@ public abstract class Vector3 { * @param z the new Z * @return a new vector */ + //FAWE start - getter public Vector3 withZ(double z) { return Vector3.at(getX(), getY(), z); } + //FAWE end /** * Add another vector to this vector and return the result as a new vector. @@ -203,9 +220,11 @@ public abstract class Vector3 { * @param other the other vector * @return a new vector */ + //FAWE start - getter public Vector3 add(Vector3 other) { return add(other.getX(), other.getY(), other.getZ()); } + //FAWE end /** * Add another vector to this vector and return the result as a new vector. @@ -215,9 +234,11 @@ public abstract class Vector3 { * @param z the value to add * @return a new vector */ + //FAWE start - getter public Vector3 add(double x, double y, double z) { return Vector3.at(this.getX() + x, this.getY() + y, this.getZ() + z); } + //FAWE end /** * Add a list of vectors to this vector and return the @@ -226,6 +247,7 @@ public abstract class Vector3 { * @param others an array of vectors * @return a new vector */ + //FAWE start - getter public Vector3 add(Vector3... others) { double newX = getX(); double newY = getY(); @@ -239,6 +261,7 @@ public abstract class Vector3 { return Vector3.at(newX, newY, newZ); } + //FAWE end /** * Subtract another vector from this vector and return the result @@ -247,9 +270,11 @@ public abstract class Vector3 { * @param other the other vector * @return a new vector */ + //FAWE start - getter public Vector3 subtract(Vector3 other) { return subtract(other.getX(), other.getY(), other.getZ()); } + //FAWE end /** * Subtract another vector from this vector and return the result @@ -260,9 +285,11 @@ public abstract class Vector3 { * @param z the value to subtract * @return a new vector */ + //FAWE start - getter public Vector3 subtract(double x, double y, double z) { return Vector3.at(this.getX() - x, this.getY() - y, this.getZ() - z); } + //FAWE end /** * Subtract a list of vectors from this vector and return the result @@ -271,6 +298,7 @@ public abstract class Vector3 { * @param others an array of vectors * @return a new vector */ + //FAWE start - getter public Vector3 subtract(Vector3... others) { double newX = getX(); double newY = getY(); @@ -284,6 +312,7 @@ public abstract class Vector3 { return Vector3.at(newX, newY, newZ); } + //FAWE end /** * Multiply this vector by another vector on each component. @@ -291,9 +320,11 @@ public abstract class Vector3 { * @param other the other vector * @return a new vector */ + //FAWE start - getter public Vector3 multiply(Vector3 other) { return multiply(other.getX(), other.getY(), other.getZ()); } + //FAWE end /** * Multiply this vector by another vector on each component. @@ -303,9 +334,11 @@ public abstract class Vector3 { * @param z the value to multiply * @return a new vector */ + //FAWE start - getter public Vector3 multiply(double x, double y, double z) { return Vector3.at(this.getX() * x, this.getY() * y, this.getZ() * z); } + //FAWE end /** * Multiply this vector by zero or more vectors on each component. @@ -313,6 +346,7 @@ public abstract class Vector3 { * @param others an array of vectors * @return a new vector */ + //FAWE start - getter public Vector3 multiply(Vector3... others) { double newX = getX(); double newY = getY(); @@ -326,6 +360,7 @@ public abstract class Vector3 { return Vector3.at(newX, newY, newZ); } + //FAWE end /** * Perform scalar multiplication and return a new vector. @@ -343,9 +378,11 @@ public abstract class Vector3 { * @param other the other vector * @return a new vector */ + //FAWE start - getter public Vector3 divide(Vector3 other) { return divide(other.getX(), other.getY(), other.getZ()); } + //FAWE end /** * Divide this vector by another vector on each component. @@ -355,9 +392,11 @@ public abstract class Vector3 { * @param z the value to divide by * @return a new vector */ + //FAWE start - getter public Vector3 divide(double x, double y, double z) { return Vector3.at(this.getX() / x, this.getY() / y, this.getZ() / z); } + //FAWE end /** * Perform scalar division and return a new vector. @@ -383,9 +422,11 @@ public abstract class Vector3 { * * @return length, squared */ + //FAWE start - getter public double lengthSq() { return getX() * getX() + getY() * getY() + getZ() * getZ(); } + //FAWE end /** * Get the distance between this vector and another vector. @@ -403,12 +444,14 @@ public abstract class Vector3 { * @param other the other vector * @return distance */ + //FAWE start - getter public double distanceSq(Vector3 other) { double dx = other.getX() - getX(); double dy = other.getY() - getY(); double dz = other.getZ() - getZ(); return dx * dx + dy * dy + dz * dz; } + //FAWE end /** * Get the normalized vector, which is the vector divided by its @@ -426,9 +469,11 @@ public abstract class Vector3 { * @param other the other vector * @return the dot product of this and the other vector */ + //FAWE start - getter public double dot(Vector3 other) { return getX() * other.getX() + getY() * other.getY() + getZ() * other.getZ(); } + //FAWE end /** * Gets the cross product of this and another vector. @@ -436,6 +481,7 @@ public abstract class Vector3 { * @param other the other vector * @return the cross product of this and the other vector */ + //FAWE start - getter public Vector3 cross(Vector3 other) { return Vector3.at( getY() * other.getZ() - getZ() * other.getY(), @@ -443,6 +489,7 @@ public abstract class Vector3 { getX() * other.getY() - getY() * other.getX() ); } + //FAWE end /** * Checks to see if a vector is contained with another. @@ -451,9 +498,11 @@ public abstract class Vector3 { * @param max the maximum point (X, Y, and Z are the lowest) * @return true if the vector is contained */ + //FAWE start - getter public boolean containedWithin(Vector3 min, Vector3 max) { return getX() >= min.getX() && getX() <= max.getX() && getY() >= min.getY() && getY() <= max.getY() && getZ() >= min.getZ() && getZ() <= max.getZ(); } + //FAWE end /** * Clamp the Y component. @@ -462,6 +511,7 @@ public abstract class Vector3 { * @param max the maximum value * @return a new vector */ + //FAWE start - getter public Vector3 clampY(int min, int max) { checkArgument(min <= max, "minimum cannot be greater than maximum"); if (getY() < min) { @@ -472,24 +522,29 @@ public abstract class Vector3 { } return this; } + //FAWE end /** * Floors the values of all components. * * @return a new vector */ + //FAWE start - getter public Vector3 floor() { return Vector3.at(Math.floor(getX()), Math.floor(getY()), Math.floor(getZ())); } + //FAWE end /** * Rounds all components up. * * @return a new vector */ + //FAWE start - getter public Vector3 ceil() { return Vector3.at(Math.ceil(getX()), Math.ceil(getY()), Math.ceil(getZ())); } + //FAWE end /** * Rounds all components to the closest integer. @@ -498,18 +553,22 @@ public abstract class Vector3 { * * @return a new vector */ + //FAWE start - getter public Vector3 round() { return Vector3.at(Math.floor(getX() + 0.5), Math.floor(getY() + 0.5), Math.floor(getZ() + 0.5)); } + //FAWE end /** * Rounds all components using {@link MathUtils#roundHalfUp(double)} * * @return a new vector */ + //FAWE start - getter public Vector3 roundHalfUp() { return Vector3.at(MathUtils.roundHalfUp(getX()), MathUtils.roundHalfUp(getY()), MathUtils.roundHalfUp(getZ())); } + //FAWE end /** * Returns a vector with the absolute values of the components of @@ -517,9 +576,11 @@ public abstract class Vector3 { * * @return a new vector */ + //FAWE start - getter public Vector3 abs() { return Vector3.at(Math.abs(getX()), Math.abs(getY()), Math.abs(getZ())); } + //FAWE end /** * Perform a 2D transformation on this vector and return a new one. @@ -532,6 +593,7 @@ public abstract class Vector3 { * @return a new vector * @see AffineTransform another method to transform vectors */ + //FAWE start - getter public Vector3 transform2D(double angle, double aboutX, double aboutZ, double translateX, double translateZ) { angle = Math.toRadians(angle); double x = this.getX() - aboutX; @@ -547,6 +609,7 @@ public abstract class Vector3 { z2 + aboutZ + translateZ ); } + //FAWE end /** * Get this vector's pitch as used within the game. @@ -588,6 +651,7 @@ public abstract class Vector3 { * @param v2 the second vector * @return minimum */ + //FAWE start - getter public Vector3 getMinimum(Vector3 v2) { return Vector3.at( Math.min(getX(), v2.getX()), @@ -595,6 +659,7 @@ public abstract class Vector3 { Math.min(getZ(), v2.getZ()) ); } + //FAWE end /** * Gets the maximum components of two vectors. @@ -602,6 +667,7 @@ public abstract class Vector3 { * @param v2 the second vector * @return maximum */ + //FAWE start - getter public Vector3 getMaximum(Vector3 v2) { return Vector3.at( Math.max(getX(), v2.getX()), @@ -609,6 +675,7 @@ public abstract class Vector3 { Math.max(getZ(), v2.getZ()) ); } + //FAWE end /** * Create a new {@code BlockVector} using the given components. @@ -627,18 +694,22 @@ public abstract class Vector3 { * * @return a new {@code BlockVector} */ + //FAWE start - getter public BlockVector3 toBlockPoint() { return toBlockPoint(getX(), getY(), getZ()); } + //FAWE end /** * Creates a 2D vector by dropping the Y component from this vector. * * @return a new {@link Vector2} */ + //FAWE start - getter public Vector2 toVector2() { return Vector2.at(getX(), getZ()); } + //FAWE end @Override public boolean equals(Object obj) { @@ -647,9 +718,12 @@ public abstract class Vector3 { } Vector3 other = (Vector3) obj; + //FAWE start - getter return other.getX() == this.getX() && other.getY() == this.getY() && other.getZ() == this.getZ(); + //FAWE end } + //FAWE start /** * Tests if vectors are equal, accounting for floating point errors * @@ -673,17 +747,21 @@ public abstract class Vector3 { } return true; } + //FAWE end @Override + //FAWE start - XOR over get calculating all values independently public int hashCode() { return (int) getX() ^ (int) getZ() << 12 ^ (int) getY() << 24; } @Override public String toString() { + //FAWE start - getter & ternary String x = (getX() == getBlockX() ? "" + getBlockX() : "" + getX()); String y = (getY() == getBlockY() ? "" + getBlockY() : "" + getY()); String z = (getZ() == getBlockZ() ? "" + getBlockZ() : "" + getZ()); + //FAWE end return "(" + x + ", " + y + ", " + z + ")"; } @@ -691,8 +769,10 @@ public abstract class Vector3 { * Returns a string representation that is supported by the parser. * @return string */ + //FAWE start - getter public String toParserString() { return getX() + "," + getY() + "," + getZ(); } + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/math/convolution/HeightMap.java b/worldedit-core/src/main/java/com/sk89q/worldedit/math/convolution/HeightMap.java index f0b75a9d3..7a73b8e4b 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/math/convolution/HeightMap.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/math/convolution/HeightMap.java @@ -26,7 +26,7 @@ import com.sk89q.worldedit.math.BlockVector2; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.regions.Region; import com.sk89q.worldedit.regions.Regions; -import com.sk89q.worldedit.registry.state.PropertyGroup; +import com.fastasyncworldedit.core.registry.state.PropertyGroup; import com.sk89q.worldedit.world.block.BlockState; import com.sk89q.worldedit.world.block.BlockStateHolder; import com.sk89q.worldedit.world.block.BlockTypes; @@ -43,9 +43,11 @@ import static com.google.common.base.Preconditions.checkNotNull; */ public class HeightMap { + //FAWE start private final boolean layers; - private int[] data; private boolean[] invalid; + //FAWE end + private final int[] data; private final int width; private final int height; @@ -58,6 +60,7 @@ public class HeightMap { * @param session an edit session * @param region the region */ + //FAWE start public HeightMap(EditSession session, Region region) { this(session, region, (Mask) null, false); } @@ -65,6 +68,7 @@ public class HeightMap { public HeightMap(EditSession session, Region region, @Nullable Mask mask) { this(session, region, mask, false); } + //FAWE end public HeightMap(EditSession session, Region region, @Nullable Mask mask, boolean layers) { checkNotNull(session); @@ -87,6 +91,7 @@ public class HeightMap { data = new int[width * height]; invalid = new boolean[data.length]; + //FAWE start if (layers) { BlockVector3 min = region.getMinimumPoint(); int bx = min.getBlockX(); @@ -141,6 +146,7 @@ public class HeightMap { this.layers = layers; } + //FAWE end /** * Apply the filter 'iterations' amount times. @@ -160,6 +166,7 @@ public class HeightMap { newData = filter.filter(newData, width, height); } + //FAWE start - check layers return layers ? applyLayers(newData) : apply(newData); } @@ -249,6 +256,7 @@ public class HeightMap { } return blocksChanged; } + //FAWE end /** * Apply a raw heightmap to the region. @@ -273,6 +281,7 @@ public class HeightMap { BlockState tmpBlock = BlockTypes.AIR.getDefaultState(); // Apply heightmap int index = 0; + //FAWE start for (int z = 0; z < height; ++z) { int zr = z + originZ; for (int x = 0; x < width; ++x, index++) { @@ -326,6 +335,7 @@ public class HeightMap { } } } + //FAWE end // Drop trees to the floor -- TODO diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/math/interpolation/KochanekBartelsInterpolation.java b/worldedit-core/src/main/java/com/sk89q/worldedit/math/interpolation/KochanekBartelsInterpolation.java index b9182bfa9..b26c33647 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/math/interpolation/KochanekBartelsInterpolation.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/math/interpolation/KochanekBartelsInterpolation.java @@ -21,7 +21,7 @@ package com.sk89q.worldedit.math.interpolation; -import com.sk89q.worldedit.math.MutableVector3; +import com.fastasyncworldedit.core.math.MutableVector3; import com.sk89q.worldedit.math.Vector3; import java.util.Collections; @@ -161,12 +161,14 @@ public class KochanekBartelsInterpolation implements Interpolation { final Vector3 c = coeffC[index]; final Vector3 d = coeffD[index]; + //FAWE start double r2 = remainder * remainder; double r3 = r2 * remainder; mutable.mutX((a.getX() * r3 + b.getX() * r2 + c.getX() * remainder + d.getX())); mutable.mutY((a.getY() * r3 + b.getY() * r2 + c.getY() * remainder + d.getY())); mutable.mutZ((a.getZ() * r3 + b.getZ() * r2 + c.getZ() * remainder + d.getZ())); return Vector3.at(mutable.getX(), mutable.getY(), mutable.getZ()); + //FAWE end } @Override diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/math/transform/AffineTransform.java b/worldedit-core/src/main/java/com/sk89q/worldedit/math/transform/AffineTransform.java index 68c7344e2..4261bea20 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/math/transform/AffineTransform.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/math/transform/AffineTransform.java @@ -32,7 +32,9 @@ import java.io.Serializable; * JavaGeom project, * which is licensed under LGPL v2.1.

*/ +//FAWE start - made Serializable public class AffineTransform implements Transform, Serializable { +//FAWE end /** * coefficients for x coordinate. @@ -139,6 +141,7 @@ public class AffineTransform implements Transform, Serializable { return new double[]{m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23}; } + //FAWE start public boolean isOffAxis() { double[] c = coefficients(); for (int i = 0; i < c.length; i++) { @@ -150,6 +153,7 @@ public class AffineTransform implements Transform, Serializable { } return false; } + //FAWE end /** * Computes the determinant of this transform. Can be zero. @@ -294,6 +298,7 @@ public class AffineTransform implements Transform, Serializable { return scale(vec.getX(), vec.getY(), vec.getZ()); } + //FAWE start public boolean isScaled(Vector3 vector) { boolean flip = vector.getX() != 0 && m00 < 0; if (vector.getY() != 0 && m11 < 0) { @@ -317,6 +322,7 @@ public class AffineTransform implements Transform, Serializable { } return flip; } + //FAWE end @Override public Vector3 apply(Vector3 vector) { @@ -335,9 +341,11 @@ public class AffineTransform implements Transform, Serializable { @Override public Transform combine(Transform other) { + //FAWE start - check other identity if (other instanceof Identity || other.isIdentity()) { return this; } else if (other instanceof AffineTransform) { + //FAWE end return concatenate((AffineTransform) other); } else { return new CombinedTransform(this, other); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/regions/AbstractRegion.java b/worldedit-core/src/main/java/com/sk89q/worldedit/regions/AbstractRegion.java index f50c7c28e..c3af94635 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/regions/AbstractRegion.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/regions/AbstractRegion.java @@ -19,7 +19,7 @@ package com.sk89q.worldedit.regions; -import com.fastasyncworldedit.core.object.collection.BlockVectorSet; +import com.fastasyncworldedit.core.math.BlockVectorSet; import com.sk89q.worldedit.math.BlockVector2; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.math.Vector3; @@ -35,7 +35,9 @@ import java.util.List; import java.util.Objects; import java.util.Set; +//FAWE start - extends AbstractSet public abstract class AbstractRegion extends AbstractSet implements Region { +//FAWE end protected World world; @@ -43,10 +45,12 @@ public abstract class AbstractRegion extends AbstractSet implement this.world = world; } + //FAWE start @Override public int size() { return com.google.common.primitives.Ints.saturatedCast(getVolume()); } + //FAWE end @Override public Vector3 getCenter() { @@ -168,8 +172,10 @@ public abstract class AbstractRegion extends AbstractSet implement final BlockVector3 minBlock = getMinimumPoint(); final BlockVector3 maxBlock = getMaximumPoint(); + //FAWE start final BlockVector2 min = BlockVector2.at(minBlock.getX() >> 4, minBlock.getZ() >> 4); final BlockVector2 max = BlockVector2.at(maxBlock.getX() >> 4, maxBlock.getZ() >> 4); + //FAWE end for (int X = min.getBlockX(); X <= max.getBlockX(); ++X) { for (int Z = min.getBlockZ(); Z <= max.getBlockZ(); ++Z) { @@ -218,6 +224,7 @@ public abstract class AbstractRegion extends AbstractSet implement return world == null ? Integer.MAX_VALUE : world.getMaxY(); } + //FAWE start @Override public int hashCode() { int worldHash = this.world == null ? 7 : this.world.hashCode(); @@ -246,5 +253,6 @@ public abstract class AbstractRegion extends AbstractSet implement } return false; } + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/regions/ConvexPolyhedralRegion.java b/worldedit-core/src/main/java/com/sk89q/worldedit/regions/ConvexPolyhedralRegion.java index 0aaac9184..9979cdd74 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/regions/ConvexPolyhedralRegion.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/regions/ConvexPolyhedralRegion.java @@ -329,8 +329,10 @@ public class ConvexPolyhedralRegion extends AbstractRegion { return new ConvexPolyhedralRegion(this); } + //FAWE start @Override public boolean containsEntireCuboid(int bx, int tx, int by, int ty, int bz, int tz) { return false; } + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/regions/CuboidRegion.java b/worldedit-core/src/main/java/com/sk89q/worldedit/regions/CuboidRegion.java index 1c01f3825..ce3f16878 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/regions/CuboidRegion.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/regions/CuboidRegion.java @@ -20,17 +20,17 @@ package com.sk89q.worldedit.regions; import com.fastasyncworldedit.core.FaweCache; -import com.fastasyncworldedit.core.beta.Filter; -import com.fastasyncworldedit.core.beta.IChunk; -import com.fastasyncworldedit.core.beta.IChunkGet; -import com.fastasyncworldedit.core.beta.IChunkSet; -import com.fastasyncworldedit.core.beta.implementation.filter.block.ChunkFilterBlock; +import com.fastasyncworldedit.core.queue.Filter; +import com.fastasyncworldedit.core.queue.IChunk; +import com.fastasyncworldedit.core.queue.IChunkGet; +import com.fastasyncworldedit.core.queue.IChunkSet; +import com.fastasyncworldedit.core.extent.filter.block.ChunkFilterBlock; import com.fastasyncworldedit.core.configuration.Settings; -import com.fastasyncworldedit.core.object.collection.BlockVectorSet; +import com.fastasyncworldedit.core.math.BlockVectorSet; import com.sk89q.worldedit.math.BlockVector2; import com.sk89q.worldedit.math.BlockVector3; -import com.sk89q.worldedit.math.MutableBlockVector2; -import com.sk89q.worldedit.math.MutableBlockVector3; +import com.fastasyncworldedit.core.math.MutableBlockVector2; +import com.fastasyncworldedit.core.math.MutableBlockVector3; import com.sk89q.worldedit.world.World; import com.sk89q.worldedit.world.storage.ChunkStore; import org.jetbrains.annotations.NotNull; @@ -48,13 +48,14 @@ import static com.google.common.base.Preconditions.checkNotNull; */ public class CuboidRegion extends AbstractRegion implements FlatRegion { - + //FAWE start private int minX; private int minY; private int minZ; private int maxX; private int maxY; private int maxZ; + //FAWE end private BlockVector3 pos1; private BlockVector3 pos2; @@ -100,7 +101,9 @@ public class CuboidRegion extends AbstractRegion implements FlatRegion { */ public void setPos1(BlockVector3 pos1) { this.pos1 = pos1; + //FAWE start recalculate(); + //FAWE end } /** @@ -119,7 +122,9 @@ public class CuboidRegion extends AbstractRegion implements FlatRegion { */ public void setPos2(BlockVector3 pos2) { this.pos2 = pos2; + //FAWE start recalculate(); + //FAWE end } /** @@ -129,8 +134,8 @@ public class CuboidRegion extends AbstractRegion implements FlatRegion { if (pos1 == null || pos2 == null) { return; } - pos1 = pos1.clampY(0, world == null ? 255 : world.getMaxY()); - pos2 = pos2.clampY(0, world == null ? 255 : world.getMaxY()); + pos1 = pos1.clampY(getWorldMinY(), getWorldMaxY()); + pos2 = pos2.clampY(getWorldMinY(), getWorldMaxY()); minX = Math.min(pos1.getX(), pos2.getX()); minY = Math.min(pos1.getY(), pos2.getY()); minZ = Math.min(pos1.getZ(), pos2.getZ()); @@ -322,6 +327,7 @@ public class CuboidRegion extends AbstractRegion implements FlatRegion { final int minZ = min.getBlockZ() >> ChunkStore.CHUNK_SHIFTS; final int size = (maxX - minX + 1) * (maxZ - minZ + 1); + //FAWE start return new AbstractSet() { @NotNull @Override @@ -408,10 +414,13 @@ public class CuboidRegion extends AbstractRegion implements FlatRegion { } }; } + //FAWE end @Override public Set getChunkCubes() { + //FAWE start - BlockVectorSet instead of HashMap Set chunks = new BlockVectorSet(); + //FAWE end BlockVector3 min = getMinimumPoint(); BlockVector3 max = getMaximumPoint(); @@ -430,9 +439,12 @@ public class CuboidRegion extends AbstractRegion implements FlatRegion { @Override public boolean contains(BlockVector3 position) { + //FAWE start return contains(position.getX(), position.getY(), position.getZ()); + //FAWE end } + //FAWE start @Override public boolean contains(int x, int y, int z) { return x >= this.minX && x <= this.maxX && z >= this.minZ && z <= this.maxZ && y >= this.minY && y <= this.maxY; @@ -442,13 +454,17 @@ public class CuboidRegion extends AbstractRegion implements FlatRegion { public boolean contains(int x, int z) { return x >= this.minX && x <= this.maxX && z >= this.minZ && z <= this.maxZ; } + //FAWE end @Override public Iterator iterator() { + //FAWE start if (Settings.IMP.HISTORY.COMPRESSION_LEVEL >= 9) { return iterator_old(); } + //FAWE end return new Iterator() { + //FAWE start final MutableBlockVector3 mutable = new MutableBlockVector3(0, 0, 0); private final BlockVector3 min = getMinimumPoint(); private final BlockVector3 max = getMaximumPoint(); @@ -566,6 +582,7 @@ public class CuboidRegion extends AbstractRegion implements FlatRegion { } }; } + //FAWE end @Override public Iterable asFlatRegion() { @@ -621,11 +638,13 @@ public class CuboidRegion extends AbstractRegion implements FlatRegion { return new CuboidRegion(region.getMinimumPoint(), region.getMaximumPoint()); } + //FAWE start public static boolean contains(CuboidRegion region) { BlockVector3 min = region.getMinimumPoint(); BlockVector3 max = region.getMaximumPoint(); return region.contains(min.getBlockX(), min.getBlockY(), min.getBlockZ()) && region.contains(max.getBlockX(), max.getBlockY(), max.getBlockZ()); } + //FAWE end /** * Make a cuboid from the center. @@ -641,6 +660,7 @@ public class CuboidRegion extends AbstractRegion implements FlatRegion { return new CuboidRegion(origin.subtract(size), origin.add(size)); } + //FAWE start public int getMinimumX() { return minX; } @@ -732,7 +752,7 @@ public class CuboidRegion extends AbstractRegion implements FlatRegion { char[] arr = set.load(layer); if (trimX || trimZ) { int indexY = 0; - for (int y = 0; y < 16; y++, indexY += 256) { + for (int y = world.getMinY(); y < 16; y++, indexY += world.getMaxY()) { int index; if (trimZ) { index = indexY; @@ -773,5 +793,6 @@ public class CuboidRegion extends AbstractRegion implements FlatRegion { } return null; } + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/regions/CylinderRegion.java b/worldedit-core/src/main/java/com/sk89q/worldedit/regions/CylinderRegion.java index cb3a4d818..d444d81f9 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/regions/CylinderRegion.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/regions/CylinderRegion.java @@ -19,11 +19,11 @@ package com.sk89q.worldedit.regions; -import com.fastasyncworldedit.core.beta.Filter; -import com.fastasyncworldedit.core.beta.IChunk; -import com.fastasyncworldedit.core.beta.IChunkGet; -import com.fastasyncworldedit.core.beta.IChunkSet; -import com.fastasyncworldedit.core.beta.implementation.filter.block.ChunkFilterBlock; +import com.fastasyncworldedit.core.queue.Filter; +import com.fastasyncworldedit.core.queue.IChunk; +import com.fastasyncworldedit.core.queue.IChunkGet; +import com.fastasyncworldedit.core.queue.IChunkSet; +import com.fastasyncworldedit.core.extent.filter.block.ChunkFilterBlock; import com.fastasyncworldedit.core.configuration.Caption; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.math.BlockVector2; @@ -185,18 +185,11 @@ public class CylinderRegion extends AbstractRegion implements FlatRegion { @Override public int getMaximumY() { - int worldMax = world != null ? world.getMaxY() - 1 : 255; - if (maxY > worldMax) { - return maxY = worldMax; - } return maxY; } @Override public int getMinimumY() { - if (minY < 0) { - return minY = 0; - } return minY; } @@ -304,7 +297,7 @@ public class CylinderRegion extends AbstractRegion implements FlatRegion { /** * Checks to see if a point is inside this region. */ - /* Slow and unnecessary + /* FAWE start - Slow and unnecessary @Override public boolean contains(BlockVector3 position) { final int blockY = position.getBlockY(); @@ -339,6 +332,7 @@ public class CylinderRegion extends AbstractRegion implements FlatRegion { public boolean contains(BlockVector3 position) { return contains(position.getX(), position.getY(), position.getZ()); } + //FAWE end /** * Sets the height of the cylinder to fit the specified Y. @@ -413,6 +407,7 @@ public class CylinderRegion extends AbstractRegion implements FlatRegion { return new CylinderRegion(center, radiusVec, minY, maxY); } + //FAWE start @Override public void filter(final IChunk chunk, final Filter filter, final ChunkFilterBlock block, final IChunkGet get, final IChunkSet set, boolean full) { @@ -426,4 +421,5 @@ public class CylinderRegion extends AbstractRegion implements FlatRegion { } super.filter(chunk, filter, block, get, set, full); } + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/regions/EllipsoidRegion.java b/worldedit-core/src/main/java/com/sk89q/worldedit/regions/EllipsoidRegion.java index 448c1cf6d..72dd2ac7c 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/regions/EllipsoidRegion.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/regions/EllipsoidRegion.java @@ -20,11 +20,11 @@ package com.sk89q.worldedit.regions; -import com.fastasyncworldedit.core.beta.Filter; -import com.fastasyncworldedit.core.beta.IChunk; -import com.fastasyncworldedit.core.beta.IChunkGet; -import com.fastasyncworldedit.core.beta.IChunkSet; -import com.fastasyncworldedit.core.beta.implementation.filter.block.ChunkFilterBlock; +import com.fastasyncworldedit.core.queue.Filter; +import com.fastasyncworldedit.core.queue.IChunk; +import com.fastasyncworldedit.core.queue.IChunkGet; +import com.fastasyncworldedit.core.queue.IChunkSet; +import com.fastasyncworldedit.core.extent.filter.block.ChunkFilterBlock; import com.fastasyncworldedit.core.configuration.Caption; import com.fastasyncworldedit.core.util.MathMan; import com.sk89q.worldedit.math.BlockVector2; @@ -53,10 +53,12 @@ public class EllipsoidRegion extends AbstractRegion { */ private Vector3 radius; + //FAWE start private Vector3 radiusSqr; private Vector3 inverseRadius; private int radiusLengthSqr; private boolean sphere; + //FAWE end /** * Construct a new instance of this ellipsoid region. @@ -194,10 +196,12 @@ public class EllipsoidRegion extends AbstractRegion { */ public void setRadius(Vector3 radius) { this.radius = radius.add(0.5, 0.5, 0.5); + //FAWE start radiusSqr = radius.multiply(radius); radiusLengthSqr = (int) radiusSqr.getX(); this.sphere = radius.getY() == radius.getX() && radius.getX() == radius.getZ(); inverseRadius = Vector3.ONE.divide(radius); + //FAWE end } @Override @@ -224,6 +228,7 @@ public class EllipsoidRegion extends AbstractRegion { return chunks; } + //FAWE start @Override public boolean contains(int x, int y, int z) { int cx = x - center.getBlockX(); @@ -238,7 +243,7 @@ public class EllipsoidRegion extends AbstractRegion { } int cy = y - center.getBlockY(); int cy2 = cy * cy; - if (radiusSqr.getBlockY() < 255 && cy2 > radiusSqr.getBlockY()) { + if (radiusSqr.getBlockY() < world.getMaxY() && cy2 > radiusSqr.getBlockY()) { return false; } if (sphere) { @@ -250,13 +255,13 @@ public class EllipsoidRegion extends AbstractRegion { return cxd + cyd + czd <= 1; } - /* + /* FAWE start /* Slow and unnecessary @Override public boolean contains(BlockVector3 position) { return position.subtract(center).toVector3().divide(radius).lengthSq() <= 1; } - */ + */ @Override public boolean contains(BlockVector3 position) { @@ -279,6 +284,7 @@ public class EllipsoidRegion extends AbstractRegion { double czd = cz2 * inverseRadius.getZ(); return cxd + czd <= 1; } + //FAWE end /** * Returns string representation in the format @@ -300,6 +306,7 @@ public class EllipsoidRegion extends AbstractRegion { return (EllipsoidRegion) super.clone(); } + //FAWE start private void filterSpherePartial(int y1, int y2, int bx, int bz, Filter filter, ChunkFilterBlock block, IChunkGet get, IChunkSet set) { int minSection = y1 >> 4; @@ -311,7 +318,7 @@ public class EllipsoidRegion extends AbstractRegion { filterSpherePartial(minSection, 0, 15, bx, bz, filter, block, get, set); } - if (yStart != 0) { + if (yStart != world.getMinY()) { filterSpherePartial(minSection, yStart, 15, bx, bz, filter, block, get, set); minSection++; } @@ -405,28 +412,28 @@ public class EllipsoidRegion extends AbstractRegion { int cy = center.getBlockY(); int diffYFull = MathMan.usqrt(diffY2); - int yBotFull = Math.max(0, cy - diffYFull); - int yTopFull = Math.min(255, cy + diffYFull); + int yBotFull = Math.max(world.getMinY(), cy - diffYFull); + int yTopFull = Math.min(world.getMaxY(), cy + diffYFull); if (yBotFull == yTopFull || yBotFull > yTopFull) { } // Set those layers filter(chunk, filter, block, get, set, yBotFull, yTopFull, full); - if (yBotFull == 0 && yTopFull == 255) { + if (yBotFull == world.getMinY() && yTopFull == world.getMaxY()) { return; } int diffYPartial = MathMan.usqrt(radiusLengthSqr - cxMin * cxMin - czMin * czMin); //Fill the remaining layers - if (yBotFull != 0) { - int yBotPartial = Math.max(0, cy - diffYPartial); + if (yBotFull != world.getMinY()) { + int yBotPartial = Math.max(world.getMinY(), cy - diffYPartial); filterSpherePartial(yBotPartial, yBotFull - 1, bx, bz, filter, block, get, set); } - if (yTopFull != 255) { - int yTopPartial = Math.min(255, cy + diffYPartial); + if (yTopFull != world.getMaxY()) { + int yTopPartial = Math.min(world.getMaxY(), cy + diffYPartial); filterSpherePartial(yTopFull + 1, yTopPartial, bx, bz, filter, block, get, set); } @@ -434,4 +441,5 @@ public class EllipsoidRegion extends AbstractRegion { super.filter(chunk, filter, block, get, set, full); } } + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/regions/Polygonal2DRegion.java b/worldedit-core/src/main/java/com/sk89q/worldedit/regions/Polygonal2DRegion.java index ca04fa030..9f08c0f39 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/regions/Polygonal2DRegion.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/regions/Polygonal2DRegion.java @@ -291,6 +291,7 @@ public class Polygonal2DRegion extends AbstractRegion implements FlatRegion { recalculate(); } + //FAWE start @Override public boolean contains(int targetX, int targetZ) { boolean inside = false; @@ -344,6 +345,7 @@ public class Polygonal2DRegion extends AbstractRegion implements FlatRegion { return inside; } + //FAWE end @Override public boolean contains(BlockVector3 position) { @@ -501,6 +503,7 @@ public class Polygonal2DRegion extends AbstractRegion implements FlatRegion { return points; } + //FAWE start @Override public boolean containsEntireCuboid(int bx, int tx, int by, int ty, int bz, int tz) { for (int x = bx; x <= tx; x++) { @@ -525,4 +528,5 @@ public class Polygonal2DRegion extends AbstractRegion implements FlatRegion { } return true; } + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/regions/Region.java b/worldedit-core/src/main/java/com/sk89q/worldedit/regions/Region.java index efef13577..020f6e457 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/regions/Region.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/regions/Region.java @@ -19,15 +19,15 @@ package com.sk89q.worldedit.regions; -import com.fastasyncworldedit.core.beta.Filter; -import com.fastasyncworldedit.core.beta.IBatchProcessor; -import com.fastasyncworldedit.core.beta.IChunk; -import com.fastasyncworldedit.core.beta.IChunkGet; -import com.fastasyncworldedit.core.beta.IChunkSet; -import com.fastasyncworldedit.core.beta.implementation.filter.block.ChunkFilterBlock; -import com.fastasyncworldedit.core.beta.implementation.processors.ProcessorScope; +import com.fastasyncworldedit.core.queue.Filter; +import com.fastasyncworldedit.core.queue.IBatchProcessor; +import com.fastasyncworldedit.core.queue.IChunk; +import com.fastasyncworldedit.core.queue.IChunkGet; +import com.fastasyncworldedit.core.queue.IChunkSet; +import com.fastasyncworldedit.core.extent.filter.block.ChunkFilterBlock; +import com.fastasyncworldedit.core.extent.processor.ProcessorScope; import com.fastasyncworldedit.core.object.FaweLimit; -import com.fastasyncworldedit.core.object.extent.SingleRegionExtent; +import com.fastasyncworldedit.core.extent.SingleRegionExtent; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.internal.util.DeprecationUtil; import com.sk89q.worldedit.internal.util.NonAbstractForCompatibility; @@ -45,7 +45,9 @@ import javax.annotation.Nullable; /** * Represents a physical shape. */ +//FAWE start - IBatchProcessor public interface Region extends Iterable, Cloneable, IBatchProcessor { +//FAWE end /** * Get the lower point of a region. @@ -61,9 +63,11 @@ public interface Region extends Iterable, Cloneable, IBatchProcess */ BlockVector3 getMaximumPoint(); + //FAWE start default BlockVector3 getDimensions() { return getMaximumPoint().subtract(getMinimumPoint()).add(1, 1, 1); } + //FAWE end /** * Get the center point of a region. @@ -157,20 +161,6 @@ public interface Region extends Iterable, Cloneable, IBatchProcess */ void shift(BlockVector3 change) throws RegionOperationException; - default boolean contains(int x, int y, int z) { - return contains(BlockVector3.at(x, y, z)); - } - - default boolean contains(int x, int z) { - return contains(BlockVector3.at(x, 0, z)); - } - - default boolean isGlobal() { - BlockVector3 pos1 = getMinimumPoint(); - BlockVector3 pos2 = getMaximumPoint(); - return pos1.getBlockX() == Integer.MIN_VALUE && pos1.getBlockZ() == Integer.MIN_VALUE && pos2.getBlockX() == Integer.MAX_VALUE && pos2.getBlockZ() == Integer.MAX_VALUE && pos1.getBlockY() <= 0 && pos2.getBlockY() >= 255; - } - /** * Returns true based on whether the region contains the point. * @@ -222,6 +212,21 @@ public interface Region extends Iterable, Cloneable, IBatchProcess */ List polygonize(int maxPoints); + //FAWE start + default boolean contains(int x, int y, int z) { + return contains(BlockVector3.at(x, y, z)); + } + + default boolean contains(int x, int z) { + return contains(BlockVector3.at(x, 0, z)); + } + + default boolean isGlobal() { + BlockVector3 pos1 = getMinimumPoint(); + BlockVector3 pos2 = getMaximumPoint(); + return pos1.getBlockX() == Integer.MIN_VALUE && pos1.getBlockZ() == Integer.MIN_VALUE && pos2.getBlockX() == Integer.MAX_VALUE && pos2.getBlockZ() == Integer.MAX_VALUE && pos1.getBlockY() <= 0 && pos2.getBlockY() >= 255; + } + default int getMinimumY() { return getMinimumPoint().getY(); } @@ -265,7 +270,6 @@ public interface Region extends Iterable, Cloneable, IBatchProcess for (int layer = minSection; layer <= maxSection; layer++) { filter(chunk, filter, block, get, set, layer, full); } - return; } default void filter(final IChunk chunk, final Filter filter, ChunkFilterBlock block, final IChunkGet get, final IChunkSet set, int layer, boolean full) { diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/regions/RegionIntersection.java b/worldedit-core/src/main/java/com/sk89q/worldedit/regions/RegionIntersection.java index 1e666e9dd..dd4a37231 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/regions/RegionIntersection.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/regions/RegionIntersection.java @@ -19,9 +19,9 @@ package com.sk89q.worldedit.regions; -import com.fastasyncworldedit.core.beta.IChunk; -import com.fastasyncworldedit.core.beta.IChunkGet; -import com.fastasyncworldedit.core.beta.IChunkSet; +import com.fastasyncworldedit.core.queue.IChunk; +import com.fastasyncworldedit.core.queue.IChunkGet; +import com.fastasyncworldedit.core.queue.IChunkSet; import com.fastasyncworldedit.core.configuration.Caption; import com.google.common.collect.Iterators; import com.google.common.collect.Sets; @@ -146,6 +146,7 @@ public class RegionIntersection extends AbstractRegion { } + //FAWE start @Override public boolean containsEntireCuboid(int bx, int tx, int by, int ty, int bz, int tz) { for (Region region : regions) { @@ -237,4 +238,5 @@ public class RegionIntersection extends AbstractRegion { } return false; } + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/regions/selector/ConvexPolyhedralRegionSelector.java b/worldedit-core/src/main/java/com/sk89q/worldedit/regions/selector/ConvexPolyhedralRegionSelector.java index 572abc6cf..1ae6815fc 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/regions/selector/ConvexPolyhedralRegionSelector.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/regions/selector/ConvexPolyhedralRegionSelector.java @@ -71,10 +71,12 @@ public class ConvexPolyhedralRegionSelector implements RegionSelector, CUIRegion region = new ConvexPolyhedralRegion(world); } + //FAWE start public ConvexPolyhedralRegionSelector(ConvexPolyhedralRegion region) { checkNotNull(region); this.region = region; } + //FAWE end /** * Create a new selector. @@ -277,8 +279,10 @@ public class ConvexPolyhedralRegionSelector implements RegionSelector, CUIRegion } } + //FAWE start @Override public List getVertices() { return new ArrayList<>(region.getVertices()); } + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/regions/selector/CuboidRegionSelector.java b/worldedit-core/src/main/java/com/sk89q/worldedit/regions/selector/CuboidRegionSelector.java index 14ec279e0..4d0fea61d 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/regions/selector/CuboidRegionSelector.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/regions/selector/CuboidRegionSelector.java @@ -316,8 +316,10 @@ public class CuboidRegionSelector implements RegionSelector, CUIRegion { return "cuboid"; } + //FAWE start @Override public List getVertices() { return Arrays.asList(position1, position2); } + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/regions/selector/CylinderRegionSelector.java b/worldedit-core/src/main/java/com/sk89q/worldedit/regions/selector/CylinderRegionSelector.java index f728674d4..f6aa1b818 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/regions/selector/CylinderRegionSelector.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/regions/selector/CylinderRegionSelector.java @@ -70,10 +70,12 @@ public class CylinderRegionSelector implements RegionSelector, CUIRegion { this((World) null); } + //FAWE start public CylinderRegionSelector(CylinderRegion region) { checkNotNull(region); this.region = region; } + //FAWE end /** * Create a new region selector. diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/regions/selector/Polygonal2DRegionSelector.java b/worldedit-core/src/main/java/com/sk89q/worldedit/regions/selector/Polygonal2DRegionSelector.java index 4279f1516..2fb951786 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/regions/selector/Polygonal2DRegionSelector.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/regions/selector/Polygonal2DRegionSelector.java @@ -69,9 +69,11 @@ public class Polygonal2DRegionSelector implements RegionSelector, CUIRegion { } + //FAWE start public Polygonal2DRegionSelector(Polygonal2DRegion region) { this.region = region; } + //FAWE end /** * Create a new selector from another one. diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/regions/shape/ArbitraryBiomeShape.java b/worldedit-core/src/main/java/com/sk89q/worldedit/regions/shape/ArbitraryBiomeShape.java index 56d5cb212..7e5457bef 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/regions/shape/ArbitraryBiomeShape.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/regions/shape/ArbitraryBiomeShape.java @@ -42,12 +42,14 @@ public abstract class ArbitraryBiomeShape { private final int cacheSizeY; private final int cacheSizeZ; + //FAWE start /** * Cache entries. * null = unknown * OUTSIDE = outside * else = inside */ + //FAWE end private final BiomeType[] cache; private final BitSet isCached; @@ -96,6 +98,7 @@ public abstract class ArbitraryBiomeShape { return cache[index]; } + //FAWE start private boolean isInsideCached(int x, int y, int z, BiomeType baseBiome) { final int index = (y - cacheOffsetY) + (z - cacheOffsetZ) * cacheSizeY + (x - cacheOffsetX) * cacheSizeY * cacheSizeZ; @@ -107,6 +110,7 @@ public abstract class ArbitraryBiomeShape { return cacheEntry != BiomeTypes.THE_VOID; } + //FAWE end private boolean isOutside(int x, int y, int z, BiomeType baseBiome) { return getBiomeCached(x, y, z, baseBiome) == null; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/regions/shape/WorldEditExpressionEnvironment.java b/worldedit-core/src/main/java/com/sk89q/worldedit/regions/shape/WorldEditExpressionEnvironment.java index 1010aa356..40c397bc6 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/regions/shape/WorldEditExpressionEnvironment.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/regions/shape/WorldEditExpressionEnvironment.java @@ -23,14 +23,16 @@ import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.internal.expression.ExpressionEnvironment; import com.sk89q.worldedit.math.BlockVector3; -import com.sk89q.worldedit.math.MutableVector3; +import com.fastasyncworldedit.core.math.MutableVector3; import com.sk89q.worldedit.math.Vector3; public class WorldEditExpressionEnvironment implements ExpressionEnvironment { private final Vector3 unit; private final Vector3 zero2; + //FAWE start - MutableVector3 private Vector3 current = new MutableVector3(Vector3.ZERO); + //FAWE end private final Extent extent; public WorldEditExpressionEnvironment(EditSession editSession, Vector3 unit, Vector3 zero) { @@ -48,10 +50,6 @@ public class WorldEditExpressionEnvironment implements ExpressionEnvironment { return Vector3.at(x, y, z).multiply(unit).add(zero2).toBlockPoint(); } - public Vector3 toWorldRel(double x, double y, double z) { - return current.add(x, y, z); - } - @SuppressWarnings("deprecation") @Override public int getBlockType(double x, double y, double z) { @@ -88,10 +86,16 @@ public class WorldEditExpressionEnvironment implements ExpressionEnvironment { return extent.getBlock(toWorld(x, y, z)).getBlockType().getLegacyCombinedId() & 0xF; } + //FAWE start public void setCurrentBlock(int x, int y, int z) { current.setComponents(x, y, z); } + public Vector3 toWorldRel(double x, double y, double z) { + return current.add(x, y, z); + } + //FAWe end + public void setCurrentBlock(Vector3 current) { this.current = current; } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/registry/Category.java b/worldedit-core/src/main/java/com/sk89q/worldedit/registry/Category.java index 800cb5ceb..ae41c2cba 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/registry/Category.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/registry/Category.java @@ -19,10 +19,15 @@ package com.sk89q.worldedit.registry; +import com.fastasyncworldedit.core.registry.RegistryItem; + import java.util.HashSet; import java.util.Set; +//FAWE start - implements RegistryItem public abstract class Category implements RegistryItem { +//FAWE end + private final Set set = new HashSet<>(); protected final String id; private boolean empty = true; @@ -43,6 +48,7 @@ public abstract class Category implements RegistryItem { return this.set; } + //FAWE start private int internalId; @Override @@ -56,6 +62,7 @@ public abstract class Category implements RegistryItem { } protected abstract Set load(); + //FAWE end /** * Checks if this category contains {@code object}. diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/registry/NamespacedRegistry.java b/worldedit-core/src/main/java/com/sk89q/worldedit/registry/NamespacedRegistry.java index 3f8bca337..e915667f9 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/registry/NamespacedRegistry.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/registry/NamespacedRegistry.java @@ -19,6 +19,7 @@ package com.sk89q.worldedit.registry; +import com.fastasyncworldedit.core.registry.RegistryItem; import com.sk89q.worldedit.command.util.SuggestionHelper; import javax.annotation.Nullable; @@ -36,8 +37,10 @@ public final class NamespacedRegistry extends Registry { private static final String MINECRAFT_NAMESPACE = "minecraft"; private final Set knownNamespaces = new HashSet<>(); private final String defaultNamespace; + //FAWE start private final List values = new ArrayList<>(); private int lastInternalId = 0; + //FAWE end public NamespacedRegistry(final String name) { this(name, MINECRAFT_NAMESPACE); @@ -59,15 +62,18 @@ public final class NamespacedRegistry extends Registry { requireNonNull(key, "key"); final int i = key.indexOf(':'); checkState(i > 0, "key is not namespaced"); + //FAWE start if (value instanceof RegistryItem) { ((RegistryItem) value).setInternalId(lastInternalId++); } values.add(value); + //FAWE end final V registered = super.register(key, value); knownNamespaces.add(key.substring(0, i)); return registered; } + //FAWE start public V getByInternalId(int index) { try { return values.get(index); @@ -79,6 +85,7 @@ public final class NamespacedRegistry extends Registry { public int size() { return values.size(); } + //FAWE end /** * Get a set of the namespaces of all registered keys. @@ -105,7 +112,9 @@ public final class NamespacedRegistry extends Registry { return key; } + //FAWE start public Stream getSuggestions(String input) { return SuggestionHelper.getNamespacedRegistrySuggestions(this, input); } + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/registry/Registry.java b/worldedit-core/src/main/java/com/sk89q/worldedit/registry/Registry.java index b4c4a800f..3b1d3aa0c 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/registry/Registry.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/registry/Registry.java @@ -43,9 +43,11 @@ public class Registry implements Iterable { return name; } + //FAWE start public Map getMap() { return map; } + //FAWE end @Nullable public V get(final String key) { @@ -62,9 +64,11 @@ public class Registry implements Iterable { return value; } + //FAWE start public void clear() { this.map.clear(); } + //FAWE end public Set keySet() { return Collections.unmodifiableSet(this.map.keySet()); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/registry/state/AbstractProperty.java b/worldedit-core/src/main/java/com/sk89q/worldedit/registry/state/AbstractProperty.java index fe782fff3..78f370516 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/registry/state/AbstractProperty.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/registry/state/AbstractProperty.java @@ -19,6 +19,7 @@ package com.sk89q.worldedit.registry.state; +import com.fastasyncworldedit.core.registry.state.PropertyKey; import com.fastasyncworldedit.core.util.MathMan; import com.sk89q.worldedit.world.block.BlockTypesCache; import org.jetbrains.annotations.Nullable; @@ -29,10 +30,13 @@ import static com.google.common.base.Preconditions.checkState; public abstract class AbstractProperty implements Property { + //FAWE start private final PropertyKey key; + //FAWE end private String name; private final List values; + //FAWE start private final int bitMask; private final int bitMaskInverse; private final int bitOffset; @@ -45,6 +49,7 @@ public abstract class AbstractProperty implements Property { public AbstractProperty(final String name, final List values, int bitOffset) { this.name = name; this.values = values; + //FAWE end this.numBits = MathMan.log2nlz(values.size()); this.bitOffset = bitOffset + BlockTypesCache.BIT_OFFSET; this.bitMask = (((1 << numBits) - 1)) << this.bitOffset; @@ -52,6 +57,7 @@ public abstract class AbstractProperty implements Property { this.key = PropertyKey.getOrCreate(name); } + //FAWE start @Override public PropertyKey getKey() { return key; @@ -95,31 +101,13 @@ public abstract class AbstractProperty implements Property { public int getIndex(int state) { return (state & bitMask) >> bitOffset; } + //FAWE end @Override public List getValues() { return this.values; } - @Nullable - @Override - public T getValueFor(String string) throws IllegalArgumentException { - return (T) string; - } - - @Override - public String getName() { - return this.name; - } - - /** - * Internal method for name setting post-deserialise. Do not use. - */ - public void setName(final String name) { - checkState(this.name == null, "name already set"); - this.name = name; - } - @Override public String toString() { return getClass().getSimpleName() + "{name=" + name + "}"; @@ -130,6 +118,26 @@ public abstract class AbstractProperty implements Property { return name.hashCode(); } + @Override + public String getName() { + return this.name; + } + + //FAWE start + @Nullable + @Override + public T getValueFor(String string) throws IllegalArgumentException { + return (T) string; + } + + /** + * Internal method for name setting post-deserialise. Do not use. + */ + public void setName(final String name) { + checkState(this.name == null, "name already set"); + this.name = name; + } + @Override public boolean equals(Object obj) { if (!(obj instanceof Property)) { @@ -137,4 +145,5 @@ public abstract class AbstractProperty implements Property { } return getName().equals(((Property) obj).getName()); } + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/registry/state/BooleanProperty.java b/worldedit-core/src/main/java/com/sk89q/worldedit/registry/state/BooleanProperty.java index beb514f17..2a06a7390 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/registry/state/BooleanProperty.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/registry/state/BooleanProperty.java @@ -24,7 +24,8 @@ import javax.annotation.Nullable; public class BooleanProperty extends AbstractProperty { - private int defaultIndex; + //FAWE start + private final int defaultIndex; public BooleanProperty(final String name, final List values) { this(name, values, 0); @@ -56,6 +57,7 @@ public class BooleanProperty extends AbstractProperty { return -1; } } + //FAWE end @Nullable @Override diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/registry/state/DirectionalProperty.java b/worldedit-core/src/main/java/com/sk89q/worldedit/registry/state/DirectionalProperty.java index d265a4ed8..2a437144a 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/registry/state/DirectionalProperty.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/registry/state/DirectionalProperty.java @@ -28,12 +28,9 @@ import javax.annotation.Nullable; public class DirectionalProperty extends AbstractProperty { + //FAWE start private final int[] map; - public DirectionalProperty(final String name, final List values) { - this(name, values, 0); - } - private DirectionalProperty(final String name, final List values, int bitOffset) { super(name, values, bitOffset); this.map = new int[Direction.values().length]; @@ -61,6 +58,11 @@ public class DirectionalProperty extends AbstractProperty { } return getIndex(dir); } + //FAWE end + + public DirectionalProperty(final String name, final List values) { + this(name, values, 0); + } @Nullable @Override diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/registry/state/EnumProperty.java b/worldedit-core/src/main/java/com/sk89q/worldedit/registry/state/EnumProperty.java index 1041b8fc3..10d2763e7 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/registry/state/EnumProperty.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/registry/state/EnumProperty.java @@ -26,12 +26,15 @@ import javax.annotation.Nullable; public class EnumProperty extends AbstractProperty { - private Map offsets = new HashMap<>(); + //FAWE start + private final Map offsets = new HashMap<>(); + //FAWE end public EnumProperty(final String name, final List values) { this(name, values, 0); } + //FAWE start private EnumProperty(final String name, final List values, int bitOffset) { super(name, values, bitOffset); for (int i = 0; i < values.size(); i++) { @@ -51,6 +54,7 @@ public class EnumProperty extends AbstractProperty { Integer value = offsets.get(string); return value == null ? -1 : value; } + //FAWE end @Nullable @Override diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/registry/state/IntegerProperty.java b/worldedit-core/src/main/java/com/sk89q/worldedit/registry/state/IntegerProperty.java index 3177a577b..df8e2b8eb 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/registry/state/IntegerProperty.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/registry/state/IntegerProperty.java @@ -27,12 +27,15 @@ import javax.annotation.Nullable; public class IntegerProperty extends AbstractProperty { + //FAWE start private final int[] map; + //FAWE end public IntegerProperty(final String name, final List values) { this(name, values, 0); } + //FAWE start private IntegerProperty(final String name, final List values, int bitOffset) { super(name, values, bitOffset); int max = Collections.max(values); @@ -73,6 +76,7 @@ public class IntegerProperty extends AbstractProperty { } */ // An exception will get thrown anyway if the property doesn't exist, so it's not really that important. Anyway, we can check the array instead of the string list + //FAWE end if (val > 0 && val >= map.length) { throw new IllegalArgumentException("Invalid int value: " + string + ". Must be in " + getValues().toString()); } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/registry/state/Property.java b/worldedit-core/src/main/java/com/sk89q/worldedit/registry/state/Property.java index df69851b9..620b4ffd2 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/registry/state/Property.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/registry/state/Property.java @@ -19,6 +19,8 @@ package com.sk89q.worldedit.registry.state; +import com.fastasyncworldedit.core.registry.state.PropertyKey; + import java.util.List; import javax.annotation.Nullable; @@ -44,10 +46,6 @@ public interface Property { */ List getValues(); - default int getIndex(T value) { - return getValues().indexOf(value); - } - /** * Gets the value for the given string, or null. * @@ -58,6 +56,11 @@ public interface Property { @Nullable T getValueFor(String string) throws IllegalArgumentException; + //FAWE start + default int getIndex(T value) { + return getValues().indexOf(value); + } + default int getIndexFor(CharSequence string) throws IllegalArgumentException { return getIndex(getValueFor(string.toString())); } @@ -65,4 +68,5 @@ public interface Property { default PropertyKey getKey() { return PropertyKey.getOrCreate(getName()); } + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/session/ClipboardHolder.java b/worldedit-core/src/main/java/com/sk89q/worldedit/session/ClipboardHolder.java index c74b594ef..ecfa5f220 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/session/ClipboardHolder.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/session/ClipboardHolder.java @@ -63,6 +63,7 @@ public class ClipboardHolder { return clipboard; } + //FAWE start /** * Gets all currently held clipboards. * @return all clipboards being held. @@ -84,6 +85,7 @@ public class ClipboardHolder { public List getHolders() { return Collections.singletonList(this); } + //FAWE end /** * Set the transform. diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/session/PasteBuilder.java b/worldedit-core/src/main/java/com/sk89q/worldedit/session/PasteBuilder.java index 97ca107d3..5d6f5e6ec 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/session/PasteBuilder.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/session/PasteBuilder.java @@ -83,7 +83,7 @@ public class PasteBuilder { * This provides a more flexible alternative to {@link #ignoreAirBlocks(boolean)}, for example * one might want to ignore structure void if copying a Minecraft Structure, etc. * - * @param sourceMask + * @param sourceMask the mask for the source * @return this builder instance */ public PasteBuilder maskSource(Mask sourceMask) { @@ -109,7 +109,7 @@ public class PasteBuilder { * Set whether the copy should include source entities. * Note that this is true by default for legacy reasons. * - * @param copyEntities + * @param copyEntities if entities should be copied * @return this builder instance */ public PasteBuilder copyEntities(boolean copyEntities) { @@ -120,17 +120,20 @@ public class PasteBuilder { /** * Set whether the copy should include source biomes (if available). * - * @param copyBiomes + * @param copyBiomes if biomes should be copied * @return this builder instance */ public PasteBuilder copyBiomes(boolean copyBiomes) { this.copyBiomes = copyBiomes; return this; } + + //FAWE start public PasteBuilder filter(RegionFunction function) { this.canApply = function; return this; } + //FAWE end /** * Build the operation. @@ -138,19 +141,24 @@ public class PasteBuilder { * @return the operation */ public Operation build() { + //FAWE start Extent extent = clipboard; if (!transform.isIdentity()) { extent = new BlockTransformExtent(extent, transform); } + //FAWE end ForwardExtentCopy copy = new ForwardExtentCopy(extent, clipboard.getRegion(), clipboard.getOrigin(), targetExtent, to); copy.setTransform(transform); + //FAWE start copy.setCopyingEntities(copyEntities); copy.setCopyingBiomes(copyBiomes && clipboard.hasBiomes()); if (this.canApply != null) { copy.setFilterFunction(this.canApply); } + //FAWE end if (ignoreAirBlocks) { + //FAWE start - respect clipboard sourceMask = MaskIntersection.of(sourceMask, new ExistingBlockMask(clipboard)); } if (targetExtent instanceof EditSession) { @@ -164,6 +172,7 @@ public class PasteBuilder { sourceMask = MaskIntersection.of(sourceMask, esSourceMask); } } + //FAWE end if (sourceMask != null && sourceMask != Masks.alwaysTrue()) { copy.setSourceMask(sourceMask); } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/session/SessionManager.java b/worldedit-core/src/main/java/com/sk89q/worldedit/session/SessionManager.java index 1e3841147..269c8911f 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/session/SessionManager.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/session/SessionManager.java @@ -71,7 +71,6 @@ public class SessionManager { private static final ListeningExecutorService executorService = MoreExecutors.listeningDecorator( EvenMoreExecutors.newBoundedCachedThreadPool(0, 1, 5, "WorldEdit Session Saver - %s")); private static final Logger LOGGER = LogManagerCompat.getLogger(); - private static boolean warnedInvalidTool; private final Timer timer = new Timer("WorldEdit Session Manager"); private final WorldEdit worldEdit; @@ -169,6 +168,7 @@ public class SessionManager { session.setConfiguration(config); session.setBlockChangeLimit(config.defaultChangeLimit); session.setTimeout(config.calculationTimeout); + //FAWE start /* try { if (owner.hasPermission("worldedit.selection.pos")) { @@ -184,6 +184,7 @@ public class SessionManager { } } */ + //FAWE end // Remember the session regardless of if it's currently active or not. // And have the SessionTracker FLUSH inactive sessions. @@ -328,8 +329,10 @@ public class SessionManager { stored.lastActive = now; if (stored.session.compareAndResetDirty()) { + //FAWE start // Don't save unless player disconnects // saveQueue.put(stored.key, stored.session); + //FAWE end } } else { if (now - stored.lastActive > EXPIRATION_GRACE) { @@ -350,7 +353,7 @@ public class SessionManager { @Subscribe public void onConfigurationLoad(ConfigurationLoadEvent event) { LocalConfiguration config = event.getConfiguration(); - File dir = new File(config.getWorkingDirectory(), "sessions"); + File dir = new File(config.getWorkingDirectoryPath().toFile(), "sessions"); store = new JsonFileSessionStore(dir); } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/session/request/Request.java b/worldedit-core/src/main/java/com/sk89q/worldedit/session/request/Request.java index 7dbc9b08b..25f8ae601 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/session/request/Request.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/session/request/Request.java @@ -36,21 +36,26 @@ import java.util.concurrent.ConcurrentHashMap; public final class Request { private static final ThreadLocal threadLocal = ThreadLocal.withInitial(Request::new); + //FAWE start // TODO any better way to deal with this? private static final Map requests = new ConcurrentHashMap<>(); + //FAWE end @Nullable private World world; @Nullable - private Actor actor; - @Nullable private LocalSession session; @Nullable private EditSession editSession; + private boolean valid; + //FAWE start + @Nullable + private Actor actor; @Nullable private Extent extent; - private boolean valid; + //FAWE end + //FAWE start private Request() { requests.put(Thread.currentThread(), this); } @@ -58,6 +63,7 @@ public final class Request { public static Collection getAll() { return requests.values(); } + //FAWE end /** * Get the request world. @@ -78,6 +84,7 @@ public final class Request { this.world = world; } + //FAWE start public void setExtent(@Nullable Extent extent) { this.extent = extent; } @@ -104,6 +111,7 @@ public final class Request { public void setActor(@Nullable Actor actor) { this.actor = actor; } + //FAWE end /** * Get the request session. @@ -115,6 +123,7 @@ public final class Request { return session; } + //FAWE start /** * Get the request session. * @@ -123,6 +132,7 @@ public final class Request { public void setSession(@Nullable LocalSession session) { this.session = session; } + //FAWE end /** * Get the {@link EditSession}. @@ -158,7 +168,9 @@ public final class Request { public static void reset() { request().invalidate(); threadLocal.remove(); + //FAWE start requests.remove(Thread.currentThread()); + //FAWE end } /** diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/session/request/RequestExtent.java b/worldedit-core/src/main/java/com/sk89q/worldedit/session/request/RequestExtent.java index 685cec334..148936629 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/session/request/RequestExtent.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/session/request/RequestExtent.java @@ -90,10 +90,12 @@ public class RequestExtent implements Extent { return getExtent().getBiome(position); } + //FAWE start @Override public > boolean setBlock(BlockVector3 position, T block) throws WorldEditException { return getExtent().setBlock(position, block); } + //FAWE end @Override public > boolean setBlock(int x, int y, int z, T block) @@ -106,6 +108,7 @@ public class RequestExtent implements Extent { return getExtent().fullySupports3DBiomes(); } + //FAWE start @Override public boolean setTile(int x, int y, int z, CompoundTag tile) throws WorldEditException { return getExtent().setTile(x, y, z, tile); @@ -115,6 +118,7 @@ public class RequestExtent implements Extent { public boolean setBiome(BlockVector3 position, BiomeType biome) { return getExtent().setBiome(position, biome); } + //FAWE end @Override public boolean setBiome(int x, int y, int z, BiomeType biome) { diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/util/Direction.java b/worldedit-core/src/main/java/com/sk89q/worldedit/util/Direction.java index 35c259f31..b9e4bb489 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/util/Direction.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/util/Direction.java @@ -35,6 +35,7 @@ import javax.annotation.Nullable; */ public enum Direction { + //FAWE start - left, right NORTH(Vector3.at(0, 0, -1), Flag.CARDINAL, 3, 1), EAST(Vector3.at(1, 0, 0), Flag.CARDINAL, 0, 2), SOUTH(Vector3.at(0, 0, 1), Flag.CARDINAL, 1, 3), @@ -62,14 +63,18 @@ public enum Direction { ASCENDING_SOUTH(Vector3.at(0, 1, 1), Flag.ASCENDING_CARDINAL, 1 + 18, 3 + 18), ASCENDING_WEST(Vector3.at(-1, 1, 0), Flag.ASCENDING_CARDINAL, 2 + 18, 0 + 18), ; + //FAWE end private final Vector3 direction; private final int flags; + //FAWE start private final int left; private final int right; + //FAWE end private final BlockVector3 blockPoint; - private static HashMap map = new HashMap<>(); + //FAWE start + private static final HashMap map = new HashMap<>(); static { for (Direction dir : Direction.values()) { @@ -121,6 +126,7 @@ public enum Direction { public int getBlockZ() { return blockPoint.getZ(); } + //FAWE end /** * Return true if the direction is of a cardinal direction (north, west @@ -326,9 +332,13 @@ public enum Direction { public static int ORDINAL = 0x2; public static int SECONDARY_ORDINAL = 0x4; public static int UPRIGHT = 0x8; + //FAWE start public static int ASCENDING_CARDINAL = 0xF; + //FAWE end + //FAWE start - ASCENDING_CARDINAL public static int ALL = CARDINAL | ORDINAL | SECONDARY_ORDINAL | UPRIGHT | ASCENDING_CARDINAL; + //FAWE end private Flag() { } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/util/Identifiable.java b/worldedit-core/src/main/java/com/sk89q/worldedit/util/Identifiable.java index 8866c2102..902854589 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/util/Identifiable.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/util/Identifiable.java @@ -33,6 +33,8 @@ public interface Identifiable { */ UUID getUniqueId(); + //FAWE start UUID CONSOLE = UUID.fromString("a233eb4b-4cab-42cd-9fd9-7e7b9a3f74be"); UUID EVERYONE = UUID.fromString("1-1-3-3-7"); + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/util/Location.java b/worldedit-core/src/main/java/com/sk89q/worldedit/util/Location.java index 4dce38b99..0d44d1d70 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/util/Location.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/util/Location.java @@ -21,7 +21,7 @@ package com.sk89q.worldedit.util; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.math.Vector3; -import com.sk89q.worldedit.math.Vector3Impl; +import com.fastasyncworldedit.core.math.Vector3Impl; import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkNotNull; @@ -36,7 +36,9 @@ import static com.google.common.base.Preconditions.checkNotNull; * {@link #equals(Object)} are subject to minor differences caused by * floating point errors.

*/ +//FAWE start - extends Vector3Impl public class Location extends Vector3Impl { +//FAWE end private final Extent extent; private final float pitch; @@ -127,7 +129,9 @@ public class Location extends Vector3Impl { * @param pitch the pitch, in degrees */ public Location(Extent extent, Vector3 position, float yaw, float pitch) { + //FAWE start super(position); + //FAWE end checkNotNull(extent); checkNotNull(position); this.extent = extent; @@ -293,6 +297,7 @@ public class Location extends Vector3Impl { return new Location(extent, position, yaw, pitch); } + //FAWE start @Override public Location clampY(int min, int max) { checkArgument(min <= max, "minimum cannot be greater than maximum"); if (getY() < min) { @@ -304,6 +309,7 @@ public class Location extends Vector3Impl { return this; } + //FAWE end @Override public boolean equals(Object o) { @@ -322,6 +328,7 @@ public class Location extends Vector3Impl { if (Double.doubleToLongBits(yaw) != Double.doubleToLongBits(location.yaw)) { return false; } + //FAWE start if (this.getX() != location.getX()) { return false; } @@ -334,6 +341,7 @@ public class Location extends Vector3Impl { if (!extent.equals(location.extent)) { return false; } + //FAWE end return true; } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/util/PropertiesConfiguration.java b/worldedit-core/src/main/java/com/sk89q/worldedit/util/PropertiesConfiguration.java index d4c2f9f7d..218832d60 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/util/PropertiesConfiguration.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/util/PropertiesConfiguration.java @@ -90,9 +90,6 @@ public class PropertiesConfiguration extends LocalConfiguration { profile = getBool("profile", profile); traceUnflushedSessions = getBool("trace-unflushed-sessions", traceUnflushedSessions); disallowedBlocks = getStringSet("disallowed-blocks", getDefaultDisallowedBlocks()); - disallowedBlocksMask = null; - allowedDataCycleBlocks = - new HashSet<>(getStringSet("limits.allowed-data-cycle-blocks", null)); defaultChangeLimit = getInt("default-max-changed-blocks", defaultChangeLimit); maxChangeLimit = getInt("max-changed-blocks", maxChangeLimit); defaultVerticalHeight = getInt("default-vertical-height", defaultVerticalHeight); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/util/SideEffectSet.java b/worldedit-core/src/main/java/com/sk89q/worldedit/util/SideEffectSet.java index 6626bc2fd..c36f5740f 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/util/SideEffectSet.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/util/SideEffectSet.java @@ -39,9 +39,11 @@ public class SideEffectSet { private final Set appliedSideEffects; private final boolean appliesAny; + //FAWE start private SideEffectSet() { this(ImmutableMap.of()); } + //FAWE end public SideEffectSet(Map sideEffects) { this.sideEffects = Maps.immutableEnumMap(sideEffects); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/util/TargetBlock.java b/worldedit-core/src/main/java/com/sk89q/worldedit/util/TargetBlock.java index 3095e2df8..9040a5c3a 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/util/TargetBlock.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/util/TargetBlock.java @@ -38,7 +38,9 @@ import javax.annotation.Nullable; */ public class TargetBlock { + //FAWE start - Extent > World private final Extent world; + //FAWE end private int maxDistance; private double checkDistance; @@ -74,15 +76,19 @@ public class TargetBlock { * @param checkDistance how often to check for blocks, the smaller the more precise */ public TargetBlock(Player player, int maxDistance, double checkDistance) { + //FAWE start this(player, player.getWorld(), maxDistance, checkDistance); + //FAWE end } + //FAWE start - Extend > World public TargetBlock(Player player, Extent extent, int maxDistance, double checkDistance) { this.world = player.getWorld(); this.setValues(player.getLocation().toVector(), player.getLocation().getYaw(), player.getLocation().getPitch(), maxDistance, 1.65, checkDistance); this.stopMask = new ExistingBlockMask(world); this.solidMask = new SolidBlockMask(world); } + //FAWE end /** * Set the mask used for determine where to stop traces. diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/util/TreeGenerator.java b/worldedit-core/src/main/java/com/sk89q/worldedit/util/TreeGenerator.java index af84a67c7..a2a45ce00 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/util/TreeGenerator.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/util/TreeGenerator.java @@ -40,7 +40,7 @@ import javax.annotation.Nullable; /** * Tree generator. */ -public class TreeGenerator { +public final class TreeGenerator { public enum TreeType { TREE("Oak tree", "oak", "tree", "regular"), @@ -171,7 +171,7 @@ public class TreeGenerator { */ @Nullable public static TreeType lookup(String name) { - return lookup.get(name.replace("_", "").toLowerCase(Locale.ROOT)); + return lookup.get(name.toLowerCase(Locale.ROOT)); } } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/util/YAMLConfiguration.java b/worldedit-core/src/main/java/com/sk89q/worldedit/util/YAMLConfiguration.java index a1bd10721..f013cc488 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/util/YAMLConfiguration.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/util/YAMLConfiguration.java @@ -29,6 +29,7 @@ import org.apache.logging.log4j.Logger; import java.io.IOException; import java.util.HashSet; +import java.util.Locale; /** * A less simple implementation of {@link LocalConfiguration} @@ -54,7 +55,7 @@ public class YAMLConfiguration extends LocalConfiguration { profile = config.getBoolean("debug", profile); traceUnflushedSessions = config.getBoolean("debugging.trace-unflushed-sessions", traceUnflushedSessions); - wandItem = convertLegacyItem(config.getString("wand-item", wandItem)); + wandItem = convertLegacyItem(config.getString("wand-item", wandItem)).toLowerCase(Locale.ROOT); defaultChangeLimit = Math.max(-1, config.getInt( "limits.max-blocks-changed.default", defaultChangeLimit)); @@ -81,7 +82,6 @@ public class YAMLConfiguration extends LocalConfiguration { butcherMaxRadius = Math.max(-1, config.getInt("limits.butcher-radius.maximum", butcherMaxRadius)); disallowedBlocks = new HashSet<>(config.getStringList("limits.disallowed-blocks", Lists.newArrayList(getDefaultDisallowedBlocks()))); - disallowedBlocksMask = null; allowedDataCycleBlocks = new HashSet<>(config.getStringList("limits.allowed-data-cycle-blocks", null)); registerHelp = config.getBoolean("register-help", true); @@ -100,7 +100,7 @@ public class YAMLConfiguration extends LocalConfiguration { useInventoryCreativeOverride = config.getBoolean("use-inventory.creative-mode-overrides", useInventoryCreativeOverride); - navigationWand = convertLegacyItem(config.getString("navigation-wand.item", navigationWand)); + navigationWand = convertLegacyItem(config.getString("navigation-wand.item", navigationWand)).toLowerCase(Locale.ROOT); navigationWandMaxDistance = config.getInt("navigation-wand.max-distance", navigationWandMaxDistance); navigationUseGlass = config.getBoolean("navigation.use-glass", navigationUseGlass); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/util/auth/Subject.java b/worldedit-core/src/main/java/com/sk89q/worldedit/util/auth/Subject.java index 180b81525..35c3c3269 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/util/auth/Subject.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/util/auth/Subject.java @@ -48,6 +48,7 @@ public interface Subject { */ boolean hasPermission(String permission); + //FAWE start /** * Add and remove permissions from a subject to show and hide certain messages. * @@ -65,4 +66,5 @@ public interface Subject { } void setPermission(String permission, boolean value); + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/util/collection/DoubleArrayList.java b/worldedit-core/src/main/java/com/sk89q/worldedit/util/collection/DoubleArrayList.java index ae7ab5407..83215d7d6 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/util/collection/DoubleArrayList.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/util/collection/DoubleArrayList.java @@ -33,8 +33,8 @@ import java.util.NoSuchElementException; */ public class DoubleArrayList implements Iterable> { - private List listA = new ArrayList<>(); - private List listB = new ArrayList<>(); + private final List listA = new ArrayList<>(); + private final List listB = new ArrayList<>(); private boolean isReversed = false; /** @@ -102,8 +102,8 @@ public class DoubleArrayList implements Iterable> { public class ForwardEntryIterator> implements Iterator> { - private Iterator keyIterator; - private Iterator valueIterator; + private final Iterator keyIterator; + private final Iterator valueIterator; public ForwardEntryIterator(Iterator keyIterator, Iterator valueIterator) { this.keyIterator = keyIterator; @@ -132,8 +132,8 @@ public class DoubleArrayList implements Iterable> { public class ReverseEntryIterator> implements Iterator> { - private ListIterator keyIterator; - private ListIterator valueIterator; + private final ListIterator keyIterator; + private final ListIterator valueIterator; public ReverseEntryIterator(ListIterator keyIterator, ListIterator valueIterator) { this.keyIterator = keyIterator; @@ -160,8 +160,8 @@ public class DoubleArrayList implements Iterable> { * Class to masquerade as Map.Entry. */ public class Entry implements Map.Entry { - private A key; - private B value; + private final A key; + private final B value; private Entry(A key, B value) { this.key = key; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/util/concurrency/LazyReference.java b/worldedit-core/src/main/java/com/sk89q/worldedit/util/concurrency/LazyReference.java index 8463cac91..4af4ac72d 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/util/concurrency/LazyReference.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/util/concurrency/LazyReference.java @@ -32,6 +32,7 @@ public class LazyReference { return new LazyReference<>(valueComputation); } + //FAWE start /** * Pre-computed reference, for setting a lazy reference field with a known value. * @@ -42,6 +43,7 @@ public class LazyReference { public static LazyReference computed(T value) { return new LazyReference<>(value); } + //FAWE end // Memory saving technique: hold the computation info in the same reference field that we'll // put the value into, so the memory possibly retained by those parts is GC'able as soon as @@ -62,9 +64,11 @@ public class LazyReference { this.value = new RefInfo<>(valueComputation); } + //FAWE start private LazyReference(T value) { this.value = value; } + //FAWE end // casts are safe, value is either RefInfo or T @SuppressWarnings("unchecked") diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/util/eventbus/EventBus.java b/worldedit-core/src/main/java/com/sk89q/worldedit/util/eventbus/EventBus.java index b3a753318..34286db83 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/util/eventbus/EventBus.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/util/eventbus/EventBus.java @@ -61,7 +61,7 @@ public final class EventBus { */ private final SubscriberFindingStrategy finder = new AnnotatedSubscriberFinder(); - private HierarchyCache flattenHierarchyCache = new HierarchyCache(); + private final HierarchyCache flattenHierarchyCache = new HierarchyCache(); /** * Registers the given handler for the given class to receive events. diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/util/formatting/component/CommandListBox.java b/worldedit-core/src/main/java/com/sk89q/worldedit/util/formatting/component/CommandListBox.java index 2438d8235..b9717c0d3 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/util/formatting/component/CommandListBox.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/util/formatting/component/CommandListBox.java @@ -30,9 +30,9 @@ import java.util.List; public class CommandListBox extends PaginationBox { - private List commands = Lists.newArrayList(); + private final List commands = Lists.newArrayList(); + private final String helpCommand; private boolean hideHelp; - private String helpCommand; /** * Create a new box. diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/util/formatting/component/MessageBox.java b/worldedit-core/src/main/java/com/sk89q/worldedit/util/formatting/component/MessageBox.java index 45811252a..585aa3a6f 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/util/formatting/component/MessageBox.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/util/formatting/component/MessageBox.java @@ -35,8 +35,8 @@ public class MessageBox extends TextComponentProducer { private static final int GUARANTEED_NO_WRAP_CHAT_PAGE_WIDTH = 47; - private TextComponentProducer contents; - private TextColor borderColor; + private final TextComponentProducer contents; + private final TextColor borderColor; /** * Create a new box. diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/util/formatting/component/PaginationBox.java b/worldedit-core/src/main/java/com/sk89q/worldedit/util/formatting/component/PaginationBox.java index 5e61f5ce9..f0c3d0bcf 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/util/formatting/component/PaginationBox.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/util/formatting/component/PaginationBox.java @@ -78,11 +78,13 @@ public abstract class PaginationBox extends MessageBox { super(title, new TextComponentProducer()); if (pageCommand != null && !pageCommand.contains("%page%")) { + //FAWE start if (pageCommand.contains("-p ")) { pageCommand = pageCommand.replaceAll("-p [0-9]+", "-p %page%"); } else { pageCommand = pageCommand + " -p %page%"; } + //FAWE end } this.pageCommand = pageCommand; } @@ -171,6 +173,7 @@ public abstract class PaginationBox extends MessageBox { } } + //FAWE start public static class MergedPaginationBox extends PaginationBox { private final PaginationBox[] values; @@ -182,9 +185,11 @@ public abstract class PaginationBox extends MessageBox { @Override public Component getComponent(int number) { for (PaginationBox box : values) { + //FAWE start if (box == null) { continue; } + //FAWE end int size = box.getComponentsSize(); if (size > number) { return box.getComponent(number); @@ -198,12 +203,15 @@ public abstract class PaginationBox extends MessageBox { public int getComponentsSize() { int size = 0; for (PaginationBox box : values) { + //FAWE start if (box == null) { continue; } + //FAWE end size += box.getComponentsSize(); } return size; } } + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/util/formatting/component/SideEffectBox.java b/worldedit-core/src/main/java/com/sk89q/worldedit/util/formatting/component/SideEffectBox.java index 78cc42a35..79fad489b 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/util/formatting/component/SideEffectBox.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/util/formatting/component/SideEffectBox.java @@ -41,12 +41,14 @@ public class SideEffectBox extends PaginationBox { private SideEffectSet sideEffectSet; private static List getSideEffects() { + //FAWE start if (sideEffects == null) { sideEffects = WorldEdit.getInstance().getPlatformManager().getSupportedSideEffects() .stream() .sorted(Comparator.comparing(Enum::name)) .collect(Collectors.toList()); } + //FAWE end return sideEffects; } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/util/io/file/ArchiveUnpacker.java b/worldedit-core/src/main/java/com/sk89q/worldedit/util/io/file/ArchiveUnpacker.java new file mode 100644 index 000000000..9203c7543 --- /dev/null +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/util/io/file/ArchiveUnpacker.java @@ -0,0 +1,122 @@ +/* + * WorldEdit, a Minecraft world manipulation toolkit + * Copyright (C) sk89q + * Copyright (C) WorldEdit team and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.sk89q.worldedit.util.io.file; + +import com.google.common.collect.ImmutableSet; +import com.google.common.hash.Hasher; +import com.google.common.hash.Hashing; +import com.google.common.io.ByteProcessor; +import com.google.common.io.ByteStreams; + +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.nio.channels.Channels; +import java.nio.channels.SeekableByteChannel; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.StandardOpenOption; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; +import java.util.zip.ZipEntry; +import java.util.zip.ZipInputStream; + +public final class ArchiveUnpacker { + + private static final String UNPACK_FINISHED = ".unpack_finished"; + + private static final Lock lock = new ReentrantLock(); + + private final Path unpackDir; + + public ArchiveUnpacker(Path unpackDir) throws IOException { + this.unpackDir = unpackDir; + Files.createDirectories(unpackDir); + } + + public Path unpackArchive(URL archiveUrl) throws IOException { + String hash; + try (InputStream data = archiveUrl.openStream()) { + hash = ByteStreams.readBytes(data, new ByteProcessor() { + private final Hasher hasher = Hashing.crc32c().newHasher(); + + @Override + public boolean processBytes(byte[] buf, int off, int len) { + hasher.putBytes(buf, off, len); + return true; + } + + @Override + public String getResult() { + return hasher.hash().toString(); + } + }); + } + Path dest = unpackDir.resolve(hash); + if (Files.exists(dest.resolve(UNPACK_FINISHED))) { + // trust this, no other option :) + return dest; + } + lock.lock(); + try { + // check again after exclusive acquire + if (Files.exists(dest.resolve(UNPACK_FINISHED))) { + return dest; + } + try (InputStream in = archiveUrl.openStream(); + ZipInputStream zipReader = new ZipInputStream(in)) { + ZipEntry next; + while ((next = zipReader.getNextEntry()) != null) { + Path resolved = dest.resolve(next.getName()); + if (!resolved.startsWith(dest)) { + // bad entry + continue; + } + if (next.isDirectory()) { + Files.createDirectories( + resolved, + SafeFiles.getOwnerOnlyFileAttributes(AttributeTarget.DIRECTORY) + ); + } else { + try (SeekableByteChannel channel = Files.newByteChannel( + resolved, + ImmutableSet.of( + StandardOpenOption.CREATE, + StandardOpenOption.WRITE, + StandardOpenOption.TRUNCATE_EXISTING + ), + SafeFiles.getOwnerOnlyFileAttributes(AttributeTarget.FILE) + )) { + ByteStreams.copy( + Channels.newChannel(zipReader), + channel + ); + } + } + } + } + Files.createFile(dest.resolve(UNPACK_FINISHED)); + return dest; + } finally { + lock.unlock(); + } + } + +} diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/util/io/file/ArchiveNioSupport.java~18a55bc14... Add new experimental snapshot API (#524) b/worldedit-core/src/main/java/com/sk89q/worldedit/util/io/file/AttributeTarget.java similarity index 63% rename from worldedit-core/src/main/java/com/sk89q/worldedit/util/io/file/ArchiveNioSupport.java~18a55bc14... Add new experimental snapshot API (#524) rename to worldedit-core/src/main/java/com/sk89q/worldedit/util/io/file/AttributeTarget.java index a50d1cf25..6f12c9492 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/util/io/file/ArchiveNioSupport.java~18a55bc14... Add new experimental snapshot API (#524) +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/util/io/file/AttributeTarget.java @@ -19,22 +19,6 @@ package com.sk89q.worldedit.util.io.file; -import java.io.IOException; -import java.nio.file.FileSystem; -import java.nio.file.Path; -import java.util.Optional; - -/** - * Something that can provide access to an archive file as a file system. - */ -public interface ArchiveNioSupport { - - /** - * Try to open the given archive as a file system. - * - * @param archive the archive to open - * @return the path for the root of the archive, if available - */ - Optional tryOpenAsDir(Path archive) throws IOException; - +public enum AttributeTarget { + FILE, DIRECTORY } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/util/io/file/SafeFiles.java b/worldedit-core/src/main/java/com/sk89q/worldedit/util/io/file/SafeFiles.java index 4d9e14931..61dad4039 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/util/io/file/SafeFiles.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/util/io/file/SafeFiles.java @@ -19,15 +19,20 @@ package com.sk89q.worldedit.util.io.file; -import org.jetbrains.annotations.Nullable; +import com.google.common.collect.ImmutableSet; import java.io.IOException; +import java.nio.file.FileSystems; import java.nio.file.Files; import java.nio.file.Path; +import java.nio.file.attribute.FileAttribute; +import java.nio.file.attribute.PosixFilePermission; +import java.nio.file.attribute.PosixFilePermissions; import java.util.Iterator; import java.util.List; import java.util.stream.Collectors; import java.util.stream.Stream; +import javax.annotation.Nullable; public class SafeFiles { @@ -141,6 +146,54 @@ public class SafeFiles { } } + private static final FileAttribute[] OWNER_ONLY_FILE_ATTRS; + private static final FileAttribute[] OWNER_ONLY_DIR_ATTRS; + + static { + if (FileSystems.getDefault().supportedFileAttributeViews().contains("posix")) { + OWNER_ONLY_FILE_ATTRS = new FileAttribute[] { + PosixFilePermissions.asFileAttribute( + ImmutableSet.of( + PosixFilePermission.OWNER_READ, + PosixFilePermission.OWNER_WRITE + ) + ) + }; + OWNER_ONLY_DIR_ATTRS = new FileAttribute[] { + PosixFilePermissions.asFileAttribute( + ImmutableSet.of( + PosixFilePermission.OWNER_READ, + PosixFilePermission.OWNER_WRITE, + PosixFilePermission.OWNER_EXECUTE + ) + ) + }; + } else { + OWNER_ONLY_FILE_ATTRS = new FileAttribute[0]; + OWNER_ONLY_DIR_ATTRS = new FileAttribute[0]; + } + } + + /** + * Get a set of file attributes for file creation with owner-only access, if possible. + * + *

+ * On POSIX, this returns o+rw (and o+x if directory), on Windows it returns nothing. + *

+ * + * @return the owner-only file attributes + */ + public static FileAttribute[] getOwnerOnlyFileAttributes(AttributeTarget attributeTarget) { + switch (attributeTarget) { + case FILE: + return OWNER_ONLY_FILE_ATTRS; + case DIRECTORY: + return OWNER_ONLY_DIR_ATTRS; + default: + throw new IllegalStateException("Unknown attribute target " + attributeTarget); + } + } + private SafeFiles() { } } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/util/net/HttpRequest.java b/worldedit-core/src/main/java/com/sk89q/worldedit/util/net/HttpRequest.java index 5cb0adbb9..74be79bfc 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/util/net/HttpRequest.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/util/net/HttpRequest.java @@ -217,13 +217,6 @@ public class HttpRequest implements Closeable { return conn.getResponseCode(); } - public String getSingleHeaderValue(String header) { - checkState(conn != null, "No connection has been made"); - - // maybe we should check for multi-header? - return conn.getHeaderField(header); - } - /** * Get the input stream. * diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/util/paste/ActorCallbackPaste.java b/worldedit-core/src/main/java/com/sk89q/worldedit/util/paste/ActorCallbackPaste.java index 28d7380b2..a0e261451 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/util/paste/ActorCallbackPaste.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/util/paste/ActorCallbackPaste.java @@ -72,7 +72,7 @@ public final class ActorCallbackPaste { AsyncCommandBuilder.wrap(task, sender) .registerWithSupervisor(supervisor, "Submitting content to a pastebin service.") - .sendMessageAfterDelay(Caption.of("worldedit.pastebin.uploading")) + .setDelayMessage(Caption.of("worldedit.pastebin.uploading")) .onSuccess((String) null, url -> sender.printInfo(successMessage.args(TextComponent.of(url.toString())).build())) .onFailure("Failed to submit paste", null) .buildAndExec(Pasters.getExecutor()); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/util/task/LinkedFuture.java b/worldedit-core/src/main/java/com/sk89q/worldedit/util/task/LinkedFuture.java deleted file mode 100644 index 4db571854..000000000 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/util/task/LinkedFuture.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.sk89q.worldedit.util.task; - -import org.jetbrains.annotations.NotNull; - -import java.util.concurrent.ExecutionException; -import java.util.concurrent.Future; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; - -public class LinkedFuture> implements Future { - private Future task; - - public LinkedFuture(Future task) { - this.task = task; - } - - @Override - public boolean cancel(boolean mayInterruptIfRunning) { - return task.cancel(mayInterruptIfRunning); - } - - @Override - public boolean isCancelled() { - return task.isCancelled(); - } - - @Override - public boolean isDone() { - return task.isDone(); - } - - @Override - public synchronized T get() throws InterruptedException, ExecutionException { - if (task != null) { - task = task.get(); - if (task != null) { - return (T) this; - } - } - return null; - } - - @Override - public synchronized T get(long timeout, @NotNull TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException { - if (task != null) { - task = task.get(timeout, unit); - if (task != null) { - return (T) this; - } - } - return null; - } -} diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/util/task/TaskStateComparator.java b/worldedit-core/src/main/java/com/sk89q/worldedit/util/task/TaskStateComparator.java index 4d311ebbe..fe16819c7 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/util/task/TaskStateComparator.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/util/task/TaskStateComparator.java @@ -31,7 +31,9 @@ public class TaskStateComparator implements Comparator> { public int compare(com.sk89q.worldedit.util.task.Task o1, Task o2) { int ordinal1 = o1.getState().ordinal(); int ordinal2 = o2.getState().ordinal(); + //FAWE start - use Integer#compare return Integer.compare(ordinal1, ordinal2); + //FAWE end } } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/AbstractWorld.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/AbstractWorld.java index 7f76462c9..16f358ab2 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/AbstractWorld.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/AbstractWorld.java @@ -23,7 +23,7 @@ import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.blocks.BaseItem; import com.sk89q.worldedit.blocks.BaseItemStack; import com.sk89q.worldedit.extension.platform.Platform; -import com.sk89q.worldedit.function.mask.BlockMaskBuilder; +import com.fastasyncworldedit.core.function.mask.BlockMaskBuilder; import com.sk89q.worldedit.function.mask.Mask; import com.sk89q.worldedit.function.operation.Operation; import com.sk89q.worldedit.math.BlockVector2; @@ -76,7 +76,9 @@ public abstract class AbstractWorld implements World { @Override public Mask createLiquidMask() { + //FAWE start - use BlockMaskBuilder return new BlockMaskBuilder().addTypes(BlockTypes.LAVA, BlockTypes.WATER).build(this); + //FAWE end } @Override diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/NbtValued.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/NbtValued.java index 198a78630..4a0a1047c 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/NbtValued.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/NbtValued.java @@ -43,9 +43,12 @@ public interface NbtValued { */ @Deprecated default boolean hasNbtData() { + //FAWE start - return & deprecation return getNbt() != null; + //FAWE end } + //FAWE start /** * Get the object's NBT data (tile entity data). The returned tag, if * modified in any way, should be sent to {@link #setNbtData(CompoundTag)} @@ -139,5 +142,6 @@ public interface NbtValued { default void setNbt(@Nullable CompoundBinaryTag nbtData) { setNbtReference(nbtData == null ? null : LazyReference.computed(nbtData)); } + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/NullWorld.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/NullWorld.java index dc6d4eaa4..3fdc12a14 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/NullWorld.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/NullWorld.java @@ -19,9 +19,9 @@ package com.sk89q.worldedit.world; -import com.fastasyncworldedit.core.beta.IChunkGet; -import com.fastasyncworldedit.core.beta.implementation.blocks.NullChunkGet; -import com.fastasyncworldedit.core.beta.implementation.packet.ChunkPacket; +import com.fastasyncworldedit.core.queue.IChunkGet; +import com.fastasyncworldedit.core.queue.implementation.blocks.NullChunkGet; +import com.fastasyncworldedit.core.queue.implementation.packet.ChunkPacket; import com.google.common.collect.ImmutableSet; import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.EditSession; @@ -160,6 +160,7 @@ public class NullWorld extends AbstractWorld { return BlockVector3.ZERO; } + //FAWE start @Override public void refreshChunk(int chunkX, int chunkZ) { @@ -169,6 +170,7 @@ public class NullWorld extends AbstractWorld { public IChunkGet get(int x, int z) { return NullChunkGet.getInstance(); } + //FAWE end @Override public BlockState getBlock(BlockVector3 position) { @@ -190,10 +192,12 @@ public class NullWorld extends AbstractWorld { return false; } + //FAWE start @Override public boolean setTile(int x, int y, int z, CompoundTag tile) throws WorldEditException { return false; } + //FAWE end @Override public BaseBlock getFullBlock(BlockVector3 position) { @@ -225,6 +229,7 @@ public class NullWorld extends AbstractWorld { return INSTANCE; } + //FAWE start @Override public void sendFakeChunk(@Nullable Player player, ChunkPacket packet) { } @@ -236,4 +241,5 @@ public class NullWorld extends AbstractWorld { @Override public void flush() {} + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/RegenOptions.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/RegenOptions.java index 6cf2b80b2..14a5c26e3 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/RegenOptions.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/RegenOptions.java @@ -39,7 +39,9 @@ public abstract class RegenOptions { * @return the builder */ public static Builder builder() { + //FAWE start - biomeType return new AutoValue_RegenOptions.Builder().seed(OptionalLong.empty()).regenBiomes(false).biomeType(null); + //FAWE end } @AutoValue.Builder @@ -70,12 +72,14 @@ public abstract class RegenOptions { */ public abstract Builder regenBiomes(boolean regenBiomes); + //FAWE start /** * Defines the {@code BiomeType} the regenerator should use for regeneration. Defaults to {@code null}. * @param biomeType the {@code BiomeType} to be used for regeneration * @return this builder */ public abstract Builder biomeType(@Nullable BiomeType biomeType); + //FAWE end /** * Build the options object. @@ -107,10 +111,12 @@ public abstract class RegenOptions { return isRegenBiomes(); } + //FAWE start @Nullable public abstract BiomeType getBiomeType(); public boolean hasBiomeType() { return getBiomeType() != null; } + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/World.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/World.java index b39384370..8f4d88112 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/World.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/World.java @@ -19,9 +19,9 @@ package com.sk89q.worldedit.world; -import com.fastasyncworldedit.core.beta.IChunkCache; -import com.fastasyncworldedit.core.beta.IChunkGet; -import com.fastasyncworldedit.core.beta.implementation.packet.ChunkPacket; +import com.fastasyncworldedit.core.queue.IChunkCache; +import com.fastasyncworldedit.core.queue.IChunkGet; +import com.fastasyncworldedit.core.queue.implementation.packet.ChunkPacket; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.MaxChangedBlocksException; import com.sk89q.worldedit.WorldEditException; @@ -56,7 +56,9 @@ import javax.annotation.Nullable; /** * Represents a world (dimension). */ +//FAWE start - IChunkCache public interface World extends Extent, Keyed, IChunkCache { +//FAWE end /** * Get the name of the world. @@ -371,6 +373,7 @@ public interface World extends Extent, Keyed, IChunkCache { @Override int hashCode(); + //FAWE start @Override default boolean isWorld() { return true; @@ -414,4 +417,5 @@ public interface World extends Extent, Keyed, IChunkCache { } void flush(); + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/biome/BiomeType.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/biome/BiomeType.java index c7fdf714a..fdb279fbc 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/biome/BiomeType.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/biome/BiomeType.java @@ -23,12 +23,14 @@ import com.sk89q.worldedit.function.pattern.BiomePattern; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.registry.Keyed; import com.sk89q.worldedit.registry.NamespacedRegistry; -import com.sk89q.worldedit.registry.RegistryItem; +import com.fastasyncworldedit.core.registry.RegistryItem; /** * All the types of biomes in the game. */ +//FAWE start - RegistryItem public class BiomeType implements RegistryItem, Keyed, BiomePattern { +//FAWE end public static final NamespacedRegistry REGISTRY = new NamespacedRegistry<>("biome type"); @@ -36,6 +38,7 @@ public class BiomeType implements RegistryItem, Keyed, BiomePattern { private int legacyId = -1; private int internalId; + //FAWE start public BiomeType(String id) { this.id = id; } @@ -57,6 +60,7 @@ public class BiomeType implements RegistryItem, Keyed, BiomePattern { public int getInternalId() { return internalId; } + //FAWE end /** * Gets the ID of this biome. @@ -75,7 +79,9 @@ public class BiomeType implements RegistryItem, Keyed, BiomePattern { @Override public int hashCode() { + //FAWE start - internalId > hashCode return this.internalId; // stop changing this + //FAWE end } @Override diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/biome/BiomeTypes.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/biome/BiomeTypes.java index addfbd0d7..6e7960364 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/biome/BiomeTypes.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/biome/BiomeTypes.java @@ -115,6 +115,15 @@ public final class BiomeTypes { private BiomeTypes() { } + /** + * Gets the {@link BiomeType} associated with the given id. + */ + @Nullable + public static BiomeType get(String id) { + return BiomeType.REGISTRY.get(id); + } + + //FAWE start private static BiomeType register(final String id) { return register(new BiomeType(id)); } @@ -136,14 +145,6 @@ public final class BiomeTypes { return BiomeType.REGISTRY.getByInternalId(internalId); } - /** - * Gets the {@link BiomeType} associated with the given id. - */ - @Nullable - public static BiomeType get(String id) { - return BiomeType.REGISTRY.get(id); - } - public static Collection values() { return BiomeType.REGISTRY.values(); } @@ -157,4 +158,5 @@ public final class BiomeTypes { } return maxBiomeId; } + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BaseBlock.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BaseBlock.java index bf1a0962f..de800e99d 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BaseBlock.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BaseBlock.java @@ -27,7 +27,7 @@ import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.extent.OutputExtent; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.registry.state.Property; -import com.sk89q.worldedit.registry.state.PropertyKey; +import com.fastasyncworldedit.core.registry.state.PropertyKey; import com.sk89q.worldedit.util.concurrency.LazyReference; import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; import com.sk89q.worldedit.util.nbt.TagStringIO; @@ -54,8 +54,11 @@ public class BaseBlock implements BlockStateHolder, TileEntityBlock { private final BlockState blockState; @Nullable + //FAWE start - LR instead of CompoundTat private final LazyReference nbtData; + //FAWE end + //FAWE start /** * Construct a block with the given type and default data. * @deprecated Just use the BlockType.getDefaultState() @@ -65,7 +68,9 @@ public class BaseBlock implements BlockStateHolder, TileEntityBlock { public BaseBlock(BlockType blockType) { this(blockType.getDefaultState()); } + //FAWE end + //FAWE start - made public from protected /** * Construct a block with a state. * @@ -75,7 +80,9 @@ public class BaseBlock implements BlockStateHolder, TileEntityBlock { this.blockState = blockState; this.nbtData = null; } + //FAWE end + //FAWE start - deprecated upstream method and replaced CompoundTag with LR /** * Construct a block with the given ID, data value and NBT data structure. * @@ -86,6 +93,7 @@ public class BaseBlock implements BlockStateHolder, TileEntityBlock { public BaseBlock(BlockState state, CompoundTag nbtData) { this(state, LazyReference.from(checkNotNull(nbtData)::asBinaryTag)); } + //FAWE end /** @@ -100,6 +108,7 @@ public class BaseBlock implements BlockStateHolder, TileEntityBlock { this.nbtData = nbtData; } + //FAWE start /** * Construct a block with the given ID and data value. * @@ -118,6 +127,8 @@ public class BaseBlock implements BlockStateHolder, TileEntityBlock { } return blockState; } + //FAWE end + /** * Gets a map of state to state values. * @@ -151,13 +162,16 @@ public class BaseBlock implements BlockStateHolder, TileEntityBlock { @Override public String getNbtId() { + //FAWE start - LR > CompoundTag LazyReference nbtData = this.nbtData; if (nbtData == null) { return ""; } return nbtData.getValue().getString("id"); + //FAWE end } + //FAWE start @Nullable @Override public LazyReference getNbtReference() { @@ -168,6 +182,7 @@ public class BaseBlock implements BlockStateHolder, TileEntityBlock { public void setNbtReference(@Nullable LazyReference nbtData) { throw new UnsupportedOperationException("This class is immutable."); } + //FAWE end /** * Checks whether the type ID and data value are equal. @@ -186,6 +201,7 @@ public class BaseBlock implements BlockStateHolder, TileEntityBlock { return this.blockState.equalsFuzzy(otherBlock.blockState) && Objects.equals(getNbt(), otherBlock.getNbt()); } + //FAWE start @Override public int getInternalId() { return blockState.getInternalId(); @@ -201,6 +217,12 @@ public class BaseBlock implements BlockStateHolder, TileEntityBlock { return blockState.getOrdinal(); } + @Override + public final char getOrdinalChar() { + return blockState.getOrdinalChar(); + } + //FAWE end + /** * Checks if the type is the same, and if the matched states are the same. * @@ -217,16 +239,12 @@ public class BaseBlock implements BlockStateHolder, TileEntityBlock { return this.blockState; } - @Override - public final char getOrdinalChar() { - return blockState.getOrdinalChar(); - } - @Override public BaseBlock toBaseBlock() { return this; } + //FAWE start @Override public boolean apply(Extent extent, BlockVector3 get, BlockVector3 set) throws WorldEditException { set.setFullBlock(extent, this); @@ -277,16 +295,16 @@ public class BaseBlock implements BlockStateHolder, TileEntityBlock { return toImmutableState().getState(property); } - // Fawe start @Override public int hashCode() { return getOrdinal(); } - // Fawe end + //FAWE end @Override public String toString() { String nbtString = ""; + //FAWE start - use CBT CompoundBinaryTag nbtData = getNbt(); if (nbtData != null) { try { @@ -302,4 +320,5 @@ public class BaseBlock implements BlockStateHolder, TileEntityBlock { public BlockState toBlockState() { return blockState; } + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockCategories.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockCategories.java index 0c99fa704..ec79adeab 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockCategories.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockCategories.java @@ -156,7 +156,9 @@ public final class BlockCategories { BlockCategory entry = BlockCategory.REGISTRY.get(id); if (entry == null) { BlockCategory blockCategory = new BlockCategory(id); + //FAWE start blockCategory.load(); + //FAWE end return blockCategory; } return entry; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockCategory.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockCategory.java index cf8f5fe58..f3f1b2ffc 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockCategory.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockCategory.java @@ -32,7 +32,9 @@ import java.util.Set; * blocks such as wool into separate ids. */ public class BlockCategory extends Category implements Keyed { - private boolean[] flat_map; + //FAWE start + private boolean[] flatMap; + //FAWE end public static final NamespacedRegistry REGISTRY = new NamespacedRegistry<>("block tag"); public BlockCategory(final String id) { @@ -45,15 +47,17 @@ public class BlockCategory extends Category implements Keyed { .queryCapability(Capability.GAME_HOOKS).getRegistries() .getBlockCategoryRegistry().getAll(this); + //FAWE start int max = -1; for (BlockType type : result) { max = Math.max(max, type.getInternalId()); } - this.flat_map = new boolean[max + 1]; + this.flatMap = new boolean[max + 1]; for (BlockType type : result) { - this.flat_map[type.getInternalId()] = true; + this.flatMap[type.getInternalId()] = true; } return result; + //FAWE end } /** @@ -64,7 +68,9 @@ public class BlockCategory extends Category implements Keyed { * @return If it's a part of this category */ public > boolean contains(B blockStateHolder) { + //FAWE start - use internal id int typeId = blockStateHolder.getBlockType().getInternalId(); - return flat_map.length > typeId && flat_map[typeId]; + return flatMap.length > typeId && flatMap[typeId]; + //FAWE end } } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockState.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockState.java index c60fa3a6f..a686599da 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockState.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockState.java @@ -19,10 +19,12 @@ package com.sk89q.worldedit.world.block; -import com.fastasyncworldedit.core.beta.ITileInput; +import com.fastasyncworldedit.core.queue.ITileInput; import com.fastasyncworldedit.core.command.SuggestInputParseException; -import com.fastasyncworldedit.core.object.string.MutableCharSequence; +import com.fastasyncworldedit.core.util.MutableCharSequence; import com.fastasyncworldedit.core.util.StringMan; +import com.fastasyncworldedit.core.world.block.BlanketBaseBlock; +import com.fastasyncworldedit.core.world.block.CompoundInput; import com.google.common.base.Function; import com.google.common.collect.Maps; import com.sk89q.jnbt.CompoundTag; @@ -34,12 +36,12 @@ import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.extent.NullExtent; import com.sk89q.worldedit.extent.OutputExtent; import com.sk89q.worldedit.function.mask.Mask; -import com.sk89q.worldedit.function.mask.SingleBlockStateMask; +import com.fastasyncworldedit.core.function.mask.SingleBlockStateMask; import com.sk89q.worldedit.function.pattern.Pattern; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.registry.state.AbstractProperty; import com.sk89q.worldedit.registry.state.Property; -import com.sk89q.worldedit.registry.state.PropertyKey; +import com.fastasyncworldedit.core.registry.state.PropertyKey; import com.sk89q.worldedit.util.concurrency.LazyReference; import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; import com.sk89q.worldedit.world.registry.BlockMaterial; @@ -57,15 +59,19 @@ import javax.annotation.Nullable; */ @SuppressWarnings("unchecked") public class BlockState implements BlockStateHolder, Pattern { + + //FAWE start private final int internalId; private final int ordinal; private final char ordinalChar; - private final BlockType blockType; private BlockMaterial material; private final BaseBlock emptyBaseBlock; private CompoundInput compoundInput = CompoundInput.NULL; + //FAWE end + private final BlockType blockType; - protected BlockState(BlockType blockType, int internalId, int ordinal) { + //FAWE start + public BlockState(BlockType blockType, int internalId, int ordinal) { this.blockType = blockType; this.internalId = internalId; this.ordinal = ordinal; @@ -73,7 +79,7 @@ public class BlockState implements BlockStateHolder, Pattern { this.emptyBaseBlock = new BlanketBaseBlock(this); } - protected BlockState(BlockType blockType, int internalId, int ordinal, @NotNull CompoundTag tile) { + public BlockState(BlockType blockType, int internalId, int ordinal, @NotNull CompoundTag tile) { this.blockType = blockType; this.internalId = internalId; this.ordinal = ordinal; @@ -329,6 +335,7 @@ public class BlockState implements BlockStateHolder, Pattern { Map map = Maps.asMap(type.getPropertiesSet(), (Function) this::getState); return Collections.unmodifiableMap((Map, Object>) map); } + //FAWE end @Override public boolean equalsFuzzy(BlockStateHolder o) { @@ -361,11 +368,13 @@ public class BlockState implements BlockStateHolder, Pattern { return getState(getBlockType().getProperty(key)); } + //FAWE start @Deprecated @Override public CompoundTag getNbtData() { return getBlockType().getMaterial().isTile() ? getBlockType().getMaterial().getDefaultTile() : null; } + //FAWE end @Override public BaseBlock toBaseBlock(LazyReference compoundTag) { @@ -375,6 +384,7 @@ public class BlockState implements BlockStateHolder, Pattern { return new BaseBlock(this, compoundTag); } + //FAWE start @Override public int getInternalId() { return internalId; @@ -431,4 +441,5 @@ public class BlockState implements BlockStateHolder, Pattern { public BaseBlock toBaseBlock(ITileInput input, int x, int y, int z) { return compoundInput.get(this, input, x, y, z); } + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockStateHolder.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockStateHolder.java index a51f69c1e..b555e518f 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockStateHolder.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockStateHolder.java @@ -19,7 +19,7 @@ package com.sk89q.worldedit.world.block; -import com.fastasyncworldedit.core.beta.ITileInput; +import com.fastasyncworldedit.core.queue.ITileInput; import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.blocks.TileEntityBlock; import com.sk89q.worldedit.extent.OutputExtent; @@ -28,7 +28,7 @@ import com.sk89q.worldedit.internal.util.DeprecationUtil; import com.sk89q.worldedit.internal.util.NonAbstractForCompatibility; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.registry.state.Property; -import com.sk89q.worldedit.registry.state.PropertyKey; +import com.fastasyncworldedit.core.registry.state.PropertyKey; import com.sk89q.worldedit.util.concurrency.LazyReference; import com.sk89q.worldedit.world.registry.BlockMaterial; import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; @@ -37,7 +37,9 @@ import java.util.Locale; import java.util.Map; import java.util.stream.Collectors; +//FAWE start - TileEntityBlock public interface BlockStateHolder> extends TileEntityBlock, Pattern { +//FAWE end /** * Get the block type. @@ -46,6 +48,7 @@ public interface BlockStateHolder> extends TileEnt */ BlockType getBlockType(); + //FAWE start /** * Magic number (legacy uses). */ @@ -77,6 +80,7 @@ public interface BlockStateHolder> extends TileEnt */ @Deprecated int getInternalPropertiesId(); + //FAWE end /** * Returns a BlockState with the given state and value applied. @@ -141,6 +145,7 @@ public interface BlockStateHolder> extends TileEnt */ BaseBlock toBaseBlock(); + //FAWE start /** * Gets a {@link BaseBlock} from this BlockStateHolder. * @@ -191,6 +196,7 @@ public interface BlockStateHolder> extends TileEnt default BaseBlock toBaseBlock(ITileInput input, int x, int y, int z) { throw new UnsupportedOperationException("State is immutable"); } + //FAWE end default String getAsString() { if (getStates().isEmpty()) { diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockType.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockType.java index 6ae60a706..c6b4f99e7 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockType.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockType.java @@ -24,7 +24,7 @@ import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extension.platform.Capability; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.extent.NullExtent; -import com.sk89q.worldedit.function.mask.SingleBlockTypeMask; +import com.fastasyncworldedit.core.function.mask.SingleBlockTypeMask; import com.sk89q.worldedit.function.pattern.Pattern; import com.sk89q.worldedit.internal.util.LogManagerCompat; import com.sk89q.worldedit.math.BlockVector3; @@ -32,7 +32,7 @@ import com.sk89q.worldedit.registry.Keyed; import com.sk89q.worldedit.registry.NamespacedRegistry; import com.sk89q.worldedit.registry.state.AbstractProperty; import com.sk89q.worldedit.registry.state.Property; -import com.sk89q.worldedit.registry.state.PropertyKey; +import com.fastasyncworldedit.core.registry.state.PropertyKey; import com.sk89q.worldedit.util.concurrency.LazyReference; import com.sk89q.worldedit.util.formatting.text.Component; import com.sk89q.worldedit.world.item.ItemType; @@ -52,7 +52,9 @@ import javax.annotation.Nullable; import static com.google.common.base.Preconditions.checkArgument; +//FAWE start - Pattern public class BlockType implements Keyed, Pattern { +//FAWE end public static final NamespacedRegistry REGISTRY = new NamespacedRegistry<>("block type"); private static final Logger LOGGER = LogManagerCompat.getLogger(); @@ -62,6 +64,7 @@ public class BlockType implements Keyed, Pattern { private final LazyReference emptyFuzzy = LazyReference.from(() -> new FuzzyBlockState(this)); + //FAWE start private final LazyReference legacyId = LazyReference.from(() -> computeLegacy(0)); private final LazyReference legacyData = LazyReference.from(() -> computeLegacy(1)); @@ -89,6 +92,7 @@ public class BlockType implements Keyed, Pattern { public int getMaxStateId() { return settings.permutations; } + //FAWE end /** * Gets the ID of this block. @@ -105,6 +109,7 @@ public class BlockType implements Keyed, Pattern { .getRegistries().getBlockRegistry().getRichName(this); } + //FAWE start public String getNamespace() { String id = getId(); int i = id.indexOf(':'); @@ -137,6 +142,7 @@ public class BlockType implements Keyed, Pattern { return defaultState; } */ + @Deprecated public BlockState withPropertyId(int propertyId) { if (settings.stateOrdinals == null) { @@ -157,6 +163,7 @@ public class BlockType implements Keyed, Pattern { public BlockState withStateId(int internalStateId) { // return this.withPropertyId(internalStateId >> BlockTypesCache.BIT_OFFSET); } + //FAWE end /** * Gets the properties of this BlockType in a {@code key->property} mapping. @@ -173,13 +180,17 @@ public class BlockType implements Keyed, Pattern { * @return the properties */ public List> getProperties() { - return this.settings.propertiesList; // stop changing this + //FAWE start - Don't use an ImmutableList here + return this.settings.propertiesList; + //FAWE end } + //FAWE start @Deprecated public Set> getPropertiesSet() { return this.settings.propertiesSet; } + //FAWE end /** * Gets a property by name. @@ -188,9 +199,12 @@ public class BlockType implements Keyed, Pattern { * @return The property */ public Property getProperty(String name) { - return (Property) this.settings.propertiesMap.get(name); // stop changing this (performance) + //FAWE start - use properties map + return (Property) this.settings.propertiesMap.get(name); + //FAWE end } + //FAWE start public boolean hasProperty(PropertyKey key) { int ordinal = key.getId(); return this.settings.propertiesMapArr.length > ordinal && this.settings.propertiesMapArr[ordinal] != null; @@ -203,6 +217,7 @@ public class BlockType implements Keyed, Pattern { return null; } } + //FAWE end /** * Gets the default state of this block type. @@ -210,7 +225,9 @@ public class BlockType implements Keyed, Pattern { * @return The default state */ public BlockState getDefaultState() { + //FAWE start - use settings return this.settings.defaultState; + //FAWE end } public FuzzyBlockState getFuzzyMatcher() { @@ -223,10 +240,12 @@ public class BlockType implements Keyed, Pattern { * @return All possible states */ public List getAllStates() { + //FAWE start - use ordinals if (settings.stateOrdinals == null) { return Collections.singletonList(getDefaultState()); } return IntStream.of(settings.stateOrdinals).filter(i -> i != -1).mapToObj(i -> BlockTypesCache.states[i]).collect(Collectors.toList()); + //FAWE end } /** @@ -234,7 +253,8 @@ public class BlockType implements Keyed, Pattern { * * @return The state, if it exists */ - public BlockState getState(Map, Object> key) { // + public BlockState getState(Map, Object> key) { + //FAWE start - use ids & btp (block type property) int id = getInternalId(); for (Map.Entry, Object> iter : key.entrySet()) { Property prop = iter.getKey(); @@ -250,6 +270,7 @@ public class BlockType implements Keyed, Pattern { id = btp.modify(id, btp.getValueFor((String) value)); } return withStateId(id); + //FAWE end } /** @@ -268,11 +289,13 @@ public class BlockType implements Keyed, Pattern { */ @Nullable public ItemType getItemType() { + //FAWE start - init this if (!initItemType) { initItemType = true; itemType = ItemTypes.get(this.id); } return itemType; + //FAWE end } /** @@ -281,7 +304,9 @@ public class BlockType implements Keyed, Pattern { * @return The material */ public BlockMaterial getMaterial() { + //FAWE start - use settings return this.settings.blockMaterial; + //FAWE end } /** @@ -293,8 +318,10 @@ public class BlockType implements Keyed, Pattern { */ @Deprecated public int getLegacyCombinedId() { + //FAWE start - use LegacyMapper Integer combinedId = LegacyMapper.getInstance().getLegacyCombined(this); return combinedId == null ? 0 : combinedId; + //FAWE end } /** @@ -306,7 +333,9 @@ public class BlockType implements Keyed, Pattern { */ @Deprecated public int getLegacyId() { + //FAWE start return computeLegacy(0); + //FAWE end } /** @@ -320,16 +349,21 @@ public class BlockType implements Keyed, Pattern { */ @Deprecated public int getLegacyData() { + //FAWE start return computeLegacy(1); + //FAWE end } private int computeLegacy(int index) { + //FAWE start if (this.legacyCombinedId == null) { this.legacyCombinedId = LegacyMapper.getInstance().getLegacyCombined(this.getDefaultState()); } return index == 0 ? legacyCombinedId >> 4 : legacyCombinedId & 15; + //FAWE end } + //FAWE start /** * The internal index of this type. * @@ -375,4 +409,5 @@ public class BlockType implements Keyed, Pattern { public SingleBlockTypeMask toMask(Extent extent) { return new SingleBlockTypeMask(extent, this); } + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockTypeUtil.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockTypeUtil.java deleted file mode 100644 index 546623c54..000000000 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockTypeUtil.java +++ /dev/null @@ -1,242 +0,0 @@ -/* - * WorldEdit, a Minecraft world manipulation toolkit - * Copyright (C) sk89q - * Copyright (C) WorldEdit team and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.sk89q.worldedit.world.block; - -import com.sk89q.worldedit.registry.state.PropertyGroup; -import com.sk89q.worldedit.registry.state.PropertyKey; - -import static com.google.common.base.Preconditions.checkNotNull; - -public class BlockTypeUtil { - - public static double centralTopLimit(com.sk89q.worldedit.world.block.BlockType type) { - checkNotNull(type); - return centralTopLimit(type.getDefaultState()); - } - - public static double centralBottomLimit(BlockStateHolder block) { - checkNotNull(block); - BlockType type = block.getBlockType(); - switch (type.getInternalId()) { - case BlockID.CREEPER_WALL_HEAD: - case BlockID.DRAGON_WALL_HEAD: - case BlockID.PLAYER_WALL_HEAD: - case BlockID.ZOMBIE_WALL_HEAD: - return 0.25; - case BlockID.ACACIA_SLAB: - case BlockID.BIRCH_SLAB: - case BlockID.BRICK_SLAB: - case BlockID.COBBLESTONE_SLAB: - case BlockID.DARK_OAK_SLAB: - case BlockID.DARK_PRISMARINE_SLAB: - case BlockID.JUNGLE_SLAB: - case BlockID.NETHER_BRICK_SLAB: - case BlockID.OAK_SLAB: - case BlockID.PETRIFIED_OAK_SLAB: - case BlockID.PRISMARINE_BRICK_SLAB: - case BlockID.PRISMARINE_SLAB: - case BlockID.PURPUR_SLAB: - case BlockID.QUARTZ_SLAB: - case BlockID.RED_SANDSTONE_SLAB: - case BlockID.SANDSTONE_SLAB: - case BlockID.SPRUCE_SLAB: - case BlockID.STONE_BRICK_SLAB: - case BlockID.STONE_SLAB: { - String state = (String) block.getState(PropertyKey.TYPE); - if (state == null) { - return 0; - } - switch (state) { - case "top": - return 0.5; - case "double": - case "bottom": - default: - return 0; - } - } - case BlockID.ACACIA_TRAPDOOR: - case BlockID.BIRCH_TRAPDOOR: - case BlockID.DARK_OAK_TRAPDOOR: - case BlockID.IRON_TRAPDOOR: - case BlockID.JUNGLE_TRAPDOOR: - case BlockID.OAK_TRAPDOOR: - case BlockID.SPRUCE_TRAPDOOR: - if (block.getState(PropertyKey.OPEN) == Boolean.TRUE) { - return 1; - } else if ("bottom".equals(block.getState(PropertyKey.HALF))) { - return 0.8125; - } else { - return 0; - } - case BlockID.ACACIA_FENCE_GATE: - case BlockID.BIRCH_FENCE_GATE: - case BlockID.DARK_OAK_FENCE_GATE: - case BlockID.JUNGLE_FENCE_GATE: - case BlockID.OAK_FENCE_GATE: - case BlockID.SPRUCE_FENCE_GATE: - return block.getState(PropertyKey.OPEN) == Boolean.TRUE ? 1 : 0; - default: - if (type.getMaterial().isMovementBlocker()) { - return 0; - } - return 1; - } - } - - /** - * Returns the y offset a player falls to when falling onto the top of a block at xp+0.5/zp+0.5. - * - * @param block the block - * @return the y offset - */ - public static double centralTopLimit(BlockStateHolder block) { - checkNotNull(block); - BlockType type = block.getBlockType(); - switch (type.getInternalId()) { - case BlockID.BLACK_BED: - case BlockID.BLUE_BED: - case BlockID.BROWN_BED: - case BlockID.CYAN_BED: - case BlockID.GRAY_BED: - case BlockID.GREEN_BED: - case BlockID.LIGHT_BLUE_BED: - case BlockID.LIGHT_GRAY_BED: - case BlockID.LIME_BED: - case BlockID.MAGENTA_BED: - case BlockID.ORANGE_BED: - case BlockID.PINK_BED: - case BlockID.PURPLE_BED: - case BlockID.RED_BED: - case BlockID.WHITE_BED: - case BlockID.YELLOW_BED: - return 0.5625; - case BlockID.BREWING_STAND: - return 0.875; - case BlockID.CAKE: - return (block.getState(PropertyKey.BITES) == (Integer) 6) ? 0 : 0.4375; - case BlockID.CAULDRON: - return 0.3125; - case BlockID.COCOA: - return 0.750; - case BlockID.ENCHANTING_TABLE: - return 0.75; - case BlockID.END_PORTAL_FRAME: - return block.getState(PropertyKey.EYE) == Boolean.TRUE ? 1 : 0.8125; - case BlockID.CREEPER_HEAD: - case BlockID.DRAGON_HEAD: - case BlockID.PISTON_HEAD: - case BlockID.PLAYER_HEAD: - case BlockID.ZOMBIE_HEAD: - return 0.5; - case BlockID.CREEPER_WALL_HEAD: - case BlockID.DRAGON_WALL_HEAD: - case BlockID.PLAYER_WALL_HEAD: - case BlockID.ZOMBIE_WALL_HEAD: - return 0.75; - case BlockID.ACACIA_FENCE: - case BlockID.BIRCH_FENCE: - case BlockID.DARK_OAK_FENCE: - case BlockID.JUNGLE_FENCE: - case BlockID.NETHER_BRICK_FENCE: - case BlockID.OAK_FENCE: - case BlockID.SPRUCE_FENCE: - return 1.5; - case BlockID.ACACIA_SLAB: - case BlockID.BIRCH_SLAB: - case BlockID.BRICK_SLAB: - case BlockID.COBBLESTONE_SLAB: - case BlockID.DARK_OAK_SLAB: - case BlockID.DARK_PRISMARINE_SLAB: - case BlockID.JUNGLE_SLAB: - case BlockID.NETHER_BRICK_SLAB: - case BlockID.OAK_SLAB: - case BlockID.PETRIFIED_OAK_SLAB: - case BlockID.PRISMARINE_BRICK_SLAB: - case BlockID.PRISMARINE_SLAB: - case BlockID.PURPUR_SLAB: - case BlockID.QUARTZ_SLAB: - case BlockID.RED_SANDSTONE_SLAB: - case BlockID.SANDSTONE_SLAB: - case BlockID.SPRUCE_SLAB: - case BlockID.STONE_BRICK_SLAB: - case BlockID.STONE_SLAB: { - String state = (String) block.getState(PropertyKey.TYPE); - if (state == null) { - return 0.5; - } - switch (state) { - case "bottom": - return 0.5; - case "top": - case "double": - return 1; - } - } - case BlockID.LILY_PAD: - return 0.015625; - case BlockID.REPEATER: - return 0.125; - case BlockID.SOUL_SAND: - return 0.875; - case BlockID.COBBLESTONE_WALL: - case BlockID.MOSSY_COBBLESTONE_WALL: - return 1.5; - case BlockID.FLOWER_POT: - return 0.375; - case BlockID.COMPARATOR: - return 0.125; - case BlockID.DAYLIGHT_DETECTOR: - return 0.375; - case BlockID.HOPPER: - return 0.625; - case BlockID.ACACIA_TRAPDOOR: - case BlockID.BIRCH_TRAPDOOR: - case BlockID.DARK_OAK_TRAPDOOR: - case BlockID.IRON_TRAPDOOR: - case BlockID.JUNGLE_TRAPDOOR: - case BlockID.OAK_TRAPDOOR: - case BlockID.SPRUCE_TRAPDOOR: - if (block.getState(PropertyKey.OPEN) == Boolean.TRUE) { - return 0; - } else if ("top".equals(block.getState(PropertyKey.HALF))) { - return 1; - } else { - return 0.1875; - } - case BlockID.ACACIA_FENCE_GATE: - case BlockID.BIRCH_FENCE_GATE: - case BlockID.DARK_OAK_FENCE_GATE: - case BlockID.JUNGLE_FENCE_GATE: - case BlockID.OAK_FENCE_GATE: - case BlockID.SPRUCE_FENCE_GATE: - return block.getState(PropertyKey.OPEN) == Boolean.TRUE ? 0 : 1.5; - default: - if (type.hasProperty(PropertyKey.LAYERS)) { - return PropertyGroup.LEVEL.get(block) * 0.0625; - } - if (!type.getMaterial().isMovementBlocker()) { - return 0; - } - return 1; - - } - } -} diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockTypes.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockTypes.java index 57f9d6aee..7bd2f92bf 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockTypes.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockTypes.java @@ -20,7 +20,7 @@ package com.sk89q.worldedit.world.block; import com.fastasyncworldedit.core.command.SuggestInputParseException; -import com.fastasyncworldedit.core.object.string.JoinedCharSequence; +import com.fastasyncworldedit.core.util.JoinedCharSequence; import com.fastasyncworldedit.core.util.StringMan; import com.sk89q.worldedit.extension.input.InputParseException; import com.sk89q.worldedit.world.registry.LegacyMapper; @@ -39,6 +39,7 @@ import javax.annotation.Nullable; */ @SuppressWarnings("unused") public final class BlockTypes { + //FAWE start - init // Doesn't really matter what the hardcoded values are, as FAWE will update it on load @Nullable public static final BlockType __RESERVED__ = init(); // Placeholder for null index (i.e. when block types are represented as primitives) @Nullable public static final BlockType ACACIA_BUTTON = init(); @@ -998,6 +999,7 @@ public final class BlockTypes { public static Set getNameSpaces() { return BlockTypesCache.$NAMESPACES; } + //FAWE end /** * Gets the {@link BlockType} associated with the given id. @@ -1007,6 +1009,7 @@ public final class BlockTypes { return BlockType.REGISTRY.get(id); } + //FAWE start @Nullable public static BlockType get(final CharSequence id) { return BlockType.REGISTRY.get(id.toString()); @@ -1030,5 +1033,6 @@ public final class BlockTypes { public static int size() { return BlockTypesCache.values.length; } + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockTypesCache.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockTypesCache.java index c5aa2732f..01079cb8c 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockTypesCache.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockTypesCache.java @@ -1,6 +1,7 @@ package com.sk89q.worldedit.world.block; import com.fastasyncworldedit.core.util.MathMan; +import com.fastasyncworldedit.core.world.block.BlockID; import com.google.common.primitives.Booleans; import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.WorldEdit; @@ -8,7 +9,7 @@ import com.sk89q.worldedit.extension.platform.Capability; import com.sk89q.worldedit.extension.platform.Platform; import com.sk89q.worldedit.registry.state.AbstractProperty; import com.sk89q.worldedit.registry.state.Property; -import com.sk89q.worldedit.registry.state.PropertyKey; +import com.fastasyncworldedit.core.registry.state.PropertyKey; import com.sk89q.worldedit.world.registry.BlockMaterial; import com.sk89q.worldedit.world.registry.BlockRegistry; import com.sk89q.worldedit.world.registry.Registries; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/FuzzyBlockState.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/FuzzyBlockState.java index 89958209e..6cb3a6595 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/FuzzyBlockState.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/FuzzyBlockState.java @@ -21,7 +21,7 @@ package com.sk89q.worldedit.world.block; import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.registry.state.Property; -import com.sk89q.worldedit.registry.state.PropertyKey; +import com.fastasyncworldedit.core.registry.state.PropertyKey; import java.util.Collections; import java.util.HashMap; @@ -33,10 +33,13 @@ import static com.google.common.base.Preconditions.checkNotNull; /** * A Fuzzy BlockState. Used for partial matching. * + *

* Immutable, construct with {@link FuzzyBlockState.Builder}. + *

*/ public class FuzzyBlockState extends BlockState { + //FAWE start private final Map props; private final Map, Object> values; @@ -47,7 +50,9 @@ public class FuzzyBlockState extends BlockState { public FuzzyBlockState(BlockState state) { this(state, null); } + //FAWE end + //FAWE start - use internal ids private FuzzyBlockState(BlockState state, Map, Object> values) { super(state.getBlockType(), state.getInternalId(), state.getOrdinal()); if (values == null || values.isEmpty()) { @@ -62,6 +67,7 @@ public class FuzzyBlockState extends BlockState { } } + //FAWE end /** * Gets a full BlockState from this fuzzy one, filling in @@ -79,6 +85,7 @@ public class FuzzyBlockState extends BlockState { return state; } + //FAWE start @Override public boolean equalsFuzzy(BlockStateHolder o) { if (!getBlockType().equals(o.getBlockType())) { @@ -114,6 +121,7 @@ public class FuzzyBlockState extends BlockState { public Map, Object> getStates() { return values; } + //FAWE end /** * Gets an instance of a builder. @@ -124,18 +132,20 @@ public class FuzzyBlockState extends BlockState { return new Builder(); } + //FAWE start @Deprecated @Override public CompoundTag getNbtData() { return getBlockType().getMaterial().isTile() ? getBlockType().getMaterial().getDefaultTile() : null; } + //FAWE end /** * Builder for FuzzyBlockState */ public static class Builder { private BlockType type; - private Map, Object> values = new HashMap<>(); + private final Map, Object> values = new HashMap<>(); /** * The type of the Fuzzy BlockState diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/chunk/AnvilChunk.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/chunk/AnvilChunk.java index bc1ca6fcd..d0af54b97 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/chunk/AnvilChunk.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/chunk/AnvilChunk.java @@ -27,7 +27,7 @@ import com.sk89q.worldedit.util.nbt.BinaryTagTypes; import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; import com.sk89q.worldedit.util.nbt.IntBinaryTag; import com.sk89q.worldedit.util.nbt.ListBinaryTag; -import com.sk89q.worldedit.util.nbt.NbtUtils; +import com.fastasyncworldedit.core.util.NbtUtils; import com.sk89q.worldedit.world.DataException; import com.sk89q.worldedit.world.block.BaseBlock; import com.sk89q.worldedit.world.block.BlockState; @@ -41,7 +41,9 @@ import javax.annotation.Nullable; public class AnvilChunk implements Chunk { + //FAWE start - use CBT > CT private final CompoundBinaryTag rootTag; + //FAWE end private final byte[][] blocks; private final byte[][] blocksAdd; private final byte[][] data; @@ -51,6 +53,7 @@ public class AnvilChunk implements Chunk { private Map tileEntities; + //FAWE start /** * Construct the chunk with a compound tag. * @@ -58,9 +61,11 @@ public class AnvilChunk implements Chunk { * @throws DataException on a data error * @deprecated Use {@link #AnvilChunk(CompoundBinaryTag)} */ + @Deprecated public AnvilChunk(CompoundTag tag) throws DataException { this(tag.asBinaryTag()); } + //FAWE end /** * Construct the chunk with a compound tag. @@ -78,6 +83,7 @@ public class AnvilChunk implements Chunk { blocksAdd = new byte[16][16 * 16 * 8]; data = new byte[16][16 * 16 * 8]; + //FAWE start - use *BinaryTag > *Tag ListBinaryTag sections = NbtUtils.getChildTag(rootTag, "Sections", BinaryTagTypes.LIST); for (BinaryTag rawSectionTag : sections) { @@ -125,6 +131,7 @@ public class AnvilChunk implements Chunk { } } } + //FAWE end private int getBlockID(BlockVector3 position) throws DataException { int x = position.getX() - rootX * 16; @@ -190,6 +197,7 @@ public class AnvilChunk implements Chunk { * Used to load the tile entities. */ private void populateTileEntities() throws DataException { + //FAWE start - use *BinaryTag > *Tag ListBinaryTag tags = NbtUtils.getChildTag(rootTag, "TileEntities", BinaryTagTypes.LIST); tileEntities = new HashMap<>(); @@ -236,6 +244,7 @@ public class AnvilChunk implements Chunk { tileEntities.put(vec, values.build()); } } + //FAWE end /** * Get the map of tags keyed to strings for a block's tile entity data. May @@ -247,6 +256,7 @@ public class AnvilChunk implements Chunk { * @throws DataException thrown if there is a data error */ @Nullable + //FAWE start - use *BinaryTag > * Tag private CompoundBinaryTag getBlockTileEntity(BlockVector3 position) throws DataException { if (tileEntities == null) { populateTileEntities(); @@ -278,5 +288,6 @@ public class AnvilChunk implements Chunk { return state.toBaseBlock(); } + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/chunk/AnvilChunk13.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/chunk/AnvilChunk13.java index 91ebb9bbc..db9eb2daf 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/chunk/AnvilChunk13.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/chunk/AnvilChunk13.java @@ -27,7 +27,7 @@ import com.sk89q.worldedit.util.nbt.BinaryTagTypes; import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; import com.sk89q.worldedit.util.nbt.IntBinaryTag; import com.sk89q.worldedit.util.nbt.ListBinaryTag; -import com.sk89q.worldedit.util.nbt.NbtUtils; +import com.fastasyncworldedit.core.util.NbtUtils; import com.sk89q.worldedit.world.DataException; import com.sk89q.worldedit.world.block.BaseBlock; import com.sk89q.worldedit.world.block.BlockState; @@ -44,14 +44,17 @@ import javax.annotation.Nullable; */ public class AnvilChunk13 implements Chunk { + //FAWE start - CBT > CT private final CompoundBinaryTag rootTag; - private BlockState[][] blocks; - private int rootX; - private int rootZ; + //FAWE end + private final BlockState[][] blocks; + private final int rootX; + private final int rootZ; private Map tileEntities; + //FAWE start /** * Construct the chunk with a compound tag. * @@ -63,6 +66,7 @@ public class AnvilChunk13 implements Chunk { public AnvilChunk13(CompoundTag tag) throws DataException { this(tag.asBinaryTag()); } + //FAWE end /** * Construct the chunk with a compound tag. @@ -78,6 +82,7 @@ public class AnvilChunk13 implements Chunk { blocks = new BlockState[16][]; + //FAWE start - use *BinaryTag > *Tag ListBinaryTag sections = NbtUtils.getChildTag(rootTag, "Sections", BinaryTagTypes.LIST); for (BinaryTag rawSectionTag : sections) { @@ -124,6 +129,7 @@ public class AnvilChunk13 implements Chunk { } palette[paletteEntryId] = blockState; } + //FAWE end // parse block states long[] blockStatesSerialized = NbtUtils.getChildTag(sectionTag, "BlockStates", BinaryTagTypes.LONG_ARRAY).value(); @@ -181,6 +187,7 @@ public class AnvilChunk13 implements Chunk { if (rootTag.get("TileEntities") == null) { return; } + //FAWE start - use *BinaryTag > *Tag ListBinaryTag tags = NbtUtils.getChildTag(rootTag, "TileEntities", BinaryTagTypes.LIST); for (BinaryTag tag : tags) { @@ -197,6 +204,7 @@ public class AnvilChunk13 implements Chunk { BlockVector3 vec = BlockVector3.at(x, y, z); tileEntities.put(vec, t); } + //FAWE end } /** @@ -209,6 +217,7 @@ public class AnvilChunk13 implements Chunk { * @throws DataException thrown if there is a data error */ @Nullable + //FAWE start - use *BinaryTag > *Tag private CompoundBinaryTag getBlockTileEntity(BlockVector3 position) throws DataException { if (tileEntities == null) { populateTileEntities(); @@ -246,5 +255,6 @@ public class AnvilChunk13 implements Chunk { return state.toBaseBlock(); } + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/chunk/AnvilChunk16.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/chunk/AnvilChunk16.java index 13e69458a..342b4f307 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/chunk/AnvilChunk16.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/chunk/AnvilChunk16.java @@ -30,6 +30,7 @@ import com.sk89q.worldedit.world.storage.InvalidFormatException; */ public class AnvilChunk16 extends AnvilChunk13 { + //FAWE start /** * Construct the chunk with a compound tag. * @@ -51,6 +52,7 @@ public class AnvilChunk16 extends AnvilChunk13 { public AnvilChunk16(CompoundBinaryTag tag) throws DataException { super(tag); } + //FAWE end @Override protected void readBlockStates(BlockState[] palette, long[] blockStatesSerialized, BlockState[] chunkSectionBlocks) throws InvalidFormatException { diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/chunk/OldChunk.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/chunk/OldChunk.java index 83f695ed1..45dfd2f56 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/chunk/OldChunk.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/chunk/OldChunk.java @@ -27,7 +27,7 @@ import com.sk89q.worldedit.util.nbt.BinaryTagTypes; import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; import com.sk89q.worldedit.util.nbt.IntBinaryTag; import com.sk89q.worldedit.util.nbt.ListBinaryTag; -import com.sk89q.worldedit.util.nbt.NbtUtils; +import com.fastasyncworldedit.core.util.NbtUtils; import com.sk89q.worldedit.world.DataException; import com.sk89q.worldedit.world.block.BaseBlock; import com.sk89q.worldedit.world.block.BlockState; @@ -43,7 +43,9 @@ import java.util.Map; */ public class OldChunk implements Chunk { + //FAWE start private final CompoundBinaryTag rootTag; + //FAWE end private final byte[] blocks; private final byte[] data; private final int rootX; @@ -51,7 +53,7 @@ public class OldChunk implements Chunk { private Map tileEntities; - + //FAWE start /** * Construct the chunk with a compound tag. * @@ -63,6 +65,7 @@ public class OldChunk implements Chunk { public OldChunk(CompoundTag tag) throws DataException { this(tag.asBinaryTag()); } + //FAWE end /** * Construct the chunk with a compound tag. @@ -70,6 +73,7 @@ public class OldChunk implements Chunk { * @param tag the tag * @throws DataException if there is an error getting the chunk data */ + //FAWE start - use *BinaryTag > *Tag public OldChunk(CompoundBinaryTag tag) throws DataException { rootTag = tag; @@ -209,5 +213,6 @@ public class OldChunk implements Chunk { return state.toBaseBlock(); } + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/entity/EntityType.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/entity/EntityType.java index ec6d04f9f..58d84e18d 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/entity/EntityType.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/entity/EntityType.java @@ -21,13 +21,15 @@ package com.sk89q.worldedit.world.entity; import com.sk89q.worldedit.registry.Keyed; import com.sk89q.worldedit.registry.NamespacedRegistry; -import com.sk89q.worldedit.registry.RegistryItem; +import com.fastasyncworldedit.core.registry.RegistryItem; +//FAWE start - implements RegistryItem public class EntityType implements RegistryItem, Keyed { +//FAWE end public static final NamespacedRegistry REGISTRY = new NamespacedRegistry<>("entity type"); - private String id; + private final String id; public EntityType(String id) { // If it has no namespace, assume minecraft. @@ -42,6 +44,7 @@ public class EntityType implements RegistryItem, Keyed { return this.id; } + //FAWE start private int internalId; @Override @@ -53,6 +56,7 @@ public class EntityType implements RegistryItem, Keyed { public int getInternalId() { return internalId; } + //FAWE end /** * Gets the name of this item, or the ID if the name cannot be found. diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/entity/EntityTypes.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/entity/EntityTypes.java index d613417d2..606032039 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/entity/EntityTypes.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/entity/EntityTypes.java @@ -155,6 +155,7 @@ public final class EntityTypes { return EntityType.REGISTRY.get(id); } + //FAWE Start private static String convertEntityId(String id) { if (id.startsWith("minecraft:")) { id = id.substring(10); @@ -265,5 +266,6 @@ public final class EntityTypes { public static EntityType parse(String id) { return get(convertEntityId(id)); } + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/fluid/FluidType.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/fluid/FluidType.java index 8f3e60ae3..ab3ec1989 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/fluid/FluidType.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/fluid/FluidType.java @@ -21,17 +21,19 @@ package com.sk89q.worldedit.world.fluid; import com.sk89q.worldedit.registry.Keyed; import com.sk89q.worldedit.registry.NamespacedRegistry; -import com.sk89q.worldedit.registry.RegistryItem; +import com.fastasyncworldedit.core.registry.RegistryItem; /** * Minecraft now has a 'fluid' system. This is a * stub class to represent what it may be in the future. */ +//FAWE start - implements RegistryItem public class FluidType implements RegistryItem, Keyed { +//FAWE end public static final NamespacedRegistry REGISTRY = new NamespacedRegistry<>("fluid type"); - private String id; + private final String id; public FluidType(String id) { this.id = id; @@ -47,6 +49,7 @@ public class FluidType implements RegistryItem, Keyed { return this.id; } + //FAWE start private int internalId; //UNUSED @@ -60,6 +63,7 @@ public class FluidType implements RegistryItem, Keyed { public int getInternalId() { return internalId; } + //FAWE end @Override public String toString() { diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/gamemode/GameMode.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/gamemode/GameMode.java index 987cbec1c..312caa3b5 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/gamemode/GameMode.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/gamemode/GameMode.java @@ -26,7 +26,7 @@ public class GameMode implements Keyed { public static final Registry REGISTRY = new Registry<>("game mode"); - private String id; + private final String id; public GameMode(String id) { this.id = id; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/item/ItemType.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/item/ItemType.java index 6dbe6c1bd..ef8bea2e8 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/item/ItemType.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/item/ItemType.java @@ -25,7 +25,7 @@ import com.sk89q.worldedit.blocks.BaseItemStack; import com.sk89q.worldedit.extension.platform.Capability; import com.sk89q.worldedit.registry.Keyed; import com.sk89q.worldedit.registry.NamespacedRegistry; -import com.sk89q.worldedit.registry.RegistryItem; +import com.fastasyncworldedit.core.registry.RegistryItem; import com.sk89q.worldedit.util.GuavaUtil; import com.sk89q.worldedit.util.concurrency.LazyReference; import com.sk89q.worldedit.util.formatting.text.Component; @@ -35,7 +35,9 @@ import com.sk89q.worldedit.world.registry.ItemMaterial; import javax.annotation.Nullable; +//FAWE start - implements RegistryItem public class ItemType implements RegistryItem, Keyed { +//FAWE end public static final NamespacedRegistry REGISTRY = new NamespacedRegistry<>("item type"); @@ -57,9 +59,11 @@ public class ItemType implements RegistryItem, Keyed { WorldEdit.getInstance().getPlatformManager().queryCapability(Capability.GAME_HOOKS) .getRegistries().getItemRegistry().getMaterial(this) ); + //FAWE start private BlockType blockType; private boolean initBlockType; private BaseItem defaultState; + //FAWE end public ItemType(String id) { // If it has no namespace, assume minecraft. @@ -74,6 +78,7 @@ public class ItemType implements RegistryItem, Keyed { return this.id; } + //FAWE start private int internalId; @Override @@ -89,6 +94,7 @@ public class ItemType implements RegistryItem, Keyed { public Component getRichName() { return richName.getValue(); } + //FAWE end /** * Gets the name of this item, or the ID if the name cannot be found. @@ -125,12 +131,14 @@ public class ItemType implements RegistryItem, Keyed { return this.blockType; } + //FAWE start public BaseItem getDefaultState() { if (defaultState == null) { this.defaultState = new BaseItemStack(this); } return this.defaultState; } + //FAWE end /** * Get the material for this ItemType. diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/item/ItemTypes.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/item/ItemTypes.java index 6bd091dc3..1afe9a6e3 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/item/ItemTypes.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/item/ItemTypes.java @@ -19,8 +19,8 @@ package com.sk89q.worldedit.world.item; -import com.fastasyncworldedit.core.object.string.JoinedCharSequence; -import com.sk89q.worldedit.world.block.ItemTypesCache; +import com.fastasyncworldedit.core.util.JoinedCharSequence; +import com.fastasyncworldedit.core.world.block.ItemTypesCache; import com.sk89q.worldedit.world.registry.LegacyMapper; import java.lang.reflect.Field; @@ -35,6 +35,7 @@ import javax.annotation.Nullable; */ @SuppressWarnings("unused") public final class ItemTypes { + //FAWE start - init @Nullable public static final ItemType ACACIA_BOAT = init(); @Nullable public static final ItemType ACACIA_BUTTON = init(); @Nullable public static final ItemType ACACIA_DOOR = init(); @@ -1187,6 +1188,7 @@ public final class ItemTypes { } return get(input); } + //FAWE end /** * Gets the {@link ItemType} associated with the given id. @@ -1196,6 +1198,7 @@ public final class ItemTypes { return ItemType.REGISTRY.get(id); } + //FAWE start @Deprecated public static ItemType get(int ordinal) { return ItemType.REGISTRY.getByInternalId(ordinal); @@ -1208,4 +1211,5 @@ public final class ItemTypes { public static Collection values() { return ItemType.REGISTRY.values(); } + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/BlockMaterial.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/BlockMaterial.java index 875d654c1..64e801069 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/BlockMaterial.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/BlockMaterial.java @@ -97,12 +97,6 @@ public interface BlockMaterial { */ int getLightValue(); - /** - * Get the opacity of the block. - * @return opacity - */ - int getLightOpacity(); - /** * Get whether this block breaks when it is pushed by a piston. * @@ -168,6 +162,13 @@ public interface BlockMaterial { */ boolean hasContainer(); + //FAWE start + /** + * Get the opacity of the block. + * @return opacity + */ + int getLightOpacity(); + /** * Gets whether the block is a tile entity. * @@ -188,4 +189,5 @@ public interface BlockMaterial { * @return or 0 */ int getMapColor(); + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/BlockRegistry.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/BlockRegistry.java index e7bad3d86..26ebf619d 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/BlockRegistry.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/BlockRegistry.java @@ -65,10 +65,12 @@ public interface BlockRegistry { @Nullable BlockMaterial getMaterial(BlockType blockType); + //FAWE start @Nullable default BlockMaterial getMaterial(BlockState state) { return getMaterial(state.getBlockType()); } + //FAWE end /** * Get an unmodifiable map of states for this block. @@ -86,10 +88,12 @@ public interface BlockRegistry { */ OptionalInt getInternalBlockStateId(BlockState state); + //FAWE start /** * Register all blocks. */ default Collection values() { return Collections.emptyList(); } + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/BundledBlockData.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/BundledBlockData.java index 9fdd1baad..3bf4633b1 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/BundledBlockData.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/BundledBlockData.java @@ -82,6 +82,7 @@ public final class BundledBlockData { private void loadFromResource() throws IOException { GsonBuilder gsonBuilder = new GsonBuilder(); gsonBuilder.registerTypeAdapter(Vector3.class, new VectorAdapter()); + //FAWE start gsonBuilder.registerTypeAdapter(int.class, (JsonDeserializer) (json, typeOfT, context) -> { JsonPrimitive primitive = (JsonPrimitive) json; if (primitive.isString()) { @@ -93,6 +94,7 @@ public final class BundledBlockData { } return primitive.getAsInt(); }); + //FAWE end Gson gson = gsonBuilder.create(); URL url = null; final int dataVersion = WorldEdit.getInstance().getPlatformManager().queryCapability(Capability.WORLD_EDITING).getDataVersion(); @@ -162,9 +164,11 @@ public final class BundledBlockData { } public static class BlockEntry { + //FAWE start - made public public String id; public String localizedName; public SimpleBlockMaterial material = new SimpleBlockMaterial(); + //FAWE end } } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/BundledBlockRegistry.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/BundledBlockRegistry.java index a5965f0db..2e497c765 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/BundledBlockRegistry.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/BundledBlockRegistry.java @@ -53,6 +53,16 @@ public class BundledBlockRegistry implements BlockRegistry { ); } + @Nullable + @Override + @Deprecated + // dumb_intellij.jpg - Ok?? + @SuppressWarnings("deprecation") + public String getName(BlockType blockType) { + BundledBlockData.BlockEntry blockEntry = BundledBlockData.getInstance().findById(blockType.getId()); + return blockEntry != null ? blockEntry.localizedName : null; + } + @Nullable @Override public BlockMaterial getMaterial(BlockType blockType) { diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/EntityRegistry.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/EntityRegistry.java index af3b3f8f9..205a9df7c 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/EntityRegistry.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/EntityRegistry.java @@ -39,15 +39,6 @@ public interface EntityRegistry { * @return the entity, which may be null if the entity does not exist */ @Nullable - default BaseEntity createFromId(String id) { - EntityType entType = EntityTypes.get(id); - return entType == null ? null : new BaseEntity(entType); - } + BaseEntity createFromId(String id); - /** - * Register all entities. - */ - default Collection registerEntities() { - return Collections.emptyList(); - } } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/ItemRegistry.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/ItemRegistry.java index 7458da4d9..483166f9c 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/ItemRegistry.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/ItemRegistry.java @@ -69,10 +69,12 @@ public interface ItemRegistry { @Nullable ItemMaterial getMaterial(ItemType itemType); + //FAWE start /** * Register all items. */ default Collection values() { return Collections.emptyList(); } + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/LegacyMapper.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/LegacyMapper.java index 4362d1140..ca25ba29e 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/LegacyMapper.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/LegacyMapper.java @@ -35,7 +35,7 @@ import com.sk89q.worldedit.extension.platform.Capability; import com.sk89q.worldedit.internal.Constants; import com.sk89q.worldedit.internal.util.LogManagerCompat; import com.sk89q.worldedit.math.Vector3; -import com.sk89q.worldedit.registry.state.PropertyKey; +import com.fastasyncworldedit.core.registry.state.PropertyKey; import com.sk89q.worldedit.util.gson.VectorAdapter; import com.sk89q.worldedit.util.io.ResourceLoader; import com.sk89q.worldedit.world.DataFixer; @@ -60,15 +60,15 @@ public final class LegacyMapper { private static LegacyMapper INSTANCE; private final ResourceLoader resourceLoader; + //FAWE start private final Int2ObjectArrayMap blockStateToLegacyId4Data = new Int2ObjectArrayMap<>(); private final Int2ObjectArrayMap extraId4DataToStateId = new Int2ObjectArrayMap<>(); private final int[] blockArr = new int[4096]; private final BiMap itemMap = HashBiMap.create(); - private Map blockEntries = new HashMap<>(); + private final Map blockEntries = new HashMap<>(); + //FAWE end private final Map stringToBlockMap = new HashMap<>(); private final Multimap blockToStringMap = HashMultimap.create(); - private final Map stringToItemMap = new HashMap<>(); - private final Multimap itemToStringMap = HashMultimap.create(); /** * Create a new instance. @@ -107,11 +107,14 @@ public final class LegacyMapper { for (Map.Entry blockEntry : dataFile.blocks.entrySet()) { String id = blockEntry.getKey(); - Integer combinedId = getCombinedId(blockEntry.getKey()); final String value = blockEntry.getValue(); + //FAWE start + Integer combinedId = getCombinedId(blockEntry.getKey()); blockEntries.put(id, value); + //FAWE end BlockState state = null; + //FAWE start try { state = BlockState.get(null, blockEntry.getValue()); BlockType type = state.getBlockType(); @@ -120,11 +123,12 @@ public final class LegacyMapper { } } catch (InputParseException f) { BlockFactory blockFactory = WorldEdit.getInstance().getBlockFactory(); + //FAWE end // if fixer is available, try using that first, as some old blocks that were renamed share names with new blocks if (fixer != null) { try { - String newEntry = fixer.fixUp(DataFixer.FixTypes.BLOCK_STATE, value, 1631); + String newEntry = fixer.fixUp(DataFixer.FixTypes.BLOCK_STATE, value, Constants.DATA_VERSION_MC_1_13_2); state = blockFactory.parseFromInput(newEntry, parserContext).toImmutableState(); } catch (InputParseException ignored) { } @@ -147,6 +151,7 @@ public final class LegacyMapper { stringToBlockMap.put(id, state); } } + //FAWE start if (state != null) { blockArr[combinedId] = state.getInternalId(); blockStateToLegacyId4Data.put(state.getInternalId(), (Integer) combinedId); @@ -164,6 +169,7 @@ public final class LegacyMapper { } } } + //FAWE end for (Map.Entry itemEntry : dataFile.items.entrySet()) { String id = itemEntry.getKey(); @@ -184,6 +190,7 @@ public final class LegacyMapper { } } + //FAWE start private int getCombinedId(String input) { String[] split = input.split(":"); return (Integer.parseInt(split[0]) << 4) + (split.length == 2 ? Integer.parseInt(split[1]) : 0); @@ -200,7 +207,9 @@ public final class LegacyMapper { } return itemMap.get(getCombinedId(input)); } + //FAWE end + //FAWE start - use internal ids public BlockState getBlockFromLegacy(String input) { if (input.startsWith("minecraft:")) { input = input.substring(10); @@ -212,6 +221,7 @@ public final class LegacyMapper { } return null; } + //FAWE end @Nullable public ItemType getItemFromLegacy(int legacyId, int data) { @@ -233,6 +243,7 @@ public final class LegacyMapper { } } + //FAWE start @Nullable public BlockState getBlockFromLegacy(int legacyId) { return getBlock(legacyId << 4); @@ -297,6 +308,7 @@ public final class LegacyMapper { public Integer getLegacyCombined(BlockType type) { return blockStateToLegacyId4Data.get(type.getDefaultState().getInternalId()); } + //FAWE end @Deprecated public int[] getLegacyFromBlock(BlockState blockState) { diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/PassthroughBlockMaterial.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/PassthroughBlockMaterial.java index b6bdb6502..95743b80a 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/PassthroughBlockMaterial.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/PassthroughBlockMaterial.java @@ -50,6 +50,7 @@ public class PassthroughBlockMaterial implements BlockMaterial { return blockMaterial.isAir(); } + //FAWE start @Override public int getMapColor() { if (blockMaterial == null) { @@ -58,6 +59,7 @@ public class PassthroughBlockMaterial implements BlockMaterial { return blockMaterial.getMapColor(); } } + //FAWE end @Override public boolean isFullCube() { @@ -104,10 +106,12 @@ public class PassthroughBlockMaterial implements BlockMaterial { return blockMaterial.getLightValue(); } + //FAWE start @Override public int getLightOpacity() { return blockMaterial.getLightOpacity(); } + //FAWE end @Override public boolean isFragileWhenPushed() { @@ -154,6 +158,7 @@ public class PassthroughBlockMaterial implements BlockMaterial { return blockMaterial.hasContainer(); } + //FAWE start @Override public boolean isTile() { return blockMaterial.isTile(); @@ -163,4 +168,5 @@ public class PassthroughBlockMaterial implements BlockMaterial { public CompoundTag getDefaultTile() { return blockMaterial.getDefaultTile(); } + //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/SimpleBlockMaterial.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/SimpleBlockMaterial.java index 4eeb5f139..bf1e7f6b1 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/SimpleBlockMaterial.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/SimpleBlockMaterial.java @@ -42,16 +42,19 @@ class SimpleBlockMaterial implements BlockMaterial { private boolean replacedDuringPlacement; private boolean isTranslucent; private boolean hasContainer; + //FAWE start private int lightOpacity; private int mapColor; private boolean isTile; private CompoundTag tile = null; + //FAWE end @Override public boolean isAir() { return this.isAir; } + //FAWE start @Override public int getMapColor() { return mapColor; @@ -69,6 +72,7 @@ class SimpleBlockMaterial implements BlockMaterial { public void setLightOpacity(int lightOpacity) { this.lightOpacity = lightOpacity; } + //FAWE end public void setIsAir(boolean isAir) { this.isAir = isAir; @@ -232,6 +236,7 @@ class SimpleBlockMaterial implements BlockMaterial { return this.hasContainer; } + //FAWE start public void setIsTile(boolean isTile) { this.isTile = isTile; } @@ -249,6 +254,7 @@ class SimpleBlockMaterial implements BlockMaterial { public CompoundTag getDefaultTile() { return tile; } + //FAWE end public void setHasContainer(boolean hasContainer) { this.hasContainer = hasContainer; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/SimpleItemMaterial.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/SimpleItemMaterial.java index c121260a3..fc7c36cb9 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/SimpleItemMaterial.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/SimpleItemMaterial.java @@ -21,8 +21,8 @@ package com.sk89q.worldedit.world.registry; public class SimpleItemMaterial implements ItemMaterial { - private int maxStackSize; - private int maxDamage; + private final int maxStackSize; + private final int maxDamage; public SimpleItemMaterial(int maxStackSize, int maxDamage) { this.maxStackSize = maxStackSize; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/snapshot/SnapshotRestore.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/snapshot/SnapshotRestore.java index 0965dcf24..52d3b6fd8 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/snapshot/SnapshotRestore.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/snapshot/SnapshotRestore.java @@ -19,7 +19,7 @@ package com.sk89q.worldedit.world.snapshot; -import com.fastasyncworldedit.core.object.collection.LocalBlockVectorSet; +import com.fastasyncworldedit.core.math.LocalBlockVectorSet; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.MaxChangedBlocksException; import com.sk89q.worldedit.math.BlockVector2; @@ -43,7 +43,9 @@ import java.util.Set; */ public class SnapshotRestore { + //FAWE start - Set instead of ArrayList private final Map> neededChunks = new LinkedHashMap<>(); + //FAWE end private final ChunkStore chunkStore; private final EditSession editSession; private ArrayList missingChunks; @@ -129,7 +131,7 @@ public class SnapshotRestore { /** * Restores to world. * - * @throws MaxChangedBlocksException + * @throws MaxChangedBlocksException if the max block change limit is exceeded */ public void restore() throws MaxChangedBlocksException { diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/snapshot/YYMMDDHHIISSParser.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/snapshot/YYMMDDHHIISSParser.java index f7b5af070..49a8269aa 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/snapshot/YYMMDDHHIISSParser.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/snapshot/YYMMDDHHIISSParser.java @@ -27,7 +27,7 @@ import java.util.regex.Pattern; public class YYMMDDHHIISSParser implements SnapshotDateParser { - private Pattern datePattern = + private final Pattern datePattern = Pattern.compile("([0-9]+)[^0-9]?([0-9]+)[^0-9]?([0-9]+)[^0-9]?" + "([0-9]+)[^0-9]?([0-9]+)[^0-9]?([0-9]+)(\\..*)?"); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/snapshot/experimental/SnapshotRestore.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/snapshot/experimental/SnapshotRestore.java index cce124cf4..9d1f15256 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/snapshot/experimental/SnapshotRestore.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/snapshot/experimental/SnapshotRestore.java @@ -127,7 +127,7 @@ public class SnapshotRestore { /** * Restores to world. * - * @throws MaxChangedBlocksException + * @throws MaxChangedBlocksException if the max block change limit is exceeded */ public void restore() throws MaxChangedBlocksException { diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/storage/ChunkStoreHelper.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/storage/ChunkStoreHelper.java index 76a1c82b5..4b1a2f927 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/storage/ChunkStoreHelper.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/storage/ChunkStoreHelper.java @@ -97,7 +97,9 @@ public class ChunkStoreHelper { if (tag.getValue().containsKey("Sections") && dataVersion < currentDataVersion) { // only fix up MCA format, DFU doesn't support MCR chunks final DataFixer dataFixer = platform.getDataFixer(); if (dataFixer != null) { + //FAWE start - use Adventure tag = (CompoundTag) ((CompoundTag) AdventureNBTConverter.fromAdventure(dataFixer.fixUp(DataFixer.FixTypes.CHUNK, rootTag.asBinaryTag(), dataVersion))).getValue().get("Level"); + //FAWE end dataVersion = currentDataVersion; } } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/storage/FileMcRegionChunkStore.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/storage/FileMcRegionChunkStore.java index b9a045de4..2eb1f4c19 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/storage/FileMcRegionChunkStore.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/storage/FileMcRegionChunkStore.java @@ -30,7 +30,7 @@ import java.util.regex.Pattern; public class FileMcRegionChunkStore extends McRegionChunkStore { - private File path; + private final File path; /** * Create an instance. The passed path is the folder to read the diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/storage/LegacyChunkStore.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/storage/LegacyChunkStore.java index 2a50f7ed2..69a531f3f 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/storage/LegacyChunkStore.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/storage/LegacyChunkStore.java @@ -92,7 +92,7 @@ public abstract class LegacyChunkStore extends ChunkStore { * @param f2 the second part of the path * @param name the name * @return an input stream - * @throws IOException + * @throws IOException if there is an error getting the chunk data */ protected abstract InputStream getInputStream(String f1, String f2, String name) throws IOException, DataException; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/storage/McRegionChunkStore.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/storage/McRegionChunkStore.java index 8daf257dc..4e284623d 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/storage/McRegionChunkStore.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/storage/McRegionChunkStore.java @@ -78,7 +78,7 @@ public abstract class McRegionChunkStore extends ChunkStore { * @param name the name of the chunk file * @param worldName the world name * @return an input stream - * @throws IOException + * @throws IOException if there is an error getting the chunk data */ protected abstract InputStream getInputStream(String name, String worldName) throws IOException, DataException; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/storage/McRegionReader.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/storage/McRegionReader.java index b441d4e14..6131be919 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/storage/McRegionReader.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/storage/McRegionReader.java @@ -87,10 +87,9 @@ public class McRegionReader { * Construct the reader. * * @param stream the stream - * @throws DataException - * @throws IOException + * @throws IOException if there is an error getting the region data */ - public McRegionReader(InputStream stream) throws DataException, IOException { + public McRegionReader(InputStream stream) throws IOException { this.stream = new ForwardSeekableInputStream(stream); this.dataStream = new DataInputStream(this.stream); @@ -100,7 +99,7 @@ public class McRegionReader { /** * Read the header. * - * @throws IOException + * @throws IOException if there is an error getting the header data */ private void readHeader() throws IOException { offsets = new int[SECTOR_INTS]; @@ -116,8 +115,8 @@ public class McRegionReader { * * @param position chunk position * @return an input stream - * @throws IOException - * @throws DataException + * @throws IOException if there is an error getting the chunk data + * @throws DataException if there is an error getting the chunk data */ public synchronized InputStream getChunkInputStream(BlockVector2 position) throws IOException, DataException { int x = position.getBlockX() & 31; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/storage/ZippedLegacyChunkStore.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/storage/ZippedLegacyChunkStore.java index cd5fac2a0..20a7ddb8f 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/storage/ZippedLegacyChunkStore.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/storage/ZippedLegacyChunkStore.java @@ -45,6 +45,8 @@ public class ZippedLegacyChunkStore extends LegacyChunkStore { * * @param zipFile the zip file * @param folder the folder + * @throws IOException if there is an error opening the zip + * @throws ZipException if there is an error opening the zip */ public ZippedLegacyChunkStore(File zipFile, String folder) throws IOException, ZipException { this.folder = folder; @@ -57,6 +59,8 @@ public class ZippedLegacyChunkStore extends LegacyChunkStore { * be detected. * * @param zipFile the zip file + * @throws IOException if there is an error opening the zip + * @throws ZipException if there is an error opening the zip */ public ZippedLegacyChunkStore(File zipFile) throws IOException, ZipException { zip = new ZipFile(zipFile); @@ -69,6 +73,8 @@ public class ZippedLegacyChunkStore extends LegacyChunkStore { * @param f2 the second part of the path * @param name the name of the file * @return an input stream + * @throws IOException if there is an error getting the chunk data + * @throws DataException if there is an error getting the chunk data */ @Override protected InputStream getInputStream(String f1, String f2, String name) throws IOException, DataException { diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/storage/ZippedMcRegionChunkStore.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/storage/ZippedMcRegionChunkStore.java index 67f656071..030004ee3 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/storage/ZippedMcRegionChunkStore.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/storage/ZippedMcRegionChunkStore.java @@ -48,6 +48,8 @@ public class ZippedMcRegionChunkStore extends McRegionChunkStore { * * @param zipFile the ZIP file * @param folder the folder + * @throws IOException if there is an error opening the zip + * @throws ZipException if there is an error opening the zip */ public ZippedMcRegionChunkStore(File zipFile, String folder) throws IOException, ZipException { this.zipFile = zipFile; @@ -61,6 +63,8 @@ public class ZippedMcRegionChunkStore extends McRegionChunkStore { * be detected. * * @param zipFile the ZIP file + * @throws IOException if there is an error opening the zip + * @throws ZipException if there is an error opening the zip */ public ZippedMcRegionChunkStore(File zipFile) throws IOException, ZipException { this.zipFile = zipFile; @@ -77,12 +81,18 @@ public class ZippedMcRegionChunkStore extends McRegionChunkStore { } } else { Pattern pattern = Pattern.compile(".*\\.mc[ra]$"); + Pattern worldPattern = Pattern.compile(worldName + "[\\\\/].*"); for (Enumeration e = zip.entries(); e.hasMoreElements(); ) { ZipEntry testEntry = e.nextElement(); // Check for world - if (testEntry.getName().startsWith(worldName + "/")) { - if (pattern.matcher(testEntry.getName()).matches()) { // does entry end in .mca - folder = testEntry.getName().substring(0, testEntry.getName().lastIndexOf('/')); + String entryName = testEntry.getName(); + if (worldPattern.matcher(entryName).matches()) { + if (pattern.matcher(entryName).matches()) { // does entry end in .mca + int endIndex = entryName.lastIndexOf('/'); + if (endIndex < 0) { + endIndex = entryName.lastIndexOf('\\'); + } + folder = entryName.substring(0, endIndex); if (folder.endsWith("poi")) { continue; } diff --git a/worldedit-core/src/main/resources/lang/strings.json b/worldedit-core/src/main/resources/lang/strings.json index e5a435fe9..1d3cb2537 100644 --- a/worldedit-core/src/main/resources/lang/strings.json +++ b/worldedit-core/src/main/resources/lang/strings.json @@ -252,6 +252,7 @@ "worldedit.tool.error.cannot-bind": "Can't bind tool to {0}: {1}", "worldedit.error.file-aborted": "File selection aborted.", "worldedit.error.world-unloaded": "The world was unloaded already.", + "worldedit.error.blocks-cant-be-used": "Blocks can't be used", "worldedit.brush.radius-too-large": "Maximum allowed brush radius: {0}", "worldedit.brush.apply.description": "Apply brush, apply a function to every block", @@ -278,7 +279,7 @@ "worldedit.setbiome.changed": "Biomes were changed in {0} columns. You may have to rejoin your game (or close and reopen your world) to see a change.", "worldedit.drawsel.disabled": "Server CUI disabled.", - "worldedit.drawsel.enabled": "Server CUI enabled. This only supports cuboid regions, with a maximum size of 32x32x32 on versions lower than 1.16, otherwise 48x48x48.", + "worldedit.drawsel.enabled": "Server CUI enabled. This only supports cuboid regions, with a maximum size of {0}x{1}x{2}.", "worldedit.drawsel.disabled.already": "Server CUI already disabled.", "worldedit.drawsel.enabled.already": "Server CUI already enabled.", "worldedit.limit.too-high": "Your maximum allowable limit is {0}.", @@ -380,8 +381,8 @@ "worldedit.pos.console-require-coords": "You must provide coordinates as console.", "worldedit.hpos.no-block": "No block in sight!", "worldedit.hpos.already-set": "Position already set.", - "worldedit.chunk.selected-multiple": "Chunks selected: ({0}, {1}) - ({2}, {3})", - "worldedit.chunk.selected": "Chunk selected: {0}, {1}", + "worldedit.chunk.selected-multiple": "Chunks selected: ({0}, {1}, {2}) - ({3}, {4}, {5})", + "worldedit.chunk.selected": "Chunk selected: {0}, {1}, {2}", "worldedit.wand.invalid": "Wand item is mis-configured or disabled.", "worldedit.wand.selwand.info": "Left click: select pos #1; Right click: select pos #2", "worldedit.wand.selwand.now.tool": "The selection wand is now a normal tool. You can disable it with {0} and rebind it to any item with {1} or get a new wand with {2}.", diff --git a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricPlatform.java b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricPlatform.java index c466cba48..8c9555f35 100644 --- a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricPlatform.java +++ b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricPlatform.java @@ -189,12 +189,12 @@ class FabricPlatform extends AbstractPlatform implements MultiUserPlatform { return mod.getInternalVersion(); } - // FAWE start + //FAWE start @Override public String getId() { return "intellectualsites:fabric"; } - // FAWE end + //FAWE end @Override public Map getCapabilities() { diff --git a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgePlatform.java b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgePlatform.java index dd55d77d2..6e7edc987 100644 --- a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgePlatform.java +++ b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgePlatform.java @@ -195,12 +195,12 @@ class ForgePlatform extends AbstractPlatform implements MultiUserPlatform { return mod.getInternalVersion(); } - // FAWE start + //FAWE start @Override public String getId() { return "intellectualsites:forge"; } - // FAWE end + //FAWE end @Override public Map getCapabilities() { diff --git a/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongePlatform.java b/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongePlatform.java index 370fddbe9..077c408f0 100644 --- a/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongePlatform.java +++ b/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongePlatform.java @@ -184,12 +184,12 @@ class SpongePlatform extends AbstractPlatform implements MultiUserPlatform { return mod.getInternalVersion(); } - // FAWE start + //FAWE start @Override public String getId() { return "intellectualsites:sponge"; } - // FAWE end + //FAWE end @Override public Map getCapabilities() {