@NotNull
  public static List<MergeWordFragment> compare(@NotNull CharSequence text1,
                                                @NotNull CharSequence text2,
                                                @NotNull CharSequence text3,
                                                @NotNull ComparisonPolicy policy,
                                                @NotNull CancellationChecker indicator) {
    indicator.checkCanceled();

    List<InlineChunk> words1 = getInlineChunks(text1);
    List<InlineChunk> words2 = getInlineChunks(text2);
    List<InlineChunk> words3 = getInlineChunks(text3);

    FairDiffIterable wordChanges1 = diff(words2, words1, indicator);
    wordChanges1 = optimizeWordChunks(text2, text1, words2, words1, wordChanges1, indicator);
    FairDiffIterable iterable1 = matchAdjustmentDelimiters(text2, text1, words2, words1, wordChanges1, indicator);

    FairDiffIterable wordChanges2 = diff(words2, words3, indicator);
    wordChanges2 = optimizeWordChunks(text2, text3, words2, words3, wordChanges2, indicator);
    FairDiffIterable iterable2 = matchAdjustmentDelimiters(text2, text3, words2, words3, wordChanges2, indicator);

    List<MergeRange> wordConflicts = ComparisonMergeUtil.buildSimple(iterable1, iterable2, indicator);
    List<MergeRange> result = matchAdjustmentWhitespaces(text1, text2, text3, wordConflicts, policy, indicator);

    return convertIntoMergeWordFragments(result);
  }
@NotNull
  public static List<MergeWordFragment> compare(@NotNull CharSequence text1,
                                                @NotNull CharSequence text2,
                                                @NotNull CharSequence text3,
                                                @NotNull ComparisonPolicy policy,
                                                @NotNull CancellationChecker indicator)