monaco-editor-core 0.54.0-dev-20250919 → 0.54.0-dev-20250921

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. package/esm/nls.messages.de.js +1 -1
  2. package/esm/nls.messages.es.js +1 -1
  3. package/esm/nls.messages.fr.js +1 -1
  4. package/esm/nls.messages.it.js +1 -1
  5. package/esm/nls.messages.ja.js +1 -1
  6. package/esm/nls.messages.ko.js +1 -1
  7. package/esm/nls.messages.ru.js +1 -1
  8. package/esm/nls.messages.zh-cn.js +1 -1
  9. package/esm/nls.messages.zh-tw.js +1 -1
  10. package/esm/vs/editor/browser/widget/diffEditor/components/diffEditorViewZones/diffEditorViewZones.js +8 -8
  11. package/esm/vs/editor/browser/widget/diffEditor/components/diffEditorViewZones/diffEditorViewZones.js.map +1 -1
  12. package/esm/vs/editor/browser/widget/diffEditor/diffEditorViewModel.js +3 -3
  13. package/esm/vs/editor/browser/widget/diffEditor/diffEditorViewModel.js.map +1 -1
  14. package/esm/vs/editor/browser/widget/diffEditor/diffEditorWidget.js +1 -1
  15. package/esm/vs/editor/browser/widget/diffEditor/diffEditorWidget.js.map +1 -1
  16. package/esm/vs/editor/browser/widget/diffEditor/features/gutterFeature.js +1 -1
  17. package/esm/vs/editor/browser/widget/diffEditor/features/gutterFeature.js.map +1 -1
  18. package/esm/vs/editor/browser/widget/diffEditor/features/movedBlocksLinesFeature.js +1 -1
  19. package/esm/vs/editor/browser/widget/diffEditor/features/movedBlocksLinesFeature.js.map +1 -1
  20. package/esm/vs/editor/common/core/ranges/lineRange.js.map +1 -1
  21. package/esm/vs/editor/contrib/inlineCompletions/browser/controller/inlineCompletionsController.js +8 -8
  22. package/esm/vs/editor/contrib/inlineCompletions/browser/controller/inlineCompletionsController.js.map +1 -1
  23. package/esm/vs/editor/contrib/inlineCompletions/browser/model/inlineCompletionsModel.js +5 -5
  24. package/esm/vs/editor/contrib/inlineCompletions/browser/model/inlineCompletionsModel.js.map +1 -1
  25. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/components/gutterIndicatorView.js +1 -1
  26. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/components/gutterIndicatorView.js.map +1 -1
  27. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViewProducer.js +2 -2
  28. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViewProducer.js.map +1 -1
  29. package/esm/vs/editor/contrib/middleScroll/browser/middleScrollController.js +3 -3
  30. package/esm/vs/editor/contrib/middleScroll/browser/middleScrollController.js.map +1 -1
  31. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"sources":["file:///mnt/vss/_work/1/s/dependencies/vscode/out-editor-src/vs/editor/browser/widget/diffEditor/diffEditorViewModel.ts","vs/editor/browser/widget/diffEditor/diffEditorViewModel.ts"],"names":[],"mappings":"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","file":"diffEditorViewModel.js","sourceRoot":"file:///mnt/vss/_work/1/s/dependencies/vscode/out-editor-src","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { RunOnceScheduler } from '../../../../base/common/async.js';\nimport { CancellationTokenSource } from '../../../../base/common/cancellation.js';\nimport { Disposable, toDisposable } from '../../../../base/common/lifecycle.js';\nimport { IObservable, IReader, ISettableObservable, ITransaction, autorun, autorunWithStore, derived, observableSignal, observableSignalFromEvent, observableValue, transaction, waitForState } from '../../../../base/common/observable.js';\nimport { IDiffProviderFactoryService } from './diffProviderFactoryService.js';\nimport { filterWithPrevious } from './utils.js';\nimport { readHotReloadableExport } from '../../../../base/common/hotReloadHelpers.js';\nimport { ISerializedLineRange, LineRange, LineRangeSet } from '../../../common/core/ranges/lineRange.js';\nimport { DefaultLinesDiffComputer } from '../../../common/diff/defaultLinesDiffComputer/defaultLinesDiffComputer.js';\nimport { IDocumentDiff } from '../../../common/diff/documentDiffProvider.js';\nimport { MovedText } from '../../../common/diff/linesDiffComputer.js';\nimport { DetailedLineRangeMapping, LineRangeMapping, RangeMapping } from '../../../common/diff/rangeMapping.js';\nimport { IDiffEditorModel, IDiffEditorViewModel } from '../../../common/editorCommon.js';\nimport { ITextModel } from '../../../common/model.js';\nimport { TextEditInfo } from '../../../common/model/bracketPairsTextModelPart/bracketPairsTree/beforeEditPositionMapper.js';\nimport { combineTextEditInfos } from '../../../common/model/bracketPairsTextModelPart/bracketPairsTree/combineTextEditInfos.js';\nimport { DiffEditorOptions } from './diffEditorOptions.js';\nimport { optimizeSequenceDiffs } from '../../../common/diff/defaultLinesDiffComputer/heuristicSequenceOptimizations.js';\nimport { isDefined } from '../../../../base/common/types.js';\nimport { groupAdjacentBy } from '../../../../base/common/arrays.js';\nimport { softAssert } from '../../../../base/common/assert.js';\n\nexport class DiffEditorViewModel extends Disposable implements IDiffEditorViewModel {\n\tprivate readonly _isDiffUpToDate = observableValue<boolean>(this, false);\n\tpublic readonly isDiffUpToDate: IObservable<boolean> = this._isDiffUpToDate;\n\n\tprivate _lastDiff: IDocumentDiff | undefined;\n\tprivate readonly _diff = observableValue<DiffState | undefined>(this, undefined);\n\tpublic readonly diff: IObservable<DiffState | undefined> = this._diff;\n\n\tprivate readonly _unchangedRegions = observableValue<{ regions: UnchangedRegion[]; originalDecorationIds: string[]; modifiedDecorationIds: string[] } | undefined>(this, undefined);\n\tpublic readonly unchangedRegions: IObservable<UnchangedRegion[]> = derived(this, r => {\n\t\tif (this._options.hideUnchangedRegions.read(r)) {\n\t\t\treturn this._unchangedRegions.read(r)?.regions ?? [];\n\t\t} else {\n\t\t\t// Reset state\n\t\t\ttransaction(tx => {\n\t\t\t\tfor (const r of this._unchangedRegions.get()?.regions || []) {\n\t\t\t\t\tr.collapseAll(tx);\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn [];\n\t\t}\n\t}\n\t);\n\n\tpublic readonly movedTextToCompare = observableValue<MovedText | undefined>(this, undefined);\n\n\tprivate readonly _activeMovedText = observableValue<MovedText | undefined>(this, undefined);\n\tprivate readonly _hoveredMovedText = observableValue<MovedText | undefined>(this, undefined);\n\n\n\tpublic readonly activeMovedText = derived(this, r => this.movedTextToCompare.read(r) ?? this._hoveredMovedText.read(r) ?? this._activeMovedText.read(r));\n\n\tpublic setActiveMovedText(movedText: MovedText | undefined): void {\n\t\tthis._activeMovedText.set(movedText, undefined);\n\t}\n\n\tprivate readonly _cancellationTokenSource = new CancellationTokenSource();\n\n\tprivate readonly _diffProvider = derived(this, reader => {\n\t\tconst diffProvider = this._diffProviderFactoryService.createDiffProvider({\n\t\t\tdiffAlgorithm: this._options.diffAlgorithm.read(reader)\n\t\t});\n\t\tconst onChangeSignal = observableSignalFromEvent('onDidChange', diffProvider.onDidChange);\n\t\treturn {\n\t\t\tdiffProvider,\n\t\t\tonChangeSignal,\n\t\t};\n\t});\n\n\tconstructor(\n\t\tpublic readonly model: IDiffEditorModel,\n\t\tprivate readonly _options: DiffEditorOptions,\n\t\t@IDiffProviderFactoryService private readonly _diffProviderFactoryService: IDiffProviderFactoryService,\n\t) {\n\t\tsuper();\n\n\t\tthis._register(toDisposable(() => this._cancellationTokenSource.cancel()));\n\n\t\tconst contentChangedSignal = observableSignal('contentChangedSignal');\n\t\tconst debouncer = this._register(new RunOnceScheduler(() => contentChangedSignal.trigger(undefined), 200));\n\n\t\tthis._register(autorun(reader => {\n\t\t\t/** @description collapse touching unchanged ranges */\n\n\t\t\tconst lastUnchangedRegions = this._unchangedRegions.read(reader);\n\t\t\tif (!lastUnchangedRegions || lastUnchangedRegions.regions.some(r => r.isDragged.read(reader))) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst lastUnchangedRegionsOrigRanges = lastUnchangedRegions.originalDecorationIds\n\t\t\t\t.map(id => model.original.getDecorationRange(id))\n\t\t\t\t.map(r => r ? LineRange.fromRangeInclusive(r) : undefined);\n\t\t\tconst lastUnchangedRegionsModRanges = lastUnchangedRegions.modifiedDecorationIds\n\t\t\t\t.map(id => model.modified.getDecorationRange(id))\n\t\t\t\t.map(r => r ? LineRange.fromRangeInclusive(r) : undefined);\n\t\t\tconst updatedLastUnchangedRegions = lastUnchangedRegions.regions.map((r, idx) =>\n\t\t\t\t(!lastUnchangedRegionsOrigRanges[idx] || !lastUnchangedRegionsModRanges[idx]) ? undefined :\n\t\t\t\t\tnew UnchangedRegion(\n\t\t\t\t\t\tlastUnchangedRegionsOrigRanges[idx]!.startLineNumber,\n\t\t\t\t\t\tlastUnchangedRegionsModRanges[idx]!.startLineNumber,\n\t\t\t\t\t\tlastUnchangedRegionsOrigRanges[idx]!.length,\n\t\t\t\t\t\tr.visibleLineCountTop.read(reader),\n\t\t\t\t\t\tr.visibleLineCountBottom.read(reader),\n\t\t\t\t\t)).filter(isDefined);\n\n\t\t\tconst newRanges: UnchangedRegion[] = [];\n\n\t\t\tlet didChange = false;\n\t\t\tfor (const touching of groupAdjacentBy(updatedLastUnchangedRegions, (a, b) => a.getHiddenModifiedRange(reader).endLineNumberExclusive === b.getHiddenModifiedRange(reader).startLineNumber)) {\n\t\t\t\tif (touching.length > 1) {\n\t\t\t\t\tdidChange = true;\n\t\t\t\t\tconst sumLineCount = touching.reduce((sum, r) => sum + r.lineCount, 0);\n\t\t\t\t\tconst r = new UnchangedRegion(touching[0].originalLineNumber, touching[0].modifiedLineNumber, sumLineCount, touching[0].visibleLineCountTop.get(), touching[touching.length - 1].visibleLineCountBottom.get());\n\t\t\t\t\tnewRanges.push(r);\n\t\t\t\t} else {\n\t\t\t\t\tnewRanges.push(touching[0]);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (didChange) {\n\t\t\t\tconst originalDecorationIds = model.original.deltaDecorations(\n\t\t\t\t\tlastUnchangedRegions.originalDecorationIds,\n\t\t\t\t\tnewRanges.map(r => ({ range: r.originalUnchangedRange.toInclusiveRange()!, options: { description: 'unchanged' } }))\n\t\t\t\t);\n\t\t\t\tconst modifiedDecorationIds = model.modified.deltaDecorations(\n\t\t\t\t\tlastUnchangedRegions.modifiedDecorationIds,\n\t\t\t\t\tnewRanges.map(r => ({ range: r.modifiedUnchangedRange.toInclusiveRange()!, options: { description: 'unchanged' } }))\n\t\t\t\t);\n\n\t\t\t\ttransaction(tx => {\n\t\t\t\t\tthis._unchangedRegions.set(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tregions: newRanges,\n\t\t\t\t\t\t\toriginalDecorationIds,\n\t\t\t\t\t\t\tmodifiedDecorationIds\n\t\t\t\t\t\t},\n\t\t\t\t\t\ttx\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t}\n\t\t}));\n\n\t\tconst updateUnchangedRegions = (result: IDocumentDiff, tx: ITransaction, reader?: IReader) => {\n\t\t\tconst newUnchangedRegions = UnchangedRegion.fromDiffs(\n\t\t\t\tresult.changes,\n\t\t\t\tmodel.original.getLineCount(),\n\t\t\t\tmodel.modified.getLineCount(),\n\t\t\t\tthis._options.hideUnchangedRegionsMinimumLineCount.read(reader),\n\t\t\t\tthis._options.hideUnchangedRegionsContextLineCount.read(reader),\n\t\t\t);\n\n\t\t\t// Transfer state from cur state\n\t\t\tlet visibleRegions: LineRangeMapping[] | undefined = undefined;\n\n\t\t\tconst lastUnchangedRegions = this._unchangedRegions.get();\n\t\t\tif (lastUnchangedRegions) {\n\t\t\t\tconst lastUnchangedRegionsOrigRanges = lastUnchangedRegions.originalDecorationIds\n\t\t\t\t\t.map(id => model.original.getDecorationRange(id))\n\t\t\t\t\t.map(r => r ? LineRange.fromRangeInclusive(r) : undefined);\n\t\t\t\tconst lastUnchangedRegionsModRanges = lastUnchangedRegions.modifiedDecorationIds\n\t\t\t\t\t.map(id => model.modified.getDecorationRange(id))\n\t\t\t\t\t.map(r => r ? LineRange.fromRangeInclusive(r) : undefined);\n\t\t\t\tconst updatedLastUnchangedRegions = filterWithPrevious(\n\t\t\t\t\tlastUnchangedRegions.regions\n\t\t\t\t\t\t.map((r, idx) => {\n\t\t\t\t\t\t\tif (!lastUnchangedRegionsOrigRanges[idx] || !lastUnchangedRegionsModRanges[idx]) { return undefined; }\n\t\t\t\t\t\t\tconst length = lastUnchangedRegionsOrigRanges[idx]!.length;\n\t\t\t\t\t\t\treturn new UnchangedRegion(\n\t\t\t\t\t\t\t\tlastUnchangedRegionsOrigRanges[idx]!.startLineNumber,\n\t\t\t\t\t\t\t\tlastUnchangedRegionsModRanges[idx]!.startLineNumber,\n\t\t\t\t\t\t\t\tlength,\n\t\t\t\t\t\t\t\t// The visible area can shrink by edits -> we have to account for this\n\t\t\t\t\t\t\t\tMath.min(r.visibleLineCountTop.get(), length),\n\t\t\t\t\t\t\t\tMath.min(r.visibleLineCountBottom.get(), length - r.visibleLineCountTop.get()),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\t).filter(isDefined),\n\t\t\t\t\t(cur, prev) => !prev || (cur.modifiedLineNumber >= prev.modifiedLineNumber + prev.lineCount && cur.originalLineNumber >= prev.originalLineNumber + prev.lineCount)\n\t\t\t\t);\n\n\t\t\t\tlet hiddenRegions = updatedLastUnchangedRegions.map(r => new LineRangeMapping(r.getHiddenOriginalRange(reader), r.getHiddenModifiedRange(reader)));\n\t\t\t\thiddenRegions = LineRangeMapping.clip(hiddenRegions, LineRange.ofLength(1, model.original.getLineCount()), LineRange.ofLength(1, model.modified.getLineCount()));\n\t\t\t\tvisibleRegions = LineRangeMapping.inverse(hiddenRegions, model.original.getLineCount(), model.modified.getLineCount());\n\t\t\t}\n\n\t\t\tconst newUnchangedRegions2 = [];\n\t\t\tif (visibleRegions) {\n\t\t\t\tfor (const r of newUnchangedRegions) {\n\t\t\t\t\tconst intersecting = visibleRegions.filter(f => f.original.intersectsStrict(r.originalUnchangedRange) && f.modified.intersectsStrict(r.modifiedUnchangedRange));\n\t\t\t\t\tnewUnchangedRegions2.push(...r.setVisibleRanges(intersecting, tx));\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tnewUnchangedRegions2.push(...newUnchangedRegions);\n\t\t\t}\n\n\t\t\tconst originalDecorationIds = model.original.deltaDecorations(\n\t\t\t\tlastUnchangedRegions?.originalDecorationIds || [],\n\t\t\t\tnewUnchangedRegions2.map(r => ({ range: r.originalUnchangedRange.toInclusiveRange()!, options: { description: 'unchanged' } }))\n\t\t\t);\n\t\t\tconst modifiedDecorationIds = model.modified.deltaDecorations(\n\t\t\t\tlastUnchangedRegions?.modifiedDecorationIds || [],\n\t\t\t\tnewUnchangedRegions2.map(r => ({ range: r.modifiedUnchangedRange.toInclusiveRange()!, options: { description: 'unchanged' } }))\n\t\t\t);\n\n\t\t\tthis._unchangedRegions.set(\n\t\t\t\t{\n\t\t\t\t\tregions: newUnchangedRegions2,\n\t\t\t\t\toriginalDecorationIds,\n\t\t\t\t\tmodifiedDecorationIds\n\t\t\t\t},\n\t\t\t\ttx\n\t\t\t);\n\t\t};\n\n\t\tthis._register(model.modified.onDidChangeContent((e) => {\n\t\t\tconst diff = this._diff.get();\n\t\t\tif (diff) {\n\t\t\t\tconst textEdits = TextEditInfo.fromModelContentChanges(e.changes);\n\t\t\t\tconst result = applyModifiedEdits(this._lastDiff!, textEdits, model.original, model.modified);\n\t\t\t\tif (result) {\n\t\t\t\t\tthis._lastDiff = result;\n\t\t\t\t\ttransaction(tx => {\n\t\t\t\t\t\tthis._diff.set(DiffState.fromDiffResult(this._lastDiff!), tx);\n\t\t\t\t\t\tupdateUnchangedRegions(result, tx);\n\t\t\t\t\t\tconst currentSyncedMovedText = this.movedTextToCompare.get();\n\t\t\t\t\t\tthis.movedTextToCompare.set(currentSyncedMovedText ? this._lastDiff!.moves.find(m => m.lineRangeMapping.modified.intersect(currentSyncedMovedText.lineRangeMapping.modified)) : undefined, tx);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis._isDiffUpToDate.set(false, undefined);\n\t\t\tdebouncer.schedule();\n\t\t}));\n\t\tthis._register(model.original.onDidChangeContent((e) => {\n\t\t\tconst diff = this._diff.get();\n\t\t\tif (diff) {\n\t\t\t\tconst textEdits = TextEditInfo.fromModelContentChanges(e.changes);\n\t\t\t\tconst result = applyOriginalEdits(this._lastDiff!, textEdits, model.original, model.modified);\n\t\t\t\tif (result) {\n\t\t\t\t\tthis._lastDiff = result;\n\t\t\t\t\ttransaction(tx => {\n\t\t\t\t\t\tthis._diff.set(DiffState.fromDiffResult(this._lastDiff!), tx);\n\t\t\t\t\t\tupdateUnchangedRegions(result, tx);\n\t\t\t\t\t\tconst currentSyncedMovedText = this.movedTextToCompare.get();\n\t\t\t\t\t\tthis.movedTextToCompare.set(currentSyncedMovedText ? this._lastDiff!.moves.find(m => m.lineRangeMapping.modified.intersect(currentSyncedMovedText.lineRangeMapping.modified)) : undefined, tx);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis._isDiffUpToDate.set(false, undefined);\n\t\t\tdebouncer.schedule();\n\t\t}));\n\n\t\tthis._register(autorunWithStore(async (reader, store) => {\n\t\t\t/** @description compute diff */\n\n\t\t\t// So that they get recomputed when these settings change\n\t\t\tthis._options.hideUnchangedRegionsMinimumLineCount.read(reader);\n\t\t\tthis._options.hideUnchangedRegionsContextLineCount.read(reader);\n\n\t\t\tdebouncer.cancel();\n\t\t\tcontentChangedSignal.read(reader);\n\t\t\tconst documentDiffProvider = this._diffProvider.read(reader);\n\t\t\tdocumentDiffProvider.onChangeSignal.read(reader);\n\n\t\t\treadHotReloadableExport(DefaultLinesDiffComputer, reader);\n\t\t\treadHotReloadableExport(optimizeSequenceDiffs, reader);\n\n\t\t\tthis._isDiffUpToDate.set(false, undefined);\n\n\t\t\tlet originalTextEditInfos: TextEditInfo[] = [];\n\t\t\tstore.add(model.original.onDidChangeContent((e) => {\n\t\t\t\tconst edits = TextEditInfo.fromModelContentChanges(e.changes);\n\t\t\t\toriginalTextEditInfos = combineTextEditInfos(originalTextEditInfos, edits);\n\t\t\t}));\n\n\t\t\tlet modifiedTextEditInfos: TextEditInfo[] = [];\n\t\t\tstore.add(model.modified.onDidChangeContent((e) => {\n\t\t\t\tconst edits = TextEditInfo.fromModelContentChanges(e.changes);\n\t\t\t\tmodifiedTextEditInfos = combineTextEditInfos(modifiedTextEditInfos, edits);\n\t\t\t}));\n\n\t\t\tlet result = await documentDiffProvider.diffProvider.computeDiff(model.original, model.modified, {\n\t\t\t\tignoreTrimWhitespace: this._options.ignoreTrimWhitespace.read(reader),\n\t\t\t\tmaxComputationTimeMs: this._options.maxComputationTimeMs.read(reader),\n\t\t\t\tcomputeMoves: this._options.showMoves.read(reader),\n\t\t\t}, this._cancellationTokenSource.token);\n\n\t\t\tif (this._cancellationTokenSource.token.isCancellationRequested) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (model.original.isDisposed() || model.modified.isDisposed()) {\n\t\t\t\t// TODO@hediet fishy?\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tresult = normalizeDocumentDiff(result, model.original, model.modified);\n\t\t\tresult = applyOriginalEdits(result, originalTextEditInfos, model.original, model.modified) ?? result;\n\t\t\tresult = applyModifiedEdits(result, modifiedTextEditInfos, model.original, model.modified) ?? result;\n\n\t\t\ttransaction(tx => {\n\t\t\t\t/** @description write diff result */\n\t\t\t\tupdateUnchangedRegions(result, tx);\n\n\t\t\t\tthis._lastDiff = result;\n\t\t\t\tconst state = DiffState.fromDiffResult(result);\n\t\t\t\tthis._diff.set(state, tx);\n\t\t\t\tthis._isDiffUpToDate.set(true, tx);\n\t\t\t\tconst currentSyncedMovedText = this.movedTextToCompare.get();\n\t\t\t\tthis.movedTextToCompare.set(currentSyncedMovedText ? this._lastDiff.moves.find(m => m.lineRangeMapping.modified.intersect(currentSyncedMovedText.lineRangeMapping.modified)) : undefined, tx);\n\t\t\t});\n\t\t}));\n\t}\n\n\tpublic ensureModifiedLineIsVisible(lineNumber: number, preference: RevealPreference, tx: ITransaction | undefined): void {\n\t\tif (this.diff.get()?.mappings.length === 0) {\n\t\t\treturn;\n\t\t}\n\t\tconst unchangedRegions = this._unchangedRegions.get()?.regions || [];\n\t\tfor (const r of unchangedRegions) {\n\t\t\tif (r.getHiddenModifiedRange(undefined).contains(lineNumber)) {\n\t\t\t\tr.showModifiedLine(lineNumber, preference, tx);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic ensureOriginalLineIsVisible(lineNumber: number, preference: RevealPreference, tx: ITransaction | undefined): void {\n\t\tif (this.diff.get()?.mappings.length === 0) {\n\t\t\treturn;\n\t\t}\n\t\tconst unchangedRegions = this._unchangedRegions.get()?.regions || [];\n\t\tfor (const r of unchangedRegions) {\n\t\t\tif (r.getHiddenOriginalRange(undefined).contains(lineNumber)) {\n\t\t\t\tr.showOriginalLine(lineNumber, preference, tx);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic async waitForDiff(): Promise<void> {\n\t\tawait waitForState(this.isDiffUpToDate, s => s);\n\t}\n\n\tpublic serializeState(): SerializedState {\n\t\tconst regions = this._unchangedRegions.get();\n\t\treturn {\n\t\t\tcollapsedRegions: regions?.regions.map(r => ({ range: r.getHiddenModifiedRange(undefined).serialize() }))\n\t\t};\n\t}\n\n\tpublic restoreSerializedState(state: SerializedState): void {\n\t\tconst ranges = state.collapsedRegions?.map(r => LineRange.deserialize(r.range));\n\t\tconst regions = this._unchangedRegions.get();\n\t\tif (!regions || !ranges) {\n\t\t\treturn;\n\t\t}\n\t\ttransaction(tx => {\n\t\t\tfor (const r of regions.regions) {\n\t\t\t\tfor (const range of ranges) {\n\t\t\t\t\tif (r.modifiedUnchangedRange.intersect(range)) {\n\t\t\t\t\t\tr.setHiddenModifiedRange(range, tx);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n}\n\nfunction normalizeDocumentDiff(diff: IDocumentDiff, original: ITextModel, modified: ITextModel): IDocumentDiff {\n\treturn {\n\t\tchanges: diff.changes.map(c => new DetailedLineRangeMapping(\n\t\t\tc.original,\n\t\t\tc.modified,\n\t\t\tc.innerChanges ? c.innerChanges.map(i => normalizeRangeMapping(i, original, modified)) : undefined\n\t\t)),\n\t\tmoves: diff.moves,\n\t\tidentical: diff.identical,\n\t\tquitEarly: diff.quitEarly,\n\t};\n}\n\nfunction normalizeRangeMapping(rangeMapping: RangeMapping, original: ITextModel, modified: ITextModel): RangeMapping {\n\tlet originalRange = rangeMapping.originalRange;\n\tlet modifiedRange = rangeMapping.modifiedRange;\n\tif (\n\t\toriginalRange.startColumn === 1 && modifiedRange.startColumn === 1 &&\n\t\t(originalRange.endColumn !== 1 || modifiedRange.endColumn !== 1) &&\n\t\toriginalRange.endColumn === original.getLineMaxColumn(originalRange.endLineNumber)\n\t\t&& modifiedRange.endColumn === modified.getLineMaxColumn(modifiedRange.endLineNumber)\n\t\t&& originalRange.endLineNumber < original.getLineCount()\n\t\t&& modifiedRange.endLineNumber < modified.getLineCount()\n\t) {\n\t\toriginalRange = originalRange.setEndPosition(originalRange.endLineNumber + 1, 1);\n\t\tmodifiedRange = modifiedRange.setEndPosition(modifiedRange.endLineNumber + 1, 1);\n\t}\n\treturn new RangeMapping(originalRange, modifiedRange);\n}\n\ninterface SerializedState {\n\tcollapsedRegions: { range: ISerializedLineRange }[] | undefined;\n}\n\nexport class DiffState {\n\tpublic static fromDiffResult(result: IDocumentDiff): DiffState {\n\t\treturn new DiffState(\n\t\t\tresult.changes.map(c => new DiffMapping(c)),\n\t\t\tresult.moves || [],\n\t\t\tresult.identical,\n\t\t\tresult.quitEarly,\n\t\t);\n\t}\n\n\tconstructor(\n\t\tpublic readonly mappings: readonly DiffMapping[],\n\t\tpublic readonly movedTexts: readonly MovedText[],\n\t\tpublic readonly identical: boolean,\n\t\tpublic readonly quitEarly: boolean,\n\t) { }\n}\n\nexport class DiffMapping {\n\tconstructor(\n\t\treadonly lineRangeMapping: DetailedLineRangeMapping,\n\t) {\n\t\t/*\n\t\treadonly movedTo: MovedText | undefined,\n\t\treadonly movedFrom: MovedText | undefined,\n\n\t\tif (movedTo) {\n\t\t\tassertFn(() =>\n\t\t\t\tmovedTo.lineRangeMapping.modifiedRange.equals(lineRangeMapping.modifiedRange)\n\t\t\t\t&& lineRangeMapping.originalRange.isEmpty\n\t\t\t\t&& !movedFrom\n\t\t\t);\n\t\t} else if (movedFrom) {\n\t\t\tassertFn(() =>\n\t\t\t\tmovedFrom.lineRangeMapping.originalRange.equals(lineRangeMapping.originalRange)\n\t\t\t\t&& lineRangeMapping.modifiedRange.isEmpty\n\t\t\t\t&& !movedTo\n\t\t\t);\n\t\t}\n\t\t*/\n\t}\n}\n\nexport class UnchangedRegion {\n\tpublic static fromDiffs(\n\t\tchanges: readonly DetailedLineRangeMapping[],\n\t\toriginalLineCount: number,\n\t\tmodifiedLineCount: number,\n\t\tminHiddenLineCount: number,\n\t\tminContext: number,\n\t): UnchangedRegion[] {\n\t\tconst inversedMappings = DetailedLineRangeMapping.inverse(changes, originalLineCount, modifiedLineCount);\n\t\tconst result: UnchangedRegion[] = [];\n\n\t\tfor (const mapping of inversedMappings) {\n\t\t\tlet origStart = mapping.original.startLineNumber;\n\t\t\tlet modStart = mapping.modified.startLineNumber;\n\t\t\tlet length = mapping.original.length;\n\n\t\t\tconst atStart = origStart === 1 && modStart === 1;\n\t\t\tconst atEnd = origStart + length === originalLineCount + 1 && modStart + length === modifiedLineCount + 1;\n\n\t\t\tif ((atStart || atEnd) && length >= minContext + minHiddenLineCount) {\n\t\t\t\tif (atStart && !atEnd) {\n\t\t\t\t\tlength -= minContext;\n\t\t\t\t}\n\t\t\t\tif (atEnd && !atStart) {\n\t\t\t\t\torigStart += minContext;\n\t\t\t\t\tmodStart += minContext;\n\t\t\t\t\tlength -= minContext;\n\t\t\t\t}\n\t\t\t\tresult.push(new UnchangedRegion(origStart, modStart, length, 0, 0));\n\t\t\t} else if (length >= minContext * 2 + minHiddenLineCount) {\n\t\t\t\torigStart += minContext;\n\t\t\t\tmodStart += minContext;\n\t\t\t\tlength -= minContext * 2;\n\t\t\t\tresult.push(new UnchangedRegion(origStart, modStart, length, 0, 0));\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t}\n\n\tpublic get originalUnchangedRange(): LineRange {\n\t\treturn LineRange.ofLength(this.originalLineNumber, this.lineCount);\n\t}\n\n\tpublic get modifiedUnchangedRange(): LineRange {\n\t\treturn LineRange.ofLength(this.modifiedLineNumber, this.lineCount);\n\t}\n\n\tprivate readonly _visibleLineCountTop = observableValue<number>(this, 0);\n\tpublic readonly visibleLineCountTop: ISettableObservable<number> = this._visibleLineCountTop;\n\n\tprivate readonly _visibleLineCountBottom = observableValue<number>(this, 0);\n\tpublic readonly visibleLineCountBottom: ISettableObservable<number> = this._visibleLineCountBottom;\n\n\tprivate readonly _shouldHideControls = derived(this, reader => /** @description isVisible */\n\t\tthis.visibleLineCountTop.read(reader) + this.visibleLineCountBottom.read(reader) === this.lineCount && !this.isDragged.read(reader));\n\n\tpublic readonly isDragged = observableValue<undefined | 'bottom' | 'top'>(this, undefined);\n\n\tconstructor(\n\t\tpublic readonly originalLineNumber: number,\n\t\tpublic readonly modifiedLineNumber: number,\n\t\tpublic readonly lineCount: number,\n\t\tvisibleLineCountTop: number,\n\t\tvisibleLineCountBottom: number,\n\t) {\n\t\tconst visibleLineCountTop2 = Math.max(Math.min(visibleLineCountTop, this.lineCount), 0);\n\t\tconst visibleLineCountBottom2 = Math.max(Math.min(visibleLineCountBottom, this.lineCount - visibleLineCountTop), 0);\n\n\t\tsoftAssert(visibleLineCountTop === visibleLineCountTop2);\n\t\tsoftAssert(visibleLineCountBottom === visibleLineCountBottom2);\n\n\t\tthis._visibleLineCountTop.set(visibleLineCountTop2, undefined);\n\t\tthis._visibleLineCountBottom.set(visibleLineCountBottom2, undefined);\n\t}\n\n\tpublic setVisibleRanges(visibleRanges: LineRangeMapping[], tx: ITransaction): UnchangedRegion[] {\n\t\tconst result: UnchangedRegion[] = [];\n\n\t\tconst hiddenModified = new LineRangeSet(visibleRanges.map(r => r.modified)).subtractFrom(this.modifiedUnchangedRange);\n\n\t\tlet originalStartLineNumber = this.originalLineNumber;\n\t\tlet modifiedStartLineNumber = this.modifiedLineNumber;\n\t\tconst modifiedEndLineNumberEx = this.modifiedLineNumber + this.lineCount;\n\t\tif (hiddenModified.ranges.length === 0) {\n\t\t\tthis.showAll(tx);\n\t\t\tresult.push(this);\n\t\t} else {\n\t\t\tlet i = 0;\n\t\t\tfor (const r of hiddenModified.ranges) {\n\t\t\t\tconst isLast = i === hiddenModified.ranges.length - 1;\n\t\t\t\ti++;\n\n\t\t\t\tconst length = (isLast ? modifiedEndLineNumberEx : r.endLineNumberExclusive) - modifiedStartLineNumber;\n\n\t\t\t\tconst newR = new UnchangedRegion(originalStartLineNumber, modifiedStartLineNumber, length, 0, 0);\n\t\t\t\tnewR.setHiddenModifiedRange(r, tx);\n\t\t\t\tresult.push(newR);\n\n\t\t\t\toriginalStartLineNumber = newR.originalUnchangedRange.endLineNumberExclusive;\n\t\t\t\tmodifiedStartLineNumber = newR.modifiedUnchangedRange.endLineNumberExclusive;\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t}\n\n\tpublic shouldHideControls(reader: IReader | undefined): boolean {\n\t\treturn this._shouldHideControls.read(reader);\n\t}\n\n\tpublic getHiddenOriginalRange(reader: IReader | undefined): LineRange {\n\t\treturn LineRange.ofLength(\n\t\t\tthis.originalLineNumber + this._visibleLineCountTop.read(reader),\n\t\t\tthis.lineCount - this._visibleLineCountTop.read(reader) - this._visibleLineCountBottom.read(reader),\n\t\t);\n\t}\n\n\tpublic getHiddenModifiedRange(reader: IReader | undefined): LineRange {\n\t\treturn LineRange.ofLength(\n\t\t\tthis.modifiedLineNumber + this._visibleLineCountTop.read(reader),\n\t\t\tthis.lineCount - this._visibleLineCountTop.read(reader) - this._visibleLineCountBottom.read(reader),\n\t\t);\n\t}\n\n\tpublic setHiddenModifiedRange(range: LineRange, tx: ITransaction) {\n\t\tconst visibleLineCountTop = range.startLineNumber - this.modifiedLineNumber;\n\t\tconst visibleLineCountBottom = (this.modifiedLineNumber + this.lineCount) - range.endLineNumberExclusive;\n\t\tthis.setState(visibleLineCountTop, visibleLineCountBottom, tx);\n\t}\n\n\tpublic getMaxVisibleLineCountTop() {\n\t\treturn this.lineCount - this._visibleLineCountBottom.get();\n\t}\n\n\tpublic getMaxVisibleLineCountBottom() {\n\t\treturn this.lineCount - this._visibleLineCountTop.get();\n\t}\n\n\tpublic showMoreAbove(count = 10, tx: ITransaction | undefined): void {\n\t\tconst maxVisibleLineCountTop = this.getMaxVisibleLineCountTop();\n\t\tthis._visibleLineCountTop.set(Math.min(this._visibleLineCountTop.get() + count, maxVisibleLineCountTop), tx);\n\t}\n\n\tpublic showMoreBelow(count = 10, tx: ITransaction | undefined): void {\n\t\tconst maxVisibleLineCountBottom = this.lineCount - this._visibleLineCountTop.get();\n\t\tthis._visibleLineCountBottom.set(Math.min(this._visibleLineCountBottom.get() + count, maxVisibleLineCountBottom), tx);\n\t}\n\n\tpublic showAll(tx: ITransaction | undefined): void {\n\t\tthis._visibleLineCountBottom.set(this.lineCount - this._visibleLineCountTop.get(), tx);\n\t}\n\n\tpublic showModifiedLine(lineNumber: number, preference: RevealPreference, tx: ITransaction | undefined): void {\n\t\tconst top = lineNumber + 1 - (this.modifiedLineNumber + this._visibleLineCountTop.get());\n\t\tconst bottom = (this.modifiedLineNumber - this._visibleLineCountBottom.get() + this.lineCount) - lineNumber;\n\t\tif (preference === RevealPreference.FromCloserSide && top < bottom || preference === RevealPreference.FromTop) {\n\t\t\tthis._visibleLineCountTop.set(this._visibleLineCountTop.get() + top, tx);\n\t\t} else {\n\t\t\tthis._visibleLineCountBottom.set(this._visibleLineCountBottom.get() + bottom, tx);\n\t\t}\n\t}\n\n\tpublic showOriginalLine(lineNumber: number, preference: RevealPreference, tx: ITransaction | undefined): void {\n\t\tconst top = lineNumber - this.originalLineNumber;\n\t\tconst bottom = (this.originalLineNumber + this.lineCount) - lineNumber;\n\t\tif (preference === RevealPreference.FromCloserSide && top < bottom || preference === RevealPreference.FromTop) {\n\t\t\tthis._visibleLineCountTop.set(Math.min(this._visibleLineCountTop.get() + bottom - top, this.getMaxVisibleLineCountTop()), tx);\n\t\t} else {\n\t\t\tthis._visibleLineCountBottom.set(Math.min(this._visibleLineCountBottom.get() + top - bottom, this.getMaxVisibleLineCountBottom()), tx);\n\t\t}\n\t}\n\n\tpublic collapseAll(tx: ITransaction | undefined): void {\n\t\tthis._visibleLineCountTop.set(0, tx);\n\t\tthis._visibleLineCountBottom.set(0, tx);\n\t}\n\n\tpublic setState(visibleLineCountTop: number, visibleLineCountBottom: number, tx: ITransaction | undefined): void {\n\t\tvisibleLineCountTop = Math.max(Math.min(visibleLineCountTop, this.lineCount), 0);\n\t\tvisibleLineCountBottom = Math.max(Math.min(visibleLineCountBottom, this.lineCount - visibleLineCountTop), 0);\n\n\t\tthis._visibleLineCountTop.set(visibleLineCountTop, tx);\n\t\tthis._visibleLineCountBottom.set(visibleLineCountBottom, tx);\n\t}\n}\n\nexport const enum RevealPreference {\n\tFromCloserSide,\n\tFromTop,\n\tFromBottom,\n}\n\nfunction applyOriginalEdits(diff: IDocumentDiff, textEdits: TextEditInfo[], originalTextModel: ITextModel, modifiedTextModel: ITextModel): IDocumentDiff | undefined {\n\treturn undefined;\n\t/*\n\tTODO@hediet\n\tif (textEdits.length === 0) {\n\t\treturn diff;\n\t}\n\n\tconst diff2 = flip(diff);\n\tconst diff3 = applyModifiedEdits(diff2, textEdits, modifiedTextModel, originalTextModel);\n\tif (!diff3) {\n\t\treturn undefined;\n\t}\n\treturn flip(diff3);*/\n}\n/*\nfunction flip(diff: IDocumentDiff): IDocumentDiff {\n\treturn {\n\t\tchanges: diff.changes.map(c => c.flip()),\n\t\tmoves: diff.moves.map(m => m.flip()),\n\t\tidentical: diff.identical,\n\t\tquitEarly: diff.quitEarly,\n\t};\n}\n*/\nfunction applyModifiedEdits(diff: IDocumentDiff, textEdits: TextEditInfo[], originalTextModel: ITextModel, modifiedTextModel: ITextModel): IDocumentDiff | undefined {\n\treturn undefined;\n\t/*\n\tTODO@hediet\n\tif (textEdits.length === 0) {\n\t\treturn diff;\n\t}\n\tif (diff.changes.some(c => !c.innerChanges) || diff.moves.length > 0) {\n\t\t// TODO support these cases\n\t\treturn undefined;\n\t}\n\n\tconst changes = applyModifiedEditsToLineRangeMappings(diff.changes, textEdits, originalTextModel, modifiedTextModel);\n\n\tconst moves = diff.moves.map(m => {\n\t\tconst newModifiedRange = applyEditToLineRange(m.lineRangeMapping.modified, textEdits);\n\t\treturn newModifiedRange ? new MovedText(\n\t\t\tnew SimpleLineRangeMapping(m.lineRangeMapping.original, newModifiedRange),\n\t\t\tapplyModifiedEditsToLineRangeMappings(m.changes, textEdits, originalTextModel, modifiedTextModel),\n\t\t) : undefined;\n\t}).filter(isDefined);\n\n\treturn {\n\t\tidentical: false,\n\t\tquitEarly: false,\n\t\tchanges,\n\t\tmoves,\n\t};*/\n}\n/*\nfunction applyEditToLineRange(range: LineRange, textEdits: TextEditInfo[]): LineRange | undefined {\n\tlet rangeStartLineNumber = range.startLineNumber;\n\tlet rangeEndLineNumberEx = range.endLineNumberExclusive;\n\n\tfor (let i = textEdits.length - 1; i >= 0; i--) {\n\t\tconst textEdit = textEdits[i];\n\t\tconst textEditStartLineNumber = lengthGetLineCount(textEdit.startOffset) + 1;\n\t\tconst textEditEndLineNumber = lengthGetLineCount(textEdit.endOffset) + 1;\n\t\tconst newLengthLineCount = lengthGetLineCount(textEdit.newLength);\n\t\tconst delta = newLengthLineCount - (textEditEndLineNumber - textEditStartLineNumber);\n\n\t\tif (textEditEndLineNumber < rangeStartLineNumber) {\n\t\t\t// the text edit is before us\n\t\t\trangeStartLineNumber += delta;\n\t\t\trangeEndLineNumberEx += delta;\n\t\t} else if (textEditStartLineNumber > rangeEndLineNumberEx) {\n\t\t\t// the text edit is after us\n\t\t\t// NOOP\n\t\t} else if (textEditStartLineNumber < rangeStartLineNumber && rangeEndLineNumberEx < textEditEndLineNumber) {\n\t\t\t// the range is fully contained in the text edit\n\t\t\treturn undefined;\n\t\t} else if (textEditStartLineNumber < rangeStartLineNumber && textEditEndLineNumber <= rangeEndLineNumberEx) {\n\t\t\t// the text edit ends inside our range\n\t\t\trangeStartLineNumber = textEditEndLineNumber + 1;\n\t\t\trangeStartLineNumber += delta;\n\t\t\trangeEndLineNumberEx += delta;\n\t\t} else if (rangeStartLineNumber <= textEditStartLineNumber && textEditEndLineNumber < rangeStartLineNumber) {\n\t\t\t// the text edit starts inside our range\n\t\t\trangeEndLineNumberEx = textEditStartLineNumber;\n\t\t} else {\n\t\t\trangeEndLineNumberEx += delta;\n\t\t}\n\t}\n\n\treturn new LineRange(rangeStartLineNumber, rangeEndLineNumberEx);\n}\n\nfunction applyModifiedEditsToLineRangeMappings(changes: readonly LineRangeMapping[], textEdits: TextEditInfo[], originalTextModel: ITextModel, modifiedTextModel: ITextModel): LineRangeMapping[] {\n\tconst diffTextEdits = changes.flatMap(c => c.innerChanges!.map(c => new TextEditInfo(\n\t\tpositionToLength(c.originalRange.getStartPosition()),\n\t\tpositionToLength(c.originalRange.getEndPosition()),\n\t\tlengthOfRange(c.modifiedRange).toLength(),\n\t)));\n\n\tconst combined = combineTextEditInfos(diffTextEdits, textEdits);\n\n\tlet lastOriginalEndOffset = lengthZero;\n\tlet lastModifiedEndOffset = lengthZero;\n\tconst rangeMappings = combined.map(c => {\n\t\tconst modifiedStartOffset = lengthAdd(lastModifiedEndOffset, lengthDiffNonNegative(lastOriginalEndOffset, c.startOffset));\n\t\tlastOriginalEndOffset = c.endOffset;\n\t\tlastModifiedEndOffset = lengthAdd(modifiedStartOffset, c.newLength);\n\n\t\treturn new RangeMapping(\n\t\t\tRange.fromPositions(lengthToPosition(c.startOffset), lengthToPosition(c.endOffset)),\n\t\t\tRange.fromPositions(lengthToPosition(modifiedStartOffset), lengthToPosition(lastModifiedEndOffset)),\n\t\t);\n\t});\n\n\tconst newChanges = lineRangeMappingFromRangeMappings(\n\t\trangeMappings,\n\t\toriginalTextModel.getLinesContent(),\n\t\tmodifiedTextModel.getLinesContent(),\n\t);\n\treturn newChanges;\n}\n*/\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { RunOnceScheduler } from '../../../../base/common/async.js';\nimport { CancellationTokenSource } from '../../../../base/common/cancellation.js';\nimport { Disposable, toDisposable } from '../../../../base/common/lifecycle.js';\nimport { IObservable, IReader, ISettableObservable, ITransaction, autorun, autorunWithStore, derived, observableSignal, observableSignalFromEvent, observableValue, transaction, waitForState } from '../../../../base/common/observable.js';\nimport { IDiffProviderFactoryService } from './diffProviderFactoryService.js';\nimport { filterWithPrevious } from './utils.js';\nimport { readHotReloadableExport } from '../../../../base/common/hotReloadHelpers.js';\nimport { ISerializedLineRange, LineRange, LineRangeSet } from '../../../common/core/ranges/lineRange.js';\nimport { DefaultLinesDiffComputer } from '../../../common/diff/defaultLinesDiffComputer/defaultLinesDiffComputer.js';\nimport { IDocumentDiff } from '../../../common/diff/documentDiffProvider.js';\nimport { MovedText } from '../../../common/diff/linesDiffComputer.js';\nimport { DetailedLineRangeMapping, LineRangeMapping, RangeMapping } from '../../../common/diff/rangeMapping.js';\nimport { IDiffEditorModel, IDiffEditorViewModel } from '../../../common/editorCommon.js';\nimport { ITextModel } from '../../../common/model.js';\nimport { TextEditInfo } from '../../../common/model/bracketPairsTextModelPart/bracketPairsTree/beforeEditPositionMapper.js';\nimport { combineTextEditInfos } from '../../../common/model/bracketPairsTextModelPart/bracketPairsTree/combineTextEditInfos.js';\nimport { DiffEditorOptions } from './diffEditorOptions.js';\nimport { optimizeSequenceDiffs } from '../../../common/diff/defaultLinesDiffComputer/heuristicSequenceOptimizations.js';\nimport { isDefined } from '../../../../base/common/types.js';\nimport { groupAdjacentBy } from '../../../../base/common/arrays.js';\nimport { softAssert } from '../../../../base/common/assert.js';\n\nexport class DiffEditorViewModel extends Disposable implements IDiffEditorViewModel {\n\tprivate readonly _isDiffUpToDate = observableValue<boolean>(this, false);\n\tpublic readonly isDiffUpToDate: IObservable<boolean> = this._isDiffUpToDate;\n\n\tprivate _lastDiff: IDocumentDiff | undefined;\n\tprivate readonly _diff = observableValue<DiffState | undefined>(this, undefined);\n\tpublic readonly diff: IObservable<DiffState | undefined> = this._diff;\n\n\tprivate readonly _unchangedRegions = observableValue<{ regions: UnchangedRegion[]; originalDecorationIds: string[]; modifiedDecorationIds: string[] } | undefined>(this, undefined);\n\tpublic readonly unchangedRegions: IObservable<UnchangedRegion[]> = derived(this, r => {\n\t\tif (this._options.hideUnchangedRegions.read(r)) {\n\t\t\treturn this._unchangedRegions.read(r)?.regions ?? [];\n\t\t} else {\n\t\t\t// Reset state\n\t\t\ttransaction(tx => {\n\t\t\t\tfor (const r of this._unchangedRegions.get()?.regions || []) {\n\t\t\t\t\tr.collapseAll(tx);\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn [];\n\t\t}\n\t}\n\t);\n\n\tpublic readonly movedTextToCompare = observableValue<MovedText | undefined>(this, undefined);\n\n\tprivate readonly _activeMovedText = observableValue<MovedText | undefined>(this, undefined);\n\tprivate readonly _hoveredMovedText = observableValue<MovedText | undefined>(this, undefined);\n\n\n\tpublic readonly activeMovedText = derived(this, r => this.movedTextToCompare.read(r) ?? this._hoveredMovedText.read(r) ?? this._activeMovedText.read(r));\n\n\tpublic setActiveMovedText(movedText: MovedText | undefined): void {\n\t\tthis._activeMovedText.set(movedText, undefined);\n\t}\n\n\tprivate readonly _cancellationTokenSource = new CancellationTokenSource();\n\n\tprivate readonly _diffProvider = derived(this, reader => {\n\t\tconst diffProvider = this._diffProviderFactoryService.createDiffProvider({\n\t\t\tdiffAlgorithm: this._options.diffAlgorithm.read(reader)\n\t\t});\n\t\tconst onChangeSignal = observableSignalFromEvent('onDidChange', diffProvider.onDidChange);\n\t\treturn {\n\t\t\tdiffProvider,\n\t\t\tonChangeSignal,\n\t\t};\n\t});\n\n\tconstructor(\n\t\tpublic readonly model: IDiffEditorModel,\n\t\tprivate readonly _options: DiffEditorOptions,\n\t\t@IDiffProviderFactoryService private readonly _diffProviderFactoryService: IDiffProviderFactoryService,\n\t) {\n\t\tsuper();\n\n\t\tthis._register(toDisposable(() => this._cancellationTokenSource.cancel()));\n\n\t\tconst contentChangedSignal = observableSignal('contentChangedSignal');\n\t\tconst debouncer = this._register(new RunOnceScheduler(() => contentChangedSignal.trigger(undefined), 200));\n\n\t\tthis._register(autorun(reader => {\n\t\t\t/** @description collapse touching unchanged ranges */\n\n\t\t\tconst lastUnchangedRegions = this._unchangedRegions.read(reader);\n\t\t\tif (!lastUnchangedRegions || lastUnchangedRegions.regions.some(r => r.isDragged.read(reader))) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst lastUnchangedRegionsOrigRanges = lastUnchangedRegions.originalDecorationIds\n\t\t\t\t.map(id => model.original.getDecorationRange(id))\n\t\t\t\t.map(r => r ? LineRange.fromRangeInclusive(r) : undefined);\n\t\t\tconst lastUnchangedRegionsModRanges = lastUnchangedRegions.modifiedDecorationIds\n\t\t\t\t.map(id => model.modified.getDecorationRange(id))\n\t\t\t\t.map(r => r ? LineRange.fromRangeInclusive(r) : undefined);\n\t\t\tconst updatedLastUnchangedRegions = lastUnchangedRegions.regions.map((r, idx) =>\n\t\t\t\t(!lastUnchangedRegionsOrigRanges[idx] || !lastUnchangedRegionsModRanges[idx]) ? undefined :\n\t\t\t\t\tnew UnchangedRegion(\n\t\t\t\t\t\tlastUnchangedRegionsOrigRanges[idx]!.startLineNumber,\n\t\t\t\t\t\tlastUnchangedRegionsModRanges[idx]!.startLineNumber,\n\t\t\t\t\t\tlastUnchangedRegionsOrigRanges[idx]!.length,\n\t\t\t\t\t\tr.visibleLineCountTop.read(reader),\n\t\t\t\t\t\tr.visibleLineCountBottom.read(reader),\n\t\t\t\t\t)).filter(isDefined);\n\n\t\t\tconst newRanges: UnchangedRegion[] = [];\n\n\t\t\tlet didChange = false;\n\t\t\tfor (const touching of groupAdjacentBy(updatedLastUnchangedRegions, (a, b) => a.getHiddenModifiedRange(reader).endLineNumberExclusive === b.getHiddenModifiedRange(reader).startLineNumber)) {\n\t\t\t\tif (touching.length > 1) {\n\t\t\t\t\tdidChange = true;\n\t\t\t\t\tconst sumLineCount = touching.reduce((sum, r) => sum + r.lineCount, 0);\n\t\t\t\t\tconst r = new UnchangedRegion(touching[0].originalLineNumber, touching[0].modifiedLineNumber, sumLineCount, touching[0].visibleLineCountTop.get(), touching[touching.length - 1].visibleLineCountBottom.get());\n\t\t\t\t\tnewRanges.push(r);\n\t\t\t\t} else {\n\t\t\t\t\tnewRanges.push(touching[0]);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (didChange) {\n\t\t\t\tconst originalDecorationIds = model.original.deltaDecorations(\n\t\t\t\t\tlastUnchangedRegions.originalDecorationIds,\n\t\t\t\t\tnewRanges.map(r => ({ range: r.originalUnchangedRange.toInclusiveRange()!, options: { description: 'unchanged' } }))\n\t\t\t\t);\n\t\t\t\tconst modifiedDecorationIds = model.modified.deltaDecorations(\n\t\t\t\t\tlastUnchangedRegions.modifiedDecorationIds,\n\t\t\t\t\tnewRanges.map(r => ({ range: r.modifiedUnchangedRange.toInclusiveRange()!, options: { description: 'unchanged' } }))\n\t\t\t\t);\n\n\t\t\t\ttransaction(tx => {\n\t\t\t\t\tthis._unchangedRegions.set(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tregions: newRanges,\n\t\t\t\t\t\t\toriginalDecorationIds,\n\t\t\t\t\t\t\tmodifiedDecorationIds\n\t\t\t\t\t\t},\n\t\t\t\t\t\ttx\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t}\n\t\t}));\n\n\t\tconst updateUnchangedRegions = (result: IDocumentDiff, tx: ITransaction, reader?: IReader) => {\n\t\t\tconst newUnchangedRegions = UnchangedRegion.fromDiffs(\n\t\t\t\tresult.changes,\n\t\t\t\tmodel.original.getLineCount(),\n\t\t\t\tmodel.modified.getLineCount(),\n\t\t\t\tthis._options.hideUnchangedRegionsMinimumLineCount.read(reader),\n\t\t\t\tthis._options.hideUnchangedRegionsContextLineCount.read(reader),\n\t\t\t);\n\n\t\t\t// Transfer state from cur state\n\t\t\tlet visibleRegions: LineRangeMapping[] | undefined = undefined;\n\n\t\t\tconst lastUnchangedRegions = this._unchangedRegions.get();\n\t\t\tif (lastUnchangedRegions) {\n\t\t\t\tconst lastUnchangedRegionsOrigRanges = lastUnchangedRegions.originalDecorationIds\n\t\t\t\t\t.map(id => model.original.getDecorationRange(id))\n\t\t\t\t\t.map(r => r ? LineRange.fromRangeInclusive(r) : undefined);\n\t\t\t\tconst lastUnchangedRegionsModRanges = lastUnchangedRegions.modifiedDecorationIds\n\t\t\t\t\t.map(id => model.modified.getDecorationRange(id))\n\t\t\t\t\t.map(r => r ? LineRange.fromRangeInclusive(r) : undefined);\n\t\t\t\tconst updatedLastUnchangedRegions = filterWithPrevious(\n\t\t\t\t\tlastUnchangedRegions.regions\n\t\t\t\t\t\t.map((r, idx) => {\n\t\t\t\t\t\t\tif (!lastUnchangedRegionsOrigRanges[idx] || !lastUnchangedRegionsModRanges[idx]) { return undefined; }\n\t\t\t\t\t\t\tconst length = lastUnchangedRegionsOrigRanges[idx]!.length;\n\t\t\t\t\t\t\treturn new UnchangedRegion(\n\t\t\t\t\t\t\t\tlastUnchangedRegionsOrigRanges[idx]!.startLineNumber,\n\t\t\t\t\t\t\t\tlastUnchangedRegionsModRanges[idx]!.startLineNumber,\n\t\t\t\t\t\t\t\tlength,\n\t\t\t\t\t\t\t\t// The visible area can shrink by edits -> we have to account for this\n\t\t\t\t\t\t\t\tMath.min(r.visibleLineCountTop.get(), length),\n\t\t\t\t\t\t\t\tMath.min(r.visibleLineCountBottom.get(), length - r.visibleLineCountTop.get()),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\t).filter(isDefined),\n\t\t\t\t\t(cur, prev) => !prev || (cur.modifiedLineNumber >= prev.modifiedLineNumber + prev.lineCount && cur.originalLineNumber >= prev.originalLineNumber + prev.lineCount)\n\t\t\t\t);\n\n\t\t\t\tlet hiddenRegions = updatedLastUnchangedRegions.map(r => new LineRangeMapping(r.getHiddenOriginalRange(reader), r.getHiddenModifiedRange(reader)));\n\t\t\t\thiddenRegions = LineRangeMapping.clip(hiddenRegions, LineRange.ofLength(1, model.original.getLineCount()), LineRange.ofLength(1, model.modified.getLineCount()));\n\t\t\t\tvisibleRegions = LineRangeMapping.inverse(hiddenRegions, model.original.getLineCount(), model.modified.getLineCount());\n\t\t\t}\n\n\t\t\tconst newUnchangedRegions2 = [];\n\t\t\tif (visibleRegions) {\n\t\t\t\tfor (const r of newUnchangedRegions) {\n\t\t\t\t\tconst intersecting = visibleRegions.filter(f => f.original.intersectsStrict(r.originalUnchangedRange) && f.modified.intersectsStrict(r.modifiedUnchangedRange));\n\t\t\t\t\tnewUnchangedRegions2.push(...r.setVisibleRanges(intersecting, tx));\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tnewUnchangedRegions2.push(...newUnchangedRegions);\n\t\t\t}\n\n\t\t\tconst originalDecorationIds = model.original.deltaDecorations(\n\t\t\t\tlastUnchangedRegions?.originalDecorationIds || [],\n\t\t\t\tnewUnchangedRegions2.map(r => ({ range: r.originalUnchangedRange.toInclusiveRange()!, options: { description: 'unchanged' } }))\n\t\t\t);\n\t\t\tconst modifiedDecorationIds = model.modified.deltaDecorations(\n\t\t\t\tlastUnchangedRegions?.modifiedDecorationIds || [],\n\t\t\t\tnewUnchangedRegions2.map(r => ({ range: r.modifiedUnchangedRange.toInclusiveRange()!, options: { description: 'unchanged' } }))\n\t\t\t);\n\n\t\t\tthis._unchangedRegions.set(\n\t\t\t\t{\n\t\t\t\t\tregions: newUnchangedRegions2,\n\t\t\t\t\toriginalDecorationIds,\n\t\t\t\t\tmodifiedDecorationIds\n\t\t\t\t},\n\t\t\t\ttx\n\t\t\t);\n\t\t};\n\n\t\tthis._register(model.modified.onDidChangeContent((e) => {\n\t\t\tconst diff = this._diff.get();\n\t\t\tif (diff) {\n\t\t\t\tconst textEdits = TextEditInfo.fromModelContentChanges(e.changes);\n\t\t\t\tconst result = applyModifiedEdits(this._lastDiff!, textEdits, model.original, model.modified);\n\t\t\t\tif (result) {\n\t\t\t\t\tthis._lastDiff = result;\n\t\t\t\t\ttransaction(tx => {\n\t\t\t\t\t\tthis._diff.set(DiffState.fromDiffResult(this._lastDiff!), tx);\n\t\t\t\t\t\tupdateUnchangedRegions(result, tx);\n\t\t\t\t\t\tconst currentSyncedMovedText = this.movedTextToCompare.get();\n\t\t\t\t\t\tthis.movedTextToCompare.set(currentSyncedMovedText ? this._lastDiff!.moves.find(m => m.lineRangeMapping.modified.intersect(currentSyncedMovedText.lineRangeMapping.modified)) : undefined, tx);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis._isDiffUpToDate.set(false, undefined);\n\t\t\tdebouncer.schedule();\n\t\t}));\n\t\tthis._register(model.original.onDidChangeContent((e) => {\n\t\t\tconst diff = this._diff.get();\n\t\t\tif (diff) {\n\t\t\t\tconst textEdits = TextEditInfo.fromModelContentChanges(e.changes);\n\t\t\t\tconst result = applyOriginalEdits(this._lastDiff!, textEdits, model.original, model.modified);\n\t\t\t\tif (result) {\n\t\t\t\t\tthis._lastDiff = result;\n\t\t\t\t\ttransaction(tx => {\n\t\t\t\t\t\tthis._diff.set(DiffState.fromDiffResult(this._lastDiff!), tx);\n\t\t\t\t\t\tupdateUnchangedRegions(result, tx);\n\t\t\t\t\t\tconst currentSyncedMovedText = this.movedTextToCompare.get();\n\t\t\t\t\t\tthis.movedTextToCompare.set(currentSyncedMovedText ? this._lastDiff!.moves.find(m => m.lineRangeMapping.modified.intersect(currentSyncedMovedText.lineRangeMapping.modified)) : undefined, tx);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis._isDiffUpToDate.set(false, undefined);\n\t\t\tdebouncer.schedule();\n\t\t}));\n\n\t\tthis._register(autorunWithStore(async (reader, store) => {\n\t\t\t/** @description compute diff */\n\n\t\t\t// So that they get recomputed when these settings change\n\t\t\tthis._options.hideUnchangedRegionsMinimumLineCount.read(reader);\n\t\t\tthis._options.hideUnchangedRegionsContextLineCount.read(reader);\n\n\t\t\tdebouncer.cancel();\n\t\t\tcontentChangedSignal.read(reader);\n\t\t\tconst documentDiffProvider = this._diffProvider.read(reader);\n\t\t\tdocumentDiffProvider.onChangeSignal.read(reader);\n\n\t\t\treadHotReloadableExport(DefaultLinesDiffComputer, reader);\n\t\t\treadHotReloadableExport(optimizeSequenceDiffs, reader);\n\n\t\t\tthis._isDiffUpToDate.set(false, undefined);\n\n\t\t\tlet originalTextEditInfos: TextEditInfo[] = [];\n\t\t\tstore.add(model.original.onDidChangeContent((e) => {\n\t\t\t\tconst edits = TextEditInfo.fromModelContentChanges(e.changes);\n\t\t\t\toriginalTextEditInfos = combineTextEditInfos(originalTextEditInfos, edits);\n\t\t\t}));\n\n\t\t\tlet modifiedTextEditInfos: TextEditInfo[] = [];\n\t\t\tstore.add(model.modified.onDidChangeContent((e) => {\n\t\t\t\tconst edits = TextEditInfo.fromModelContentChanges(e.changes);\n\t\t\t\tmodifiedTextEditInfos = combineTextEditInfos(modifiedTextEditInfos, edits);\n\t\t\t}));\n\n\t\t\tlet result = await documentDiffProvider.diffProvider.computeDiff(model.original, model.modified, {\n\t\t\t\tignoreTrimWhitespace: this._options.ignoreTrimWhitespace.read(reader),\n\t\t\t\tmaxComputationTimeMs: this._options.maxComputationTimeMs.read(reader),\n\t\t\t\tcomputeMoves: this._options.showMoves.read(reader),\n\t\t\t}, this._cancellationTokenSource.token);\n\n\t\t\tif (this._cancellationTokenSource.token.isCancellationRequested) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (model.original.isDisposed() || model.modified.isDisposed()) {\n\t\t\t\t// TODO@hediet fishy?\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tresult = normalizeDocumentDiff(result, model.original, model.modified);\n\t\t\tresult = applyOriginalEdits(result, originalTextEditInfos, model.original, model.modified) ?? result;\n\t\t\tresult = applyModifiedEdits(result, modifiedTextEditInfos, model.original, model.modified) ?? result;\n\n\t\t\ttransaction(tx => {\n\t\t\t\t/** @description write diff result */\n\t\t\t\tupdateUnchangedRegions(result, tx);\n\n\t\t\t\tthis._lastDiff = result;\n\t\t\t\tconst state = DiffState.fromDiffResult(result);\n\t\t\t\tthis._diff.set(state, tx);\n\t\t\t\tthis._isDiffUpToDate.set(true, tx);\n\t\t\t\tconst currentSyncedMovedText = this.movedTextToCompare.get();\n\t\t\t\tthis.movedTextToCompare.set(currentSyncedMovedText ? this._lastDiff.moves.find(m => m.lineRangeMapping.modified.intersect(currentSyncedMovedText.lineRangeMapping.modified)) : undefined, tx);\n\t\t\t});\n\t\t}));\n\t}\n\n\tpublic ensureModifiedLineIsVisible(lineNumber: number, preference: RevealPreference, tx: ITransaction | undefined): void {\n\t\tif (this.diff.get()?.mappings.length === 0) {\n\t\t\treturn;\n\t\t}\n\t\tconst unchangedRegions = this._unchangedRegions.get()?.regions || [];\n\t\tfor (const r of unchangedRegions) {\n\t\t\tif (r.getHiddenModifiedRange(undefined).contains(lineNumber)) {\n\t\t\t\tr.showModifiedLine(lineNumber, preference, tx);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic ensureOriginalLineIsVisible(lineNumber: number, preference: RevealPreference, tx: ITransaction | undefined): void {\n\t\tif (this.diff.get()?.mappings.length === 0) {\n\t\t\treturn;\n\t\t}\n\t\tconst unchangedRegions = this._unchangedRegions.get()?.regions || [];\n\t\tfor (const r of unchangedRegions) {\n\t\t\tif (r.getHiddenOriginalRange(undefined).contains(lineNumber)) {\n\t\t\t\tr.showOriginalLine(lineNumber, preference, tx);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic async waitForDiff(): Promise<void> {\n\t\tawait waitForState(this.isDiffUpToDate, s => s);\n\t}\n\n\tpublic serializeState(): SerializedState {\n\t\tconst regions = this._unchangedRegions.get();\n\t\treturn {\n\t\t\tcollapsedRegions: regions?.regions.map(r => ({ range: r.getHiddenModifiedRange(undefined).serialize() }))\n\t\t};\n\t}\n\n\tpublic restoreSerializedState(state: SerializedState): void {\n\t\tconst ranges = state.collapsedRegions?.map(r => LineRange.deserialize(r.range));\n\t\tconst regions = this._unchangedRegions.get();\n\t\tif (!regions || !ranges) {\n\t\t\treturn;\n\t\t}\n\t\ttransaction(tx => {\n\t\t\tfor (const r of regions.regions) {\n\t\t\t\tfor (const range of ranges) {\n\t\t\t\t\tif (r.modifiedUnchangedRange.intersect(range)) {\n\t\t\t\t\t\tr.setHiddenModifiedRange(range, tx);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n}\n\nfunction normalizeDocumentDiff(diff: IDocumentDiff, original: ITextModel, modified: ITextModel): IDocumentDiff {\n\treturn {\n\t\tchanges: diff.changes.map(c => new DetailedLineRangeMapping(\n\t\t\tc.original,\n\t\t\tc.modified,\n\t\t\tc.innerChanges ? c.innerChanges.map(i => normalizeRangeMapping(i, original, modified)) : undefined\n\t\t)),\n\t\tmoves: diff.moves,\n\t\tidentical: diff.identical,\n\t\tquitEarly: diff.quitEarly,\n\t};\n}\n\nfunction normalizeRangeMapping(rangeMapping: RangeMapping, original: ITextModel, modified: ITextModel): RangeMapping {\n\tlet originalRange = rangeMapping.originalRange;\n\tlet modifiedRange = rangeMapping.modifiedRange;\n\tif (\n\t\toriginalRange.startColumn === 1 && modifiedRange.startColumn === 1 &&\n\t\t(originalRange.endColumn !== 1 || modifiedRange.endColumn !== 1) &&\n\t\toriginalRange.endColumn === original.getLineMaxColumn(originalRange.endLineNumber)\n\t\t&& modifiedRange.endColumn === modified.getLineMaxColumn(modifiedRange.endLineNumber)\n\t\t&& originalRange.endLineNumber < original.getLineCount()\n\t\t&& modifiedRange.endLineNumber < modified.getLineCount()\n\t) {\n\t\toriginalRange = originalRange.setEndPosition(originalRange.endLineNumber + 1, 1);\n\t\tmodifiedRange = modifiedRange.setEndPosition(modifiedRange.endLineNumber + 1, 1);\n\t}\n\treturn new RangeMapping(originalRange, modifiedRange);\n}\n\ninterface SerializedState {\n\tcollapsedRegions: { range: ISerializedLineRange }[] | undefined;\n}\n\nexport class DiffState {\n\tpublic static fromDiffResult(result: IDocumentDiff): DiffState {\n\t\treturn new DiffState(\n\t\t\tresult.changes.map(c => new DiffMapping(c)),\n\t\t\tresult.moves || [],\n\t\t\tresult.identical,\n\t\t\tresult.quitEarly,\n\t\t);\n\t}\n\n\tconstructor(\n\t\tpublic readonly mappings: readonly DiffMapping[],\n\t\tpublic readonly movedTexts: readonly MovedText[],\n\t\tpublic readonly identical: boolean,\n\t\tpublic readonly quitEarly: boolean,\n\t) { }\n}\n\nexport class DiffMapping {\n\tconstructor(\n\t\treadonly lineRangeMapping: DetailedLineRangeMapping,\n\t) {\n\t\t/*\n\t\treadonly movedTo: MovedText | undefined,\n\t\treadonly movedFrom: MovedText | undefined,\n\n\t\tif (movedTo) {\n\t\t\tassertFn(() =>\n\t\t\t\tmovedTo.lineRangeMapping.modifiedRange.equals(lineRangeMapping.modifiedRange)\n\t\t\t\t&& lineRangeMapping.originalRange.isEmpty\n\t\t\t\t&& !movedFrom\n\t\t\t);\n\t\t} else if (movedFrom) {\n\t\t\tassertFn(() =>\n\t\t\t\tmovedFrom.lineRangeMapping.originalRange.equals(lineRangeMapping.originalRange)\n\t\t\t\t&& lineRangeMapping.modifiedRange.isEmpty\n\t\t\t\t&& !movedTo\n\t\t\t);\n\t\t}\n\t\t*/\n\t}\n}\n\nexport class UnchangedRegion {\n\tpublic static fromDiffs(\n\t\tchanges: readonly DetailedLineRangeMapping[],\n\t\toriginalLineCount: number,\n\t\tmodifiedLineCount: number,\n\t\tminHiddenLineCount: number,\n\t\tminContext: number,\n\t): UnchangedRegion[] {\n\t\tconst inversedMappings = DetailedLineRangeMapping.inverse(changes, originalLineCount, modifiedLineCount);\n\t\tconst result: UnchangedRegion[] = [];\n\n\t\tfor (const mapping of inversedMappings) {\n\t\t\tlet origStart = mapping.original.startLineNumber;\n\t\t\tlet modStart = mapping.modified.startLineNumber;\n\t\t\tlet length = mapping.original.length;\n\n\t\t\tconst atStart = origStart === 1 && modStart === 1;\n\t\t\tconst atEnd = origStart + length === originalLineCount + 1 && modStart + length === modifiedLineCount + 1;\n\n\t\t\tif ((atStart || atEnd) && length >= minContext + minHiddenLineCount) {\n\t\t\t\tif (atStart && !atEnd) {\n\t\t\t\t\tlength -= minContext;\n\t\t\t\t}\n\t\t\t\tif (atEnd && !atStart) {\n\t\t\t\t\torigStart += minContext;\n\t\t\t\t\tmodStart += minContext;\n\t\t\t\t\tlength -= minContext;\n\t\t\t\t}\n\t\t\t\tresult.push(new UnchangedRegion(origStart, modStart, length, 0, 0));\n\t\t\t} else if (length >= minContext * 2 + minHiddenLineCount) {\n\t\t\t\torigStart += minContext;\n\t\t\t\tmodStart += minContext;\n\t\t\t\tlength -= minContext * 2;\n\t\t\t\tresult.push(new UnchangedRegion(origStart, modStart, length, 0, 0));\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t}\n\n\tpublic get originalUnchangedRange(): LineRange {\n\t\treturn LineRange.ofLength(this.originalLineNumber, this.lineCount);\n\t}\n\n\tpublic get modifiedUnchangedRange(): LineRange {\n\t\treturn LineRange.ofLength(this.modifiedLineNumber, this.lineCount);\n\t}\n\n\tprivate readonly _visibleLineCountTop = observableValue<number>(this, 0);\n\tpublic readonly visibleLineCountTop: ISettableObservable<number> = this._visibleLineCountTop;\n\n\tprivate readonly _visibleLineCountBottom = observableValue<number>(this, 0);\n\tpublic readonly visibleLineCountBottom: ISettableObservable<number> = this._visibleLineCountBottom;\n\n\tprivate readonly _shouldHideControls = derived(this, reader => /** @description isVisible */\n\t\tthis.visibleLineCountTop.read(reader) + this.visibleLineCountBottom.read(reader) === this.lineCount && !this.isDragged.read(reader));\n\n\tpublic readonly isDragged = observableValue<undefined | 'bottom' | 'top'>(this, undefined);\n\n\tconstructor(\n\t\tpublic readonly originalLineNumber: number,\n\t\tpublic readonly modifiedLineNumber: number,\n\t\tpublic readonly lineCount: number,\n\t\tvisibleLineCountTop: number,\n\t\tvisibleLineCountBottom: number,\n\t) {\n\t\tconst visibleLineCountTop2 = Math.max(Math.min(visibleLineCountTop, this.lineCount), 0);\n\t\tconst visibleLineCountBottom2 = Math.max(Math.min(visibleLineCountBottom, this.lineCount - visibleLineCountTop), 0);\n\n\t\tsoftAssert(visibleLineCountTop === visibleLineCountTop2);\n\t\tsoftAssert(visibleLineCountBottom === visibleLineCountBottom2);\n\n\t\tthis._visibleLineCountTop.set(visibleLineCountTop2, undefined);\n\t\tthis._visibleLineCountBottom.set(visibleLineCountBottom2, undefined);\n\t}\n\n\tpublic setVisibleRanges(visibleRanges: LineRangeMapping[], tx: ITransaction): UnchangedRegion[] {\n\t\tconst result: UnchangedRegion[] = [];\n\n\t\tconst hiddenModified = new LineRangeSet(visibleRanges.map(r => r.modified)).subtractFrom(this.modifiedUnchangedRange);\n\n\t\tlet originalStartLineNumber = this.originalLineNumber;\n\t\tlet modifiedStartLineNumber = this.modifiedLineNumber;\n\t\tconst modifiedEndLineNumberEx = this.modifiedLineNumber + this.lineCount;\n\t\tif (hiddenModified.ranges.length === 0) {\n\t\t\tthis.showAll(tx);\n\t\t\tresult.push(this);\n\t\t} else {\n\t\t\tlet i = 0;\n\t\t\tfor (const r of hiddenModified.ranges) {\n\t\t\t\tconst isLast = i === hiddenModified.ranges.length - 1;\n\t\t\t\ti++;\n\n\t\t\t\tconst length = (isLast ? modifiedEndLineNumberEx : r.endLineNumberExclusive) - modifiedStartLineNumber;\n\n\t\t\t\tconst newR = new UnchangedRegion(originalStartLineNumber, modifiedStartLineNumber, length, 0, 0);\n\t\t\t\tnewR.setHiddenModifiedRange(r, tx);\n\t\t\t\tresult.push(newR);\n\n\t\t\t\toriginalStartLineNumber = newR.originalUnchangedRange.endLineNumberExclusive;\n\t\t\t\tmodifiedStartLineNumber = newR.modifiedUnchangedRange.endLineNumberExclusive;\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t}\n\n\tpublic shouldHideControls(reader: IReader | undefined): boolean {\n\t\treturn this._shouldHideControls.read(reader);\n\t}\n\n\tpublic getHiddenOriginalRange(reader: IReader | undefined): LineRange {\n\t\treturn LineRange.ofLength(\n\t\t\tthis.originalLineNumber + this._visibleLineCountTop.read(reader),\n\t\t\tthis.lineCount - this._visibleLineCountTop.read(reader) - this._visibleLineCountBottom.read(reader),\n\t\t);\n\t}\n\n\tpublic getHiddenModifiedRange(reader: IReader | undefined): LineRange {\n\t\treturn LineRange.ofLength(\n\t\t\tthis.modifiedLineNumber + this._visibleLineCountTop.read(reader),\n\t\t\tthis.lineCount - this._visibleLineCountTop.read(reader) - this._visibleLineCountBottom.read(reader),\n\t\t);\n\t}\n\n\tpublic setHiddenModifiedRange(range: LineRange, tx: ITransaction) {\n\t\tconst visibleLineCountTop = range.startLineNumber - this.modifiedLineNumber;\n\t\tconst visibleLineCountBottom = (this.modifiedLineNumber + this.lineCount) - range.endLineNumberExclusive;\n\t\tthis.setState(visibleLineCountTop, visibleLineCountBottom, tx);\n\t}\n\n\tpublic getMaxVisibleLineCountTop() {\n\t\treturn this.lineCount - this._visibleLineCountBottom.get();\n\t}\n\n\tpublic getMaxVisibleLineCountBottom() {\n\t\treturn this.lineCount - this._visibleLineCountTop.get();\n\t}\n\n\tpublic showMoreAbove(count = 10, tx: ITransaction | undefined): void {\n\t\tconst maxVisibleLineCountTop = this.getMaxVisibleLineCountTop();\n\t\tthis._visibleLineCountTop.set(Math.min(this._visibleLineCountTop.get() + count, maxVisibleLineCountTop), tx);\n\t}\n\n\tpublic showMoreBelow(count = 10, tx: ITransaction | undefined): void {\n\t\tconst maxVisibleLineCountBottom = this.lineCount - this._visibleLineCountTop.get();\n\t\tthis._visibleLineCountBottom.set(Math.min(this._visibleLineCountBottom.get() + count, maxVisibleLineCountBottom), tx);\n\t}\n\n\tpublic showAll(tx: ITransaction | undefined): void {\n\t\tthis._visibleLineCountBottom.set(this.lineCount - this._visibleLineCountTop.get(), tx);\n\t}\n\n\tpublic showModifiedLine(lineNumber: number, preference: RevealPreference, tx: ITransaction | undefined): void {\n\t\tconst top = lineNumber + 1 - (this.modifiedLineNumber + this._visibleLineCountTop.get());\n\t\tconst bottom = (this.modifiedLineNumber - this._visibleLineCountBottom.get() + this.lineCount) - lineNumber;\n\t\tif (preference === RevealPreference.FromCloserSide && top < bottom || preference === RevealPreference.FromTop) {\n\t\t\tthis._visibleLineCountTop.set(this._visibleLineCountTop.get() + top, tx);\n\t\t} else {\n\t\t\tthis._visibleLineCountBottom.set(this._visibleLineCountBottom.get() + bottom, tx);\n\t\t}\n\t}\n\n\tpublic showOriginalLine(lineNumber: number, preference: RevealPreference, tx: ITransaction | undefined): void {\n\t\tconst top = lineNumber - this.originalLineNumber;\n\t\tconst bottom = (this.originalLineNumber + this.lineCount) - lineNumber;\n\t\tif (preference === RevealPreference.FromCloserSide && top < bottom || preference === RevealPreference.FromTop) {\n\t\t\tthis._visibleLineCountTop.set(Math.min(this._visibleLineCountTop.get() + bottom - top, this.getMaxVisibleLineCountTop()), tx);\n\t\t} else {\n\t\t\tthis._visibleLineCountBottom.set(Math.min(this._visibleLineCountBottom.get() + top - bottom, this.getMaxVisibleLineCountBottom()), tx);\n\t\t}\n\t}\n\n\tpublic collapseAll(tx: ITransaction | undefined): void {\n\t\tthis._visibleLineCountTop.set(0, tx);\n\t\tthis._visibleLineCountBottom.set(0, tx);\n\t}\n\n\tpublic setState(visibleLineCountTop: number, visibleLineCountBottom: number, tx: ITransaction | undefined): void {\n\t\tvisibleLineCountTop = Math.max(Math.min(visibleLineCountTop, this.lineCount), 0);\n\t\tvisibleLineCountBottom = Math.max(Math.min(visibleLineCountBottom, this.lineCount - visibleLineCountTop), 0);\n\n\t\tthis._visibleLineCountTop.set(visibleLineCountTop, tx);\n\t\tthis._visibleLineCountBottom.set(visibleLineCountBottom, tx);\n\t}\n}\n\nexport const enum RevealPreference {\n\tFromCloserSide,\n\tFromTop,\n\tFromBottom,\n}\n\nfunction applyOriginalEdits(diff: IDocumentDiff, textEdits: TextEditInfo[], originalTextModel: ITextModel, modifiedTextModel: ITextModel): IDocumentDiff | undefined {\n\treturn undefined;\n\t/*\n\tTODO@hediet\n\tif (textEdits.length === 0) {\n\t\treturn diff;\n\t}\n\n\tconst diff2 = flip(diff);\n\tconst diff3 = applyModifiedEdits(diff2, textEdits, modifiedTextModel, originalTextModel);\n\tif (!diff3) {\n\t\treturn undefined;\n\t}\n\treturn flip(diff3);*/\n}\n/*\nfunction flip(diff: IDocumentDiff): IDocumentDiff {\n\treturn {\n\t\tchanges: diff.changes.map(c => c.flip()),\n\t\tmoves: diff.moves.map(m => m.flip()),\n\t\tidentical: diff.identical,\n\t\tquitEarly: diff.quitEarly,\n\t};\n}\n*/\nfunction applyModifiedEdits(diff: IDocumentDiff, textEdits: TextEditInfo[], originalTextModel: ITextModel, modifiedTextModel: ITextModel): IDocumentDiff | undefined {\n\treturn undefined;\n\t/*\n\tTODO@hediet\n\tif (textEdits.length === 0) {\n\t\treturn diff;\n\t}\n\tif (diff.changes.some(c => !c.innerChanges) || diff.moves.length > 0) {\n\t\t// TODO support these cases\n\t\treturn undefined;\n\t}\n\n\tconst changes = applyModifiedEditsToLineRangeMappings(diff.changes, textEdits, originalTextModel, modifiedTextModel);\n\n\tconst moves = diff.moves.map(m => {\n\t\tconst newModifiedRange = applyEditToLineRange(m.lineRangeMapping.modified, textEdits);\n\t\treturn newModifiedRange ? new MovedText(\n\t\t\tnew SimpleLineRangeMapping(m.lineRangeMapping.original, newModifiedRange),\n\t\t\tapplyModifiedEditsToLineRangeMappings(m.changes, textEdits, originalTextModel, modifiedTextModel),\n\t\t) : undefined;\n\t}).filter(isDefined);\n\n\treturn {\n\t\tidentical: false,\n\t\tquitEarly: false,\n\t\tchanges,\n\t\tmoves,\n\t};*/\n}\n/*\nfunction applyEditToLineRange(range: LineRange, textEdits: TextEditInfo[]): LineRange | undefined {\n\tlet rangeStartLineNumber = range.startLineNumber;\n\tlet rangeEndLineNumberEx = range.endLineNumberExclusive;\n\n\tfor (let i = textEdits.length - 1; i >= 0; i--) {\n\t\tconst textEdit = textEdits[i];\n\t\tconst textEditStartLineNumber = lengthGetLineCount(textEdit.startOffset) + 1;\n\t\tconst textEditEndLineNumber = lengthGetLineCount(textEdit.endOffset) + 1;\n\t\tconst newLengthLineCount = lengthGetLineCount(textEdit.newLength);\n\t\tconst delta = newLengthLineCount - (textEditEndLineNumber - textEditStartLineNumber);\n\n\t\tif (textEditEndLineNumber < rangeStartLineNumber) {\n\t\t\t// the text edit is before us\n\t\t\trangeStartLineNumber += delta;\n\t\t\trangeEndLineNumberEx += delta;\n\t\t} else if (textEditStartLineNumber > rangeEndLineNumberEx) {\n\t\t\t// the text edit is after us\n\t\t\t// NOOP\n\t\t} else if (textEditStartLineNumber < rangeStartLineNumber && rangeEndLineNumberEx < textEditEndLineNumber) {\n\t\t\t// the range is fully contained in the text edit\n\t\t\treturn undefined;\n\t\t} else if (textEditStartLineNumber < rangeStartLineNumber && textEditEndLineNumber <= rangeEndLineNumberEx) {\n\t\t\t// the text edit ends inside our range\n\t\t\trangeStartLineNumber = textEditEndLineNumber + 1;\n\t\t\trangeStartLineNumber += delta;\n\t\t\trangeEndLineNumberEx += delta;\n\t\t} else if (rangeStartLineNumber <= textEditStartLineNumber && textEditEndLineNumber < rangeStartLineNumber) {\n\t\t\t// the text edit starts inside our range\n\t\t\trangeEndLineNumberEx = textEditStartLineNumber;\n\t\t} else {\n\t\t\trangeEndLineNumberEx += delta;\n\t\t}\n\t}\n\n\treturn new LineRange(rangeStartLineNumber, rangeEndLineNumberEx);\n}\n\nfunction applyModifiedEditsToLineRangeMappings(changes: readonly LineRangeMapping[], textEdits: TextEditInfo[], originalTextModel: ITextModel, modifiedTextModel: ITextModel): LineRangeMapping[] {\n\tconst diffTextEdits = changes.flatMap(c => c.innerChanges!.map(c => new TextEditInfo(\n\t\tpositionToLength(c.originalRange.getStartPosition()),\n\t\tpositionToLength(c.originalRange.getEndPosition()),\n\t\tlengthOfRange(c.modifiedRange).toLength(),\n\t)));\n\n\tconst combined = combineTextEditInfos(diffTextEdits, textEdits);\n\n\tlet lastOriginalEndOffset = lengthZero;\n\tlet lastModifiedEndOffset = lengthZero;\n\tconst rangeMappings = combined.map(c => {\n\t\tconst modifiedStartOffset = lengthAdd(lastModifiedEndOffset, lengthDiffNonNegative(lastOriginalEndOffset, c.startOffset));\n\t\tlastOriginalEndOffset = c.endOffset;\n\t\tlastModifiedEndOffset = lengthAdd(modifiedStartOffset, c.newLength);\n\n\t\treturn new RangeMapping(\n\t\t\tRange.fromPositions(lengthToPosition(c.startOffset), lengthToPosition(c.endOffset)),\n\t\t\tRange.fromPositions(lengthToPosition(modifiedStartOffset), lengthToPosition(lastModifiedEndOffset)),\n\t\t);\n\t});\n\n\tconst newChanges = lineRangeMappingFromRangeMappings(\n\t\trangeMappings,\n\t\toriginalTextModel.getLinesContent(),\n\t\tmodifiedTextModel.getLinesContent(),\n\t);\n\treturn newChanges;\n}\n*/\n"]}
1
+ {"version":3,"sources":["file:///mnt/vss/_work/1/s/dependencies/vscode/out-editor-src/vs/editor/browser/widget/diffEditor/diffEditorViewModel.ts","vs/editor/browser/widget/diffEditor/diffEditorViewModel.ts"],"names":[],"mappings":"AAAA;;;gGAGgG;;;;;;;;;;AAEhG,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,uBAAuB,EAAE,MAAM,yCAAyC,CAAC;AAClF,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAC;AAChF,OAAO,EAA2D,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,gBAAgB,EAAE,yBAAyB,EAAE,eAAe,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,uCAAuC,CAAC;AAC7O,OAAO,EAAE,2BAA2B,EAAE,MAAM,iCAAiC,CAAC;AAC9E,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,uBAAuB,EAAE,MAAM,6CAA6C,CAAC;AACtF,OAAO,EAAwB,SAAS,EAAE,YAAY,EAAE,MAAM,0CAA0C,CAAC;AACzG,OAAO,EAAE,wBAAwB,EAAE,MAAM,2EAA2E,CAAC;AAGrH,OAAO,EAAE,wBAAwB,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAC;AAGhH,OAAO,EAAE,YAAY,EAAE,MAAM,8FAA8F,CAAC;AAC5H,OAAO,EAAE,oBAAoB,EAAE,MAAM,0FAA0F,CAAC;AAEhI,OAAO,EAAE,qBAAqB,EAAE,MAAM,iFAAiF,CAAC;AACxH,OAAO,EAAE,SAAS,EAAE,MAAM,kCAAkC,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAC;AAExD,IAAM,mBAAmB,GAAzB,MAAM,mBAAoB,SAAQ,UAAU;IAgC3C,kBAAkB,CAAC,SAAgC;QACzD,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IACjD,CAAC;IAeD,YACiB,KAAuB,EACtB,QAA2B,EACf,2BAAyE;QAEtG,KAAK,EAAE,CAAC;QAJQ,UAAK,GAAL,KAAK,CAAkB;QACtB,aAAQ,GAAR,QAAQ,CAAmB;QACE,gCAA2B,GAA3B,2BAA2B,CAA6B;QAnDtF,oBAAe,GAAG,eAAe,CAAU,IAAI,EAAE,KAAK,CAAC,CAAC;QACzD,mBAAc,GAAyB,IAAI,CAAC,eAAe,CAAC;QAG3D,UAAK,GAAG,eAAe,CAAwB,IAAI,EAAE,SAAS,CAAC,CAAC;QACjE,SAAI,GAAuC,IAAI,CAAC,KAAK,CAAC;QAErD,sBAAiB,GAAG,eAAe,CAA+G,IAAI,EAAE,SAAS,CAAC,CAAC;QACpK,qBAAgB,GAAmC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE;YACpF,IAAI,IAAI,CAAC,QAAQ,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;gBAChD,OAAO,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,IAAI,EAAE,CAAC;YACtD,CAAC;iBAAM,CAAC;gBACP,cAAc;gBACd,WAAW,CAAC,EAAE,CAAC,EAAE;oBAChB,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,IAAI,EAAE,EAAE,CAAC;wBACvE,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;oBACnB,CAAC;gBACF,CAAC,CAAC,CAAC;gBACH,OAAO,EAAE,CAAC;YACX,CAAC;QACF,CAAC,CACA,CAAC;QAEc,uBAAkB,GAAG,eAAe,CAAwB,IAAI,EAAE,SAAS,CAAC,CAAC;QAE5E,qBAAgB,GAAG,eAAe,CAAwB,IAAI,EAAE,SAAS,CAAC,CAAC;QAC3E,sBAAiB,GAAG,eAAe,CAAwB,IAAI,EAAE,SAAS,CAAC,CAAC;QAG7E,oBAAe,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAMxI,6BAAwB,GAAG,IAAI,uBAAuB,EAAE,CAAC;QAEzD,kBAAa,GAAG,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE;YACvD,MAAM,YAAY,GAAG,IAAI,CAAC,2BAA2B,CAAC,kBAAkB,CAAC;gBACxE,aAAa,EAAE,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC;aACvD,CAAC,CAAC;YACH,MAAM,cAAc,GAAG,yBAAyB,CAAC,aAAa,EAAE,YAAY,CAAC,WAAW,CAAC,CAAC;YAC1F,OAAO;gBACN,YAAY;gBACZ,cAAc;aACd,CAAC;QACH,CAAC,CAAC,CAAC;QASF,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,wBAAwB,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAE3E,MAAM,oBAAoB,GAAG,gBAAgB,CAAC,sBAAsB,CAAC,CAAC;QACtE,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,gBAAgB,CAAC,GAAG,EAAE,CAAC,oBAAoB,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;QAE3G,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;YAC/B,sDAAsD;YAEtD,MAAM,oBAAoB,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACjE,IAAI,CAAC,oBAAoB,IAAI,oBAAoB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;gBAC/F,OAAO;YACR,CAAC;YAED,MAAM,8BAA8B,GAAG,oBAAoB,CAAC,qBAAqB;iBAC/E,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;iBAChD,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YAC5D,MAAM,6BAA6B,GAAG,oBAAoB,CAAC,qBAAqB;iBAC9E,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;iBAChD,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YAC5D,MAAM,2BAA2B,GAAG,oBAAoB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,CAC/E,CAAC,CAAC,8BAA8B,CAAC,GAAG,CAAC,IAAI,CAAC,6BAA6B,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;gBAC1F,IAAI,eAAe,CAClB,8BAA8B,CAAC,GAAG,CAAE,CAAC,eAAe,EACpD,6BAA6B,CAAC,GAAG,CAAE,CAAC,eAAe,EACnD,8BAA8B,CAAC,GAAG,CAAE,CAAC,MAAM,EAC3C,CAAC,CAAC,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC,EAClC,CAAC,CAAC,sBAAsB,CAAC,IAAI,CAAC,MAAM,CAAC,CACrC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAEvB,MAAM,SAAS,GAAsB,EAAE,CAAC;YAExC,IAAI,SAAS,GAAG,KAAK,CAAC;YACtB,KAAK,MAAM,QAAQ,IAAI,eAAe,CAAC,2BAA2B,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC,sBAAsB,KAAK,CAAC,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,EAAE,CAAC;gBAC7L,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACzB,SAAS,GAAG,IAAI,CAAC;oBACjB,MAAM,YAAY,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;oBACvE,MAAM,CAAC,GAAG,IAAI,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,kBAAkB,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,kBAAkB,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,sBAAsB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;oBACnO,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBACnB,CAAC;qBAAM,CAAC;oBACP,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC7B,CAAC;YACF,CAAC;YACD,IAAI,SAAS,EAAE,CAAC;gBACf,MAAM,qBAAqB,GAAG,KAAK,CAAC,QAAQ,CAAC,gBAAgB,CAC5D,oBAAoB,CAAC,qBAAqB,EAC1C,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,sBAAsB,CAAC,gBAAgB,EAAG,EAAE,OAAO,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC,CACpH,CAAC;gBACF,MAAM,qBAAqB,GAAG,KAAK,CAAC,QAAQ,CAAC,gBAAgB,CAC5D,oBAAoB,CAAC,qBAAqB,EAC1C,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,sBAAsB,CAAC,gBAAgB,EAAG,EAAE,OAAO,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC,CACpH,CAAC;gBAEF,WAAW,CAAC,EAAE,CAAC,EAAE;oBAChB,IAAI,CAAC,iBAAiB,CAAC,GAAG,CACzB;wBACC,OAAO,EAAE,SAAS;wBAClB,qBAAqB;wBACrB,qBAAqB;qBACrB,EACD,EAAE,CACF,CAAC;gBACH,CAAC,CAAC,CAAC;YACJ,CAAC;QACF,CAAC,CAAC,CAAC,CAAC;QAEJ,MAAM,sBAAsB,GAAG,CAAC,MAAqB,EAAE,EAAgB,EAAE,MAAgB,EAAE,EAAE;YAC5F,MAAM,mBAAmB,GAAG,eAAe,CAAC,SAAS,CACpD,MAAM,CAAC,OAAO,EACd,KAAK,CAAC,QAAQ,CAAC,YAAY,EAAE,EAC7B,KAAK,CAAC,QAAQ,CAAC,YAAY,EAAE,EAC7B,IAAI,CAAC,QAAQ,CAAC,oCAAoC,CAAC,IAAI,CAAC,MAAM,CAAC,EAC/D,IAAI,CAAC,QAAQ,CAAC,oCAAoC,CAAC,IAAI,CAAC,MAAM,CAAC,CAC/D,CAAC;YAEF,gCAAgC;YAChC,IAAI,cAAc,GAAmC,SAAS,CAAC;YAE/D,MAAM,oBAAoB,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,EAAE,CAAC;YAC1D,IAAI,oBAAoB,EAAE,CAAC;gBAC1B,MAAM,8BAA8B,GAAG,oBAAoB,CAAC,qBAAqB;qBAC/E,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;qBAChD,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;gBAC5D,MAAM,6BAA6B,GAAG,oBAAoB,CAAC,qBAAqB;qBAC9E,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;qBAChD,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;gBAC5D,MAAM,2BAA2B,GAAG,kBAAkB,CACrD,oBAAoB,CAAC,OAAO;qBAC1B,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE;oBACf,IAAI,CAAC,8BAA8B,CAAC,GAAG,CAAC,IAAI,CAAC,6BAA6B,CAAC,GAAG,CAAC,EAAE,CAAC;wBAAC,OAAO,SAAS,CAAC;oBAAC,CAAC;oBACtG,MAAM,MAAM,GAAG,8BAA8B,CAAC,GAAG,CAAE,CAAC,MAAM,CAAC;oBAC3D,OAAO,IAAI,eAAe,CACzB,8BAA8B,CAAC,GAAG,CAAE,CAAC,eAAe,EACpD,6BAA6B,CAAC,GAAG,CAAE,CAAC,eAAe,EACnD,MAAM;oBACN,sEAAsE;oBACtE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,mBAAmB,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,EAC7C,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,sBAAsB,CAAC,GAAG,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC,mBAAmB,CAAC,GAAG,EAAE,CAAC,CAC9E,CAAC;gBACH,CAAC,CACA,CAAC,MAAM,CAAC,SAAS,CAAC,EACpB,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,kBAAkB,IAAI,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,SAAS,IAAI,GAAG,CAAC,kBAAkB,IAAI,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,SAAS,CAAC,CAClK,CAAC;gBAEF,IAAI,aAAa,GAAG,2BAA2B,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,gBAAgB,CAAC,CAAC,CAAC,sBAAsB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gBACnJ,aAAa,GAAG,gBAAgB,CAAC,IAAI,CAAC,aAAa,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;gBACjK,cAAc,GAAG,gBAAgB,CAAC,OAAO,CAAC,aAAa,EAAE,KAAK,CAAC,QAAQ,CAAC,YAAY,EAAE,EAAE,KAAK,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC,CAAC;YACxH,CAAC;YAED,MAAM,oBAAoB,GAAG,EAAE,CAAC;YAChC,IAAI,cAAc,EAAE,CAAC;gBACpB,KAAK,MAAM,CAAC,IAAI,mBAAmB,EAAE,CAAC;oBACrC,MAAM,YAAY,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC;oBAChK,oBAAoB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,gBAAgB,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,CAAC;gBACpE,CAAC;YACF,CAAC;iBAAM,CAAC;gBACP,oBAAoB,CAAC,IAAI,CAAC,GAAG,mBAAmB,CAAC,CAAC;YACnD,CAAC;YAED,MAAM,qBAAqB,GAAG,KAAK,CAAC,QAAQ,CAAC,gBAAgB,CAC5D,oBAAoB,EAAE,qBAAqB,IAAI,EAAE,EACjD,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,sBAAsB,CAAC,gBAAgB,EAAG,EAAE,OAAO,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC,CAC/H,CAAC;YACF,MAAM,qBAAqB,GAAG,KAAK,CAAC,QAAQ,CAAC,gBAAgB,CAC5D,oBAAoB,EAAE,qBAAqB,IAAI,EAAE,EACjD,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,sBAAsB,CAAC,gBAAgB,EAAG,EAAE,OAAO,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC,CAC/H,CAAC;YAEF,IAAI,CAAC,iBAAiB,CAAC,GAAG,CACzB;gBACC,OAAO,EAAE,oBAAoB;gBAC7B,qBAAqB;gBACrB,qBAAqB;aACrB,EACD,EAAE,CACF,CAAC;QACH,CAAC,CAAC;QAEF,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,EAAE;YACtD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;YAC9B,IAAI,IAAI,EAAE,CAAC;gBACV,MAAM,SAAS,GAAG,YAAY,CAAC,uBAAuB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;gBAClE,MAAM,MAAM,GAAG,kBAAkB,CAAC,IAAI,CAAC,SAAU,EAAE,SAAS,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;gBAC9F,IAAI,MAAM,EAAE,CAAC;oBACZ,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC;oBACxB,WAAW,CAAC,EAAE,CAAC,EAAE;wBAChB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,SAAU,CAAC,EAAE,EAAE,CAAC,CAAC;wBAC9D,sBAAsB,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;wBACnC,MAAM,sBAAsB,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAAC;wBAC7D,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC,CAAC,IAAI,CAAC,SAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC,QAAQ,CAAC,SAAS,CAAC,sBAAsB,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;oBAChM,CAAC,CAAC,CAAC;gBACJ,CAAC;YACF,CAAC;YAED,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;YAC3C,SAAS,CAAC,QAAQ,EAAE,CAAC;QACtB,CAAC,CAAC,CAAC,CAAC;QACJ,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,EAAE;YACtD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;YAC9B,IAAI,IAAI,EAAE,CAAC;gBACV,MAAM,SAAS,GAAG,YAAY,CAAC,uBAAuB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;gBAClE,MAAM,MAAM,GAAG,kBAAkB,CAAC,IAAI,CAAC,SAAU,EAAE,SAAS,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;gBAC9F,IAAI,MAAM,EAAE,CAAC;oBACZ,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC;oBACxB,WAAW,CAAC,EAAE,CAAC,EAAE;wBAChB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,SAAU,CAAC,EAAE,EAAE,CAAC,CAAC;wBAC9D,sBAAsB,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;wBACnC,MAAM,sBAAsB,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAAC;wBAC7D,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC,CAAC,IAAI,CAAC,SAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC,QAAQ,CAAC,SAAS,CAAC,sBAAsB,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;oBAChM,CAAC,CAAC,CAAC;gBACJ,CAAC;YACF,CAAC;YAED,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;YAC3C,SAAS,CAAC,QAAQ,EAAE,CAAC;QACtB,CAAC,CAAC,CAAC,CAAC;QAEJ,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE;YACvD,gCAAgC;YAEhC,yDAAyD;YACzD,IAAI,CAAC,QAAQ,CAAC,oCAAoC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAChE,IAAI,CAAC,QAAQ,CAAC,oCAAoC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAEhE,SAAS,CAAC,MAAM,EAAE,CAAC;YACnB,oBAAoB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAClC,MAAM,oBAAoB,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC7D,oBAAoB,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAEjD,uBAAuB,CAAC,wBAAwB,EAAE,MAAM,CAAC,CAAC;YAC1D,uBAAuB,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;YAEvD,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;YAE3C,IAAI,qBAAqB,GAAmB,EAAE,CAAC;YAC/C,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,EAAE;gBACjD,MAAM,KAAK,GAAG,YAAY,CAAC,uBAAuB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;gBAC9D,qBAAqB,GAAG,oBAAoB,CAAC,qBAAqB,EAAE,KAAK,CAAC,CAAC;YAC5E,CAAC,CAAC,CAAC,CAAC;YAEJ,IAAI,qBAAqB,GAAmB,EAAE,CAAC;YAC/C,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,EAAE;gBACjD,MAAM,KAAK,GAAG,YAAY,CAAC,uBAAuB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;gBAC9D,qBAAqB,GAAG,oBAAoB,CAAC,qBAAqB,EAAE,KAAK,CAAC,CAAC;YAC5E,CAAC,CAAC,CAAC,CAAC;YAEJ,IAAI,MAAM,GAAG,MAAM,oBAAoB,CAAC,YAAY,CAAC,WAAW,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE;gBAChG,oBAAoB,EAAE,IAAI,CAAC,QAAQ,CAAC,oBAAoB,CAAC,IAAI,CAAC,MAAM,CAAC;gBACrE,oBAAoB,EAAE,IAAI,CAAC,QAAQ,CAAC,oBAAoB,CAAC,IAAI,CAAC,MAAM,CAAC;gBACrE,YAAY,EAAE,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC;aAClD,EAAE,IAAI,CAAC,wBAAwB,CAAC,KAAK,CAAC,CAAC;YAExC,IAAI,IAAI,CAAC,wBAAwB,CAAC,KAAK,CAAC,uBAAuB,EAAE,CAAC;gBACjE,OAAO;YACR,CAAC;YACD,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,EAAE,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC;gBAChE,qBAAqB;gBACrB,OAAO;YACR,CAAC;YACD,MAAM,GAAG,qBAAqB,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;YACvE,MAAM,GAAG,kBAAkB,CAAC,MAAM,EAAE,qBAAqB,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC;YACrG,MAAM,GAAG,kBAAkB,CAAC,MAAM,EAAE,qBAAqB,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC;YAErG,WAAW,CAAC,EAAE,CAAC,EAAE;gBAChB,qCAAqC;gBACrC,sBAAsB,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;gBAEnC,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC;gBACxB,MAAM,KAAK,GAAG,SAAS,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;gBAC/C,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBAC1B,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gBACnC,MAAM,sBAAsB,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACvE,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC,QAAQ,CAAC,SAAS,CAAC,sBAAsB,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;YAC/L,CAAC,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,2BAA2B,CAAC,UAAkB,EAAE,UAA4B,EAAE,EAA4B;QAChH,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5C,OAAO;QACR,CAAC;QACD,MAAM,gBAAgB,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,EAAE,EAAE,OAAO,IAAI,EAAE,CAAC;QACrE,KAAK,MAAM,CAAC,IAAI,gBAAgB,EAAE,CAAC;YAClC,IAAI,CAAC,CAAC,sBAAsB,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC9D,CAAC,CAAC,gBAAgB,CAAC,UAAU,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC;gBAC/C,OAAO;YACR,CAAC;QACF,CAAC;IACF,CAAC;IAEM,2BAA2B,CAAC,UAAkB,EAAE,UAA4B,EAAE,EAA4B;QAChH,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5C,OAAO;QACR,CAAC;QACD,MAAM,gBAAgB,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,EAAE,EAAE,OAAO,IAAI,EAAE,CAAC;QACrE,KAAK,MAAM,CAAC,IAAI,gBAAgB,EAAE,CAAC;YAClC,IAAI,CAAC,CAAC,sBAAsB,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC9D,CAAC,CAAC,gBAAgB,CAAC,UAAU,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC;gBAC/C,OAAO;YACR,CAAC;QACF,CAAC;IACF,CAAC;IAEM,KAAK,CAAC,WAAW;QACvB,MAAM,YAAY,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACjD,CAAC;IAEM,cAAc;QACpB,MAAM,OAAO,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,EAAE,CAAC;QAC7C,OAAO;YACN,gBAAgB,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,sBAAsB,CAAC,SAAS,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;SACzG,CAAC;IACH,CAAC;IAEM,sBAAsB,CAAC,KAAsB;QACnD,MAAM,MAAM,GAAG,KAAK,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;QAChF,MAAM,OAAO,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,EAAE,CAAC;QAC7C,IAAI,CAAC,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC;YACzB,OAAO;QACR,CAAC;QACD,WAAW,CAAC,EAAE,CAAC,EAAE;YAChB,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;gBACjC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;oBAC5B,IAAI,CAAC,CAAC,sBAAsB,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;wBAC/C,CAAC,CAAC,sBAAsB,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;wBACpC,MAAM;oBACP,CAAC;gBACF,CAAC;YACF,CAAC;QACF,CAAC,CAAC,CAAC;IACJ,CAAC;CACD,CAAA;AA1VY,mBAAmB;IAoD7B,WAAA,2BAA2B,CAAA;GApDjB,mBAAmB,CA0V/B;;AAED,SAAS,qBAAqB,CAAC,IAAmB,EAAE,QAAoB,EAAE,QAAoB;IAC7F,OAAO;QACN,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,wBAAwB,CAC1D,CAAC,CAAC,QAAQ,EACV,CAAC,CAAC,QAAQ,EACV,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,qBAAqB,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAClG,CAAC;QACF,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,SAAS,EAAE,IAAI,CAAC,SAAS;KACzB,CAAC;AACH,CAAC;AAED,SAAS,qBAAqB,CAAC,YAA0B,EAAE,QAAoB,EAAE,QAAoB;IACpG,IAAI,aAAa,GAAG,YAAY,CAAC,aAAa,CAAC;IAC/C,IAAI,aAAa,GAAG,YAAY,CAAC,aAAa,CAAC;IAC/C,IACC,aAAa,CAAC,WAAW,KAAK,CAAC,IAAI,aAAa,CAAC,WAAW,KAAK,CAAC;QAClE,CAAC,aAAa,CAAC,SAAS,KAAK,CAAC,IAAI,aAAa,CAAC,SAAS,KAAK,CAAC,CAAC;QAChE,aAAa,CAAC,SAAS,KAAK,QAAQ,CAAC,gBAAgB,CAAC,aAAa,CAAC,aAAa,CAAC;WAC/E,aAAa,CAAC,SAAS,KAAK,QAAQ,CAAC,gBAAgB,CAAC,aAAa,CAAC,aAAa,CAAC;WAClF,aAAa,CAAC,aAAa,GAAG,QAAQ,CAAC,YAAY,EAAE;WACrD,aAAa,CAAC,aAAa,GAAG,QAAQ,CAAC,YAAY,EAAE,EACvD,CAAC;QACF,aAAa,GAAG,aAAa,CAAC,cAAc,CAAC,aAAa,CAAC,aAAa,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QACjF,aAAa,GAAG,aAAa,CAAC,cAAc,CAAC,aAAa,CAAC,aAAa,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAClF,CAAC;IACD,OAAO,IAAI,YAAY,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;AACvD,CAAC;AAMD,MAAM,OAAO,SAAS;IACd,MAAM,CAAC,cAAc,CAAC,MAAqB;QACjD,OAAO,IAAI,SAAS,CACnB,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,EAC3C,MAAM,CAAC,KAAK,IAAI,EAAE,EAClB,MAAM,CAAC,SAAS,EAChB,MAAM,CAAC,SAAS,CAChB,CAAC;IACH,CAAC;IAED,YACiB,QAAgC,EAChC,UAAgC,EAChC,SAAkB,EAClB,SAAkB;QAHlB,aAAQ,GAAR,QAAQ,CAAwB;QAChC,eAAU,GAAV,UAAU,CAAsB;QAChC,cAAS,GAAT,SAAS,CAAS;QAClB,cAAS,GAAT,SAAS,CAAS;IAC/B,CAAC;CACL;AAED,MAAM,OAAO,WAAW;IACvB,YACU,gBAA0C;QAA1C,qBAAgB,GAAhB,gBAAgB,CAA0B;QAEnD;;;;;;;;;;;;;;;;;UAiBE;IACH,CAAC;CACD;AAED,MAAM,OAAO,eAAe;IACpB,MAAM,CAAC,SAAS,CACtB,OAA4C,EAC5C,iBAAyB,EACzB,iBAAyB,EACzB,kBAA0B,EAC1B,UAAkB;QAElB,MAAM,gBAAgB,GAAG,wBAAwB,CAAC,OAAO,CAAC,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,CAAC,CAAC;QACzG,MAAM,MAAM,GAAsB,EAAE,CAAC;QAErC,KAAK,MAAM,OAAO,IAAI,gBAAgB,EAAE,CAAC;YACxC,IAAI,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC;YACjD,IAAI,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC;YAChD,IAAI,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;YAErC,MAAM,OAAO,GAAG,SAAS,KAAK,CAAC,IAAI,QAAQ,KAAK,CAAC,CAAC;YAClD,MAAM,KAAK,GAAG,SAAS,GAAG,MAAM,KAAK,iBAAiB,GAAG,CAAC,IAAI,QAAQ,GAAG,MAAM,KAAK,iBAAiB,GAAG,CAAC,CAAC;YAE1G,IAAI,CAAC,OAAO,IAAI,KAAK,CAAC,IAAI,MAAM,IAAI,UAAU,GAAG,kBAAkB,EAAE,CAAC;gBACrE,IAAI,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC;oBACvB,MAAM,IAAI,UAAU,CAAC;gBACtB,CAAC;gBACD,IAAI,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC;oBACvB,SAAS,IAAI,UAAU,CAAC;oBACxB,QAAQ,IAAI,UAAU,CAAC;oBACvB,MAAM,IAAI,UAAU,CAAC;gBACtB,CAAC;gBACD,MAAM,CAAC,IAAI,CAAC,IAAI,eAAe,CAAC,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACrE,CAAC;iBAAM,IAAI,MAAM,IAAI,UAAU,GAAG,CAAC,GAAG,kBAAkB,EAAE,CAAC;gBAC1D,SAAS,IAAI,UAAU,CAAC;gBACxB,QAAQ,IAAI,UAAU,CAAC;gBACvB,MAAM,IAAI,UAAU,GAAG,CAAC,CAAC;gBACzB,MAAM,CAAC,IAAI,CAAC,IAAI,eAAe,CAAC,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACrE,CAAC;QACF,CAAC;QAED,OAAO,MAAM,CAAC;IACf,CAAC;IAED,IAAW,sBAAsB;QAChC,OAAO,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,kBAAkB,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IACpE,CAAC;IAED,IAAW,sBAAsB;QAChC,OAAO,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,kBAAkB,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IACpE,CAAC;IAaD,YACiB,kBAA0B,EAC1B,kBAA0B,EAC1B,SAAiB,EACjC,mBAA2B,EAC3B,sBAA8B;QAJd,uBAAkB,GAAlB,kBAAkB,CAAQ;QAC1B,uBAAkB,GAAlB,kBAAkB,CAAQ;QAC1B,cAAS,GAAT,SAAS,CAAQ;QAdjB,yBAAoB,GAAG,eAAe,CAAS,IAAI,EAAE,CAAC,CAAC,CAAC;QACzD,wBAAmB,GAAgC,IAAI,CAAC,oBAAoB,CAAC;QAE5E,4BAAuB,GAAG,eAAe,CAAS,IAAI,EAAE,CAAC,CAAC,CAAC;QAC5D,2BAAsB,GAAgC,IAAI,CAAC,uBAAuB,CAAC;QAElF,wBAAmB,GAAG,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC,6BAA6B,CAC3F,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QAEtH,cAAS,GAAG,eAAe,CAA+B,IAAI,EAAE,SAAS,CAAC,CAAC;QAS1F,MAAM,oBAAoB,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,mBAAmB,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC;QACxF,MAAM,uBAAuB,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,sBAAsB,EAAE,IAAI,CAAC,SAAS,GAAG,mBAAmB,CAAC,EAAE,CAAC,CAAC,CAAC;QAEpH,UAAU,CAAC,mBAAmB,KAAK,oBAAoB,CAAC,CAAC;QACzD,UAAU,CAAC,sBAAsB,KAAK,uBAAuB,CAAC,CAAC;QAE/D,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,oBAAoB,EAAE,SAAS,CAAC,CAAC;QAC/D,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,uBAAuB,EAAE,SAAS,CAAC,CAAC;IACtE,CAAC;IAEM,gBAAgB,CAAC,aAAiC,EAAE,EAAgB;QAC1E,MAAM,MAAM,GAAsB,EAAE,CAAC;QAErC,MAAM,cAAc,GAAG,IAAI,YAAY,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QAEtH,IAAI,uBAAuB,GAAG,IAAI,CAAC,kBAAkB,CAAC;QACtD,IAAI,uBAAuB,GAAG,IAAI,CAAC,kBAAkB,CAAC;QACtD,MAAM,uBAAuB,GAAG,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,SAAS,CAAC;QACzE,IAAI,cAAc,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACjB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC;aAAM,CAAC;YACP,IAAI,CAAC,GAAG,CAAC,CAAC;YACV,KAAK,MAAM,CAAC,IAAI,cAAc,CAAC,MAAM,EAAE,CAAC;gBACvC,MAAM,MAAM,GAAG,CAAC,KAAK,cAAc,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;gBACtD,CAAC,EAAE,CAAC;gBAEJ,MAAM,MAAM,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,CAAC,CAAC,sBAAsB,CAAC,GAAG,uBAAuB,CAAC;gBAEvG,MAAM,IAAI,GAAG,IAAI,eAAe,CAAC,uBAAuB,EAAE,uBAAuB,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;gBACjG,IAAI,CAAC,sBAAsB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACnC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAElB,uBAAuB,GAAG,IAAI,CAAC,sBAAsB,CAAC,sBAAsB,CAAC;gBAC7E,uBAAuB,GAAG,IAAI,CAAC,sBAAsB,CAAC,sBAAsB,CAAC;YAC9E,CAAC;QACF,CAAC;QAED,OAAO,MAAM,CAAC;IACf,CAAC;IAEM,kBAAkB,CAAC,MAA2B;QACpD,OAAO,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC9C,CAAC;IAEM,sBAAsB,CAAC,MAA2B;QACxD,OAAO,SAAS,CAAC,QAAQ,CACxB,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,MAAM,CAAC,EAChE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,MAAM,CAAC,CACnG,CAAC;IACH,CAAC;IAEM,sBAAsB,CAAC,MAA2B;QACxD,OAAO,SAAS,CAAC,QAAQ,CACxB,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,MAAM,CAAC,EAChE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,MAAM,CAAC,CACnG,CAAC;IACH,CAAC;IAEM,sBAAsB,CAAC,KAAgB,EAAE,EAAgB;QAC/D,MAAM,mBAAmB,GAAG,KAAK,CAAC,eAAe,GAAG,IAAI,CAAC,kBAAkB,CAAC;QAC5E,MAAM,sBAAsB,GAAG,CAAC,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,KAAK,CAAC,sBAAsB,CAAC;QACzG,IAAI,CAAC,QAAQ,CAAC,mBAAmB,EAAE,sBAAsB,EAAE,EAAE,CAAC,CAAC;IAChE,CAAC;IAEM,yBAAyB;QAC/B,OAAO,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,uBAAuB,CAAC,GAAG,EAAE,CAAC;IAC5D,CAAC;IAEM,4BAA4B;QAClC,OAAO,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,EAAE,CAAC;IACzD,CAAC;IAEM,aAAa,CAAC,KAAK,GAAG,EAAE,EAAE,EAA4B;QAC5D,MAAM,sBAAsB,GAAG,IAAI,CAAC,yBAAyB,EAAE,CAAC;QAChE,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,oBAAoB,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,sBAAsB,CAAC,EAAE,EAAE,CAAC,CAAC;IAC9G,CAAC;IAEM,aAAa,CAAC,KAAK,GAAG,EAAE,EAAE,EAA4B;QAC5D,MAAM,yBAAyB,GAAG,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,EAAE,CAAC;QACnF,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,uBAAuB,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,yBAAyB,CAAC,EAAE,EAAE,CAAC,CAAC;IACvH,CAAC;IAEM,OAAO,CAAC,EAA4B;QAC1C,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;IACxF,CAAC;IAEM,gBAAgB,CAAC,UAAkB,EAAE,UAA4B,EAAE,EAA4B;QACrG,MAAM,GAAG,GAAG,UAAU,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,EAAE,CAAC,CAAC;QACzF,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,uBAAuB,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,UAAU,CAAC;QAC5G,IAAI,UAAU,4CAAoC,IAAI,GAAG,GAAG,MAAM,IAAI,UAAU,qCAA6B,EAAE,CAAC;YAC/G,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC,oBAAoB,CAAC,GAAG,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,CAAC;QAC1E,CAAC;aAAM,CAAC;YACP,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,IAAI,CAAC,uBAAuB,CAAC,GAAG,EAAE,GAAG,MAAM,EAAE,EAAE,CAAC,CAAC;QACnF,CAAC;IACF,CAAC;IAEM,gBAAgB,CAAC,UAAkB,EAAE,UAA4B,EAAE,EAA4B;QACrG,MAAM,GAAG,GAAG,UAAU,GAAG,IAAI,CAAC,kBAAkB,CAAC;QACjD,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,UAAU,CAAC;QACvE,IAAI,UAAU,4CAAoC,IAAI,GAAG,GAAG,MAAM,IAAI,UAAU,qCAA6B,EAAE,CAAC;YAC/G,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,oBAAoB,CAAC,GAAG,EAAE,GAAG,MAAM,GAAG,GAAG,EAAE,IAAI,CAAC,yBAAyB,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QAC/H,CAAC;aAAM,CAAC;YACP,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,uBAAuB,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,MAAM,EAAE,IAAI,CAAC,4BAA4B,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QACxI,CAAC;IACF,CAAC;IAEM,WAAW,CAAC,EAA4B;QAC9C,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACrC,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACzC,CAAC;IAEM,QAAQ,CAAC,mBAA2B,EAAE,sBAA8B,EAAE,EAA4B;QACxG,mBAAmB,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,mBAAmB,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC;QACjF,sBAAsB,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,sBAAsB,EAAE,IAAI,CAAC,SAAS,GAAG,mBAAmB,CAAC,EAAE,CAAC,CAAC,CAAC;QAE7G,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;QACvD,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,sBAAsB,EAAE,EAAE,CAAC,CAAC;IAC9D,CAAC;CACD;AAQD,SAAS,kBAAkB,CAAC,IAAmB,EAAE,SAAyB,EAAE,iBAA6B,EAAE,iBAA6B;IACvI,OAAO,SAAS,CAAC;IACjB;;;;;;;;;;;yBAWqB;AACtB,CAAC;AACD;;;;;;;;;EASE;AACF,SAAS,kBAAkB,CAAC,IAAmB,EAAE,SAAyB,EAAE,iBAA6B,EAAE,iBAA6B;IACvI,OAAO,SAAS,CAAC;IACjB;;;;;;;;;;;;;;;;;;;;;;;;;QAyBI;AACL,CAAC;AACD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmEE","file":"diffEditorViewModel.js","sourceRoot":"file:///mnt/vss/_work/1/s/dependencies/vscode/out-editor-src","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { RunOnceScheduler } from '../../../../base/common/async.js';\nimport { CancellationTokenSource } from '../../../../base/common/cancellation.js';\nimport { Disposable, toDisposable } from '../../../../base/common/lifecycle.js';\nimport { IObservable, IReader, ISettableObservable, ITransaction, autorun, autorunWithStore, derived, observableSignal, observableSignalFromEvent, observableValue, transaction, waitForState } from '../../../../base/common/observable.js';\nimport { IDiffProviderFactoryService } from './diffProviderFactoryService.js';\nimport { filterWithPrevious } from './utils.js';\nimport { readHotReloadableExport } from '../../../../base/common/hotReloadHelpers.js';\nimport { ISerializedLineRange, LineRange, LineRangeSet } from '../../../common/core/ranges/lineRange.js';\nimport { DefaultLinesDiffComputer } from '../../../common/diff/defaultLinesDiffComputer/defaultLinesDiffComputer.js';\nimport { IDocumentDiff } from '../../../common/diff/documentDiffProvider.js';\nimport { MovedText } from '../../../common/diff/linesDiffComputer.js';\nimport { DetailedLineRangeMapping, LineRangeMapping, RangeMapping } from '../../../common/diff/rangeMapping.js';\nimport { IDiffEditorModel, IDiffEditorViewModel } from '../../../common/editorCommon.js';\nimport { ITextModel } from '../../../common/model.js';\nimport { TextEditInfo } from '../../../common/model/bracketPairsTextModelPart/bracketPairsTree/beforeEditPositionMapper.js';\nimport { combineTextEditInfos } from '../../../common/model/bracketPairsTextModelPart/bracketPairsTree/combineTextEditInfos.js';\nimport { DiffEditorOptions } from './diffEditorOptions.js';\nimport { optimizeSequenceDiffs } from '../../../common/diff/defaultLinesDiffComputer/heuristicSequenceOptimizations.js';\nimport { isDefined } from '../../../../base/common/types.js';\nimport { groupAdjacentBy } from '../../../../base/common/arrays.js';\nimport { softAssert } from '../../../../base/common/assert.js';\n\nexport class DiffEditorViewModel extends Disposable implements IDiffEditorViewModel {\n\tprivate readonly _isDiffUpToDate = observableValue<boolean>(this, false);\n\tpublic readonly isDiffUpToDate: IObservable<boolean> = this._isDiffUpToDate;\n\n\tprivate _lastDiff: IDocumentDiff | undefined;\n\tprivate readonly _diff = observableValue<DiffState | undefined>(this, undefined);\n\tpublic readonly diff: IObservable<DiffState | undefined> = this._diff;\n\n\tprivate readonly _unchangedRegions = observableValue<{ regions: UnchangedRegion[]; originalDecorationIds: string[]; modifiedDecorationIds: string[] } | undefined>(this, undefined);\n\tpublic readonly unchangedRegions: IObservable<UnchangedRegion[]> = derived(this, r => {\n\t\tif (this._options.hideUnchangedRegions.read(r)) {\n\t\t\treturn this._unchangedRegions.read(r)?.regions ?? [];\n\t\t} else {\n\t\t\t// Reset state\n\t\t\ttransaction(tx => {\n\t\t\t\tfor (const r of this._unchangedRegions.read(undefined)?.regions || []) {\n\t\t\t\t\tr.collapseAll(tx);\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn [];\n\t\t}\n\t}\n\t);\n\n\tpublic readonly movedTextToCompare = observableValue<MovedText | undefined>(this, undefined);\n\n\tprivate readonly _activeMovedText = observableValue<MovedText | undefined>(this, undefined);\n\tprivate readonly _hoveredMovedText = observableValue<MovedText | undefined>(this, undefined);\n\n\n\tpublic readonly activeMovedText = derived(this, r => this.movedTextToCompare.read(r) ?? this._hoveredMovedText.read(r) ?? this._activeMovedText.read(r));\n\n\tpublic setActiveMovedText(movedText: MovedText | undefined): void {\n\t\tthis._activeMovedText.set(movedText, undefined);\n\t}\n\n\tprivate readonly _cancellationTokenSource = new CancellationTokenSource();\n\n\tprivate readonly _diffProvider = derived(this, reader => {\n\t\tconst diffProvider = this._diffProviderFactoryService.createDiffProvider({\n\t\t\tdiffAlgorithm: this._options.diffAlgorithm.read(reader)\n\t\t});\n\t\tconst onChangeSignal = observableSignalFromEvent('onDidChange', diffProvider.onDidChange);\n\t\treturn {\n\t\t\tdiffProvider,\n\t\t\tonChangeSignal,\n\t\t};\n\t});\n\n\tconstructor(\n\t\tpublic readonly model: IDiffEditorModel,\n\t\tprivate readonly _options: DiffEditorOptions,\n\t\t@IDiffProviderFactoryService private readonly _diffProviderFactoryService: IDiffProviderFactoryService,\n\t) {\n\t\tsuper();\n\n\t\tthis._register(toDisposable(() => this._cancellationTokenSource.cancel()));\n\n\t\tconst contentChangedSignal = observableSignal('contentChangedSignal');\n\t\tconst debouncer = this._register(new RunOnceScheduler(() => contentChangedSignal.trigger(undefined), 200));\n\n\t\tthis._register(autorun(reader => {\n\t\t\t/** @description collapse touching unchanged ranges */\n\n\t\t\tconst lastUnchangedRegions = this._unchangedRegions.read(reader);\n\t\t\tif (!lastUnchangedRegions || lastUnchangedRegions.regions.some(r => r.isDragged.read(reader))) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst lastUnchangedRegionsOrigRanges = lastUnchangedRegions.originalDecorationIds\n\t\t\t\t.map(id => model.original.getDecorationRange(id))\n\t\t\t\t.map(r => r ? LineRange.fromRangeInclusive(r) : undefined);\n\t\t\tconst lastUnchangedRegionsModRanges = lastUnchangedRegions.modifiedDecorationIds\n\t\t\t\t.map(id => model.modified.getDecorationRange(id))\n\t\t\t\t.map(r => r ? LineRange.fromRangeInclusive(r) : undefined);\n\t\t\tconst updatedLastUnchangedRegions = lastUnchangedRegions.regions.map((r, idx) =>\n\t\t\t\t(!lastUnchangedRegionsOrigRanges[idx] || !lastUnchangedRegionsModRanges[idx]) ? undefined :\n\t\t\t\t\tnew UnchangedRegion(\n\t\t\t\t\t\tlastUnchangedRegionsOrigRanges[idx]!.startLineNumber,\n\t\t\t\t\t\tlastUnchangedRegionsModRanges[idx]!.startLineNumber,\n\t\t\t\t\t\tlastUnchangedRegionsOrigRanges[idx]!.length,\n\t\t\t\t\t\tr.visibleLineCountTop.read(reader),\n\t\t\t\t\t\tr.visibleLineCountBottom.read(reader),\n\t\t\t\t\t)).filter(isDefined);\n\n\t\t\tconst newRanges: UnchangedRegion[] = [];\n\n\t\t\tlet didChange = false;\n\t\t\tfor (const touching of groupAdjacentBy(updatedLastUnchangedRegions, (a, b) => a.getHiddenModifiedRange(reader).endLineNumberExclusive === b.getHiddenModifiedRange(reader).startLineNumber)) {\n\t\t\t\tif (touching.length > 1) {\n\t\t\t\t\tdidChange = true;\n\t\t\t\t\tconst sumLineCount = touching.reduce((sum, r) => sum + r.lineCount, 0);\n\t\t\t\t\tconst r = new UnchangedRegion(touching[0].originalLineNumber, touching[0].modifiedLineNumber, sumLineCount, touching[0].visibleLineCountTop.read(undefined), touching[touching.length - 1].visibleLineCountBottom.read(undefined));\n\t\t\t\t\tnewRanges.push(r);\n\t\t\t\t} else {\n\t\t\t\t\tnewRanges.push(touching[0]);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (didChange) {\n\t\t\t\tconst originalDecorationIds = model.original.deltaDecorations(\n\t\t\t\t\tlastUnchangedRegions.originalDecorationIds,\n\t\t\t\t\tnewRanges.map(r => ({ range: r.originalUnchangedRange.toInclusiveRange()!, options: { description: 'unchanged' } }))\n\t\t\t\t);\n\t\t\t\tconst modifiedDecorationIds = model.modified.deltaDecorations(\n\t\t\t\t\tlastUnchangedRegions.modifiedDecorationIds,\n\t\t\t\t\tnewRanges.map(r => ({ range: r.modifiedUnchangedRange.toInclusiveRange()!, options: { description: 'unchanged' } }))\n\t\t\t\t);\n\n\t\t\t\ttransaction(tx => {\n\t\t\t\t\tthis._unchangedRegions.set(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tregions: newRanges,\n\t\t\t\t\t\t\toriginalDecorationIds,\n\t\t\t\t\t\t\tmodifiedDecorationIds\n\t\t\t\t\t\t},\n\t\t\t\t\t\ttx\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t}\n\t\t}));\n\n\t\tconst updateUnchangedRegions = (result: IDocumentDiff, tx: ITransaction, reader?: IReader) => {\n\t\t\tconst newUnchangedRegions = UnchangedRegion.fromDiffs(\n\t\t\t\tresult.changes,\n\t\t\t\tmodel.original.getLineCount(),\n\t\t\t\tmodel.modified.getLineCount(),\n\t\t\t\tthis._options.hideUnchangedRegionsMinimumLineCount.read(reader),\n\t\t\t\tthis._options.hideUnchangedRegionsContextLineCount.read(reader),\n\t\t\t);\n\n\t\t\t// Transfer state from cur state\n\t\t\tlet visibleRegions: LineRangeMapping[] | undefined = undefined;\n\n\t\t\tconst lastUnchangedRegions = this._unchangedRegions.get();\n\t\t\tif (lastUnchangedRegions) {\n\t\t\t\tconst lastUnchangedRegionsOrigRanges = lastUnchangedRegions.originalDecorationIds\n\t\t\t\t\t.map(id => model.original.getDecorationRange(id))\n\t\t\t\t\t.map(r => r ? LineRange.fromRangeInclusive(r) : undefined);\n\t\t\t\tconst lastUnchangedRegionsModRanges = lastUnchangedRegions.modifiedDecorationIds\n\t\t\t\t\t.map(id => model.modified.getDecorationRange(id))\n\t\t\t\t\t.map(r => r ? LineRange.fromRangeInclusive(r) : undefined);\n\t\t\t\tconst updatedLastUnchangedRegions = filterWithPrevious(\n\t\t\t\t\tlastUnchangedRegions.regions\n\t\t\t\t\t\t.map((r, idx) => {\n\t\t\t\t\t\t\tif (!lastUnchangedRegionsOrigRanges[idx] || !lastUnchangedRegionsModRanges[idx]) { return undefined; }\n\t\t\t\t\t\t\tconst length = lastUnchangedRegionsOrigRanges[idx]!.length;\n\t\t\t\t\t\t\treturn new UnchangedRegion(\n\t\t\t\t\t\t\t\tlastUnchangedRegionsOrigRanges[idx]!.startLineNumber,\n\t\t\t\t\t\t\t\tlastUnchangedRegionsModRanges[idx]!.startLineNumber,\n\t\t\t\t\t\t\t\tlength,\n\t\t\t\t\t\t\t\t// The visible area can shrink by edits -> we have to account for this\n\t\t\t\t\t\t\t\tMath.min(r.visibleLineCountTop.get(), length),\n\t\t\t\t\t\t\t\tMath.min(r.visibleLineCountBottom.get(), length - r.visibleLineCountTop.get()),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\t).filter(isDefined),\n\t\t\t\t\t(cur, prev) => !prev || (cur.modifiedLineNumber >= prev.modifiedLineNumber + prev.lineCount && cur.originalLineNumber >= prev.originalLineNumber + prev.lineCount)\n\t\t\t\t);\n\n\t\t\t\tlet hiddenRegions = updatedLastUnchangedRegions.map(r => new LineRangeMapping(r.getHiddenOriginalRange(reader), r.getHiddenModifiedRange(reader)));\n\t\t\t\thiddenRegions = LineRangeMapping.clip(hiddenRegions, LineRange.ofLength(1, model.original.getLineCount()), LineRange.ofLength(1, model.modified.getLineCount()));\n\t\t\t\tvisibleRegions = LineRangeMapping.inverse(hiddenRegions, model.original.getLineCount(), model.modified.getLineCount());\n\t\t\t}\n\n\t\t\tconst newUnchangedRegions2 = [];\n\t\t\tif (visibleRegions) {\n\t\t\t\tfor (const r of newUnchangedRegions) {\n\t\t\t\t\tconst intersecting = visibleRegions.filter(f => f.original.intersectsStrict(r.originalUnchangedRange) && f.modified.intersectsStrict(r.modifiedUnchangedRange));\n\t\t\t\t\tnewUnchangedRegions2.push(...r.setVisibleRanges(intersecting, tx));\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tnewUnchangedRegions2.push(...newUnchangedRegions);\n\t\t\t}\n\n\t\t\tconst originalDecorationIds = model.original.deltaDecorations(\n\t\t\t\tlastUnchangedRegions?.originalDecorationIds || [],\n\t\t\t\tnewUnchangedRegions2.map(r => ({ range: r.originalUnchangedRange.toInclusiveRange()!, options: { description: 'unchanged' } }))\n\t\t\t);\n\t\t\tconst modifiedDecorationIds = model.modified.deltaDecorations(\n\t\t\t\tlastUnchangedRegions?.modifiedDecorationIds || [],\n\t\t\t\tnewUnchangedRegions2.map(r => ({ range: r.modifiedUnchangedRange.toInclusiveRange()!, options: { description: 'unchanged' } }))\n\t\t\t);\n\n\t\t\tthis._unchangedRegions.set(\n\t\t\t\t{\n\t\t\t\t\tregions: newUnchangedRegions2,\n\t\t\t\t\toriginalDecorationIds,\n\t\t\t\t\tmodifiedDecorationIds\n\t\t\t\t},\n\t\t\t\ttx\n\t\t\t);\n\t\t};\n\n\t\tthis._register(model.modified.onDidChangeContent((e) => {\n\t\t\tconst diff = this._diff.get();\n\t\t\tif (diff) {\n\t\t\t\tconst textEdits = TextEditInfo.fromModelContentChanges(e.changes);\n\t\t\t\tconst result = applyModifiedEdits(this._lastDiff!, textEdits, model.original, model.modified);\n\t\t\t\tif (result) {\n\t\t\t\t\tthis._lastDiff = result;\n\t\t\t\t\ttransaction(tx => {\n\t\t\t\t\t\tthis._diff.set(DiffState.fromDiffResult(this._lastDiff!), tx);\n\t\t\t\t\t\tupdateUnchangedRegions(result, tx);\n\t\t\t\t\t\tconst currentSyncedMovedText = this.movedTextToCompare.get();\n\t\t\t\t\t\tthis.movedTextToCompare.set(currentSyncedMovedText ? this._lastDiff!.moves.find(m => m.lineRangeMapping.modified.intersect(currentSyncedMovedText.lineRangeMapping.modified)) : undefined, tx);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis._isDiffUpToDate.set(false, undefined);\n\t\t\tdebouncer.schedule();\n\t\t}));\n\t\tthis._register(model.original.onDidChangeContent((e) => {\n\t\t\tconst diff = this._diff.get();\n\t\t\tif (diff) {\n\t\t\t\tconst textEdits = TextEditInfo.fromModelContentChanges(e.changes);\n\t\t\t\tconst result = applyOriginalEdits(this._lastDiff!, textEdits, model.original, model.modified);\n\t\t\t\tif (result) {\n\t\t\t\t\tthis._lastDiff = result;\n\t\t\t\t\ttransaction(tx => {\n\t\t\t\t\t\tthis._diff.set(DiffState.fromDiffResult(this._lastDiff!), tx);\n\t\t\t\t\t\tupdateUnchangedRegions(result, tx);\n\t\t\t\t\t\tconst currentSyncedMovedText = this.movedTextToCompare.get();\n\t\t\t\t\t\tthis.movedTextToCompare.set(currentSyncedMovedText ? this._lastDiff!.moves.find(m => m.lineRangeMapping.modified.intersect(currentSyncedMovedText.lineRangeMapping.modified)) : undefined, tx);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis._isDiffUpToDate.set(false, undefined);\n\t\t\tdebouncer.schedule();\n\t\t}));\n\n\t\tthis._register(autorunWithStore(async (reader, store) => {\n\t\t\t/** @description compute diff */\n\n\t\t\t// So that they get recomputed when these settings change\n\t\t\tthis._options.hideUnchangedRegionsMinimumLineCount.read(reader);\n\t\t\tthis._options.hideUnchangedRegionsContextLineCount.read(reader);\n\n\t\t\tdebouncer.cancel();\n\t\t\tcontentChangedSignal.read(reader);\n\t\t\tconst documentDiffProvider = this._diffProvider.read(reader);\n\t\t\tdocumentDiffProvider.onChangeSignal.read(reader);\n\n\t\t\treadHotReloadableExport(DefaultLinesDiffComputer, reader);\n\t\t\treadHotReloadableExport(optimizeSequenceDiffs, reader);\n\n\t\t\tthis._isDiffUpToDate.set(false, undefined);\n\n\t\t\tlet originalTextEditInfos: TextEditInfo[] = [];\n\t\t\tstore.add(model.original.onDidChangeContent((e) => {\n\t\t\t\tconst edits = TextEditInfo.fromModelContentChanges(e.changes);\n\t\t\t\toriginalTextEditInfos = combineTextEditInfos(originalTextEditInfos, edits);\n\t\t\t}));\n\n\t\t\tlet modifiedTextEditInfos: TextEditInfo[] = [];\n\t\t\tstore.add(model.modified.onDidChangeContent((e) => {\n\t\t\t\tconst edits = TextEditInfo.fromModelContentChanges(e.changes);\n\t\t\t\tmodifiedTextEditInfos = combineTextEditInfos(modifiedTextEditInfos, edits);\n\t\t\t}));\n\n\t\t\tlet result = await documentDiffProvider.diffProvider.computeDiff(model.original, model.modified, {\n\t\t\t\tignoreTrimWhitespace: this._options.ignoreTrimWhitespace.read(reader),\n\t\t\t\tmaxComputationTimeMs: this._options.maxComputationTimeMs.read(reader),\n\t\t\t\tcomputeMoves: this._options.showMoves.read(reader),\n\t\t\t}, this._cancellationTokenSource.token);\n\n\t\t\tif (this._cancellationTokenSource.token.isCancellationRequested) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (model.original.isDisposed() || model.modified.isDisposed()) {\n\t\t\t\t// TODO@hediet fishy?\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tresult = normalizeDocumentDiff(result, model.original, model.modified);\n\t\t\tresult = applyOriginalEdits(result, originalTextEditInfos, model.original, model.modified) ?? result;\n\t\t\tresult = applyModifiedEdits(result, modifiedTextEditInfos, model.original, model.modified) ?? result;\n\n\t\t\ttransaction(tx => {\n\t\t\t\t/** @description write diff result */\n\t\t\t\tupdateUnchangedRegions(result, tx);\n\n\t\t\t\tthis._lastDiff = result;\n\t\t\t\tconst state = DiffState.fromDiffResult(result);\n\t\t\t\tthis._diff.set(state, tx);\n\t\t\t\tthis._isDiffUpToDate.set(true, tx);\n\t\t\t\tconst currentSyncedMovedText = this.movedTextToCompare.read(undefined);\n\t\t\t\tthis.movedTextToCompare.set(currentSyncedMovedText ? this._lastDiff.moves.find(m => m.lineRangeMapping.modified.intersect(currentSyncedMovedText.lineRangeMapping.modified)) : undefined, tx);\n\t\t\t});\n\t\t}));\n\t}\n\n\tpublic ensureModifiedLineIsVisible(lineNumber: number, preference: RevealPreference, tx: ITransaction | undefined): void {\n\t\tif (this.diff.get()?.mappings.length === 0) {\n\t\t\treturn;\n\t\t}\n\t\tconst unchangedRegions = this._unchangedRegions.get()?.regions || [];\n\t\tfor (const r of unchangedRegions) {\n\t\t\tif (r.getHiddenModifiedRange(undefined).contains(lineNumber)) {\n\t\t\t\tr.showModifiedLine(lineNumber, preference, tx);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic ensureOriginalLineIsVisible(lineNumber: number, preference: RevealPreference, tx: ITransaction | undefined): void {\n\t\tif (this.diff.get()?.mappings.length === 0) {\n\t\t\treturn;\n\t\t}\n\t\tconst unchangedRegions = this._unchangedRegions.get()?.regions || [];\n\t\tfor (const r of unchangedRegions) {\n\t\t\tif (r.getHiddenOriginalRange(undefined).contains(lineNumber)) {\n\t\t\t\tr.showOriginalLine(lineNumber, preference, tx);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic async waitForDiff(): Promise<void> {\n\t\tawait waitForState(this.isDiffUpToDate, s => s);\n\t}\n\n\tpublic serializeState(): SerializedState {\n\t\tconst regions = this._unchangedRegions.get();\n\t\treturn {\n\t\t\tcollapsedRegions: regions?.regions.map(r => ({ range: r.getHiddenModifiedRange(undefined).serialize() }))\n\t\t};\n\t}\n\n\tpublic restoreSerializedState(state: SerializedState): void {\n\t\tconst ranges = state.collapsedRegions?.map(r => LineRange.deserialize(r.range));\n\t\tconst regions = this._unchangedRegions.get();\n\t\tif (!regions || !ranges) {\n\t\t\treturn;\n\t\t}\n\t\ttransaction(tx => {\n\t\t\tfor (const r of regions.regions) {\n\t\t\t\tfor (const range of ranges) {\n\t\t\t\t\tif (r.modifiedUnchangedRange.intersect(range)) {\n\t\t\t\t\t\tr.setHiddenModifiedRange(range, tx);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n}\n\nfunction normalizeDocumentDiff(diff: IDocumentDiff, original: ITextModel, modified: ITextModel): IDocumentDiff {\n\treturn {\n\t\tchanges: diff.changes.map(c => new DetailedLineRangeMapping(\n\t\t\tc.original,\n\t\t\tc.modified,\n\t\t\tc.innerChanges ? c.innerChanges.map(i => normalizeRangeMapping(i, original, modified)) : undefined\n\t\t)),\n\t\tmoves: diff.moves,\n\t\tidentical: diff.identical,\n\t\tquitEarly: diff.quitEarly,\n\t};\n}\n\nfunction normalizeRangeMapping(rangeMapping: RangeMapping, original: ITextModel, modified: ITextModel): RangeMapping {\n\tlet originalRange = rangeMapping.originalRange;\n\tlet modifiedRange = rangeMapping.modifiedRange;\n\tif (\n\t\toriginalRange.startColumn === 1 && modifiedRange.startColumn === 1 &&\n\t\t(originalRange.endColumn !== 1 || modifiedRange.endColumn !== 1) &&\n\t\toriginalRange.endColumn === original.getLineMaxColumn(originalRange.endLineNumber)\n\t\t&& modifiedRange.endColumn === modified.getLineMaxColumn(modifiedRange.endLineNumber)\n\t\t&& originalRange.endLineNumber < original.getLineCount()\n\t\t&& modifiedRange.endLineNumber < modified.getLineCount()\n\t) {\n\t\toriginalRange = originalRange.setEndPosition(originalRange.endLineNumber + 1, 1);\n\t\tmodifiedRange = modifiedRange.setEndPosition(modifiedRange.endLineNumber + 1, 1);\n\t}\n\treturn new RangeMapping(originalRange, modifiedRange);\n}\n\ninterface SerializedState {\n\tcollapsedRegions: { range: ISerializedLineRange }[] | undefined;\n}\n\nexport class DiffState {\n\tpublic static fromDiffResult(result: IDocumentDiff): DiffState {\n\t\treturn new DiffState(\n\t\t\tresult.changes.map(c => new DiffMapping(c)),\n\t\t\tresult.moves || [],\n\t\t\tresult.identical,\n\t\t\tresult.quitEarly,\n\t\t);\n\t}\n\n\tconstructor(\n\t\tpublic readonly mappings: readonly DiffMapping[],\n\t\tpublic readonly movedTexts: readonly MovedText[],\n\t\tpublic readonly identical: boolean,\n\t\tpublic readonly quitEarly: boolean,\n\t) { }\n}\n\nexport class DiffMapping {\n\tconstructor(\n\t\treadonly lineRangeMapping: DetailedLineRangeMapping,\n\t) {\n\t\t/*\n\t\treadonly movedTo: MovedText | undefined,\n\t\treadonly movedFrom: MovedText | undefined,\n\n\t\tif (movedTo) {\n\t\t\tassertFn(() =>\n\t\t\t\tmovedTo.lineRangeMapping.modifiedRange.equals(lineRangeMapping.modifiedRange)\n\t\t\t\t&& lineRangeMapping.originalRange.isEmpty\n\t\t\t\t&& !movedFrom\n\t\t\t);\n\t\t} else if (movedFrom) {\n\t\t\tassertFn(() =>\n\t\t\t\tmovedFrom.lineRangeMapping.originalRange.equals(lineRangeMapping.originalRange)\n\t\t\t\t&& lineRangeMapping.modifiedRange.isEmpty\n\t\t\t\t&& !movedTo\n\t\t\t);\n\t\t}\n\t\t*/\n\t}\n}\n\nexport class UnchangedRegion {\n\tpublic static fromDiffs(\n\t\tchanges: readonly DetailedLineRangeMapping[],\n\t\toriginalLineCount: number,\n\t\tmodifiedLineCount: number,\n\t\tminHiddenLineCount: number,\n\t\tminContext: number,\n\t): UnchangedRegion[] {\n\t\tconst inversedMappings = DetailedLineRangeMapping.inverse(changes, originalLineCount, modifiedLineCount);\n\t\tconst result: UnchangedRegion[] = [];\n\n\t\tfor (const mapping of inversedMappings) {\n\t\t\tlet origStart = mapping.original.startLineNumber;\n\t\t\tlet modStart = mapping.modified.startLineNumber;\n\t\t\tlet length = mapping.original.length;\n\n\t\t\tconst atStart = origStart === 1 && modStart === 1;\n\t\t\tconst atEnd = origStart + length === originalLineCount + 1 && modStart + length === modifiedLineCount + 1;\n\n\t\t\tif ((atStart || atEnd) && length >= minContext + minHiddenLineCount) {\n\t\t\t\tif (atStart && !atEnd) {\n\t\t\t\t\tlength -= minContext;\n\t\t\t\t}\n\t\t\t\tif (atEnd && !atStart) {\n\t\t\t\t\torigStart += minContext;\n\t\t\t\t\tmodStart += minContext;\n\t\t\t\t\tlength -= minContext;\n\t\t\t\t}\n\t\t\t\tresult.push(new UnchangedRegion(origStart, modStart, length, 0, 0));\n\t\t\t} else if (length >= minContext * 2 + minHiddenLineCount) {\n\t\t\t\torigStart += minContext;\n\t\t\t\tmodStart += minContext;\n\t\t\t\tlength -= minContext * 2;\n\t\t\t\tresult.push(new UnchangedRegion(origStart, modStart, length, 0, 0));\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t}\n\n\tpublic get originalUnchangedRange(): LineRange {\n\t\treturn LineRange.ofLength(this.originalLineNumber, this.lineCount);\n\t}\n\n\tpublic get modifiedUnchangedRange(): LineRange {\n\t\treturn LineRange.ofLength(this.modifiedLineNumber, this.lineCount);\n\t}\n\n\tprivate readonly _visibleLineCountTop = observableValue<number>(this, 0);\n\tpublic readonly visibleLineCountTop: ISettableObservable<number> = this._visibleLineCountTop;\n\n\tprivate readonly _visibleLineCountBottom = observableValue<number>(this, 0);\n\tpublic readonly visibleLineCountBottom: ISettableObservable<number> = this._visibleLineCountBottom;\n\n\tprivate readonly _shouldHideControls = derived(this, reader => /** @description isVisible */\n\t\tthis.visibleLineCountTop.read(reader) + this.visibleLineCountBottom.read(reader) === this.lineCount && !this.isDragged.read(reader));\n\n\tpublic readonly isDragged = observableValue<undefined | 'bottom' | 'top'>(this, undefined);\n\n\tconstructor(\n\t\tpublic readonly originalLineNumber: number,\n\t\tpublic readonly modifiedLineNumber: number,\n\t\tpublic readonly lineCount: number,\n\t\tvisibleLineCountTop: number,\n\t\tvisibleLineCountBottom: number,\n\t) {\n\t\tconst visibleLineCountTop2 = Math.max(Math.min(visibleLineCountTop, this.lineCount), 0);\n\t\tconst visibleLineCountBottom2 = Math.max(Math.min(visibleLineCountBottom, this.lineCount - visibleLineCountTop), 0);\n\n\t\tsoftAssert(visibleLineCountTop === visibleLineCountTop2);\n\t\tsoftAssert(visibleLineCountBottom === visibleLineCountBottom2);\n\n\t\tthis._visibleLineCountTop.set(visibleLineCountTop2, undefined);\n\t\tthis._visibleLineCountBottom.set(visibleLineCountBottom2, undefined);\n\t}\n\n\tpublic setVisibleRanges(visibleRanges: LineRangeMapping[], tx: ITransaction): UnchangedRegion[] {\n\t\tconst result: UnchangedRegion[] = [];\n\n\t\tconst hiddenModified = new LineRangeSet(visibleRanges.map(r => r.modified)).subtractFrom(this.modifiedUnchangedRange);\n\n\t\tlet originalStartLineNumber = this.originalLineNumber;\n\t\tlet modifiedStartLineNumber = this.modifiedLineNumber;\n\t\tconst modifiedEndLineNumberEx = this.modifiedLineNumber + this.lineCount;\n\t\tif (hiddenModified.ranges.length === 0) {\n\t\t\tthis.showAll(tx);\n\t\t\tresult.push(this);\n\t\t} else {\n\t\t\tlet i = 0;\n\t\t\tfor (const r of hiddenModified.ranges) {\n\t\t\t\tconst isLast = i === hiddenModified.ranges.length - 1;\n\t\t\t\ti++;\n\n\t\t\t\tconst length = (isLast ? modifiedEndLineNumberEx : r.endLineNumberExclusive) - modifiedStartLineNumber;\n\n\t\t\t\tconst newR = new UnchangedRegion(originalStartLineNumber, modifiedStartLineNumber, length, 0, 0);\n\t\t\t\tnewR.setHiddenModifiedRange(r, tx);\n\t\t\t\tresult.push(newR);\n\n\t\t\t\toriginalStartLineNumber = newR.originalUnchangedRange.endLineNumberExclusive;\n\t\t\t\tmodifiedStartLineNumber = newR.modifiedUnchangedRange.endLineNumberExclusive;\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t}\n\n\tpublic shouldHideControls(reader: IReader | undefined): boolean {\n\t\treturn this._shouldHideControls.read(reader);\n\t}\n\n\tpublic getHiddenOriginalRange(reader: IReader | undefined): LineRange {\n\t\treturn LineRange.ofLength(\n\t\t\tthis.originalLineNumber + this._visibleLineCountTop.read(reader),\n\t\t\tthis.lineCount - this._visibleLineCountTop.read(reader) - this._visibleLineCountBottom.read(reader),\n\t\t);\n\t}\n\n\tpublic getHiddenModifiedRange(reader: IReader | undefined): LineRange {\n\t\treturn LineRange.ofLength(\n\t\t\tthis.modifiedLineNumber + this._visibleLineCountTop.read(reader),\n\t\t\tthis.lineCount - this._visibleLineCountTop.read(reader) - this._visibleLineCountBottom.read(reader),\n\t\t);\n\t}\n\n\tpublic setHiddenModifiedRange(range: LineRange, tx: ITransaction) {\n\t\tconst visibleLineCountTop = range.startLineNumber - this.modifiedLineNumber;\n\t\tconst visibleLineCountBottom = (this.modifiedLineNumber + this.lineCount) - range.endLineNumberExclusive;\n\t\tthis.setState(visibleLineCountTop, visibleLineCountBottom, tx);\n\t}\n\n\tpublic getMaxVisibleLineCountTop() {\n\t\treturn this.lineCount - this._visibleLineCountBottom.get();\n\t}\n\n\tpublic getMaxVisibleLineCountBottom() {\n\t\treturn this.lineCount - this._visibleLineCountTop.get();\n\t}\n\n\tpublic showMoreAbove(count = 10, tx: ITransaction | undefined): void {\n\t\tconst maxVisibleLineCountTop = this.getMaxVisibleLineCountTop();\n\t\tthis._visibleLineCountTop.set(Math.min(this._visibleLineCountTop.get() + count, maxVisibleLineCountTop), tx);\n\t}\n\n\tpublic showMoreBelow(count = 10, tx: ITransaction | undefined): void {\n\t\tconst maxVisibleLineCountBottom = this.lineCount - this._visibleLineCountTop.get();\n\t\tthis._visibleLineCountBottom.set(Math.min(this._visibleLineCountBottom.get() + count, maxVisibleLineCountBottom), tx);\n\t}\n\n\tpublic showAll(tx: ITransaction | undefined): void {\n\t\tthis._visibleLineCountBottom.set(this.lineCount - this._visibleLineCountTop.get(), tx);\n\t}\n\n\tpublic showModifiedLine(lineNumber: number, preference: RevealPreference, tx: ITransaction | undefined): void {\n\t\tconst top = lineNumber + 1 - (this.modifiedLineNumber + this._visibleLineCountTop.get());\n\t\tconst bottom = (this.modifiedLineNumber - this._visibleLineCountBottom.get() + this.lineCount) - lineNumber;\n\t\tif (preference === RevealPreference.FromCloserSide && top < bottom || preference === RevealPreference.FromTop) {\n\t\t\tthis._visibleLineCountTop.set(this._visibleLineCountTop.get() + top, tx);\n\t\t} else {\n\t\t\tthis._visibleLineCountBottom.set(this._visibleLineCountBottom.get() + bottom, tx);\n\t\t}\n\t}\n\n\tpublic showOriginalLine(lineNumber: number, preference: RevealPreference, tx: ITransaction | undefined): void {\n\t\tconst top = lineNumber - this.originalLineNumber;\n\t\tconst bottom = (this.originalLineNumber + this.lineCount) - lineNumber;\n\t\tif (preference === RevealPreference.FromCloserSide && top < bottom || preference === RevealPreference.FromTop) {\n\t\t\tthis._visibleLineCountTop.set(Math.min(this._visibleLineCountTop.get() + bottom - top, this.getMaxVisibleLineCountTop()), tx);\n\t\t} else {\n\t\t\tthis._visibleLineCountBottom.set(Math.min(this._visibleLineCountBottom.get() + top - bottom, this.getMaxVisibleLineCountBottom()), tx);\n\t\t}\n\t}\n\n\tpublic collapseAll(tx: ITransaction | undefined): void {\n\t\tthis._visibleLineCountTop.set(0, tx);\n\t\tthis._visibleLineCountBottom.set(0, tx);\n\t}\n\n\tpublic setState(visibleLineCountTop: number, visibleLineCountBottom: number, tx: ITransaction | undefined): void {\n\t\tvisibleLineCountTop = Math.max(Math.min(visibleLineCountTop, this.lineCount), 0);\n\t\tvisibleLineCountBottom = Math.max(Math.min(visibleLineCountBottom, this.lineCount - visibleLineCountTop), 0);\n\n\t\tthis._visibleLineCountTop.set(visibleLineCountTop, tx);\n\t\tthis._visibleLineCountBottom.set(visibleLineCountBottom, tx);\n\t}\n}\n\nexport const enum RevealPreference {\n\tFromCloserSide,\n\tFromTop,\n\tFromBottom,\n}\n\nfunction applyOriginalEdits(diff: IDocumentDiff, textEdits: TextEditInfo[], originalTextModel: ITextModel, modifiedTextModel: ITextModel): IDocumentDiff | undefined {\n\treturn undefined;\n\t/*\n\tTODO@hediet\n\tif (textEdits.length === 0) {\n\t\treturn diff;\n\t}\n\n\tconst diff2 = flip(diff);\n\tconst diff3 = applyModifiedEdits(diff2, textEdits, modifiedTextModel, originalTextModel);\n\tif (!diff3) {\n\t\treturn undefined;\n\t}\n\treturn flip(diff3);*/\n}\n/*\nfunction flip(diff: IDocumentDiff): IDocumentDiff {\n\treturn {\n\t\tchanges: diff.changes.map(c => c.flip()),\n\t\tmoves: diff.moves.map(m => m.flip()),\n\t\tidentical: diff.identical,\n\t\tquitEarly: diff.quitEarly,\n\t};\n}\n*/\nfunction applyModifiedEdits(diff: IDocumentDiff, textEdits: TextEditInfo[], originalTextModel: ITextModel, modifiedTextModel: ITextModel): IDocumentDiff | undefined {\n\treturn undefined;\n\t/*\n\tTODO@hediet\n\tif (textEdits.length === 0) {\n\t\treturn diff;\n\t}\n\tif (diff.changes.some(c => !c.innerChanges) || diff.moves.length > 0) {\n\t\t// TODO support these cases\n\t\treturn undefined;\n\t}\n\n\tconst changes = applyModifiedEditsToLineRangeMappings(diff.changes, textEdits, originalTextModel, modifiedTextModel);\n\n\tconst moves = diff.moves.map(m => {\n\t\tconst newModifiedRange = applyEditToLineRange(m.lineRangeMapping.modified, textEdits);\n\t\treturn newModifiedRange ? new MovedText(\n\t\t\tnew SimpleLineRangeMapping(m.lineRangeMapping.original, newModifiedRange),\n\t\t\tapplyModifiedEditsToLineRangeMappings(m.changes, textEdits, originalTextModel, modifiedTextModel),\n\t\t) : undefined;\n\t}).filter(isDefined);\n\n\treturn {\n\t\tidentical: false,\n\t\tquitEarly: false,\n\t\tchanges,\n\t\tmoves,\n\t};*/\n}\n/*\nfunction applyEditToLineRange(range: LineRange, textEdits: TextEditInfo[]): LineRange | undefined {\n\tlet rangeStartLineNumber = range.startLineNumber;\n\tlet rangeEndLineNumberEx = range.endLineNumberExclusive;\n\n\tfor (let i = textEdits.length - 1; i >= 0; i--) {\n\t\tconst textEdit = textEdits[i];\n\t\tconst textEditStartLineNumber = lengthGetLineCount(textEdit.startOffset) + 1;\n\t\tconst textEditEndLineNumber = lengthGetLineCount(textEdit.endOffset) + 1;\n\t\tconst newLengthLineCount = lengthGetLineCount(textEdit.newLength);\n\t\tconst delta = newLengthLineCount - (textEditEndLineNumber - textEditStartLineNumber);\n\n\t\tif (textEditEndLineNumber < rangeStartLineNumber) {\n\t\t\t// the text edit is before us\n\t\t\trangeStartLineNumber += delta;\n\t\t\trangeEndLineNumberEx += delta;\n\t\t} else if (textEditStartLineNumber > rangeEndLineNumberEx) {\n\t\t\t// the text edit is after us\n\t\t\t// NOOP\n\t\t} else if (textEditStartLineNumber < rangeStartLineNumber && rangeEndLineNumberEx < textEditEndLineNumber) {\n\t\t\t// the range is fully contained in the text edit\n\t\t\treturn undefined;\n\t\t} else if (textEditStartLineNumber < rangeStartLineNumber && textEditEndLineNumber <= rangeEndLineNumberEx) {\n\t\t\t// the text edit ends inside our range\n\t\t\trangeStartLineNumber = textEditEndLineNumber + 1;\n\t\t\trangeStartLineNumber += delta;\n\t\t\trangeEndLineNumberEx += delta;\n\t\t} else if (rangeStartLineNumber <= textEditStartLineNumber && textEditEndLineNumber < rangeStartLineNumber) {\n\t\t\t// the text edit starts inside our range\n\t\t\trangeEndLineNumberEx = textEditStartLineNumber;\n\t\t} else {\n\t\t\trangeEndLineNumberEx += delta;\n\t\t}\n\t}\n\n\treturn new LineRange(rangeStartLineNumber, rangeEndLineNumberEx);\n}\n\nfunction applyModifiedEditsToLineRangeMappings(changes: readonly LineRangeMapping[], textEdits: TextEditInfo[], originalTextModel: ITextModel, modifiedTextModel: ITextModel): LineRangeMapping[] {\n\tconst diffTextEdits = changes.flatMap(c => c.innerChanges!.map(c => new TextEditInfo(\n\t\tpositionToLength(c.originalRange.getStartPosition()),\n\t\tpositionToLength(c.originalRange.getEndPosition()),\n\t\tlengthOfRange(c.modifiedRange).toLength(),\n\t)));\n\n\tconst combined = combineTextEditInfos(diffTextEdits, textEdits);\n\n\tlet lastOriginalEndOffset = lengthZero;\n\tlet lastModifiedEndOffset = lengthZero;\n\tconst rangeMappings = combined.map(c => {\n\t\tconst modifiedStartOffset = lengthAdd(lastModifiedEndOffset, lengthDiffNonNegative(lastOriginalEndOffset, c.startOffset));\n\t\tlastOriginalEndOffset = c.endOffset;\n\t\tlastModifiedEndOffset = lengthAdd(modifiedStartOffset, c.newLength);\n\n\t\treturn new RangeMapping(\n\t\t\tRange.fromPositions(lengthToPosition(c.startOffset), lengthToPosition(c.endOffset)),\n\t\t\tRange.fromPositions(lengthToPosition(modifiedStartOffset), lengthToPosition(lastModifiedEndOffset)),\n\t\t);\n\t});\n\n\tconst newChanges = lineRangeMappingFromRangeMappings(\n\t\trangeMappings,\n\t\toriginalTextModel.getLinesContent(),\n\t\tmodifiedTextModel.getLinesContent(),\n\t);\n\treturn newChanges;\n}\n*/\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { RunOnceScheduler } from '../../../../base/common/async.js';\nimport { CancellationTokenSource } from '../../../../base/common/cancellation.js';\nimport { Disposable, toDisposable } from '../../../../base/common/lifecycle.js';\nimport { IObservable, IReader, ISettableObservable, ITransaction, autorun, autorunWithStore, derived, observableSignal, observableSignalFromEvent, observableValue, transaction, waitForState } from '../../../../base/common/observable.js';\nimport { IDiffProviderFactoryService } from './diffProviderFactoryService.js';\nimport { filterWithPrevious } from './utils.js';\nimport { readHotReloadableExport } from '../../../../base/common/hotReloadHelpers.js';\nimport { ISerializedLineRange, LineRange, LineRangeSet } from '../../../common/core/ranges/lineRange.js';\nimport { DefaultLinesDiffComputer } from '../../../common/diff/defaultLinesDiffComputer/defaultLinesDiffComputer.js';\nimport { IDocumentDiff } from '../../../common/diff/documentDiffProvider.js';\nimport { MovedText } from '../../../common/diff/linesDiffComputer.js';\nimport { DetailedLineRangeMapping, LineRangeMapping, RangeMapping } from '../../../common/diff/rangeMapping.js';\nimport { IDiffEditorModel, IDiffEditorViewModel } from '../../../common/editorCommon.js';\nimport { ITextModel } from '../../../common/model.js';\nimport { TextEditInfo } from '../../../common/model/bracketPairsTextModelPart/bracketPairsTree/beforeEditPositionMapper.js';\nimport { combineTextEditInfos } from '../../../common/model/bracketPairsTextModelPart/bracketPairsTree/combineTextEditInfos.js';\nimport { DiffEditorOptions } from './diffEditorOptions.js';\nimport { optimizeSequenceDiffs } from '../../../common/diff/defaultLinesDiffComputer/heuristicSequenceOptimizations.js';\nimport { isDefined } from '../../../../base/common/types.js';\nimport { groupAdjacentBy } from '../../../../base/common/arrays.js';\nimport { softAssert } from '../../../../base/common/assert.js';\n\nexport class DiffEditorViewModel extends Disposable implements IDiffEditorViewModel {\n\tprivate readonly _isDiffUpToDate = observableValue<boolean>(this, false);\n\tpublic readonly isDiffUpToDate: IObservable<boolean> = this._isDiffUpToDate;\n\n\tprivate _lastDiff: IDocumentDiff | undefined;\n\tprivate readonly _diff = observableValue<DiffState | undefined>(this, undefined);\n\tpublic readonly diff: IObservable<DiffState | undefined> = this._diff;\n\n\tprivate readonly _unchangedRegions = observableValue<{ regions: UnchangedRegion[]; originalDecorationIds: string[]; modifiedDecorationIds: string[] } | undefined>(this, undefined);\n\tpublic readonly unchangedRegions: IObservable<UnchangedRegion[]> = derived(this, r => {\n\t\tif (this._options.hideUnchangedRegions.read(r)) {\n\t\t\treturn this._unchangedRegions.read(r)?.regions ?? [];\n\t\t} else {\n\t\t\t// Reset state\n\t\t\ttransaction(tx => {\n\t\t\t\tfor (const r of this._unchangedRegions.read(undefined)?.regions || []) {\n\t\t\t\t\tr.collapseAll(tx);\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn [];\n\t\t}\n\t}\n\t);\n\n\tpublic readonly movedTextToCompare = observableValue<MovedText | undefined>(this, undefined);\n\n\tprivate readonly _activeMovedText = observableValue<MovedText | undefined>(this, undefined);\n\tprivate readonly _hoveredMovedText = observableValue<MovedText | undefined>(this, undefined);\n\n\n\tpublic readonly activeMovedText = derived(this, r => this.movedTextToCompare.read(r) ?? this._hoveredMovedText.read(r) ?? this._activeMovedText.read(r));\n\n\tpublic setActiveMovedText(movedText: MovedText | undefined): void {\n\t\tthis._activeMovedText.set(movedText, undefined);\n\t}\n\n\tprivate readonly _cancellationTokenSource = new CancellationTokenSource();\n\n\tprivate readonly _diffProvider = derived(this, reader => {\n\t\tconst diffProvider = this._diffProviderFactoryService.createDiffProvider({\n\t\t\tdiffAlgorithm: this._options.diffAlgorithm.read(reader)\n\t\t});\n\t\tconst onChangeSignal = observableSignalFromEvent('onDidChange', diffProvider.onDidChange);\n\t\treturn {\n\t\t\tdiffProvider,\n\t\t\tonChangeSignal,\n\t\t};\n\t});\n\n\tconstructor(\n\t\tpublic readonly model: IDiffEditorModel,\n\t\tprivate readonly _options: DiffEditorOptions,\n\t\t@IDiffProviderFactoryService private readonly _diffProviderFactoryService: IDiffProviderFactoryService,\n\t) {\n\t\tsuper();\n\n\t\tthis._register(toDisposable(() => this._cancellationTokenSource.cancel()));\n\n\t\tconst contentChangedSignal = observableSignal('contentChangedSignal');\n\t\tconst debouncer = this._register(new RunOnceScheduler(() => contentChangedSignal.trigger(undefined), 200));\n\n\t\tthis._register(autorun(reader => {\n\t\t\t/** @description collapse touching unchanged ranges */\n\n\t\t\tconst lastUnchangedRegions = this._unchangedRegions.read(reader);\n\t\t\tif (!lastUnchangedRegions || lastUnchangedRegions.regions.some(r => r.isDragged.read(reader))) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst lastUnchangedRegionsOrigRanges = lastUnchangedRegions.originalDecorationIds\n\t\t\t\t.map(id => model.original.getDecorationRange(id))\n\t\t\t\t.map(r => r ? LineRange.fromRangeInclusive(r) : undefined);\n\t\t\tconst lastUnchangedRegionsModRanges = lastUnchangedRegions.modifiedDecorationIds\n\t\t\t\t.map(id => model.modified.getDecorationRange(id))\n\t\t\t\t.map(r => r ? LineRange.fromRangeInclusive(r) : undefined);\n\t\t\tconst updatedLastUnchangedRegions = lastUnchangedRegions.regions.map((r, idx) =>\n\t\t\t\t(!lastUnchangedRegionsOrigRanges[idx] || !lastUnchangedRegionsModRanges[idx]) ? undefined :\n\t\t\t\t\tnew UnchangedRegion(\n\t\t\t\t\t\tlastUnchangedRegionsOrigRanges[idx]!.startLineNumber,\n\t\t\t\t\t\tlastUnchangedRegionsModRanges[idx]!.startLineNumber,\n\t\t\t\t\t\tlastUnchangedRegionsOrigRanges[idx]!.length,\n\t\t\t\t\t\tr.visibleLineCountTop.read(reader),\n\t\t\t\t\t\tr.visibleLineCountBottom.read(reader),\n\t\t\t\t\t)).filter(isDefined);\n\n\t\t\tconst newRanges: UnchangedRegion[] = [];\n\n\t\t\tlet didChange = false;\n\t\t\tfor (const touching of groupAdjacentBy(updatedLastUnchangedRegions, (a, b) => a.getHiddenModifiedRange(reader).endLineNumberExclusive === b.getHiddenModifiedRange(reader).startLineNumber)) {\n\t\t\t\tif (touching.length > 1) {\n\t\t\t\t\tdidChange = true;\n\t\t\t\t\tconst sumLineCount = touching.reduce((sum, r) => sum + r.lineCount, 0);\n\t\t\t\t\tconst r = new UnchangedRegion(touching[0].originalLineNumber, touching[0].modifiedLineNumber, sumLineCount, touching[0].visibleLineCountTop.read(undefined), touching[touching.length - 1].visibleLineCountBottom.read(undefined));\n\t\t\t\t\tnewRanges.push(r);\n\t\t\t\t} else {\n\t\t\t\t\tnewRanges.push(touching[0]);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (didChange) {\n\t\t\t\tconst originalDecorationIds = model.original.deltaDecorations(\n\t\t\t\t\tlastUnchangedRegions.originalDecorationIds,\n\t\t\t\t\tnewRanges.map(r => ({ range: r.originalUnchangedRange.toInclusiveRange()!, options: { description: 'unchanged' } }))\n\t\t\t\t);\n\t\t\t\tconst modifiedDecorationIds = model.modified.deltaDecorations(\n\t\t\t\t\tlastUnchangedRegions.modifiedDecorationIds,\n\t\t\t\t\tnewRanges.map(r => ({ range: r.modifiedUnchangedRange.toInclusiveRange()!, options: { description: 'unchanged' } }))\n\t\t\t\t);\n\n\t\t\t\ttransaction(tx => {\n\t\t\t\t\tthis._unchangedRegions.set(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tregions: newRanges,\n\t\t\t\t\t\t\toriginalDecorationIds,\n\t\t\t\t\t\t\tmodifiedDecorationIds\n\t\t\t\t\t\t},\n\t\t\t\t\t\ttx\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t}\n\t\t}));\n\n\t\tconst updateUnchangedRegions = (result: IDocumentDiff, tx: ITransaction, reader?: IReader) => {\n\t\t\tconst newUnchangedRegions = UnchangedRegion.fromDiffs(\n\t\t\t\tresult.changes,\n\t\t\t\tmodel.original.getLineCount(),\n\t\t\t\tmodel.modified.getLineCount(),\n\t\t\t\tthis._options.hideUnchangedRegionsMinimumLineCount.read(reader),\n\t\t\t\tthis._options.hideUnchangedRegionsContextLineCount.read(reader),\n\t\t\t);\n\n\t\t\t// Transfer state from cur state\n\t\t\tlet visibleRegions: LineRangeMapping[] | undefined = undefined;\n\n\t\t\tconst lastUnchangedRegions = this._unchangedRegions.get();\n\t\t\tif (lastUnchangedRegions) {\n\t\t\t\tconst lastUnchangedRegionsOrigRanges = lastUnchangedRegions.originalDecorationIds\n\t\t\t\t\t.map(id => model.original.getDecorationRange(id))\n\t\t\t\t\t.map(r => r ? LineRange.fromRangeInclusive(r) : undefined);\n\t\t\t\tconst lastUnchangedRegionsModRanges = lastUnchangedRegions.modifiedDecorationIds\n\t\t\t\t\t.map(id => model.modified.getDecorationRange(id))\n\t\t\t\t\t.map(r => r ? LineRange.fromRangeInclusive(r) : undefined);\n\t\t\t\tconst updatedLastUnchangedRegions = filterWithPrevious(\n\t\t\t\t\tlastUnchangedRegions.regions\n\t\t\t\t\t\t.map((r, idx) => {\n\t\t\t\t\t\t\tif (!lastUnchangedRegionsOrigRanges[idx] || !lastUnchangedRegionsModRanges[idx]) { return undefined; }\n\t\t\t\t\t\t\tconst length = lastUnchangedRegionsOrigRanges[idx]!.length;\n\t\t\t\t\t\t\treturn new UnchangedRegion(\n\t\t\t\t\t\t\t\tlastUnchangedRegionsOrigRanges[idx]!.startLineNumber,\n\t\t\t\t\t\t\t\tlastUnchangedRegionsModRanges[idx]!.startLineNumber,\n\t\t\t\t\t\t\t\tlength,\n\t\t\t\t\t\t\t\t// The visible area can shrink by edits -> we have to account for this\n\t\t\t\t\t\t\t\tMath.min(r.visibleLineCountTop.get(), length),\n\t\t\t\t\t\t\t\tMath.min(r.visibleLineCountBottom.get(), length - r.visibleLineCountTop.get()),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\t).filter(isDefined),\n\t\t\t\t\t(cur, prev) => !prev || (cur.modifiedLineNumber >= prev.modifiedLineNumber + prev.lineCount && cur.originalLineNumber >= prev.originalLineNumber + prev.lineCount)\n\t\t\t\t);\n\n\t\t\t\tlet hiddenRegions = updatedLastUnchangedRegions.map(r => new LineRangeMapping(r.getHiddenOriginalRange(reader), r.getHiddenModifiedRange(reader)));\n\t\t\t\thiddenRegions = LineRangeMapping.clip(hiddenRegions, LineRange.ofLength(1, model.original.getLineCount()), LineRange.ofLength(1, model.modified.getLineCount()));\n\t\t\t\tvisibleRegions = LineRangeMapping.inverse(hiddenRegions, model.original.getLineCount(), model.modified.getLineCount());\n\t\t\t}\n\n\t\t\tconst newUnchangedRegions2 = [];\n\t\t\tif (visibleRegions) {\n\t\t\t\tfor (const r of newUnchangedRegions) {\n\t\t\t\t\tconst intersecting = visibleRegions.filter(f => f.original.intersectsStrict(r.originalUnchangedRange) && f.modified.intersectsStrict(r.modifiedUnchangedRange));\n\t\t\t\t\tnewUnchangedRegions2.push(...r.setVisibleRanges(intersecting, tx));\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tnewUnchangedRegions2.push(...newUnchangedRegions);\n\t\t\t}\n\n\t\t\tconst originalDecorationIds = model.original.deltaDecorations(\n\t\t\t\tlastUnchangedRegions?.originalDecorationIds || [],\n\t\t\t\tnewUnchangedRegions2.map(r => ({ range: r.originalUnchangedRange.toInclusiveRange()!, options: { description: 'unchanged' } }))\n\t\t\t);\n\t\t\tconst modifiedDecorationIds = model.modified.deltaDecorations(\n\t\t\t\tlastUnchangedRegions?.modifiedDecorationIds || [],\n\t\t\t\tnewUnchangedRegions2.map(r => ({ range: r.modifiedUnchangedRange.toInclusiveRange()!, options: { description: 'unchanged' } }))\n\t\t\t);\n\n\t\t\tthis._unchangedRegions.set(\n\t\t\t\t{\n\t\t\t\t\tregions: newUnchangedRegions2,\n\t\t\t\t\toriginalDecorationIds,\n\t\t\t\t\tmodifiedDecorationIds\n\t\t\t\t},\n\t\t\t\ttx\n\t\t\t);\n\t\t};\n\n\t\tthis._register(model.modified.onDidChangeContent((e) => {\n\t\t\tconst diff = this._diff.get();\n\t\t\tif (diff) {\n\t\t\t\tconst textEdits = TextEditInfo.fromModelContentChanges(e.changes);\n\t\t\t\tconst result = applyModifiedEdits(this._lastDiff!, textEdits, model.original, model.modified);\n\t\t\t\tif (result) {\n\t\t\t\t\tthis._lastDiff = result;\n\t\t\t\t\ttransaction(tx => {\n\t\t\t\t\t\tthis._diff.set(DiffState.fromDiffResult(this._lastDiff!), tx);\n\t\t\t\t\t\tupdateUnchangedRegions(result, tx);\n\t\t\t\t\t\tconst currentSyncedMovedText = this.movedTextToCompare.get();\n\t\t\t\t\t\tthis.movedTextToCompare.set(currentSyncedMovedText ? this._lastDiff!.moves.find(m => m.lineRangeMapping.modified.intersect(currentSyncedMovedText.lineRangeMapping.modified)) : undefined, tx);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis._isDiffUpToDate.set(false, undefined);\n\t\t\tdebouncer.schedule();\n\t\t}));\n\t\tthis._register(model.original.onDidChangeContent((e) => {\n\t\t\tconst diff = this._diff.get();\n\t\t\tif (diff) {\n\t\t\t\tconst textEdits = TextEditInfo.fromModelContentChanges(e.changes);\n\t\t\t\tconst result = applyOriginalEdits(this._lastDiff!, textEdits, model.original, model.modified);\n\t\t\t\tif (result) {\n\t\t\t\t\tthis._lastDiff = result;\n\t\t\t\t\ttransaction(tx => {\n\t\t\t\t\t\tthis._diff.set(DiffState.fromDiffResult(this._lastDiff!), tx);\n\t\t\t\t\t\tupdateUnchangedRegions(result, tx);\n\t\t\t\t\t\tconst currentSyncedMovedText = this.movedTextToCompare.get();\n\t\t\t\t\t\tthis.movedTextToCompare.set(currentSyncedMovedText ? this._lastDiff!.moves.find(m => m.lineRangeMapping.modified.intersect(currentSyncedMovedText.lineRangeMapping.modified)) : undefined, tx);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis._isDiffUpToDate.set(false, undefined);\n\t\t\tdebouncer.schedule();\n\t\t}));\n\n\t\tthis._register(autorunWithStore(async (reader, store) => {\n\t\t\t/** @description compute diff */\n\n\t\t\t// So that they get recomputed when these settings change\n\t\t\tthis._options.hideUnchangedRegionsMinimumLineCount.read(reader);\n\t\t\tthis._options.hideUnchangedRegionsContextLineCount.read(reader);\n\n\t\t\tdebouncer.cancel();\n\t\t\tcontentChangedSignal.read(reader);\n\t\t\tconst documentDiffProvider = this._diffProvider.read(reader);\n\t\t\tdocumentDiffProvider.onChangeSignal.read(reader);\n\n\t\t\treadHotReloadableExport(DefaultLinesDiffComputer, reader);\n\t\t\treadHotReloadableExport(optimizeSequenceDiffs, reader);\n\n\t\t\tthis._isDiffUpToDate.set(false, undefined);\n\n\t\t\tlet originalTextEditInfos: TextEditInfo[] = [];\n\t\t\tstore.add(model.original.onDidChangeContent((e) => {\n\t\t\t\tconst edits = TextEditInfo.fromModelContentChanges(e.changes);\n\t\t\t\toriginalTextEditInfos = combineTextEditInfos(originalTextEditInfos, edits);\n\t\t\t}));\n\n\t\t\tlet modifiedTextEditInfos: TextEditInfo[] = [];\n\t\t\tstore.add(model.modified.onDidChangeContent((e) => {\n\t\t\t\tconst edits = TextEditInfo.fromModelContentChanges(e.changes);\n\t\t\t\tmodifiedTextEditInfos = combineTextEditInfos(modifiedTextEditInfos, edits);\n\t\t\t}));\n\n\t\t\tlet result = await documentDiffProvider.diffProvider.computeDiff(model.original, model.modified, {\n\t\t\t\tignoreTrimWhitespace: this._options.ignoreTrimWhitespace.read(reader),\n\t\t\t\tmaxComputationTimeMs: this._options.maxComputationTimeMs.read(reader),\n\t\t\t\tcomputeMoves: this._options.showMoves.read(reader),\n\t\t\t}, this._cancellationTokenSource.token);\n\n\t\t\tif (this._cancellationTokenSource.token.isCancellationRequested) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (model.original.isDisposed() || model.modified.isDisposed()) {\n\t\t\t\t// TODO@hediet fishy?\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tresult = normalizeDocumentDiff(result, model.original, model.modified);\n\t\t\tresult = applyOriginalEdits(result, originalTextEditInfos, model.original, model.modified) ?? result;\n\t\t\tresult = applyModifiedEdits(result, modifiedTextEditInfos, model.original, model.modified) ?? result;\n\n\t\t\ttransaction(tx => {\n\t\t\t\t/** @description write diff result */\n\t\t\t\tupdateUnchangedRegions(result, tx);\n\n\t\t\t\tthis._lastDiff = result;\n\t\t\t\tconst state = DiffState.fromDiffResult(result);\n\t\t\t\tthis._diff.set(state, tx);\n\t\t\t\tthis._isDiffUpToDate.set(true, tx);\n\t\t\t\tconst currentSyncedMovedText = this.movedTextToCompare.read(undefined);\n\t\t\t\tthis.movedTextToCompare.set(currentSyncedMovedText ? this._lastDiff.moves.find(m => m.lineRangeMapping.modified.intersect(currentSyncedMovedText.lineRangeMapping.modified)) : undefined, tx);\n\t\t\t});\n\t\t}));\n\t}\n\n\tpublic ensureModifiedLineIsVisible(lineNumber: number, preference: RevealPreference, tx: ITransaction | undefined): void {\n\t\tif (this.diff.get()?.mappings.length === 0) {\n\t\t\treturn;\n\t\t}\n\t\tconst unchangedRegions = this._unchangedRegions.get()?.regions || [];\n\t\tfor (const r of unchangedRegions) {\n\t\t\tif (r.getHiddenModifiedRange(undefined).contains(lineNumber)) {\n\t\t\t\tr.showModifiedLine(lineNumber, preference, tx);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic ensureOriginalLineIsVisible(lineNumber: number, preference: RevealPreference, tx: ITransaction | undefined): void {\n\t\tif (this.diff.get()?.mappings.length === 0) {\n\t\t\treturn;\n\t\t}\n\t\tconst unchangedRegions = this._unchangedRegions.get()?.regions || [];\n\t\tfor (const r of unchangedRegions) {\n\t\t\tif (r.getHiddenOriginalRange(undefined).contains(lineNumber)) {\n\t\t\t\tr.showOriginalLine(lineNumber, preference, tx);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic async waitForDiff(): Promise<void> {\n\t\tawait waitForState(this.isDiffUpToDate, s => s);\n\t}\n\n\tpublic serializeState(): SerializedState {\n\t\tconst regions = this._unchangedRegions.get();\n\t\treturn {\n\t\t\tcollapsedRegions: regions?.regions.map(r => ({ range: r.getHiddenModifiedRange(undefined).serialize() }))\n\t\t};\n\t}\n\n\tpublic restoreSerializedState(state: SerializedState): void {\n\t\tconst ranges = state.collapsedRegions?.map(r => LineRange.deserialize(r.range));\n\t\tconst regions = this._unchangedRegions.get();\n\t\tif (!regions || !ranges) {\n\t\t\treturn;\n\t\t}\n\t\ttransaction(tx => {\n\t\t\tfor (const r of regions.regions) {\n\t\t\t\tfor (const range of ranges) {\n\t\t\t\t\tif (r.modifiedUnchangedRange.intersect(range)) {\n\t\t\t\t\t\tr.setHiddenModifiedRange(range, tx);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n}\n\nfunction normalizeDocumentDiff(diff: IDocumentDiff, original: ITextModel, modified: ITextModel): IDocumentDiff {\n\treturn {\n\t\tchanges: diff.changes.map(c => new DetailedLineRangeMapping(\n\t\t\tc.original,\n\t\t\tc.modified,\n\t\t\tc.innerChanges ? c.innerChanges.map(i => normalizeRangeMapping(i, original, modified)) : undefined\n\t\t)),\n\t\tmoves: diff.moves,\n\t\tidentical: diff.identical,\n\t\tquitEarly: diff.quitEarly,\n\t};\n}\n\nfunction normalizeRangeMapping(rangeMapping: RangeMapping, original: ITextModel, modified: ITextModel): RangeMapping {\n\tlet originalRange = rangeMapping.originalRange;\n\tlet modifiedRange = rangeMapping.modifiedRange;\n\tif (\n\t\toriginalRange.startColumn === 1 && modifiedRange.startColumn === 1 &&\n\t\t(originalRange.endColumn !== 1 || modifiedRange.endColumn !== 1) &&\n\t\toriginalRange.endColumn === original.getLineMaxColumn(originalRange.endLineNumber)\n\t\t&& modifiedRange.endColumn === modified.getLineMaxColumn(modifiedRange.endLineNumber)\n\t\t&& originalRange.endLineNumber < original.getLineCount()\n\t\t&& modifiedRange.endLineNumber < modified.getLineCount()\n\t) {\n\t\toriginalRange = originalRange.setEndPosition(originalRange.endLineNumber + 1, 1);\n\t\tmodifiedRange = modifiedRange.setEndPosition(modifiedRange.endLineNumber + 1, 1);\n\t}\n\treturn new RangeMapping(originalRange, modifiedRange);\n}\n\ninterface SerializedState {\n\tcollapsedRegions: { range: ISerializedLineRange }[] | undefined;\n}\n\nexport class DiffState {\n\tpublic static fromDiffResult(result: IDocumentDiff): DiffState {\n\t\treturn new DiffState(\n\t\t\tresult.changes.map(c => new DiffMapping(c)),\n\t\t\tresult.moves || [],\n\t\t\tresult.identical,\n\t\t\tresult.quitEarly,\n\t\t);\n\t}\n\n\tconstructor(\n\t\tpublic readonly mappings: readonly DiffMapping[],\n\t\tpublic readonly movedTexts: readonly MovedText[],\n\t\tpublic readonly identical: boolean,\n\t\tpublic readonly quitEarly: boolean,\n\t) { }\n}\n\nexport class DiffMapping {\n\tconstructor(\n\t\treadonly lineRangeMapping: DetailedLineRangeMapping,\n\t) {\n\t\t/*\n\t\treadonly movedTo: MovedText | undefined,\n\t\treadonly movedFrom: MovedText | undefined,\n\n\t\tif (movedTo) {\n\t\t\tassertFn(() =>\n\t\t\t\tmovedTo.lineRangeMapping.modifiedRange.equals(lineRangeMapping.modifiedRange)\n\t\t\t\t&& lineRangeMapping.originalRange.isEmpty\n\t\t\t\t&& !movedFrom\n\t\t\t);\n\t\t} else if (movedFrom) {\n\t\t\tassertFn(() =>\n\t\t\t\tmovedFrom.lineRangeMapping.originalRange.equals(lineRangeMapping.originalRange)\n\t\t\t\t&& lineRangeMapping.modifiedRange.isEmpty\n\t\t\t\t&& !movedTo\n\t\t\t);\n\t\t}\n\t\t*/\n\t}\n}\n\nexport class UnchangedRegion {\n\tpublic static fromDiffs(\n\t\tchanges: readonly DetailedLineRangeMapping[],\n\t\toriginalLineCount: number,\n\t\tmodifiedLineCount: number,\n\t\tminHiddenLineCount: number,\n\t\tminContext: number,\n\t): UnchangedRegion[] {\n\t\tconst inversedMappings = DetailedLineRangeMapping.inverse(changes, originalLineCount, modifiedLineCount);\n\t\tconst result: UnchangedRegion[] = [];\n\n\t\tfor (const mapping of inversedMappings) {\n\t\t\tlet origStart = mapping.original.startLineNumber;\n\t\t\tlet modStart = mapping.modified.startLineNumber;\n\t\t\tlet length = mapping.original.length;\n\n\t\t\tconst atStart = origStart === 1 && modStart === 1;\n\t\t\tconst atEnd = origStart + length === originalLineCount + 1 && modStart + length === modifiedLineCount + 1;\n\n\t\t\tif ((atStart || atEnd) && length >= minContext + minHiddenLineCount) {\n\t\t\t\tif (atStart && !atEnd) {\n\t\t\t\t\tlength -= minContext;\n\t\t\t\t}\n\t\t\t\tif (atEnd && !atStart) {\n\t\t\t\t\torigStart += minContext;\n\t\t\t\t\tmodStart += minContext;\n\t\t\t\t\tlength -= minContext;\n\t\t\t\t}\n\t\t\t\tresult.push(new UnchangedRegion(origStart, modStart, length, 0, 0));\n\t\t\t} else if (length >= minContext * 2 + minHiddenLineCount) {\n\t\t\t\torigStart += minContext;\n\t\t\t\tmodStart += minContext;\n\t\t\t\tlength -= minContext * 2;\n\t\t\t\tresult.push(new UnchangedRegion(origStart, modStart, length, 0, 0));\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t}\n\n\tpublic get originalUnchangedRange(): LineRange {\n\t\treturn LineRange.ofLength(this.originalLineNumber, this.lineCount);\n\t}\n\n\tpublic get modifiedUnchangedRange(): LineRange {\n\t\treturn LineRange.ofLength(this.modifiedLineNumber, this.lineCount);\n\t}\n\n\tprivate readonly _visibleLineCountTop = observableValue<number>(this, 0);\n\tpublic readonly visibleLineCountTop: ISettableObservable<number> = this._visibleLineCountTop;\n\n\tprivate readonly _visibleLineCountBottom = observableValue<number>(this, 0);\n\tpublic readonly visibleLineCountBottom: ISettableObservable<number> = this._visibleLineCountBottom;\n\n\tprivate readonly _shouldHideControls = derived(this, reader => /** @description isVisible */\n\t\tthis.visibleLineCountTop.read(reader) + this.visibleLineCountBottom.read(reader) === this.lineCount && !this.isDragged.read(reader));\n\n\tpublic readonly isDragged = observableValue<undefined | 'bottom' | 'top'>(this, undefined);\n\n\tconstructor(\n\t\tpublic readonly originalLineNumber: number,\n\t\tpublic readonly modifiedLineNumber: number,\n\t\tpublic readonly lineCount: number,\n\t\tvisibleLineCountTop: number,\n\t\tvisibleLineCountBottom: number,\n\t) {\n\t\tconst visibleLineCountTop2 = Math.max(Math.min(visibleLineCountTop, this.lineCount), 0);\n\t\tconst visibleLineCountBottom2 = Math.max(Math.min(visibleLineCountBottom, this.lineCount - visibleLineCountTop), 0);\n\n\t\tsoftAssert(visibleLineCountTop === visibleLineCountTop2);\n\t\tsoftAssert(visibleLineCountBottom === visibleLineCountBottom2);\n\n\t\tthis._visibleLineCountTop.set(visibleLineCountTop2, undefined);\n\t\tthis._visibleLineCountBottom.set(visibleLineCountBottom2, undefined);\n\t}\n\n\tpublic setVisibleRanges(visibleRanges: LineRangeMapping[], tx: ITransaction): UnchangedRegion[] {\n\t\tconst result: UnchangedRegion[] = [];\n\n\t\tconst hiddenModified = new LineRangeSet(visibleRanges.map(r => r.modified)).subtractFrom(this.modifiedUnchangedRange);\n\n\t\tlet originalStartLineNumber = this.originalLineNumber;\n\t\tlet modifiedStartLineNumber = this.modifiedLineNumber;\n\t\tconst modifiedEndLineNumberEx = this.modifiedLineNumber + this.lineCount;\n\t\tif (hiddenModified.ranges.length === 0) {\n\t\t\tthis.showAll(tx);\n\t\t\tresult.push(this);\n\t\t} else {\n\t\t\tlet i = 0;\n\t\t\tfor (const r of hiddenModified.ranges) {\n\t\t\t\tconst isLast = i === hiddenModified.ranges.length - 1;\n\t\t\t\ti++;\n\n\t\t\t\tconst length = (isLast ? modifiedEndLineNumberEx : r.endLineNumberExclusive) - modifiedStartLineNumber;\n\n\t\t\t\tconst newR = new UnchangedRegion(originalStartLineNumber, modifiedStartLineNumber, length, 0, 0);\n\t\t\t\tnewR.setHiddenModifiedRange(r, tx);\n\t\t\t\tresult.push(newR);\n\n\t\t\t\toriginalStartLineNumber = newR.originalUnchangedRange.endLineNumberExclusive;\n\t\t\t\tmodifiedStartLineNumber = newR.modifiedUnchangedRange.endLineNumberExclusive;\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t}\n\n\tpublic shouldHideControls(reader: IReader | undefined): boolean {\n\t\treturn this._shouldHideControls.read(reader);\n\t}\n\n\tpublic getHiddenOriginalRange(reader: IReader | undefined): LineRange {\n\t\treturn LineRange.ofLength(\n\t\t\tthis.originalLineNumber + this._visibleLineCountTop.read(reader),\n\t\t\tthis.lineCount - this._visibleLineCountTop.read(reader) - this._visibleLineCountBottom.read(reader),\n\t\t);\n\t}\n\n\tpublic getHiddenModifiedRange(reader: IReader | undefined): LineRange {\n\t\treturn LineRange.ofLength(\n\t\t\tthis.modifiedLineNumber + this._visibleLineCountTop.read(reader),\n\t\t\tthis.lineCount - this._visibleLineCountTop.read(reader) - this._visibleLineCountBottom.read(reader),\n\t\t);\n\t}\n\n\tpublic setHiddenModifiedRange(range: LineRange, tx: ITransaction) {\n\t\tconst visibleLineCountTop = range.startLineNumber - this.modifiedLineNumber;\n\t\tconst visibleLineCountBottom = (this.modifiedLineNumber + this.lineCount) - range.endLineNumberExclusive;\n\t\tthis.setState(visibleLineCountTop, visibleLineCountBottom, tx);\n\t}\n\n\tpublic getMaxVisibleLineCountTop() {\n\t\treturn this.lineCount - this._visibleLineCountBottom.get();\n\t}\n\n\tpublic getMaxVisibleLineCountBottom() {\n\t\treturn this.lineCount - this._visibleLineCountTop.get();\n\t}\n\n\tpublic showMoreAbove(count = 10, tx: ITransaction | undefined): void {\n\t\tconst maxVisibleLineCountTop = this.getMaxVisibleLineCountTop();\n\t\tthis._visibleLineCountTop.set(Math.min(this._visibleLineCountTop.get() + count, maxVisibleLineCountTop), tx);\n\t}\n\n\tpublic showMoreBelow(count = 10, tx: ITransaction | undefined): void {\n\t\tconst maxVisibleLineCountBottom = this.lineCount - this._visibleLineCountTop.get();\n\t\tthis._visibleLineCountBottom.set(Math.min(this._visibleLineCountBottom.get() + count, maxVisibleLineCountBottom), tx);\n\t}\n\n\tpublic showAll(tx: ITransaction | undefined): void {\n\t\tthis._visibleLineCountBottom.set(this.lineCount - this._visibleLineCountTop.get(), tx);\n\t}\n\n\tpublic showModifiedLine(lineNumber: number, preference: RevealPreference, tx: ITransaction | undefined): void {\n\t\tconst top = lineNumber + 1 - (this.modifiedLineNumber + this._visibleLineCountTop.get());\n\t\tconst bottom = (this.modifiedLineNumber - this._visibleLineCountBottom.get() + this.lineCount) - lineNumber;\n\t\tif (preference === RevealPreference.FromCloserSide && top < bottom || preference === RevealPreference.FromTop) {\n\t\t\tthis._visibleLineCountTop.set(this._visibleLineCountTop.get() + top, tx);\n\t\t} else {\n\t\t\tthis._visibleLineCountBottom.set(this._visibleLineCountBottom.get() + bottom, tx);\n\t\t}\n\t}\n\n\tpublic showOriginalLine(lineNumber: number, preference: RevealPreference, tx: ITransaction | undefined): void {\n\t\tconst top = lineNumber - this.originalLineNumber;\n\t\tconst bottom = (this.originalLineNumber + this.lineCount) - lineNumber;\n\t\tif (preference === RevealPreference.FromCloserSide && top < bottom || preference === RevealPreference.FromTop) {\n\t\t\tthis._visibleLineCountTop.set(Math.min(this._visibleLineCountTop.get() + bottom - top, this.getMaxVisibleLineCountTop()), tx);\n\t\t} else {\n\t\t\tthis._visibleLineCountBottom.set(Math.min(this._visibleLineCountBottom.get() + top - bottom, this.getMaxVisibleLineCountBottom()), tx);\n\t\t}\n\t}\n\n\tpublic collapseAll(tx: ITransaction | undefined): void {\n\t\tthis._visibleLineCountTop.set(0, tx);\n\t\tthis._visibleLineCountBottom.set(0, tx);\n\t}\n\n\tpublic setState(visibleLineCountTop: number, visibleLineCountBottom: number, tx: ITransaction | undefined): void {\n\t\tvisibleLineCountTop = Math.max(Math.min(visibleLineCountTop, this.lineCount), 0);\n\t\tvisibleLineCountBottom = Math.max(Math.min(visibleLineCountBottom, this.lineCount - visibleLineCountTop), 0);\n\n\t\tthis._visibleLineCountTop.set(visibleLineCountTop, tx);\n\t\tthis._visibleLineCountBottom.set(visibleLineCountBottom, tx);\n\t}\n}\n\nexport const enum RevealPreference {\n\tFromCloserSide,\n\tFromTop,\n\tFromBottom,\n}\n\nfunction applyOriginalEdits(diff: IDocumentDiff, textEdits: TextEditInfo[], originalTextModel: ITextModel, modifiedTextModel: ITextModel): IDocumentDiff | undefined {\n\treturn undefined;\n\t/*\n\tTODO@hediet\n\tif (textEdits.length === 0) {\n\t\treturn diff;\n\t}\n\n\tconst diff2 = flip(diff);\n\tconst diff3 = applyModifiedEdits(diff2, textEdits, modifiedTextModel, originalTextModel);\n\tif (!diff3) {\n\t\treturn undefined;\n\t}\n\treturn flip(diff3);*/\n}\n/*\nfunction flip(diff: IDocumentDiff): IDocumentDiff {\n\treturn {\n\t\tchanges: diff.changes.map(c => c.flip()),\n\t\tmoves: diff.moves.map(m => m.flip()),\n\t\tidentical: diff.identical,\n\t\tquitEarly: diff.quitEarly,\n\t};\n}\n*/\nfunction applyModifiedEdits(diff: IDocumentDiff, textEdits: TextEditInfo[], originalTextModel: ITextModel, modifiedTextModel: ITextModel): IDocumentDiff | undefined {\n\treturn undefined;\n\t/*\n\tTODO@hediet\n\tif (textEdits.length === 0) {\n\t\treturn diff;\n\t}\n\tif (diff.changes.some(c => !c.innerChanges) || diff.moves.length > 0) {\n\t\t// TODO support these cases\n\t\treturn undefined;\n\t}\n\n\tconst changes = applyModifiedEditsToLineRangeMappings(diff.changes, textEdits, originalTextModel, modifiedTextModel);\n\n\tconst moves = diff.moves.map(m => {\n\t\tconst newModifiedRange = applyEditToLineRange(m.lineRangeMapping.modified, textEdits);\n\t\treturn newModifiedRange ? new MovedText(\n\t\t\tnew SimpleLineRangeMapping(m.lineRangeMapping.original, newModifiedRange),\n\t\t\tapplyModifiedEditsToLineRangeMappings(m.changes, textEdits, originalTextModel, modifiedTextModel),\n\t\t) : undefined;\n\t}).filter(isDefined);\n\n\treturn {\n\t\tidentical: false,\n\t\tquitEarly: false,\n\t\tchanges,\n\t\tmoves,\n\t};*/\n}\n/*\nfunction applyEditToLineRange(range: LineRange, textEdits: TextEditInfo[]): LineRange | undefined {\n\tlet rangeStartLineNumber = range.startLineNumber;\n\tlet rangeEndLineNumberEx = range.endLineNumberExclusive;\n\n\tfor (let i = textEdits.length - 1; i >= 0; i--) {\n\t\tconst textEdit = textEdits[i];\n\t\tconst textEditStartLineNumber = lengthGetLineCount(textEdit.startOffset) + 1;\n\t\tconst textEditEndLineNumber = lengthGetLineCount(textEdit.endOffset) + 1;\n\t\tconst newLengthLineCount = lengthGetLineCount(textEdit.newLength);\n\t\tconst delta = newLengthLineCount - (textEditEndLineNumber - textEditStartLineNumber);\n\n\t\tif (textEditEndLineNumber < rangeStartLineNumber) {\n\t\t\t// the text edit is before us\n\t\t\trangeStartLineNumber += delta;\n\t\t\trangeEndLineNumberEx += delta;\n\t\t} else if (textEditStartLineNumber > rangeEndLineNumberEx) {\n\t\t\t// the text edit is after us\n\t\t\t// NOOP\n\t\t} else if (textEditStartLineNumber < rangeStartLineNumber && rangeEndLineNumberEx < textEditEndLineNumber) {\n\t\t\t// the range is fully contained in the text edit\n\t\t\treturn undefined;\n\t\t} else if (textEditStartLineNumber < rangeStartLineNumber && textEditEndLineNumber <= rangeEndLineNumberEx) {\n\t\t\t// the text edit ends inside our range\n\t\t\trangeStartLineNumber = textEditEndLineNumber + 1;\n\t\t\trangeStartLineNumber += delta;\n\t\t\trangeEndLineNumberEx += delta;\n\t\t} else if (rangeStartLineNumber <= textEditStartLineNumber && textEditEndLineNumber < rangeStartLineNumber) {\n\t\t\t// the text edit starts inside our range\n\t\t\trangeEndLineNumberEx = textEditStartLineNumber;\n\t\t} else {\n\t\t\trangeEndLineNumberEx += delta;\n\t\t}\n\t}\n\n\treturn new LineRange(rangeStartLineNumber, rangeEndLineNumberEx);\n}\n\nfunction applyModifiedEditsToLineRangeMappings(changes: readonly LineRangeMapping[], textEdits: TextEditInfo[], originalTextModel: ITextModel, modifiedTextModel: ITextModel): LineRangeMapping[] {\n\tconst diffTextEdits = changes.flatMap(c => c.innerChanges!.map(c => new TextEditInfo(\n\t\tpositionToLength(c.originalRange.getStartPosition()),\n\t\tpositionToLength(c.originalRange.getEndPosition()),\n\t\tlengthOfRange(c.modifiedRange).toLength(),\n\t)));\n\n\tconst combined = combineTextEditInfos(diffTextEdits, textEdits);\n\n\tlet lastOriginalEndOffset = lengthZero;\n\tlet lastModifiedEndOffset = lengthZero;\n\tconst rangeMappings = combined.map(c => {\n\t\tconst modifiedStartOffset = lengthAdd(lastModifiedEndOffset, lengthDiffNonNegative(lastOriginalEndOffset, c.startOffset));\n\t\tlastOriginalEndOffset = c.endOffset;\n\t\tlastModifiedEndOffset = lengthAdd(modifiedStartOffset, c.newLength);\n\n\t\treturn new RangeMapping(\n\t\t\tRange.fromPositions(lengthToPosition(c.startOffset), lengthToPosition(c.endOffset)),\n\t\t\tRange.fromPositions(lengthToPosition(modifiedStartOffset), lengthToPosition(lastModifiedEndOffset)),\n\t\t);\n\t});\n\n\tconst newChanges = lineRangeMappingFromRangeMappings(\n\t\trangeMappings,\n\t\toriginalTextModel.getLinesContent(),\n\t\tmodifiedTextModel.getLinesContent(),\n\t);\n\treturn newChanges;\n}\n*/\n"]}
@@ -163,7 +163,7 @@ let DiffEditorWidget = class DiffEditorWidget extends DelegatingEditor {
163
163
  const origViewZoneIdsToIgnore = new Set();
164
164
  const modViewZoneIdsToIgnore = new Set();
165
165
  let isUpdatingViewZones = false;
166
- const viewZoneManager = derivedDisposable(this, reader => /** @description ViewZoneManager */ this._instantiationService.createInstance(readHotReloadableExport(DiffEditorViewZones, reader), getWindow(this._domElement), this._editors, this._diffModel, this._options, this, () => isUpdatingViewZones || unchangedRangesFeature.get().isUpdatingHiddenAreas, origViewZoneIdsToIgnore, modViewZoneIdsToIgnore)).recomputeInitiallyAndOnChange(this._store);
166
+ const viewZoneManager = derivedDisposable(this, reader => /** @description ViewZoneManager */ this._instantiationService.createInstance(readHotReloadableExport(DiffEditorViewZones, reader), getWindow(this._domElement), this._editors, this._diffModel, this._options, this, () => isUpdatingViewZones || unchangedRangesFeature.read(undefined).isUpdatingHiddenAreas, origViewZoneIdsToIgnore, modViewZoneIdsToIgnore)).recomputeInitiallyAndOnChange(this._store);
167
167
  const originalViewZones = derived(this, (reader) => {
168
168
  const orig = viewZoneManager.read(reader).viewZones.read(reader).orig;
169
169
  const orig2 = unchangedRangesFeature.read(reader).viewZones.read(reader).origViewZones;