content: package org.aion.avm.tooling.deploy.eliminator;
  
  import java.util.ArrayList;
  import java.util.HashMap;
  import java.util.Map;
  
  public class WhitelistPopulator {
  
      // This method populates the given classInfoMap with hardcoded information about those methods and classes
      // on the JCL whitelist that we allow users to override / implement.
  
      // We might want to source this information from AvmDetails instead of hardcoding it.
  
      public static Map<String, ClassInfo> getWhitelistedClassInfos() {
          Map<String, ClassInfo> classInfoMap = new HashMap<>();
          Map<String, MethodInfo> methodDependencies;
          String methodName;
  
          String comparableName = "java/lang/Comparable";
          methodDependencies = new HashMap<>();
          methodName = "compareTo(Ljava/lang/Object;)I";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          ClassInfo comparableInfo = new ClassInfo(comparableName, true, false, methodDependencies, new ArrayList<>());
  
          String iterableName = "java/lang/Iterable";
          methodDependencies = new HashMap<>();
          methodName = "iterator()Ljava/util/Iterator;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "forEach(Ljava/util/function/Consumer;)V";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "spliterator()Ljava/util/Spliterator;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          ClassInfo iterableInfo = new ClassInfo(iterableName, true, false, methodDependencies, new ArrayList<>());
  
          String runnableName = "java/lang/Runnable";
          methodDependencies = new HashMap<>();
          methodName = "run()V";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          ClassInfo runnableInfo = new ClassInfo(runnableName, true, false, methodDependencies, new ArrayList<>());
  
          String collectionName = "java/util/Collection";
          methodDependencies = new HashMap<>();
          methodName = "removeAll(Ljava/util/Collection;)Z";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "retainAll(Ljava/util/Collection;)Z";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "toArray([Ljava/lang/Object;)[Ljava/lang/Object;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "hashCode()I";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "toArray()[Ljava/lang/Object;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "spliterator()Ljava/util/Spliterator;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "contains(Ljava/lang/Object;)Z";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "iterator()Ljava/util/Iterator;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "containsAll(Ljava/util/Collection;)Z";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "parallelStream()Ljava/util/stream/Stream;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "removeIf(Ljava/util/function/Predicate;)Z";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "add(Ljava/lang/Object;)Z";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "equals(Ljava/lang/Object;)Z";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "remove(Ljava/lang/Object;)Z";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "size()I";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "isEmpty()Z";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "stream()Ljava/util/stream/Stream;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "addAll(Ljava/util/Collection;)Z";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "clear()V";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          ClassInfo collectionInfo = new ClassInfo(collectionName, true, false, methodDependencies, new ArrayList<>());
  
          String setName = "java/util/Set";
          methodDependencies = new HashMap<>();
          methodName = "removeAll(Ljava/util/Collection;)Z";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "toArray([Ljava/lang/Object;)[Ljava/lang/Object;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "of([Ljava/lang/Object;)Ljava/util/Set;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Set;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "containsAll(Ljava/util/Collection;)Z";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "add(Ljava/lang/Object;)Z";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "clear()V";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "equals(Ljava/lang/Object;)Z";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "of(Ljava/lang/Object;)Ljava/util/Set;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "remove(Ljava/lang/Object;)Z";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Set;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "isEmpty()Z";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Set;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Set;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "of(Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Set;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "retainAll(Ljava/util/Collection;)Z";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "hashCode()I";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "toArray()[Ljava/lang/Object;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "copyOf(Ljava/util/Collection;)Ljava/util/Set;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "spliterator()Ljava/util/Spliterator;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "contains(Ljava/lang/Object;)Z";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "iterator()Ljava/util/Iterator;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Set;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Set;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Set;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Set;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "size()I";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "addAll(Ljava/util/Collection;)Z";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "of()Ljava/util/Set;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          ClassInfo setInfo = new ClassInfo(setName, true, false, methodDependencies, new ArrayList<>());
  
          String throwableName = "java/lang/Throwable";
          methodDependencies = new HashMap<>();
          methodName = "getOurStackTrace()[Ljava/lang/StackTraceElement;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "getCause()Ljava/lang/Throwable;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "addSuppressed(Ljava/lang/Throwable;)V";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "printStackTrace()V";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "printStackTrace(Ljava/lang/Throwable$PrintStreamOrWriter;)V";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "getLocalizedMessage()Ljava/lang/String;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "printStackTrace(Ljava/io/PrintStream;)V";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "fillInStackTrace()Ljava/lang/Throwable;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "<init>(Ljava/lang/Throwable;)V";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "getMessage()Ljava/lang/String;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "readObject(Ljava/io/ObjectInputStream;)V";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "printEnclosedStackTrace(Ljava/lang/Throwable$PrintStreamOrWriter;[Ljava/lang/StackTraceElement;Ljava/lang/String;Ljava/lang/String;Ljava/util/Set;)V";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "<init>(Ljava/lang/String;Ljava/lang/Throwable;)V";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "getStackTrace()[Ljava/lang/StackTraceElement;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "printStackTrace(Ljava/io/PrintWriter;)V";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "setStackTrace([Ljava/lang/StackTraceElement;)V";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "getSuppressed()[Ljava/lang/Throwable;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "initCause(Ljava/lang/Throwable;)Ljava/lang/Throwable;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "<init>(Ljava/lang/String;)V";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "<init>(Ljava/lang/String;Ljava/lang/Throwable;ZZ)V";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "toString()Ljava/lang/String;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "<clinit>()V";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "<init>()V";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "writeObject(Ljava/io/ObjectOutputStream;)V";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "fillInStackTrace(I)Ljava/lang/Throwable;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          ClassInfo throwableInfo = new ClassInfo(throwableName, false, false, methodDependencies, new ArrayList<>());
  
          String exceptionName = "java/lang/Exception";
          methodDependencies = new HashMap<>();
          methodName = "<init>(Ljava/lang/String;)V";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "<init>(Ljava/lang/String;Ljava/lang/Throwable;ZZ)V";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "<init>(Ljava/lang/String;Ljava/lang/Throwable;)V";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "<init>()V";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "<init>(Ljava/lang/Throwable;)V";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          ClassInfo exceptionInfo = new ClassInfo(exceptionName, false, false, methodDependencies, new ArrayList<>());
  
          String iteratorName = "java/util/Iterator";
          methodDependencies = new HashMap<>();
          methodName = "hasNext()Z";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "next()Ljava/lang/Object;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "forEachRemaining(Ljava/util/function/Consumer;)V";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "remove()V";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          ClassInfo iteratorInfo = new ClassInfo(iteratorName, true, false, methodDependencies, new ArrayList<>());
  
          String functionName = "java/util/function/Function";
          methodDependencies = new HashMap<>();
          methodName = "apply(Ljava/lang/Object;)Ljava/lang/Object;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "lambda$andThen$1(Ljava/util/function/Function;Ljava/lang/Object;)Ljava/lang/Object;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "identity()Ljava/util/function/Function;";
          methodDependencies.put(methodName, new MethodInfo(methodName, true));
          methodName = "compose(Ljava/util/function/Function;)Ljava/util/function/Function;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "andThen(Ljava/util/function/Function;)Ljava/util/function/Function;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "lambda$identity$2(Ljava/lang/Object;)Ljava/lang/Object;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "lambda$compose$0(Ljava/util/function/Function;Ljava/lang/Object;)Ljava/lang/Object;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          ClassInfo functionInfo = new ClassInfo(functionName, true, false, methodDependencies, new ArrayList<>());
  
          String mapEntryName = "java/util/Map$Entry";
          methodDependencies = new HashMap<>();
          methodName = "hashCode()I";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "$deserializeLambda$(Ljava/lang/invoke/SerializedLambda;)Ljava/lang/Object;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "comparingByKey(Ljava/util/Comparator;)Ljava/util/Comparator;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "getValue()Ljava/lang/Object;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "comparingByValue()Ljava/util/Comparator;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "lambda$comparingByValue$827a17d5$1(Ljava/util/Comparator;Ljava/util/Map$Entry;Ljava/util/Map$Entry;)I";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "lambda$comparingByKey$bbdbfea9$1(Ljava/util/Map$Entry;Ljava/util/Map$Entry;)I";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "getKey()Ljava/lang/Object;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "lambda$comparingByKey$6d558cbf$1(Ljava/util/Comparator;Ljava/util/Map$Entry;Ljava/util/Map$Entry;)I";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "lambda$comparingByValue$1065357e$1(Ljava/util/Map$Entry;Ljava/util/Map$Entry;)I";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "equals(Ljava/lang/Object;)Z";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "comparingByValue(Ljava/util/Comparator;)Ljava/util/Comparator;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "comparingByKey()Ljava/util/Comparator;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "setValue(Ljava/lang/Object;)Ljava/lang/Object;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          ClassInfo mapEntryInfo = new ClassInfo(mapEntryName, true, false, methodDependencies, new ArrayList<>());
  
          String enumName = "java/lang/Enum";
          methodDependencies = new HashMap<>();
          methodName = "hashCode()I";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "readObject(Ljava/io/ObjectInputStream;)V";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "ordinal()I";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "compareTo(Ljava/lang/Enum;)I";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "getDeclaringClass()Ljava/lang/Class;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "clone()Ljava/lang/Object;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "compareTo(Ljava/lang/Object;)I";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "equals(Ljava/lang/Object;)Z";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "name()Ljava/lang/String;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "toString()Ljava/lang/String;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "valueOf(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum;";
          methodDependencies.put(methodName, new MethodInfo(methodName, true));
          methodName = "finalize()V";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "readObjectNoData()V";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "<init>(Ljava/lang/String;I)V";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          ClassInfo enumInfo = new ClassInfo(enumName, false, true, methodDependencies, new ArrayList<>());
  
          String mapName = "java/util/Map";
          methodDependencies = new HashMap<>();
          methodName = "putAll(Ljava/util/Map;)V";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "replace(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Z";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Map;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "containsKey(Ljava/lang/Object;)Z";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Map;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "getOrDefault(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "computeIfAbsent(Ljava/lang/Object;Ljava/util/function/Function;)Ljava/lang/Object;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "merge(Ljava/lang/Object;Ljava/lang/Object;Ljava/util/function/BiFunction;)Ljava/lang/Object;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "get(Ljava/lang/Object;)Ljava/lang/Object;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "clear()V";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "computeIfPresent(Ljava/lang/Object;Ljava/util/function/BiFunction;)Ljava/lang/Object;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "equals(Ljava/lang/Object;)Z";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "putIfAbsent(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "isEmpty()Z";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "compute(Ljava/lang/Object;Ljava/util/function/BiFunction;)Ljava/lang/Object;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "remove(Ljava/lang/Object;Ljava/lang/Object;)Z";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Map;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "copyOf(Ljava/util/Map;)Ljava/util/Map;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "remove(Ljava/lang/Object;)Ljava/lang/Object;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "hashCode()I";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Map;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Map;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "keySet()Ljava/util/Set;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "forEach(Ljava/util/function/BiConsumer;)V";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "of(Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Map;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "containsValue(Ljava/lang/Object;)Z";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "replaceAll(Ljava/util/function/BiFunction;)V";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Map;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "ofEntries([Ljava/util/Map$Entry;)Ljava/util/Map;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Map;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Map;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "replace(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Map;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "entry(Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Map$Entry;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "size()I";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "values()Ljava/util/Collection;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "of()Ljava/util/Map;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "entrySet()Ljava/util/Set;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          ClassInfo mapInfo = new ClassInfo(mapName, true, false, methodDependencies, new ArrayList<>());
  
          String charSequenceName = "java/lang/CharSequence";
          methodDependencies = new HashMap<>();
          methodName = "subSequence(II)Ljava/lang/CharSequence;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "toString()Ljava/lang/String;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "charAt(I)C";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "length()I";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "lambda$codePoints$1()Ljava/util/Spliterator$OfInt;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "lambda$chars$0()Ljava/util/Spliterator$OfInt;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "chars()Ljava/util/stream/IntStream;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "codePoints()Ljava/util/stream/IntStream;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          ClassInfo charSequenceInfo = new ClassInfo(charSequenceName, true, false, methodDependencies, new ArrayList<>());
  
          String objectName = "java/lang/Object";
          methodDependencies = new HashMap<>();
          methodName = "registerNatives()V";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "hashCode()I";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "getClass()Ljava/lang/Class;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "wait(JI)V";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "clone()Ljava/lang/Object;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "wait()V";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "wait(J)V";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "notify()V";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "notifyAll()V";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "equals(Ljava/lang/Object;)Z";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "toString()Ljava/lang/String;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "<clinit>()V";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "<init>()V";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "finalize()V";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          ClassInfo objectInfo = new ClassInfo(objectName, false, false, methodDependencies, new ArrayList<>());
  
          String listIteratorName = "java/util/ListIterator";
          methodDependencies = new HashMap<>();
          methodName = "set(Ljava/lang/Object;)V";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "previousIndex()I";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "nextIndex()I";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "add(Ljava/lang/Object;)V";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "hasNext()Z";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "next()Ljava/lang/Object;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "previous()Ljava/lang/Object;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "hasPrevious()Z";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "remove()V";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          ClassInfo listIteratorInfo = new ClassInfo(listIteratorName, true, false, methodDependencies, new ArrayList<>());
  
          String serializableName = "java/lang/Serializable";
          methodDependencies = new HashMap<>();
          ClassInfo serializableInfo = new ClassInfo(serializableName, true, false, methodDependencies, new ArrayList<>());
  
          String runtimeExceptionName = "java/lang/RuntimeException";
          methodDependencies = new HashMap<>();
          methodName = "<init>()V";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "<init>(Ljava/lang/String;)V";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "<init>(Ljava/lang/String;Ljava/lang/Throwable;)V";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "<init>(Ljava/lang/Throwable;)V";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "<init>(Ljava/lang/String;Ljava/lang/Throwable;ZZ)V";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          ClassInfo runtimeExceptionInfo = new ClassInfo(runtimeExceptionName, false, false, methodDependencies, new ArrayList<>());
  
          String listName = "java/util/List";
          methodDependencies = new HashMap<>();
          methodName = "removeAll(Ljava/util/Collection;)Z";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "toArray([Ljava/lang/Object;)[Ljava/lang/Object;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "remove(I)Ljava/lang/Object;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/List;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "containsAll(Ljava/util/Collection;)Z";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/List;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "lastIndexOf(Ljava/lang/Object;)I";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "subList(II)Ljava/util/List;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "of(Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/List;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "add(Ljava/lang/Object;)Z";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "clear()V";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "equals(Ljava/lang/Object;)Z";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "add(ILjava/lang/Object;)V";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/List;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/List;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "remove(Ljava/lang/Object;)Z";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "isEmpty()Z";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "replaceAll(Ljava/util/function/UnaryOperator;)V";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "of()Ljava/util/List;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "set(ILjava/lang/Object;)Ljava/lang/Object;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "addAll(ILjava/util/Collection;)Z";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "retainAll(Ljava/util/Collection;)Z";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "hashCode()I";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "copyOf(Ljava/util/Collection;)Ljava/util/List;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "toArray()[Ljava/lang/Object;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "sort(Ljava/util/Comparator;)V";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/List;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/List;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "spliterator()Ljava/util/Spliterator;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "contains(Ljava/lang/Object;)Z";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "iterator()Ljava/util/Iterator;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "listIterator(I)Ljava/util/ListIterator;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "indexOf(Ljava/lang/Object;)I";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "listIterator()Ljava/util/ListIterator;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "get(I)Ljava/lang/Object;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/List;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "size()I";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "of(Ljava/lang/Object;)Ljava/util/List;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "addAll(Ljava/util/Collection;)Z";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "of([Ljava/lang/Object;)Ljava/util/List;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          methodName = "of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/List;";
          methodDependencies.put(methodName, new MethodInfo(methodName, false));
          ClassInfo listInfo = new ClassInfo(listName, true, false, methodDependencies, new ArrayList<>());
  
          // Set the inheritance relationships between these classes
  
          collectionInfo.addToParents(iterableInfo);
          setInfo.addToParents(collectionInfo);
          throwableInfo.addToParents(serializableInfo);
          exceptionInfo.setSuperclass(throwableInfo);
          enumInfo.addToParents(comparableInfo);
          enumInfo.addToParents(serializableInfo);
          listIteratorInfo.addToParents(iteratorInfo);
          runtimeExceptionInfo.setSuperclass(exceptionInfo);
          listInfo.addToParents(collectionInfo);
  
          // Put them in the classInfoMap
  
          classInfoMap.put(comparableName, comparableInfo);
          classInfoMap.put(iterableName, iterableInfo);
          classInfoMap.put(runnableName, runnableInfo);
          classInfoMap.put(collectionName, collectionInfo);
          classInfoMap.put(setName, setInfo);
  
          classInfoMap.put(throwableName, throwableInfo);
          classInfoMap.put(exceptionName, exceptionInfo);
          classInfoMap.put(iteratorName, iteratorInfo);
          classInfoMap.put(functionName, functionInfo);
          classInfoMap.put(mapEntryName, mapEntryInfo);
  
          classInfoMap.put(enumName, enumInfo);
          classInfoMap.put(mapName, mapInfo);
          classInfoMap.put(charSequenceName, charSequenceInfo);
          classInfoMap.put(objectName, objectInfo);
          classInfoMap.put(listIteratorName, listIteratorInfo);
  
          classInfoMap.put(serializableName, serializableInfo);
          classInfoMap.put(runtimeExceptionName, runtimeExceptionInfo);
          classInfoMap.put(listName, listInfo);
  
          return classInfoMap;
      }
  }
  