@Nullable
  public static Change buildChanges(int @NotNull [] array1, int @NotNull [] array2) throws FilesTooBigForDiffException {
    final int startShift = getStartShift(array1, array2);
    final int endCut = getEndCut(array1, array2, startShift);

    Ref<Change> changeRef = doBuildChangesFast(array1.length, array2.length, startShift, endCut);
    if (changeRef != null) return changeRef.get();

    boolean copyArray = startShift != 0 || endCut != 0;
    int[] ints1 = copyArray ? Arrays.copyOfRange(array1, startShift, array1.length - endCut) : array1;
    int[] ints2 = copyArray ? Arrays.copyOfRange(array2, startShift, array2.length - endCut) : array2;
    return doBuildChanges(ints1, ints2, new ChangeBuilder(startShift));
  }
@Nullable
  public static Change buildChanges(int @NotNull [] array1, int @NotNull [] array2)