Store class

Пакет: com.hypixel.hytale.component

Файл: com/hypixel/hytale/component/Store.java

implements: ComponentAccessor<ECS_TYPE>

Поля (371)

МодификаторыТипИмя
return this.count > 0
final Store[] EMPTY_ARRAY
break
break
break
break
break
break
break
break
break
break
break
private int count
BitSet systemIndexesx
BitSet systemIndexesx
int systemIndexx
int systemIndexx
SystemType systemTypex
SystemType systemTypex
ComponentRegistry.Data var1
CommandBuffer var1
ObjectArrayList var1
Thread var1
int var10
Ref var10
SystemType var10
ComponentRegistry.Data var10
BitSet var10
BitSet var10
BitSet var10
ArchetypeChunk var10
int var10
EntityEventSystem var10
int var10
var10
int var10
int var10
ArchetypeChunk var10
BitSet var10
QuerySystem var10
SystemType var11
BitSet var11
SystemType var11
int var11
int var11
ComponentRegistry.Data var11
BitSet var11
EntityEventSystem var11
boolean var11
ComponentRegistry.Data var11
BitSet var12
BitSet var12
BitSet var12
RefChangeSystem var12
RefChangeSystem var12
BitSet var12
ComponentRegistry.Data var12
ArchetypeChunk var12
ArchetypeChunk var12
BitSet var12
ArchetypeChunk var12
BitSet var13
int var13
var13
var13
var13
int var13
int var13
var13
int var13
BitSet var13
BitSet var13
HistoricMetric[] var13
Archetype var13
SystemType var13
int var13
HolderSystem var14
RefChangeSystem var14
int var14
int var14
SystemType var14
BitSet var14
RefChangeSystem var14
RefSystem var15
Ref var15
RefChangeSystem var15
ArchetypeChunk var15
int var15
boolean var16
Holder var16
BitSet var16
int var16
ArchetypeChunk var16
int var17
Ref var17
ParallelRangeTask var17
ArchetypeChunk var18
int var18
int var19
ISystem var19
HistoricMetric[] var2
int var2
int var2
int var2
CommandBuffer var2
CommandBuffer var2
CommandBuffer var2
WorldEventType var2
int var2
int var2
var2
var2
int var2
int var20
boolean var20
int var21
int var21
int var22
String var22
SystemType var23
ArchetypeChunk var24
Ref var24
CommandBuffer var25
BitSet var25
Codec var25
ComponentRegistry.Data var26
int var26
CommandBuffer var26
ArchetypeChunk var26
int var27
HolderSystem var27
ArchetypeChunk var27
int var28
Holder var28
SystemType var29
int var29
SystemMetricData[] var3
CompletableFuture[] var3
int var3
BitSet var3
ArchetypeChunk var3
Component[] var3
var3
var3
CommandBuffer var3
CommandBuffer var3
Component var3
int var3
CommandBuffer var3
CommandBuffer var3
boolean var3
var3
CommandBuffer var3
CommandBuffer var3
CommandBuffer var3
CommandBuffer var3
CommandBuffer var3
EntityEventType var3
EntityHolderEventType var3
ComponentRegistry.Data var3
WorldEventType var3
ComponentRegistry.Data var3
int var3
int var3
ComponentRegistry.Data var3
Archetype var3
Ref var30
int var30
BitSet var31
ArchetypeChunk var32
int var33
Archetype var33
ArchetypeChunk var34
Archetype var34
var34
HolderSystem var35
Archetype var35
Ref var36
int var36
int var36
ArchetypeChunk var37
int var38
Ref var39
Holder var39
ResourceType var4
int var4
int var4
Archetype var4
ComponentRegistry.Data var4
CommandBuffer var4
ArchetypeChunk var4
Component var4
var4
var4
CommandBuffer var4
CommandBuffer var4
CommandBuffer var4
ArchetypeChunk var4
ArchetypeChunk var4
boolean var4
var4
var4
ArchetypeChunk var4
boolean var4
var4
var4
BitSet var4
boolean var4
var4
ArchetypeChunk var4
ComponentRegistry.Data var4
ComponentRegistry.Data var4
ComponentRegistry.Data var4
CommandBuffer var4
EntityEventType var4
EntityHolderEventType var4
ComponentRegistry.Data var4
BitSet var4
CommandBuffer var4
UnknownComponents var4
int var4
ComponentRegistry.Data var4
BitSet var40
RefSystem var41
ISystem var5
int var5
ArchetypeChunk var5
String[] var5
ComponentRegistry.Data var5
Ref[] var5
int var5
Holder[] var5
Component var5
ArchetypeChunk var5
ArchetypeChunk var5
ArchetypeChunk var5
Component var5
int var5
ArchetypeChunk var5
ArchetypeChunk var5
int var5
int var5
BitSet var5
int var5
CommandBuffer var5
ComponentRegistry.Data var5
CommandBuffer var5
CommandBuffer var5
BitSet var5
ComponentRegistry.Data var5
ComponentRegistry.Data var5
BitSet var5
int var5
boolean var5
ResourceType var5
ISystem var5
ComponentType var5
UnknownComponents var5
UnknownComponents var5
var5
var5
ArchetypeChunk var5
int var5
BitSet var5
MetricResults var6
var6
ResourceType var6
int var6
int var6
ComponentType var6
SystemType var6
CommandBuffer var6
int var6
int var6
Component var6
int var6
ArchetypeChunk var6
int var6
int var6
ParallelRangeTask var6
ArchetypeChunk var6
BitSet var6
CommandBuffer var6
BitSet var6
BitSet var6
int var6
CommandBuffer var6
BitSet var6
int var6
TickableSystem var6
BitSet var6
DataChange var6
ComponentType var6
Component var6
Component var6
int var6
Archetype var6
BitSet var6
int var6
SystemType var7
BitSet var7
int var7
ArchetypeChunk var7
int var7
Component var7
Component var7
Archetype var7
Component var7
ArchetypeChunk var7
int var7
int var7
int var7
BitSet var7
ArchetypeChunk var7
Archetype var7
WorldEventSystem var7
BitSet var7
Archetype var7
WorldEventSystem var7
long var7
int var7
BitSet var7
String var7
QuerySystem var7
int var7
SystemType var7
BitSet var8
ComponentType var8
int var8
var8
var8
int var8
int var8
int var8
BitSet var8
BitSet var8
int var8
Archetype var8
ParallelRangeTask var8
ArchetypeDataSystem var8
int var8
BitSet var8
int var8
ArchetypeChunk var8
int var8
int var8
Codec var8
BitSet var8
ArchetypeChunk var8
BitSet var8
HolderSystem var9
ComponentRegistry.Data var9
ComponentRegistry.Data var9
ComponentRegistry.Data var9
ArchetypeChunk var9
int var9
int var9
BitSet var9
EntityDataSystem var9
int var9
var9
EntityHolderEventSystem var9
BitSet var9
EntityHolderEventSystem var9
long var9
ISystem var9
Holder var9
int var9
int var9
int var9

Методы (190)

МодификаторыВозвратСигнатура
abstract throw new IllegalArgumentExceptionthrow new IllegalArgumentException("Unable to shutdown store while thread is still running!")
abstract throw new IllegalArgumentExceptionthrow new IllegalArgumentException("EntityReference is already in use!")
abstract throw new IllegalArgumentExceptionthrow new IllegalArgumentException("EntityReference is not for this store!")
abstract throw new IllegalArgumentExceptionthrow new IllegalArgumentException("EntityHolder and EntityReference array length doesn't match!")
abstract throw new IllegalArgumentExceptionthrow new IllegalArgumentException("EntityHolder start and length exceed array length!")
abstract throw new IllegalArgumentExceptionthrow new IllegalArgumentException("EntityReference start and length exceed array length!")
abstract throw new IllegalArgumentExceptionthrow new IllegalArgumentException("Entity already contains component type: " + var3)
abstract throw new IllegalStateExceptionthrow new IllegalStateException("Store is already shutdown!")
abstract throw new IllegalStateExceptionthrow new IllegalStateException("Store is shutdown!")
abstract throw new IllegalStateExceptionthrow new IllegalStateException("Store is currently processing! Ensure you aren't calling a store method from a system.")
abstract throw new IllegalStateExceptionthrow new IllegalStateException("Assert not in thread! " + this.thread + " but was in " + var1)
private ProcessingCounterprivate ProcessingCounter()
abstract throw new UnsupportedOperationExceptionthrow new UnsupportedOperationException("Conditions are not supported")
public void addEntitiesvoid addEntities(@Nonnull Holder<ECS_TYPE>[] var1, @Nonnull Ref<ECS_TYPE>[] var2, @Nonnull AddReason var3)
public void addEntitiesvoid addEntities(@Nonnull Holder<ECS_TYPE>[] var1, int var2, @Nonnull Ref<ECS_TYPE>[] var3, int var4, int var5, @Nonnull AddReason var6)
public void assertThreadvoid assertThread()
public void assertWriteProcessingvoid assertWriteProcessing()
private <T extends Component<ECS_TYPE>> void datachunk_addComponent<T extends Component<ECS_TYPE>> void datachunk_addComponent(@Nonnull Ref<ECS_TYPE> var1, @Nonnull ArchetypeChunk<ECS_TYPE> var2, @Nonnull ComponentType<ECS_TYPE, T> var3, @Nonnull T var4, @Nonnull CommandBuffer<ECS_TYPE> var5)
public <T extends Component<ECS_TYPE>> void ensureComponent<T extends Component<ECS_TYPE>> void ensureComponent(@Nonnull Ref<ECS_TYPE> var1, @Nonnull ComponentType<ECS_TYPE, T> var2)
public <T extends ArchetypeDataSystem<ECS_TYPE, Q, R>, Q, R> void fetch<T extends ArchetypeDataSystem<ECS_TYPE, Q, R>, Q, R> void fetch(@Nonnull SystemType<ECS_TYPE, T> var1, Q var2, @Nonnull List<R> var3)
public <T extends EntityDataSystem<ECS_TYPE, Q, R>, Q, R> void fetch<T extends EntityDataSystem<ECS_TYPE, Q, R>, Q, R> void fetch(@Nonnull Collection<Ref<ECS_TYPE>> var1, @Nonnull SystemType<ECS_TYPE, T> var2, @Nonnull Q var3, @Nonnull List<R> var4)
private int findOrCreateArchetypeChunkint findOrCreateArchetypeChunk(@Nonnull Archetype<ECS_TYPE> var1)
for for(int var3 = 0; var3 < var2; var3++)
for for(int var6 = 0; var6 < this.entitiesSize; var6++)
for for(int var5 = 0; var5 < var2; var5++)
for for(int var4 = 0; var4 < this.archetypeSize; var4++)
for for(int var2 = 0; var2 < this.archetypeSize; var2++)
for for(int var6 = 0; var6 < var3; var6++)
for for(int var9 = var4; var9 < var8; var9++)
for for(int var15 = var2; var15 < var7; var15++)
for for(int var33 = var27; var13 < var8; var33++)
for for(int var34 = var27; var13 < var5; var34++)
for for(int var38 = var4; var38 < var8; var38++)
for for(int var6 = 0; var6 < var3; var6++)
for for(int var9 = var2; var9 < var7; var9++)
for for(int var14 = var2; var14 < var7; var14++)
for for(int var27 = 0; var27 < var5; var27++)
for for(int var28 = var2; var28 < var7; var28++)
for for(int var37 = var4; var37 < var8; var37++)
for for(int var3 = 0; var3 < this.archetypeSize; var3++)
for for(int var4 = 0; var4 < this.archetypeSize; var4++)
for for(int var10 = 0; var10 < this.archetypeSize; var10++)
for for(int var11 = 0; var11 < this.archetypeSize; var11++)
for for(int var3 = 0; var3 < this.archetypeSize; var3++)
for for(int var5 = 0; var5 < this.archetypeSize; var5++)
for for(Ref var11 : var1)
for for(int var4 = 0; var4 < this.resources.length; var4++)
for for(int var31 = 0; var31 < var29; var31++)
for for(int var11 = 0; var11 < var10; var11++)
for for(int var24 = 0; var24 < this.archetypeSize; var24++)
for for(int var23 = 0; var23 < this.archetypeSize; var23++)
for for(int var4 = var3; var4 < var2; var4++)
for for(int var11 = 0; var11 < var3; var11++)
for for(int var12 = 0; var12 < this.archetypeSize; var12++)
for for(int var9 = 0; var9 < this.archetypeSize; var9++)
abstract for for(int var4 = 0; var4 < var1.getSystemSize()
abstract for for(int var6 = 0; var6 < var1.getSystemSize()
abstract for for(int var7 = var4.getMinIndex()
abstract for for(int var5 = var1.getMinIndex()
abstract for for(int var8 = var6.size()
abstract for for(int var19 = var17.size()
abstract for for(int var10 = var8.size()
abstract for for(int var12 = 0; var12 < var2.getDataChangeCount()
abstract for for(int var17 = 0; var17 < var1.getSystemSize()
abstract for for(int var38 = 0; var38 < var1.getSystemSize()
abstract for for(int var14 = 0; var14 < var1.getSystemSize()
public void forEachChunkvoid forEachChunk(@Nonnull BiConsumer<ArchetypeChunk<ECS_TYPE>, CommandBuffer<ECS_TYPE>> var1)
public boolean forEachChunkboolean forEachChunk(@Nonnull BiPredicate<ArchetypeChunk<ECS_TYPE>, CommandBuffer<ECS_TYPE>> var1)
public void forEachChunkvoid forEachChunk(Query<ECS_TYPE> var1, @Nonnull BiConsumer<ArchetypeChunk<ECS_TYPE>, CommandBuffer<ECS_TYPE>> var2)
public boolean forEachChunkboolean forEachChunk(Query<ECS_TYPE> var1, @Nonnull BiPredicate<ArchetypeChunk<ECS_TYPE>, CommandBuffer<ECS_TYPE>> var2)
public void forEachChunkvoid forEachChunk(int var1, @Nonnull BiConsumer<ArchetypeChunk<ECS_TYPE>, CommandBuffer<ECS_TYPE>> var2)
public boolean forEachChunkboolean forEachChunk(int var1, @Nonnull BiPredicate<ArchetypeChunk<ECS_TYPE>, CommandBuffer<ECS_TYPE>> var2)
public void forEachEntityParallelvoid forEachEntityParallel(IntBiObjectConsumer<ArchetypeChunk<ECS_TYPE>, CommandBuffer<ECS_TYPE>> var1)
public void forEachEntityParallelvoid forEachEntityParallel(Query<ECS_TYPE> var1, IntBiObjectConsumer<ArchetypeChunk<ECS_TYPE>, CommandBuffer<ECS_TYPE>> var2)
public int getArchetypeChunkCountint getArchetypeChunkCount()
public int getArchetypeChunkCountForint getArchetypeChunkCountFor(int var1)
public int getEntityCountint getEntityCount()
public int getEntityCountForint getEntityCountFor(@Nonnull Query<ECS_TYPE> var1)
public int getEntityCountForint getEntityCountFor(int var1)
public int getStoreIndexint getStoreIndex()
if if(var5 instanceof MetricSystem var7)
if if(var4 != null)
if if(this.shutdown)
if if(var6 != null)
if if(var1 instanceof ExactArchetypeQuery var2)
if if(var3 != null)
if if(var8 != null)
if if(var6 != null)
if if(var21 <= var20)
if if(var1.length != var2.length)
if if(var1.length < var7)
if if(var3.length < var8)
if if(var28 <= this.entitiesSize)
if if(var21 > 1)
if if(var5 != var22)
if if(var1.length != var2.length)
if if(var1.length < var7)
if if(var3.length < var8)
if if(var13 != var38)
if if(var4 == null)
if if(var4 == null)
if if(COUNT_SEQLOCK_RETRIES)
if if(this.shutdown)
if if(var4 != null)
if if(this.shutdown)
if if(this.shutdown)
if if(var1 instanceof ExactArchetypeQuery var4)
if if(var5 != Integer.MIN_VALUE)
if if(this.shutdown)
if if(var1 instanceof ExactArchetypeQuery var5)
if if(var6 != Integer.MIN_VALUE)
if if(this.shutdown)
if if(this.shutdown)
if if(this.shutdown)
if if(var4 != null)
if if(var5 != 0)
if if(this.shutdown)
if if(var1 instanceof ExactArchetypeQuery var4)
if if(var14 != Integer.MIN_VALUE)
if if(var16 != 0)
if if(var7 != 0)
if if(this.shutdown)
if if(this.shutdown)
if if(var3 != null)
if if(this.shutdown)
if if(var9 < 0)
if if(var3 != null)
if if(this.shutdown)
if if(var2 != null)
if if(this.shutdown)
if if(var4 != null)
if if(var10 < 0)
if if(var4 != null)
if if(var3 != null)
if if(this.shutdown)
if if(this.shutdown)
if if(this.shutdown)
if if(this.shutdown)
if if(this.resources[var4] == null && var5 != null)
if if(var10 >= 0)
if if(var11)
if if(var3 instanceof SystemChange var4)
if if(var5 instanceof StoreSystem)
if if(var5 instanceof StoreSystem)
if if(var3 instanceof ComponentChange var4)
if if(var25 != null)
if if(var32 != null)
if if(var12 != null)
if if(var8 != null)
if if(var19 instanceof ArchetypeChunkSystem var21)
if if(var19 instanceof ArchetypeChunkSystem var20)
if if(var3 < var2)
if if(var5 != null)
if if(var2 != Integer.MIN_VALUE)
if if(var4 <= var2)
if if(var10 instanceof ArchetypeChunkSystem)
if if(var2 == this.archetypeSize - 1)
protected <Event extends EcsEvent> void internal_invoke<Event extends EcsEvent> void internal_invoke(CommandBuffer<ECS_TYPE> var1, Ref<ECS_TYPE> var2, Event var3)
protected <Event extends EcsEvent> void internal_invoke<Event extends EcsEvent> void internal_invoke(CommandBuffer<ECS_TYPE> var1, @Nonnull EntityEventType<ECS_TYPE, Event> var2, Ref<ECS_TYPE> var3, Event var4)
protected <Event extends EcsEvent> void internal_invoke<Event extends EcsEvent> void internal_invoke(CommandBuffer<ECS_TYPE> var1, Holder<ECS_TYPE> var2, Event var3)
protected <Event extends EcsEvent> void internal_invoke<Event extends EcsEvent> void internal_invoke(CommandBuffer<ECS_TYPE> var1, @Nonnull EntityHolderEventType<ECS_TYPE, Event> var2, Holder<ECS_TYPE> var3, Event var4)
protected <Event extends EcsEvent> void internal_invoke<Event extends EcsEvent> void internal_invoke(CommandBuffer<ECS_TYPE> var1, Event var2)
protected <Event extends EcsEvent> void internal_invoke<Event extends EcsEvent> void internal_invoke(CommandBuffer<ECS_TYPE> var1, @Nonnull WorldEventType<ECS_TYPE, Event> var2, Event var3)
public boolean isAliveInDifferentThreadboolean isAliveInDifferentThread()
public boolean isHeldpublic boolean isHeld()
public boolean isInThreadboolean isInThread()
public boolean isShutdownboolean isShutdown()
public void lockpublic void lock()
public void lockInterruptiblypublic void lockInterruptibly()
public Condition newConditionpublic Condition newCondition()
void onAddvoid onAdd(@Nonnull ComponentRegistry.Data<ECS_TYPE> var1)
public void pausedTickvoid pausedTick(float var1)
private void removeArchetypeChunkvoid removeArchetypeChunk(@Nonnull ArchetypeChunk<ECS_TYPE> var1)
public <T extends Component<ECS_TYPE>> boolean removeComponentIfExists<T extends Component<ECS_TYPE>> boolean removeComponentIfExists(@Nonnull Ref<ECS_TYPE> var1, @Nonnull ComponentType<ECS_TYPE, T> var2)
public <T extends Component<ECS_TYPE>> void replaceComponent<T extends Component<ECS_TYPE>> void replaceComponent(@Nonnull Ref<ECS_TYPE> var1, @Nonnull ComponentType<ECS_TYPE, T> var2, @Nonnull T var3)
public <T extends Resource<ECS_TYPE>> void replaceResource<T extends Resource<ECS_TYPE>> void replaceResource(@Nonnull ResourceType<ECS_TYPE, T> var1, @Nonnull T var2)
public void shutdownvoid shutdown()
void shutdown0void shutdown0(@Nonnull ComponentRegistry.Data<ECS_TYPE> var1)
void storeCommandBuffervoid storeCommandBuffer(@Nonnull CommandBuffer<ECS_TYPE> var1)
public void tickvoid tick(float var1)
public void tickvoid tick(ArchetypeTickingSystem<ECS_TYPE> var1, float var2, int var3)
private <Tickable extends TickableSystem<ECS_TYPE>> void tickInternal<Tickable extends TickableSystem<ECS_TYPE>> void tickInternal(float var1, SystemType<ECS_TYPE, Tickable> var2)
public boolean tryLockpublic boolean tryLock()
public boolean tryLockpublic boolean tryLock(long var1, @Nonnull TimeUnit var3)
public void unlockpublic void unlock()
private void updateArchetypeIndexesvoid updateArchetypeIndexes(@Nonnull ComponentRegistry.Data<ECS_TYPE> var1)
void updateDatavoid updateData(@Nonnull ComponentRegistry.Data<ECS_TYPE> var1, @Nonnull ComponentRegistry.Data<ECS_TYPE> var2)
private void updateDatavoid updateData(@Nonnull ComponentRegistry.Data<ECS_TYPE> var1, @Nonnull ComponentRegistry.Data<ECS_TYPE> var2, DataChange var3)
private void updateData0void updateData0(@Nonnull ComponentRegistry.Data<ECS_TYPE> var1, @Nonnull ComponentRegistry.Data<ECS_TYPE> var2, DataChange var3)
while while(true)

Исходный код

Показать/скрыть
class="kw">package com.hypixel.hytale.component;

class="kw">import com.hypixel.hytale.codec.Codec;
class="kw">import com.hypixel.hytale.codec.codecs.array.ArrayCodec;
class="kw">import com.hypixel.hytale.common.util.ArrayUtil;
class="kw">import com.hypixel.hytale.component.data.ForEachTaskData;
class="kw">import com.hypixel.hytale.component.data.change.ChangeType;
class="kw">import com.hypixel.hytale.component.data.change.ComponentChange;
class="kw">import com.hypixel.hytale.component.data.change.DataChange;
class="kw">import com.hypixel.hytale.component.data.change.SystemChange;
class="kw">import com.hypixel.hytale.component.data.unknown.UnknownComponents;
class="kw">import com.hypixel.hytale.component.event.EntityEventType;
class="kw">import com.hypixel.hytale.component.event.EntityHolderEventType;
class="kw">import com.hypixel.hytale.component.event.WorldEventType;
class="kw">import com.hypixel.hytale.component.metric.ArchetypeChunkData;
class="kw">import com.hypixel.hytale.component.metric.SystemMetricData;
class="kw">import com.hypixel.hytale.component.query.ExactArchetypeQuery;
class="kw">import com.hypixel.hytale.component.query.Query;
class="kw">import com.hypixel.hytale.component.system.ArchetypeChunkSystem;
class="kw">import com.hypixel.hytale.component.system.EcsEvent;
class="kw">import com.hypixel.hytale.component.system.EntityEventSystem;
class="kw">import com.hypixel.hytale.component.system.EntityHolderEventSystem;
class="kw">import com.hypixel.hytale.component.system.HolderSystem;
class="kw">import com.hypixel.hytale.component.system.ISystem;
class="kw">import com.hypixel.hytale.component.system.MetricSystem;
class="kw">import com.hypixel.hytale.component.system.QuerySystem;
class="kw">import com.hypixel.hytale.component.system.RefChangeSystem;
class="kw">import com.hypixel.hytale.component.system.RefSystem;
class="kw">import com.hypixel.hytale.component.system.StoreSystem;
class="kw">import com.hypixel.hytale.component.system.WorldEventSystem;
class="kw">import com.hypixel.hytale.component.system.data.ArchetypeDataSystem;
class="kw">import com.hypixel.hytale.component.system.data.EntityDataSystem;
class="kw">import com.hypixel.hytale.component.system.tick.ArchetypeTickingSystem;
class="kw">import com.hypixel.hytale.component.system.tick.EntityTickingSystem;
class="kw">import com.hypixel.hytale.component.system.tick.TickableSystem;
class="kw">import com.hypixel.hytale.component.system.tick.TickingSystem;
class="kw">import com.hypixel.hytale.component.task.ParallelRangeTask;
class="kw">import com.hypixel.hytale.component.task.ParallelTask;
class="kw">import com.hypixel.hytale.function.consumer.IntBiObjectConsumer;
class="kw">import com.hypixel.hytale.metrics.MetricResults;
class="kw">import com.hypixel.hytale.metrics.MetricsRegistry;
class="kw">import com.hypixel.hytale.metrics.metric.HistoricMetric;
class="kw">import it.unimi.dsi.fastutil.objects.Object2IntMap;
class="kw">import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap;
class="kw">import it.unimi.dsi.fastutil.objects.ObjectArrayList;
class="kw">import java.lang.invoke.VarHandle;
class="kw">import java.util.ArrayDeque;
class="kw">import java.util.Arrays;
class="kw">import java.util.BitSet;
class="kw">import java.util.Collection;
class="kw">import java.util.Deque;
class="kw">import java.util.List;
class="kw">import java.util.Objects;
class="kw">import java.util.concurrent.CompletableFuture;
class="kw">import java.util.concurrent.TimeUnit;
class="kw">import java.util.concurrent.atomic.AtomicLong;
class="kw">import java.util.concurrent.locks.Condition;
class="kw">import java.util.concurrent.locks.Lock;
class="kw">import java.util.function.BiConsumer;
class="kw">import java.util.function.BiPredicate;
class="kw">import java.util.function.Predicate;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;

class="kw">public class Store<ECS_TYPE> class="kw">implements ComponentAccessor<ECS_TYPE> {
   class="kw">public class="kw">static class="kw">final Store[] EMPTY_ARRAY = new Store[0];
   class="kw">private class="kw">static class="kw">final boolean COUNT_SEQLOCK_RETRIES = Store.class.desiredAssertionStatus();
   @Nonnull
   class="kw">public class="kw">static class="kw">final MetricsRegistry<Store<?>> METRICS_REGISTRY = new MetricsRegistry<Store<?>>()
      .register("ArchetypeChunkCount", Store::getArchetypeChunkCount, Codec.INTEGER)
      .register("EntityCount", Store::getEntityCount, Codec.INTEGER)
      .register(
         "Systems",
         var0 -> {
            ComponentRegistry.Data var1 = var0.getRegistry().getData();
            HistoricMetric[] var2 = var0.getSystemMetrics();
            SystemMetricData[] var3 = new SystemMetricData[var1.getSystemSize()];

            for (int var4 = 0; var4 < var1.getSystemSize(); var4++) {
               ISystem var5 = var1.getSystem(var4);
               MetricResults var6 = null;
               if (var5 class="kw">instanceof MetricSystem var7) {
                  var6 = var7.toMetricResults(var0);
               }

               var3[var4] = new SystemMetricData(
                  var5.getClass().getName(),
                  var0.getArchetypeChunkCountFor(var4),
                  var0.getEntityCountFor(var4),
                  var5 class="kw">instanceof TickingSystem ? var2[var4] : null,
                  var6
               );
            }

            class="kw">return var3;
         },
         new ArrayCodec<>(SystemMetricData.CODEC, SystemMetricData[]::new)
      )
      .register("ArchetypeChunks", Store::collectArchetypeChunkData, new ArrayCodec<>(ArchetypeChunkData.CODEC, ArchetypeChunkData[]::new));
   @Nonnull
   class="kw">private class="kw">final ComponentRegistry<ECS_TYPE> registry;
   @Nonnull
   class="kw">private class="kw">final ECS_TYPE externalData;
   @Nonnull
   class="kw">private class="kw">final IResourceStorage resourceStorage;
   class="kw">private class="kw">final Deque<CommandBuffer<ECS_TYPE>> commandBuffers = new ArrayDeque<>();
   class="kw">private class="kw">final Thread thread = Thread.currentThread();
   @Nonnull
   class="kw">private class="kw">final ParallelTask<EntityTickingSystem.SystemTaskData<ECS_TYPE>> parallelTask = new ParallelTask<>(EntityTickingSystem.SystemTaskData::new);
   @Nonnull
   class="kw">private class="kw">final ParallelTask<ForEachTaskData<ECS_TYPE>> forEachTask = new ParallelTask<>(ForEachTaskData::new);
   @Nonnull
   class="kw">private class="kw">final ParallelTask<EntityDataSystem.SystemTaskData<ECS_TYPE, ?, ?>> fetchTask = new ParallelTask<>(EntityDataSystem.SystemTaskData::new);
   @Nonnull
   class="kw">private class="kw">final Store.ProcessingCounter processing = new Store.ProcessingCounter();
   class="kw">private class="kw">volatile boolean shutdown;
   int storeIndex;
   class="kw">private int entitiesSize;
   @Nonnull
   class="kw">private Ref<ECS_TYPE>[] refs = new Ref[16];
   @Nonnull
   class="kw">private BitSet[] systemIndexToArchetypeChunkIndexes = ArrayUtil.EMPTY_BITSET_ARRAY;
   @Nonnull
   class="kw">private class="kw">final Object2IntMap<Archetype<ECS_TYPE>> archetypeToIndexMap = new Object2IntOpenHashMap();
   class="kw">private int archetypeSize;
   @Nonnull
   class="kw">private class="kw">final BitSet archetypeChunkReuse = new BitSet();
   @Nonnull
   class="kw">private ArchetypeChunk<ECS_TYPE>[] archetypeChunks = ArchetypeChunk.emptyArray();
   @Nonnull
   class="kw">private Resource<ECS_TYPE>[] resources = Resource.EMPTY_ARRAY;
   @Nonnull
   class="kw">private HistoricMetric[] systemMetrics = HistoricMetric.EMPTY_ARRAY;
   @Deprecated(forRemoval = true)
   class="kw">private boolean disableProcessingAssert = false;
   @Nonnull
   class="kw">final AtomicLong seqlockRetries = new AtomicLong();

   Store(@Nonnull ComponentRegistry<ECS_TYPE> var1, int var2, @Nonnull ECS_TYPE var3, @Nonnull IResourceStorage var4) {
      this.registry = var1;
      this.storeIndex = var2;
      this.externalData = var3;
      this.resourceStorage = var4;
      this.archetypeToIndexMap.defaultReturnValue(Integer.MIN_VALUE);
   }

   @Nonnull
   CommandBuffer<ECS_TYPE> takeCommandBuffer() {
      this.assertThread();
      if (this.commandBuffers.isEmpty()) {
         class="kw">return new CommandBuffer<>(this);
      }

      CommandBuffer var1 = this.commandBuffers.pop();
      assert var1.setThread();
      class="kw">return var1;
   }

   void storeCommandBuffer(@Nonnull CommandBuffer<ECS_TYPE> var1) {
      this.assertThread();
      var1.validateEmpty();
      this.commandBuffers.add(var1);
   }

   class="kw">public int getStoreIndex() {
      class="kw">return this.storeIndex;
   }

   @Nonnull
   class="kw">public ComponentRegistry<ECS_TYPE> getRegistry() {
      class="kw">return this.registry;
   }

   @Nonnull
   @Override
   class="kw">public ECS_TYPE getExternalData() {
      class="kw">return this.externalData;
   }

   @Nonnull
   class="kw">public IResourceStorage getResourceStorage() {
      class="kw">return this.resourceStorage;
   }

   @Nonnull
   class="kw">public ParallelTask<EntityTickingSystem.SystemTaskData<ECS_TYPE>> getParallelTask() {
      class="kw">return this.parallelTask;
   }

   @Nonnull
   class="kw">public ParallelTask<EntityDataSystem.SystemTaskData<ECS_TYPE, ?, ?>> getFetchTask() {
      class="kw">return this.fetchTask;
   }

   @Nonnull
   class="kw">public HistoricMetric[] getSystemMetrics() {
      this.assertThread();
      class="kw">return this.systemMetrics;
   }

   class="kw">public boolean isShutdown() {
      class="kw">return this.shutdown;
   }

   void onAdd(@Nonnull ComponentRegistry.Data<ECS_TYPE> var1) {
      this.updateArchetypeIndexes(var1);
      int var2 = var1.getResourceSize();
      this.resources = Arrays.copyOf(this.resources, var2);

      for (int var3 = 0; var3 < var2; var3++) {
         ResourceType var4 = (ResourceType<ECS_TYPE, ? class="kw">extends Resource<ECS_TYPE>>)var1.getResourceType(var3);
         if (var4 != null) {
            this.resources[var3] = (Resource<ECS_TYPE>)this.resourceStorage.load(this, var1, var4).join();
         }
      }

      for (int var6 = 0; var6 < var1.getSystemSize(); var6++) {
         this.updateData(var1, var1, new SystemChange<>(ChangeType.REGISTERED, var1.getSystem(var6)));
      }

      this.systemMetrics = Arrays.copyOf(this.systemMetrics, var1.getSystemSize());
      SystemType var7 = this.registry.getTickableSystemType();
      BitSet var8 = var1.getSystemIndexesForType(var7);
      int var5 = -1;

      while ((var5 = var8.nextSetBit(var5 + 1)) >= 0) {
         this.systemMetrics[var5] = HistoricMetric.builder(33333333L, TimeUnit.NANOSECONDS)
            .addPeriod(1L, TimeUnit.SECONDS)
            .addPeriod(1L, TimeUnit.MINUTES)
            .addPeriod(5L, TimeUnit.MINUTES)
            .build();
      }
   }

   class="kw">public void shutdown() {
      if (this.shutdown) {
         throw new IllegalStateException("Store is already shutdown!");
      }

      this.registry.removeStore(this);
   }

   void shutdown0(@Nonnull ComponentRegistry.Data<ECS_TYPE> var1) {
      if (this.thread.isAlive() && this.thread != Thread.currentThread()) {
         throw new IllegalArgumentException("Unable to shutdown store while thread is still running!");
      }

      for (int var2 = var1.getSystemSize() - 1; var2 >= 0; var2--) {
         this.updateData(var1, var1, new SystemChange<>(ChangeType.UNREGISTERED, var1.getSystem(var2)));
      }

      this.saveAllResources0(var1).join();
      this.processing.lock();

      try {
         for (int var6 = 0; var6 < this.entitiesSize; var6++) {
            this.refs[var6].invalidate();
            this.refs[var6] = null;
         }
      } class="kw">finally {
         this.processing.unlock();
      }

      this.shutdown = true;
   }

   @Nonnull
   class="kw">public CompletableFuture<Void> saveAllResources() {
      class="kw">return this.saveAllResources0(this.registry.getData());
   }

   @Nonnull
   class="kw">private CompletableFuture<Void> saveAllResources0(@Nonnull ComponentRegistry.Data<ECS_TYPE> var1) {
      int var2 = var1.getResourceSize();
      CompletableFuture[] var3 = new CompletableFuture[var2];
      int var4 = 0;

      for (int var5 = 0; var5 < var2; var5++) {
         ResourceType var6 = (ResourceType<ECS_TYPE, ? class="kw">extends Resource<ECS_TYPE>>)var1.getResourceType(var5);
         if (var6 != null) {
            var3[var4++] = this.resourceStorage.save(this, var1, var6, this.resources[var5]);
         }
      }

      class="kw">return CompletableFuture.allOf(Arrays.copyOf(var3, var4));
   }

   class="kw">public int getEntityCount() {
      class="kw">return this.entitiesSize;
   }

   class="kw">public int getEntityCountFor(@Nonnull Query<ECS_TYPE> var1) {
      this.assertThread();
      if (var1 class="kw">instanceof ExactArchetypeQuery var2) {
         int var6 = this.archetypeToIndexMap.getInt(var2.getArchetype());
         class="kw">return var6 != Integer.MIN_VALUE ? this.archetypeChunks[var6].size() : 0;
      } else {
         int var3 = 0;

         for (int var4 = 0; var4 < this.archetypeSize; var4++) {
            ArchetypeChunk var5 = this.archetypeChunks[var4];
            if (var5 != null && var1.test(var5.getArchetype())) {
               var3 += var5.size();
            }
         }

         class="kw">return var3;
      }
   }

   class="kw">public int getEntityCountFor(int var1) {
      this.assertThread();
      int var2 = 0;
      BitSet var3 = this.systemIndexToArchetypeChunkIndexes[var1];
      int var4 = -1;

      while ((var4 = var3.nextSetBit(var4 + 1)) >= 0) {
         var2 += this.archetypeChunks[var4].size();
      }

      class="kw">return var2;
   }

   class="kw">public int getArchetypeChunkCount() {
      this.assertThread();
      class="kw">return this.archetypeSize;
   }

   @Nonnull
   class="kw">public ArchetypeChunkData[] collectArchetypeChunkData() {
      this.assertThread();
      ObjectArrayList var1 = new ObjectArrayList(this.archetypeSize);

      for (int var2 = 0; var2 < this.archetypeSize; var2++) {
         ArchetypeChunk var3 = this.archetypeChunks[var2];
         if (var3 != null) {
            Archetype var4 = var3.getArchetype();
            String[] var5 = new String[var4.count()];
            int var6 = 0;

            for (int var7 = var4.getMinIndex(); var7 < var4.length(); var7++) {
               ComponentType var8 = (ComponentType<ECS_TYPE, ? class="kw">extends Component<ECS_TYPE>>)var4.get(var7);
               if (var8 != null) {
                  var5[var6++] = var8.getTypeClass().getName();
               }
            }

            var1.add(new ArchetypeChunkData(var5, var3.size()));
         }
      }

      class="kw">return (ArchetypeChunkData[])var1.toArray(ArchetypeChunkData[]::new);
   }

   class="kw">public int getArchetypeChunkCountFor(int var1) {
      this.assertThread();
      class="kw">return this.systemIndexToArchetypeChunkIndexes[var1].cardinality();
   }

   @Nullable
   class="kw">public Ref<ECS_TYPE> addEntity(@Nonnull Archetype<ECS_TYPE> var1, @Nonnull AddReason var2) {
      this.assertThread();
      this.assertWriteProcessing();
      Component[] var3;
      if (var1.isEmpty()) {
         var3 = Component.EMPTY_ARRAY;
      } else {
         ComponentRegistry.Data var4 = this.registry._internal_getData();
         var3 = new Component[var1.length()];

         for (int var5 = var1.getMinIndex(); var5 < var1.length(); var5++) {
            ComponentType var6 = (ComponentType<ECS_TYPE, ? class="kw">extends Component<ECS_TYPE>>)var1.get(var5);
            if (var6 != null) {
               var3[var6.getIndex()] = var4.createComponent((ComponentType<ECS_TYPE, Component<ECS_TYPE>>)var6);
            }
         }
      }

      class="kw">return this.addEntity(this.registry.newHolder(var1, var3), new Ref<>(this), var2);
   }

   @Nullable
   @Override
   class="kw">public Ref<ECS_TYPE> addEntity(@Nonnull Holder<ECS_TYPE> var1, @Nonnull AddReason var2) {
      class="kw">return this.addEntity(var1, new Ref<>(this), var2);
   }

   @Nullable
   class="kw">public Ref<ECS_TYPE> addEntity(@Nonnull Holder<ECS_TYPE> var1, @Nonnull Ref<ECS_TYPE> var2, @Nonnull AddReason var3) {
      if (var2.isValid()) {
         throw new IllegalArgumentException("EntityReference is already in use!");
      }

      if (var2.getStore() != this) {
         throw new IllegalArgumentException("EntityReference is not for this store!");
      }

      this.assertThread();
      this.assertWriteProcessing();
      CommandBuffer var4 = this.takeCommandBuffer();
      ComponentRegistry.Data var5 = this.registry._internal_getData();
      this.processing.lock();

      try {
         SystemType var6 = this.registry.getHolderSystemType();
         BitSet var7 = var5.getSystemIndexesForType(var6);
         int var8 = -1;

         while ((var8 = var7.nextSetBit(var8 + 1)) >= 0) {
            HolderSystem var9 = var5.getSystem(var8, var6);
            if (var9.test(this.registry, var1.getArchetype())) {
               var9.onEntityAdd(var1, var3, this);
            }
         }

         int var20 = this.entitiesSize++;
         int var21 = this.refs.length;
         if (var21 <= var20) {
            var8 = ArrayUtil.grow(var20);
            this.refs = Arrays.copyOf(this.refs, var8);
         }

         this.refs[var20] = var2;
         var2.setIndex(var20);
         var8 = this.findOrCreateArchetypeChunk(var1.getArchetype());
         ArchetypeChunk var24 = this.archetypeChunks[var8];
         int var10 = var24.addEntity(var2, var1);
         var2.beginMutation();
         var2.setPosition(var24, var10);
         var2.endMutation();
         SystemType systemTypex = this.registry.getRefSystemType();
         BitSet systemIndexesx = var5.getSystemIndexesForType(systemTypex);
         BitSet var13 = var24.getSystemIndexes();
         var4.track(var2);
         int systemIndexx = -1;

         while ((systemIndexx = systemIndexesx.nextSetBit(systemIndexx + 1)) >= 0) {
            if (var13.get(systemIndexx)) {
               RefSystem var15 = var5.getSystem(systemIndexx, systemTypex);
               boolean var16 = this.disableProcessingAssert;
               this.disableProcessingAssert = var15 class="kw">instanceof DisableProcessingAssert;
               var15.onEntityAdded(var2, var3, this, var4);
               this.disableProcessingAssert = var16;
               if (var4.consumeWasTrackedRefRemoved()) {
                  break;
               }
            }
         }
      } class="kw">finally {
         this.processing.unlock();
      }

      var4.consume();
      class="kw">return var2.isValid() ? var2 : null;
   }

   @Nonnull
   @Override
   class="kw">public Ref<ECS_TYPE>[] addEntities(@Nonnull Holder<ECS_TYPE>[] var1, @Nonnull AddReason var2) {
      class="kw">return this.addEntities(var1, 0, var1.length, var2);
   }

   @Nonnull
   class="kw">public Ref<ECS_TYPE>[] addEntities(@Nonnull Holder<ECS_TYPE>[] var1, int var2, int var3, @Nonnull AddReason var4) {
      Ref[] var5 = new Ref[var3];

      for (int var6 = 0; var6 < var3; var6++) {
         var5[var6] = new Ref<>(this);
      }

      this.addEntities(var1, var2, var5, 0, var3, var4);
      class="kw">return var5;
   }

   class="kw">public void addEntities(@Nonnull Holder<ECS_TYPE>[] var1, @Nonnull Ref<ECS_TYPE>[] var2, @Nonnull AddReason var3) {
      if (var1.length != var2.length) {
         throw new IllegalArgumentException("EntityHolder and EntityReference array length doesn't match!");
      }

      this.addEntities(var1, 0, var2, 0, var1.length, var3);
   }

   class="kw">public void addEntities(@Nonnull Holder<ECS_TYPE>[] var1, int var2, @Nonnull Ref<ECS_TYPE>[] var3, int var4, int var5, @Nonnull AddReason var6) {
      int var7 = var2 + var5;
      int var8 = var4 + var5;
      if (var1.length < var7) {
         throw new IllegalArgumentException("EntityHolder start and length exceed array length!");
      }

      if (var3.length < var8) {
         throw new IllegalArgumentException("EntityReference start and length exceed array length!");
      }

      for (int var9 = var4; var9 < var8; var9++) {
         Ref var10 = var3[var9];
         if (var10.isValid()) {
            throw new IllegalArgumentException("EntityReference is already in use!");
         }

         if (var10.getStore() != this) {
            throw new IllegalArgumentException("EntityReference is not for this store!");
         }
      }

      this.assertThread();
      this.assertWriteProcessing();
      CommandBuffer var25 = this.takeCommandBuffer();
      ComponentRegistry.Data var26 = this.registry._internal_getData();
      this.processing.lock();

      try {
         SystemType var11 = this.registry.getHolderSystemType();
         BitSet var12 = var26.getSystemIndexesForType(var11);
         int var13 = -1;

         while ((var13 = var12.nextSetBit(var13 + 1)) >= 0) {
            HolderSystem var14 = var26.getSystem(var13, var11);

            for (int var15 = var2; var15 < var7; var15++) {
               if (var14.test(this.registry, var1[var15].getArchetype())) {
                  var14.onEntityAdd(var1[var15], var6, this);
               }
            }
         }

         int var27 = this.entitiesSize;
         this.entitiesSize += var5;
         int var28 = this.refs.length;
         if (var28 <= this.entitiesSize) {
            var13 = ArrayUtil.grow(this.entitiesSize);
            this.refs = Arrays.copyOf(this.refs, var13);
         }

         System.arraycopy(var3, var4, this.refs, var27, var5);
         var13 = var4;

         for (int var33 = var27; var13 < var8; var33++) {
            var3[var13].setIndex(var33);
            var13++;
         }

         var13 = 0;

         for (int var34 = var27; var13 < var5; var34++) {
            Ref var36 = var3[var4 + var13];
            Holder var16 = var1[var2 + var13];
            int var17 = this.findOrCreateArchetypeChunk(var16.getArchetype());
            ArchetypeChunk var18 = this.archetypeChunks[var17];
            int var19 = var18.addEntity(var36, var16);
            var36.beginMutation();
            var36.setPosition(var18, var19);
            var36.endMutation();
            var13++;
         }

         SystemType systemTypex = this.registry.getRefSystemType();
         BitSet systemIndexesx = var26.getSystemIndexesForType(systemTypex);
         int systemIndexx = -1;

         while ((systemIndexx = systemIndexesx.nextSetBit(systemIndexx + 1)) >= 0) {
            for (int var38 = var4; var38 < var8; var38++) {
               Ref var39 = var3[var38];
               BitSet var40 = var39.getArchetypeChunk().getSystemIndexes();
               if (var40.get(systemIndexx)) {
                  RefSystem var41 = var26.getSystem(systemIndexx, systemTypex);
                  boolean var20 = this.disableProcessingAssert;
                  this.disableProcessingAssert = var41 class="kw">instanceof DisableProcessingAssert;
                  var25.track(var39);
                  var41.onEntityAdded(var39, var6, this, var25);
                  if (var25.consumeWasTrackedRefRemoved()) {
                     int var21 = var8 - var38;
                     if (var21 > 1) {
                        System.arraycopy(var3, var38 + 1, var3, var38, var21 - 1);
                        var3[var8 - 1] = var39;
                        var38--;
                     }

                     var8--;
                     var5--;
                  }

                  this.disableProcessingAssert = var20;
               }
            }
         }
      } class="kw">finally {
         this.processing.unlock();
      }

      var25.consume();
   }

   @Nonnull
   class="kw">public Holder<ECS_TYPE> copyEntity(@Nonnull Ref<ECS_TYPE> var1) {
      class="kw">return this.copyEntity(var1, this.registry.newHolder());
   }

   @Nonnull
   class="kw">public Holder<ECS_TYPE> copyEntity(@Nonnull Ref<ECS_TYPE> var1, @Nonnull Holder<ECS_TYPE> var2) {
      this.assertThread();
      var1.validate(this);
      class="kw">return var1.getArchetypeChunk().copyEntity(var1.getChunkEntityIndex(), var2);
   }

   @Nonnull
   class="kw">public Holder<ECS_TYPE> copySerializableEntity(@Nonnull Ref<ECS_TYPE> var1) {
      class="kw">return this.copySerializableEntity(var1, this.registry.newHolder(), null);
   }

   @Nonnull
   class="kw">public Holder<ECS_TYPE> copySerializableEntity(
      @Nonnull Ref<ECS_TYPE> var1, @Nonnull Holder<ECS_TYPE> var2, @Nullable Predicate<ComponentType<ECS_TYPE, ?>> var3
   ) {
      this.assertThread();
      var1.validate(this);
      class="kw">return var1.getArchetypeChunk().copySerializableEntity(this.registry.getData(), var1.getChunkEntityIndex(), var2, var3);
   }

   @Nonnull
   @Override
   class="kw">public Archetype<ECS_TYPE> getArchetype(@Nonnull Ref<ECS_TYPE> var1) {
      this.assertThread();
      var1.validate(this);
      class="kw">return var1.getArchetypeChunk().getArchetype();
   }

   @Nonnull
   class="kw">protected Archetype<ECS_TYPE> __internal_getArchetype(@Nonnull Ref<ECS_TYPE> var1) {
      var1.validate(this);
      class="kw">return var1.getArchetypeChunk().getArchetype();
   }

   @Nonnull
   class="kw">public Holder<ECS_TYPE> removeEntity(@Nonnull Ref<ECS_TYPE> var1, @Nonnull RemoveReason var2) {
      class="kw">return this.removeEntity(var1, this.registry.newHolder(), var2);
   }

   @Nonnull
   @Override
   class="kw">public Holder<ECS_TYPE> removeEntity(@Nonnull Ref<ECS_TYPE> var1, @Nonnull Holder<ECS_TYPE> var2, @Nonnull RemoveReason var3) {
      class="kw">return this.removeEntity(var1, var2, var3, null);
   }

   @Nonnull
   Holder<ECS_TYPE> removeEntity(@Nonnull Ref<ECS_TYPE> var1, @Nonnull Holder<ECS_TYPE> var2, @Nonnull RemoveReason var3, @Nullable Throwable var4) {
      this.assertThread();
      this.assertWriteProcessing();
      int var5 = var1.validate(this);
      CommandBuffer var6 = this.takeCommandBuffer();
      ArchetypeChunk var7 = var1.getArchetypeChunk();
      int var8 = var1.getChunkEntityIndex();
      ComponentRegistry.Data var9 = this.registry._internal_getData();
      this.processing.lock();

      try {
         SystemType var10 = this.registry.getRefSystemType();
         BitSet var11 = var9.getSystemIndexesForType(var10);
         BitSet var12 = var7.getSystemIndexes();
         int var13 = -1;

         while ((var13 = var11.nextSetBit(var13 + 1)) >= 0) {
            if (var12.get(var13)) {
               var9.getSystem(var13, var10).onEntityRemove(var1, var3, this, var6);
            }
         }

         int var22 = this.entitiesSize - 1;
         if (var5 != var22) {
            Ref var24 = this.refs[var22];
            var24.setIndex(var5);
            this.refs[var5] = var24;
         }

         this.refs[var22] = null;
         this.entitiesSize = var22;
         var1.beginMutation();
         var7.removeEntity(var8, var2);
         if (var7.size() == 0) {
            this.removeArchetypeChunk(var7);
         }

         var1.invalidate(var4);
      } class="kw">finally {
         this.processing.unlock();
      }

      var6.consume();
      this.processing.lock();

      try {
         SystemType var23 = this.registry.getHolderSystemType();
         BitSet var25 = var9.getSystemIndexesForType(var23);
         int var26 = -1;

         while ((var26 = var25.nextSetBit(var26 + 1)) >= 0) {
            HolderSystem var27 = var9.getSystem(var26, var23);
            if (var27.test(this.registry, var2.getArchetype())) {
               var27.onEntityRemoved(var2, var3, this);
            }
         }
      } class="kw">finally {
         this.processing.unlock();
      }

      class="kw">return var2;
   }

   @Nonnull
   class="kw">public Holder<ECS_TYPE>[] removeEntities(@Nonnull Ref<ECS_TYPE>[] var1, @Nonnull RemoveReason var2) {
      class="kw">return this.removeEntities(var1, 0, var1.length, var2);
   }

   @Nonnull
   class="kw">public Holder<ECS_TYPE>[] removeEntities(@Nonnull Ref<ECS_TYPE>[] var1, int var2, int var3, @Nonnull RemoveReason var4) {
      Holder[] var5 = new Holder[var3];

      for (int var6 = 0; var6 < var3; var6++) {
         var5[var6] = this.registry.newHolder();
      }

      class="kw">return this.removeEntities(var1, var2, var5, 0, var3, var4);
   }

   @Nonnull
   class="kw">public Holder<ECS_TYPE>[] removeEntities(@Nonnull Ref<ECS_TYPE>[] var1, @Nonnull Holder<ECS_TYPE>[] var2, @Nonnull RemoveReason var3) {
      if (var1.length != var2.length) {
         throw new IllegalArgumentException("EntityHolder and EntityReference array length doesn't match!");
      } else {
         class="kw">return this.removeEntities(var1, 0, var2, 0, var1.length, var3);
      }
   }

   @Nonnull
   class="kw">public Holder<ECS_TYPE>[] removeEntities(
      @Nonnull Ref<ECS_TYPE>[] var1, int var2, @Nonnull Holder<ECS_TYPE>[] var3, int var4, int var5, @Nonnull RemoveReason var6
   ) {
      int var7 = var2 + var5;
      int var8 = var4 + var5;
      if (var1.length < var7) {
         throw new IllegalArgumentException("EntityReference start and length exceed array length!");
      }

      if (var3.length < var8) {
         throw new IllegalArgumentException("EntityHolder start and length exceed array length!");
      }

      for (int var9 = var2; var9 < var7; var9++) {
         var1[var9].validate(this);
      }

      this.assertThread();
      this.assertWriteProcessing();
      CommandBuffer var26 = this.takeCommandBuffer();
      ComponentRegistry.Data var10 = this.registry._internal_getData();
      this.processing.lock();

      try {
         SystemType var11 = this.registry.getRefSystemType();
         BitSet var12 = var10.getSystemIndexesForType(var11);
         int var13 = -1;

         while ((var13 = var12.nextSetBit(var13 + 1)) >= 0) {
            for (int var14 = var2; var14 < var7; var14++) {
               Ref var15 = var1[var14];
               BitSet var16 = var15.getArchetypeChunk().getSystemIndexes();
               if (var16.get(var13)) {
                  var10.getSystem(var13, var11).onEntityRemove(var1[var14], var6, this, var26);
               }
            }
         }

         for (int var27 = 0; var27 < var5; var27++) {
            Ref var30 = var1[var2 + var27];
            var13 = var30.getIndex();
            ArchetypeChunk var34 = var30.getArchetypeChunk();
            int var36 = var30.getChunkEntityIndex();
            int var38 = this.entitiesSize - 1;
            if (var13 != var38) {
               Ref var17 = this.refs[var38];
               var17.setIndex(var13);
               this.refs[var13] = var17;
            }

            this.refs[var38] = null;
            this.entitiesSize = var38;
            Holder var39 = var3[var4 + var27];
            var30.beginMutation();
            var34.removeEntity(var36, var39);
            if (var34.size() == 0) {
               this.removeArchetypeChunk(var34);
            }
         }

         for (int var28 = var2; var28 < var7; var28++) {
            var1[var28].invalidate();
         }
      } class="kw">finally {
         this.processing.unlock();
      }

      var26.consume();
      this.processing.lock();

      try {
         SystemType var29 = this.registry.getHolderSystemType();
         BitSet var31 = var10.getSystemIndexesForType(var29);
         int var33 = -1;

         while ((var33 = var31.nextSetBit(var33 + 1)) >= 0) {
            HolderSystem var35 = var10.getSystem(var33, var29);

            for (int var37 = var4; var37 < var8; var37++) {
               if (var35.test(this.registry, var3[var37].getArchetype())) {
                  var35.onEntityRemoved(var3[var37], var6, this);
               }
            }
         }
      } class="kw">finally {
         this.processing.unlock();
      }

      class="kw">return var3;
   }

   class="kw">public <T class="kw">extends Component<ECS_TYPE>> void ensureComponent(@Nonnull Ref<ECS_TYPE> var1, @Nonnull ComponentType<ECS_TYPE, T> var2) {
      this.assertThread();
      this.assertWriteProcessing();
      var2.validateRegistry(this.registry);
      var2.validate();
      CommandBuffer var3 = this.takeCommandBuffer();
      this.processing.lock();

      try {
         ArchetypeChunk var4 = var1.getArchetypeChunk();
         if (!var4.getArchetype().contains(var2)) {
            Component var5 = this.registry._internal_getData().createComponent(var2);
            this.datachunk_addComponent(var1, var4, var2, var5, var3);
         }
      } class="kw">finally {
         this.processing.unlock();
      }

      var3.consume();
   }

   @Nonnull
   @Override
   class="kw">public <T class="kw">extends Component<ECS_TYPE>> T ensureAndGetComponent(@Nonnull Ref<ECS_TYPE> var1, @Nonnull ComponentType<ECS_TYPE, T> var2) {
      this.assertThread();
      this.assertWriteProcessing();
      var2.validateRegistry(this.registry);
      var2.validate();
      CommandBuffer var3 = this.takeCommandBuffer();
      this.processing.lock();

      Component var4;
      try {
         ArchetypeChunk var5 = var1.getArchetypeChunk();
         var4 = var5.__internal_getComponent(var1.getChunkEntityIndex(), var2);
         if (var4 == null) {
            var4 = this.registry._internal_getData().createComponent(var2);
            this.datachunk_addComponent(var1, var5, var2, var4, var3);
         }
      } class="kw">finally {
         this.processing.unlock();
      }

      var3.consume();
      class="kw">return var4;
   }

   @Nonnull
   @Override
   class="kw">public <T class="kw">extends Component<ECS_TYPE>> T addComponent(@Nonnull Ref<ECS_TYPE> var1, @Nonnull ComponentType<ECS_TYPE, T> var2) {
      this.assertThread();
      this.assertWriteProcessing();
      Component var3 = this.registry._internal_getData().createComponent(var2);
      this.addComponent(var1, var2, var3);
      class="kw">return var3;
   }

   @Override
   class="kw">public <T class="kw">extends Component<ECS_TYPE>> void addComponent(@Nonnull Ref<ECS_TYPE> var1, @Nonnull ComponentType<ECS_TYPE, T> var2, @Nonnull T var3) {
      this.assertThread();
      this.assertWriteProcessing();
      var1.validate(this);
      var2.validateRegistry(this.registry);
      var2.validate();
      Objects.requireNonNull(var3);
      CommandBuffer var4 = this.takeCommandBuffer();
      this.processing.lock();

      try {
         this.datachunk_addComponent(var1, var1.getArchetypeChunk(), var2, var3, var4);
      } class="kw">finally {
         this.processing.unlock();
      }

      var4.consume();
   }

   class="kw">public <T class="kw">extends Component<ECS_TYPE>> void replaceComponent(@Nonnull Ref<ECS_TYPE> var1, @Nonnull ComponentType<ECS_TYPE, T> var2, @Nonnull T var3) {
      this.assertThread();
      this.assertWriteProcessing();
      var1.validate(this);
      var2.validateRegistry(this.registry);
      var2.validate();
      Objects.requireNonNull(var3);
      CommandBuffer var4 = this.takeCommandBuffer();
      this.processing.lock();

      try {
         ArchetypeChunk var5 = var1.getArchetypeChunk();
         int var6 = var1.getChunkEntityIndex();
         Component var7 = var5.__internal_getComponent(var6, var2);
         var5.setComponent(var6, var2, var3);
         BitSet var8 = var5.getSystemIndexes();
         ComponentRegistry.Data var9 = this.registry._internal_getData();
         BitSet var10 = var9.getSystemIndexesForType(this.registry.getRefChangeSystemType());
         int var11 = -1;

         while ((var11 = var10.nextSetBit(var11 + 1)) >= 0) {
            if (var8.get(var11)) {
               RefChangeSystem var12 = (RefChangeSystem<ECS_TYPE, T>)var9.getSystem(var11);
               if (var12.componentType().getIndex() == var2.getIndex()) {
                  var12.onComponentSet(var1, var7, var3, this, var4);
               }
            }
         }
      } class="kw">finally {
         this.processing.unlock();
      }

      var4.consume();
   }

   @Override
   class="kw">public <T class="kw">extends Component<ECS_TYPE>> void putComponent(@Nonnull Ref<ECS_TYPE> var1, @Nonnull ComponentType<ECS_TYPE, T> var2, @Nonnull T var3) {
      this.assertThread();
      this.assertWriteProcessing();
      var1.validate(this);
      var2.validateRegistry(this.registry);
      var2.validate();
      Objects.requireNonNull(var3);
      CommandBuffer var4 = this.takeCommandBuffer();
      this.processing.lock();

      try {
         ArchetypeChunk var5 = var1.getArchetypeChunk();
         if (var5.getArchetype().contains(var2)) {
            int var6 = var1.getChunkEntityIndex();
            Component var7 = var5.__internal_getComponent(var6, var2);
            var5.setComponent(var6, var2, var3);
            BitSet var8 = var5.getSystemIndexes();
            ComponentRegistry.Data var9 = this.registry._internal_getData();
            BitSet var10 = var9.getSystemIndexesForType(this.registry.getRefChangeSystemType());
            int var11 = -1;

            while ((var11 = var10.nextSetBit(var11 + 1)) >= 0) {
               if (var8.get(var11)) {
                  RefChangeSystem var12 = (RefChangeSystem<ECS_TYPE, T>)var9.getSystem(var11);
                  if (var12.componentType().getIndex() == var2.getIndex()) {
                     var12.onComponentSet(var1, var7, var3, this, var4);
                  }
               }
            }
         } else {
            this.datachunk_addComponent(var1, var5, var2, var3, var4);
         }
      } class="kw">finally {
         this.processing.unlock();
      }

      var4.consume();
   }

   @Override
   class="kw">public <T class="kw">extends Component<ECS_TYPE>> T getComponent(@Nonnull Ref<ECS_TYPE> var1, @Nonnull ComponentType<ECS_TYPE, T> var2) {
      this.assertThread();
      class="kw">return this.__internal_getComponent(var1, var2);
   }

   @Nullable
   class="kw">public <T class="kw">extends Component<ECS_TYPE>> T getComponentConcurrent(@Nonnull Ref<ECS_TYPE> var1, @Nonnull ComponentType<ECS_TYPE, T> var2) {
      var2.validateRegistry(this.registry);
      var2.validate();

      while (true) {
         int var3 = var1.getSeq();
         if ((var3 & 1) != 0) {
            Thread.onSpinWait();
         } else {
            if (!var1.isValid(this)) {
               class="kw">return null;
            }

            ArchetypeChunk var4 = var1.getArchetypeChunk();
            if (var4 == null) {
               Thread.onSpinWait();
            } else {
               Component var5 = var4.__internal_getComponentConcurrent(var1.getChunkEntityIndex(), var2);
               VarHandle.loadLoadFence();
               if (var3 == var1.getSeq()) {
                  class="kw">return var5;
               }

               if (COUNT_SEQLOCK_RETRIES) {
                  this.seqlockRetries.incrementAndGet();
               }

               Thread.onSpinWait();
            }
         }
      }
   }

   @Nullable
   class="kw">protected <T class="kw">extends Component<ECS_TYPE>> T __internal_getComponent(@Nonnull Ref<ECS_TYPE> var1, @Nonnull ComponentType<ECS_TYPE, T> var2) {
      var1.validate(this);
      var2.validateRegistry(this.registry);
      var2.validate();
      class="kw">return var1.getArchetypeChunk().__internal_getComponent(var1.getChunkEntityIndex(), var2);
   }

   @Override
   class="kw">public <T class="kw">extends Component<ECS_TYPE>> void removeComponent(@Nonnull Ref<ECS_TYPE> var1, @Nonnull ComponentType<ECS_TYPE, T> var2) {
      this.assertThread();
      this.assertWriteProcessing();
      var1.validate(this);
      var2.validateRegistry(this.registry);
      var2.validate();
      CommandBuffer var3 = this.takeCommandBuffer();
      this.processing.lock();

      try {
         ArchetypeChunk var4 = var1.getArchetypeChunk();
         int var5 = var1.getChunkEntityIndex();
         Component var6 = var4.__internal_getComponent(var5, var2);
         assert var6 != null;
         Archetype var7 = Archetype.remove(var4.getArchetype(), var2);
         int var8 = this.findOrCreateArchetypeChunk(var7);
         ArchetypeChunk var9 = this.archetypeChunks[var8];
         var9.addEntityFrom(var1, var4, var5);
         BitSet var10 = var4.getSystemIndexes();
         ComponentRegistry.Data var11 = this.registry._internal_getData();
         BitSet var12 = var11.getSystemIndexesForType(this.registry.getRefChangeSystemType());
         int var13 = -1;

         while ((var13 = var12.nextSetBit(var13 + 1)) >= 0) {
            if (var10.get(var13)) {
               RefChangeSystem var14 = (RefChangeSystem<ECS_TYPE, T>)var11.getSystem(var13);
               if (var14.componentType().getIndex() == var2.getIndex()) {
                  var14.onComponentRemoved(var1, var6, this, var3);
               }
            }
         }

         if (var4.size() == 0) {
            this.removeArchetypeChunk(var4);
         }
      } class="kw">finally {
         this.processing.unlock();
      }

      var3.consume();
   }

   @Override
   class="kw">public <T class="kw">extends Component<ECS_TYPE>> void tryRemoveComponent(@Nonnull Ref<ECS_TYPE> var1, @Nonnull ComponentType<ECS_TYPE, T> var2) {
      this.removeComponentIfExists(var1, var2);
   }

   class="kw">public <T class="kw">extends Component<ECS_TYPE>> boolean removeComponentIfExists(@Nonnull Ref<ECS_TYPE> var1, @Nonnull ComponentType<ECS_TYPE, T> var2) {
      this.assertThread();
      this.assertWriteProcessing();
      var1.validate(this);
      var2.validateRegistry(this.registry);
      var2.validate();
      CommandBuffer var3 = this.takeCommandBuffer();
      this.processing.lock();

      boolean var4;
      try {
         ArchetypeChunk var5 = var1.getArchetypeChunk();
         if (!var5.getArchetype().contains(var2)) {
            var4 = false;
         } else {
            int var6 = var1.getChunkEntityIndex();
            Component var7 = var5.__internal_getComponent(var6, var2);
            assert var7 != null;
            Archetype var8 = Archetype.remove(var5.getArchetype(), var2);
            int var9 = this.findOrCreateArchetypeChunk(var8);
            ArchetypeChunk var10 = this.archetypeChunks[var9];
            var10.addEntityFrom(var1, var5, var6);
            BitSet var11 = var5.getSystemIndexes();
            ComponentRegistry.Data var12 = this.registry._internal_getData();
            BitSet var13 = var12.getSystemIndexesForType(this.registry.getRefChangeSystemType());
            int var14 = -1;

            while ((var14 = var13.nextSetBit(var14 + 1)) >= 0) {
               if (var11.get(var14)) {
                  RefChangeSystem var15 = (RefChangeSystem<ECS_TYPE, T>)var12.getSystem(var14);
                  if (var15.componentType().getIndex() == var2.getIndex()) {
                     var15.onComponentRemoved(var1, var7, this, var3);
                  }
               }
            }

            if (var5.size() == 0) {
               this.removeArchetypeChunk(var5);
            }

            var4 = true;
         }
      } class="kw">finally {
         this.processing.unlock();
      }

      var3.consume();
      class="kw">return var4;
   }

   class="kw">public <T class="kw">extends Resource<ECS_TYPE>> void replaceResource(@Nonnull ResourceType<ECS_TYPE, T> var1, @Nonnull T var2) {
      this.assertThread();
      var1.validateRegistry(this.registry);
      Objects.requireNonNull(var2);
      this.resources[var1.getIndex()] = var2;
   }

   @Nonnull
   @Override
   class="kw">public <T class="kw">extends Resource<ECS_TYPE>> T getResource(@Nonnull ResourceType<ECS_TYPE, T> var1) {
      var1.validateRegistry(this.registry);
      class="kw">return (T)this.resources[var1.getIndex()];
   }

   @Nonnull
   class="kw">protected <T class="kw">extends Resource<ECS_TYPE>> T __internal_getResource(@Nonnull ResourceType<ECS_TYPE, T> var1) {
      var1.validateRegistry(this.registry);
      class="kw">return (T)this.resources[var1.getIndex()];
   }

   class="kw">public void forEachChunk(@Nonnull BiConsumer<ArchetypeChunk<ECS_TYPE>, CommandBuffer<ECS_TYPE>> var1) {
      if (this.shutdown) {
         throw new IllegalStateException("Store is shutdown!");
      }

      this.assertThread();
      CommandBuffer var2 = this.takeCommandBuffer();
      this.processing.lock();

      try {
         for (int var3 = 0; var3 < this.archetypeSize; var3++) {
            ArchetypeChunk var4 = this.archetypeChunks[var3];
            if (var4 != null) {
               var1.accept(var4, var2);
            }
         }
      } class="kw">finally {
         this.processing.unlock();
      }

      var2.consume();
   }

   class="kw">public boolean forEachChunk(@Nonnull BiPredicate<ArchetypeChunk<ECS_TYPE>, CommandBuffer<ECS_TYPE>> var1) {
      if (this.shutdown) {
         throw new IllegalStateException("Store is shutdown!");
      }

      this.assertThread();
      CommandBuffer var2 = this.takeCommandBuffer();
      boolean var3 = false;
      this.processing.lock();

      try {
         for (int var4 = 0; var4 < this.archetypeSize; var4++) {
            ArchetypeChunk var5 = this.archetypeChunks[var4];
            if (var5 != null && var1.test(var5, var2)) {
               var3 = true;
               break;
            }
         }
      } class="kw">finally {
         this.processing.unlock();
      }

      var2.consume();
      class="kw">return var3;
   }

   class="kw">public void forEachChunk(Query<ECS_TYPE> var1, @Nonnull BiConsumer<ArchetypeChunk<ECS_TYPE>, CommandBuffer<ECS_TYPE>> var2) {
      if (this.shutdown) {
         throw new IllegalStateException("Store is shutdown!");
      }

      this.assertThread();
      CommandBuffer var3 = this.takeCommandBuffer();
      this.processing.lock();

      try {
         if (var1 class="kw">instanceof ExactArchetypeQuery var4) {
            int var5 = this.archetypeToIndexMap.getInt(var4.getArchetype());
            if (var5 != Integer.MIN_VALUE) {
               var2.accept(this.archetypeChunks[var5], var3);
            }
         } else {
            for (int var10 = 0; var10 < this.archetypeSize; var10++) {
               ArchetypeChunk var6 = this.archetypeChunks[var10];
               if (var6 != null && var1.test(var6.getArchetype())) {
                  var2.accept(this.archetypeChunks[var10], var3);
               }
            }
         }
      } class="kw">finally {
         this.processing.unlock();
      }

      var3.consume();
   }

   class="kw">public boolean forEachChunk(Query<ECS_TYPE> var1, @Nonnull BiPredicate<ArchetypeChunk<ECS_TYPE>, CommandBuffer<ECS_TYPE>> var2) {
      if (this.shutdown) {
         throw new IllegalStateException("Store is shutdown!");
      }

      this.assertThread();
      CommandBuffer var3 = this.takeCommandBuffer();
      boolean var4 = false;
      this.processing.lock();

      try {
         if (var1 class="kw">instanceof ExactArchetypeQuery var5) {
            int var6 = this.archetypeToIndexMap.getInt(var5.getArchetype());
            if (var6 != Integer.MIN_VALUE) {
               var4 = var2.test(this.archetypeChunks[var6], var3);
            }
         } else {
            for (int var11 = 0; var11 < this.archetypeSize; var11++) {
               ArchetypeChunk var7 = this.archetypeChunks[var11];
               if (var7 != null && var1.test(var7.getArchetype()) && var2.test(this.archetypeChunks[var11], var3)) {
                  var4 = true;
                  break;
               }
            }
         }
      } class="kw">finally {
         this.processing.unlock();
      }

      var3.consume();
      class="kw">return var4;
   }

   class="kw">public void forEachChunk(int var1, @Nonnull BiConsumer<ArchetypeChunk<ECS_TYPE>, CommandBuffer<ECS_TYPE>> var2) {
      if (this.shutdown) {
         throw new IllegalStateException("Store is shutdown!");
      }

      this.assertThread();
      CommandBuffer var3 = this.takeCommandBuffer();
      this.processing.lock();

      try {
         BitSet var4 = this.systemIndexToArchetypeChunkIndexes[var1];
         int var5 = -1;

         while ((var5 = var4.nextSetBit(var5 + 1)) >= 0) {
            var2.accept(this.archetypeChunks[var5], var3);
         }
      } class="kw">finally {
         this.processing.unlock();
      }

      var3.consume();
   }

   class="kw">public boolean forEachChunk(int var1, @Nonnull BiPredicate<ArchetypeChunk<ECS_TYPE>, CommandBuffer<ECS_TYPE>> var2) {
      if (this.shutdown) {
         throw new IllegalStateException("Store is shutdown!");
      }

      this.assertThread();
      CommandBuffer var3 = this.takeCommandBuffer();
      boolean var4 = false;
      this.processing.lock();

      try {
         BitSet var5 = this.systemIndexToArchetypeChunkIndexes[var1];
         int var6 = -1;

         while ((var6 = var5.nextSetBit(var6 + 1)) >= 0) {
            if (var2.test(this.archetypeChunks[var6], var3)) {
               var4 = true;
               break;
            }
         }
      } class="kw">finally {
         this.processing.unlock();
      }

      var3.consume();
      class="kw">return var4;
   }

   class="kw">public void forEachEntityParallel(IntBiObjectConsumer<ArchetypeChunk<ECS_TYPE>, CommandBuffer<ECS_TYPE>> var1) {
      if (this.shutdown) {
         throw new IllegalStateException("Store is shutdown!");
      }

      this.assertThread();
      CommandBuffer var2 = this.takeCommandBuffer();
      this.forEachTask.init();
      this.processing.lock();

      try {
         for (int var3 = 0; var3 < this.archetypeSize; var3++) {
            ArchetypeChunk var4 = this.archetypeChunks[var3];
            if (var4 != null) {
               int var5 = var4.size();
               if (var5 != 0) {
                  ParallelRangeTask var6 = this.forEachTask.appendTask();
                  var6.init(0, var5);
                  int var7 = 0;

                  for (int var8 = var6.size(); var7 < var8; var7++) {
                     var6.get(var7).init(var1, var4, var2.fork());
                  }
               }
            }
         }

         ForEachTaskData.invokeParallelTask(this.forEachTask, var2);
      } class="kw">finally {
         this.processing.unlock();
      }

      var2.consume();
   }

   class="kw">public void forEachEntityParallel(Query<ECS_TYPE> var1, IntBiObjectConsumer<ArchetypeChunk<ECS_TYPE>, CommandBuffer<ECS_TYPE>> var2) {
      if (this.shutdown) {
         throw new IllegalStateException("Store is shutdown!");
      }

      this.assertThread();
      CommandBuffer var3 = this.takeCommandBuffer();
      this.forEachTask.init();
      this.processing.lock();

      try {
         if (var1 class="kw">instanceof ExactArchetypeQuery var4) {
            int var14 = this.archetypeToIndexMap.getInt(var4.getArchetype());
            if (var14 != Integer.MIN_VALUE) {
               ArchetypeChunk var15 = this.archetypeChunks[var14];
               int var16 = var15.size();
               if (var16 != 0) {
                  ParallelRangeTask var17 = this.forEachTask.appendTask();
                  var17.init(0, var16);
                  int var18 = 0;

                  for (int var19 = var17.size(); var18 < var19; var18++) {
                     var17.get(var18).init(var2, var15, var3.fork());
                  }
               }
            }
         } else {
            for (int var5 = 0; var5 < this.archetypeSize; var5++) {
               ArchetypeChunk var6 = this.archetypeChunks[var5];
               if (var6 != null && var1.test(var6.getArchetype())) {
                  int var7 = var6.size();
                  if (var7 != 0) {
                     ParallelRangeTask var8 = this.forEachTask.appendTask();
                     var8.init(0, var7);
                     int var9 = 0;

                     for (int var10 = var8.size(); var9 < var10; var9++) {
                        var8.get(var9).init(var2, var6, var3.fork());
                     }
                  }
               }
            }
         }

         ForEachTaskData.invokeParallelTask(this.forEachTask, var3);
      } class="kw">finally {
         this.processing.unlock();
      }

      var3.consume();
   }

   class="kw">public <T class="kw">extends ArchetypeDataSystem<ECS_TYPE, Q, R>, Q, R> void fetch(@Nonnull SystemType<ECS_TYPE, T> var1, Q var2, @Nonnull List<R> var3) {
      if (this.shutdown) {
         throw new IllegalStateException("Store is shutdown!");
      }

      this.assertThread();
      ComponentRegistry.Data var4 = this.registry._internal_getData();
      CommandBuffer var5 = this.takeCommandBuffer();
      this.fetchTask.init();
      BitSet var6 = var4.getSystemIndexesForType(var1);
      this.processing.lock();

      try {
         int var7 = -1;

         while ((var7 = var6.nextSetBit(var7 + 1)) >= 0) {
            ArchetypeDataSystem var8 = (T)var4.getSystem(var7, var1);
            BitSet var9 = this.systemIndexToArchetypeChunkIndexes[var7];
            int var10 = -1;

            while ((var10 = var9.nextSetBit(var10 + 1)) >= 0) {
               var8.fetch(this.archetypeChunks[var10], this, var5, var2, var3);
            }
         }

         EntityDataSystem.SystemTaskData.invokeParallelTask(this.fetchTask, var5, var3);
      } class="kw">finally {
         this.processing.unlock();
      }

      var5.consume();
   }

   class="kw">public <T class="kw">extends EntityDataSystem<ECS_TYPE, Q, R>, Q, R> void fetch(
      @Nonnull Collection<Ref<ECS_TYPE>> var1, @Nonnull SystemType<ECS_TYPE, T> var2, @Nonnull Q var3, @Nonnull List<R> var4
   ) {
      if (this.shutdown) {
         throw new IllegalStateException("Store is shutdown!");
      }

      this.assertThread();
      ComponentRegistry.Data var5 = this.registry._internal_getData();
      CommandBuffer var6 = this.takeCommandBuffer();
      this.fetchTask.init();
      BitSet var7 = var5.getSystemIndexesForType(var2);
      this.processing.lock();

      try {
         int var8 = -1;

         while ((var8 = var7.nextSetBit(var8 + 1)) >= 0) {
            EntityDataSystem var9 = (T)var5.getSystem(var8, var2);

            for (Ref var11 : var1) {
               ArchetypeChunk var12 = var11.getArchetypeChunk();
               BitSet var13 = var12.getSystemIndexes();
               if (var13.get(var8)) {
                  var9.fetch(var11.getChunkEntityIndex(), var12, this, var6, var3, var4);
               }
            }
         }

         EntityDataSystem.SystemTaskData.invokeParallelTask(this.fetchTask, var6, var4);
      } class="kw">finally {
         this.processing.unlock();
      }

      var6.consume();
   }

   @Override
   class="kw">public <Event class="kw">extends EcsEvent> void invoke(@Nonnull Ref<ECS_TYPE> var1, @Nonnull Event var2) {
      EntityEventType var3 = this.registry.getEntityEventTypeForClass(var2.getClass());
      if (var3 != null) {
         ((Store<ECS_TYPE>)this).invoke(var3, var1, var2);
      }
   }

   @Override
   class="kw">public <Event class="kw">extends EcsEvent> void invoke(@Nonnull EntityEventType<ECS_TYPE, Event> var1, @Nonnull Ref<ECS_TYPE> var2, @Nonnull Event var3) {
      if (this.shutdown) {
         throw new IllegalStateException("Store is shutdown!");
      }

      this.assertThread();
      ComponentRegistry.Data var4 = this.registry._internal_getData();
      CommandBuffer var5 = this.takeCommandBuffer();
      var5.track(var2);
      BitSet var6 = var4.getSystemIndexesForType(var1);
      this.processing.lock();

      try {
         ArchetypeChunk var7 = var2.getArchetypeChunk();
         BitSet var8 = var7.getSystemIndexes();
         int var9 = -1;

         while ((var9 = var6.nextSetBit(var9 + 1)) >= 0) {
            var9 = var8.nextSetBit(var9);
            if (var9 < 0) {
               break;
            }

            if (var6.get(var9)) {
               EntityEventSystem var10 = var4.getSystem(var9, var1);
               var10.handleInternal(var2.getChunkEntityIndex(), var7, this, var5, var3);
               if (var5.consumeWasTrackedRefRemoved()) {
                  break;
               }
            }
         }
      } class="kw">finally {
         this.processing.unlock();
      }

      var5.consume();
   }

   @Override
   class="kw">public <Event class="kw">extends EcsEvent> void invoke(@Nonnull Holder<ECS_TYPE> var1, @Nonnull Event var2) {
      EntityHolderEventType var3 = this.registry.getEntityHolderEventTypeForClass(var2.getClass());
      if (var3 != null) {
         ((Store<ECS_TYPE>)this).invoke(var3, var1, var2);
      }
   }

   @Override
   class="kw">public <Event class="kw">extends EcsEvent> void invoke(@Nonnull EntityHolderEventType<ECS_TYPE, Event> var1, @Nonnull Holder<ECS_TYPE> var2, @Nonnull Event var3) {
      if (this.shutdown) {
         throw new IllegalStateException("Store is shutdown!");
      }

      this.assertThread();
      ComponentRegistry.Data var4 = this.registry._internal_getData();
      CommandBuffer var5 = this.takeCommandBuffer();
      BitSet var6 = var4.getSystemIndexesForType(var1);
      this.processing.lock();

      try {
         Archetype var7 = var2.getArchetype();
         int var8 = -1;

         while ((var8 = var6.nextSetBit(var8 + 1)) >= 0) {
            EntityHolderEventSystem var9 = var4.getSystem(var8, var1);
            if (var9.getQuery() != null && var9.getQuery().test(var7)) {
               var9.handleInternal(var2, this, var5, var3);
            }
         }
      } class="kw">finally {
         this.processing.unlock();
      }

      var5.consume();
   }

   @Override
   class="kw">public <Event class="kw">extends EcsEvent> void invoke(@Nonnull Event var1) {
      WorldEventType var2 = this.registry.getWorldEventTypeForClass(var1.getClass());
      if (var2 != null) {
         ((Store<ECS_TYPE>)this).invoke(var2, var1);
      }
   }

   @Override
   class="kw">public <Event class="kw">extends EcsEvent> void invoke(@Nonnull WorldEventType<ECS_TYPE, Event> var1, @Nonnull Event var2) {
      if (this.shutdown) {
         throw new IllegalStateException("Store is shutdown!");
      }

      this.assertThread();
      ComponentRegistry.Data var3 = this.registry._internal_getData();
      CommandBuffer var4 = this.takeCommandBuffer();
      BitSet var5 = var3.getSystemIndexesForType(var1);
      this.processing.lock();

      try {
         int var6 = -1;

         while ((var6 = var5.nextSetBit(var6 + 1)) >= 0) {
            WorldEventSystem var7 = var3.getSystem(var6, var1);
            var7.handleInternal(this, var4, var2);
         }
      } class="kw">finally {
         this.processing.unlock();
      }

      var4.consume();
   }

   class="kw">protected <Event class="kw">extends EcsEvent> void internal_invoke(CommandBuffer<ECS_TYPE> var1, Ref<ECS_TYPE> var2, Event var3) {
      EntityEventType var4 = this.registry.getEntityEventTypeForClass(var3.getClass());
      if (var4 != null) {
         ((Store<ECS_TYPE>)this).internal_invoke(var1, var4, var2, var3);
      }
   }

   class="kw">protected <Event class="kw">extends EcsEvent> void internal_invoke(
      CommandBuffer<ECS_TYPE> var1, @Nonnull EntityEventType<ECS_TYPE, Event> var2, Ref<ECS_TYPE> var3, Event var4
   ) {
      ComponentRegistry.Data var5 = this.registry._internal_getData();
      CommandBuffer var6 = var1.fork();
      var6.track(var3);
      BitSet var7 = var5.getSystemIndexesForType(var2);
      ArchetypeChunk var8 = var3.getArchetypeChunk();
      BitSet var9 = var8.getSystemIndexes();
      int var10 = -1;

      while ((var10 = var7.nextSetBit(var10 + 1)) >= 0) {
         var10 = var9.nextSetBit(var10);
         if (var10 < 0) {
            break;
         }

         if (var7.get(var10)) {
            EntityEventSystem var11 = var5.getSystem(var10, var2);
            var11.handleInternal(var3.getChunkEntityIndex(), var8, this, var6, var4);
            if (var6.consumeWasTrackedRefRemoved()) {
               break;
            }
         }
      }

      var6.mergeParallel(var1);
   }

   class="kw">protected <Event class="kw">extends EcsEvent> void internal_invoke(CommandBuffer<ECS_TYPE> var1, Holder<ECS_TYPE> var2, Event var3) {
      EntityHolderEventType var4 = this.registry.getEntityHolderEventTypeForClass(var3.getClass());
      if (var4 != null) {
         ((Store<ECS_TYPE>)this).internal_invoke(var1, var4, var2, var3);
      }
   }

   class="kw">protected <Event class="kw">extends EcsEvent> void internal_invoke(
      CommandBuffer<ECS_TYPE> var1, @Nonnull EntityHolderEventType<ECS_TYPE, Event> var2, Holder<ECS_TYPE> var3, Event var4
   ) {
      ComponentRegistry.Data var5 = this.registry._internal_getData();
      BitSet var6 = var5.getSystemIndexesForType(var2);
      Archetype var7 = var3.getArchetype();
      int var8 = -1;

      while ((var8 = var6.nextSetBit(var8 + 1)) >= 0) {
         EntityHolderEventSystem var9 = var5.getSystem(var8, var2);
         if (var9.getQuery() != null && var9.getQuery().test(var7)) {
            var9.handleInternal(var3, this, var1, var4);
         }
      }
   }

   class="kw">protected <Event class="kw">extends EcsEvent> void internal_invoke(CommandBuffer<ECS_TYPE> var1, Event var2) {
      WorldEventType var3 = this.registry.getWorldEventTypeForClass(var2.getClass());
      if (var3 != null) {
         ((Store<ECS_TYPE>)this).internal_invoke(var1, var3, var2);
      }
   }

   class="kw">protected <Event class="kw">extends EcsEvent> void internal_invoke(CommandBuffer<ECS_TYPE> var1, @Nonnull WorldEventType<ECS_TYPE, Event> var2, Event var3) {
      ComponentRegistry.Data var4 = this.registry._internal_getData();
      BitSet var5 = var4.getSystemIndexesForType(var2);
      int var6 = -1;

      while ((var6 = var5.nextSetBit(var6 + 1)) >= 0) {
         WorldEventSystem var7 = var4.getSystem(var6, var2);
         var7.handleInternal(this, var1, var3);
      }
   }

   class="kw">public void tick(float var1) {
      this.tickInternal(var1, this.registry.getTickingSystemType());
   }

   class="kw">public void pausedTick(float var1) {
      if (this.shutdown) {
         throw new IllegalStateException("Store is shutdown!");
      }

      this.assertThread();
      this.tickInternal(var1, this.registry.getRunWhenPausedSystemType());
   }

   class="kw">private <Tickable class="kw">extends TickableSystem<ECS_TYPE>> void tickInternal(float var1, SystemType<ECS_TYPE, Tickable> var2) {
      if (this.shutdown) {
         throw new IllegalStateException("Store is shutdown!");
      }

      this.assertThread();
      this.registry.getDataUpdateLock().readLock().lock();

      try {
         ComponentRegistry.Data var3 = this.registry.doDataUpdate();
         BitSet var4 = var3.getSystemIndexesForType(var2);
         int var5 = -1;

         while ((var5 = var4.nextSetBit(var5 + 1)) >= 0) {
            TickableSystem var6 = (Tickable)var3.getSystem(var5, var2);
            long var7 = System.nanoTime();
            var6.tick(var1, var5, this);
            long var9 = System.nanoTime();
            this.systemMetrics[var5].add(var9, var9 - var7);
         }
      } class="kw">finally {
         this.registry.getDataUpdateLock().readLock().unlock();
      }
   }

   class="kw">public void tick(ArchetypeTickingSystem<ECS_TYPE> var1, float var2, int var3) {
      if (this.shutdown) {
         throw new IllegalStateException("Store is shutdown!");
      }

      this.assertThread();
      CommandBuffer var4 = this.takeCommandBuffer();
      this.parallelTask.init();
      boolean var5 = this.disableProcessingAssert;
      this.disableProcessingAssert = var1 class="kw">instanceof DisableProcessingAssert;
      this.processing.lock();

      try {
         BitSet var6 = this.systemIndexToArchetypeChunkIndexes[var3];
         int var7 = -1;

         while ((var7 = var6.nextSetBit(var7 + 1)) >= 0) {
            var1.tick(var2, this.archetypeChunks[var7], this, var4);
         }

         EntityTickingSystem.SystemTaskData.invokeParallelTask(this.parallelTask, var4);
      } class="kw">finally {
         this.processing.unlock();
         this.disableProcessingAssert = var5;
      }

      var4.consume();
   }

   void updateData(@Nonnull ComponentRegistry.Data<ECS_TYPE> var1, @Nonnull ComponentRegistry.Data<ECS_TYPE> var2) {
      if (this.shutdown) {
         throw new IllegalStateException("Store is shutdown!");
      }

      int var3 = var2.getResourceSize();
      this.resources = Arrays.copyOf(this.resources, var3);

      for (int var4 = 0; var4 < this.resources.length; var4++) {
         ResourceType var5 = (ResourceType<ECS_TYPE, ? class="kw">extends Resource<ECS_TYPE>>)var2.getResourceType(var4);
         if (this.resources[var4] == null && var5 != null) {
            this.resources[var4] = (Resource<ECS_TYPE>)this.resourceStorage.load(this, var2, var5).join();
         } else if (this.resources[var4] != null && var5 == null) {
            this.resources[var4] = null;
         }
      }

      boolean var11 = false;

      for (int var12 = 0; var12 < var2.getDataChangeCount(); var12++) {
         DataChange var6 = var2.getDataChange(var12);
         var11 |= var6 class="kw">instanceof SystemChange;
         this.updateData(var1, var2, var6);
      }

      HistoricMetric[] var13 = this.systemMetrics;
      this.systemMetrics = new HistoricMetric[var2.getSystemSize()];
      SystemType var14 = this.registry.getTickableSystemType();
      BitSet var7 = var2.getSystemIndexesForType(var14);
      int var8 = -1;

      while ((var8 = var7.nextSetBit(var8 + 1)) >= 0) {
         ISystem var9 = var2.getSystem(var8);
         int var10 = var1.indexOf(var9);
         if (var10 >= 0) {
            this.systemMetrics[var8] = var13[var10];
         } else {
            this.systemMetrics[var8] = HistoricMetric.builder(33333333L, TimeUnit.NANOSECONDS)
               .addPeriod(1L, TimeUnit.SECONDS)
               .addPeriod(1L, TimeUnit.MINUTES)
               .addPeriod(5L, TimeUnit.MINUTES)
               .build();
         }
      }

      if (var11) {
         this.updateArchetypeIndexes(var2);
      }
   }

   class="kw">private void updateData(@Nonnull ComponentRegistry.Data<ECS_TYPE> var1, @Nonnull ComponentRegistry.Data<ECS_TYPE> var2, DataChange var3) {
      this.processing.lock();

      try {
         this.updateData0(var1, var2, var3);
      } class="kw">finally {
         this.processing.unlock();
      }

      if (var3 class="kw">instanceof SystemChange var4) {
         ISystem var5 = var4.getSystem();
         class="kw">switch (var4.getType()) {
            case REGISTERED:
               if (var5 class="kw">instanceof StoreSystem) {
                  ((StoreSystem)var5).onSystemAddedToStore(this);
               }
               break;
            case UNREGISTERED:
               if (var5 class="kw">instanceof StoreSystem) {
                  ((StoreSystem)var5).onSystemRemovedFromStore(this);
               }
         }
      }
   }

   class="kw">private void updateData0(@Nonnull ComponentRegistry.Data<ECS_TYPE> var1, @Nonnull ComponentRegistry.Data<ECS_TYPE> var2, DataChange var3) {
      if (var3 class="kw">instanceof ComponentChange var4) {
         ComponentType var5 = var4.getComponentType();
         ComponentType var6 = this.registry.getUnknownComponentType();
         class="kw">switch (var4.getType()) {
            case REGISTERED:
               String var22 = var2.getComponentId(var5);
               Codec var25 = var2.getComponentCodec((ComponentType<ECS_TYPE, Component<ECS_TYPE>>)var5);
               if (var25 != null) {
                  Holder var28 = this.registry._internal_newEntityHolder();
                  int var29 = this.archetypeSize;

                  for (int var31 = 0; var31 < var29; var31++) {
                     ArchetypeChunk var32 = this.archetypeChunks[var31];
                     if (var32 != null) {
                        Archetype var33 = var32.getArchetype();
                        if (!var33.contains(var5) && var33.contains(var6)) {
                           Archetype var35 = Archetype.add(var33, var5);
                           int var36 = this.findOrCreateArchetypeChunk(var35);
                           ArchetypeChunk var37 = this.archetypeChunks[var36];
                           var32.transferSomeTo(var28, var37, var3x -> {
                              UnknownComponents var4 = var32.getComponent(var3x, var6);
                              assert var4 != null;
                              class="kw">return var4.contains(var22);
                           }, var4x -> {
                              UnknownComponents var5 = var4x.getComponent(var6);
                              assert var5 != null;
                              Component var6 = var5.removeComponent(var22, var25);
                              var4x.addComponent(var5, var6);
                           }, (var1x, var2x) -> var2x.setPosition(var37, var1x));
                           if (var32.size() == 0) {
                              this.archetypeToIndexMap.removeInt(var32.getArchetype());
                              this.archetypeChunks[var31] = null;

                              for (int var17 = 0; var17 < var1.getSystemSize(); var17++) {
                                 this.systemIndexToArchetypeChunkIndexes[var17].clear(var31);
                              }

                              var32.getSystemIndexes().clear();
                              this.archetypeChunkReuse.set(var31);
                           }

                           if (var37.size() == 0) {
                              this.archetypeToIndexMap.removeInt(var37.getArchetype());
                              this.archetypeChunks[var36] = null;

                              for (int var38 = 0; var38 < var1.getSystemSize(); var38++) {
                                 this.systemIndexToArchetypeChunkIndexes[var38].clear(var36);
                              }

                              var37.getSystemIndexes().clear();
                              this.archetypeChunkReuse.set(var36);
                           }
                        }
                     }
                  }
               }
               break;
            case UNREGISTERED:
               Holder var9 = this.registry._internal_newEntityHolder();
               String var7 = var1.getComponentId(var5);
               Codec var8 = var1.getComponentCodec((ComponentType<ECS_TYPE, Component<ECS_TYPE>>)var5);
               int var10 = this.archetypeSize;

               for (int var11 = 0; var11 < var10; var11++) {
                  ArchetypeChunk var12 = this.archetypeChunks[var11];
                  if (var12 != null) {
                     Archetype var13 = var12.getArchetype();
                     if (var13.contains(var5)) {
                        this.archetypeToIndexMap.removeInt(var12.getArchetype());
                        this.archetypeChunks[var11] = null;

                        for (int var14 = 0; var14 < var1.getSystemSize(); var14++) {
                           this.systemIndexToArchetypeChunkIndexes[var14].clear(var11);
                        }

                        var12.getSystemIndexes().clear();
                        this.archetypeChunkReuse.set(var11);
                        Archetype var34 = Archetype.remove(var13, var5);
                        if (var8 != null && !var34.contains(var6)) {
                           var34 = Archetype.add(var34, var6);
                        }

                        int var15 = this.findOrCreateArchetypeChunk(var34);
                        ArchetypeChunk var16 = this.archetypeChunks[var15];
                        var12.transferTo(var9, var16, var4x -> {
                           if (var8 != null) {
                              UnknownComponents var5;
                              if (var4x.getArchetype().contains(var6)) {
                                 var5 = var4x.getComponent(var6);
                                 assert var5 != null;
                              } else {
                                 var5 = new UnknownComponents<>();
                                 var4x.addComponent(var6, var5);
                              }

                              Component var6 = var4x.getComponent((ComponentType<ECS_TYPE, Component<ECS_TYPE>>)var5);
                              var5.addComponent(var7, var6, var8);
                           }

                           var4x.removeComponent(var5);
                        }, (var1x, var2x) -> var2x.setPosition(var16, var1x));
                     }
                  }
               }

               int var30 = this.archetypeChunkReuse.previousClearBit(var10 - 1);
               this.archetypeSize = var30 + 1;
               this.archetypeChunkReuse.clear(this.archetypeSize, var10);
         }
      } else if (var3 class="kw">instanceof SystemChange var18) {
         ISystem var19 = var18.getSystem();
         class="kw">switch (var18.getType()) {
            case REGISTERED:
               if (var19 class="kw">instanceof ArchetypeChunkSystem var21) {
                  for (int var24 = 0; var24 < this.archetypeSize; var24++) {
                     ArchetypeChunk var27 = this.archetypeChunks[var24];
                     if (var27 != null && var21.test(this.registry, var27.getArchetype())) {
                        var21.onSystemAddedToArchetypeChunk(var27);
                     }
                  }
               }
               break;
            case UNREGISTERED:
               if (var19 class="kw">instanceof ArchetypeChunkSystem var20) {
                  for (int var23 = 0; var23 < this.archetypeSize; var23++) {
                     ArchetypeChunk var26 = this.archetypeChunks[var23];
                     if (var26 != null && var20.test(this.registry, var26.getArchetype())) {
                        var20.onSystemRemovedFromArchetypeChunk(var26);
                     }
                  }
               }
         }
      }
   }

   class="kw">private void updateArchetypeIndexes(@Nonnull ComponentRegistry.Data<ECS_TYPE> var1) {
      int var2 = var1.getSystemSize();
      int var3 = this.systemIndexToArchetypeChunkIndexes.length;
      if (var3 < var2) {
         this.systemIndexToArchetypeChunkIndexes = Arrays.copyOf(this.systemIndexToArchetypeChunkIndexes, var2);

         for (int var4 = var3; var4 < var2; var4++) {
            this.systemIndexToArchetypeChunkIndexes[var4] = new BitSet(this.archetypeSize);
         }
      }

      for (int var11 = 0; var11 < var3; var11++) {
         this.systemIndexToArchetypeChunkIndexes[var11].clear();
      }

      for (int var12 = 0; var12 < this.archetypeSize; var12++) {
         ArchetypeChunk var5 = this.archetypeChunks[var12];
         if (var5 != null) {
            var5.getSystemIndexes().clear();
         }
      }

      SystemType var13 = this.registry.getQuerySystemType();
      BitSet var14 = var1.getSystemIndexesForType(var13);
      int var6 = -1;

      while ((var6 = var14.nextSetBit(var6 + 1)) >= 0) {
         QuerySystem var7 = var1.getSystem(var6, var13);
         BitSet var8 = this.systemIndexToArchetypeChunkIndexes[var6];

         for (int var9 = 0; var9 < this.archetypeSize; var9++) {
            ArchetypeChunk var10 = this.archetypeChunks[var9];
            if (var10 != null && var7.test(this.registry, var10.getArchetype())) {
               var8.set(var9);
               var10.getSystemIndexes().set(var6);
            }
         }
      }
   }

   class="kw">public void assertWriteProcessing() {
      if (this.processing.isHeld() && !this.disableProcessingAssert) {
         throw new IllegalStateException("Store is currently processing! Ensure you aren't calling a store method from a system.");
      }
   }

   @Deprecated
   class="kw">public boolean isProcessing() {
      class="kw">return this.processing.isHeld();
   }

   class="kw">public void assertThread() {
      Thread var1 = Thread.currentThread();
      if (var1 != this.thread && this.thread.isAlive()) {
         throw new IllegalStateException("Assert not in thread! " + this.thread + " but was in " + var1);
      }
   }

   class="kw">public boolean isInThread() {
      class="kw">return Thread.currentThread() == this.thread;
   }

   class="kw">public boolean isAliveInDifferentThread() {
      class="kw">return this.thread.isAlive() && Thread.currentThread() != this.thread;
   }

   @Nonnull
   @Override
   class="kw">public String toString() {
      class="kw">return "Store{super()="
         + this.getClass()
         + "@"
         + this.hashCode()
         + ", registry="
         + this.registry.getClass()
         + "@"
         + this.registry.hashCode()
         + ", shutdown="
         + this.shutdown
         + ", storeIndex="
         + this.storeIndex
         + ", systemIndexToArchetypeChunkIndexes="
         + Arrays.toString(this.systemIndexToArchetypeChunkIndexes)
         + ", archetypeSize="
         + this.archetypeSize
         + ", archetypeChunks="
         + Arrays.toString(this.archetypeChunks)
         + "}";
   }

   class="kw">private <T class="kw">extends Component<ECS_TYPE>> void datachunk_addComponent(
      @Nonnull Ref<ECS_TYPE> var1,
      @Nonnull ArchetypeChunk<ECS_TYPE> var2,
      @Nonnull ComponentType<ECS_TYPE, T> var3,
      @Nonnull T var4,
      @Nonnull CommandBuffer<ECS_TYPE> var5
   ) {
      if (var2.getArchetype().contains(var3)) {
         throw new IllegalArgumentException("Entity already contains component type: " + var3);
      }

      Archetype var6 = Archetype.add(var2.getArchetype(), var3);
      int var7 = this.findOrCreateArchetypeChunk(var6);
      ArchetypeChunk var8 = this.archetypeChunks[var7];
      int var9 = var1.getChunkEntityIndex();
      var8.addEntityFrom(var1, var2, var9, var3, var4);
      BitSet var10 = var8.getSystemIndexes();
      ComponentRegistry.Data var11 = this.registry._internal_getData();
      BitSet var12 = var11.getSystemIndexesForType(this.registry.getRefChangeSystemType());
      int var13 = -1;

      while ((var13 = var12.nextSetBit(var13 + 1)) >= 0) {
         if (var10.get(var13)) {
            RefChangeSystem var14 = (RefChangeSystem<ECS_TYPE, T>)var11.getSystem(var13);
            if (var14.componentType().getIndex() == var3.getIndex()) {
               var14.onComponentAdded(var1, var4, this, var5);
            }
         }
      }

      if (var2.size() == 0) {
         this.removeArchetypeChunk(var2);
      }
   }

   class="kw">private int findOrCreateArchetypeChunk(@Nonnull Archetype<ECS_TYPE> var1) {
      int var2 = this.archetypeToIndexMap.getInt(var1);
      if (var2 != Integer.MIN_VALUE) {
         class="kw">return var2;
      }

      ComponentRegistry.Data var3 = this.registry._internal_getData();
      if (this.archetypeChunkReuse.isEmpty()) {
         var2 = this.archetypeSize++;
      } else {
         var2 = this.archetypeChunkReuse.nextSetBit(0);
         this.archetypeChunkReuse.clear(var2);
      }

      int var4 = this.archetypeChunks.length;
      if (var4 <= var2) {
         int var5 = ArrayUtil.grow(var2);
         this.archetypeChunks = Arrays.copyOf(this.archetypeChunks, var5);
      }

      ArchetypeChunk var12 = new ArchetypeChunk<>(this, var1);
      var12.setArchetypeIndex(var2);
      this.archetypeChunks[var2] = var12;
      this.archetypeToIndexMap.put(var1, var2);
      BitSet var6 = var12.getSystemIndexes();
      SystemType var7 = this.registry.getQuerySystemType();
      BitSet var8 = var3.getSystemIndexesForType(var7);
      int var9 = -1;

      while ((var9 = var8.nextSetBit(var9 + 1)) >= 0) {
         QuerySystem var10 = var3.getSystem(var9, var7);
         if (var10.test(this.registry, var1)) {
            this.systemIndexToArchetypeChunkIndexes[var9].set(var2);
            var6.set(var9);
            if (var10 class="kw">instanceof ArchetypeChunkSystem) {
               ((ArchetypeChunkSystem)var10).onSystemAddedToArchetypeChunk(var12);
            }
         }
      }

      class="kw">return var2;
   }

   class="kw">private void removeArchetypeChunk(@Nonnull ArchetypeChunk<ECS_TYPE> var1) {
      int var2 = var1.getArchetypeIndex();
      Archetype var3 = var1.getArchetype();
      this.archetypeToIndexMap.removeInt(var3);
      this.archetypeChunks[var2] = null;
      var1.getSystemIndexes().clear();
      ComponentRegistry.Data var4 = this.registry._internal_getData();
      BitSet var5 = var4.getSystemIndexesForType(this.registry.getQuerySystemType());
      int var6 = -1;

      while ((var6 = var5.nextSetBit(var6 + 1)) >= 0) {
         this.systemIndexToArchetypeChunkIndexes[var6].clear(var2);
         if (var4.getSystem(var6) class="kw">instanceof ArchetypeChunkSystem var8 && var8.test(this.registry, var3)) {
            var8.onSystemRemovedFromArchetypeChunk(var1);
         }
      }

      if (var2 == this.archetypeSize - 1) {
         int var9 = this.archetypeChunkReuse.previousClearBit(var2 - 1);
         this.archetypeSize = var9 + 1;
         this.archetypeChunkReuse.clear(this.archetypeSize, var2);
      } else {
         this.archetypeChunkReuse.set(var2);
      }
   }

   class="kw">private class="kw">static class ProcessingCounter class="kw">implements Lock {
      class="kw">private int count = 0;

      class="kw">private ProcessingCounter() {
      }

      class="kw">public boolean isHeld() {
         class="kw">return this.count > 0;
      }

      @Override
      class="kw">public void lock() {
         this.count++;
      }

      @Override
      class="kw">public void lockInterruptibly() {
         throw new UnsupportedOperationException("lockInterruptibly() is not supported");
      }

      @Override
      class="kw">public boolean tryLock() {
         throw new UnsupportedOperationException("tryLock() is not supported");
      }

      @Override
      class="kw">public boolean tryLock(long var1, @Nonnull TimeUnit var3) {
         throw new UnsupportedOperationException("tryLock() is not supported");
      }

      @Override
      class="kw">public void unlock() {
         this.count--;
      }

      @Nonnull
      @Override
      class="kw">public Condition newCondition() {
         throw new UnsupportedOperationException("Conditions are not supported");
      }
   }
}