@NotNull
    public List<MergeRange> execute(@NotNull FairDiffIterable fragments1,
                                    @NotNull FairDiffIterable fragments2) {
      PeekableIterator<Range> unchanged1 = new PeekableIteratorWrapper<>(fragments1.unchanged());
      PeekableIterator<Range> unchanged2 = new PeekableIteratorWrapper<>(fragments2.unchanged());

      while (unchanged1.hasNext() && unchanged2.hasNext()) {
        Side side = add(unchanged1.peek(), unchanged2.peek());
        side.select(unchanged1, unchanged2).next();
      }

      return myChangesBuilder.finish(fragments1.getLength2(), fragments1.getLength1(), fragments2.getLength2());
    }
@NotNull
    public List<MergeRange> execute(@NotNull FairDiffIterable fragments1,
                                    @NotNull FairDiffIterable fragments2)