private void execute(int start1, int count1, int start2, int count2, int thresholdCheckCounter) throws FilesTooBigForDiffException {
    if (count1 == 0 && count2 == 0) {
      return;
    }

    if (count1 == 0 || count2 == 0) {
      addChange(start1, count1, start2, count2);
      return;
    }

    int startOffset = matchForward(start1, count1, start2, count2);
    start1 += startOffset;
    start2 += startOffset;
    count1 -= startOffset;
    count2 -= startOffset;

    int endOffset = matchBackward(start1, count1, start2, count2);
    count1 -= endOffset;
    count2 -= endOffset;

    if (count1 == 0 || count2 == 0) {
      addChange(start1, count1, start2, count2);
    }
    else {
      if (thresholdCheckCounter == 0) checkReduction(count1, count2);
      thresholdCheckCounter = Math.max(-1, thresholdCheckCounter - 1);

      UniqueLCS uniqueLCS = new UniqueLCS(myFirst, mySecond, start1, count1, start2, count2);
      int[][] matching = uniqueLCS.execute();

      if (matching == null) {
        if (thresholdCheckCounter >= 0) checkReduction(count1, count2);
        MyersLCS intLCS = new MyersLCS(myFirst, mySecond, start1, count1, start2, count2, myChanges1, myChanges2);
        intLCS.executeLinear();
      }
      else {
        int s1, s2, c1, c2;
        int matched = matching[0].length;
        assert matched > 0;

        c1 = matching[0][0];
        c2 = matching[1][0];

        execute(start1, c1, start2, c2, thresholdCheckCounter);

        for (int i = 1; i < matching[0].length; i++) {
          s1 = matching[0][i - 1] + 1;
          s2 = matching[1][i - 1] + 1;

          c1 = matching[0][i] - s1;
          c2 = matching[1][i] - s2;

          if (c1 > 0 || c2 > 0) {
            execute(start1 + s1, c1, start2 + s2, c2, thresholdCheckCounter);
          }
        }

        if (matching[0][matched - 1] == count1 - 1) {
          s1 = count1 - 1;
          c1 = 0;
        }
        else {
          s1 = matching[0][matched - 1] + 1;
          c1 = count1 - s1;
        }
        if (matching[1][matched - 1] == count2 - 1) {
          s2 = count2 - 1;
          c2 = 0;
        }
        else {
          s2 = matching[1][matched - 1] + 1;
          c2 = count2 - s2;
        }

        execute(start1 + s1, c1, start2 + s2, c2, thresholdCheckCounter);
      }
    }
  }
private void execute(int start1, int count1, int start2, int count2, int thresholdCheckCounter)