From dadb0a624cab08627738eb8b0538dc25bf636f10 Mon Sep 17 00:00:00 2001 From: Aikar Date: Wed, 30 Mar 2016 19:36:20 -0400 Subject: [PATCH] MC Dev fixes diff --git a/src/main/java/net/minecraft/server/BaseBlockPosition.java b/src/main/java/net/minecraft/server/BaseBlockPosition.java index 25a1edc45..f1ad18511 100644 --- a/src/main/java/net/minecraft/server/BaseBlockPosition.java +++ b/src/main/java/net/minecraft/server/BaseBlockPosition.java @@ -98,8 +98,4 @@ public class BaseBlockPosition implements Comparable { return MoreObjects.toStringHelper(this).add("x", this.getX()).add("y", this.getY()).add("z", this.getZ()).toString(); } - // $FF: synthetic method - public int compareTo(Object object) { - return this.compareTo((BaseBlockPosition)object); - } } diff --git a/src/main/java/net/minecraft/server/BlockPosition.java b/src/main/java/net/minecraft/server/BlockPosition.java index 66c38df1f..50e29464b 100644 --- a/src/main/java/net/minecraft/server/BlockPosition.java +++ b/src/main/java/net/minecraft/server/BlockPosition.java @@ -178,10 +178,6 @@ public class BlockPosition extends BaseBlockPosition { } } - // $FF: synthetic method - protected Object computeNext() { - return this.computeNext(); - } }; }; } @@ -209,8 +205,11 @@ public class BlockPosition extends BaseBlockPosition { if (this.g.b < l) { ++this.g.b; } else if (this.g.c < i1) { + this.g.b = ix; // Paper - decompile fix Readd line removed by the decompiler ++this.g.c; } else if (this.g.d < j1) { + this.g.b = ix; // Paper - decompile fix Readd line removed by the decompiler + this.g.c = jx; // Paper - decompile fix Readd line removed by the decompiler ++this.g.d; } @@ -218,18 +217,10 @@ public class BlockPosition extends BaseBlockPosition { } } - // $FF: synthetic method - protected Object computeNext() { - return this.computeNext(); - } }; }; } - // $FF: synthetic method - public BaseBlockPosition d(BaseBlockPosition baseblockposition) { - return this.d(baseblockposition); - } public static class MutableBlockPosition extends BlockPosition { protected int b; @@ -314,10 +305,6 @@ public class BlockPosition extends BaseBlockPosition { return new BlockPosition(this); } - // $FF: synthetic method - public BaseBlockPosition d(BaseBlockPosition baseblockposition) { - return super.d(baseblockposition); - } } public static final class b extends BlockPosition.MutableBlockPosition implements AutoCloseable { @@ -389,34 +376,5 @@ public class BlockPosition extends BaseBlockPosition { } } - // $FF: synthetic method - public BlockPosition.MutableBlockPosition d(int i, int j, int k) { - return this.d(i, j, k); - } - - // $FF: synthetic method - public BlockPosition.MutableBlockPosition c(EnumDirection enumdirection, int i) { - return this.c(enumdirection, i); - } - - // $FF: synthetic method - public BlockPosition.MutableBlockPosition c(EnumDirection enumdirection) { - return this.c(enumdirection); - } - - // $FF: synthetic method - public BlockPosition.MutableBlockPosition g(BaseBlockPosition baseblockposition) { - return this.g(baseblockposition); - } - - // $FF: synthetic method - public BlockPosition.MutableBlockPosition c(double d0, double d1, double d2) { - return this.c(d0, d1, d2); - } - - // $FF: synthetic method - public BlockPosition.MutableBlockPosition c(int i, int j, int k) { - return this.c(i, j, k); - } } } diff --git a/src/main/java/net/minecraft/server/DataPaletteBlock.java b/src/main/java/net/minecraft/server/DataPaletteBlock.java index 3bd0c56d4..304e47bf2 100644 --- a/src/main/java/net/minecraft/server/DataPaletteBlock.java +++ b/src/main/java/net/minecraft/server/DataPaletteBlock.java @@ -72,11 +72,11 @@ public class DataPaletteBlock implements DataPaletteExpandable { public int onResize(int ix, T object) { this.b(); DataBits databits = this.a; - DataPalette datapalette = this.h; + DataPalette datapalette = this.h; // Paper - decompile fix this.b(ix); for(int jx = 0; jx < databits.b(); ++jx) { - Object object1 = datapalette.a(databits.a(jx)); + T object1 = datapalette.a(databits.a(jx)); // Paper - decompile fix if (object1 != null) { this.setBlockIndex(jx, object1); } @@ -103,7 +103,7 @@ public class DataPaletteBlock implements DataPaletteExpandable { } protected T a(int ix) { - Object object = this.h.a(this.a.a(ix)); + T object = this.h.a(this.a.a(ix)); // Paper - decompile fix return (T)(object == null ? this.g : object); } @@ -127,7 +127,7 @@ public class DataPaletteBlock implements DataPaletteExpandable { long[] along = nbttagcompound.o(s1); int jx = along.length * 64 / 4096; if (this.h == this.b) { - DataPaletteHash datapalettehash = new DataPaletteHash(this.d, ix, this.c, this.e, this.f); + DataPaletteHash datapalettehash = new DataPaletteHash(this.d, ix, this.c, this.e, this.f); // Paper - decompile fix datapalettehash.a(nbttaglist); DataBits databits = new DataBits(ix, 4096, along); diff --git a/src/main/java/net/minecraft/server/DedicatedPlayerList.java b/src/main/java/net/minecraft/server/DedicatedPlayerList.java index 5eded6dc2..11f9642e6 100644 --- a/src/main/java/net/minecraft/server/DedicatedPlayerList.java +++ b/src/main/java/net/minecraft/server/DedicatedPlayerList.java @@ -136,7 +136,7 @@ public class DedicatedPlayerList extends PlayerList { } // $FF: synthetic method - public MinecraftServer getServer() { + public MinecraftServer getMinecraftServer() { // Paper - decompile fix return this.getServer(); } } diff --git a/src/main/java/net/minecraft/server/DefinedStructure.java b/src/main/java/net/minecraft/server/DefinedStructure.java index 8bfa218a6..e2e60d3ed 100644 --- a/src/main/java/net/minecraft/server/DefinedStructure.java +++ b/src/main/java/net/minecraft/server/DefinedStructure.java @@ -77,7 +77,7 @@ public class DefinedStructure { } private void a(World world, BlockPosition blockposition, BlockPosition blockposition1) { - List list = world.a(Entity.class, new AxisAlignedBB(blockposition, blockposition1), (entity1) -> { + List list = world.a(Entity.class, new AxisAlignedBB(blockposition, blockposition1),(java.util.function.Predicate) (entity1) -> { // Paper - decompile fix return !(entity1 instanceof EntityHuman); }); this.b.clear(); @@ -145,12 +145,12 @@ public class DefinedStructure { if (this.a.isEmpty()) { return false; } else { - List list = definedstructureinfo.a(this.a, blockposition); + List list = definedstructureinfo.a(this.a, blockposition); // Paper - decompile fix if ((!list.isEmpty() || !definedstructureinfo.h() && !this.b.isEmpty()) && this.c.getX() >= 1 && this.c.getY() >= 1 && this.c.getZ() >= 1) { Block block = definedstructureinfo.i(); StructureBoundingBox structureboundingbox = definedstructureinfo.j(); - ArrayList arraylist = Lists.newArrayListWithCapacity(definedstructureinfo.m() ? list.size() : 0); - ArrayList arraylist1 = Lists.newArrayListWithCapacity(list.size()); + ArrayList arraylist = Lists.newArrayListWithCapacity(definedstructureinfo.m() ? list.size() : 0); // Paper - decompile fix + ArrayList arraylist1 = Lists.newArrayListWithCapacity(list.size()); // Paper - decompile fix int j = Integer.MAX_VALUE; int k = Integer.MAX_VALUE; int l = Integer.MAX_VALUE; @@ -427,7 +427,7 @@ public class DefinedStructure { nbttagcompound.set("blocks", new NBTTagList()); nbttagcompound.set("palette", new NBTTagList()); } else { - ArrayList arraylist = Lists.newArrayList(); + ArrayList arraylist = Lists.newArrayList(); // Paper - decompile fix DefinedStructure.a definedstructure$a = new DefinedStructure.a(); arraylist.add(definedstructure$a); diff --git a/src/main/java/net/minecraft/server/EnchantmentManager.java b/src/main/java/net/minecraft/server/EnchantmentManager.java index 6695f8d77..e1ea8da88 100644 --- a/src/main/java/net/minecraft/server/EnchantmentManager.java +++ b/src/main/java/net/minecraft/server/EnchantmentManager.java @@ -51,7 +51,7 @@ public class EnchantmentManager { public static void a(Map map, ItemStack itemstack) { NBTTagList nbttaglist = new NBTTagList(); - for(Entry entry : map.entrySet()) { + for(Entry entry : map.entrySet()) { // Paper - decompile fix Enchantment enchantment = (Enchantment)entry.getKey(); if (enchantment != null) { int i = entry.getValue(); @@ -146,7 +146,7 @@ public class EnchantmentManager { } public static int a(Enchantment enchantment, EntityLiving entityliving) { - List list = enchantment.a(entityliving); + List list = enchantment.a(entityliving); // Paper - decompile fix if (list == null) { return 0; } else { @@ -224,7 +224,7 @@ public class EnchantmentManager { } public static ItemStack b(Enchantment enchantment, EntityLiving entityliving) { - List list = enchantment.a(entityliving); + List list = enchantment.a(entityliving);// Paper - decompile fix if (list.isEmpty()) { return ItemStack.a; } else { @@ -260,7 +260,7 @@ public class EnchantmentManager { } public static ItemStack a(Random random, ItemStack itemstack, int i, boolean flag) { - List list = b(random, itemstack, i, flag); + List list = b(random, itemstack, i, flag); // Paper - decompile fix boolean flag1 = itemstack.getItem() == Items.BOOK; if (flag1) { itemstack = new ItemStack(Items.ENCHANTED_BOOK); @@ -328,7 +328,7 @@ public class EnchantmentManager { } public static List a(int i, ItemStack itemstack, boolean flag) { - ArrayList arraylist = Lists.newArrayList(); + ArrayList arraylist = Lists.newArrayList(); Item item = itemstack.getItem(); boolean flag1 = itemstack.getItem() == Items.BOOK; diff --git a/src/main/java/net/minecraft/server/EntityDragonFireball.java b/src/main/java/net/minecraft/server/EntityDragonFireball.java index 04cff50cb..e746a6a0d 100644 --- a/src/main/java/net/minecraft/server/EntityDragonFireball.java +++ b/src/main/java/net/minecraft/server/EntityDragonFireball.java @@ -14,7 +14,7 @@ public class EntityDragonFireball extends EntityFireball { protected void a(MovingObjectPosition movingobjectposition) { if (movingobjectposition.entity == null || !movingobjectposition.entity.s(this.shooter)) { if (!this.world.isClientSide) { - List list = this.world.a(EntityLiving.class, this.getBoundingBox().grow(4.0D, 2.0D, 4.0D)); + List list = this.world.a(EntityLiving.class, this.getBoundingBox().grow(4.0D, 2.0D, 4.0D)); // Paper - decompile fix EntityAreaEffectCloud entityareaeffectcloud = new EntityAreaEffectCloud(this.world, this.locX, this.locY, this.locZ); entityareaeffectcloud.setSource(this.shooter); entityareaeffectcloud.setParticle(Particles.j); diff --git a/src/main/java/net/minecraft/server/EntityLlama.java b/src/main/java/net/minecraft/server/EntityLlama.java index 4dee04581..9c48bb3c9 100644 --- a/src/main/java/net/minecraft/server/EntityLlama.java +++ b/src/main/java/net/minecraft/server/EntityLlama.java @@ -371,11 +371,6 @@ public class EntityLlama extends EntityHorseChestedAbstract implements IRangedEn public void s(boolean var1) { } - // $FF: synthetic method - public EntityAgeable createChild(EntityAgeable entityageable) { - return this.createChild(entityageable); - } - static class a extends PathfinderGoalNearestAttackableTarget { public a(EntityLlama entityllama) { super(entityllama, EntityWolf.class, 16, false, true, (Predicate)null); diff --git a/src/main/java/net/minecraft/server/EnumDirection.java b/src/main/java/net/minecraft/server/EnumDirection.java index 23ca6fc50..44c91ba26 100644 --- a/src/main/java/net/minecraft/server/EnumDirection.java +++ b/src/main/java/net/minecraft/server/EnumDirection.java @@ -232,10 +232,6 @@ public enum EnumDirection implements INamable { return d0; } - // $FF: synthetic method - public boolean test(@Nullable Object object) { - return super.test((EnumDirection)object); - } }, Y("y") { public int a(int var1, int i, int var3) { @@ -246,10 +242,6 @@ public enum EnumDirection implements INamable { return d0; } - // $FF: synthetic method - public boolean test(@Nullable Object object) { - return super.test((EnumDirection)object); - } }, Z("z") { public int a(int var1, int var2, int i) { @@ -260,10 +252,6 @@ public enum EnumDirection implements INamable { return d0; } - // $FF: synthetic method - public boolean test(@Nullable Object object) { - return super.test((EnumDirection)object); - } }; private static final Map d = (Map)Arrays.stream(values()).collect(Collectors.toMap(EnumDirection.EnumAxis::a, (enumdirection$enumaxis) -> { @@ -315,10 +303,6 @@ public enum EnumDirection implements INamable { public abstract double a(double var1, double var3, double var5); - // $FF: synthetic method - public boolean test(@Nullable Object object) { - return this.test((EnumDirection)object); - } } public static enum EnumAxisDirection { @@ -366,9 +350,5 @@ public enum EnumDirection implements INamable { return Iterators.forArray(this.c); } - // $FF: synthetic method - public boolean test(@Nullable Object object) { - return this.test((EnumDirection)object); - } } } diff --git a/src/main/java/net/minecraft/server/IChatBaseComponent.java b/src/main/java/net/minecraft/server/IChatBaseComponent.java index 0e0571a6c..8fc45c697 100644 --- a/src/main/java/net/minecraft/server/IChatBaseComponent.java +++ b/src/main/java/net/minecraft/server/IChatBaseComponent.java @@ -389,14 +389,5 @@ public interface IChatBaseComponent extends Message, Iterable entry : jsonobject.entrySet()) {// Paper - Decompile fix String s = b.matcher(ChatDeserializer.a((JsonElement)entry.getValue(), (String)entry.getKey())).replaceAll("%$1s"); this.d.put(entry.getKey(), s); } diff --git a/src/main/java/net/minecraft/server/LootSelectorEntry.java b/src/main/java/net/minecraft/server/LootSelectorEntry.java index 252b0f3ed..86df2b969 100644 --- a/src/main/java/net/minecraft/server/LootSelectorEntry.java +++ b/src/main/java/net/minecraft/server/LootSelectorEntry.java @@ -82,14 +82,5 @@ public abstract class LootSelectorEntry { return jsonobject; } - // $FF: synthetic method - public JsonElement serialize(Object object, Type type, JsonSerializationContext jsonserializationcontext) { - return this.serialize((LootSelectorEntry)object, type, jsonserializationcontext); - } - - // $FF: synthetic method - public Object deserialize(JsonElement jsonelement, Type type, JsonDeserializationContext jsondeserializationcontext) throws JsonParseException { - return this.deserialize(jsonelement, type, jsondeserializationcontext); - } } } diff --git a/src/main/java/net/minecraft/server/NBTBase.java b/src/main/java/net/minecraft/server/NBTBase.java index 48d04b540..de9168a9c 100644 --- a/src/main/java/net/minecraft/server/NBTBase.java +++ b/src/main/java/net/minecraft/server/NBTBase.java @@ -87,7 +87,7 @@ public interface NBTBase { } } - NBTBase clone(); + public NBTBase clone(); // Paper - decompile fix default String asString() { return this.toString(); diff --git a/src/main/java/net/minecraft/server/NBTList.java b/src/main/java/net/minecraft/server/NBTList.java index 456b5f492..54f2935c0 100644 --- a/src/main/java/net/minecraft/server/NBTList.java +++ b/src/main/java/net/minecraft/server/NBTList.java @@ -25,6 +25,7 @@ public abstract class NBTList extends AbstractList impleme public abstract void b(int var1); // $FF: synthetic method + /* // Paper start- Decompile fix public Object set(int i, Object object) { return this.set(i, (NBTBase)object); } @@ -32,5 +33,9 @@ public abstract class NBTList extends AbstractList impleme // $FF: synthetic method public Object get(int i) { return this.get(i); - } + }*/ + + @Override + public abstract NBTBase clone(); + // Paper end- Decompile fix } diff --git a/src/main/java/net/minecraft/server/NBTTagByteArray.java b/src/main/java/net/minecraft/server/NBTTagByteArray.java index 973f28cc5..21a6f488a 100644 --- a/src/main/java/net/minecraft/server/NBTTagByteArray.java +++ b/src/main/java/net/minecraft/server/NBTTagByteArray.java @@ -66,7 +66,8 @@ public class NBTTagByteArray extends NBTList { return stringbuilder.append(']').toString(); } - public NBTBase clone() { + @Override + public NBTTagByteArray clone() { // Paper - decompile fix byte[] abyte = new byte[this.data.length]; System.arraycopy(this.data, 0, abyte, 0, this.data.length); diff --git a/src/main/java/net/minecraft/server/NBTTagList.java b/src/main/java/net/minecraft/server/NBTTagList.java index 8e6cce15f..1b72df8cd 100644 --- a/src/main/java/net/minecraft/server/NBTTagList.java +++ b/src/main/java/net/minecraft/server/NBTTagList.java @@ -12,7 +12,7 @@ import org.apache.logging.log4j.Logger; public class NBTTagList extends NBTList { private static final Logger f = LogManager.getLogger(); - private List list = Lists.newArrayList(); + public List list = Lists.newArrayList(); // Paper private byte type = 0; public NBTTagList() { @@ -281,11 +281,7 @@ public class NBTTagList extends NBTList { return this.type; } - // $FF: synthetic method - public NBTBase clone() { - return this.clone(); - } - + /* // Paper start - Decompile fix // $FF: synthetic method public Object remove(int i) { return this.remove(i); @@ -305,4 +301,5 @@ public class NBTTagList extends NBTList { public boolean add(Object object) { return this.add((NBTBase)object); } + */ // Paper end - Decompile fix } diff --git a/src/main/java/net/minecraft/server/PacketEncoder.java b/src/main/java/net/minecraft/server/PacketEncoder.java index a717ad95f..ff7e20dfc 100644 --- a/src/main/java/net/minecraft/server/PacketEncoder.java +++ b/src/main/java/net/minecraft/server/PacketEncoder.java @@ -48,8 +48,4 @@ public class PacketEncoder extends MessageToByteEncoder> { } } - // $FF: synthetic method - protected void encode(ChannelHandlerContext channelhandlercontext, Object object, ByteBuf bytebuf) throws Exception { - this.encode(channelhandlercontext, (Packet)object, bytebuf); - } } diff --git a/src/main/java/net/minecraft/server/ProtoChunk.java b/src/main/java/net/minecraft/server/ProtoChunk.java index 8bc7c0ccd..faaad0f41 100644 --- a/src/main/java/net/minecraft/server/ProtoChunk.java +++ b/src/main/java/net/minecraft/server/ProtoChunk.java @@ -483,14 +483,4 @@ public class ProtoChunk implements IChunkAccess { public void b(boolean flag) { this.u = flag; } - - // $FF: synthetic method - public TickList l() { - return this.l(); - } - - // $FF: synthetic method - public TickList k() { - return this.k(); - } } diff --git a/src/main/java/net/minecraft/server/Registry.java b/src/main/java/net/minecraft/server/Registry.java index 5be9f0ff2..9efec49d6 100644 --- a/src/main/java/net/minecraft/server/Registry.java +++ b/src/main/java/net/minecraft/server/Registry.java @@ -1,4 +1,8 @@ package net.minecraft.server; -public interface Registry extends Iterable { +import java.util.Iterator; +public interface Registry extends Iterable { // Paper - decompile fix + + @Override + Iterator iterator(); // Paper - decompile fix } diff --git a/src/main/java/net/minecraft/server/RegistryBlockID.java b/src/main/java/net/minecraft/server/RegistryBlockID.java index 8d1f9237a..a21006290 100644 --- a/src/main/java/net/minecraft/server/RegistryBlockID.java +++ b/src/main/java/net/minecraft/server/RegistryBlockID.java @@ -26,7 +26,7 @@ public class RegistryBlockID implements Registry { this.b.put(object, i); while(this.c.size() <= i) { - this.c.add((Object)null); + this.c.add(null); // Paper - decompile fix } this.c.set(i, object); diff --git a/src/main/java/net/minecraft/server/RegistryID.java b/src/main/java/net/minecraft/server/RegistryID.java index 03c603362..d03ac0e70 100644 --- a/src/main/java/net/minecraft/server/RegistryID.java +++ b/src/main/java/net/minecraft/server/RegistryID.java @@ -49,7 +49,7 @@ public class RegistryID implements Registry { } private void d(int i) { - Object[] aobject = this.b; + K[] aobject = this.b; // Paper - decompile fix int[] aint = this.c; this.b = (K[])(new Object[i]); this.c = new int[i]; diff --git a/src/main/java/net/minecraft/server/ServerPing.java b/src/main/java/net/minecraft/server/ServerPing.java index 364dadfbd..c338d09bf 100644 --- a/src/main/java/net/minecraft/server/ServerPing.java +++ b/src/main/java/net/minecraft/server/ServerPing.java @@ -100,15 +100,6 @@ public class ServerPing { return jsonobject; } - // $FF: synthetic method - public JsonElement serialize(Object object, Type type, JsonSerializationContext jsonserializationcontext) { - return this.serialize((ServerPing)object, type, jsonserializationcontext); - } - - // $FF: synthetic method - public Object deserialize(JsonElement jsonelement, Type type, JsonDeserializationContext jsondeserializationcontext) throws JsonParseException { - return this.deserialize(jsonelement, type, jsondeserializationcontext); - } } public static class ServerData { @@ -144,15 +135,6 @@ public class ServerPing { return jsonobject; } - // $FF: synthetic method - public JsonElement serialize(Object object, Type type, JsonSerializationContext jsonserializationcontext) { - return this.serialize((ServerPing.ServerData)object, type, jsonserializationcontext); - } - - // $FF: synthetic method - public Object deserialize(JsonElement jsonelement, Type type, JsonDeserializationContext jsondeserializationcontext) throws JsonParseException { - return this.deserialize(jsonelement, type, jsondeserializationcontext); - } } } @@ -228,15 +210,6 @@ public class ServerPing { return jsonobject; } - // $FF: synthetic method - public JsonElement serialize(Object object, Type type, JsonSerializationContext jsonserializationcontext) { - return this.serialize((ServerPing.ServerPingPlayerSample)object, type, jsonserializationcontext); - } - - // $FF: synthetic method - public Object deserialize(JsonElement jsonelement, Type type, JsonDeserializationContext jsondeserializationcontext) throws JsonParseException { - return this.deserialize(jsonelement, type, jsondeserializationcontext); - } } } } diff --git a/src/main/java/net/minecraft/server/ShapeDetector.java b/src/main/java/net/minecraft/server/ShapeDetector.java index 475bf35fa..78234cbdd 100644 --- a/src/main/java/net/minecraft/server/ShapeDetector.java +++ b/src/main/java/net/minecraft/server/ShapeDetector.java @@ -106,10 +106,6 @@ public class ShapeDetector { return new ShapeDetectorBlock(this.a, blockposition, this.b); } - // $FF: synthetic method - public Object load(Object object) throws Exception { - return this.load((BlockPosition)object); - } } public static class ShapeDetectorCollection { diff --git a/src/main/java/net/minecraft/server/WorldPersistentData.java b/src/main/java/net/minecraft/server/WorldPersistentData.java index c1bbacfc1..f0a826cd1 100644 --- a/src/main/java/net/minecraft/server/WorldPersistentData.java +++ b/src/main/java/net/minecraft/server/WorldPersistentData.java @@ -7,6 +7,7 @@ import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; import it.unimi.dsi.fastutil.objects.ObjectIterator; import it.unimi.dsi.fastutil.objects.Object2IntMap.Entry; import java.io.DataInputStream; +import java.io.DataOutput; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; @@ -98,7 +99,7 @@ public class WorldPersistentData { } DataOutputStream dataoutputstream = new DataOutputStream(new FileOutputStream(file1)); - NBTCompressedStreamTools.a(nbttagcompound, dataoutputstream); + NBTCompressedStreamTools.a(nbttagcompound, (DataOutput) dataoutputstream); // Paper - decompile fix dataoutputstream.close(); } } catch (Exception exception) { -- 2.20.0